( ′∀`)σ≡σ☆))Д′)レ(゚∀゚;)ヘ=З=З=Зε≡(ノ´_ゝ`)ノ HEX
HEX
Server: Apache/2.4.58 (Ubuntu)
System: Linux mail.thebrand.ai 6.8.0-107-generic #107-Ubuntu SMP PREEMPT_DYNAMIC Fri Mar 13 19:51:50 UTC 2026 x86_64
User: www-data (33)
PHP: 8.3.6
Disabled: NONE
Upload Files
File: /var/www/html/tmpr/../tmpr/../tmpr/../tmpr/../tmpr/../dist/pixie.es.js.map
{"version":3,"file":"pixie.es.js","sources":["../node_modules/deepmerge/dist/cjs.js","../node_modules/style-inject/dist/style-inject.es.js","../node_modules/number-precision/build/index.es.js","../node_modules/@sentry/browser/node_modules/tslib/tslib.es6.js","../node_modules/@sentry/types/esm/severity.js","../node_modules/@sentry/minimal/node_modules/tslib/tslib.es6.js","../node_modules/@sentry/hub/node_modules/tslib/tslib.es6.js","../node_modules/@sentry/utils/esm/async.js","../node_modules/@sentry/utils/esm/env.js","../node_modules/@sentry/utils/esm/node.js","../node_modules/@sentry/utils/esm/global.js","../node_modules/@sentry/utils/esm/is.js","../node_modules/@sentry/utils/esm/browser.js","../node_modules/@sentry/utils/node_modules/tslib/tslib.es6.js","../node_modules/@sentry/utils/esm/polyfill.js","../node_modules/@sentry/utils/esm/error.js","../node_modules/@sentry/utils/esm/dsn.js","../node_modules/@sentry/utils/esm/enums.js","../node_modules/@sentry/utils/esm/logger.js","../node_modules/@sentry/utils/esm/memo.js","../node_modules/@sentry/utils/esm/stacktrace.js","../node_modules/@sentry/utils/esm/string.js","../node_modules/@sentry/utils/esm/object.js","../node_modules/@sentry/utils/esm/supports.js","../node_modules/@sentry/utils/esm/instrument.js","../node_modules/@sentry/utils/esm/misc.js","../node_modules/@sentry/utils/esm/syncpromise.js","../node_modules/@sentry/utils/esm/promisebuffer.js","../node_modules/@sentry/utils/esm/severity.js","../node_modules/@sentry/utils/esm/status.js","../node_modules/@sentry/utils/esm/time.js","../node_modules/@sentry/hub/esm/scope.js","../node_modules/@sentry/hub/esm/session.js","../node_modules/@sentry/hub/esm/hub.js","../node_modules/@sentry/minimal/esm/index.js","../node_modules/@sentry/core/esm/api.js","../node_modules/@sentry/core/node_modules/tslib/tslib.es6.js","../node_modules/@sentry/core/esm/integration.js","../node_modules/@sentry/core/esm/baseclient.js","../node_modules/@sentry/core/esm/transports/noop.js","../node_modules/@sentry/core/esm/basebackend.js","../node_modules/@sentry/core/esm/request.js","../node_modules/@sentry/core/esm/sdk.js","../node_modules/@sentry/core/esm/version.js","../node_modules/@sentry/core/esm/integrations/functiontostring.js","../node_modules/@sentry/core/esm/integrations/inboundfilters.js","../node_modules/@sentry/browser/esm/stack-parsers.js","../node_modules/@sentry/browser/esm/parsers.js","../node_modules/@sentry/browser/esm/eventbuilder.js","../node_modules/@sentry/browser/esm/transports/utils.js","../node_modules/@sentry/browser/esm/transports/base.js","../node_modules/@sentry/browser/esm/transports/fetch.js","../node_modules/@sentry/browser/esm/transports/xhr.js","../node_modules/@sentry/browser/esm/backend.js","../node_modules/@sentry/browser/esm/helpers.js","../node_modules/@sentry/browser/esm/integrations/globalhandlers.js","../node_modules/@sentry/browser/esm/integrations/trycatch.js","../node_modules/@sentry/browser/esm/integrations/breadcrumbs.js","../node_modules/@sentry/browser/esm/integrations/linkederrors.js","../node_modules/@sentry/browser/esm/integrations/useragent.js","../node_modules/@sentry/browser/esm/integrations/dedupe.js","../node_modules/@sentry/browser/esm/client.js","../node_modules/@sentry/browser/esm/sdk.js","../node_modules/@sentry/react/esm/sdk.js","../node_modules/react-is/cjs/react-is.production.min.js","../node_modules/react-is/index.js","../node_modules/hoist-non-react-statics/dist/hoist-non-react-statics.cjs.js","../node_modules/@sentry/tracing/node_modules/tslib/tslib.es6.js","../node_modules/@sentry/tracing/esm/utils.js","../node_modules/@sentry/tracing/esm/errors.js","../node_modules/@sentry/tracing/esm/constants.js","../node_modules/@sentry/tracing/esm/span.js","../node_modules/@sentry/tracing/esm/transaction.js","../node_modules/@sentry/tracing/esm/idletransaction.js","../node_modules/@sentry/tracing/esm/hubextensions.js","../node_modules/@sentry/tracing/esm/browser/backgroundtab.js","../node_modules/@sentry/tracing/esm/browser/web-vitals/lib/bindReporter.js","../node_modules/@sentry/tracing/esm/browser/web-vitals/lib/generateUniqueID.js","../node_modules/@sentry/tracing/esm/browser/web-vitals/lib/initMetric.js","../node_modules/@sentry/tracing/esm/browser/web-vitals/lib/observe.js","../node_modules/@sentry/tracing/esm/browser/web-vitals/lib/onHidden.js","../node_modules/@sentry/tracing/esm/browser/web-vitals/getCLS.js","../node_modules/@sentry/tracing/esm/browser/web-vitals/lib/getVisibilityWatcher.js","../node_modules/@sentry/tracing/esm/browser/web-vitals/getFID.js","../node_modules/@sentry/tracing/esm/browser/web-vitals/getLCP.js","../node_modules/@sentry/tracing/esm/browser/metrics.js","../node_modules/@sentry/tracing/esm/browser/request.js","../node_modules/@sentry/tracing/esm/browser/router.js","../node_modules/@sentry/tracing/esm/browser/browsertracing.js","../node_modules/@sentry/tracing/esm/index.js","../node_modules/tslib/tslib.es6.js","../node_modules/@formatjs/ecma402-abstract/lib/utils.js","../node_modules/@formatjs/icu-messageformat-parser/lib/error.js","../node_modules/@formatjs/icu-messageformat-parser/lib/types.js","../node_modules/@formatjs/icu-messageformat-parser/lib/regex.generated.js","../node_modules/@formatjs/icu-skeleton-parser/lib/date-time.js","../node_modules/@formatjs/icu-skeleton-parser/lib/regex.generated.js","../node_modules/@formatjs/icu-skeleton-parser/lib/number.js","../node_modules/@formatjs/icu-messageformat-parser/lib/parser.js","../node_modules/@formatjs/icu-messageformat-parser/lib/index.js","../node_modules/@formatjs/fast-memoize/lib/index.js","../node_modules/intl-messageformat/lib/src/error.js","../node_modules/intl-messageformat/lib/src/formatters.js","../node_modules/intl-messageformat/lib/src/core.js","../node_modules/intl-messageformat/lib/index.js","../node_modules/@formatjs/intl/lib/src/error.js","../node_modules/@formatjs/intl/lib/src/utils.js","../node_modules/@formatjs/intl/lib/src/message.js","../node_modules/@formatjs/intl/lib/src/dateTime.js","../node_modules/@formatjs/intl/lib/src/displayName.js","../node_modules/@formatjs/intl/lib/src/list.js","../node_modules/@formatjs/intl/lib/src/plural.js","../node_modules/@formatjs/intl/lib/src/relativeTime.js","../node_modules/@formatjs/intl/lib/src/number.js","../node_modules/@formatjs/intl/lib/src/create-intl.js","../node_modules/react-intl/lib/src/utils.js","../node_modules/react-intl/lib/src/components/injectIntl.js","../node_modules/react-intl/lib/src/components/useIntl.js","../node_modules/react-intl/lib/src/components/provider.js","../node_modules/react-intl/lib/src/components/message.js","../node_modules/react-intl/lib/index.js","../src/config/editor-mode.ts","../src/ui/navbar/nav-position.ts","../src/config/default-shapes.ts","../src/config/emoticons.ts","../src/config/default-stickers.ts","../src/config/default-object-props.ts","../src/tools/draw/draw-defaults.ts","../src/config/editor-theme.ts","../src/config/default-themes.ts","../src/tools/tool-name.ts","../node_modules/object-assign/index.js","../node_modules/react/cjs/react-jsx-runtime.production.min.js","../node_modules/react/jsx-runtime.js","../react/jsx-runtime","../src/common/icons/svg-icon.tsx","../src/common/icons/create-svg-icon.tsx","../src/common/icons/material/Tune.tsx","../src/common/icons/material/PhotoSizeSelectLarge.tsx","../src/common/icons/material/Crop.tsx","../src/common/icons/material/TextFields.tsx","../src/common/icons/material/Extension.tsx","../src/common/icons/material/Face.tsx","../src/common/icons/material/FilterFrames.tsx","../src/common/icons/material/Merge.tsx","../src/common/icons/material/RoundedCorner.tsx","../src/common/icons/material/PhotoLibrary.tsx","../src/common/icons/material/History.tsx","../src/common/icons/material/Style.tsx","../src/common/icons/material/Delete.tsx","../src/ui/icons/draw.tsx","../src/common/icons/material/Home.tsx","../src/tools/history/history-display-names.ts","../src/config/default-nav-items.ts","../src/common/icons/material/FileDownload.tsx","../src/config/default-config.ts","../node_modules/zustand/esm/index.js","../node_modules/zustand/esm/middleware.js","../node_modules/immer/dist/immer.esm.js","../src/common/utils/string/lower-first.ts","../src/config/merge-config.ts","../src/tools/history/state/history-slice.ts","../src/state/editor-state.ts","../src/tools/filter/filter-slice.ts","../src/tools/crop/crop-slice.ts","../src/objects/utils/is-text.ts","../src/objects/object-name.ts","../src/objects/utils/is-image.ts","../src/objects/state/default-active-obj-props.ts","../src/objects/state/fabric-obj-to-state.ts","../src/objects/state/objects-slice.ts","../src/tools/frame/frame-slice.ts","../src/tools/resize/state/resize-slice.ts","../src/tools/corners/corners-slice.ts","../src/state/store.ts","../node_modules/framer-motion/dist/es/motion/features/definitions.mjs","../node_modules/hey-listen/dist/hey-listen.es.js","../node_modules/framer-motion/dist/es/context/LazyContext.mjs","../node_modules/framer-motion/dist/es/motion/features/use-features.mjs","../node_modules/framer-motion/dist/es/context/MotionConfigContext.mjs","../node_modules/framer-motion/dist/es/context/MotionContext/index.mjs","../node_modules/framer-motion/dist/es/context/PresenceContext.mjs","../node_modules/framer-motion/dist/es/utils/is-browser.mjs","../node_modules/framer-motion/dist/es/utils/use-isomorphic-effect.mjs","../node_modules/framer-motion/dist/es/motion/utils/use-visual-element.mjs","../node_modules/framer-motion/dist/es/utils/is-ref-object.mjs","../node_modules/framer-motion/dist/es/motion/utils/use-motion-ref.mjs","../node_modules/framer-motion/dist/es/render/utils/variants.mjs","../node_modules/framer-motion/dist/es/context/MotionContext/utils.mjs","../node_modules/framer-motion/dist/es/context/MotionContext/create.mjs","../node_modules/framer-motion/dist/es/utils/use-constant.mjs","../node_modules/framesync/dist/es/on-next-frame.mjs","../node_modules/framesync/dist/es/create-render-step.mjs","../node_modules/framesync/dist/es/index.mjs","../node_modules/popmotion/dist/es/utils/clamp.mjs","../node_modules/popmotion/dist/es/animations/utils/find-spring.mjs","../node_modules/popmotion/dist/es/animations/generators/spring.mjs","../node_modules/popmotion/dist/es/utils/progress.mjs","../node_modules/popmotion/dist/es/utils/mix.mjs","../node_modules/style-value-types/dist/es/utils.mjs","../node_modules/style-value-types/dist/es/numbers/index.mjs","../node_modules/style-value-types/dist/es/numbers/units.mjs","../node_modules/style-value-types/dist/es/color/utils.mjs","../node_modules/style-value-types/dist/es/color/hsla.mjs","../node_modules/style-value-types/dist/es/color/rgba.mjs","../node_modules/style-value-types/dist/es/color/hex.mjs","../node_modules/style-value-types/dist/es/color/index.mjs","../node_modules/style-value-types/dist/es/complex/index.mjs","../node_modules/style-value-types/dist/es/complex/filter.mjs","../node_modules/popmotion/dist/es/utils/hsla-to-rgba.mjs","../node_modules/popmotion/dist/es/utils/mix-color.mjs","../node_modules/popmotion/dist/es/utils/inc.mjs","../node_modules/popmotion/dist/es/utils/pipe.mjs","../node_modules/popmotion/dist/es/utils/mix-complex.mjs","../node_modules/popmotion/dist/es/utils/interpolate.mjs","../node_modules/popmotion/dist/es/easing/utils.mjs","../node_modules/popmotion/dist/es/easing/index.mjs","../node_modules/popmotion/dist/es/animations/generators/keyframes.mjs","../node_modules/popmotion/dist/es/animations/generators/decay.mjs","../node_modules/popmotion/dist/es/animations/utils/detect-animation-from-options.mjs","../node_modules/popmotion/dist/es/animations/utils/elapsed.mjs","../node_modules/popmotion/dist/es/animations/index.mjs","../node_modules/popmotion/dist/es/utils/velocity-per-second.mjs","../node_modules/popmotion/dist/es/animations/inertia.mjs","../node_modules/popmotion/dist/es/easing/cubic-bezier.mjs","../node_modules/framer-motion/dist/es/utils/array.mjs","../node_modules/framer-motion/dist/es/utils/subscription-manager.mjs","../node_modules/framer-motion/dist/es/value/index.mjs","../node_modules/framer-motion/dist/es/value/utils/is-motion-value.mjs","../node_modules/framer-motion/dist/es/utils/time-conversion.mjs","../node_modules/framer-motion/dist/es/animation/utils/easing.mjs","../node_modules/framer-motion/dist/es/animation/utils/is-animatable.mjs","../node_modules/framer-motion/dist/es/animation/utils/is-keyframes-target.mjs","../node_modules/framer-motion/dist/es/animation/utils/default-transitions.mjs","../node_modules/framer-motion/dist/es/render/dom/value-types/type-int.mjs","../node_modules/framer-motion/dist/es/render/dom/value-types/number.mjs","../node_modules/framer-motion/dist/es/render/dom/value-types/defaults.mjs","../node_modules/framer-motion/dist/es/render/dom/value-types/animatable-none.mjs","../node_modules/framer-motion/dist/es/utils/use-instant-transition-state.mjs","../node_modules/framer-motion/dist/es/utils/resolve-value.mjs","../node_modules/framer-motion/dist/es/animation/utils/transitions.mjs","../node_modules/framer-motion/dist/es/projection/styles/scale-correction.mjs","../node_modules/framer-motion/dist/es/render/html/utils/transform.mjs","../node_modules/framer-motion/dist/es/value/utils/resolve-motion-value.mjs","../node_modules/framer-motion/dist/es/projection/node/create-projection-node.mjs","../node_modules/framer-motion/dist/es/projection/node/id.mjs","../node_modules/framer-motion/dist/es/context/LayoutGroupContext.mjs","../node_modules/framer-motion/dist/es/context/SwitchLayoutGroupContext.mjs","../node_modules/framer-motion/dist/es/motion/features/use-projection.mjs","../node_modules/framer-motion/dist/es/motion/utils/VisualElementHandler.mjs","../node_modules/framer-motion/dist/es/motion/index.mjs","../node_modules/framer-motion/dist/es/render/dom/motion-proxy.mjs","../node_modules/framer-motion/dist/es/render/svg/lowercase-elements.mjs","../node_modules/framer-motion/dist/es/render/dom/utils/is-svg-component.mjs","../node_modules/framer-motion/dist/es/motion/utils/is-forced-motion-value.mjs","../node_modules/framer-motion/dist/es/render/html/utils/build-transform.mjs","../node_modules/framer-motion/dist/es/render/dom/utils/is-css-variable.mjs","../node_modules/framer-motion/dist/es/render/dom/value-types/get-as-type.mjs","../node_modules/framer-motion/dist/es/render/html/utils/build-styles.mjs","../node_modules/framer-motion/dist/es/render/html/utils/create-render-state.mjs","../node_modules/framer-motion/dist/es/render/html/use-props.mjs","../node_modules/framer-motion/dist/es/motion/utils/valid-prop.mjs","../node_modules/framer-motion/dist/es/render/dom/utils/filter-props.mjs","../node_modules/framer-motion/dist/es/render/svg/utils/transform-origin.mjs","../node_modules/framer-motion/dist/es/render/svg/utils/path.mjs","../node_modules/framer-motion/dist/es/render/svg/utils/build-attrs.mjs","../node_modules/framer-motion/dist/es/render/svg/utils/create-render-state.mjs","../node_modules/framer-motion/dist/es/render/svg/use-props.mjs","../node_modules/framer-motion/dist/es/render/dom/use-render.mjs","../node_modules/framer-motion/dist/es/render/dom/utils/camel-to-dash.mjs","../node_modules/framer-motion/dist/es/render/html/utils/render.mjs","../node_modules/framer-motion/dist/es/render/svg/utils/camel-case-attrs.mjs","../node_modules/framer-motion/dist/es/render/svg/utils/render.mjs","../node_modules/framer-motion/dist/es/render/html/utils/scrape-motion-values.mjs","../node_modules/framer-motion/dist/es/render/svg/utils/scrape-motion-values.mjs","../node_modules/framer-motion/dist/es/animation/utils/is-animation-controls.mjs","../node_modules/framer-motion/dist/es/motion/utils/use-visual-state.mjs","../node_modules/framer-motion/dist/es/render/svg/config-motion.mjs","../node_modules/framer-motion/dist/es/render/html/config-motion.mjs","../node_modules/framer-motion/dist/es/render/dom/utils/create-config.mjs","../node_modules/framer-motion/dist/es/render/utils/types.mjs","../node_modules/framer-motion/dist/es/events/use-dom-event.mjs","../node_modules/framer-motion/dist/es/gestures/use-focus-gesture.mjs","../node_modules/framer-motion/dist/es/gestures/utils/event-type.mjs","../node_modules/framer-motion/dist/es/events/event-info.mjs","../node_modules/framer-motion/dist/es/events/utils.mjs","../node_modules/framer-motion/dist/es/events/use-pointer-event.mjs","../node_modules/framer-motion/dist/es/gestures/drag/utils/lock.mjs","../node_modules/framer-motion/dist/es/gestures/use-hover-gesture.mjs","../node_modules/framer-motion/dist/es/gestures/utils/is-node-or-child.mjs","../node_modules/framer-motion/dist/es/utils/use-unmount-effect.mjs","../node_modules/framer-motion/dist/es/gestures/use-tap-gesture.mjs","../node_modules/framer-motion/dist/es/motion/features/viewport/observers.mjs","../node_modules/framer-motion/dist/es/motion/features/viewport/use-viewport.mjs","../node_modules/framer-motion/dist/es/motion/utils/make-renderless-component.mjs","../node_modules/framer-motion/dist/es/motion/features/gestures.mjs","../node_modules/framer-motion/dist/es/components/AnimatePresence/use-presence.mjs","../node_modules/framer-motion/dist/es/utils/shallow-compare.mjs","../node_modules/framer-motion/dist/es/utils/is-numerical-string.mjs","../node_modules/framer-motion/dist/es/utils/is-zero-value-string.mjs","../node_modules/framer-motion/dist/es/render/dom/value-types/test.mjs","../node_modules/framer-motion/dist/es/render/dom/value-types/type-auto.mjs","../node_modules/framer-motion/dist/es/render/dom/value-types/dimensions.mjs","../node_modules/framer-motion/dist/es/render/dom/value-types/find.mjs","../node_modules/framer-motion/dist/es/render/utils/setters.mjs","../node_modules/framer-motion/dist/es/render/utils/animation.mjs","../node_modules/framer-motion/dist/es/render/utils/animation-state.mjs","../node_modules/framer-motion/dist/es/motion/features/animations.mjs","../node_modules/framer-motion/dist/es/projection/geometry/conversion.mjs","../node_modules/framer-motion/dist/es/projection/utils/measure.mjs","../node_modules/framer-motion/dist/es/render/utils/lifecycles.mjs","../node_modules/framer-motion/dist/es/render/utils/motion-values.mjs","../node_modules/framer-motion/dist/es/render/index.mjs","../node_modules/framer-motion/dist/es/render/dom/utils/css-variables-conversion.mjs","../node_modules/framer-motion/dist/es/render/dom/utils/unit-conversion.mjs","../node_modules/framer-motion/dist/es/render/dom/utils/parse-dom-variant.mjs","../node_modules/framer-motion/dist/es/render/html/visual-element.mjs","../node_modules/framer-motion/dist/es/render/svg/visual-element.mjs","../node_modules/framer-motion/dist/es/render/dom/create-visual-element.mjs","../node_modules/framer-motion/dist/es/render/dom/motion-minimal.mjs","../node_modules/framer-motion/dist/es/utils/use-force-update.mjs","../node_modules/framer-motion/dist/es/components/AnimatePresence/PresenceChild.mjs","../node_modules/framer-motion/dist/es/components/AnimatePresence/index.mjs","../node_modules/framer-motion/dist/es/components/LazyMotion/index.mjs","../node_modules/framer-motion/dist/es/render/dom/features-animation.mjs","../node_modules/prop-types/lib/ReactPropTypesSecret.js","../node_modules/prop-types/factoryWithThrowingShims.js","../node_modules/prop-types/index.js","../node_modules/file-selector/dist/es5/file.js","../node_modules/file-selector/dist/es5/file-selector.js","../node_modules/attr-accept/dist/es/index.js","../node_modules/react-dropzone/dist/es/utils/index.js","../node_modules/react-dropzone/dist/es/index.js","../node_modules/clsx/dist/clsx.m.js","../node_modules/@react-aria/ssr/dist/module.js","../node_modules/@react-stately/utils/dist/module.js","../node_modules/@react-aria/utils/dist/module.js","../node_modules/@react-aria/interactions/dist/module.js","../node_modules/@react-aria/visually-hidden/dist/module.js","../__vite-browser-external","../node_modules/fabric/dist/fabric.js","../src/objects/default-obj-config.ts","../src/common/utils/string/random-string.ts","../src/state/utils.ts","../src/utils/init-fabric.ts","../src/tools/zoom-tool.ts","../src/objects/static-object-config.ts","../src/tools/canvas/load-fabric-image.ts","../src/tools/canvas/canvas-is-empty.ts","../src/tools/import/fetch-state-json-from-url.ts","../src/tools/canvas/pixie-canvas.ts","../src/objects/utils/is-svg-sticker.ts","../src/objects/size-and-position-props.ts","../src/objects/object-modified-event.ts","../src/ui/navbar/set-active-tool.ts","../src/objects/bind-to-fabric-selection-events.ts","../src/objects/object-tool.ts","../src/tools/history/serialized-pixie-state.ts","../src/tools/history/state/get-current-canvas-state.ts","../src/tools/history/state/create-history-item.ts","../src/tools/text/text-tool.ts","../src/common/utils/urls/is-absolute-url.ts","../src/utils/asset-url.ts","../src/common/ui/font-picker/load-fonts.ts","../src/tools/history/history-tool.ts","../src/tools/merge/merge-tool.ts","../src/tools/filter/filter-list.ts","../src/common/utils/string/uc-first.ts","../src/tools/filter/filter-tool.ts","../src/tools/resize/clamp-resize-payload.ts","../src/tools/resize/resize-tool.ts","../src/tools/crop/ui/cropzone/draw-cropzone.ts","../src/common/ui/interactions/utils/calc-new-size-from-aspect-ratio.ts","../src/common/ui/interactions/utils/center-within-boundary.ts","../src/tools/crop/crop-tool.ts","../src/tools/shapes/shape-tool.ts","../src/tools/frame/frame-patterns.ts","../src/tools/frame/frame-builder.ts","../src/tools/frame/active-frame.ts","../src/tools/frame/frame-tool.ts","../src/tools/draw/brushes/v-line-brush.ts","../src/tools/draw/brushes/h-line-brush.ts","../src/tools/draw/brushes/diamond-brush.ts","../src/tools/draw/brushes/square-brush.ts","../src/tools/draw/draw-tool.ts","../src/common/uploads/utils/extension-from-filename.ts","../src/common/uploads/utils/get-file-mime.ts","../src/common/uploads/uploaded-file.ts","../src/common/uploads/utils/create-upload-input.ts","../src/common/uploads/utils/open-upload-window.ts","../node_modules/goober/dist/goober.modern.js","../node_modules/react-hot-toast/dist/react-hot-toast.esm.js","../src/common/ui/toast/show-toast.ts","../src/common/uploads/validation/upload-validator.ts","../src/common/uploads/validation/validations/upload-validation.ts","../src/common/uploads/utils/pretty-bytes.ts","../src/common/uploads/validation/validations/file-size-validation.ts","../src/common/uploads/validation/validations/allowed-extensions-validation.ts","../src/common/uploads/utils/convert-to-bytes.ts","../src/tools/import/import-tool-validator.ts","../src/tools/canvas/add-image.ts","../src/utils/reset-editor.ts","../src/common/uploads/upload-input-config.ts","../src/tools/import/import-tool.ts","../src/tools/export/watermark-tool.ts","../node_modules/file-saver/dist/FileSaver.min.js","../src/tools/export/b64-to-blob.ts","../src/tools/export/export-tool.ts","../src/tools/corners/corners-tool.ts","../src/tools/transform/transform-tool.ts","../src/tools/init-tools.ts","../src/common/utils/dom/observe-size.ts","../src/common/utils/dom/get-bounding-client-rect.ts","../node_modules/color-name/index.js","../node_modules/is-arrayish/index.js","../node_modules/simple-swizzle/index.js","../node_modules/color-string/index.js","../node_modules/color-convert/conversions.js","../node_modules/color-convert/route.js","../node_modules/color-convert/index.js","../node_modules/color/index.js","../src/utils/init-themes.ts","../src/common/ui/overlays/overlay-position-context.ts","../src/ui/toolbar/toolbar-style.tsx","../src/common/ui/buttons/button-size.ts","../node_modules/@react-aria/focus/dist/module.js","../node_modules/@react-aria/button/dist/module.js","../src/common/ui/buttons/get-shared-button-style.ts","../src/common/ui/buttons/button-base.tsx","../src/common/ui/buttons/button.tsx","../node_modules/@react-stately/collections/dist/module.js","../node_modules/@react-stately/overlays/dist/module.js","../node_modules/@react-stately/menu/dist/module.js","../node_modules/@internationalized/message/dist/module.js","../node_modules/@internationalized/date/dist/module.js","../node_modules/@internationalized/number/dist/module.js","../node_modules/@react-aria/i18n/dist/module.js","../node_modules/@babel/runtime/helpers/interopRequireDefault.js","../node_modules/dom-helpers/util/camelize.js","../node_modules/dom-helpers/util/camelizeStyle.js","../node_modules/dom-helpers/util/hyphenate.js","../node_modules/dom-helpers/util/hyphenateStyle.js","../node_modules/dom-helpers/style/getComputedStyle.js","../node_modules/dom-helpers/style/removeStyle.js","../node_modules/dom-helpers/util/inDOM.js","../node_modules/dom-helpers/transition/properties.js","../node_modules/dom-helpers/transition/isTransform.js","../node_modules/dom-helpers/style/index.js","../node_modules/dom-helpers/query/contains.js","../node_modules/dom-helpers/query/isWindow.js","../node_modules/dom-helpers/ownerDocument.js","../node_modules/dom-helpers/query/offset.js","../node_modules/@babel/runtime/helpers/extends.js","../node_modules/dom-helpers/query/offsetParent.js","../node_modules/dom-helpers/query/scrollTop.js","../node_modules/dom-helpers/query/scrollLeft.js","../node_modules/dom-helpers/query/position.js","../node_modules/@react-aria/overlays/dist/module.js","../node_modules/@react-aria/selection/dist/module.js","../node_modules/@react-aria/menu/dist/module.js","../src/common/utils/hooks/is-mobile-device.ts","../src/common/ui/overlays/popover/popover-style.ts","../src/common/ui/overlays/popover/popover-animation.ts","../src/common/ui/overlays/overlay.tsx","../src/common/ui/overlays/popover/popover.tsx","../src/common/ui/navigation/menu/menu-context.ts","../src/common/ui/overlays/modal/underlay.tsx","../src/common/ui/overlays/tray.tsx","../node_modules/@floating-ui/core/dist/floating-ui.core.esm.min.js","../node_modules/@floating-ui/dom/dist/floating-ui.dom.esm.min.js","../node_modules/@floating-ui/react-dom/dist/floating-ui.react-dom.esm.js","../src/common/ui/overlays/use-overlay-position.ts","../src/common/ui/navigation/menu/menu-trigger.tsx","../node_modules/@react-stately/selection/dist/module.js","../node_modules/@react-stately/tree/dist/module.js","../src/common/ui/inputs/listbox/listbox-style.ts","../src/common/ui/navigation/menu/menu-item.tsx","../src/common/ui/navigation/menu/menu.tsx","../src/ui/toolbar/toolbar-item/dropdown-button.tsx","../src/common/ui/buttons/icon-button.tsx","../src/ui/mixed-icon.tsx","../src/ui/toolbar/toolbar-item/toolbar-button.tsx","../src/common/ui/buttons/button-group.tsx","../src/common/icons/material/Undo.tsx","../src/common/icons/material/Redo.tsx","../src/ui/toolbar/toolbar-item/undo-redo-btns.tsx","../src/common/icons/material/Remove.tsx","../src/common/icons/material/Add.tsx","../src/ui/toolbar/toolbar-item/zoom-widget.tsx","../src/ui/toolbar/toolbar-item/toolbar-item.tsx","../src/common/icons/material/Close.tsx","../src/ui/editor-mode.ts","../src/ui/toolbar/main-toolbar.tsx","../src/common/ui/interactions/actions/resize-action.ts","../node_modules/@react-stately/numberfield/dist/module.js","../node_modules/@react-aria/label/dist/module.js","../node_modules/@react-aria/textfield/dist/module.js","../node_modules/@react-aria/live-announcer/dist/module.js","../node_modules/@react-aria/spinbutton/dist/module.js","../node_modules/@react-aria/numberfield/dist/module.js","../src/common/ui/inputs/input-field/input-field-style.ts","../src/common/icons/material/KeyboardArrowUp.tsx","../src/common/icons/material/KeyboardArrowDown.tsx","../src/common/ui/inputs/input-field/number-field.tsx","../src/tools/crop/ui/crop-nav/crop-input-fields.tsx","../src/common/icons/material/Check.tsx","../src/ui/toolbar/active-toolbar.tsx","../src/ui/toolbar/toolbar-container.tsx","../src/ui/stage/loading-indicator.tsx","../node_modules/@use-gesture/core/dist/maths-b2a210f4.esm.js","../node_modules/@use-gesture/core/dist/actions-5ad85d2f.esm.js","../node_modules/@use-gesture/core/dist/use-gesture-core.esm.js","../node_modules/@use-gesture/react/dist/use-gesture-react.esm.js","../src/objects/ui/corner-handle.tsx","../src/tools/crop/ui/cropzone/mask-part.tsx","../src/tools/crop/ui/cropzone/cropzone-line.tsx","../src/common/ui/interactions/interactable.ts","../src/common/ui/interactions/actions/move-action.ts","../src/common/ui/interactions/modifiers/constrain-within-boundary.ts","../src/tools/crop/ui/cropzone/cropzone.tsx","../src/common/ui/interactions/actions/rotate-action.ts","../src/ui/icons/duplicate.tsx","../src/ui/icons/flip.tsx","../src/ui/icons/front-sorting.tsx","../src/ui/icons/remove.tsx","../src/objects/ui/floating-object-controls.tsx","../src/objects/ui/object-box/object-box-actions.ts","../src/objects/ui/object-box/ratation-control.tsx","../src/objects/ui/object-box/object-box.tsx","../src/ui/stage/stage-overlays.tsx","../src/ui/stage/canvas-wrapper.tsx","../src/ui/navbar/tool-controls-overlay-wrapper.tsx","../node_modules/react-colorful/dist/index.module.js","../src/common/ui/color-picker/color-swatch.tsx","../src/common/ui/color-picker/color-picker.tsx","../src/common/ui/overlays/dialog-context.tsx","../src/common/ui/overlays/dialog-trigger/dialog-trigger-base.tsx","../src/common/ui/overlays/popover/popover-trigger.tsx","../src/common/ui/overlays/modal/modal.tsx","../src/common/ui/overlays/modal/modal-trigger.tsx","../src/common/utils/hooks/use-media-query.ts","../src/common/utils/hooks/is-mobile-media-query.ts","../src/common/ui/overlays/dialog-trigger/dialog-trigger.tsx","../node_modules/@react-aria/dialog/dist/module.js","../src/common/ui/overlays/dialog/dialog-header.tsx","../src/common/ui/overlays/dialog/dialog.tsx","../src/ui/color-picker-button.tsx","../node_modules/@react-stately/slider/dist/module.js","../node_modules/@react-aria/slider/dist/module.js","../src/common/ui/inputs/slider/slider.tsx","../node_modules/@react-stately/list/dist/module.js","../node_modules/@react-stately/select/dist/module.js","../node_modules/@react-aria/select/dist/module.js","../src/common/ui/inputs/input-field/adornment.tsx","../node_modules/@react-aria/listbox/dist/module.js","../src/common/ui/inputs/listbox/listbox-option.tsx","../src/common/ui/inputs/listbox/listbox.tsx","../src/common/ui/inputs/select/picker.tsx","../src/tools/filter/ui/filter-controls.tsx","../src/tools/frame/ui/active-frame-controls.tsx","../node_modules/@react-aria/tabs/dist/module.js","../src/common/ui/tabs/tabs-context.tsx","../src/common/ui/tabs/tab.tsx","../src/common/ui/tabs/tab-line.tsx","../src/common/ui/tabs/tab-list.tsx","../node_modules/@react-stately/tabs/dist/module.js","../src/common/ui/tabs/tabs.tsx","../src/common/icons/material/FormatUnderlined.tsx","../src/common/icons/material/FormatStrikethrough.tsx","../src/common/icons/material/FormatItalic.tsx","../src/common/icons/material/FormatAlignRight.tsx","../src/common/icons/material/FormatAlignLeft.tsx","../src/common/icons/material/FormatAlignCenter.tsx","../src/objects/ui/active-obj-controls/text-style-tab-panel.tsx","../src/common/ui/tabs/tab-panels.tsx","../src/config/default-gradients.ts","../src/common/icons/material/Texture.tsx","../src/common/icons/material/Gradient.tsx","../src/common/icons/material/AddPhotoAlternate.tsx","../src/objects/ui/active-obj-controls/color-tab-panel.tsx","../src/objects/ui/active-obj-controls/opacity-tab-panel.tsx","../src/objects/ui/active-obj-controls/outline-tab-panel.tsx","../src/common/icons/material/Image.tsx","../src/objects/ui/active-obj-controls/image-tab-panel.tsx","../src/objects/ui/active-obj-controls/shadow-tab-panel.tsx","../src/objects/ui/active-obj-controls/active-object-controls.tsx","../src/tools/text/ui/active-text-controls.tsx","../src/ui/navbar/tool-controls-overlay.tsx","../src/common/icons/material/Cancel.tsx","../src/tools/filter/ui/filter-button.tsx","../src/ui/navbar/scrollable-view.tsx","../src/tools/filter/ui/filter-nav.tsx","../node_modules/@react-stately/toggle/dist/module.js","../node_modules/@react-aria/toggle/dist/module.js","../node_modules/@react-aria/checkbox/dist/module.js","../src/common/icons/material/CheckBoxOutlineBlank.tsx","../src/common/ui/inputs/checkbox/checkbox-icon.tsx","../src/common/ui/inputs/checkbox/checkbox-group-context.ts","../src/common/ui/inputs/checkbox/checkbox.tsx","../src/common/icons/material/Lock.tsx","../src/common/icons/material/LockOpen.tsx","../src/tools/resize/ui/resize-nav.tsx","../src/tools/crop/ui/crop-nav/crop-preset-btns.tsx","../src/common/icons/material/Flip.tsx","../src/tools/transform/ui/flip-btns.tsx","../src/common/icons/material/RotateLeft.tsx","../src/common/icons/material/RotateRight.tsx","../src/tools/transform/ui/rotate-btns.tsx","../src/tools/transform/ui/transform-widget.tsx","../src/tools/crop/ui/crop-nav/crop-nav.tsx","../src/ui/icons/ellipse.tsx","../src/ui/icons/circle.tsx","../src/ui/icons/square.tsx","../src/ui/icons/triangle.tsx","../src/tools/shapes/ui/shape-nav.tsx","../node_modules/react-virtual/dist/react-virtual.mjs","../src/tools/shapes/ui/sticker-nav/sticker-list.tsx","../src/tools/shapes/ui/sticker-nav/sticker-nav.tsx","../src/tools/frame/ui/frame-nav.tsx","../src/tools/text/ui/text-nav.tsx","../src/tools/draw/ui/draw-nav.tsx","../src/tools/corners/ui/corners-nav.tsx","../src/ui/navbar/navbar-animation.ts","../src/ui/navbar/tool-controls.tsx","../src/ui/navbar/navbar.tsx","../src/tools/history/ui/history-panel.tsx","../src/common/ui/overlays/dialog/dialog-body.tsx","../src/ui/new-image-dialog.tsx","../src/common/ui/inputs/input-field/text-field.tsx","../node_modules/@react-stately/radio/dist/module.js","../node_modules/@react-aria/radio/dist/module.js","../src/common/ui/inputs/radio-group/radio-context.ts","../src/common/ui/inputs/radio-group/radio-group.tsx","../src/common/ui/inputs/radio-group/radio.tsx","../src/tools/export/export-dialog-trigger.tsx","../src/objects/ui/obj-list-panel.tsx","../src/ui/overlay-panel-container.tsx","../src/common/icons/material/ErrorOutline.tsx","../src/common/ui/toast/toast-container.tsx","../src/common/ui/keycodes.enum.ts","../src/common/utils/keybinds/is-ctrl-key-pressed.ts","../src/ui/handle-canvas-keydown.ts","../src/ui/image-editor.tsx","../src/pixie.tsx"],"sourcesContent":["'use strict';\n\nvar isMergeableObject = function isMergeableObject(value) {\n\treturn isNonNullObject(value)\n\t\t&& !isSpecial(value)\n};\n\nfunction isNonNullObject(value) {\n\treturn !!value && typeof value === 'object'\n}\n\nfunction isSpecial(value) {\n\tvar stringValue = Object.prototype.toString.call(value);\n\n\treturn stringValue === '[object RegExp]'\n\t\t|| stringValue === '[object Date]'\n\t\t|| isReactElement(value)\n}\n\n// see https://github.com/facebook/react/blob/b5ac963fb791d1298e7f396236383bc955f916c1/src/isomorphic/classic/element/ReactElement.js#L21-L25\nvar canUseSymbol = typeof Symbol === 'function' && Symbol.for;\nvar REACT_ELEMENT_TYPE = canUseSymbol ? Symbol.for('react.element') : 0xeac7;\n\nfunction isReactElement(value) {\n\treturn value.$$typeof === REACT_ELEMENT_TYPE\n}\n\nfunction emptyTarget(val) {\n\treturn Array.isArray(val) ? [] : {}\n}\n\nfunction cloneUnlessOtherwiseSpecified(value, options) {\n\treturn (options.clone !== false && options.isMergeableObject(value))\n\t\t? deepmerge(emptyTarget(value), value, options)\n\t\t: value\n}\n\nfunction defaultArrayMerge(target, source, options) {\n\treturn target.concat(source).map(function(element) {\n\t\treturn cloneUnlessOtherwiseSpecified(element, options)\n\t})\n}\n\nfunction getMergeFunction(key, options) {\n\tif (!options.customMerge) {\n\t\treturn deepmerge\n\t}\n\tvar customMerge = options.customMerge(key);\n\treturn typeof customMerge === 'function' ? customMerge : deepmerge\n}\n\nfunction getEnumerableOwnPropertySymbols(target) {\n\treturn Object.getOwnPropertySymbols\n\t\t? Object.getOwnPropertySymbols(target).filter(function(symbol) {\n\t\t\treturn target.propertyIsEnumerable(symbol)\n\t\t})\n\t\t: []\n}\n\nfunction getKeys(target) {\n\treturn Object.keys(target).concat(getEnumerableOwnPropertySymbols(target))\n}\n\nfunction propertyIsOnObject(object, property) {\n\ttry {\n\t\treturn property in object\n\t} catch(_) {\n\t\treturn false\n\t}\n}\n\n// Protects from prototype poisoning and unexpected merging up the prototype chain.\nfunction propertyIsUnsafe(target, key) {\n\treturn propertyIsOnObject(target, key) // Properties are safe to merge if they don't exist in the target yet,\n\t\t&& !(Object.hasOwnProperty.call(target, key) // unsafe if they exist up the prototype chain,\n\t\t\t&& Object.propertyIsEnumerable.call(target, key)) // and also unsafe if they're nonenumerable.\n}\n\nfunction mergeObject(target, source, options) {\n\tvar destination = {};\n\tif (options.isMergeableObject(target)) {\n\t\tgetKeys(target).forEach(function(key) {\n\t\t\tdestination[key] = cloneUnlessOtherwiseSpecified(target[key], options);\n\t\t});\n\t}\n\tgetKeys(source).forEach(function(key) {\n\t\tif (propertyIsUnsafe(target, key)) {\n\t\t\treturn\n\t\t}\n\n\t\tif (propertyIsOnObject(target, key) && options.isMergeableObject(source[key])) {\n\t\t\tdestination[key] = getMergeFunction(key, options)(target[key], source[key], options);\n\t\t} else {\n\t\t\tdestination[key] = cloneUnlessOtherwiseSpecified(source[key], options);\n\t\t}\n\t});\n\treturn destination\n}\n\nfunction deepmerge(target, source, options) {\n\toptions = options || {};\n\toptions.arrayMerge = options.arrayMerge || defaultArrayMerge;\n\toptions.isMergeableObject = options.isMergeableObject || isMergeableObject;\n\t// cloneUnlessOtherwiseSpecified is added to `options` so that custom arrayMerge()\n\t// implementations can use it. The caller may not replace it.\n\toptions.cloneUnlessOtherwiseSpecified = cloneUnlessOtherwiseSpecified;\n\n\tvar sourceIsArray = Array.isArray(source);\n\tvar targetIsArray = Array.isArray(target);\n\tvar sourceAndTargetTypesMatch = sourceIsArray === targetIsArray;\n\n\tif (!sourceAndTargetTypesMatch) {\n\t\treturn cloneUnlessOtherwiseSpecified(source, options)\n\t} else if (sourceIsArray) {\n\t\treturn options.arrayMerge(target, source, options)\n\t} else {\n\t\treturn mergeObject(target, source, options)\n\t}\n}\n\ndeepmerge.all = function deepmergeAll(array, options) {\n\tif (!Array.isArray(array)) {\n\t\tthrow new Error('first argument should be an array')\n\t}\n\n\treturn array.reduce(function(prev, next) {\n\t\treturn deepmerge(prev, next, options)\n\t}, {})\n};\n\nvar deepmerge_1 = deepmerge;\n\nmodule.exports = deepmerge_1;\n","function styleInject(css, ref) {\n  if ( ref === void 0 ) ref = {};\n  var insertAt = ref.insertAt;\n\n  if (!css || typeof document === 'undefined') { return; }\n\n  var head = document.head || document.getElementsByTagName('head')[0];\n  var style = document.createElement('style');\n  style.type = 'text/css';\n\n  if (insertAt === 'top') {\n    if (head.firstChild) {\n      head.insertBefore(style, head.firstChild);\n    } else {\n      head.appendChild(style);\n    }\n  } else {\n    head.appendChild(style);\n  }\n\n  if (style.styleSheet) {\n    style.styleSheet.cssText = css;\n  } else {\n    style.appendChild(document.createTextNode(css));\n  }\n}\n\nexport default styleInject;\n","/**\r\n * @desc 解决浮动运算问题,避免小数点后产生多位数和计算精度损失。\r\n * 问题示例:2.3 + 2.4 = 4.699999999999999,1.0 - 0.9 = 0.09999999999999998\r\n */\r\n/**\r\n * 把错误的数据转正\r\n * strip(0.09999999999999998)=0.1\r\n */\r\nfunction strip(num, precision) {\r\n    if (precision === void 0) { precision = 15; }\r\n    return +parseFloat(Number(num).toPrecision(precision));\r\n}\r\n/**\r\n * Return digits length of a number\r\n * @param {*number} num Input number\r\n */\r\nfunction digitLength(num) {\r\n    // Get digit length of e\r\n    var eSplit = num.toString().split(/[eE]/);\r\n    var len = (eSplit[0].split('.')[1] || '').length - +(eSplit[1] || 0);\r\n    return len > 0 ? len : 0;\r\n}\r\n/**\r\n * 把小数转成整数,支持科学计数法。如果是小数则放大成整数\r\n * @param {*number} num 输入数\r\n */\r\nfunction float2Fixed(num) {\r\n    if (num.toString().indexOf('e') === -1) {\r\n        return Number(num.toString().replace('.', ''));\r\n    }\r\n    var dLen = digitLength(num);\r\n    return dLen > 0 ? strip(Number(num) * Math.pow(10, dLen)) : Number(num);\r\n}\r\n/**\r\n * 检测数字是否越界,如果越界给出提示\r\n * @param {*number} num 输入数\r\n */\r\nfunction checkBoundary(num) {\r\n    if (_boundaryCheckingState) {\r\n        if (num > Number.MAX_SAFE_INTEGER || num < Number.MIN_SAFE_INTEGER) {\r\n            console.warn(num + \" is beyond boundary when transfer to integer, the results may not be accurate\");\r\n        }\r\n    }\r\n}\r\n/**\r\n * 迭代操作\r\n */\r\nfunction iteratorOperation(arr, operation) {\r\n    var num1 = arr[0], num2 = arr[1], others = arr.slice(2);\r\n    var res = operation(num1, num2);\r\n    others.forEach(function (num) {\r\n        res = operation(res, num);\r\n    });\r\n    return res;\r\n}\r\n/**\r\n * 精确乘法\r\n */\r\nfunction times() {\r\n    var nums = [];\r\n    for (var _i = 0; _i < arguments.length; _i++) {\r\n        nums[_i] = arguments[_i];\r\n    }\r\n    if (nums.length > 2) {\r\n        return iteratorOperation(nums, times);\r\n    }\r\n    var num1 = nums[0], num2 = nums[1];\r\n    var num1Changed = float2Fixed(num1);\r\n    var num2Changed = float2Fixed(num2);\r\n    var baseNum = digitLength(num1) + digitLength(num2);\r\n    var leftValue = num1Changed * num2Changed;\r\n    checkBoundary(leftValue);\r\n    return leftValue / Math.pow(10, baseNum);\r\n}\r\n/**\r\n * 精确加法\r\n */\r\nfunction plus() {\r\n    var nums = [];\r\n    for (var _i = 0; _i < arguments.length; _i++) {\r\n        nums[_i] = arguments[_i];\r\n    }\r\n    if (nums.length > 2) {\r\n        return iteratorOperation(nums, plus);\r\n    }\r\n    var num1 = nums[0], num2 = nums[1];\r\n    // 取最大的小数位\r\n    var baseNum = Math.pow(10, Math.max(digitLength(num1), digitLength(num2)));\r\n    // 把小数都转为整数然后再计算\r\n    return (times(num1, baseNum) + times(num2, baseNum)) / baseNum;\r\n}\r\n/**\r\n * 精确减法\r\n */\r\nfunction minus() {\r\n    var nums = [];\r\n    for (var _i = 0; _i < arguments.length; _i++) {\r\n        nums[_i] = arguments[_i];\r\n    }\r\n    if (nums.length > 2) {\r\n        return iteratorOperation(nums, minus);\r\n    }\r\n    var num1 = nums[0], num2 = nums[1];\r\n    var baseNum = Math.pow(10, Math.max(digitLength(num1), digitLength(num2)));\r\n    return (times(num1, baseNum) - times(num2, baseNum)) / baseNum;\r\n}\r\n/**\r\n * 精确除法\r\n */\r\nfunction divide() {\r\n    var nums = [];\r\n    for (var _i = 0; _i < arguments.length; _i++) {\r\n        nums[_i] = arguments[_i];\r\n    }\r\n    if (nums.length > 2) {\r\n        return iteratorOperation(nums, divide);\r\n    }\r\n    var num1 = nums[0], num2 = nums[1];\r\n    var num1Changed = float2Fixed(num1);\r\n    var num2Changed = float2Fixed(num2);\r\n    checkBoundary(num1Changed);\r\n    checkBoundary(num2Changed);\r\n    // fix: 类似 10 ** -4 为 0.00009999999999999999,strip 修正\r\n    return times(num1Changed / num2Changed, strip(Math.pow(10, digitLength(num2) - digitLength(num1))));\r\n}\r\n/**\r\n * 四舍五入\r\n */\r\nfunction round(num, ratio) {\r\n    var base = Math.pow(10, ratio);\r\n    var result = divide(Math.round(Math.abs(times(num, base))), base);\r\n    if (num < 0 && result !== 0) {\r\n        result = times(result, -1);\r\n    }\r\n    return result;\r\n}\r\nvar _boundaryCheckingState = true;\r\n/**\r\n * 是否进行边界检查,默认开启\r\n * @param flag 标记开关,true 为开启,false 为关闭,默认为 true\r\n */\r\nfunction enableBoundaryChecking(flag) {\r\n    if (flag === void 0) { flag = true; }\r\n    _boundaryCheckingState = flag;\r\n}\r\nvar index = {\r\n    strip: strip,\r\n    plus: plus,\r\n    minus: minus,\r\n    times: times,\r\n    divide: divide,\r\n    round: round,\r\n    digitLength: digitLength,\r\n    float2Fixed: float2Fixed,\r\n    enableBoundaryChecking: enableBoundaryChecking,\r\n};\n\nexport { strip, plus, minus, times, divide, round, digitLength, float2Fixed, enableBoundaryChecking };\nexport default index;\n","/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n    extendStatics = Object.setPrototypeOf ||\r\n        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\r\n    return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n    extendStatics(d, b);\r\n    function __() { this.constructor = d; }\r\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n    __assign = Object.assign || function __assign(t) {\r\n        for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n            s = arguments[i];\r\n            for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n        }\r\n        return t;\r\n    }\r\n    return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n    var t = {};\r\n    for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n        t[p] = s[p];\r\n    if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n        for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n            if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n                t[p[i]] = s[p[i]];\r\n        }\r\n    return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n    return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n    if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n    return new (P || (P = Promise))(function (resolve, reject) {\r\n        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n        function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n        step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n    });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n    var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n    return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n    function verb(n) { return function (v) { return step([n, v]); }; }\r\n    function step(op) {\r\n        if (f) throw new TypeError(\"Generator is already executing.\");\r\n        while (_) try {\r\n            if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n            if (y = 0, t) op = [op[0] & 2, t.value];\r\n            switch (op[0]) {\r\n                case 0: case 1: t = op; break;\r\n                case 4: _.label++; return { value: op[1], done: false };\r\n                case 5: _.label++; y = op[1]; op = [0]; continue;\r\n                case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n                default:\r\n                    if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n                    if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n                    if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n                    if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n                    if (t[2]) _.ops.pop();\r\n                    _.trys.pop(); continue;\r\n            }\r\n            op = body.call(thisArg, _);\r\n        } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n        if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n    }\r\n}\r\n\r\nexport function __createBinding(o, m, k, k2) {\r\n    if (k2 === undefined) k2 = k;\r\n    o[k2] = m[k];\r\n}\r\n\r\nexport function __exportStar(m, exports) {\r\n    for (var p in m) if (p !== \"default\" && !exports.hasOwnProperty(p)) exports[p] = m[p];\r\n}\r\n\r\nexport function __values(o) {\r\n    var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n    if (m) return m.call(o);\r\n    if (o && typeof o.length === \"number\") return {\r\n        next: function () {\r\n            if (o && i >= o.length) o = void 0;\r\n            return { value: o && o[i++], done: !o };\r\n        }\r\n    };\r\n    throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n    var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n    if (!m) return o;\r\n    var i = m.call(o), r, ar = [], e;\r\n    try {\r\n        while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n    }\r\n    catch (error) { e = { error: error }; }\r\n    finally {\r\n        try {\r\n            if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n        }\r\n        finally { if (e) throw e.error; }\r\n    }\r\n    return ar;\r\n}\r\n\r\nexport function __spread() {\r\n    for (var ar = [], i = 0; i < arguments.length; i++)\r\n        ar = ar.concat(__read(arguments[i]));\r\n    return ar;\r\n}\r\n\r\nexport function __spreadArrays() {\r\n    for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n    for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n        for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n            r[k] = a[j];\r\n    return r;\r\n};\r\n\r\nexport function __await(v) {\r\n    return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n    if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n    var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n    return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n    function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n    function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n    function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n    function fulfill(value) { resume(\"next\", value); }\r\n    function reject(value) { resume(\"throw\", value); }\r\n    function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n    var i, p;\r\n    return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n    function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n    if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n    var m = o[Symbol.asyncIterator], i;\r\n    return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n    function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n    function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n    if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n    return cooked;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n    if (mod && mod.__esModule) return mod;\r\n    var result = {};\r\n    if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];\r\n    result.default = mod;\r\n    return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n    return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, privateMap) {\r\n    if (!privateMap.has(receiver)) {\r\n        throw new TypeError(\"attempted to get private field on non-instance\");\r\n    }\r\n    return privateMap.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, privateMap, value) {\r\n    if (!privateMap.has(receiver)) {\r\n        throw new TypeError(\"attempted to set private field on non-instance\");\r\n    }\r\n    privateMap.set(receiver, value);\r\n    return value;\r\n}\r\n","/**\n * TODO(v7): Remove this enum and replace with SeverityLevel\n */\nexport var Severity;\n(function (Severity) {\n    /** JSDoc */\n    Severity[\"Fatal\"] = \"fatal\";\n    /** JSDoc */\n    Severity[\"Error\"] = \"error\";\n    /** JSDoc */\n    Severity[\"Warning\"] = \"warning\";\n    /** JSDoc */\n    Severity[\"Log\"] = \"log\";\n    /** JSDoc */\n    Severity[\"Info\"] = \"info\";\n    /** JSDoc */\n    Severity[\"Debug\"] = \"debug\";\n    /** JSDoc */\n    Severity[\"Critical\"] = \"critical\";\n})(Severity || (Severity = {}));\n// TODO: in v7, these can disappear, because they now also exist in `@sentry/utils`. (Having them there rather than here\n// is nice because then it enforces the idea that only types are exported from `@sentry/types`.)\nexport var SeverityLevels = ['fatal', 'error', 'warning', 'log', 'info', 'debug', 'critical'];\n//# sourceMappingURL=severity.js.map","/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n    extendStatics = Object.setPrototypeOf ||\r\n        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\r\n    return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n    extendStatics(d, b);\r\n    function __() { this.constructor = d; }\r\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n    __assign = Object.assign || function __assign(t) {\r\n        for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n            s = arguments[i];\r\n            for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n        }\r\n        return t;\r\n    }\r\n    return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n    var t = {};\r\n    for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n        t[p] = s[p];\r\n    if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n        for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n            if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n                t[p[i]] = s[p[i]];\r\n        }\r\n    return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n    return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n    if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n    return new (P || (P = Promise))(function (resolve, reject) {\r\n        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n        function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n        step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n    });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n    var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n    return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n    function verb(n) { return function (v) { return step([n, v]); }; }\r\n    function step(op) {\r\n        if (f) throw new TypeError(\"Generator is already executing.\");\r\n        while (_) try {\r\n            if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n            if (y = 0, t) op = [op[0] & 2, t.value];\r\n            switch (op[0]) {\r\n                case 0: case 1: t = op; break;\r\n                case 4: _.label++; return { value: op[1], done: false };\r\n                case 5: _.label++; y = op[1]; op = [0]; continue;\r\n                case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n                default:\r\n                    if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n                    if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n                    if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n                    if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n                    if (t[2]) _.ops.pop();\r\n                    _.trys.pop(); continue;\r\n            }\r\n            op = body.call(thisArg, _);\r\n        } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n        if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n    }\r\n}\r\n\r\nexport function __createBinding(o, m, k, k2) {\r\n    if (k2 === undefined) k2 = k;\r\n    o[k2] = m[k];\r\n}\r\n\r\nexport function __exportStar(m, exports) {\r\n    for (var p in m) if (p !== \"default\" && !exports.hasOwnProperty(p)) exports[p] = m[p];\r\n}\r\n\r\nexport function __values(o) {\r\n    var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n    if (m) return m.call(o);\r\n    if (o && typeof o.length === \"number\") return {\r\n        next: function () {\r\n            if (o && i >= o.length) o = void 0;\r\n            return { value: o && o[i++], done: !o };\r\n        }\r\n    };\r\n    throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n    var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n    if (!m) return o;\r\n    var i = m.call(o), r, ar = [], e;\r\n    try {\r\n        while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n    }\r\n    catch (error) { e = { error: error }; }\r\n    finally {\r\n        try {\r\n            if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n        }\r\n        finally { if (e) throw e.error; }\r\n    }\r\n    return ar;\r\n}\r\n\r\nexport function __spread() {\r\n    for (var ar = [], i = 0; i < arguments.length; i++)\r\n        ar = ar.concat(__read(arguments[i]));\r\n    return ar;\r\n}\r\n\r\nexport function __spreadArrays() {\r\n    for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n    for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n        for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n            r[k] = a[j];\r\n    return r;\r\n};\r\n\r\nexport function __await(v) {\r\n    return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n    if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n    var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n    return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n    function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n    function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n    function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n    function fulfill(value) { resume(\"next\", value); }\r\n    function reject(value) { resume(\"throw\", value); }\r\n    function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n    var i, p;\r\n    return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n    function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n    if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n    var m = o[Symbol.asyncIterator], i;\r\n    return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n    function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n    function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n    if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n    return cooked;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n    if (mod && mod.__esModule) return mod;\r\n    var result = {};\r\n    if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];\r\n    result.default = mod;\r\n    return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n    return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, privateMap) {\r\n    if (!privateMap.has(receiver)) {\r\n        throw new TypeError(\"attempted to get private field on non-instance\");\r\n    }\r\n    return privateMap.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, privateMap, value) {\r\n    if (!privateMap.has(receiver)) {\r\n        throw new TypeError(\"attempted to set private field on non-instance\");\r\n    }\r\n    privateMap.set(receiver, value);\r\n    return value;\r\n}\r\n","/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n    extendStatics = Object.setPrototypeOf ||\r\n        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\r\n    return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n    extendStatics(d, b);\r\n    function __() { this.constructor = d; }\r\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n    __assign = Object.assign || function __assign(t) {\r\n        for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n            s = arguments[i];\r\n            for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n        }\r\n        return t;\r\n    }\r\n    return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n    var t = {};\r\n    for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n        t[p] = s[p];\r\n    if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n        for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n            if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n                t[p[i]] = s[p[i]];\r\n        }\r\n    return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n    return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n    if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n    return new (P || (P = Promise))(function (resolve, reject) {\r\n        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n        function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n        step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n    });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n    var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n    return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n    function verb(n) { return function (v) { return step([n, v]); }; }\r\n    function step(op) {\r\n        if (f) throw new TypeError(\"Generator is already executing.\");\r\n        while (_) try {\r\n            if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n            if (y = 0, t) op = [op[0] & 2, t.value];\r\n            switch (op[0]) {\r\n                case 0: case 1: t = op; break;\r\n                case 4: _.label++; return { value: op[1], done: false };\r\n                case 5: _.label++; y = op[1]; op = [0]; continue;\r\n                case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n                default:\r\n                    if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n                    if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n                    if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n                    if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n                    if (t[2]) _.ops.pop();\r\n                    _.trys.pop(); continue;\r\n            }\r\n            op = body.call(thisArg, _);\r\n        } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n        if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n    }\r\n}\r\n\r\nexport function __createBinding(o, m, k, k2) {\r\n    if (k2 === undefined) k2 = k;\r\n    o[k2] = m[k];\r\n}\r\n\r\nexport function __exportStar(m, exports) {\r\n    for (var p in m) if (p !== \"default\" && !exports.hasOwnProperty(p)) exports[p] = m[p];\r\n}\r\n\r\nexport function __values(o) {\r\n    var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n    if (m) return m.call(o);\r\n    if (o && typeof o.length === \"number\") return {\r\n        next: function () {\r\n            if (o && i >= o.length) o = void 0;\r\n            return { value: o && o[i++], done: !o };\r\n        }\r\n    };\r\n    throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n    var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n    if (!m) return o;\r\n    var i = m.call(o), r, ar = [], e;\r\n    try {\r\n        while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n    }\r\n    catch (error) { e = { error: error }; }\r\n    finally {\r\n        try {\r\n            if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n        }\r\n        finally { if (e) throw e.error; }\r\n    }\r\n    return ar;\r\n}\r\n\r\nexport function __spread() {\r\n    for (var ar = [], i = 0; i < arguments.length; i++)\r\n        ar = ar.concat(__read(arguments[i]));\r\n    return ar;\r\n}\r\n\r\nexport function __spreadArrays() {\r\n    for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n    for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n        for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n            r[k] = a[j];\r\n    return r;\r\n};\r\n\r\nexport function __await(v) {\r\n    return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n    if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n    var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n    return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n    function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n    function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n    function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n    function fulfill(value) { resume(\"next\", value); }\r\n    function reject(value) { resume(\"throw\", value); }\r\n    function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n    var i, p;\r\n    return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n    function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n    if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n    var m = o[Symbol.asyncIterator], i;\r\n    return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n    function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n    function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n    if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n    return cooked;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n    if (mod && mod.__esModule) return mod;\r\n    var result = {};\r\n    if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];\r\n    result.default = mod;\r\n    return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n    return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, privateMap) {\r\n    if (!privateMap.has(receiver)) {\r\n        throw new TypeError(\"attempted to get private field on non-instance\");\r\n    }\r\n    return privateMap.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, privateMap, value) {\r\n    if (!privateMap.has(receiver)) {\r\n        throw new TypeError(\"attempted to set private field on non-instance\");\r\n    }\r\n    privateMap.set(receiver, value);\r\n    return value;\r\n}\r\n","/**\n * Consumes the promise and logs the error when it rejects.\n * @param promise A promise to forget.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function forget(promise) {\n    void promise.then(null, function (e) {\n        // TODO: Use a better logging mechanism\n        // eslint-disable-next-line no-console\n        console.error(e);\n    });\n}\n//# sourceMappingURL=async.js.map","/**\n * This module mostly exists for optimizations in the build process\n * through rollup and terser.  We define some global constants which\n * are normally undefined.  However terser overrides these with global\n * definitions which can be evaluated by the static analyzer when\n * creating a bundle.\n *\n * In turn the `isDebugBuild` and `isBrowserBundle` functions are pure\n * and can help us remove unused code from the bundles.\n */\n/**\n * Figures out if we're building with debug functionality.\n *\n * @returns true if this is a debug build\n */\nexport function isDebugBuild() {\n    return typeof __SENTRY_NO_DEBUG__ !== 'undefined' && !__SENTRY_BROWSER_BUNDLE__;\n}\n/**\n * Figures out if we're building a browser bundle.\n *\n * @returns true if this is a browser bundle build.\n */\nexport function isBrowserBundle() {\n    return typeof __SENTRY_BROWSER_BUNDLE__ !== 'undefined' && !!__SENTRY_BROWSER_BUNDLE__;\n}\n//# sourceMappingURL=env.js.map","/**\n * NOTE: In order to avoid circular dependencies, if you add a function to this module and it needs to print something,\n * you must either a) use `console.log` rather than the logger, or b) put your function elsewhere.\n */\nimport { isBrowserBundle } from './env';\n/**\n * Checks whether we're in the Node.js or Browser environment\n *\n * @returns Answer to given question\n */\nexport function isNodeEnv() {\n    // explicitly check for browser bundles as those can be optimized statically\n    // by terser/rollup.\n    return (!isBrowserBundle() &&\n        Object.prototype.toString.call(typeof process !== 'undefined' ? process : 0) === '[object process]');\n}\n/**\n * Requires a module which is protected against bundler minification.\n *\n * @param request The module path to resolve\n */\n// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types, @typescript-eslint/no-explicit-any\nexport function dynamicRequire(mod, request) {\n    // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n    return mod.require(request);\n}\n/**\n * Helper for dynamically loading module that should work with linked dependencies.\n * The problem is that we _should_ be using `require(require.resolve(moduleName, { paths: [cwd()] }))`\n * However it's _not possible_ to do that with Webpack, as it has to know all the dependencies during\n * build time. `require.resolve` is also not available in any other way, so we cannot create,\n * a fake helper like we do with `dynamicRequire`.\n *\n * We always prefer to use local package, thus the value is not returned early from each `try/catch` block.\n * That is to mimic the behavior of `require.resolve` exactly.\n *\n * @param moduleName module name to require\n * @returns possibly required module\n */\nexport function loadModule(moduleName) {\n    var mod;\n    try {\n        mod = dynamicRequire(module, moduleName);\n    }\n    catch (e) {\n        // no-empty\n    }\n    try {\n        var cwd = dynamicRequire(module, 'process').cwd;\n        mod = dynamicRequire(module, cwd() + \"/node_modules/\" + moduleName);\n    }\n    catch (e) {\n        // no-empty\n    }\n    return mod;\n}\n//# sourceMappingURL=node.js.map","/**\n * NOTE: In order to avoid circular dependencies, if you add a function to this module and it needs to print something,\n * you must either a) use `console.log` rather than the logger, or b) put your function elsewhere.\n */\nimport { isNodeEnv } from './node';\nvar fallbackGlobalObject = {};\n/**\n * Safely get global scope object\n *\n * @returns Global scope object\n */\nexport function getGlobalObject() {\n    return (isNodeEnv()\n        ? global\n        : typeof window !== 'undefined' // eslint-disable-line no-restricted-globals\n            ? window // eslint-disable-line no-restricted-globals\n            : typeof self !== 'undefined'\n                ? self\n                : fallbackGlobalObject);\n}\n//# sourceMappingURL=global.js.map","/* eslint-disable @typescript-eslint/no-explicit-any */\n/* eslint-disable @typescript-eslint/explicit-module-boundary-types */\n// eslint-disable-next-line @typescript-eslint/unbound-method\nvar objectToString = Object.prototype.toString;\n/**\n * Checks whether given value's type is one of a few Error or Error-like\n * {@link isError}.\n *\n * @param wat A value to be checked.\n * @returns A boolean representing the result.\n */\nexport function isError(wat) {\n    switch (objectToString.call(wat)) {\n        case '[object Error]':\n        case '[object Exception]':\n        case '[object DOMException]':\n            return true;\n        default:\n            return isInstanceOf(wat, Error);\n    }\n}\nfunction isBuiltin(wat, ty) {\n    return objectToString.call(wat) === \"[object \" + ty + \"]\";\n}\n/**\n * Checks whether given value's type is ErrorEvent\n * {@link isErrorEvent}.\n *\n * @param wat A value to be checked.\n * @returns A boolean representing the result.\n */\nexport function isErrorEvent(wat) {\n    return isBuiltin(wat, 'ErrorEvent');\n}\n/**\n * Checks whether given value's type is DOMError\n * {@link isDOMError}.\n *\n * @param wat A value to be checked.\n * @returns A boolean representing the result.\n */\nexport function isDOMError(wat) {\n    return isBuiltin(wat, 'DOMError');\n}\n/**\n * Checks whether given value's type is DOMException\n * {@link isDOMException}.\n *\n * @param wat A value to be checked.\n * @returns A boolean representing the result.\n */\nexport function isDOMException(wat) {\n    return isBuiltin(wat, 'DOMException');\n}\n/**\n * Checks whether given value's type is a string\n * {@link isString}.\n *\n * @param wat A value to be checked.\n * @returns A boolean representing the result.\n */\nexport function isString(wat) {\n    return isBuiltin(wat, 'String');\n}\n/**\n * Checks whether given value is a primitive (undefined, null, number, boolean, string, bigint, symbol)\n * {@link isPrimitive}.\n *\n * @param wat A value to be checked.\n * @returns A boolean representing the result.\n */\nexport function isPrimitive(wat) {\n    return wat === null || (typeof wat !== 'object' && typeof wat !== 'function');\n}\n/**\n * Checks whether given value's type is an object literal\n * {@link isPlainObject}.\n *\n * @param wat A value to be checked.\n * @returns A boolean representing the result.\n */\nexport function isPlainObject(wat) {\n    return isBuiltin(wat, 'Object');\n}\n/**\n * Checks whether given value's type is an Event instance\n * {@link isEvent}.\n *\n * @param wat A value to be checked.\n * @returns A boolean representing the result.\n */\nexport function isEvent(wat) {\n    return typeof Event !== 'undefined' && isInstanceOf(wat, Event);\n}\n/**\n * Checks whether given value's type is an Element instance\n * {@link isElement}.\n *\n * @param wat A value to be checked.\n * @returns A boolean representing the result.\n */\nexport function isElement(wat) {\n    return typeof Element !== 'undefined' && isInstanceOf(wat, Element);\n}\n/**\n * Checks whether given value's type is an regexp\n * {@link isRegExp}.\n *\n * @param wat A value to be checked.\n * @returns A boolean representing the result.\n */\nexport function isRegExp(wat) {\n    return isBuiltin(wat, 'RegExp');\n}\n/**\n * Checks whether given value has a then function.\n * @param wat A value to be checked.\n */\nexport function isThenable(wat) {\n    // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n    return Boolean(wat && wat.then && typeof wat.then === 'function');\n}\n/**\n * Checks whether given value's type is a SyntheticEvent\n * {@link isSyntheticEvent}.\n *\n * @param wat A value to be checked.\n * @returns A boolean representing the result.\n */\nexport function isSyntheticEvent(wat) {\n    return isPlainObject(wat) && 'nativeEvent' in wat && 'preventDefault' in wat && 'stopPropagation' in wat;\n}\n/**\n * Checks whether given value's type is an instance of provided constructor.\n * {@link isInstanceOf}.\n *\n * @param wat A value to be checked.\n * @param base A constructor to be used in a check.\n * @returns A boolean representing the result.\n */\nexport function isInstanceOf(wat, base) {\n    try {\n        return wat instanceof base;\n    }\n    catch (_e) {\n        return false;\n    }\n}\n//# sourceMappingURL=is.js.map","import { getGlobalObject } from './global';\nimport { isString } from './is';\n/**\n * Given a child DOM element, returns a query-selector statement describing that\n * and its ancestors\n * e.g. [HTMLElement] => body > div > input#foo.btn[name=baz]\n * @returns generated DOM path\n */\nexport function htmlTreeAsString(elem, keyAttrs) {\n    // try/catch both:\n    // - accessing event.target (see getsentry/raven-js#838, #768)\n    // - `htmlTreeAsString` because it's complex, and just accessing the DOM incorrectly\n    // - can throw an exception in some circumstances.\n    try {\n        var currentElem = elem;\n        var MAX_TRAVERSE_HEIGHT = 5;\n        var MAX_OUTPUT_LEN = 80;\n        var out = [];\n        var height = 0;\n        var len = 0;\n        var separator = ' > ';\n        var sepLength = separator.length;\n        var nextStr = void 0;\n        // eslint-disable-next-line no-plusplus\n        while (currentElem && height++ < MAX_TRAVERSE_HEIGHT) {\n            nextStr = _htmlElementAsString(currentElem, keyAttrs);\n            // bail out if\n            // - nextStr is the 'html' element\n            // - the length of the string that would be created exceeds MAX_OUTPUT_LEN\n            //   (ignore this limit if we are on the first iteration)\n            if (nextStr === 'html' || (height > 1 && len + out.length * sepLength + nextStr.length >= MAX_OUTPUT_LEN)) {\n                break;\n            }\n            out.push(nextStr);\n            len += nextStr.length;\n            currentElem = currentElem.parentNode;\n        }\n        return out.reverse().join(separator);\n    }\n    catch (_oO) {\n        return '<unknown>';\n    }\n}\n/**\n * Returns a simple, query-selector representation of a DOM element\n * e.g. [HTMLElement] => input#foo.btn[name=baz]\n * @returns generated DOM path\n */\nfunction _htmlElementAsString(el, keyAttrs) {\n    var elem = el;\n    var out = [];\n    var className;\n    var classes;\n    var key;\n    var attr;\n    var i;\n    if (!elem || !elem.tagName) {\n        return '';\n    }\n    out.push(elem.tagName.toLowerCase());\n    // Pairs of attribute keys defined in `serializeAttribute` and their values on element.\n    var keyAttrPairs = keyAttrs && keyAttrs.length\n        ? keyAttrs.filter(function (keyAttr) { return elem.getAttribute(keyAttr); }).map(function (keyAttr) { return [keyAttr, elem.getAttribute(keyAttr)]; })\n        : null;\n    if (keyAttrPairs && keyAttrPairs.length) {\n        keyAttrPairs.forEach(function (keyAttrPair) {\n            out.push(\"[\" + keyAttrPair[0] + \"=\\\"\" + keyAttrPair[1] + \"\\\"]\");\n        });\n    }\n    else {\n        if (elem.id) {\n            out.push(\"#\" + elem.id);\n        }\n        // eslint-disable-next-line prefer-const\n        className = elem.className;\n        if (className && isString(className)) {\n            classes = className.split(/\\s+/);\n            for (i = 0; i < classes.length; i++) {\n                out.push(\".\" + classes[i]);\n            }\n        }\n    }\n    var allowedAttrs = ['type', 'name', 'title', 'alt'];\n    for (i = 0; i < allowedAttrs.length; i++) {\n        key = allowedAttrs[i];\n        attr = elem.getAttribute(key);\n        if (attr) {\n            out.push(\"[\" + key + \"=\\\"\" + attr + \"\\\"]\");\n        }\n    }\n    return out.join('');\n}\n/**\n * A safe form of location.href\n */\nexport function getLocationHref() {\n    var global = getGlobalObject();\n    try {\n        return global.document.location.href;\n    }\n    catch (oO) {\n        return '';\n    }\n}\n//# sourceMappingURL=browser.js.map","/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n    extendStatics = Object.setPrototypeOf ||\r\n        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\r\n    return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n    extendStatics(d, b);\r\n    function __() { this.constructor = d; }\r\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n    __assign = Object.assign || function __assign(t) {\r\n        for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n            s = arguments[i];\r\n            for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n        }\r\n        return t;\r\n    }\r\n    return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n    var t = {};\r\n    for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n        t[p] = s[p];\r\n    if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n        for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n            if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n                t[p[i]] = s[p[i]];\r\n        }\r\n    return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n    return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n    if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n    return new (P || (P = Promise))(function (resolve, reject) {\r\n        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n        function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n        step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n    });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n    var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n    return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n    function verb(n) { return function (v) { return step([n, v]); }; }\r\n    function step(op) {\r\n        if (f) throw new TypeError(\"Generator is already executing.\");\r\n        while (_) try {\r\n            if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n            if (y = 0, t) op = [op[0] & 2, t.value];\r\n            switch (op[0]) {\r\n                case 0: case 1: t = op; break;\r\n                case 4: _.label++; return { value: op[1], done: false };\r\n                case 5: _.label++; y = op[1]; op = [0]; continue;\r\n                case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n                default:\r\n                    if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n                    if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n                    if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n                    if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n                    if (t[2]) _.ops.pop();\r\n                    _.trys.pop(); continue;\r\n            }\r\n            op = body.call(thisArg, _);\r\n        } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n        if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n    }\r\n}\r\n\r\nexport function __createBinding(o, m, k, k2) {\r\n    if (k2 === undefined) k2 = k;\r\n    o[k2] = m[k];\r\n}\r\n\r\nexport function __exportStar(m, exports) {\r\n    for (var p in m) if (p !== \"default\" && !exports.hasOwnProperty(p)) exports[p] = m[p];\r\n}\r\n\r\nexport function __values(o) {\r\n    var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n    if (m) return m.call(o);\r\n    if (o && typeof o.length === \"number\") return {\r\n        next: function () {\r\n            if (o && i >= o.length) o = void 0;\r\n            return { value: o && o[i++], done: !o };\r\n        }\r\n    };\r\n    throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n    var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n    if (!m) return o;\r\n    var i = m.call(o), r, ar = [], e;\r\n    try {\r\n        while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n    }\r\n    catch (error) { e = { error: error }; }\r\n    finally {\r\n        try {\r\n            if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n        }\r\n        finally { if (e) throw e.error; }\r\n    }\r\n    return ar;\r\n}\r\n\r\nexport function __spread() {\r\n    for (var ar = [], i = 0; i < arguments.length; i++)\r\n        ar = ar.concat(__read(arguments[i]));\r\n    return ar;\r\n}\r\n\r\nexport function __spreadArrays() {\r\n    for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n    for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n        for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n            r[k] = a[j];\r\n    return r;\r\n};\r\n\r\nexport function __await(v) {\r\n    return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n    if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n    var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n    return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n    function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n    function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n    function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n    function fulfill(value) { resume(\"next\", value); }\r\n    function reject(value) { resume(\"throw\", value); }\r\n    function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n    var i, p;\r\n    return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n    function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n    if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n    var m = o[Symbol.asyncIterator], i;\r\n    return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n    function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n    function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n    if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n    return cooked;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n    if (mod && mod.__esModule) return mod;\r\n    var result = {};\r\n    if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];\r\n    result.default = mod;\r\n    return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n    return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, privateMap) {\r\n    if (!privateMap.has(receiver)) {\r\n        throw new TypeError(\"attempted to get private field on non-instance\");\r\n    }\r\n    return privateMap.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, privateMap, value) {\r\n    if (!privateMap.has(receiver)) {\r\n        throw new TypeError(\"attempted to set private field on non-instance\");\r\n    }\r\n    privateMap.set(receiver, value);\r\n    return value;\r\n}\r\n","export var setPrototypeOf = Object.setPrototypeOf || ({ __proto__: [] } instanceof Array ? setProtoOf : mixinProperties);\n/**\n * setPrototypeOf polyfill using __proto__\n */\n// eslint-disable-next-line @typescript-eslint/ban-types\nfunction setProtoOf(obj, proto) {\n    // @ts-ignore __proto__ does not exist on obj\n    obj.__proto__ = proto;\n    return obj;\n}\n/**\n * setPrototypeOf polyfill using mixin\n */\n// eslint-disable-next-line @typescript-eslint/ban-types\nfunction mixinProperties(obj, proto) {\n    for (var prop in proto) {\n        if (!Object.prototype.hasOwnProperty.call(obj, prop)) {\n            // @ts-ignore typescript complains about indexing so we remove\n            obj[prop] = proto[prop];\n        }\n    }\n    return obj;\n}\n//# sourceMappingURL=polyfill.js.map","import { __extends } from \"tslib\";\nimport { setPrototypeOf } from './polyfill';\n/** An error emitted by Sentry SDKs and related utilities. */\nvar SentryError = /** @class */ (function (_super) {\n    __extends(SentryError, _super);\n    function SentryError(message) {\n        var _newTarget = this.constructor;\n        var _this = _super.call(this, message) || this;\n        _this.message = message;\n        _this.name = _newTarget.prototype.constructor.name;\n        setPrototypeOf(_this, _newTarget.prototype);\n        return _this;\n    }\n    return SentryError;\n}(Error));\nexport { SentryError };\n//# sourceMappingURL=error.js.map","import { __read } from \"tslib\";\nimport { isDebugBuild } from './env';\nimport { SentryError } from './error';\n/** Regular expression used to parse a Dsn. */\nvar DSN_REGEX = /^(?:(\\w+):)\\/\\/(?:(\\w+)(?::(\\w+))?@)([\\w.-]+)(?::(\\d+))?\\/(.+)/;\nfunction isValidProtocol(protocol) {\n    return protocol === 'http' || protocol === 'https';\n}\n/**\n * Renders the string representation of this Dsn.\n *\n * By default, this will render the public representation without the password\n * component. To get the deprecated private representation, set `withPassword`\n * to true.\n *\n * @param withPassword When set to true, the password will be included.\n */\nexport function dsnToString(dsn, withPassword) {\n    if (withPassword === void 0) { withPassword = false; }\n    var host = dsn.host, path = dsn.path, pass = dsn.pass, port = dsn.port, projectId = dsn.projectId, protocol = dsn.protocol, publicKey = dsn.publicKey;\n    return (protocol + \"://\" + publicKey + (withPassword && pass ? \":\" + pass : '') +\n        (\"@\" + host + (port ? \":\" + port : '') + \"/\" + (path ? path + \"/\" : path) + projectId));\n}\nfunction dsnFromString(str) {\n    var match = DSN_REGEX.exec(str);\n    if (!match) {\n        throw new SentryError(\"Invalid Sentry Dsn: \" + str);\n    }\n    var _a = __read(match.slice(1), 6), protocol = _a[0], publicKey = _a[1], _b = _a[2], pass = _b === void 0 ? '' : _b, host = _a[3], _c = _a[4], port = _c === void 0 ? '' : _c, lastPath = _a[5];\n    var path = '';\n    var projectId = lastPath;\n    var split = projectId.split('/');\n    if (split.length > 1) {\n        path = split.slice(0, -1).join('/');\n        projectId = split.pop();\n    }\n    if (projectId) {\n        var projectMatch = projectId.match(/^\\d+/);\n        if (projectMatch) {\n            projectId = projectMatch[0];\n        }\n    }\n    return dsnFromComponents({ host: host, pass: pass, path: path, projectId: projectId, port: port, protocol: protocol, publicKey: publicKey });\n}\nfunction dsnFromComponents(components) {\n    // TODO this is for backwards compatibility, and can be removed in a future version\n    if ('user' in components && !('publicKey' in components)) {\n        components.publicKey = components.user;\n    }\n    return {\n        user: components.publicKey || '',\n        protocol: components.protocol,\n        publicKey: components.publicKey || '',\n        pass: components.pass || '',\n        host: components.host,\n        port: components.port || '',\n        path: components.path || '',\n        projectId: components.projectId,\n    };\n}\nfunction validateDsn(dsn) {\n    if (!isDebugBuild()) {\n        return;\n    }\n    var port = dsn.port, projectId = dsn.projectId, protocol = dsn.protocol;\n    var requiredComponents = ['protocol', 'publicKey', 'host', 'projectId'];\n    requiredComponents.forEach(function (component) {\n        if (!dsn[component]) {\n            throw new SentryError(\"Invalid Sentry Dsn: \" + component + \" missing\");\n        }\n    });\n    if (!projectId.match(/^\\d+$/)) {\n        throw new SentryError(\"Invalid Sentry Dsn: Invalid projectId \" + projectId);\n    }\n    if (!isValidProtocol(protocol)) {\n        throw new SentryError(\"Invalid Sentry Dsn: Invalid protocol \" + protocol);\n    }\n    if (port && isNaN(parseInt(port, 10))) {\n        throw new SentryError(\"Invalid Sentry Dsn: Invalid port \" + port);\n    }\n    return true;\n}\n/** The Sentry Dsn, identifying a Sentry instance and project. */\nexport function makeDsn(from) {\n    var components = typeof from === 'string' ? dsnFromString(from) : dsnFromComponents(from);\n    validateDsn(components);\n    return components;\n}\n//# sourceMappingURL=dsn.js.map","export var SeverityLevels = ['fatal', 'error', 'warning', 'log', 'info', 'debug', 'critical'];\n//# sourceMappingURL=enums.js.map","import { getGlobalObject } from './global';\n// TODO: Implement different loggers for different environments\nvar global = getGlobalObject();\n/** Prefix for logging strings */\nvar PREFIX = 'Sentry Logger ';\n/**\n * Temporarily unwrap `console.log` and friends in order to perform the given callback using the original methods.\n * Restores wrapping after the callback completes.\n *\n * @param callback The function to run against the original `console` messages\n * @returns The results of the callback\n */\nexport function consoleSandbox(callback) {\n    var global = getGlobalObject();\n    var levels = ['debug', 'info', 'warn', 'error', 'log', 'assert'];\n    if (!('console' in global)) {\n        return callback();\n    }\n    // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n    var originalConsole = global.console;\n    var wrappedLevels = {};\n    // Restore all wrapped console methods\n    levels.forEach(function (level) {\n        // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n        if (level in global.console && originalConsole[level].__sentry_original__) {\n            wrappedLevels[level] = originalConsole[level];\n            originalConsole[level] = originalConsole[level].__sentry_original__;\n        }\n    });\n    // Perform callback manipulations\n    var result = callback();\n    // Revert restoration to wrapped state\n    Object.keys(wrappedLevels).forEach(function (level) {\n        originalConsole[level] = wrappedLevels[level];\n    });\n    return result;\n}\n/** JSDoc */\nvar Logger = /** @class */ (function () {\n    /** JSDoc */\n    function Logger() {\n        this._enabled = false;\n    }\n    /** JSDoc */\n    Logger.prototype.disable = function () {\n        this._enabled = false;\n    };\n    /** JSDoc */\n    Logger.prototype.enable = function () {\n        this._enabled = true;\n    };\n    /** JSDoc */\n    Logger.prototype.log = function () {\n        var args = [];\n        for (var _i = 0; _i < arguments.length; _i++) {\n            args[_i] = arguments[_i];\n        }\n        if (!this._enabled) {\n            return;\n        }\n        consoleSandbox(function () {\n            global.console.log(PREFIX + \"[Log]: \" + args.join(' '));\n        });\n    };\n    /** JSDoc */\n    Logger.prototype.warn = function () {\n        var args = [];\n        for (var _i = 0; _i < arguments.length; _i++) {\n            args[_i] = arguments[_i];\n        }\n        if (!this._enabled) {\n            return;\n        }\n        consoleSandbox(function () {\n            global.console.warn(PREFIX + \"[Warn]: \" + args.join(' '));\n        });\n    };\n    /** JSDoc */\n    Logger.prototype.error = function () {\n        var args = [];\n        for (var _i = 0; _i < arguments.length; _i++) {\n            args[_i] = arguments[_i];\n        }\n        if (!this._enabled) {\n            return;\n        }\n        consoleSandbox(function () {\n            global.console.error(PREFIX + \"[Error]: \" + args.join(' '));\n        });\n    };\n    return Logger;\n}());\n// Ensure we only have a single logger instance, even if multiple versions of @sentry/utils are being used\nglobal.__SENTRY__ = global.__SENTRY__ || {};\nvar logger = global.__SENTRY__.logger || (global.__SENTRY__.logger = new Logger());\nexport { logger };\n//# sourceMappingURL=logger.js.map","/* eslint-disable @typescript-eslint/no-unsafe-member-access */\n/* eslint-disable @typescript-eslint/no-explicit-any */\n/**\n * Helper to decycle json objects\n */\nexport function memoBuilder() {\n    var hasWeakSet = typeof WeakSet === 'function';\n    var inner = hasWeakSet ? new WeakSet() : [];\n    function memoize(obj) {\n        if (hasWeakSet) {\n            if (inner.has(obj)) {\n                return true;\n            }\n            inner.add(obj);\n            return false;\n        }\n        // eslint-disable-next-line @typescript-eslint/prefer-for-of\n        for (var i = 0; i < inner.length; i++) {\n            var value = inner[i];\n            if (value === obj) {\n                return true;\n            }\n        }\n        inner.push(obj);\n        return false;\n    }\n    function unmemoize(obj) {\n        if (hasWeakSet) {\n            inner.delete(obj);\n        }\n        else {\n            for (var i = 0; i < inner.length; i++) {\n                if (inner[i] === obj) {\n                    inner.splice(i, 1);\n                    break;\n                }\n            }\n        }\n    }\n    return [memoize, unmemoize];\n}\n//# sourceMappingURL=memo.js.map","import { __assign, __values } from \"tslib\";\nvar STACKTRACE_LIMIT = 50;\n/**\n * Creates a stack parser with the supplied line parsers\n *\n * StackFrames are returned in the correct order for Sentry Exception\n * frames and with Sentry SDK internal frames removed from the top and bottom\n *\n * */\nexport function createStackParser() {\n    var parsers = [];\n    for (var _i = 0; _i < arguments.length; _i++) {\n        parsers[_i] = arguments[_i];\n    }\n    return function (stack, skipFirst) {\n        var e_1, _a, e_2, _b;\n        if (skipFirst === void 0) { skipFirst = 0; }\n        var frames = [];\n        try {\n            for (var _c = __values(stack.split('\\n').slice(skipFirst)), _d = _c.next(); !_d.done; _d = _c.next()) {\n                var line = _d.value;\n                try {\n                    for (var parsers_1 = (e_2 = void 0, __values(parsers)), parsers_1_1 = parsers_1.next(); !parsers_1_1.done; parsers_1_1 = parsers_1.next()) {\n                        var parser = parsers_1_1.value;\n                        var frame = parser(line);\n                        if (frame) {\n                            frames.push(frame);\n                            break;\n                        }\n                    }\n                }\n                catch (e_2_1) { e_2 = { error: e_2_1 }; }\n                finally {\n                    try {\n                        if (parsers_1_1 && !parsers_1_1.done && (_b = parsers_1.return)) _b.call(parsers_1);\n                    }\n                    finally { if (e_2) throw e_2.error; }\n                }\n            }\n        }\n        catch (e_1_1) { e_1 = { error: e_1_1 }; }\n        finally {\n            try {\n                if (_d && !_d.done && (_a = _c.return)) _a.call(_c);\n            }\n            finally { if (e_1) throw e_1.error; }\n        }\n        return stripSentryFramesAndReverse(frames);\n    };\n}\n/**\n * @hidden\n */\nexport function stripSentryFramesAndReverse(stack) {\n    if (!stack.length) {\n        return [];\n    }\n    var localStack = stack;\n    var firstFrameFunction = localStack[0].function || '';\n    var lastFrameFunction = localStack[localStack.length - 1].function || '';\n    // If stack starts with one of our API calls, remove it (starts, meaning it's the top of the stack - aka last call)\n    if (firstFrameFunction.indexOf('captureMessage') !== -1 || firstFrameFunction.indexOf('captureException') !== -1) {\n        localStack = localStack.slice(1);\n    }\n    // If stack ends with one of our internal API calls, remove it (ends, meaning it's the bottom of the stack - aka top-most call)\n    if (lastFrameFunction.indexOf('sentryWrapped') !== -1) {\n        localStack = localStack.slice(0, -1);\n    }\n    // The frame where the crash happened, should be the last entry in the array\n    return localStack\n        .slice(0, STACKTRACE_LIMIT)\n        .map(function (frame) { return (__assign(__assign({}, frame), { filename: frame.filename || localStack[0].filename, function: frame.function || '?' })); })\n        .reverse();\n}\nvar defaultFunctionName = '<anonymous>';\n/**\n * Safely extract function name from itself\n */\nexport function getFunctionName(fn) {\n    try {\n        if (!fn || typeof fn !== 'function') {\n            return defaultFunctionName;\n        }\n        return fn.name || defaultFunctionName;\n    }\n    catch (e) {\n        // Just accessing custom props in some Selenium environments\n        // can cause a \"Permission denied\" exception (see raven-js#495).\n        return defaultFunctionName;\n    }\n}\n//# sourceMappingURL=stacktrace.js.map","import { isRegExp, isString } from './is';\n/**\n * Truncates given string to the maximum characters count\n *\n * @param str An object that contains serializable values\n * @param max Maximum number of characters in truncated string (0 = unlimited)\n * @returns string Encoded\n */\nexport function truncate(str, max) {\n    if (max === void 0) { max = 0; }\n    if (typeof str !== 'string' || max === 0) {\n        return str;\n    }\n    return str.length <= max ? str : str.substr(0, max) + \"...\";\n}\n/**\n * This is basically just `trim_line` from\n * https://github.com/getsentry/sentry/blob/master/src/sentry/lang/javascript/processor.py#L67\n *\n * @param str An object that contains serializable values\n * @param max Maximum number of characters in truncated string\n * @returns string Encoded\n */\nexport function snipLine(line, colno) {\n    var newLine = line;\n    var lineLength = newLine.length;\n    if (lineLength <= 150) {\n        return newLine;\n    }\n    if (colno > lineLength) {\n        // eslint-disable-next-line no-param-reassign\n        colno = lineLength;\n    }\n    var start = Math.max(colno - 60, 0);\n    if (start < 5) {\n        start = 0;\n    }\n    var end = Math.min(start + 140, lineLength);\n    if (end > lineLength - 5) {\n        end = lineLength;\n    }\n    if (end === lineLength) {\n        start = Math.max(end - 140, 0);\n    }\n    newLine = newLine.slice(start, end);\n    if (start > 0) {\n        newLine = \"'{snip} \" + newLine;\n    }\n    if (end < lineLength) {\n        newLine += ' {snip}';\n    }\n    return newLine;\n}\n/**\n * Join values in array\n * @param input array of values to be joined together\n * @param delimiter string to be placed in-between values\n * @returns Joined values\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function safeJoin(input, delimiter) {\n    if (!Array.isArray(input)) {\n        return '';\n    }\n    var output = [];\n    // eslint-disable-next-line @typescript-eslint/prefer-for-of\n    for (var i = 0; i < input.length; i++) {\n        var value = input[i];\n        try {\n            output.push(String(value));\n        }\n        catch (e) {\n            output.push('[value cannot be serialized]');\n        }\n    }\n    return output.join(delimiter);\n}\n/**\n * Checks if the value matches a regex or includes the string\n * @param value The string value to be checked against\n * @param pattern Either a regex or a string that must be contained in value\n */\nexport function isMatchingPattern(value, pattern) {\n    if (!isString(value)) {\n        return false;\n    }\n    if (isRegExp(pattern)) {\n        return pattern.test(value);\n    }\n    if (typeof pattern === 'string') {\n        return value.indexOf(pattern) !== -1;\n    }\n    return false;\n}\n/**\n * Given a string, escape characters which have meaning in the regex grammar, such that the result is safe to feed to\n * `new RegExp()`.\n *\n * Based on https://github.com/sindresorhus/escape-string-regexp. Vendored to a) reduce the size by skipping the runtime\n * type-checking, and b) ensure it gets down-compiled for old versions of Node (the published package only supports Node\n * 12+).\n *\n * @param regexString The string to escape\n * @returns An version of the string with all special regex characters escaped\n */\nexport function escapeStringForRegex(regexString) {\n    // escape the hyphen separately so we can also replace it with a unicode literal hyphen, to avoid the problems\n    // discussed in https://github.com/sindresorhus/escape-string-regexp/issues/20.\n    return regexString.replace(/[|\\\\{}()[\\]^$+*?.]/g, '\\\\$&').replace(/-/g, '\\\\x2d');\n}\n//# sourceMappingURL=string.js.map","import { __values } from \"tslib\";\nimport { htmlTreeAsString } from './browser';\nimport { isElement, isError, isEvent, isInstanceOf, isPlainObject, isPrimitive, isSyntheticEvent } from './is';\nimport { memoBuilder } from './memo';\nimport { getFunctionName } from './stacktrace';\nimport { truncate } from './string';\n/**\n * Replace a method in an object with a wrapped version of itself.\n *\n * @param source An object that contains a method to be wrapped.\n * @param name The name of the method to be wrapped.\n * @param replacementFactory A higher-order function that takes the original version of the given method and returns a\n * wrapped version. Note: The function returned by `replacementFactory` needs to be a non-arrow function, in order to\n * preserve the correct value of `this`, and the original method must be called using `origMethod.call(this, <other\n * args>)` or `origMethod.apply(this, [<other args>])` (rather than being called directly), again to preserve `this`.\n * @returns void\n */\nexport function fill(source, name, replacementFactory) {\n    if (!(name in source)) {\n        return;\n    }\n    var original = source[name];\n    var wrapped = replacementFactory(original);\n    // Make sure it's a function first, as we need to attach an empty prototype for `defineProperties` to work\n    // otherwise it'll throw \"TypeError: Object.defineProperties called on non-object\"\n    if (typeof wrapped === 'function') {\n        try {\n            markFunctionWrapped(wrapped, original);\n        }\n        catch (_Oo) {\n            // This can throw if multiple fill happens on a global object like XMLHttpRequest\n            // Fixes https://github.com/getsentry/sentry-javascript/issues/2043\n        }\n    }\n    source[name] = wrapped;\n}\n/**\n * Defines a non-enumerable property on the given object.\n *\n * @param obj The object on which to set the property\n * @param name The name of the property to be set\n * @param value The value to which to set the property\n */\nexport function addNonEnumerableProperty(obj, name, value) {\n    Object.defineProperty(obj, name, {\n        // enumerable: false, // the default, so we can save on bundle size by not explicitly setting it\n        value: value,\n        writable: true,\n        configurable: true,\n    });\n}\n/**\n * Remembers the original function on the wrapped function and\n * patches up the prototype.\n *\n * @param wrapped the wrapper function\n * @param original the original function that gets wrapped\n */\nexport function markFunctionWrapped(wrapped, original) {\n    var proto = original.prototype || {};\n    wrapped.prototype = original.prototype = proto;\n    addNonEnumerableProperty(wrapped, '__sentry_original__', original);\n}\n/**\n * This extracts the original function if available.  See\n * `markFunctionWrapped` for more information.\n *\n * @param func the function to unwrap\n * @returns the unwrapped version of the function if available.\n */\nexport function getOriginalFunction(func) {\n    return func.__sentry_original__;\n}\n/**\n * Encodes given object into url-friendly format\n *\n * @param object An object that contains serializable values\n * @returns string Encoded\n */\nexport function urlEncode(object) {\n    return Object.keys(object)\n        .map(function (key) { return encodeURIComponent(key) + \"=\" + encodeURIComponent(object[key]); })\n        .join('&');\n}\n/**\n * Transforms any object into an object literal with all its attributes\n * attached to it.\n *\n * @param value Initial source that we have to transform in order for it to be usable by the serializer\n */\nfunction getWalkSource(value) {\n    if (isError(value)) {\n        var error = value;\n        var err = {\n            message: error.message,\n            name: error.name,\n            stack: error.stack,\n        };\n        for (var i in error) {\n            if (Object.prototype.hasOwnProperty.call(error, i)) {\n                err[i] = error[i];\n            }\n        }\n        return err;\n    }\n    if (isEvent(value)) {\n        var event_1 = value;\n        var source = {};\n        // Accessing event attributes can throw (see https://github.com/getsentry/sentry-javascript/issues/768 and\n        // https://github.com/getsentry/sentry-javascript/issues/838), but accessing `type` hasn't been wrapped in a\n        // try-catch in at least two years and no one's complained, so that's likely not an issue anymore\n        source.type = event_1.type;\n        try {\n            source.target = isElement(event_1.target)\n                ? htmlTreeAsString(event_1.target)\n                : Object.prototype.toString.call(event_1.target);\n        }\n        catch (_oO) {\n            source.target = '<unknown>';\n        }\n        try {\n            source.currentTarget = isElement(event_1.currentTarget)\n                ? htmlTreeAsString(event_1.currentTarget)\n                : Object.prototype.toString.call(event_1.currentTarget);\n        }\n        catch (_oO) {\n            source.currentTarget = '<unknown>';\n        }\n        if (typeof CustomEvent !== 'undefined' && isInstanceOf(value, CustomEvent)) {\n            source.detail = event_1.detail;\n        }\n        for (var attr in event_1) {\n            if (Object.prototype.hasOwnProperty.call(event_1, attr)) {\n                source[attr] = event_1[attr];\n            }\n        }\n        return source;\n    }\n    return value;\n}\n/** Calculates bytes size of input string */\nfunction utf8Length(value) {\n    // eslint-disable-next-line no-bitwise\n    return ~-encodeURI(value).split(/%..|./).length;\n}\n/** Calculates bytes size of input object */\nfunction jsonSize(value) {\n    return utf8Length(JSON.stringify(value));\n}\n/** JSDoc */\nexport function normalizeToSize(object, \n// Default Node.js REPL depth\ndepth, \n// 100kB, as 200kB is max payload size, so half sounds reasonable\nmaxSize) {\n    if (depth === void 0) { depth = 3; }\n    if (maxSize === void 0) { maxSize = 100 * 1024; }\n    var serialized = normalize(object, depth);\n    if (jsonSize(serialized) > maxSize) {\n        return normalizeToSize(object, depth - 1, maxSize);\n    }\n    return serialized;\n}\n/**\n * Transform any non-primitive, BigInt, or Symbol-type value into a string. Acts as a no-op on strings, numbers,\n * booleans, null, and undefined.\n *\n * @param value The value to stringify\n * @returns For non-primitive, BigInt, and Symbol-type values, a string denoting the value's type, type and value, or\n *  type and `description` property, respectively. For non-BigInt, non-Symbol primitives, returns the original value,\n *  unchanged.\n */\nfunction serializeValue(value) {\n    // Node.js REPL notation\n    if (typeof value === 'string') {\n        return value;\n    }\n    var type = Object.prototype.toString.call(value);\n    if (type === '[object Object]') {\n        return '[Object]';\n    }\n    if (type === '[object Array]') {\n        return '[Array]';\n    }\n    var normalized = normalizeValue(value);\n    return isPrimitive(normalized) ? normalized : type;\n}\n/**\n * normalizeValue()\n *\n * Takes unserializable input and make it serializable friendly\n *\n * - translates undefined/NaN values to \"[undefined]\"/\"[NaN]\" respectively,\n * - serializes Error objects\n * - filter global objects\n */\nfunction normalizeValue(value, key) {\n    if (key === 'domain' && value && typeof value === 'object' && value._events) {\n        return '[Domain]';\n    }\n    if (key === 'domainEmitter') {\n        return '[DomainEmitter]';\n    }\n    if (typeof global !== 'undefined' && value === global) {\n        return '[Global]';\n    }\n    // It's safe to use `window` and `document` here in this manner, as we are asserting using `typeof` first\n    // which won't throw if they are not present.\n    // eslint-disable-next-line no-restricted-globals\n    if (typeof window !== 'undefined' && value === window) {\n        return '[Window]';\n    }\n    // eslint-disable-next-line no-restricted-globals\n    if (typeof document !== 'undefined' && value === document) {\n        return '[Document]';\n    }\n    // React's SyntheticEvent thingy\n    if (isSyntheticEvent(value)) {\n        return '[SyntheticEvent]';\n    }\n    if (typeof value === 'number' && value !== value) {\n        return '[NaN]';\n    }\n    if (value === void 0) {\n        return '[undefined]';\n    }\n    if (typeof value === 'function') {\n        return \"[Function: \" + getFunctionName(value) + \"]\";\n    }\n    // symbols and bigints are considered primitives by TS, but aren't natively JSON-serilaizable\n    if (typeof value === 'symbol') {\n        return \"[\" + String(value) + \"]\";\n    }\n    if (typeof value === 'bigint') {\n        return \"[BigInt: \" + String(value) + \"]\";\n    }\n    return value;\n}\n/**\n * Walks an object to perform a normalization on it\n *\n * @param key of object that's walked in current iteration\n * @param value object to be walked\n * @param depth Optional number indicating how deep should walking be performed\n * @param memo Optional Memo class handling decycling\n */\n// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types\nexport function walk(key, value, depth, memo) {\n    if (depth === void 0) { depth = +Infinity; }\n    if (memo === void 0) { memo = memoBuilder(); }\n    // If we reach the maximum depth, serialize whatever is left\n    if (depth === 0) {\n        return serializeValue(value);\n    }\n    /* eslint-disable @typescript-eslint/no-unsafe-member-access */\n    // If value implements `toJSON` method, call it and return early\n    if (value !== null && value !== undefined && typeof value.toJSON === 'function') {\n        return value.toJSON();\n    }\n    /* eslint-enable @typescript-eslint/no-unsafe-member-access */\n    // If normalized value is a primitive, there are no branches left to walk, so bail out\n    var normalized = normalizeValue(value, key);\n    if (isPrimitive(normalized)) {\n        return normalized;\n    }\n    // Create source that we will use for the next iteration. It will either be an objectified error object (`Error` type\n    // with extracted key:value pairs) or the input itself.\n    var source = getWalkSource(value);\n    // Create an accumulator that will act as a parent for all future itterations of that branch\n    var acc = Array.isArray(value) ? [] : {};\n    // If we already walked that branch, bail out, as it's circular reference\n    if (memo[0](value)) {\n        return '[Circular ~]';\n    }\n    // Walk all keys of the source\n    for (var innerKey in source) {\n        // Avoid iterating over fields in the prototype if they've somehow been exposed to enumeration.\n        if (!Object.prototype.hasOwnProperty.call(source, innerKey)) {\n            continue;\n        }\n        // Recursively walk through all the child nodes\n        acc[innerKey] = walk(innerKey, source[innerKey], depth - 1, memo);\n    }\n    // Once walked through all the branches, remove the parent from memo storage\n    memo[1](value);\n    // Return accumulated values\n    return acc;\n}\n/**\n * normalize()\n *\n * - Creates a copy to prevent original input mutation\n * - Skip non-enumerablers\n * - Calls `toJSON` if implemented\n * - Removes circular references\n * - Translates non-serializeable values (undefined/NaN/Functions) to serializable format\n * - Translates known global objects/Classes to a string representations\n * - Takes care of Error objects serialization\n * - Optionally limit depth of final output\n */\n// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types\nexport function normalize(input, depth) {\n    try {\n        return JSON.parse(JSON.stringify(input, function (key, value) { return walk(key, value, depth); }));\n    }\n    catch (_oO) {\n        return '**non-serializable**';\n    }\n}\n/**\n * Given any captured exception, extract its keys and create a sorted\n * and truncated list that will be used inside the event message.\n * eg. `Non-error exception captured with keys: foo, bar, baz`\n */\n// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types\nexport function extractExceptionKeysForMessage(exception, maxLength) {\n    if (maxLength === void 0) { maxLength = 40; }\n    var keys = Object.keys(getWalkSource(exception));\n    keys.sort();\n    if (!keys.length) {\n        return '[object has no keys]';\n    }\n    if (keys[0].length >= maxLength) {\n        return truncate(keys[0], maxLength);\n    }\n    for (var includedKeys = keys.length; includedKeys > 0; includedKeys--) {\n        var serialized = keys.slice(0, includedKeys).join(', ');\n        if (serialized.length > maxLength) {\n            continue;\n        }\n        if (includedKeys === keys.length) {\n            return serialized;\n        }\n        return truncate(serialized, maxLength);\n    }\n    return '';\n}\n/**\n * Given any object, return the new object with removed keys that value was `undefined`.\n * Works recursively on objects and arrays.\n */\nexport function dropUndefinedKeys(val) {\n    var e_1, _a;\n    if (isPlainObject(val)) {\n        var obj = val;\n        var rv = {};\n        try {\n            for (var _b = __values(Object.keys(obj)), _c = _b.next(); !_c.done; _c = _b.next()) {\n                var key = _c.value;\n                if (typeof obj[key] !== 'undefined') {\n                    rv[key] = dropUndefinedKeys(obj[key]);\n                }\n            }\n        }\n        catch (e_1_1) { e_1 = { error: e_1_1 }; }\n        finally {\n            try {\n                if (_c && !_c.done && (_a = _b.return)) _a.call(_b);\n            }\n            finally { if (e_1) throw e_1.error; }\n        }\n        return rv;\n    }\n    if (Array.isArray(val)) {\n        return val.map(dropUndefinedKeys);\n    }\n    return val;\n}\n/**\n * Ensure that something is an object.\n *\n * Turns `undefined` and `null` into `String`s and all other primitives into instances of their respective wrapper\n * classes (String, Boolean, Number, etc.). Acts as the identity function on non-primitives.\n *\n * @param wat The subject of the objectification\n * @returns A version of `wat` which can safely be used with `Object` class methods\n */\nexport function objectify(wat) {\n    var objectified;\n    switch (true) {\n        case wat === undefined || wat === null:\n            objectified = new String(wat);\n            break;\n        // Though symbols and bigints do have wrapper classes (`Symbol` and `BigInt`, respectively), for whatever reason\n        // those classes don't have constructors which can be used with the `new` keyword. We therefore need to cast each as\n        // an object in order to wrap it.\n        case typeof wat === 'symbol' || typeof wat === 'bigint':\n            objectified = Object(wat);\n            break;\n        // this will catch the remaining primitives: `String`, `Number`, and `Boolean`\n        case isPrimitive(wat):\n            // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n            objectified = new wat.constructor(wat);\n            break;\n        // by process of elimination, at this point we know that `wat` must already be an object\n        default:\n            objectified = wat;\n            break;\n    }\n    return objectified;\n}\n//# sourceMappingURL=object.js.map","import { isDebugBuild } from './env';\nimport { getGlobalObject } from './global';\nimport { logger } from './logger';\n/**\n * Tells whether current environment supports ErrorEvent objects\n * {@link supportsErrorEvent}.\n *\n * @returns Answer to the given question.\n */\nexport function supportsErrorEvent() {\n    try {\n        new ErrorEvent('');\n        return true;\n    }\n    catch (e) {\n        return false;\n    }\n}\n/**\n * Tells whether current environment supports DOMError objects\n * {@link supportsDOMError}.\n *\n * @returns Answer to the given question.\n */\nexport function supportsDOMError() {\n    try {\n        // Chrome: VM89:1 Uncaught TypeError: Failed to construct 'DOMError':\n        // 1 argument required, but only 0 present.\n        // @ts-ignore It really needs 1 argument, not 0.\n        new DOMError('');\n        return true;\n    }\n    catch (e) {\n        return false;\n    }\n}\n/**\n * Tells whether current environment supports DOMException objects\n * {@link supportsDOMException}.\n *\n * @returns Answer to the given question.\n */\nexport function supportsDOMException() {\n    try {\n        new DOMException('');\n        return true;\n    }\n    catch (e) {\n        return false;\n    }\n}\n/**\n * Tells whether current environment supports Fetch API\n * {@link supportsFetch}.\n *\n * @returns Answer to the given question.\n */\nexport function supportsFetch() {\n    if (!('fetch' in getGlobalObject())) {\n        return false;\n    }\n    try {\n        new Headers();\n        new Request('');\n        new Response();\n        return true;\n    }\n    catch (e) {\n        return false;\n    }\n}\n/**\n * isNativeFetch checks if the given function is a native implementation of fetch()\n */\n// eslint-disable-next-line @typescript-eslint/ban-types\nexport function isNativeFetch(func) {\n    return func && /^function fetch\\(\\)\\s+\\{\\s+\\[native code\\]\\s+\\}$/.test(func.toString());\n}\n/**\n * Tells whether current environment supports Fetch API natively\n * {@link supportsNativeFetch}.\n *\n * @returns true if `window.fetch` is natively implemented, false otherwise\n */\nexport function supportsNativeFetch() {\n    if (!supportsFetch()) {\n        return false;\n    }\n    var global = getGlobalObject();\n    // Fast path to avoid DOM I/O\n    // eslint-disable-next-line @typescript-eslint/unbound-method\n    if (isNativeFetch(global.fetch)) {\n        return true;\n    }\n    // window.fetch is implemented, but is polyfilled or already wrapped (e.g: by a chrome extension)\n    // so create a \"pure\" iframe to see if that has native fetch\n    var result = false;\n    var doc = global.document;\n    // eslint-disable-next-line deprecation/deprecation\n    if (doc && typeof doc.createElement === \"function\") {\n        try {\n            var sandbox = doc.createElement('iframe');\n            sandbox.hidden = true;\n            doc.head.appendChild(sandbox);\n            if (sandbox.contentWindow && sandbox.contentWindow.fetch) {\n                // eslint-disable-next-line @typescript-eslint/unbound-method\n                result = isNativeFetch(sandbox.contentWindow.fetch);\n            }\n            doc.head.removeChild(sandbox);\n        }\n        catch (err) {\n            if (isDebugBuild()) {\n                logger.warn('Could not create sandbox iframe for pure fetch check, bailing to window.fetch: ', err);\n            }\n        }\n    }\n    return result;\n}\n/**\n * Tells whether current environment supports ReportingObserver API\n * {@link supportsReportingObserver}.\n *\n * @returns Answer to the given question.\n */\nexport function supportsReportingObserver() {\n    return 'ReportingObserver' in getGlobalObject();\n}\n/**\n * Tells whether current environment supports Referrer Policy API\n * {@link supportsReferrerPolicy}.\n *\n * @returns Answer to the given question.\n */\nexport function supportsReferrerPolicy() {\n    // Despite all stars in the sky saying that Edge supports old draft syntax, aka 'never', 'always', 'origin' and 'default'\n    // (see https://caniuse.com/#feat=referrer-policy),\n    // it doesn't. And it throws an exception instead of ignoring this parameter...\n    // REF: https://github.com/getsentry/raven-js/issues/1233\n    if (!supportsFetch()) {\n        return false;\n    }\n    try {\n        new Request('_', {\n            referrerPolicy: 'origin',\n        });\n        return true;\n    }\n    catch (e) {\n        return false;\n    }\n}\n/**\n * Tells whether current environment supports History API\n * {@link supportsHistory}.\n *\n * @returns Answer to the given question.\n */\nexport function supportsHistory() {\n    // NOTE: in Chrome App environment, touching history.pushState, *even inside\n    //       a try/catch block*, will cause Chrome to output an error to console.error\n    // borrowed from: https://github.com/angular/angular.js/pull/13945/files\n    var global = getGlobalObject();\n    /* eslint-disable @typescript-eslint/no-unsafe-member-access */\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    var chrome = global.chrome;\n    var isChromePackagedApp = chrome && chrome.app && chrome.app.runtime;\n    /* eslint-enable @typescript-eslint/no-unsafe-member-access */\n    var hasHistoryApi = 'history' in global && !!global.history.pushState && !!global.history.replaceState;\n    return !isChromePackagedApp && hasHistoryApi;\n}\n//# sourceMappingURL=supports.js.map","import { __assign, __values } from \"tslib\";\nimport { isDebugBuild } from './env';\nimport { getGlobalObject } from './global';\nimport { isInstanceOf, isString } from './is';\nimport { logger } from './logger';\nimport { fill } from './object';\nimport { getFunctionName } from './stacktrace';\nimport { supportsHistory, supportsNativeFetch } from './supports';\nvar global = getGlobalObject();\n/**\n * Instrument native APIs to call handlers that can be used to create breadcrumbs, APM spans etc.\n *  - Console API\n *  - Fetch API\n *  - XHR API\n *  - History API\n *  - DOM API (click/typing)\n *  - Error API\n *  - UnhandledRejection API\n */\nvar handlers = {};\nvar instrumented = {};\n/** Instruments given API */\nfunction instrument(type) {\n    if (instrumented[type]) {\n        return;\n    }\n    instrumented[type] = true;\n    switch (type) {\n        case 'console':\n            instrumentConsole();\n            break;\n        case 'dom':\n            instrumentDOM();\n            break;\n        case 'xhr':\n            instrumentXHR();\n            break;\n        case 'fetch':\n            instrumentFetch();\n            break;\n        case 'history':\n            instrumentHistory();\n            break;\n        case 'error':\n            instrumentError();\n            break;\n        case 'unhandledrejection':\n            instrumentUnhandledRejection();\n            break;\n        default:\n            logger.warn('unknown instrumentation type:', type);\n    }\n}\n/**\n * Add handler that will be called when given type of instrumentation triggers.\n * Use at your own risk, this might break without changelog notice, only used internally.\n * @hidden\n */\nexport function addInstrumentationHandler(type, callback) {\n    handlers[type] = handlers[type] || [];\n    handlers[type].push(callback);\n    instrument(type);\n}\n/** JSDoc */\nfunction triggerHandlers(type, data) {\n    var e_1, _a;\n    if (!type || !handlers[type]) {\n        return;\n    }\n    try {\n        for (var _b = __values(handlers[type] || []), _c = _b.next(); !_c.done; _c = _b.next()) {\n            var handler = _c.value;\n            try {\n                handler(data);\n            }\n            catch (e) {\n                if (isDebugBuild()) {\n                    logger.error(\"Error while triggering instrumentation handler.\\nType: \" + type + \"\\nName: \" + getFunctionName(handler) + \"\\nError: \" + e);\n                }\n            }\n        }\n    }\n    catch (e_1_1) { e_1 = { error: e_1_1 }; }\n    finally {\n        try {\n            if (_c && !_c.done && (_a = _b.return)) _a.call(_b);\n        }\n        finally { if (e_1) throw e_1.error; }\n    }\n}\n/** JSDoc */\nfunction instrumentConsole() {\n    if (!('console' in global)) {\n        return;\n    }\n    ['debug', 'info', 'warn', 'error', 'log', 'assert'].forEach(function (level) {\n        if (!(level in global.console)) {\n            return;\n        }\n        fill(global.console, level, function (originalConsoleMethod) {\n            return function () {\n                var args = [];\n                for (var _i = 0; _i < arguments.length; _i++) {\n                    args[_i] = arguments[_i];\n                }\n                triggerHandlers('console', { args: args, level: level });\n                // this fails for some browsers. :(\n                if (originalConsoleMethod) {\n                    originalConsoleMethod.apply(global.console, args);\n                }\n            };\n        });\n    });\n}\n/** JSDoc */\nfunction instrumentFetch() {\n    if (!supportsNativeFetch()) {\n        return;\n    }\n    fill(global, 'fetch', function (originalFetch) {\n        return function () {\n            var args = [];\n            for (var _i = 0; _i < arguments.length; _i++) {\n                args[_i] = arguments[_i];\n            }\n            var handlerData = {\n                args: args,\n                fetchData: {\n                    method: getFetchMethod(args),\n                    url: getFetchUrl(args),\n                },\n                startTimestamp: Date.now(),\n            };\n            triggerHandlers('fetch', __assign({}, handlerData));\n            // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n            return originalFetch.apply(global, args).then(function (response) {\n                triggerHandlers('fetch', __assign(__assign({}, handlerData), { endTimestamp: Date.now(), response: response }));\n                return response;\n            }, function (error) {\n                triggerHandlers('fetch', __assign(__assign({}, handlerData), { endTimestamp: Date.now(), error: error }));\n                // NOTE: If you are a Sentry user, and you are seeing this stack frame,\n                //       it means the sentry.javascript SDK caught an error invoking your application code.\n                //       This is expected behavior and NOT indicative of a bug with sentry.javascript.\n                throw error;\n            });\n        };\n    });\n}\n/* eslint-disable @typescript-eslint/no-unsafe-member-access */\n/** Extract `method` from fetch call arguments */\nfunction getFetchMethod(fetchArgs) {\n    if (fetchArgs === void 0) { fetchArgs = []; }\n    if ('Request' in global && isInstanceOf(fetchArgs[0], Request) && fetchArgs[0].method) {\n        return String(fetchArgs[0].method).toUpperCase();\n    }\n    if (fetchArgs[1] && fetchArgs[1].method) {\n        return String(fetchArgs[1].method).toUpperCase();\n    }\n    return 'GET';\n}\n/** Extract `url` from fetch call arguments */\nfunction getFetchUrl(fetchArgs) {\n    if (fetchArgs === void 0) { fetchArgs = []; }\n    if (typeof fetchArgs[0] === 'string') {\n        return fetchArgs[0];\n    }\n    if ('Request' in global && isInstanceOf(fetchArgs[0], Request)) {\n        return fetchArgs[0].url;\n    }\n    return String(fetchArgs[0]);\n}\n/* eslint-enable @typescript-eslint/no-unsafe-member-access */\n/** JSDoc */\nfunction instrumentXHR() {\n    if (!('XMLHttpRequest' in global)) {\n        return;\n    }\n    var xhrproto = XMLHttpRequest.prototype;\n    fill(xhrproto, 'open', function (originalOpen) {\n        return function () {\n            var args = [];\n            for (var _i = 0; _i < arguments.length; _i++) {\n                args[_i] = arguments[_i];\n            }\n            // eslint-disable-next-line @typescript-eslint/no-this-alias\n            var xhr = this;\n            var url = args[1];\n            var xhrInfo = (xhr.__sentry_xhr__ = {\n                // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n                method: isString(args[0]) ? args[0].toUpperCase() : args[0],\n                url: args[1],\n            });\n            // if Sentry key appears in URL, don't capture it as a request\n            // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n            if (isString(url) && xhrInfo.method === 'POST' && url.match(/sentry_key/)) {\n                xhr.__sentry_own_request__ = true;\n            }\n            var onreadystatechangeHandler = function () {\n                if (xhr.readyState === 4) {\n                    try {\n                        // touching statusCode in some platforms throws\n                        // an exception\n                        xhrInfo.status_code = xhr.status;\n                    }\n                    catch (e) {\n                        /* do nothing */\n                    }\n                    triggerHandlers('xhr', {\n                        args: args,\n                        endTimestamp: Date.now(),\n                        startTimestamp: Date.now(),\n                        xhr: xhr,\n                    });\n                }\n            };\n            if ('onreadystatechange' in xhr && typeof xhr.onreadystatechange === 'function') {\n                fill(xhr, 'onreadystatechange', function (original) {\n                    return function () {\n                        var readyStateArgs = [];\n                        for (var _i = 0; _i < arguments.length; _i++) {\n                            readyStateArgs[_i] = arguments[_i];\n                        }\n                        onreadystatechangeHandler();\n                        return original.apply(xhr, readyStateArgs);\n                    };\n                });\n            }\n            else {\n                xhr.addEventListener('readystatechange', onreadystatechangeHandler);\n            }\n            return originalOpen.apply(xhr, args);\n        };\n    });\n    fill(xhrproto, 'send', function (originalSend) {\n        return function () {\n            var args = [];\n            for (var _i = 0; _i < arguments.length; _i++) {\n                args[_i] = arguments[_i];\n            }\n            if (this.__sentry_xhr__ && args[0] !== undefined) {\n                this.__sentry_xhr__.body = args[0];\n            }\n            triggerHandlers('xhr', {\n                args: args,\n                startTimestamp: Date.now(),\n                xhr: this,\n            });\n            return originalSend.apply(this, args);\n        };\n    });\n}\nvar lastHref;\n/** JSDoc */\nfunction instrumentHistory() {\n    if (!supportsHistory()) {\n        return;\n    }\n    var oldOnPopState = global.onpopstate;\n    global.onpopstate = function () {\n        var args = [];\n        for (var _i = 0; _i < arguments.length; _i++) {\n            args[_i] = arguments[_i];\n        }\n        var to = global.location.href;\n        // keep track of the current URL state, as we always receive only the updated state\n        var from = lastHref;\n        lastHref = to;\n        triggerHandlers('history', {\n            from: from,\n            to: to,\n        });\n        if (oldOnPopState) {\n            // Apparently this can throw in Firefox when incorrectly implemented plugin is installed.\n            // https://github.com/getsentry/sentry-javascript/issues/3344\n            // https://github.com/bugsnag/bugsnag-js/issues/469\n            try {\n                return oldOnPopState.apply(this, args);\n            }\n            catch (_oO) {\n                // no-empty\n            }\n        }\n    };\n    /** @hidden */\n    function historyReplacementFunction(originalHistoryFunction) {\n        return function () {\n            var args = [];\n            for (var _i = 0; _i < arguments.length; _i++) {\n                args[_i] = arguments[_i];\n            }\n            var url = args.length > 2 ? args[2] : undefined;\n            if (url) {\n                // coerce to string (this is what pushState does)\n                var from = lastHref;\n                var to = String(url);\n                // keep track of the current URL state, as we always receive only the updated state\n                lastHref = to;\n                triggerHandlers('history', {\n                    from: from,\n                    to: to,\n                });\n            }\n            return originalHistoryFunction.apply(this, args);\n        };\n    }\n    fill(global.history, 'pushState', historyReplacementFunction);\n    fill(global.history, 'replaceState', historyReplacementFunction);\n}\nvar debounceDuration = 1000;\nvar debounceTimerID;\nvar lastCapturedEvent;\n/**\n * Decide whether the current event should finish the debounce of previously captured one.\n * @param previous previously captured event\n * @param current event to be captured\n */\nfunction shouldShortcircuitPreviousDebounce(previous, current) {\n    // If there was no previous event, it should always be swapped for the new one.\n    if (!previous) {\n        return true;\n    }\n    // If both events have different type, then user definitely performed two separate actions. e.g. click + keypress.\n    if (previous.type !== current.type) {\n        return true;\n    }\n    try {\n        // If both events have the same type, it's still possible that actions were performed on different targets.\n        // e.g. 2 clicks on different buttons.\n        if (previous.target !== current.target) {\n            return true;\n        }\n    }\n    catch (e) {\n        // just accessing `target` property can throw an exception in some rare circumstances\n        // see: https://github.com/getsentry/sentry-javascript/issues/838\n    }\n    // If both events have the same type _and_ same `target` (an element which triggered an event, _not necessarily_\n    // to which an event listener was attached), we treat them as the same action, as we want to capture\n    // only one breadcrumb. e.g. multiple clicks on the same button, or typing inside a user input box.\n    return false;\n}\n/**\n * Decide whether an event should be captured.\n * @param event event to be captured\n */\nfunction shouldSkipDOMEvent(event) {\n    // We are only interested in filtering `keypress` events for now.\n    if (event.type !== 'keypress') {\n        return false;\n    }\n    try {\n        var target = event.target;\n        if (!target || !target.tagName) {\n            return true;\n        }\n        // Only consider keypress events on actual input elements. This will disregard keypresses targeting body\n        // e.g.tabbing through elements, hotkeys, etc.\n        if (target.tagName === 'INPUT' || target.tagName === 'TEXTAREA' || target.isContentEditable) {\n            return false;\n        }\n    }\n    catch (e) {\n        // just accessing `target` property can throw an exception in some rare circumstances\n        // see: https://github.com/getsentry/sentry-javascript/issues/838\n    }\n    return true;\n}\n/**\n * Wraps addEventListener to capture UI breadcrumbs\n * @param handler function that will be triggered\n * @param globalListener indicates whether event was captured by the global event listener\n * @returns wrapped breadcrumb events handler\n * @hidden\n */\nfunction makeDOMEventHandler(handler, globalListener) {\n    if (globalListener === void 0) { globalListener = false; }\n    return function (event) {\n        // It's possible this handler might trigger multiple times for the same\n        // event (e.g. event propagation through node ancestors).\n        // Ignore if we've already captured that event.\n        if (!event || lastCapturedEvent === event) {\n            return;\n        }\n        // We always want to skip _some_ events.\n        if (shouldSkipDOMEvent(event)) {\n            return;\n        }\n        var name = event.type === 'keypress' ? 'input' : event.type;\n        // If there is no debounce timer, it means that we can safely capture the new event and store it for future comparisons.\n        if (debounceTimerID === undefined) {\n            handler({\n                event: event,\n                name: name,\n                global: globalListener,\n            });\n            lastCapturedEvent = event;\n        }\n        // If there is a debounce awaiting, see if the new event is different enough to treat it as a unique one.\n        // If that's the case, emit the previous event and store locally the newly-captured DOM event.\n        else if (shouldShortcircuitPreviousDebounce(lastCapturedEvent, event)) {\n            handler({\n                event: event,\n                name: name,\n                global: globalListener,\n            });\n            lastCapturedEvent = event;\n        }\n        // Start a new debounce timer that will prevent us from capturing multiple events that should be grouped together.\n        clearTimeout(debounceTimerID);\n        debounceTimerID = global.setTimeout(function () {\n            debounceTimerID = undefined;\n        }, debounceDuration);\n    };\n}\n/** JSDoc */\nfunction instrumentDOM() {\n    if (!('document' in global)) {\n        return;\n    }\n    // Make it so that any click or keypress that is unhandled / bubbled up all the way to the document triggers our dom\n    // handlers. (Normally we have only one, which captures a breadcrumb for each click or keypress.) Do this before\n    // we instrument `addEventListener` so that we don't end up attaching this handler twice.\n    var triggerDOMHandler = triggerHandlers.bind(null, 'dom');\n    var globalDOMEventHandler = makeDOMEventHandler(triggerDOMHandler, true);\n    global.document.addEventListener('click', globalDOMEventHandler, false);\n    global.document.addEventListener('keypress', globalDOMEventHandler, false);\n    // After hooking into click and keypress events bubbled up to `document`, we also hook into user-handled\n    // clicks & keypresses, by adding an event listener of our own to any element to which they add a listener. That\n    // way, whenever one of their handlers is triggered, ours will be, too. (This is needed because their handler\n    // could potentially prevent the event from bubbling up to our global listeners. This way, our handler are still\n    // guaranteed to fire at least once.)\n    ['EventTarget', 'Node'].forEach(function (target) {\n        // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n        var proto = global[target] && global[target].prototype;\n        // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, no-prototype-builtins\n        if (!proto || !proto.hasOwnProperty || !proto.hasOwnProperty('addEventListener')) {\n            return;\n        }\n        fill(proto, 'addEventListener', function (originalAddEventListener) {\n            return function (type, listener, options) {\n                if (type === 'click' || type == 'keypress') {\n                    try {\n                        var el = this;\n                        var handlers_1 = (el.__sentry_instrumentation_handlers__ = el.__sentry_instrumentation_handlers__ || {});\n                        var handlerForType = (handlers_1[type] = handlers_1[type] || { refCount: 0 });\n                        if (!handlerForType.handler) {\n                            var handler = makeDOMEventHandler(triggerDOMHandler);\n                            handlerForType.handler = handler;\n                            originalAddEventListener.call(this, type, handler, options);\n                        }\n                        handlerForType.refCount += 1;\n                    }\n                    catch (e) {\n                        // Accessing dom properties is always fragile.\n                        // Also allows us to skip `addEventListenrs` calls with no proper `this` context.\n                    }\n                }\n                return originalAddEventListener.call(this, type, listener, options);\n            };\n        });\n        fill(proto, 'removeEventListener', function (originalRemoveEventListener) {\n            return function (type, listener, options) {\n                if (type === 'click' || type == 'keypress') {\n                    try {\n                        var el = this;\n                        var handlers_2 = el.__sentry_instrumentation_handlers__ || {};\n                        var handlerForType = handlers_2[type];\n                        if (handlerForType) {\n                            handlerForType.refCount -= 1;\n                            // If there are no longer any custom handlers of the current type on this element, we can remove ours, too.\n                            if (handlerForType.refCount <= 0) {\n                                originalRemoveEventListener.call(this, type, handlerForType.handler, options);\n                                handlerForType.handler = undefined;\n                                delete handlers_2[type]; // eslint-disable-line @typescript-eslint/no-dynamic-delete\n                            }\n                            // If there are no longer any custom handlers of any type on this element, cleanup everything.\n                            if (Object.keys(handlers_2).length === 0) {\n                                delete el.__sentry_instrumentation_handlers__;\n                            }\n                        }\n                    }\n                    catch (e) {\n                        // Accessing dom properties is always fragile.\n                        // Also allows us to skip `addEventListenrs` calls with no proper `this` context.\n                    }\n                }\n                return originalRemoveEventListener.call(this, type, listener, options);\n            };\n        });\n    });\n}\nvar _oldOnErrorHandler = null;\n/** JSDoc */\nfunction instrumentError() {\n    _oldOnErrorHandler = global.onerror;\n    global.onerror = function (msg, url, line, column, error) {\n        triggerHandlers('error', {\n            column: column,\n            error: error,\n            line: line,\n            msg: msg,\n            url: url,\n        });\n        if (_oldOnErrorHandler) {\n            // eslint-disable-next-line prefer-rest-params\n            return _oldOnErrorHandler.apply(this, arguments);\n        }\n        return false;\n    };\n}\nvar _oldOnUnhandledRejectionHandler = null;\n/** JSDoc */\nfunction instrumentUnhandledRejection() {\n    _oldOnUnhandledRejectionHandler = global.onunhandledrejection;\n    global.onunhandledrejection = function (e) {\n        triggerHandlers('unhandledrejection', e);\n        if (_oldOnUnhandledRejectionHandler) {\n            // eslint-disable-next-line prefer-rest-params\n            return _oldOnUnhandledRejectionHandler.apply(this, arguments);\n        }\n        return true;\n    };\n}\n//# sourceMappingURL=instrument.js.map","import { __assign } from \"tslib\";\nimport { getGlobalObject } from './global';\nimport { addNonEnumerableProperty } from './object';\nimport { snipLine } from './string';\n/**\n * UUID4 generator\n *\n * @returns string Generated UUID4.\n */\nexport function uuid4() {\n    var global = getGlobalObject();\n    var crypto = global.crypto || global.msCrypto;\n    if (!(crypto === void 0) && crypto.getRandomValues) {\n        // Use window.crypto API if available\n        var arr = new Uint16Array(8);\n        crypto.getRandomValues(arr);\n        // set 4 in byte 7\n        // eslint-disable-next-line no-bitwise\n        arr[3] = (arr[3] & 0xfff) | 0x4000;\n        // set 2 most significant bits of byte 9 to '10'\n        // eslint-disable-next-line no-bitwise\n        arr[4] = (arr[4] & 0x3fff) | 0x8000;\n        var pad = function (num) {\n            var v = num.toString(16);\n            while (v.length < 4) {\n                v = \"0\" + v;\n            }\n            return v;\n        };\n        return (pad(arr[0]) + pad(arr[1]) + pad(arr[2]) + pad(arr[3]) + pad(arr[4]) + pad(arr[5]) + pad(arr[6]) + pad(arr[7]));\n    }\n    // http://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript/2117523#2117523\n    return 'xxxxxxxxxxxx4xxxyxxxxxxxxxxxxxxx'.replace(/[xy]/g, function (c) {\n        // eslint-disable-next-line no-bitwise\n        var r = (Math.random() * 16) | 0;\n        // eslint-disable-next-line no-bitwise\n        var v = c === 'x' ? r : (r & 0x3) | 0x8;\n        return v.toString(16);\n    });\n}\n/**\n * Parses string form of URL into an object\n * // borrowed from https://tools.ietf.org/html/rfc3986#appendix-B\n * // intentionally using regex and not <a/> href parsing trick because React Native and other\n * // environments where DOM might not be available\n * @returns parsed URL object\n */\nexport function parseUrl(url) {\n    if (!url) {\n        return {};\n    }\n    var match = url.match(/^(([^:/?#]+):)?(\\/\\/([^/?#]*))?([^?#]*)(\\?([^#]*))?(#(.*))?$/);\n    if (!match) {\n        return {};\n    }\n    // coerce to undefined values to empty string so we don't get 'undefined'\n    var query = match[6] || '';\n    var fragment = match[8] || '';\n    return {\n        host: match[4],\n        path: match[5],\n        protocol: match[2],\n        relative: match[5] + query + fragment,\n    };\n}\nfunction getFirstException(event) {\n    return event.exception && event.exception.values ? event.exception.values[0] : undefined;\n}\n/**\n * Extracts either message or type+value from an event that can be used for user-facing logs\n * @returns event's description\n */\nexport function getEventDescription(event) {\n    var message = event.message, eventId = event.event_id;\n    if (message) {\n        return message;\n    }\n    var firstException = getFirstException(event);\n    if (firstException) {\n        if (firstException.type && firstException.value) {\n            return firstException.type + \": \" + firstException.value;\n        }\n        return firstException.type || firstException.value || eventId || '<unknown>';\n    }\n    return eventId || '<unknown>';\n}\n/**\n * Adds exception values, type and value to an synthetic Exception.\n * @param event The event to modify.\n * @param value Value of the exception.\n * @param type Type of the exception.\n * @hidden\n */\nexport function addExceptionTypeValue(event, value, type) {\n    var exception = (event.exception = event.exception || {});\n    var values = (exception.values = exception.values || []);\n    var firstException = (values[0] = values[0] || {});\n    if (!firstException.value) {\n        firstException.value = value || '';\n    }\n    if (!firstException.type) {\n        firstException.type = type || 'Error';\n    }\n}\n/**\n * Adds exception mechanism data to a given event. Uses defaults if the second parameter is not passed.\n *\n * @param event The event to modify.\n * @param newMechanism Mechanism data to add to the event.\n * @hidden\n */\nexport function addExceptionMechanism(event, newMechanism) {\n    var firstException = getFirstException(event);\n    if (!firstException) {\n        return;\n    }\n    var defaultMechanism = { type: 'generic', handled: true };\n    var currentMechanism = firstException.mechanism;\n    firstException.mechanism = __assign(__assign(__assign({}, defaultMechanism), currentMechanism), newMechanism);\n    if (newMechanism && 'data' in newMechanism) {\n        var mergedData = __assign(__assign({}, (currentMechanism && currentMechanism.data)), newMechanism.data);\n        firstException.mechanism.data = mergedData;\n    }\n}\n// https://semver.org/#is-there-a-suggested-regular-expression-regex-to-check-a-semver-string\nvar SEMVER_REGEXP = /^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$/;\n/**\n * Parses input into a SemVer interface\n * @param input string representation of a semver version\n */\nexport function parseSemver(input) {\n    var match = input.match(SEMVER_REGEXP) || [];\n    var major = parseInt(match[1], 10);\n    var minor = parseInt(match[2], 10);\n    var patch = parseInt(match[3], 10);\n    return {\n        buildmetadata: match[5],\n        major: isNaN(major) ? undefined : major,\n        minor: isNaN(minor) ? undefined : minor,\n        patch: isNaN(patch) ? undefined : patch,\n        prerelease: match[4],\n    };\n}\nvar defaultRetryAfter = 60 * 1000; // 60 seconds\n/**\n * Extracts Retry-After value from the request header or returns default value\n * @param now current unix timestamp\n * @param header string representation of 'Retry-After' header\n */\nexport function parseRetryAfterHeader(now, header) {\n    if (!header) {\n        return defaultRetryAfter;\n    }\n    var headerDelay = parseInt(\"\" + header, 10);\n    if (!isNaN(headerDelay)) {\n        return headerDelay * 1000;\n    }\n    var headerDate = Date.parse(\"\" + header);\n    if (!isNaN(headerDate)) {\n        return headerDate - now;\n    }\n    return defaultRetryAfter;\n}\n/**\n * This function adds context (pre/post/line) lines to the provided frame\n *\n * @param lines string[] containing all lines\n * @param frame StackFrame that will be mutated\n * @param linesOfContext number of context lines we want to add pre/post\n */\nexport function addContextToFrame(lines, frame, linesOfContext) {\n    if (linesOfContext === void 0) { linesOfContext = 5; }\n    var lineno = frame.lineno || 0;\n    var maxLines = lines.length;\n    var sourceLine = Math.max(Math.min(maxLines, lineno - 1), 0);\n    frame.pre_context = lines\n        .slice(Math.max(0, sourceLine - linesOfContext), sourceLine)\n        .map(function (line) { return snipLine(line, 0); });\n    frame.context_line = snipLine(lines[Math.min(maxLines - 1, sourceLine)], frame.colno || 0);\n    frame.post_context = lines\n        .slice(Math.min(sourceLine + 1, maxLines), sourceLine + 1 + linesOfContext)\n        .map(function (line) { return snipLine(line, 0); });\n}\n/**\n * Strip the query string and fragment off of a given URL or path (if present)\n *\n * @param urlPath Full URL or path, including possible query string and/or fragment\n * @returns URL or path without query string or fragment\n */\nexport function stripUrlQueryAndFragment(urlPath) {\n    // eslint-disable-next-line no-useless-escape\n    return urlPath.split(/[\\?#]/, 1)[0];\n}\n/**\n * Checks whether or not we've already captured the given exception (note: not an identical exception - the very object\n * in question), and marks it captured if not.\n *\n * This is useful because it's possible for an error to get captured by more than one mechanism. After we intercept and\n * record an error, we rethrow it (assuming we've intercepted it before it's reached the top-level global handlers), so\n * that we don't interfere with whatever effects the error might have had were the SDK not there. At that point, because\n * the error has been rethrown, it's possible for it to bubble up to some other code we've instrumented. If it's not\n * caught after that, it will bubble all the way up to the global handlers (which of course we also instrument). This\n * function helps us ensure that even if we encounter the same error more than once, we only record it the first time we\n * see it.\n *\n * Note: It will ignore primitives (always return `false` and not mark them as seen), as properties can't be set on\n * them. {@link: Object.objectify} can be used on exceptions to convert any that are primitives into their equivalent\n * object wrapper forms so that this check will always work. However, because we need to flag the exact object which\n * will get rethrown, and because that rethrowing happens outside of the event processing pipeline, the objectification\n * must be done before the exception captured.\n *\n * @param A thrown exception to check or flag as having been seen\n * @returns `true` if the exception has already been captured, `false` if not (with the side effect of marking it seen)\n */\nexport function checkOrSetAlreadyCaught(exception) {\n    // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n    if (exception && exception.__sentry_captured__) {\n        return true;\n    }\n    try {\n        // set it this way rather than by assignment so that it's not ennumerable and therefore isn't recorded by the\n        // `ExtraErrorData` integration\n        addNonEnumerableProperty(exception, '__sentry_captured__', true);\n    }\n    catch (err) {\n        // `exception` is a primitive, so we can't mark it seen\n    }\n    return false;\n}\n//# sourceMappingURL=misc.js.map","/* eslint-disable @typescript-eslint/explicit-function-return-type */\n/* eslint-disable @typescript-eslint/typedef */\n/* eslint-disable @typescript-eslint/explicit-module-boundary-types */\n/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { isThenable } from './is';\n/**\n * Creates a resolved sync promise.\n *\n * @param value the value to resolve the promise with\n * @returns the resolved sync promise\n */\nexport function resolvedSyncPromise(value) {\n    return new SyncPromise(function (resolve) {\n        resolve(value);\n    });\n}\n/**\n * Creates a rejected sync promise.\n *\n * @param value the value to reject the promise with\n * @returns the rejected sync promise\n */\nexport function rejectedSyncPromise(reason) {\n    return new SyncPromise(function (_, reject) {\n        reject(reason);\n    });\n}\n/**\n * Thenable class that behaves like a Promise and follows it's interface\n * but is not async internally\n */\nvar SyncPromise = /** @class */ (function () {\n    function SyncPromise(executor) {\n        var _this = this;\n        this._state = 0 /* PENDING */;\n        this._handlers = [];\n        /** JSDoc */\n        this._resolve = function (value) {\n            _this._setResult(1 /* RESOLVED */, value);\n        };\n        /** JSDoc */\n        this._reject = function (reason) {\n            _this._setResult(2 /* REJECTED */, reason);\n        };\n        /** JSDoc */\n        this._setResult = function (state, value) {\n            if (_this._state !== 0 /* PENDING */) {\n                return;\n            }\n            if (isThenable(value)) {\n                void value.then(_this._resolve, _this._reject);\n                return;\n            }\n            _this._state = state;\n            _this._value = value;\n            _this._executeHandlers();\n        };\n        /** JSDoc */\n        this._executeHandlers = function () {\n            if (_this._state === 0 /* PENDING */) {\n                return;\n            }\n            var cachedHandlers = _this._handlers.slice();\n            _this._handlers = [];\n            cachedHandlers.forEach(function (handler) {\n                if (handler[0]) {\n                    return;\n                }\n                if (_this._state === 1 /* RESOLVED */) {\n                    // eslint-disable-next-line @typescript-eslint/no-floating-promises\n                    handler[1](_this._value);\n                }\n                if (_this._state === 2 /* REJECTED */) {\n                    handler[2](_this._value);\n                }\n                handler[0] = true;\n            });\n        };\n        try {\n            executor(this._resolve, this._reject);\n        }\n        catch (e) {\n            this._reject(e);\n        }\n    }\n    /** JSDoc */\n    SyncPromise.prototype.then = function (onfulfilled, onrejected) {\n        var _this = this;\n        return new SyncPromise(function (resolve, reject) {\n            _this._handlers.push([\n                false,\n                function (result) {\n                    if (!onfulfilled) {\n                        // TODO: ¯\\_(ツ)_/¯\n                        // TODO: FIXME\n                        resolve(result);\n                    }\n                    else {\n                        try {\n                            resolve(onfulfilled(result));\n                        }\n                        catch (e) {\n                            reject(e);\n                        }\n                    }\n                },\n                function (reason) {\n                    if (!onrejected) {\n                        reject(reason);\n                    }\n                    else {\n                        try {\n                            resolve(onrejected(reason));\n                        }\n                        catch (e) {\n                            reject(e);\n                        }\n                    }\n                },\n            ]);\n            _this._executeHandlers();\n        });\n    };\n    /** JSDoc */\n    SyncPromise.prototype.catch = function (onrejected) {\n        return this.then(function (val) { return val; }, onrejected);\n    };\n    /** JSDoc */\n    SyncPromise.prototype.finally = function (onfinally) {\n        var _this = this;\n        return new SyncPromise(function (resolve, reject) {\n            var val;\n            var isRejected;\n            return _this.then(function (value) {\n                isRejected = false;\n                val = value;\n                if (onfinally) {\n                    onfinally();\n                }\n            }, function (reason) {\n                isRejected = true;\n                val = reason;\n                if (onfinally) {\n                    onfinally();\n                }\n            }).then(function () {\n                if (isRejected) {\n                    reject(val);\n                    return;\n                }\n                resolve(val);\n            });\n        });\n    };\n    return SyncPromise;\n}());\nexport { SyncPromise };\n//# sourceMappingURL=syncpromise.js.map","import { SentryError } from './error';\nimport { rejectedSyncPromise, resolvedSyncPromise, SyncPromise } from './syncpromise';\n/**\n * Creates an new PromiseBuffer object with the specified limit\n * @param limit max number of promises that can be stored in the buffer\n */\nexport function makePromiseBuffer(limit) {\n    var buffer = [];\n    function isReady() {\n        return limit === undefined || buffer.length < limit;\n    }\n    /**\n     * Remove a promise from the queue.\n     *\n     * @param task Can be any PromiseLike<T>\n     * @returns Removed promise.\n     */\n    function remove(task) {\n        return buffer.splice(buffer.indexOf(task), 1)[0];\n    }\n    /**\n     * Add a promise (representing an in-flight action) to the queue, and set it to remove itself on fulfillment.\n     *\n     * @param taskProducer A function producing any PromiseLike<T>; In previous versions this used to be `task:\n     *        PromiseLike<T>`, but under that model, Promises were instantly created on the call-site and their executor\n     *        functions therefore ran immediately. Thus, even if the buffer was full, the action still happened. By\n     *        requiring the promise to be wrapped in a function, we can defer promise creation until after the buffer\n     *        limit check.\n     * @returns The original promise.\n     */\n    function add(taskProducer) {\n        if (!isReady()) {\n            return rejectedSyncPromise(new SentryError('Not adding Promise due to buffer limit reached.'));\n        }\n        // start the task and add its promise to the queue\n        var task = taskProducer();\n        if (buffer.indexOf(task) === -1) {\n            buffer.push(task);\n        }\n        void task\n            .then(function () { return remove(task); })\n            // Use `then(null, rejectionHandler)` rather than `catch(rejectionHandler)` so that we can use `PromiseLike`\n            // rather than `Promise`. `PromiseLike` doesn't have a `.catch` method, making its polyfill smaller. (ES5 didn't\n            // have promises, so TS has to polyfill when down-compiling.)\n            .then(null, function () {\n            return remove(task).then(null, function () {\n                // We have to add another catch here because `remove()` starts a new promise chain.\n            });\n        });\n        return task;\n    }\n    /**\n     * Wait for all promises in the queue to resolve or for timeout to expire, whichever comes first.\n     *\n     * @param timeout The time, in ms, after which to resolve to `false` if the queue is still non-empty. Passing `0` (or\n     * not passing anything) will make the promise wait as long as it takes for the queue to drain before resolving to\n     * `true`.\n     * @returns A promise which will resolve to `true` if the queue is already empty or drains before the timeout, and\n     * `false` otherwise\n     */\n    function drain(timeout) {\n        return new SyncPromise(function (resolve, reject) {\n            var counter = buffer.length;\n            if (!counter) {\n                return resolve(true);\n            }\n            // wait for `timeout` ms and then resolve to `false` (if not cancelled first)\n            var capturedSetTimeout = setTimeout(function () {\n                if (timeout && timeout > 0) {\n                    resolve(false);\n                }\n            }, timeout);\n            // if all promises resolve in time, cancel the timer and resolve to `true`\n            buffer.forEach(function (item) {\n                void resolvedSyncPromise(item).then(function () {\n                    // eslint-disable-next-line no-plusplus\n                    if (!--counter) {\n                        clearTimeout(capturedSetTimeout);\n                        resolve(true);\n                    }\n                }, reject);\n            });\n        });\n    }\n    return {\n        $: buffer,\n        add: add,\n        drain: drain,\n    };\n}\n//# sourceMappingURL=promisebuffer.js.map","import { Severity } from '@sentry/types';\nimport { SeverityLevels } from './enums';\nfunction isSupportedSeverity(level) {\n    return SeverityLevels.indexOf(level) !== -1;\n}\n/**\n * Converts a string-based level into a {@link Severity}.\n *\n * @param level string representation of Severity\n * @returns Severity\n */\nexport function severityFromString(level) {\n    if (level === 'warn')\n        return Severity.Warning;\n    if (isSupportedSeverity(level)) {\n        return level;\n    }\n    return Severity.Log;\n}\n//# sourceMappingURL=severity.js.map","/**\n * Converts an HTTP status code to sentry status {@link EventStatus}.\n *\n * @param code number HTTP status code\n * @returns EventStatus\n */\nexport function eventStatusFromHttpCode(code) {\n    if (code >= 200 && code < 300) {\n        return 'success';\n    }\n    if (code === 429) {\n        return 'rate_limit';\n    }\n    if (code >= 400 && code < 500) {\n        return 'invalid';\n    }\n    if (code >= 500) {\n        return 'failed';\n    }\n    return 'unknown';\n}\n//# sourceMappingURL=status.js.map","import { getGlobalObject } from './global';\nimport { dynamicRequire, isNodeEnv } from './node';\n/**\n * A TimestampSource implementation for environments that do not support the Performance Web API natively.\n *\n * Note that this TimestampSource does not use a monotonic clock. A call to `nowSeconds` may return a timestamp earlier\n * than a previously returned value. We do not try to emulate a monotonic behavior in order to facilitate debugging. It\n * is more obvious to explain \"why does my span have negative duration\" than \"why my spans have zero duration\".\n */\nvar dateTimestampSource = {\n    nowSeconds: function () { return Date.now() / 1000; },\n};\n/**\n * Returns a wrapper around the native Performance API browser implementation, or undefined for browsers that do not\n * support the API.\n *\n * Wrapping the native API works around differences in behavior from different browsers.\n */\nfunction getBrowserPerformance() {\n    var performance = getGlobalObject().performance;\n    if (!performance || !performance.now) {\n        return undefined;\n    }\n    // Replace performance.timeOrigin with our own timeOrigin based on Date.now().\n    //\n    // This is a partial workaround for browsers reporting performance.timeOrigin such that performance.timeOrigin +\n    // performance.now() gives a date arbitrarily in the past.\n    //\n    // Additionally, computing timeOrigin in this way fills the gap for browsers where performance.timeOrigin is\n    // undefined.\n    //\n    // The assumption that performance.timeOrigin + performance.now() ~= Date.now() is flawed, but we depend on it to\n    // interact with data coming out of performance entries.\n    //\n    // Note that despite recommendations against it in the spec, browsers implement the Performance API with a clock that\n    // might stop when the computer is asleep (and perhaps under other circumstances). Such behavior causes\n    // performance.timeOrigin + performance.now() to have an arbitrary skew over Date.now(). In laptop computers, we have\n    // observed skews that can be as long as days, weeks or months.\n    //\n    // See https://github.com/getsentry/sentry-javascript/issues/2590.\n    //\n    // BUG: despite our best intentions, this workaround has its limitations. It mostly addresses timings of pageload\n    // transactions, but ignores the skew built up over time that can aversely affect timestamps of navigation\n    // transactions of long-lived web pages.\n    var timeOrigin = Date.now() - performance.now();\n    return {\n        now: function () { return performance.now(); },\n        timeOrigin: timeOrigin,\n    };\n}\n/**\n * Returns the native Performance API implementation from Node.js. Returns undefined in old Node.js versions that don't\n * implement the API.\n */\nfunction getNodePerformance() {\n    try {\n        var perfHooks = dynamicRequire(module, 'perf_hooks');\n        return perfHooks.performance;\n    }\n    catch (_) {\n        return undefined;\n    }\n}\n/**\n * The Performance API implementation for the current platform, if available.\n */\nvar platformPerformance = isNodeEnv() ? getNodePerformance() : getBrowserPerformance();\nvar timestampSource = platformPerformance === undefined\n    ? dateTimestampSource\n    : {\n        nowSeconds: function () { return (platformPerformance.timeOrigin + platformPerformance.now()) / 1000; },\n    };\n/**\n * Returns a timestamp in seconds since the UNIX epoch using the Date API.\n */\nexport var dateTimestampInSeconds = dateTimestampSource.nowSeconds.bind(dateTimestampSource);\n/**\n * Returns a timestamp in seconds since the UNIX epoch using either the Performance or Date APIs, depending on the\n * availability of the Performance API.\n *\n * See `usingPerformanceAPI` to test whether the Performance API is used.\n *\n * BUG: Note that because of how browsers implement the Performance API, the clock might stop when the computer is\n * asleep. This creates a skew between `dateTimestampInSeconds` and `timestampInSeconds`. The\n * skew can grow to arbitrary amounts like days, weeks or months.\n * See https://github.com/getsentry/sentry-javascript/issues/2590.\n */\nexport var timestampInSeconds = timestampSource.nowSeconds.bind(timestampSource);\n// Re-exported with an old name for backwards-compatibility.\nexport var timestampWithMs = timestampInSeconds;\n/**\n * A boolean that is true when timestampInSeconds uses the Performance API to produce monotonic timestamps.\n */\nexport var usingPerformanceAPI = platformPerformance !== undefined;\n/**\n * Internal helper to store what is the source of browserPerformanceTimeOrigin below. For debugging only.\n */\nexport var _browserPerformanceTimeOriginMode;\n/**\n * The number of milliseconds since the UNIX epoch. This value is only usable in a browser, and only when the\n * performance API is available.\n */\nexport var browserPerformanceTimeOrigin = (function () {\n    // Unfortunately browsers may report an inaccurate time origin data, through either performance.timeOrigin or\n    // performance.timing.navigationStart, which results in poor results in performance data. We only treat time origin\n    // data as reliable if they are within a reasonable threshold of the current time.\n    var performance = getGlobalObject().performance;\n    if (!performance || !performance.now) {\n        _browserPerformanceTimeOriginMode = 'none';\n        return undefined;\n    }\n    var threshold = 3600 * 1000;\n    var performanceNow = performance.now();\n    var dateNow = Date.now();\n    // if timeOrigin isn't available set delta to threshold so it isn't used\n    var timeOriginDelta = performance.timeOrigin\n        ? Math.abs(performance.timeOrigin + performanceNow - dateNow)\n        : threshold;\n    var timeOriginIsReliable = timeOriginDelta < threshold;\n    // While performance.timing.navigationStart is deprecated in favor of performance.timeOrigin, performance.timeOrigin\n    // is not as widely supported. Namely, performance.timeOrigin is undefined in Safari as of writing.\n    // Also as of writing, performance.timing is not available in Web Workers in mainstream browsers, so it is not always\n    // a valid fallback. In the absence of an initial time provided by the browser, fallback to the current time from the\n    // Date API.\n    // eslint-disable-next-line deprecation/deprecation\n    var navigationStart = performance.timing && performance.timing.navigationStart;\n    var hasNavigationStart = typeof navigationStart === 'number';\n    // if navigationStart isn't available set delta to threshold so it isn't used\n    var navigationStartDelta = hasNavigationStart ? Math.abs(navigationStart + performanceNow - dateNow) : threshold;\n    var navigationStartIsReliable = navigationStartDelta < threshold;\n    if (timeOriginIsReliable || navigationStartIsReliable) {\n        // Use the more reliable time origin\n        if (timeOriginDelta <= navigationStartDelta) {\n            _browserPerformanceTimeOriginMode = 'timeOrigin';\n            return performance.timeOrigin;\n        }\n        else {\n            _browserPerformanceTimeOriginMode = 'navigationStart';\n            return navigationStart;\n        }\n    }\n    // Either both timeOrigin and navigationStart are skewed or neither is available, fallback to Date.\n    _browserPerformanceTimeOriginMode = 'dateNow';\n    return dateNow;\n})();\n//# sourceMappingURL=time.js.map","import { __assign, __read, __spread } from \"tslib\";\nimport { dateTimestampInSeconds, getGlobalObject, isPlainObject, isThenable, SyncPromise } from '@sentry/utils';\n/**\n * Absolute maximum number of breadcrumbs added to an event.\n * The `maxBreadcrumbs` option cannot be higher than this value.\n */\nvar MAX_BREADCRUMBS = 100;\n/**\n * Holds additional event information. {@link Scope.applyToEvent} will be\n * called by the client before an event will be sent.\n */\nvar Scope = /** @class */ (function () {\n    function Scope() {\n        /** Flag if notifying is happening. */\n        this._notifyingListeners = false;\n        /** Callback for client to receive scope changes. */\n        this._scopeListeners = [];\n        /** Callback list that will be called after {@link applyToEvent}. */\n        this._eventProcessors = [];\n        /** Array of breadcrumbs. */\n        this._breadcrumbs = [];\n        /** User */\n        this._user = {};\n        /** Tags */\n        this._tags = {};\n        /** Extra */\n        this._extra = {};\n        /** Contexts */\n        this._contexts = {};\n        /**\n         * A place to stash data which is needed at some point in the SDK's event processing pipeline but which shouldn't get\n         * sent to Sentry\n         */\n        this._sdkProcessingMetadata = {};\n    }\n    /**\n     * Inherit values from the parent scope.\n     * @param scope to clone.\n     */\n    Scope.clone = function (scope) {\n        var newScope = new Scope();\n        if (scope) {\n            newScope._breadcrumbs = __spread(scope._breadcrumbs);\n            newScope._tags = __assign({}, scope._tags);\n            newScope._extra = __assign({}, scope._extra);\n            newScope._contexts = __assign({}, scope._contexts);\n            newScope._user = scope._user;\n            newScope._level = scope._level;\n            newScope._span = scope._span;\n            newScope._session = scope._session;\n            newScope._transactionName = scope._transactionName;\n            newScope._fingerprint = scope._fingerprint;\n            newScope._eventProcessors = __spread(scope._eventProcessors);\n            newScope._requestSession = scope._requestSession;\n        }\n        return newScope;\n    };\n    /**\n     * Add internal on change listener. Used for sub SDKs that need to store the scope.\n     * @hidden\n     */\n    Scope.prototype.addScopeListener = function (callback) {\n        this._scopeListeners.push(callback);\n    };\n    /**\n     * @inheritDoc\n     */\n    Scope.prototype.addEventProcessor = function (callback) {\n        this._eventProcessors.push(callback);\n        return this;\n    };\n    /**\n     * @inheritDoc\n     */\n    Scope.prototype.setUser = function (user) {\n        this._user = user || {};\n        if (this._session) {\n            this._session.update({ user: user });\n        }\n        this._notifyScopeListeners();\n        return this;\n    };\n    /**\n     * @inheritDoc\n     */\n    Scope.prototype.getUser = function () {\n        return this._user;\n    };\n    /**\n     * @inheritDoc\n     */\n    Scope.prototype.getRequestSession = function () {\n        return this._requestSession;\n    };\n    /**\n     * @inheritDoc\n     */\n    Scope.prototype.setRequestSession = function (requestSession) {\n        this._requestSession = requestSession;\n        return this;\n    };\n    /**\n     * @inheritDoc\n     */\n    Scope.prototype.setTags = function (tags) {\n        this._tags = __assign(__assign({}, this._tags), tags);\n        this._notifyScopeListeners();\n        return this;\n    };\n    /**\n     * @inheritDoc\n     */\n    Scope.prototype.setTag = function (key, value) {\n        var _a;\n        this._tags = __assign(__assign({}, this._tags), (_a = {}, _a[key] = value, _a));\n        this._notifyScopeListeners();\n        return this;\n    };\n    /**\n     * @inheritDoc\n     */\n    Scope.prototype.setExtras = function (extras) {\n        this._extra = __assign(__assign({}, this._extra), extras);\n        this._notifyScopeListeners();\n        return this;\n    };\n    /**\n     * @inheritDoc\n     */\n    Scope.prototype.setExtra = function (key, extra) {\n        var _a;\n        this._extra = __assign(__assign({}, this._extra), (_a = {}, _a[key] = extra, _a));\n        this._notifyScopeListeners();\n        return this;\n    };\n    /**\n     * @inheritDoc\n     */\n    Scope.prototype.setFingerprint = function (fingerprint) {\n        this._fingerprint = fingerprint;\n        this._notifyScopeListeners();\n        return this;\n    };\n    /**\n     * @inheritDoc\n     */\n    Scope.prototype.setLevel = function (level) {\n        this._level = level;\n        this._notifyScopeListeners();\n        return this;\n    };\n    /**\n     * @inheritDoc\n     */\n    Scope.prototype.setTransactionName = function (name) {\n        this._transactionName = name;\n        this._notifyScopeListeners();\n        return this;\n    };\n    /**\n     * Can be removed in major version.\n     * @deprecated in favor of {@link this.setTransactionName}\n     */\n    Scope.prototype.setTransaction = function (name) {\n        return this.setTransactionName(name);\n    };\n    /**\n     * @inheritDoc\n     */\n    Scope.prototype.setContext = function (key, context) {\n        var _a;\n        if (context === null) {\n            // eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n            delete this._contexts[key];\n        }\n        else {\n            this._contexts = __assign(__assign({}, this._contexts), (_a = {}, _a[key] = context, _a));\n        }\n        this._notifyScopeListeners();\n        return this;\n    };\n    /**\n     * @inheritDoc\n     */\n    Scope.prototype.setSpan = function (span) {\n        this._span = span;\n        this._notifyScopeListeners();\n        return this;\n    };\n    /**\n     * @inheritDoc\n     */\n    Scope.prototype.getSpan = function () {\n        return this._span;\n    };\n    /**\n     * @inheritDoc\n     */\n    Scope.prototype.getTransaction = function () {\n        // Often, this span (if it exists at all) will be a transaction, but it's not guaranteed to be. Regardless, it will\n        // have a pointer to the currently-active transaction.\n        var span = this.getSpan();\n        return span && span.transaction;\n    };\n    /**\n     * @inheritDoc\n     */\n    Scope.prototype.setSession = function (session) {\n        if (!session) {\n            delete this._session;\n        }\n        else {\n            this._session = session;\n        }\n        this._notifyScopeListeners();\n        return this;\n    };\n    /**\n     * @inheritDoc\n     */\n    Scope.prototype.getSession = function () {\n        return this._session;\n    };\n    /**\n     * @inheritDoc\n     */\n    Scope.prototype.update = function (captureContext) {\n        if (!captureContext) {\n            return this;\n        }\n        if (typeof captureContext === 'function') {\n            var updatedScope = captureContext(this);\n            return updatedScope instanceof Scope ? updatedScope : this;\n        }\n        if (captureContext instanceof Scope) {\n            this._tags = __assign(__assign({}, this._tags), captureContext._tags);\n            this._extra = __assign(__assign({}, this._extra), captureContext._extra);\n            this._contexts = __assign(__assign({}, this._contexts), captureContext._contexts);\n            if (captureContext._user && Object.keys(captureContext._user).length) {\n                this._user = captureContext._user;\n            }\n            if (captureContext._level) {\n                this._level = captureContext._level;\n            }\n            if (captureContext._fingerprint) {\n                this._fingerprint = captureContext._fingerprint;\n            }\n            if (captureContext._requestSession) {\n                this._requestSession = captureContext._requestSession;\n            }\n        }\n        else if (isPlainObject(captureContext)) {\n            // eslint-disable-next-line no-param-reassign\n            captureContext = captureContext;\n            this._tags = __assign(__assign({}, this._tags), captureContext.tags);\n            this._extra = __assign(__assign({}, this._extra), captureContext.extra);\n            this._contexts = __assign(__assign({}, this._contexts), captureContext.contexts);\n            if (captureContext.user) {\n                this._user = captureContext.user;\n            }\n            if (captureContext.level) {\n                this._level = captureContext.level;\n            }\n            if (captureContext.fingerprint) {\n                this._fingerprint = captureContext.fingerprint;\n            }\n            if (captureContext.requestSession) {\n                this._requestSession = captureContext.requestSession;\n            }\n        }\n        return this;\n    };\n    /**\n     * @inheritDoc\n     */\n    Scope.prototype.clear = function () {\n        this._breadcrumbs = [];\n        this._tags = {};\n        this._extra = {};\n        this._user = {};\n        this._contexts = {};\n        this._level = undefined;\n        this._transactionName = undefined;\n        this._fingerprint = undefined;\n        this._requestSession = undefined;\n        this._span = undefined;\n        this._session = undefined;\n        this._notifyScopeListeners();\n        return this;\n    };\n    /**\n     * @inheritDoc\n     */\n    Scope.prototype.addBreadcrumb = function (breadcrumb, maxBreadcrumbs) {\n        var maxCrumbs = typeof maxBreadcrumbs === 'number' ? Math.min(maxBreadcrumbs, MAX_BREADCRUMBS) : MAX_BREADCRUMBS;\n        // No data has been changed, so don't notify scope listeners\n        if (maxCrumbs <= 0) {\n            return this;\n        }\n        var mergedBreadcrumb = __assign({ timestamp: dateTimestampInSeconds() }, breadcrumb);\n        this._breadcrumbs = __spread(this._breadcrumbs, [mergedBreadcrumb]).slice(-maxCrumbs);\n        this._notifyScopeListeners();\n        return this;\n    };\n    /**\n     * @inheritDoc\n     */\n    Scope.prototype.clearBreadcrumbs = function () {\n        this._breadcrumbs = [];\n        this._notifyScopeListeners();\n        return this;\n    };\n    /**\n     * Applies the current context and fingerprint to the event.\n     * Note that breadcrumbs will be added by the client.\n     * Also if the event has already breadcrumbs on it, we do not merge them.\n     * @param event Event\n     * @param hint May contain additional information about the original exception.\n     * @hidden\n     */\n    Scope.prototype.applyToEvent = function (event, hint) {\n        if (this._extra && Object.keys(this._extra).length) {\n            event.extra = __assign(__assign({}, this._extra), event.extra);\n        }\n        if (this._tags && Object.keys(this._tags).length) {\n            event.tags = __assign(__assign({}, this._tags), event.tags);\n        }\n        if (this._user && Object.keys(this._user).length) {\n            event.user = __assign(__assign({}, this._user), event.user);\n        }\n        if (this._contexts && Object.keys(this._contexts).length) {\n            event.contexts = __assign(__assign({}, this._contexts), event.contexts);\n        }\n        if (this._level) {\n            event.level = this._level;\n        }\n        if (this._transactionName) {\n            event.transaction = this._transactionName;\n        }\n        // We want to set the trace context for normal events only if there isn't already\n        // a trace context on the event. There is a product feature in place where we link\n        // errors with transaction and it relies on that.\n        if (this._span) {\n            event.contexts = __assign({ trace: this._span.getTraceContext() }, event.contexts);\n            var transactionName = this._span.transaction && this._span.transaction.name;\n            if (transactionName) {\n                event.tags = __assign({ transaction: transactionName }, event.tags);\n            }\n        }\n        this._applyFingerprint(event);\n        event.breadcrumbs = __spread((event.breadcrumbs || []), this._breadcrumbs);\n        event.breadcrumbs = event.breadcrumbs.length > 0 ? event.breadcrumbs : undefined;\n        event.sdkProcessingMetadata = this._sdkProcessingMetadata;\n        return this._notifyEventProcessors(__spread(getGlobalEventProcessors(), this._eventProcessors), event, hint);\n    };\n    /**\n     * Add data which will be accessible during event processing but won't get sent to Sentry\n     */\n    Scope.prototype.setSDKProcessingMetadata = function (newData) {\n        this._sdkProcessingMetadata = __assign(__assign({}, this._sdkProcessingMetadata), newData);\n        return this;\n    };\n    /**\n     * This will be called after {@link applyToEvent} is finished.\n     */\n    Scope.prototype._notifyEventProcessors = function (processors, event, hint, index) {\n        var _this = this;\n        if (index === void 0) { index = 0; }\n        return new SyncPromise(function (resolve, reject) {\n            var processor = processors[index];\n            if (event === null || typeof processor !== 'function') {\n                resolve(event);\n            }\n            else {\n                var result = processor(__assign({}, event), hint);\n                if (isThenable(result)) {\n                    void result\n                        .then(function (final) { return _this._notifyEventProcessors(processors, final, hint, index + 1).then(resolve); })\n                        .then(null, reject);\n                }\n                else {\n                    void _this._notifyEventProcessors(processors, result, hint, index + 1)\n                        .then(resolve)\n                        .then(null, reject);\n                }\n            }\n        });\n    };\n    /**\n     * This will be called on every set call.\n     */\n    Scope.prototype._notifyScopeListeners = function () {\n        var _this = this;\n        // We need this check for this._notifyingListeners to be able to work on scope during updates\n        // If this check is not here we'll produce endless recursion when something is done with the scope\n        // during the callback.\n        if (!this._notifyingListeners) {\n            this._notifyingListeners = true;\n            this._scopeListeners.forEach(function (callback) {\n                callback(_this);\n            });\n            this._notifyingListeners = false;\n        }\n    };\n    /**\n     * Applies fingerprint from the scope to the event if there's one,\n     * uses message if there's one instead or get rid of empty fingerprint\n     */\n    Scope.prototype._applyFingerprint = function (event) {\n        // Make sure it's an array first and we actually have something in place\n        event.fingerprint = event.fingerprint\n            ? Array.isArray(event.fingerprint)\n                ? event.fingerprint\n                : [event.fingerprint]\n            : [];\n        // If we have something on the scope, then merge it with event\n        if (this._fingerprint) {\n            event.fingerprint = event.fingerprint.concat(this._fingerprint);\n        }\n        // If we have no data at all, remove empty array default\n        if (event.fingerprint && !event.fingerprint.length) {\n            delete event.fingerprint;\n        }\n    };\n    return Scope;\n}());\nexport { Scope };\n/**\n * Returns the global event processors.\n */\nfunction getGlobalEventProcessors() {\n    /* eslint-disable @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-member-access  */\n    var global = getGlobalObject();\n    global.__SENTRY__ = global.__SENTRY__ || {};\n    global.__SENTRY__.globalEventProcessors = global.__SENTRY__.globalEventProcessors || [];\n    return global.__SENTRY__.globalEventProcessors;\n    /* eslint-enable @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-member-access */\n}\n/**\n * Add a EventProcessor to be kept globally.\n * @param callback EventProcessor to add\n */\nexport function addGlobalEventProcessor(callback) {\n    getGlobalEventProcessors().push(callback);\n}\n//# sourceMappingURL=scope.js.map","import { dropUndefinedKeys, timestampInSeconds, uuid4 } from '@sentry/utils';\n/**\n * @inheritdoc\n */\nvar Session = /** @class */ (function () {\n    function Session(context) {\n        this.errors = 0;\n        this.sid = uuid4();\n        this.duration = 0;\n        this.status = 'ok';\n        this.init = true;\n        this.ignoreDuration = false;\n        // Both timestamp and started are in seconds since the UNIX epoch.\n        var startingTime = timestampInSeconds();\n        this.timestamp = startingTime;\n        this.started = startingTime;\n        if (context) {\n            this.update(context);\n        }\n    }\n    /** JSDoc */\n    // eslint-disable-next-line complexity\n    Session.prototype.update = function (context) {\n        if (context === void 0) { context = {}; }\n        if (context.user) {\n            if (!this.ipAddress && context.user.ip_address) {\n                this.ipAddress = context.user.ip_address;\n            }\n            if (!this.did && !context.did) {\n                this.did = context.user.id || context.user.email || context.user.username;\n            }\n        }\n        this.timestamp = context.timestamp || timestampInSeconds();\n        if (context.ignoreDuration) {\n            this.ignoreDuration = context.ignoreDuration;\n        }\n        if (context.sid) {\n            // Good enough uuid validation. — Kamil\n            this.sid = context.sid.length === 32 ? context.sid : uuid4();\n        }\n        if (context.init !== undefined) {\n            this.init = context.init;\n        }\n        if (!this.did && context.did) {\n            this.did = \"\" + context.did;\n        }\n        if (typeof context.started === 'number') {\n            this.started = context.started;\n        }\n        if (this.ignoreDuration) {\n            this.duration = undefined;\n        }\n        else if (typeof context.duration === 'number') {\n            this.duration = context.duration;\n        }\n        else {\n            var duration = this.timestamp - this.started;\n            this.duration = duration >= 0 ? duration : 0;\n        }\n        if (context.release) {\n            this.release = context.release;\n        }\n        if (context.environment) {\n            this.environment = context.environment;\n        }\n        if (!this.ipAddress && context.ipAddress) {\n            this.ipAddress = context.ipAddress;\n        }\n        if (!this.userAgent && context.userAgent) {\n            this.userAgent = context.userAgent;\n        }\n        if (typeof context.errors === 'number') {\n            this.errors = context.errors;\n        }\n        if (context.status) {\n            this.status = context.status;\n        }\n    };\n    /** JSDoc */\n    Session.prototype.close = function (status) {\n        if (status) {\n            this.update({ status: status });\n        }\n        else if (this.status === 'ok') {\n            this.update({ status: 'exited' });\n        }\n        else {\n            this.update();\n        }\n    };\n    /** JSDoc */\n    Session.prototype.toJSON = function () {\n        return dropUndefinedKeys({\n            sid: \"\" + this.sid,\n            init: this.init,\n            // Make sure that sec is converted to ms for date constructor\n            started: new Date(this.started * 1000).toISOString(),\n            timestamp: new Date(this.timestamp * 1000).toISOString(),\n            status: this.status,\n            errors: this.errors,\n            did: typeof this.did === 'number' || typeof this.did === 'string' ? \"\" + this.did : undefined,\n            duration: this.duration,\n            attrs: {\n                release: this.release,\n                environment: this.environment,\n                ip_address: this.ipAddress,\n                user_agent: this.userAgent,\n            },\n        });\n    };\n    return Session;\n}());\nexport { Session };\n//# sourceMappingURL=session.js.map","import { __assign, __read, __spread } from \"tslib\";\nimport { consoleSandbox, dateTimestampInSeconds, getGlobalObject, isNodeEnv, logger, uuid4 } from '@sentry/utils';\nimport { Scope } from './scope';\nimport { Session } from './session';\n/**\n * API compatibility version of this hub.\n *\n * WARNING: This number should only be increased when the global interface\n * changes and new methods are introduced.\n *\n * @hidden\n */\nexport var API_VERSION = 4;\n/**\n * Default maximum number of breadcrumbs added to an event. Can be overwritten\n * with {@link Options.maxBreadcrumbs}.\n */\nvar DEFAULT_BREADCRUMBS = 100;\n/**\n * @inheritDoc\n */\nvar Hub = /** @class */ (function () {\n    /**\n     * Creates a new instance of the hub, will push one {@link Layer} into the\n     * internal stack on creation.\n     *\n     * @param client bound to the hub.\n     * @param scope bound to the hub.\n     * @param version number, higher number means higher priority.\n     */\n    function Hub(client, scope, _version) {\n        if (scope === void 0) { scope = new Scope(); }\n        if (_version === void 0) { _version = API_VERSION; }\n        this._version = _version;\n        /** Is a {@link Layer}[] containing the client and scope */\n        this._stack = [{}];\n        this.getStackTop().scope = scope;\n        if (client) {\n            this.bindClient(client);\n        }\n    }\n    /**\n     * @inheritDoc\n     */\n    Hub.prototype.isOlderThan = function (version) {\n        return this._version < version;\n    };\n    /**\n     * @inheritDoc\n     */\n    Hub.prototype.bindClient = function (client) {\n        var top = this.getStackTop();\n        top.client = client;\n        if (client && client.setupIntegrations) {\n            client.setupIntegrations();\n        }\n    };\n    /**\n     * @inheritDoc\n     */\n    Hub.prototype.pushScope = function () {\n        // We want to clone the content of prev scope\n        var scope = Scope.clone(this.getScope());\n        this.getStack().push({\n            client: this.getClient(),\n            scope: scope,\n        });\n        return scope;\n    };\n    /**\n     * @inheritDoc\n     */\n    Hub.prototype.popScope = function () {\n        if (this.getStack().length <= 1)\n            return false;\n        return !!this.getStack().pop();\n    };\n    /**\n     * @inheritDoc\n     */\n    Hub.prototype.withScope = function (callback) {\n        var scope = this.pushScope();\n        try {\n            callback(scope);\n        }\n        finally {\n            this.popScope();\n        }\n    };\n    /**\n     * @inheritDoc\n     */\n    Hub.prototype.getClient = function () {\n        return this.getStackTop().client;\n    };\n    /** Returns the scope of the top stack. */\n    Hub.prototype.getScope = function () {\n        return this.getStackTop().scope;\n    };\n    /** Returns the scope stack for domains or the process. */\n    Hub.prototype.getStack = function () {\n        return this._stack;\n    };\n    /** Returns the topmost scope layer in the order domain > local > process. */\n    Hub.prototype.getStackTop = function () {\n        return this._stack[this._stack.length - 1];\n    };\n    /**\n     * @inheritDoc\n     */\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types\n    Hub.prototype.captureException = function (exception, hint) {\n        var eventId = (this._lastEventId = uuid4());\n        var finalHint = hint;\n        // If there's no explicit hint provided, mimic the same thing that would happen\n        // in the minimal itself to create a consistent behavior.\n        // We don't do this in the client, as it's the lowest level API, and doing this,\n        // would prevent user from having full control over direct calls.\n        if (!hint) {\n            var syntheticException = void 0;\n            try {\n                throw new Error('Sentry syntheticException');\n            }\n            catch (exception) {\n                syntheticException = exception;\n            }\n            finalHint = {\n                originalException: exception,\n                syntheticException: syntheticException,\n            };\n        }\n        this._invokeClient('captureException', exception, __assign(__assign({}, finalHint), { event_id: eventId }));\n        return eventId;\n    };\n    /**\n     * @inheritDoc\n     */\n    Hub.prototype.captureMessage = function (message, level, hint) {\n        var eventId = (this._lastEventId = uuid4());\n        var finalHint = hint;\n        // If there's no explicit hint provided, mimic the same thing that would happen\n        // in the minimal itself to create a consistent behavior.\n        // We don't do this in the client, as it's the lowest level API, and doing this,\n        // would prevent user from having full control over direct calls.\n        if (!hint) {\n            var syntheticException = void 0;\n            try {\n                throw new Error(message);\n            }\n            catch (exception) {\n                syntheticException = exception;\n            }\n            finalHint = {\n                originalException: message,\n                syntheticException: syntheticException,\n            };\n        }\n        this._invokeClient('captureMessage', message, level, __assign(__assign({}, finalHint), { event_id: eventId }));\n        return eventId;\n    };\n    /**\n     * @inheritDoc\n     */\n    Hub.prototype.captureEvent = function (event, hint) {\n        var eventId = uuid4();\n        if (event.type !== 'transaction') {\n            this._lastEventId = eventId;\n        }\n        this._invokeClient('captureEvent', event, __assign(__assign({}, hint), { event_id: eventId }));\n        return eventId;\n    };\n    /**\n     * @inheritDoc\n     */\n    Hub.prototype.lastEventId = function () {\n        return this._lastEventId;\n    };\n    /**\n     * @inheritDoc\n     */\n    Hub.prototype.addBreadcrumb = function (breadcrumb, hint) {\n        var _a = this.getStackTop(), scope = _a.scope, client = _a.client;\n        if (!scope || !client)\n            return;\n        // eslint-disable-next-line @typescript-eslint/unbound-method\n        var _b = (client.getOptions && client.getOptions()) || {}, _c = _b.beforeBreadcrumb, beforeBreadcrumb = _c === void 0 ? null : _c, _d = _b.maxBreadcrumbs, maxBreadcrumbs = _d === void 0 ? DEFAULT_BREADCRUMBS : _d;\n        if (maxBreadcrumbs <= 0)\n            return;\n        var timestamp = dateTimestampInSeconds();\n        var mergedBreadcrumb = __assign({ timestamp: timestamp }, breadcrumb);\n        var finalBreadcrumb = beforeBreadcrumb\n            ? consoleSandbox(function () { return beforeBreadcrumb(mergedBreadcrumb, hint); })\n            : mergedBreadcrumb;\n        if (finalBreadcrumb === null)\n            return;\n        scope.addBreadcrumb(finalBreadcrumb, maxBreadcrumbs);\n    };\n    /**\n     * @inheritDoc\n     */\n    Hub.prototype.setUser = function (user) {\n        var scope = this.getScope();\n        if (scope)\n            scope.setUser(user);\n    };\n    /**\n     * @inheritDoc\n     */\n    Hub.prototype.setTags = function (tags) {\n        var scope = this.getScope();\n        if (scope)\n            scope.setTags(tags);\n    };\n    /**\n     * @inheritDoc\n     */\n    Hub.prototype.setExtras = function (extras) {\n        var scope = this.getScope();\n        if (scope)\n            scope.setExtras(extras);\n    };\n    /**\n     * @inheritDoc\n     */\n    Hub.prototype.setTag = function (key, value) {\n        var scope = this.getScope();\n        if (scope)\n            scope.setTag(key, value);\n    };\n    /**\n     * @inheritDoc\n     */\n    Hub.prototype.setExtra = function (key, extra) {\n        var scope = this.getScope();\n        if (scope)\n            scope.setExtra(key, extra);\n    };\n    /**\n     * @inheritDoc\n     */\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    Hub.prototype.setContext = function (name, context) {\n        var scope = this.getScope();\n        if (scope)\n            scope.setContext(name, context);\n    };\n    /**\n     * @inheritDoc\n     */\n    Hub.prototype.configureScope = function (callback) {\n        var _a = this.getStackTop(), scope = _a.scope, client = _a.client;\n        if (scope && client) {\n            callback(scope);\n        }\n    };\n    /**\n     * @inheritDoc\n     */\n    Hub.prototype.run = function (callback) {\n        var oldHub = makeMain(this);\n        try {\n            callback(this);\n        }\n        finally {\n            makeMain(oldHub);\n        }\n    };\n    /**\n     * @inheritDoc\n     */\n    Hub.prototype.getIntegration = function (integration) {\n        var client = this.getClient();\n        if (!client)\n            return null;\n        try {\n            return client.getIntegration(integration);\n        }\n        catch (_oO) {\n            logger.warn(\"Cannot retrieve integration \" + integration.id + \" from the current Hub\");\n            return null;\n        }\n    };\n    /**\n     * @inheritDoc\n     */\n    Hub.prototype.startSpan = function (context) {\n        return this._callExtensionMethod('startSpan', context);\n    };\n    /**\n     * @inheritDoc\n     */\n    Hub.prototype.startTransaction = function (context, customSamplingContext) {\n        return this._callExtensionMethod('startTransaction', context, customSamplingContext);\n    };\n    /**\n     * @inheritDoc\n     */\n    Hub.prototype.traceHeaders = function () {\n        return this._callExtensionMethod('traceHeaders');\n    };\n    /**\n     * @inheritDoc\n     */\n    Hub.prototype.captureSession = function (endSession) {\n        if (endSession === void 0) { endSession = false; }\n        // both send the update and pull the session from the scope\n        if (endSession) {\n            return this.endSession();\n        }\n        // only send the update\n        this._sendSessionUpdate();\n    };\n    /**\n     * @inheritDoc\n     */\n    Hub.prototype.endSession = function () {\n        var layer = this.getStackTop();\n        var scope = layer && layer.scope;\n        var session = scope && scope.getSession();\n        if (session) {\n            session.close();\n        }\n        this._sendSessionUpdate();\n        // the session is over; take it off of the scope\n        if (scope) {\n            scope.setSession();\n        }\n    };\n    /**\n     * @inheritDoc\n     */\n    Hub.prototype.startSession = function (context) {\n        var _a = this.getStackTop(), scope = _a.scope, client = _a.client;\n        var _b = (client && client.getOptions()) || {}, release = _b.release, environment = _b.environment;\n        // Will fetch userAgent if called from browser sdk\n        var global = getGlobalObject();\n        var userAgent = (global.navigator || {}).userAgent;\n        var session = new Session(__assign(__assign(__assign({ release: release,\n            environment: environment }, (scope && { user: scope.getUser() })), (userAgent && { userAgent: userAgent })), context));\n        if (scope) {\n            // End existing session if there's one\n            var currentSession = scope.getSession && scope.getSession();\n            if (currentSession && currentSession.status === 'ok') {\n                currentSession.update({ status: 'exited' });\n            }\n            this.endSession();\n            // Afterwards we set the new session on the scope\n            scope.setSession(session);\n        }\n        return session;\n    };\n    /**\n     * Sends the current Session on the scope\n     */\n    Hub.prototype._sendSessionUpdate = function () {\n        var _a = this.getStackTop(), scope = _a.scope, client = _a.client;\n        if (!scope)\n            return;\n        var session = scope.getSession && scope.getSession();\n        if (session) {\n            if (client && client.captureSession) {\n                client.captureSession(session);\n            }\n        }\n    };\n    /**\n     * Internal helper function to call a method on the top client if it exists.\n     *\n     * @param method The method to call on the client.\n     * @param args Arguments to pass to the client function.\n     */\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    Hub.prototype._invokeClient = function (method) {\n        var _a;\n        var args = [];\n        for (var _i = 1; _i < arguments.length; _i++) {\n            args[_i - 1] = arguments[_i];\n        }\n        var _b = this.getStackTop(), scope = _b.scope, client = _b.client;\n        if (client && client[method]) {\n            // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-explicit-any\n            (_a = client)[method].apply(_a, __spread(args, [scope]));\n        }\n    };\n    /**\n     * Calls global extension method and binding current instance to the function call\n     */\n    // @ts-ignore Function lacks ending return statement and return type does not include 'undefined'. ts(2366)\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    Hub.prototype._callExtensionMethod = function (method) {\n        var args = [];\n        for (var _i = 1; _i < arguments.length; _i++) {\n            args[_i - 1] = arguments[_i];\n        }\n        var carrier = getMainCarrier();\n        var sentry = carrier.__SENTRY__;\n        if (sentry && sentry.extensions && typeof sentry.extensions[method] === 'function') {\n            return sentry.extensions[method].apply(this, args);\n        }\n        logger.warn(\"Extension method \" + method + \" couldn't be found, doing nothing.\");\n    };\n    return Hub;\n}());\nexport { Hub };\n/**\n * Returns the global shim registry.\n *\n * FIXME: This function is problematic, because despite always returning a valid Carrier,\n * it has an optional `__SENTRY__` property, which then in turn requires us to always perform an unnecessary check\n * at the call-site. We always access the carrier through this function, so we can guarantee that `__SENTRY__` is there.\n **/\nexport function getMainCarrier() {\n    var carrier = getGlobalObject();\n    carrier.__SENTRY__ = carrier.__SENTRY__ || {\n        extensions: {},\n        hub: undefined,\n    };\n    return carrier;\n}\n/**\n * Replaces the current main hub with the passed one on the global object\n *\n * @returns The old replaced hub\n */\nexport function makeMain(hub) {\n    var registry = getMainCarrier();\n    var oldHub = getHubFromCarrier(registry);\n    setHubOnCarrier(registry, hub);\n    return oldHub;\n}\n/**\n * Returns the default hub instance.\n *\n * If a hub is already registered in the global carrier but this module\n * contains a more recent version, it replaces the registered version.\n * Otherwise, the currently registered hub will be returned.\n */\nexport function getCurrentHub() {\n    // Get main carrier (global for every environment)\n    var registry = getMainCarrier();\n    // If there's no hub, or its an old API, assign a new one\n    if (!hasHubOnCarrier(registry) || getHubFromCarrier(registry).isOlderThan(API_VERSION)) {\n        setHubOnCarrier(registry, new Hub());\n    }\n    // Prefer domains over global if they are there (applicable only to Node environment)\n    if (isNodeEnv()) {\n        return getHubFromActiveDomain(registry);\n    }\n    // Return hub that lives on a global object\n    return getHubFromCarrier(registry);\n}\n/**\n * Returns the active domain, if one exists\n * @deprecated No longer used; remove in v7\n * @returns The domain, or undefined if there is no active domain\n */\n// eslint-disable-next-line deprecation/deprecation\nexport function getActiveDomain() {\n    logger.warn('Function `getActiveDomain` is deprecated and will be removed in a future version.');\n    var sentry = getMainCarrier().__SENTRY__;\n    return sentry && sentry.extensions && sentry.extensions.domain && sentry.extensions.domain.active;\n}\n/**\n * Try to read the hub from an active domain, and fallback to the registry if one doesn't exist\n * @returns discovered hub\n */\nfunction getHubFromActiveDomain(registry) {\n    try {\n        var sentry = getMainCarrier().__SENTRY__;\n        var activeDomain = sentry && sentry.extensions && sentry.extensions.domain && sentry.extensions.domain.active;\n        // If there's no active domain, just return global hub\n        if (!activeDomain) {\n            return getHubFromCarrier(registry);\n        }\n        // If there's no hub on current domain, or it's an old API, assign a new one\n        if (!hasHubOnCarrier(activeDomain) || getHubFromCarrier(activeDomain).isOlderThan(API_VERSION)) {\n            var registryHubTopStack = getHubFromCarrier(registry).getStackTop();\n            setHubOnCarrier(activeDomain, new Hub(registryHubTopStack.client, Scope.clone(registryHubTopStack.scope)));\n        }\n        // Return hub that lives on a domain\n        return getHubFromCarrier(activeDomain);\n    }\n    catch (_Oo) {\n        // Return hub that lives on a global object\n        return getHubFromCarrier(registry);\n    }\n}\n/**\n * This will tell whether a carrier has a hub on it or not\n * @param carrier object\n */\nfunction hasHubOnCarrier(carrier) {\n    return !!(carrier && carrier.__SENTRY__ && carrier.__SENTRY__.hub);\n}\n/**\n * This will create a new {@link Hub} and add to the passed object on\n * __SENTRY__.hub.\n * @param carrier object\n * @hidden\n */\nexport function getHubFromCarrier(carrier) {\n    if (carrier && carrier.__SENTRY__ && carrier.__SENTRY__.hub)\n        return carrier.__SENTRY__.hub;\n    carrier.__SENTRY__ = carrier.__SENTRY__ || {};\n    carrier.__SENTRY__.hub = new Hub();\n    return carrier.__SENTRY__.hub;\n}\n/**\n * This will set passed {@link Hub} on the passed object's __SENTRY__.hub attribute\n * @param carrier object\n * @param hub Hub\n * @returns A boolean indicating success or failure\n */\nexport function setHubOnCarrier(carrier, hub) {\n    if (!carrier)\n        return false;\n    carrier.__SENTRY__ = carrier.__SENTRY__ || {};\n    carrier.__SENTRY__.hub = hub;\n    return true;\n}\n//# sourceMappingURL=hub.js.map","import { __assign, __read, __spread } from \"tslib\";\nimport { getCurrentHub } from '@sentry/hub';\n/**\n * This calls a function on the current hub.\n * @param method function to call on hub.\n * @param args to pass to function.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction callOnHub(method) {\n    var args = [];\n    for (var _i = 1; _i < arguments.length; _i++) {\n        args[_i - 1] = arguments[_i];\n    }\n    var hub = getCurrentHub();\n    if (hub && hub[method]) {\n        // eslint-disable-next-line @typescript-eslint/no-explicit-any\n        return hub[method].apply(hub, __spread(args));\n    }\n    throw new Error(\"No hub defined or \" + method + \" was not found on the hub, please open a bug report.\");\n}\n/**\n * Captures an exception event and sends it to Sentry.\n *\n * @param exception An exception-like object.\n * @returns The generated eventId.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types\nexport function captureException(exception, captureContext) {\n    var syntheticException;\n    try {\n        throw new Error('Sentry syntheticException');\n    }\n    catch (exception) {\n        syntheticException = exception;\n    }\n    return callOnHub('captureException', exception, {\n        captureContext: captureContext,\n        originalException: exception,\n        syntheticException: syntheticException,\n    });\n}\n/**\n * Captures a message event and sends it to Sentry.\n *\n * @param message The message to send to Sentry.\n * @param Severity Define the level of the message.\n * @returns The generated eventId.\n */\nexport function captureMessage(message, captureContext) {\n    var syntheticException;\n    try {\n        throw new Error(message);\n    }\n    catch (exception) {\n        syntheticException = exception;\n    }\n    // This is necessary to provide explicit scopes upgrade, without changing the original\n    // arity of the `captureMessage(message, level)` method.\n    var level = typeof captureContext === 'string' ? captureContext : undefined;\n    var context = typeof captureContext !== 'string' ? { captureContext: captureContext } : undefined;\n    return callOnHub('captureMessage', message, level, __assign({ originalException: message, syntheticException: syntheticException }, context));\n}\n/**\n * Captures a manually created event and sends it to Sentry.\n *\n * @param event The event to send to Sentry.\n * @returns The generated eventId.\n */\nexport function captureEvent(event) {\n    return callOnHub('captureEvent', event);\n}\n/**\n * Callback to set context information onto the scope.\n * @param callback Callback function that receives Scope.\n */\nexport function configureScope(callback) {\n    callOnHub('configureScope', callback);\n}\n/**\n * Records a new breadcrumb which will be attached to future events.\n *\n * Breadcrumbs will be added to subsequent events to provide more context on\n * user's actions prior to an error or crash.\n *\n * @param breadcrumb The breadcrumb to record.\n */\nexport function addBreadcrumb(breadcrumb) {\n    callOnHub('addBreadcrumb', breadcrumb);\n}\n/**\n * Sets context data with the given name.\n * @param name of the context\n * @param context Any kind of data. This data will be normalized.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function setContext(name, context) {\n    callOnHub('setContext', name, context);\n}\n/**\n * Set an object that will be merged sent as extra data with the event.\n * @param extras Extras object to merge into current context.\n */\nexport function setExtras(extras) {\n    callOnHub('setExtras', extras);\n}\n/**\n * Set an object that will be merged sent as tags data with the event.\n * @param tags Tags context object to merge into current context.\n */\nexport function setTags(tags) {\n    callOnHub('setTags', tags);\n}\n/**\n * Set key:value that will be sent as extra data with the event.\n * @param key String of extra\n * @param extra Any kind of data. This data will be normalized.\n */\nexport function setExtra(key, extra) {\n    callOnHub('setExtra', key, extra);\n}\n/**\n * Set key:value that will be sent as tags data with the event.\n *\n * Can also be used to unset a tag, by passing `undefined`.\n *\n * @param key String key of tag\n * @param value Value of tag\n */\nexport function setTag(key, value) {\n    callOnHub('setTag', key, value);\n}\n/**\n * Updates user context information for future events.\n *\n * @param user User context object to be set in the current context. Pass `null` to unset the user.\n */\nexport function setUser(user) {\n    callOnHub('setUser', user);\n}\n/**\n * Creates a new scope with and executes the given operation within.\n * The scope is automatically removed once the operation\n * finishes or throws.\n *\n * This is essentially a convenience function for:\n *\n *     pushScope();\n *     callback();\n *     popScope();\n *\n * @param callback that will be enclosed into push/popScope.\n */\nexport function withScope(callback) {\n    callOnHub('withScope', callback);\n}\n/**\n * Calls a function on the latest client. Use this with caution, it's meant as\n * in \"internal\" helper so we don't need to expose every possible function in\n * the shim. It is not guaranteed that the client actually implements the\n * function.\n *\n * @param method The method to call on the client/client.\n * @param args Arguments to pass to the client/fontend.\n * @hidden\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function _callOnClient(method) {\n    var args = [];\n    for (var _i = 1; _i < arguments.length; _i++) {\n        args[_i - 1] = arguments[_i];\n    }\n    callOnHub.apply(void 0, __spread(['_invokeClient', method], args));\n}\n/**\n * Starts a new `Transaction` and returns it. This is the entry point to manual tracing instrumentation.\n *\n * A tree structure can be built by adding child spans to the transaction, and child spans to other spans. To start a\n * new child span within the transaction or any span, call the respective `.startChild()` method.\n *\n * Every child span must be finished before the transaction is finished, otherwise the unfinished spans are discarded.\n *\n * The transaction must be finished with a call to its `.finish()` method, at which point the transaction with all its\n * finished child spans will be sent to Sentry.\n *\n * @param context Properties of the new `Transaction`.\n * @param customSamplingContext Information given to the transaction sampling function (along with context-dependent\n * default values). See {@link Options.tracesSampler}.\n *\n * @returns The transaction which was just started\n */\nexport function startTransaction(context, customSamplingContext) {\n    return callOnHub('startTransaction', __assign({}, context), customSamplingContext);\n}\n//# sourceMappingURL=index.js.map","import { dsnToString, makeDsn, urlEncode } from '@sentry/utils';\nvar SENTRY_API_VERSION = '7';\n/**\n * Helper class to provide urls, headers and metadata that can be used to form\n * different types of requests to Sentry endpoints.\n * Supports both envelopes and regular event requests.\n *\n * @deprecated Please use APIDetails\n **/\nvar API = /** @class */ (function () {\n    /** Create a new instance of API */\n    function API(dsn, metadata, tunnel) {\n        if (metadata === void 0) { metadata = {}; }\n        this.dsn = dsn;\n        this._dsnObject = makeDsn(dsn);\n        this.metadata = metadata;\n        this._tunnel = tunnel;\n    }\n    /** Returns the Dsn object. */\n    API.prototype.getDsn = function () {\n        return this._dsnObject;\n    };\n    /** Does this transport force envelopes? */\n    API.prototype.forceEnvelope = function () {\n        return !!this._tunnel;\n    };\n    /** Returns the prefix to construct Sentry ingestion API endpoints. */\n    API.prototype.getBaseApiEndpoint = function () {\n        return getBaseApiEndpoint(this._dsnObject);\n    };\n    /** Returns the store endpoint URL. */\n    API.prototype.getStoreEndpoint = function () {\n        return getStoreEndpoint(this._dsnObject);\n    };\n    /**\n     * Returns the store endpoint URL with auth in the query string.\n     *\n     * Sending auth as part of the query string and not as custom HTTP headers avoids CORS preflight requests.\n     */\n    API.prototype.getStoreEndpointWithUrlEncodedAuth = function () {\n        return getStoreEndpointWithUrlEncodedAuth(this._dsnObject);\n    };\n    /**\n     * Returns the envelope endpoint URL with auth in the query string.\n     *\n     * Sending auth as part of the query string and not as custom HTTP headers avoids CORS preflight requests.\n     */\n    API.prototype.getEnvelopeEndpointWithUrlEncodedAuth = function () {\n        return getEnvelopeEndpointWithUrlEncodedAuth(this._dsnObject, this._tunnel);\n    };\n    return API;\n}());\nexport { API };\n/** Initializes API Details */\nexport function initAPIDetails(dsn, metadata, tunnel) {\n    return {\n        initDsn: dsn,\n        metadata: metadata || {},\n        dsn: makeDsn(dsn),\n        tunnel: tunnel,\n    };\n}\n/** Returns the prefix to construct Sentry ingestion API endpoints. */\nfunction getBaseApiEndpoint(dsn) {\n    var protocol = dsn.protocol ? dsn.protocol + \":\" : '';\n    var port = dsn.port ? \":\" + dsn.port : '';\n    return protocol + \"//\" + dsn.host + port + (dsn.path ? \"/\" + dsn.path : '') + \"/api/\";\n}\n/** Returns the ingest API endpoint for target. */\nfunction _getIngestEndpoint(dsn, target) {\n    return \"\" + getBaseApiEndpoint(dsn) + dsn.projectId + \"/\" + target + \"/\";\n}\n/** Returns a URL-encoded string with auth config suitable for a query string. */\nfunction _encodedAuth(dsn) {\n    return urlEncode({\n        // We send only the minimum set of required information. See\n        // https://github.com/getsentry/sentry-javascript/issues/2572.\n        sentry_key: dsn.publicKey,\n        sentry_version: SENTRY_API_VERSION,\n    });\n}\n/** Returns the store endpoint URL. */\nfunction getStoreEndpoint(dsn) {\n    return _getIngestEndpoint(dsn, 'store');\n}\n/**\n * Returns the store endpoint URL with auth in the query string.\n *\n * Sending auth as part of the query string and not as custom HTTP headers avoids CORS preflight requests.\n */\nexport function getStoreEndpointWithUrlEncodedAuth(dsn) {\n    return getStoreEndpoint(dsn) + \"?\" + _encodedAuth(dsn);\n}\n/** Returns the envelope endpoint URL. */\nfunction _getEnvelopeEndpoint(dsn) {\n    return _getIngestEndpoint(dsn, 'envelope');\n}\n/**\n * Returns the envelope endpoint URL with auth in the query string.\n *\n * Sending auth as part of the query string and not as custom HTTP headers avoids CORS preflight requests.\n */\nexport function getEnvelopeEndpointWithUrlEncodedAuth(dsn, tunnel) {\n    return tunnel ? tunnel : _getEnvelopeEndpoint(dsn) + \"?\" + _encodedAuth(dsn);\n}\n/**\n * Returns an object that can be used in request headers.\n * This is needed for node and the old /store endpoint in sentry\n */\nexport function getRequestHeaders(dsn, clientName, clientVersion) {\n    // CHANGE THIS to use metadata but keep clientName and clientVersion compatible\n    var header = [\"Sentry sentry_version=\" + SENTRY_API_VERSION];\n    header.push(\"sentry_client=\" + clientName + \"/\" + clientVersion);\n    header.push(\"sentry_key=\" + dsn.publicKey);\n    if (dsn.pass) {\n        header.push(\"sentry_secret=\" + dsn.pass);\n    }\n    return {\n        'Content-Type': 'application/json',\n        'X-Sentry-Auth': header.join(', '),\n    };\n}\n/** Returns the url to the report dialog endpoint. */\nexport function getReportDialogEndpoint(dsnLike, dialogOptions) {\n    var dsn = makeDsn(dsnLike);\n    var endpoint = getBaseApiEndpoint(dsn) + \"embed/error-page/\";\n    var encodedOptions = \"dsn=\" + dsnToString(dsn);\n    for (var key in dialogOptions) {\n        if (key === 'dsn') {\n            continue;\n        }\n        if (key === 'user') {\n            if (!dialogOptions.user) {\n                continue;\n            }\n            if (dialogOptions.user.name) {\n                encodedOptions += \"&name=\" + encodeURIComponent(dialogOptions.user.name);\n            }\n            if (dialogOptions.user.email) {\n                encodedOptions += \"&email=\" + encodeURIComponent(dialogOptions.user.email);\n            }\n        }\n        else {\n            encodedOptions += \"&\" + encodeURIComponent(key) + \"=\" + encodeURIComponent(dialogOptions[key]);\n        }\n    }\n    return endpoint + \"?\" + encodedOptions;\n}\n//# sourceMappingURL=api.js.map","/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n    extendStatics = Object.setPrototypeOf ||\r\n        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\r\n    return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n    extendStatics(d, b);\r\n    function __() { this.constructor = d; }\r\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n    __assign = Object.assign || function __assign(t) {\r\n        for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n            s = arguments[i];\r\n            for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n        }\r\n        return t;\r\n    }\r\n    return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n    var t = {};\r\n    for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n        t[p] = s[p];\r\n    if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n        for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n            if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n                t[p[i]] = s[p[i]];\r\n        }\r\n    return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n    return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n    if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n    return new (P || (P = Promise))(function (resolve, reject) {\r\n        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n        function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n        step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n    });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n    var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n    return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n    function verb(n) { return function (v) { return step([n, v]); }; }\r\n    function step(op) {\r\n        if (f) throw new TypeError(\"Generator is already executing.\");\r\n        while (_) try {\r\n            if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n            if (y = 0, t) op = [op[0] & 2, t.value];\r\n            switch (op[0]) {\r\n                case 0: case 1: t = op; break;\r\n                case 4: _.label++; return { value: op[1], done: false };\r\n                case 5: _.label++; y = op[1]; op = [0]; continue;\r\n                case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n                default:\r\n                    if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n                    if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n                    if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n                    if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n                    if (t[2]) _.ops.pop();\r\n                    _.trys.pop(); continue;\r\n            }\r\n            op = body.call(thisArg, _);\r\n        } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n        if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n    }\r\n}\r\n\r\nexport function __createBinding(o, m, k, k2) {\r\n    if (k2 === undefined) k2 = k;\r\n    o[k2] = m[k];\r\n}\r\n\r\nexport function __exportStar(m, exports) {\r\n    for (var p in m) if (p !== \"default\" && !exports.hasOwnProperty(p)) exports[p] = m[p];\r\n}\r\n\r\nexport function __values(o) {\r\n    var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n    if (m) return m.call(o);\r\n    if (o && typeof o.length === \"number\") return {\r\n        next: function () {\r\n            if (o && i >= o.length) o = void 0;\r\n            return { value: o && o[i++], done: !o };\r\n        }\r\n    };\r\n    throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n    var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n    if (!m) return o;\r\n    var i = m.call(o), r, ar = [], e;\r\n    try {\r\n        while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n    }\r\n    catch (error) { e = { error: error }; }\r\n    finally {\r\n        try {\r\n            if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n        }\r\n        finally { if (e) throw e.error; }\r\n    }\r\n    return ar;\r\n}\r\n\r\nexport function __spread() {\r\n    for (var ar = [], i = 0; i < arguments.length; i++)\r\n        ar = ar.concat(__read(arguments[i]));\r\n    return ar;\r\n}\r\n\r\nexport function __spreadArrays() {\r\n    for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n    for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n        for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n            r[k] = a[j];\r\n    return r;\r\n};\r\n\r\nexport function __await(v) {\r\n    return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n    if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n    var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n    return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n    function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n    function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n    function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n    function fulfill(value) { resume(\"next\", value); }\r\n    function reject(value) { resume(\"throw\", value); }\r\n    function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n    var i, p;\r\n    return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n    function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n    if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n    var m = o[Symbol.asyncIterator], i;\r\n    return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n    function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n    function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n    if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n    return cooked;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n    if (mod && mod.__esModule) return mod;\r\n    var result = {};\r\n    if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];\r\n    result.default = mod;\r\n    return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n    return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, privateMap) {\r\n    if (!privateMap.has(receiver)) {\r\n        throw new TypeError(\"attempted to get private field on non-instance\");\r\n    }\r\n    return privateMap.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, privateMap, value) {\r\n    if (!privateMap.has(receiver)) {\r\n        throw new TypeError(\"attempted to set private field on non-instance\");\r\n    }\r\n    privateMap.set(receiver, value);\r\n    return value;\r\n}\r\n","import { __read, __spread } from \"tslib\";\nimport { addGlobalEventProcessor, getCurrentHub } from '@sentry/hub';\nimport { addNonEnumerableProperty, logger } from '@sentry/utils';\nexport var installedIntegrations = [];\n/**\n * @private\n */\nfunction filterDuplicates(integrations) {\n    return integrations.reduce(function (acc, integrations) {\n        if (acc.every(function (accIntegration) { return integrations.name !== accIntegration.name; })) {\n            acc.push(integrations);\n        }\n        return acc;\n    }, []);\n}\n/** Gets integration to install */\nexport function getIntegrationsToSetup(options) {\n    var defaultIntegrations = (options.defaultIntegrations && __spread(options.defaultIntegrations)) || [];\n    var userIntegrations = options.integrations;\n    var integrations = __spread(filterDuplicates(defaultIntegrations));\n    if (Array.isArray(userIntegrations)) {\n        // Filter out integrations that are also included in user options\n        integrations = __spread(integrations.filter(function (integrations) {\n            return userIntegrations.every(function (userIntegration) { return userIntegration.name !== integrations.name; });\n        }), filterDuplicates(userIntegrations));\n    }\n    else if (typeof userIntegrations === 'function') {\n        integrations = userIntegrations(integrations);\n        integrations = Array.isArray(integrations) ? integrations : [integrations];\n    }\n    // Make sure that if present, `Debug` integration will always run last\n    var integrationsNames = integrations.map(function (i) { return i.name; });\n    var alwaysLastToRun = 'Debug';\n    if (integrationsNames.indexOf(alwaysLastToRun) !== -1) {\n        integrations.push.apply(integrations, __spread(integrations.splice(integrationsNames.indexOf(alwaysLastToRun), 1)));\n    }\n    return integrations;\n}\n/** Setup given integration */\nexport function setupIntegration(integration) {\n    if (installedIntegrations.indexOf(integration.name) !== -1) {\n        return;\n    }\n    integration.setupOnce(addGlobalEventProcessor, getCurrentHub);\n    installedIntegrations.push(integration.name);\n    logger.log(\"Integration installed: \" + integration.name);\n}\n/**\n * Given a list of integration instances this installs them all. When `withDefaults` is set to `true` then all default\n * integrations are added unless they were already provided before.\n * @param integrations array of integration instances\n * @param withDefault should enable default integrations\n */\nexport function setupIntegrations(options) {\n    var integrations = {};\n    getIntegrationsToSetup(options).forEach(function (integration) {\n        integrations[integration.name] = integration;\n        setupIntegration(integration);\n    });\n    // set the `initialized` flag so we don't run through the process again unecessarily; use `Object.defineProperty`\n    // because by default it creates a property which is nonenumerable, which we want since `initialized` shouldn't be\n    // considered a member of the index the way the actual integrations are\n    addNonEnumerableProperty(integrations, 'initialized', true);\n    return integrations;\n}\n//# sourceMappingURL=integration.js.map","import { __assign, __read, __spread, __values } from \"tslib\";\n/* eslint-disable max-lines */\nimport { Scope } from '@sentry/hub';\nimport { checkOrSetAlreadyCaught, dateTimestampInSeconds, isDebugBuild, isPlainObject, isPrimitive, isThenable, logger, makeDsn, normalize, rejectedSyncPromise, resolvedSyncPromise, SentryError, SyncPromise, truncate, uuid4, } from '@sentry/utils';\nimport { setupIntegrations } from './integration';\nvar ALREADY_SEEN_ERROR = \"Not capturing exception because it's already been captured.\";\n/**\n * Base implementation for all JavaScript SDK clients.\n *\n * Call the constructor with the corresponding backend constructor and options\n * specific to the client subclass. To access these options later, use\n * {@link Client.getOptions}. Also, the Backend instance is available via\n * {@link Client.getBackend}.\n *\n * If a Dsn is specified in the options, it will be parsed and stored. Use\n * {@link Client.getDsn} to retrieve the Dsn at any moment. In case the Dsn is\n * invalid, the constructor will throw a {@link SentryException}. Note that\n * without a valid Dsn, the SDK will not send any events to Sentry.\n *\n * Before sending an event via the backend, it is passed through\n * {@link BaseClient._prepareEvent} to add SDK information and scope data\n * (breadcrumbs and context). To add more custom information, override this\n * method and extend the resulting prepared event.\n *\n * To issue automatically created events (e.g. via instrumentation), use\n * {@link Client.captureEvent}. It will prepare the event and pass it through\n * the callback lifecycle. To issue auto-breadcrumbs, use\n * {@link Client.addBreadcrumb}.\n *\n * @example\n * class NodeClient extends BaseClient<NodeBackend, NodeOptions> {\n *   public constructor(options: NodeOptions) {\n *     super(NodeBackend, options);\n *   }\n *\n *   // ...\n * }\n */\nvar BaseClient = /** @class */ (function () {\n    /**\n     * Initializes this client instance.\n     *\n     * @param backendClass A constructor function to create the backend.\n     * @param options Options for the client.\n     */\n    function BaseClient(backendClass, options) {\n        /** Array of used integrations. */\n        this._integrations = {};\n        /** Number of calls being processed */\n        this._numProcessing = 0;\n        this._backend = new backendClass(options);\n        this._options = options;\n        if (options.dsn) {\n            this._dsn = makeDsn(options.dsn);\n        }\n    }\n    /**\n     * @inheritDoc\n     */\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types\n    BaseClient.prototype.captureException = function (exception, hint, scope) {\n        var _this = this;\n        // ensure we haven't captured this very object before\n        if (checkOrSetAlreadyCaught(exception)) {\n            logger.log(ALREADY_SEEN_ERROR);\n            return;\n        }\n        var eventId = hint && hint.event_id;\n        this._process(this._getBackend()\n            .eventFromException(exception, hint)\n            .then(function (event) { return _this._captureEvent(event, hint, scope); })\n            .then(function (result) {\n            eventId = result;\n        }));\n        return eventId;\n    };\n    /**\n     * @inheritDoc\n     */\n    BaseClient.prototype.captureMessage = function (message, level, hint, scope) {\n        var _this = this;\n        var eventId = hint && hint.event_id;\n        var promisedEvent = isPrimitive(message)\n            ? this._getBackend().eventFromMessage(String(message), level, hint)\n            : this._getBackend().eventFromException(message, hint);\n        this._process(promisedEvent\n            .then(function (event) { return _this._captureEvent(event, hint, scope); })\n            .then(function (result) {\n            eventId = result;\n        }));\n        return eventId;\n    };\n    /**\n     * @inheritDoc\n     */\n    BaseClient.prototype.captureEvent = function (event, hint, scope) {\n        // ensure we haven't captured this very object before\n        if (hint && hint.originalException && checkOrSetAlreadyCaught(hint.originalException)) {\n            logger.log(ALREADY_SEEN_ERROR);\n            return;\n        }\n        var eventId = hint && hint.event_id;\n        this._process(this._captureEvent(event, hint, scope).then(function (result) {\n            eventId = result;\n        }));\n        return eventId;\n    };\n    /**\n     * @inheritDoc\n     */\n    BaseClient.prototype.captureSession = function (session) {\n        if (!this._isEnabled()) {\n            if (isDebugBuild()) {\n                logger.warn('SDK not enabled, will not capture session.');\n            }\n            return;\n        }\n        if (!(typeof session.release === 'string')) {\n            if (isDebugBuild()) {\n                logger.warn('Discarded session because of missing or non-string release');\n            }\n        }\n        else {\n            this._sendSession(session);\n            // After sending, we set init false to indicate it's not the first occurrence\n            session.update({ init: false });\n        }\n    };\n    /**\n     * @inheritDoc\n     */\n    BaseClient.prototype.getDsn = function () {\n        return this._dsn;\n    };\n    /**\n     * @inheritDoc\n     */\n    BaseClient.prototype.getOptions = function () {\n        return this._options;\n    };\n    /**\n     * @inheritDoc\n     */\n    BaseClient.prototype.getTransport = function () {\n        return this._getBackend().getTransport();\n    };\n    /**\n     * @inheritDoc\n     */\n    BaseClient.prototype.flush = function (timeout) {\n        var _this = this;\n        return this._isClientDoneProcessing(timeout).then(function (clientFinished) {\n            return _this.getTransport()\n                .close(timeout)\n                .then(function (transportFlushed) { return clientFinished && transportFlushed; });\n        });\n    };\n    /**\n     * @inheritDoc\n     */\n    BaseClient.prototype.close = function (timeout) {\n        var _this = this;\n        return this.flush(timeout).then(function (result) {\n            _this.getOptions().enabled = false;\n            return result;\n        });\n    };\n    /**\n     * Sets up the integrations\n     */\n    BaseClient.prototype.setupIntegrations = function () {\n        if (this._isEnabled() && !this._integrations.initialized) {\n            this._integrations = setupIntegrations(this._options);\n        }\n    };\n    /**\n     * @inheritDoc\n     */\n    BaseClient.prototype.getIntegration = function (integration) {\n        try {\n            return this._integrations[integration.id] || null;\n        }\n        catch (_oO) {\n            logger.warn(\"Cannot retrieve integration \" + integration.id + \" from the current Client\");\n            return null;\n        }\n    };\n    /** Updates existing session based on the provided event */\n    BaseClient.prototype._updateSessionFromEvent = function (session, event) {\n        var e_1, _a;\n        var crashed = false;\n        var errored = false;\n        var exceptions = event.exception && event.exception.values;\n        if (exceptions) {\n            errored = true;\n            try {\n                for (var exceptions_1 = __values(exceptions), exceptions_1_1 = exceptions_1.next(); !exceptions_1_1.done; exceptions_1_1 = exceptions_1.next()) {\n                    var ex = exceptions_1_1.value;\n                    var mechanism = ex.mechanism;\n                    if (mechanism && mechanism.handled === false) {\n                        crashed = true;\n                        break;\n                    }\n                }\n            }\n            catch (e_1_1) { e_1 = { error: e_1_1 }; }\n            finally {\n                try {\n                    if (exceptions_1_1 && !exceptions_1_1.done && (_a = exceptions_1.return)) _a.call(exceptions_1);\n                }\n                finally { if (e_1) throw e_1.error; }\n            }\n        }\n        // A session is updated and that session update is sent in only one of the two following scenarios:\n        // 1. Session with non terminal status and 0 errors + an error occurred -> Will set error count to 1 and send update\n        // 2. Session with non terminal status and 1 error + a crash occurred -> Will set status crashed and send update\n        var sessionNonTerminal = session.status === 'ok';\n        var shouldUpdateAndSend = (sessionNonTerminal && session.errors === 0) || (sessionNonTerminal && crashed);\n        if (shouldUpdateAndSend) {\n            session.update(__assign(__assign({}, (crashed && { status: 'crashed' })), { errors: session.errors || Number(errored || crashed) }));\n            this.captureSession(session);\n        }\n    };\n    /** Deliver captured session to Sentry */\n    BaseClient.prototype._sendSession = function (session) {\n        this._getBackend().sendSession(session);\n    };\n    /**\n     * Determine if the client is finished processing. Returns a promise because it will wait `timeout` ms before saying\n     * \"no\" (resolving to `false`) in order to give the client a chance to potentially finish first.\n     *\n     * @param timeout The time, in ms, after which to resolve to `false` if the client is still busy. Passing `0` (or not\n     * passing anything) will make the promise wait as long as it takes for processing to finish before resolving to\n     * `true`.\n     * @returns A promise which will resolve to `true` if processing is already done or finishes before the timeout, and\n     * `false` otherwise\n     */\n    BaseClient.prototype._isClientDoneProcessing = function (timeout) {\n        var _this = this;\n        return new SyncPromise(function (resolve) {\n            var ticked = 0;\n            var tick = 1;\n            var interval = setInterval(function () {\n                if (_this._numProcessing == 0) {\n                    clearInterval(interval);\n                    resolve(true);\n                }\n                else {\n                    ticked += tick;\n                    if (timeout && ticked >= timeout) {\n                        clearInterval(interval);\n                        resolve(false);\n                    }\n                }\n            }, tick);\n        });\n    };\n    /** Returns the current backend. */\n    BaseClient.prototype._getBackend = function () {\n        return this._backend;\n    };\n    /** Determines whether this SDK is enabled and a valid Dsn is present. */\n    BaseClient.prototype._isEnabled = function () {\n        return this.getOptions().enabled !== false && this._dsn !== undefined;\n    };\n    /**\n     * Adds common information to events.\n     *\n     * The information includes release and environment from `options`,\n     * breadcrumbs and context (extra, tags and user) from the scope.\n     *\n     * Information that is already present in the event is never overwritten. For\n     * nested objects, such as the context, keys are merged.\n     *\n     * @param event The original event.\n     * @param hint May contain additional information about the original exception.\n     * @param scope A scope containing event metadata.\n     * @returns A new event with more information.\n     */\n    BaseClient.prototype._prepareEvent = function (event, scope, hint) {\n        var _this = this;\n        var _a = this.getOptions().normalizeDepth, normalizeDepth = _a === void 0 ? 3 : _a;\n        var prepared = __assign(__assign({}, event), { event_id: event.event_id || (hint && hint.event_id ? hint.event_id : uuid4()), timestamp: event.timestamp || dateTimestampInSeconds() });\n        this._applyClientOptions(prepared);\n        this._applyIntegrationsMetadata(prepared);\n        // If we have scope given to us, use it as the base for further modifications.\n        // This allows us to prevent unnecessary copying of data if `captureContext` is not provided.\n        var finalScope = scope;\n        if (hint && hint.captureContext) {\n            finalScope = Scope.clone(finalScope).update(hint.captureContext);\n        }\n        // We prepare the result here with a resolved Event.\n        var result = resolvedSyncPromise(prepared);\n        // This should be the last thing called, since we want that\n        // {@link Hub.addEventProcessor} gets the finished prepared event.\n        if (finalScope) {\n            // In case we have a hub we reassign it.\n            result = finalScope.applyToEvent(prepared, hint);\n        }\n        return result.then(function (evt) {\n            if (evt) {\n                // TODO this is more of the hack trying to solve https://github.com/getsentry/sentry-javascript/issues/2809\n                // it is only attached as extra data to the event if the event somehow skips being normalized\n                evt.sdkProcessingMetadata = __assign(__assign({}, evt.sdkProcessingMetadata), { normalizeDepth: normalize(normalizeDepth) });\n            }\n            if (typeof normalizeDepth === 'number' && normalizeDepth > 0) {\n                return _this._normalizeEvent(evt, normalizeDepth);\n            }\n            return evt;\n        });\n    };\n    /**\n     * Applies `normalize` function on necessary `Event` attributes to make them safe for serialization.\n     * Normalized keys:\n     * - `breadcrumbs.data`\n     * - `user`\n     * - `contexts`\n     * - `extra`\n     * @param event Event\n     * @returns Normalized event\n     */\n    BaseClient.prototype._normalizeEvent = function (event, depth) {\n        if (!event) {\n            return null;\n        }\n        var normalized = __assign(__assign(__assign(__assign(__assign({}, event), (event.breadcrumbs && {\n            breadcrumbs: event.breadcrumbs.map(function (b) { return (__assign(__assign({}, b), (b.data && {\n                data: normalize(b.data, depth),\n            }))); }),\n        })), (event.user && {\n            user: normalize(event.user, depth),\n        })), (event.contexts && {\n            contexts: normalize(event.contexts, depth),\n        })), (event.extra && {\n            extra: normalize(event.extra, depth),\n        }));\n        // event.contexts.trace stores information about a Transaction. Similarly,\n        // event.spans[] stores information about child Spans. Given that a\n        // Transaction is conceptually a Span, normalization should apply to both\n        // Transactions and Spans consistently.\n        // For now the decision is to skip normalization of Transactions and Spans,\n        // so this block overwrites the normalized event to add back the original\n        // Transaction information prior to normalization.\n        if (event.contexts && event.contexts.trace) {\n            // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n            normalized.contexts.trace = event.contexts.trace;\n        }\n        event.sdkProcessingMetadata = __assign(__assign({}, event.sdkProcessingMetadata), { baseClientNormalized: true });\n        return normalized;\n    };\n    /**\n     *  Enhances event using the client configuration.\n     *  It takes care of all \"static\" values like environment, release and `dist`,\n     *  as well as truncating overly long values.\n     * @param event event instance to be enhanced\n     */\n    BaseClient.prototype._applyClientOptions = function (event) {\n        var options = this.getOptions();\n        var environment = options.environment, release = options.release, dist = options.dist, _a = options.maxValueLength, maxValueLength = _a === void 0 ? 250 : _a;\n        if (!('environment' in event)) {\n            event.environment = 'environment' in options ? environment : 'production';\n        }\n        if (event.release === undefined && release !== undefined) {\n            event.release = release;\n        }\n        if (event.dist === undefined && dist !== undefined) {\n            event.dist = dist;\n        }\n        if (event.message) {\n            event.message = truncate(event.message, maxValueLength);\n        }\n        var exception = event.exception && event.exception.values && event.exception.values[0];\n        if (exception && exception.value) {\n            exception.value = truncate(exception.value, maxValueLength);\n        }\n        var request = event.request;\n        if (request && request.url) {\n            request.url = truncate(request.url, maxValueLength);\n        }\n    };\n    /**\n     * This function adds all used integrations to the SDK info in the event.\n     * @param event The event that will be filled with all integrations.\n     */\n    BaseClient.prototype._applyIntegrationsMetadata = function (event) {\n        var integrationsArray = Object.keys(this._integrations);\n        if (integrationsArray.length > 0) {\n            event.sdk = event.sdk || {};\n            event.sdk.integrations = __spread((event.sdk.integrations || []), integrationsArray);\n        }\n    };\n    /**\n     * Tells the backend to send this event\n     * @param event The Sentry event to send\n     */\n    BaseClient.prototype._sendEvent = function (event) {\n        this._getBackend().sendEvent(event);\n    };\n    /**\n     * Processes the event and logs an error in case of rejection\n     * @param event\n     * @param hint\n     * @param scope\n     */\n    BaseClient.prototype._captureEvent = function (event, hint, scope) {\n        return this._processEvent(event, hint, scope).then(function (finalEvent) {\n            return finalEvent.event_id;\n        }, function (reason) {\n            logger.error(reason);\n            return undefined;\n        });\n    };\n    /**\n     * Processes an event (either error or message) and sends it to Sentry.\n     *\n     * This also adds breadcrumbs and context information to the event. However,\n     * platform specific meta data (such as the User's IP address) must be added\n     * by the SDK implementor.\n     *\n     *\n     * @param event The event to send to Sentry.\n     * @param hint May contain additional information about the original exception.\n     * @param scope A scope containing event metadata.\n     * @returns A SyncPromise that resolves with the event or rejects in case event was/will not be send.\n     */\n    BaseClient.prototype._processEvent = function (event, hint, scope) {\n        var _this = this;\n        // eslint-disable-next-line @typescript-eslint/unbound-method\n        var _a = this.getOptions(), beforeSend = _a.beforeSend, sampleRate = _a.sampleRate;\n        var transport = this.getTransport();\n        function recordLostEvent(outcome, category) {\n            if (transport.recordLostEvent) {\n                transport.recordLostEvent(outcome, category);\n            }\n        }\n        if (!this._isEnabled()) {\n            return rejectedSyncPromise(new SentryError('SDK not enabled, will not capture event.'));\n        }\n        var isTransaction = event.type === 'transaction';\n        // 1.0 === 100% events are sent\n        // 0.0 === 0% events are sent\n        // Sampling for transaction happens somewhere else\n        if (!isTransaction && typeof sampleRate === 'number' && Math.random() > sampleRate) {\n            recordLostEvent('sample_rate', 'event');\n            return rejectedSyncPromise(new SentryError(\"Discarding event because it's not included in the random sample (sampling rate = \" + sampleRate + \")\"));\n        }\n        return this._prepareEvent(event, scope, hint)\n            .then(function (prepared) {\n            if (prepared === null) {\n                recordLostEvent('event_processor', event.type || 'event');\n                throw new SentryError('An event processor returned null, will not send event.');\n            }\n            var isInternalException = hint && hint.data && hint.data.__sentry__ === true;\n            if (isInternalException || isTransaction || !beforeSend) {\n                return prepared;\n            }\n            var beforeSendResult = beforeSend(prepared, hint);\n            return _ensureBeforeSendRv(beforeSendResult);\n        })\n            .then(function (processedEvent) {\n            if (processedEvent === null) {\n                recordLostEvent('before_send', event.type || 'event');\n                throw new SentryError('`beforeSend` returned `null`, will not send event.');\n            }\n            var session = scope && scope.getSession && scope.getSession();\n            if (!isTransaction && session) {\n                _this._updateSessionFromEvent(session, processedEvent);\n            }\n            _this._sendEvent(processedEvent);\n            return processedEvent;\n        })\n            .then(null, function (reason) {\n            if (reason instanceof SentryError) {\n                throw reason;\n            }\n            _this.captureException(reason, {\n                data: {\n                    __sentry__: true,\n                },\n                originalException: reason,\n            });\n            throw new SentryError(\"Event processing pipeline threw an error, original event will not be sent. Details have been sent as a new event.\\nReason: \" + reason);\n        });\n    };\n    /**\n     * Occupies the client with processing and event\n     */\n    BaseClient.prototype._process = function (promise) {\n        var _this = this;\n        this._numProcessing += 1;\n        void promise.then(function (value) {\n            _this._numProcessing -= 1;\n            return value;\n        }, function (reason) {\n            _this._numProcessing -= 1;\n            return reason;\n        });\n    };\n    return BaseClient;\n}());\nexport { BaseClient };\n/**\n * Verifies that return value of configured `beforeSend` is of expected type.\n */\nfunction _ensureBeforeSendRv(rv) {\n    var nullErr = '`beforeSend` method has to return `null` or a valid event.';\n    if (isThenable(rv)) {\n        return rv.then(function (event) {\n            if (!(isPlainObject(event) || event === null)) {\n                throw new SentryError(nullErr);\n            }\n            return event;\n        }, function (e) {\n            throw new SentryError(\"beforeSend rejected with \" + e);\n        });\n    }\n    else if (!(isPlainObject(rv) || rv === null)) {\n        throw new SentryError(nullErr);\n    }\n    return rv;\n}\n//# sourceMappingURL=baseclient.js.map","import { resolvedSyncPromise } from '@sentry/utils';\n/** Noop transport */\nvar NoopTransport = /** @class */ (function () {\n    function NoopTransport() {\n    }\n    /**\n     * @inheritDoc\n     */\n    NoopTransport.prototype.sendEvent = function (_) {\n        return resolvedSyncPromise({\n            reason: \"NoopTransport: Event has been skipped because no Dsn is configured.\",\n            status: 'skipped',\n        });\n    };\n    /**\n     * @inheritDoc\n     */\n    NoopTransport.prototype.close = function (_) {\n        return resolvedSyncPromise(true);\n    };\n    return NoopTransport;\n}());\nexport { NoopTransport };\n//# sourceMappingURL=noop.js.map","import { isDebugBuild, logger, SentryError } from '@sentry/utils';\nimport { NoopTransport } from './transports/noop';\n/**\n * This is the base implemention of a Backend.\n * @hidden\n */\nvar BaseBackend = /** @class */ (function () {\n    /** Creates a new backend instance. */\n    function BaseBackend(options) {\n        this._options = options;\n        if (!this._options.dsn) {\n            logger.warn('No DSN provided, backend will not do anything.');\n        }\n        this._transport = this._setupTransport();\n    }\n    /**\n     * @inheritDoc\n     */\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types\n    BaseBackend.prototype.eventFromException = function (_exception, _hint) {\n        throw new SentryError('Backend has to implement `eventFromException` method');\n    };\n    /**\n     * @inheritDoc\n     */\n    BaseBackend.prototype.eventFromMessage = function (_message, _level, _hint) {\n        throw new SentryError('Backend has to implement `eventFromMessage` method');\n    };\n    /**\n     * @inheritDoc\n     */\n    BaseBackend.prototype.sendEvent = function (event) {\n        void this._transport.sendEvent(event).then(null, function (reason) {\n            if (isDebugBuild()) {\n                logger.error(\"Error while sending event: \" + reason);\n            }\n        });\n    };\n    /**\n     * @inheritDoc\n     */\n    BaseBackend.prototype.sendSession = function (session) {\n        if (!this._transport.sendSession) {\n            if (isDebugBuild()) {\n                logger.warn(\"Dropping session because custom transport doesn't implement sendSession\");\n            }\n            return;\n        }\n        void this._transport.sendSession(session).then(null, function (reason) {\n            if (isDebugBuild()) {\n                logger.error(\"Error while sending session: \" + reason);\n            }\n        });\n    };\n    /**\n     * @inheritDoc\n     */\n    BaseBackend.prototype.getTransport = function () {\n        return this._transport;\n    };\n    /**\n     * Sets up the transport so it can be used later to send requests.\n     */\n    BaseBackend.prototype._setupTransport = function () {\n        return new NoopTransport();\n    };\n    return BaseBackend;\n}());\nexport { BaseBackend };\n//# sourceMappingURL=basebackend.js.map","import { __assign, __read, __spread } from \"tslib\";\nimport { dsnToString, normalize } from '@sentry/utils';\nimport { getEnvelopeEndpointWithUrlEncodedAuth, getStoreEndpointWithUrlEncodedAuth } from './api';\n/** Extract sdk info from from the API metadata */\nfunction getSdkMetadataForEnvelopeHeader(api) {\n    if (!api.metadata || !api.metadata.sdk) {\n        return;\n    }\n    var _a = api.metadata.sdk, name = _a.name, version = _a.version;\n    return { name: name, version: version };\n}\n/**\n * Apply SdkInfo (name, version, packages, integrations) to the corresponding event key.\n * Merge with existing data if any.\n **/\nfunction enhanceEventWithSdkInfo(event, sdkInfo) {\n    if (!sdkInfo) {\n        return event;\n    }\n    event.sdk = event.sdk || {};\n    event.sdk.name = event.sdk.name || sdkInfo.name;\n    event.sdk.version = event.sdk.version || sdkInfo.version;\n    event.sdk.integrations = __spread((event.sdk.integrations || []), (sdkInfo.integrations || []));\n    event.sdk.packages = __spread((event.sdk.packages || []), (sdkInfo.packages || []));\n    return event;\n}\n/** Creates a SentryRequest from a Session. */\nexport function sessionToSentryRequest(session, api) {\n    var sdkInfo = getSdkMetadataForEnvelopeHeader(api);\n    var envelopeHeaders = JSON.stringify(__assign(__assign({ sent_at: new Date().toISOString() }, (sdkInfo && { sdk: sdkInfo })), (!!api.tunnel && { dsn: dsnToString(api.dsn) })));\n    // I know this is hacky but we don't want to add `session` to request type since it's never rate limited\n    var type = 'aggregates' in session ? 'sessions' : 'session';\n    var itemHeaders = JSON.stringify({\n        type: type,\n    });\n    return {\n        body: envelopeHeaders + \"\\n\" + itemHeaders + \"\\n\" + JSON.stringify(session),\n        type: type,\n        url: getEnvelopeEndpointWithUrlEncodedAuth(api.dsn, api.tunnel),\n    };\n}\n/** Creates a SentryRequest from an event. */\nexport function eventToSentryRequest(event, api) {\n    var sdkInfo = getSdkMetadataForEnvelopeHeader(api);\n    var eventType = event.type || 'event';\n    var useEnvelope = eventType === 'transaction' || !!api.tunnel;\n    var transactionSampling = (event.sdkProcessingMetadata || {}).transactionSampling;\n    var _a = transactionSampling || {}, samplingMethod = _a.method, sampleRate = _a.rate;\n    // TODO: Below is a temporary hack in order to debug a serialization error - see\n    // https://github.com/getsentry/sentry-javascript/issues/2809,\n    // https://github.com/getsentry/sentry-javascript/pull/4425, and\n    // https://github.com/getsentry/sentry-javascript/pull/4574.\n    //\n    // TL; DR: even though we normalize all events (which should prevent this), something is causing `JSON.stringify` to\n    // throw a circular reference error.\n    //\n    // When it's time to remove it:\n    // 1. Delete everything between here and where the request object `req` is created, EXCEPT the line deleting\n    //    `sdkProcessingMetadata`\n    // 2. Restore the original version of the request body, which is commented out\n    // 3. Search for either of the PR URLs above and pull out the companion hacks in the browser playwright tests and the\n    //    baseClient tests in this package\n    enhanceEventWithSdkInfo(event, api.metadata.sdk);\n    event.tags = event.tags || {};\n    event.extra = event.extra || {};\n    // In theory, all events should be marked as having gone through normalization and so\n    // we should never set this tag/extra data\n    if (!(event.sdkProcessingMetadata && event.sdkProcessingMetadata.baseClientNormalized)) {\n        event.tags.skippedNormalization = true;\n        event.extra.normalizeDepth = event.sdkProcessingMetadata ? event.sdkProcessingMetadata.normalizeDepth : 'unset';\n    }\n    // prevent this data from being sent to sentry\n    // TODO: This is NOT part of the hack - DO NOT DELETE\n    delete event.sdkProcessingMetadata;\n    var body;\n    try {\n        // 99.9% of events should get through just fine - no change in behavior for them\n        body = JSON.stringify(event);\n    }\n    catch (err) {\n        // Record data about the error without replacing original event data, then force renormalization\n        event.tags.JSONStringifyError = true;\n        event.extra.JSONStringifyError = err;\n        try {\n            body = JSON.stringify(normalize(event));\n        }\n        catch (newErr) {\n            // At this point even renormalization hasn't worked, meaning something about the event data has gone very wrong.\n            // Time to cut our losses and record only the new error. With luck, even in the problematic cases we're trying to\n            // debug with this hack, we won't ever land here.\n            var innerErr = newErr;\n            body = JSON.stringify({\n                message: 'JSON.stringify error after renormalization',\n                // setting `extra: { innerErr }` here for some reason results in an empty object, so unpack manually\n                extra: { message: innerErr.message, stack: innerErr.stack },\n            });\n        }\n    }\n    var req = {\n        // this is the relevant line of code before the hack was added, to make it easy to undo said hack once we've solved\n        // the mystery\n        // body: JSON.stringify(sdkInfo ? enhanceEventWithSdkInfo(event, api.metadata.sdk) : event),\n        body: body,\n        type: eventType,\n        url: useEnvelope\n            ? getEnvelopeEndpointWithUrlEncodedAuth(api.dsn, api.tunnel)\n            : getStoreEndpointWithUrlEncodedAuth(api.dsn),\n    };\n    // https://develop.sentry.dev/sdk/envelopes/\n    // Since we don't need to manipulate envelopes nor store them, there is no\n    // exported concept of an Envelope with operations including serialization and\n    // deserialization. Instead, we only implement a minimal subset of the spec to\n    // serialize events inline here.\n    if (useEnvelope) {\n        var envelopeHeaders = JSON.stringify(__assign(__assign({ event_id: event.event_id, sent_at: new Date().toISOString() }, (sdkInfo && { sdk: sdkInfo })), (!!api.tunnel && { dsn: dsnToString(api.dsn) })));\n        var itemHeaders = JSON.stringify({\n            type: eventType,\n            // TODO: Right now, sampleRate may or may not be defined (it won't be in the cases of inheritance and\n            // explicitly-set sampling decisions). Are we good with that?\n            sample_rates: [{ id: samplingMethod, rate: sampleRate }],\n        });\n        // The trailing newline is optional. We intentionally don't send it to avoid\n        // sending unnecessary bytes.\n        //\n        // const envelope = `${envelopeHeaders}\\n${itemHeaders}\\n${req.body}\\n`;\n        var envelope = envelopeHeaders + \"\\n\" + itemHeaders + \"\\n\" + req.body;\n        req.body = envelope;\n    }\n    return req;\n}\n//# sourceMappingURL=request.js.map","import { getCurrentHub } from '@sentry/hub';\nimport { logger } from '@sentry/utils';\n/**\n * Internal function to create a new SDK client instance. The client is\n * installed and then bound to the current scope.\n *\n * @param clientClass The client class to instantiate.\n * @param options Options to pass to the client.\n */\nexport function initAndBind(clientClass, options) {\n    if (options.debug === true) {\n        logger.enable();\n    }\n    var hub = getCurrentHub();\n    var scope = hub.getScope();\n    if (scope) {\n        scope.update(options.initialScope);\n    }\n    var client = new clientClass(options);\n    hub.bindClient(client);\n}\n//# sourceMappingURL=sdk.js.map","export var SDK_VERSION = '6.17.9';\n//# sourceMappingURL=version.js.map","import { getOriginalFunction } from '@sentry/utils';\nvar originalFunctionToString;\n/** Patch toString calls to return proper name for wrapped functions */\nvar FunctionToString = /** @class */ (function () {\n    function FunctionToString() {\n        /**\n         * @inheritDoc\n         */\n        this.name = FunctionToString.id;\n    }\n    /**\n     * @inheritDoc\n     */\n    FunctionToString.prototype.setupOnce = function () {\n        // eslint-disable-next-line @typescript-eslint/unbound-method\n        originalFunctionToString = Function.prototype.toString;\n        // eslint-disable-next-line @typescript-eslint/no-explicit-any\n        Function.prototype.toString = function () {\n            var args = [];\n            for (var _i = 0; _i < arguments.length; _i++) {\n                args[_i] = arguments[_i];\n            }\n            var context = getOriginalFunction(this) || this;\n            return originalFunctionToString.apply(context, args);\n        };\n    };\n    /**\n     * @inheritDoc\n     */\n    FunctionToString.id = 'FunctionToString';\n    return FunctionToString;\n}());\nexport { FunctionToString };\n//# sourceMappingURL=functiontostring.js.map","import { __read, __spread } from \"tslib\";\nimport { addGlobalEventProcessor, getCurrentHub } from '@sentry/hub';\nimport { getEventDescription, isDebugBuild, isMatchingPattern, logger } from '@sentry/utils';\n// \"Script error.\" is hard coded into browsers for errors that it can't read.\n// this is the result of a script being pulled in from an external domain and CORS.\nvar DEFAULT_IGNORE_ERRORS = [/^Script error\\.?$/, /^Javascript error: Script error\\.? on line 0$/];\n/** Inbound filters configurable by the user */\nvar InboundFilters = /** @class */ (function () {\n    function InboundFilters(_options) {\n        if (_options === void 0) { _options = {}; }\n        this._options = _options;\n        /**\n         * @inheritDoc\n         */\n        this.name = InboundFilters.id;\n    }\n    /**\n     * @inheritDoc\n     */\n    InboundFilters.prototype.setupOnce = function () {\n        addGlobalEventProcessor(function (event) {\n            var hub = getCurrentHub();\n            if (!hub) {\n                return event;\n            }\n            var self = hub.getIntegration(InboundFilters);\n            if (self) {\n                var client = hub.getClient();\n                var clientOptions = client ? client.getOptions() : {};\n                // This checks prevents most of the occurrences of the bug linked below:\n                // https://github.com/getsentry/sentry-javascript/issues/2622\n                // The bug is caused by multiple SDK instances, where one is minified and one is using non-mangled code.\n                // Unfortunatelly we cannot fix it reliably (thus reserved property in rollup's terser config),\n                // as we cannot force people using multiple instances in their apps to sync SDK versions.\n                var options = typeof self._mergeOptions === 'function' ? self._mergeOptions(clientOptions) : {};\n                if (typeof self._shouldDropEvent !== 'function') {\n                    return event;\n                }\n                return self._shouldDropEvent(event, options) ? null : event;\n            }\n            return event;\n        });\n    };\n    /** JSDoc */\n    InboundFilters.prototype._shouldDropEvent = function (event, options) {\n        if (this._isSentryError(event, options)) {\n            if (isDebugBuild()) {\n                logger.warn(\"Event dropped due to being internal Sentry Error.\\nEvent: \" + getEventDescription(event));\n            }\n            return true;\n        }\n        if (this._isIgnoredError(event, options)) {\n            if (isDebugBuild()) {\n                logger.warn(\"Event dropped due to being matched by `ignoreErrors` option.\\nEvent: \" + getEventDescription(event));\n            }\n            return true;\n        }\n        if (this._isDeniedUrl(event, options)) {\n            if (isDebugBuild()) {\n                logger.warn(\"Event dropped due to being matched by `denyUrls` option.\\nEvent: \" + getEventDescription(event) + \".\\nUrl: \" + this._getEventFilterUrl(event));\n            }\n            return true;\n        }\n        if (!this._isAllowedUrl(event, options)) {\n            if (isDebugBuild()) {\n                logger.warn(\"Event dropped due to not being matched by `allowUrls` option.\\nEvent: \" + getEventDescription(event) + \".\\nUrl: \" + this._getEventFilterUrl(event));\n            }\n            return true;\n        }\n        return false;\n    };\n    /** JSDoc */\n    InboundFilters.prototype._isSentryError = function (event, options) {\n        if (!options.ignoreInternal) {\n            return false;\n        }\n        try {\n            // @ts-ignore can't be a sentry error if undefined\n            // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n            return event.exception.values[0].type === 'SentryError';\n        }\n        catch (e) {\n            // ignore\n        }\n        return false;\n    };\n    /** JSDoc */\n    InboundFilters.prototype._isIgnoredError = function (event, options) {\n        if (!options.ignoreErrors || !options.ignoreErrors.length) {\n            return false;\n        }\n        return this._getPossibleEventMessages(event).some(function (message) {\n            // Not sure why TypeScript complains here...\n            return options.ignoreErrors.some(function (pattern) { return isMatchingPattern(message, pattern); });\n        });\n    };\n    /** JSDoc */\n    InboundFilters.prototype._isDeniedUrl = function (event, options) {\n        // TODO: Use Glob instead?\n        if (!options.denyUrls || !options.denyUrls.length) {\n            return false;\n        }\n        var url = this._getEventFilterUrl(event);\n        return !url ? false : options.denyUrls.some(function (pattern) { return isMatchingPattern(url, pattern); });\n    };\n    /** JSDoc */\n    InboundFilters.prototype._isAllowedUrl = function (event, options) {\n        // TODO: Use Glob instead?\n        if (!options.allowUrls || !options.allowUrls.length) {\n            return true;\n        }\n        var url = this._getEventFilterUrl(event);\n        return !url ? true : options.allowUrls.some(function (pattern) { return isMatchingPattern(url, pattern); });\n    };\n    /** JSDoc */\n    InboundFilters.prototype._mergeOptions = function (clientOptions) {\n        if (clientOptions === void 0) { clientOptions = {}; }\n        return {\n            allowUrls: __spread((this._options.whitelistUrls || []), (this._options.allowUrls || []), (clientOptions.whitelistUrls || []), (clientOptions.allowUrls || [])),\n            denyUrls: __spread((this._options.blacklistUrls || []), (this._options.denyUrls || []), (clientOptions.blacklistUrls || []), (clientOptions.denyUrls || [])),\n            ignoreErrors: __spread((this._options.ignoreErrors || []), (clientOptions.ignoreErrors || []), DEFAULT_IGNORE_ERRORS),\n            ignoreInternal: typeof this._options.ignoreInternal !== 'undefined' ? this._options.ignoreInternal : true,\n        };\n    };\n    /** JSDoc */\n    InboundFilters.prototype._getPossibleEventMessages = function (event) {\n        if (event.message) {\n            return [event.message];\n        }\n        if (event.exception) {\n            try {\n                var _a = (event.exception.values && event.exception.values[0]) || {}, _b = _a.type, type = _b === void 0 ? '' : _b, _c = _a.value, value = _c === void 0 ? '' : _c;\n                return [\"\" + value, type + \": \" + value];\n            }\n            catch (oO) {\n                if (isDebugBuild()) {\n                    logger.error(\"Cannot extract message for event \" + getEventDescription(event));\n                }\n                return [];\n            }\n        }\n        return [];\n    };\n    /** JSDoc */\n    InboundFilters.prototype._getLastValidUrl = function (frames) {\n        if (frames === void 0) { frames = []; }\n        for (var i = frames.length - 1; i >= 0; i--) {\n            var frame = frames[i];\n            if (frame && frame.filename !== '<anonymous>' && frame.filename !== '[native code]') {\n                return frame.filename || null;\n            }\n        }\n        return null;\n    };\n    /** JSDoc */\n    InboundFilters.prototype._getEventFilterUrl = function (event) {\n        try {\n            if (event.stacktrace) {\n                return this._getLastValidUrl(event.stacktrace.frames);\n            }\n            var frames_1;\n            try {\n                // @ts-ignore we only care about frames if the whole thing here is defined\n                frames_1 = event.exception.values[0].stacktrace.frames;\n            }\n            catch (e) {\n                // ignore\n            }\n            return frames_1 ? this._getLastValidUrl(frames_1) : null;\n        }\n        catch (oO) {\n            if (isDebugBuild()) {\n                logger.error(\"Cannot extract url for event \" + getEventDescription(event));\n            }\n            return null;\n        }\n    };\n    /**\n     * @inheritDoc\n     */\n    InboundFilters.id = 'InboundFilters';\n    return InboundFilters;\n}());\nexport { InboundFilters };\n//# sourceMappingURL=inboundfilters.js.map","import { __read } from \"tslib\";\n// global reference to slice\nvar UNKNOWN_FUNCTION = '?';\nfunction createFrame(filename, func, lineno, colno) {\n    var frame = {\n        filename: filename,\n        function: func,\n        // All browser frames are considered in_app\n        in_app: true,\n    };\n    if (lineno !== undefined) {\n        frame.lineno = lineno;\n    }\n    if (colno !== undefined) {\n        frame.colno = colno;\n    }\n    return frame;\n}\n// Chromium based browsers: Chrome, Brave, new Opera, new Edge\nvar chromeRegex = /^\\s*at (?:(.*?) ?\\((?:address at )?)?((?:file|https?|blob|chrome-extension|address|native|eval|webpack|<anonymous>|[-a-z]+:|.*bundle|\\/).*?)(?::(\\d+))?(?::(\\d+))?\\)?\\s*$/i;\nvar chromeEvalRegex = /\\((\\S*)(?::(\\d+))(?::(\\d+))\\)/;\nexport var chrome = function (line) {\n    var parts = chromeRegex.exec(line);\n    if (parts) {\n        var isEval = parts[2] && parts[2].indexOf('eval') === 0; // start of line\n        if (isEval) {\n            var subMatch = chromeEvalRegex.exec(parts[2]);\n            if (subMatch) {\n                // throw out eval line/column and use top-most line/column number\n                parts[2] = subMatch[1]; // url\n                parts[3] = subMatch[2]; // line\n                parts[4] = subMatch[3]; // column\n            }\n        }\n        // Kamil: One more hack won't hurt us right? Understanding and adding more rules on top of these regexps right now\n        // would be way too time consuming. (TODO: Rewrite whole RegExp to be more readable)\n        var _a = __read(extractSafariExtensionDetails(parts[1] || UNKNOWN_FUNCTION, parts[2]), 2), func = _a[0], filename = _a[1];\n        return createFrame(filename, func, parts[3] ? +parts[3] : undefined, parts[4] ? +parts[4] : undefined);\n    }\n    return;\n};\n// gecko regex: `(?:bundle|\\d+\\.js)`: `bundle` is for react native, `\\d+\\.js` also but specifically for ram bundles because it\n// generates filenames without a prefix like `file://` the filenames in the stacktrace are just 42.js\n// We need this specific case for now because we want no other regex to match.\nvar geckoREgex = /^\\s*(.*?)(?:\\((.*?)\\))?(?:^|@)?((?:file|https?|blob|chrome|webpack|resource|moz-extension|capacitor).*?:\\/.*?|\\[native code\\]|[^@]*(?:bundle|\\d+\\.js)|\\/[\\w\\-. /=]+)(?::(\\d+))?(?::(\\d+))?\\s*$/i;\nvar geckoEvalRegex = /(\\S+) line (\\d+)(?: > eval line \\d+)* > eval/i;\nexport var gecko = function (line) {\n    var _a;\n    var parts = geckoREgex.exec(line);\n    if (parts) {\n        var isEval = parts[3] && parts[3].indexOf(' > eval') > -1;\n        if (isEval) {\n            var subMatch = geckoEvalRegex.exec(parts[3]);\n            if (subMatch) {\n                // throw out eval line/column and use top-most line number\n                parts[1] = parts[1] || \"eval\";\n                parts[3] = subMatch[1];\n                parts[4] = subMatch[2];\n                parts[5] = ''; // no column when eval\n            }\n        }\n        var filename = parts[3];\n        var func = parts[1] || UNKNOWN_FUNCTION;\n        _a = __read(extractSafariExtensionDetails(func, filename), 2), func = _a[0], filename = _a[1];\n        return createFrame(filename, func, parts[4] ? +parts[4] : undefined, parts[5] ? +parts[5] : undefined);\n    }\n    return;\n};\nvar winjsRegex = /^\\s*at (?:((?:\\[object object\\])?.+) )?\\(?((?:file|ms-appx|https?|webpack|blob):.*?):(\\d+)(?::(\\d+))?\\)?\\s*$/i;\nexport var winjs = function (line) {\n    var parts = winjsRegex.exec(line);\n    return parts\n        ? createFrame(parts[2], parts[1] || UNKNOWN_FUNCTION, +parts[3], parts[4] ? +parts[4] : undefined)\n        : undefined;\n};\nvar opera10Regex = / line (\\d+).*script (?:in )?(\\S+)(?:: in function (\\S+))?$/i;\nexport var opera10 = function (line) {\n    var parts = opera10Regex.exec(line);\n    return parts ? createFrame(parts[2], parts[3] || UNKNOWN_FUNCTION, +parts[1]) : undefined;\n};\nvar opera11Regex = / line (\\d+), column (\\d+)\\s*(?:in (?:<anonymous function: ([^>]+)>|([^)]+))\\(.*\\))? in (.*):\\s*$/i;\nexport var opera11 = function (line) {\n    var parts = opera11Regex.exec(line);\n    return parts ? createFrame(parts[5], parts[3] || parts[4] || UNKNOWN_FUNCTION, +parts[1], +parts[2]) : undefined;\n};\n/**\n * Safari web extensions, starting version unknown, can produce \"frames-only\" stacktraces.\n * What it means, is that instead of format like:\n *\n * Error: wat\n *   at function@url:row:col\n *   at function@url:row:col\n *   at function@url:row:col\n *\n * it produces something like:\n *\n *   function@url:row:col\n *   function@url:row:col\n *   function@url:row:col\n *\n * Because of that, it won't be captured by `chrome` RegExp and will fall into `Gecko` branch.\n * This function is extracted so that we can use it in both places without duplicating the logic.\n * Unfortunately \"just\" changing RegExp is too complicated now and making it pass all tests\n * and fix this case seems like an impossible, or at least way too time-consuming task.\n */\nvar extractSafariExtensionDetails = function (func, filename) {\n    var isSafariExtension = func.indexOf('safari-extension') !== -1;\n    var isSafariWebExtension = func.indexOf('safari-web-extension') !== -1;\n    return isSafariExtension || isSafariWebExtension\n        ? [\n            func.indexOf('@') !== -1 ? func.split('@')[0] : UNKNOWN_FUNCTION,\n            isSafariExtension ? \"safari-extension:\" + filename : \"safari-web-extension:\" + filename,\n        ]\n        : [func, filename];\n};\n//# sourceMappingURL=stack-parsers.js.map","import { createStackParser, extractExceptionKeysForMessage, isEvent, normalizeToSize } from '@sentry/utils';\nimport { chrome, gecko, opera10, opera11, winjs } from './stack-parsers';\n/**\n * This function creates an exception from an TraceKitStackTrace\n * @param stacktrace TraceKitStackTrace that will be converted to an exception\n * @hidden\n */\nexport function exceptionFromError(ex) {\n    // Get the frames first since Opera can lose the stack if we touch anything else first\n    var frames = parseStackFrames(ex);\n    var exception = {\n        type: ex && ex.name,\n        value: extractMessage(ex),\n    };\n    if (frames && frames.length) {\n        exception.stacktrace = { frames: frames };\n    }\n    if (exception.type === undefined && exception.value === '') {\n        exception.value = 'Unrecoverable error caught';\n    }\n    return exception;\n}\n/**\n * @hidden\n */\nexport function eventFromPlainObject(exception, syntheticException, rejection) {\n    var event = {\n        exception: {\n            values: [\n                {\n                    type: isEvent(exception) ? exception.constructor.name : rejection ? 'UnhandledRejection' : 'Error',\n                    value: \"Non-Error \" + (rejection ? 'promise rejection' : 'exception') + \" captured with keys: \" + extractExceptionKeysForMessage(exception),\n                },\n            ],\n        },\n        extra: {\n            __serialized__: normalizeToSize(exception),\n        },\n    };\n    if (syntheticException) {\n        event.stacktrace = {\n            frames: parseStackFrames(syntheticException),\n        };\n    }\n    return event;\n}\n/**\n * @hidden\n */\nexport function eventFromError(ex) {\n    return {\n        exception: {\n            values: [exceptionFromError(ex)],\n        },\n    };\n}\n/** Parses stack frames from an error */\nexport function parseStackFrames(ex) {\n    // Access and store the stacktrace property before doing ANYTHING\n    // else to it because Opera is not very good at providing it\n    // reliably in other circumstances.\n    var stacktrace = ex.stacktrace || ex.stack || '';\n    var popSize = getPopSize(ex);\n    try {\n        // The order of the parsers in important\n        return createStackParser(opera10, opera11, chrome, winjs, gecko)(stacktrace, popSize);\n    }\n    catch (e) {\n        // no-empty\n    }\n    return [];\n}\n// Based on our own mapping pattern - https://github.com/getsentry/sentry/blob/9f08305e09866c8bd6d0c24f5b0aabdd7dd6c59c/src/sentry/lang/javascript/errormapping.py#L83-L108\nvar reactMinifiedRegexp = /Minified React error #\\d+;/i;\nfunction getPopSize(ex) {\n    if (ex) {\n        if (typeof ex.framesToPop === 'number') {\n            return ex.framesToPop;\n        }\n        if (reactMinifiedRegexp.test(ex.message)) {\n            return 1;\n        }\n    }\n    return 0;\n}\n/**\n * There are cases where stacktrace.message is an Event object\n * https://github.com/getsentry/sentry-javascript/issues/1949\n * In this specific case we try to extract stacktrace.message.error.message\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction extractMessage(ex) {\n    var message = ex && ex.message;\n    if (!message) {\n        return 'No error message';\n    }\n    if (message.error && typeof message.error.message === 'string') {\n        return message.error.message;\n    }\n    return message;\n}\n//# sourceMappingURL=parsers.js.map","import { __assign } from \"tslib\";\nimport { Severity } from '@sentry/types';\nimport { addExceptionMechanism, addExceptionTypeValue, isDOMError, isDOMException, isError, isErrorEvent, isEvent, isPlainObject, resolvedSyncPromise, } from '@sentry/utils';\nimport { eventFromError, eventFromPlainObject, parseStackFrames } from './parsers';\n/**\n * Creates an {@link Event} from all inputs to `captureException` and non-primitive inputs to `captureMessage`.\n * @hidden\n */\nexport function eventFromException(options, exception, hint) {\n    var syntheticException = (hint && hint.syntheticException) || undefined;\n    var event = eventFromUnknownInput(exception, syntheticException, {\n        attachStacktrace: options.attachStacktrace,\n    });\n    addExceptionMechanism(event); // defaults to { type: 'generic', handled: true }\n    event.level = Severity.Error;\n    if (hint && hint.event_id) {\n        event.event_id = hint.event_id;\n    }\n    return resolvedSyncPromise(event);\n}\n/**\n * Builds and Event from a Message\n * @hidden\n */\nexport function eventFromMessage(options, message, level, hint) {\n    if (level === void 0) { level = Severity.Info; }\n    var syntheticException = (hint && hint.syntheticException) || undefined;\n    var event = eventFromString(message, syntheticException, {\n        attachStacktrace: options.attachStacktrace,\n    });\n    event.level = level;\n    if (hint && hint.event_id) {\n        event.event_id = hint.event_id;\n    }\n    return resolvedSyncPromise(event);\n}\n/**\n * @hidden\n */\nexport function eventFromUnknownInput(exception, syntheticException, options) {\n    if (options === void 0) { options = {}; }\n    var event;\n    if (isErrorEvent(exception) && exception.error) {\n        // If it is an ErrorEvent with `error` property, extract it to get actual Error\n        var errorEvent = exception;\n        return eventFromError(errorEvent.error);\n    }\n    // If it is a `DOMError` (which is a legacy API, but still supported in some browsers) then we just extract the name\n    // and message, as it doesn't provide anything else. According to the spec, all `DOMExceptions` should also be\n    // `Error`s, but that's not the case in IE11, so in that case we treat it the same as we do a `DOMError`.\n    //\n    // https://developer.mozilla.org/en-US/docs/Web/API/DOMError\n    // https://developer.mozilla.org/en-US/docs/Web/API/DOMException\n    // https://webidl.spec.whatwg.org/#es-DOMException-specialness\n    if (isDOMError(exception) || isDOMException(exception)) {\n        var domException = exception;\n        if ('stack' in exception) {\n            event = eventFromError(exception);\n        }\n        else {\n            var name_1 = domException.name || (isDOMError(domException) ? 'DOMError' : 'DOMException');\n            var message = domException.message ? name_1 + \": \" + domException.message : name_1;\n            event = eventFromString(message, syntheticException, options);\n            addExceptionTypeValue(event, message);\n        }\n        if ('code' in domException) {\n            event.tags = __assign(__assign({}, event.tags), { 'DOMException.code': \"\" + domException.code });\n        }\n        return event;\n    }\n    if (isError(exception)) {\n        // we have a real Error object, do nothing\n        return eventFromError(exception);\n    }\n    if (isPlainObject(exception) || isEvent(exception)) {\n        // If it's a plain object or an instance of `Event` (the built-in JS kind, not this SDK's `Event` type), serialize\n        // it manually. This will allow us to group events based on top-level keys which is much better than creating a new\n        // group on any key/value change.\n        var objectException = exception;\n        event = eventFromPlainObject(objectException, syntheticException, options.isRejection);\n        addExceptionMechanism(event, {\n            synthetic: true,\n        });\n        return event;\n    }\n    // If none of previous checks were valid, then it means that it's not:\n    // - an instance of DOMError\n    // - an instance of DOMException\n    // - an instance of Event\n    // - an instance of Error\n    // - a valid ErrorEvent (one with an error property)\n    // - a plain Object\n    //\n    // So bail out and capture it as a simple message:\n    event = eventFromString(exception, syntheticException, options);\n    addExceptionTypeValue(event, \"\" + exception, undefined);\n    addExceptionMechanism(event, {\n        synthetic: true,\n    });\n    return event;\n}\n/**\n * @hidden\n */\nexport function eventFromString(input, syntheticException, options) {\n    if (options === void 0) { options = {}; }\n    var event = {\n        message: input,\n    };\n    if (options.attachStacktrace && syntheticException) {\n        event.stacktrace = {\n            frames: parseStackFrames(syntheticException),\n        };\n    }\n    return event;\n}\n//# sourceMappingURL=eventbuilder.js.map","import { forget, getGlobalObject, isDebugBuild, isNativeFetch, logger, supportsFetch } from '@sentry/utils';\nvar global = getGlobalObject();\nvar cachedFetchImpl;\n/**\n * A special usecase for incorrectly wrapped Fetch APIs in conjunction with ad-blockers.\n * Whenever someone wraps the Fetch API and returns the wrong promise chain,\n * this chain becomes orphaned and there is no possible way to capture it's rejections\n * other than allowing it bubble up to this very handler. eg.\n *\n * const f = window.fetch;\n * window.fetch = function () {\n *   const p = f.apply(this, arguments);\n *\n *   p.then(function() {\n *     console.log('hi.');\n *   });\n *\n *   return p;\n * }\n *\n * `p.then(function () { ... })` is producing a completely separate promise chain,\n * however, what's returned is `p` - the result of original `fetch` call.\n *\n * This mean, that whenever we use the Fetch API to send our own requests, _and_\n * some ad-blocker blocks it, this orphaned chain will _always_ reject,\n * effectively causing another event to be captured.\n * This makes a whole process become an infinite loop, which we need to somehow\n * deal with, and break it in one way or another.\n *\n * To deal with this issue, we are making sure that we _always_ use the real\n * browser Fetch API, instead of relying on what `window.fetch` exposes.\n * The only downside to this would be missing our own requests as breadcrumbs,\n * but because we are already not doing this, it should be just fine.\n *\n * Possible failed fetch error messages per-browser:\n *\n * Chrome:  Failed to fetch\n * Edge:    Failed to Fetch\n * Firefox: NetworkError when attempting to fetch resource\n * Safari:  resource blocked by content blocker\n */\nexport function getNativeFetchImplementation() {\n    if (cachedFetchImpl) {\n        return cachedFetchImpl;\n    }\n    /* eslint-disable @typescript-eslint/unbound-method */\n    // Fast path to avoid DOM I/O\n    if (isNativeFetch(global.fetch)) {\n        return (cachedFetchImpl = global.fetch.bind(global));\n    }\n    var document = global.document;\n    var fetchImpl = global.fetch;\n    // eslint-disable-next-line deprecation/deprecation\n    if (document && typeof document.createElement === \"function\") {\n        try {\n            var sandbox = document.createElement('iframe');\n            sandbox.hidden = true;\n            document.head.appendChild(sandbox);\n            var contentWindow = sandbox.contentWindow;\n            if (contentWindow && contentWindow.fetch) {\n                fetchImpl = contentWindow.fetch;\n            }\n            document.head.removeChild(sandbox);\n        }\n        catch (e) {\n            if (isDebugBuild()) {\n                logger.warn('Could not create sandbox iframe for pure fetch check, bailing to window.fetch: ', e);\n            }\n        }\n    }\n    return (cachedFetchImpl = fetchImpl.bind(global));\n    /* eslint-enable @typescript-eslint/unbound-method */\n}\n/**\n * Sends sdk client report using sendBeacon or fetch as a fallback if available\n *\n * @param url report endpoint\n * @param body report payload\n */\nexport function sendReport(url, body) {\n    var isRealNavigator = Object.prototype.toString.call(global && global.navigator) === '[object Navigator]';\n    var hasSendBeacon = isRealNavigator && typeof global.navigator.sendBeacon === 'function';\n    if (hasSendBeacon) {\n        // Prevent illegal invocations - https://xgwang.me/posts/you-may-not-know-beacon/#it-may-throw-error%2C-be-sure-to-catch\n        var sendBeacon = global.navigator.sendBeacon.bind(global.navigator);\n        return sendBeacon(url, body);\n    }\n    if (supportsFetch()) {\n        var fetch_1 = getNativeFetchImplementation();\n        return forget(fetch_1(url, {\n            body: body,\n            method: 'POST',\n            credentials: 'omit',\n            keepalive: true,\n        }));\n    }\n}\n//# sourceMappingURL=utils.js.map","import { __assign, __read, __values } from \"tslib\";\nimport { eventToSentryRequest, getEnvelopeEndpointWithUrlEncodedAuth, getStoreEndpointWithUrlEncodedAuth, initAPIDetails, sessionToSentryRequest, } from '@sentry/core';\nimport { dateTimestampInSeconds, dsnToString, eventStatusFromHttpCode, getGlobalObject, isDebugBuild, logger, makePromiseBuffer, parseRetryAfterHeader, } from '@sentry/utils';\nimport { sendReport } from './utils';\nfunction requestTypeToCategory(ty) {\n    var tyStr = ty;\n    return tyStr === 'event' ? 'error' : tyStr;\n}\nvar global = getGlobalObject();\n/** Base Transport class implementation */\nvar BaseTransport = /** @class */ (function () {\n    function BaseTransport(options) {\n        var _this = this;\n        this.options = options;\n        /** A simple buffer holding all requests. */\n        this._buffer = makePromiseBuffer(30);\n        /** Locks transport after receiving rate limits in a response */\n        this._rateLimits = {};\n        this._outcomes = {};\n        this._api = initAPIDetails(options.dsn, options._metadata, options.tunnel);\n        // eslint-disable-next-line deprecation/deprecation\n        this.url = getStoreEndpointWithUrlEncodedAuth(this._api.dsn);\n        if (this.options.sendClientReports && global.document) {\n            global.document.addEventListener('visibilitychange', function () {\n                if (global.document.visibilityState === 'hidden') {\n                    _this._flushOutcomes();\n                }\n            });\n        }\n    }\n    /**\n     * @inheritDoc\n     */\n    BaseTransport.prototype.sendEvent = function (event) {\n        return this._sendRequest(eventToSentryRequest(event, this._api), event);\n    };\n    /**\n     * @inheritDoc\n     */\n    BaseTransport.prototype.sendSession = function (session) {\n        return this._sendRequest(sessionToSentryRequest(session, this._api), session);\n    };\n    /**\n     * @inheritDoc\n     */\n    BaseTransport.prototype.close = function (timeout) {\n        return this._buffer.drain(timeout);\n    };\n    /**\n     * @inheritDoc\n     */\n    BaseTransport.prototype.recordLostEvent = function (reason, category) {\n        var _a;\n        if (!this.options.sendClientReports) {\n            return;\n        }\n        // We want to track each category (event, transaction, session) separately\n        // but still keep the distinction between different type of outcomes.\n        // We could use nested maps, but it's much easier to read and type this way.\n        // A correct type for map-based implementation if we want to go that route\n        // would be `Partial<Record<SentryRequestType, Partial<Record<Outcome, number>>>>`\n        var key = requestTypeToCategory(category) + \":\" + reason;\n        logger.log(\"Adding outcome: \" + key);\n        this._outcomes[key] = (_a = this._outcomes[key], (_a !== null && _a !== void 0 ? _a : 0)) + 1;\n    };\n    /**\n     * Send outcomes as an envelope\n     */\n    BaseTransport.prototype._flushOutcomes = function () {\n        if (!this.options.sendClientReports) {\n            return;\n        }\n        var outcomes = this._outcomes;\n        this._outcomes = {};\n        // Nothing to send\n        if (!Object.keys(outcomes).length) {\n            logger.log('No outcomes to flush');\n            return;\n        }\n        logger.log(\"Flushing outcomes:\\n\" + JSON.stringify(outcomes, null, 2));\n        var url = getEnvelopeEndpointWithUrlEncodedAuth(this._api.dsn, this._api.tunnel);\n        // Envelope header is required to be at least an empty object\n        var envelopeHeader = JSON.stringify(__assign({}, (this._api.tunnel && { dsn: dsnToString(this._api.dsn) })));\n        var itemHeaders = JSON.stringify({\n            type: 'client_report',\n        });\n        var item = JSON.stringify({\n            timestamp: dateTimestampInSeconds(),\n            discarded_events: Object.keys(outcomes).map(function (key) {\n                var _a = __read(key.split(':'), 2), category = _a[0], reason = _a[1];\n                return {\n                    reason: reason,\n                    category: category,\n                    quantity: outcomes[key],\n                };\n            }),\n        });\n        var envelope = envelopeHeader + \"\\n\" + itemHeaders + \"\\n\" + item;\n        try {\n            sendReport(url, envelope);\n        }\n        catch (e) {\n            logger.error(e);\n        }\n    };\n    /**\n     * Handle Sentry repsonse for promise-based transports.\n     */\n    BaseTransport.prototype._handleResponse = function (_a) {\n        var requestType = _a.requestType, response = _a.response, headers = _a.headers, resolve = _a.resolve, reject = _a.reject;\n        var status = eventStatusFromHttpCode(response.status);\n        /**\n         * \"The name is case-insensitive.\"\n         * https://developer.mozilla.org/en-US/docs/Web/API/Headers/get\n         */\n        var limited = this._handleRateLimit(headers);\n        if (limited && isDebugBuild()) {\n            logger.warn(\"Too many \" + requestType + \" requests, backing off until: \" + this._disabledUntil(requestType));\n        }\n        if (status === 'success') {\n            resolve({ status: status });\n            return;\n        }\n        reject(response);\n    };\n    /**\n     * Gets the time that given category is disabled until for rate limiting\n     */\n    BaseTransport.prototype._disabledUntil = function (requestType) {\n        var category = requestTypeToCategory(requestType);\n        return this._rateLimits[category] || this._rateLimits.all;\n    };\n    /**\n     * Checks if a category is rate limited\n     */\n    BaseTransport.prototype._isRateLimited = function (requestType) {\n        return this._disabledUntil(requestType) > new Date(Date.now());\n    };\n    /**\n     * Sets internal _rateLimits from incoming headers. Returns true if headers contains a non-empty rate limiting header.\n     */\n    BaseTransport.prototype._handleRateLimit = function (headers) {\n        var e_1, _a, e_2, _b;\n        var now = Date.now();\n        var rlHeader = headers['x-sentry-rate-limits'];\n        var raHeader = headers['retry-after'];\n        if (rlHeader) {\n            try {\n                // rate limit headers are of the form\n                //     <header>,<header>,..\n                // where each <header> is of the form\n                //     <retry_after>: <categories>: <scope>: <reason_code>\n                // where\n                //     <retry_after> is a delay in ms\n                //     <categories> is the event type(s) (error, transaction, etc) being rate limited and is of the form\n                //         <category>;<category>;...\n                //     <scope> is what's being limited (org, project, or key) - ignored by SDK\n                //     <reason_code> is an arbitrary string like \"org_quota\" - ignored by SDK\n                for (var _c = __values(rlHeader.trim().split(',')), _d = _c.next(); !_d.done; _d = _c.next()) {\n                    var limit = _d.value;\n                    var parameters = limit.split(':', 2);\n                    var headerDelay = parseInt(parameters[0], 10);\n                    var delay = (!isNaN(headerDelay) ? headerDelay : 60) * 1000; // 60sec default\n                    try {\n                        for (var _e = (e_2 = void 0, __values(parameters[1].split(';'))), _f = _e.next(); !_f.done; _f = _e.next()) {\n                            var category = _f.value;\n                            this._rateLimits[category || 'all'] = new Date(now + delay);\n                        }\n                    }\n                    catch (e_2_1) { e_2 = { error: e_2_1 }; }\n                    finally {\n                        try {\n                            if (_f && !_f.done && (_b = _e.return)) _b.call(_e);\n                        }\n                        finally { if (e_2) throw e_2.error; }\n                    }\n                }\n            }\n            catch (e_1_1) { e_1 = { error: e_1_1 }; }\n            finally {\n                try {\n                    if (_d && !_d.done && (_a = _c.return)) _a.call(_c);\n                }\n                finally { if (e_1) throw e_1.error; }\n            }\n            return true;\n        }\n        else if (raHeader) {\n            this._rateLimits.all = new Date(now + parseRetryAfterHeader(now, raHeader));\n            return true;\n        }\n        return false;\n    };\n    return BaseTransport;\n}());\nexport { BaseTransport };\n//# sourceMappingURL=base.js.map","import { __extends } from \"tslib\";\nimport { SentryError, supportsReferrerPolicy, SyncPromise } from '@sentry/utils';\nimport { BaseTransport } from './base';\nimport { getNativeFetchImplementation } from './utils';\n/** `fetch` based transport */\nvar FetchTransport = /** @class */ (function (_super) {\n    __extends(FetchTransport, _super);\n    function FetchTransport(options, fetchImpl) {\n        if (fetchImpl === void 0) { fetchImpl = getNativeFetchImplementation(); }\n        var _this = _super.call(this, options) || this;\n        _this._fetch = fetchImpl;\n        return _this;\n    }\n    /**\n     * @param sentryRequest Prepared SentryRequest to be delivered\n     * @param originalPayload Original payload used to create SentryRequest\n     */\n    FetchTransport.prototype._sendRequest = function (sentryRequest, originalPayload) {\n        var _this = this;\n        if (this._isRateLimited(sentryRequest.type)) {\n            this.recordLostEvent('ratelimit_backoff', sentryRequest.type);\n            return Promise.reject({\n                event: originalPayload,\n                type: sentryRequest.type,\n                reason: \"Transport for \" + sentryRequest.type + \" requests locked till \" + this._disabledUntil(sentryRequest.type) + \" due to too many requests.\",\n                status: 429,\n            });\n        }\n        var options = {\n            body: sentryRequest.body,\n            method: 'POST',\n            // Despite all stars in the sky saying that Edge supports old draft syntax, aka 'never', 'always', 'origin' and 'default'\n            // (see https://caniuse.com/#feat=referrer-policy),\n            // it doesn't. And it throws an exception instead of ignoring this parameter...\n            // REF: https://github.com/getsentry/raven-js/issues/1233\n            referrerPolicy: (supportsReferrerPolicy() ? 'origin' : ''),\n        };\n        if (this.options.fetchParameters !== undefined) {\n            Object.assign(options, this.options.fetchParameters);\n        }\n        if (this.options.headers !== undefined) {\n            options.headers = this.options.headers;\n        }\n        return this._buffer\n            .add(function () {\n            return new SyncPromise(function (resolve, reject) {\n                void _this._fetch(sentryRequest.url, options)\n                    .then(function (response) {\n                    var headers = {\n                        'x-sentry-rate-limits': response.headers.get('X-Sentry-Rate-Limits'),\n                        'retry-after': response.headers.get('Retry-After'),\n                    };\n                    _this._handleResponse({\n                        requestType: sentryRequest.type,\n                        response: response,\n                        headers: headers,\n                        resolve: resolve,\n                        reject: reject,\n                    });\n                })\n                    .catch(reject);\n            });\n        })\n            .then(undefined, function (reason) {\n            // It's either buffer rejection or any other xhr/fetch error, which are treated as NetworkError.\n            if (reason instanceof SentryError) {\n                _this.recordLostEvent('queue_overflow', sentryRequest.type);\n            }\n            else {\n                _this.recordLostEvent('network_error', sentryRequest.type);\n            }\n            throw reason;\n        });\n    };\n    return FetchTransport;\n}(BaseTransport));\nexport { FetchTransport };\n//# sourceMappingURL=fetch.js.map","import { __extends } from \"tslib\";\nimport { SentryError, SyncPromise } from '@sentry/utils';\nimport { BaseTransport } from './base';\n/** `XHR` based transport */\nvar XHRTransport = /** @class */ (function (_super) {\n    __extends(XHRTransport, _super);\n    function XHRTransport() {\n        return _super !== null && _super.apply(this, arguments) || this;\n    }\n    /**\n     * @param sentryRequest Prepared SentryRequest to be delivered\n     * @param originalPayload Original payload used to create SentryRequest\n     */\n    XHRTransport.prototype._sendRequest = function (sentryRequest, originalPayload) {\n        var _this = this;\n        if (this._isRateLimited(sentryRequest.type)) {\n            this.recordLostEvent('ratelimit_backoff', sentryRequest.type);\n            return Promise.reject({\n                event: originalPayload,\n                type: sentryRequest.type,\n                reason: \"Transport for \" + sentryRequest.type + \" requests locked till \" + this._disabledUntil(sentryRequest.type) + \" due to too many requests.\",\n                status: 429,\n            });\n        }\n        return this._buffer\n            .add(function () {\n            return new SyncPromise(function (resolve, reject) {\n                var request = new XMLHttpRequest();\n                request.onreadystatechange = function () {\n                    if (request.readyState === 4) {\n                        var headers = {\n                            'x-sentry-rate-limits': request.getResponseHeader('X-Sentry-Rate-Limits'),\n                            'retry-after': request.getResponseHeader('Retry-After'),\n                        };\n                        _this._handleResponse({ requestType: sentryRequest.type, response: request, headers: headers, resolve: resolve, reject: reject });\n                    }\n                };\n                request.open('POST', sentryRequest.url);\n                for (var header in _this.options.headers) {\n                    if (Object.prototype.hasOwnProperty.call(_this.options.headers, header)) {\n                        request.setRequestHeader(header, _this.options.headers[header]);\n                    }\n                }\n                request.send(sentryRequest.body);\n            });\n        })\n            .then(undefined, function (reason) {\n            // It's either buffer rejection or any other xhr/fetch error, which are treated as NetworkError.\n            if (reason instanceof SentryError) {\n                _this.recordLostEvent('queue_overflow', sentryRequest.type);\n            }\n            else {\n                _this.recordLostEvent('network_error', sentryRequest.type);\n            }\n            throw reason;\n        });\n    };\n    return XHRTransport;\n}(BaseTransport));\nexport { XHRTransport };\n//# sourceMappingURL=xhr.js.map","import { __assign, __extends } from \"tslib\";\nimport { BaseBackend } from '@sentry/core';\nimport { Severity } from '@sentry/types';\nimport { supportsFetch } from '@sentry/utils';\nimport { eventFromException, eventFromMessage } from './eventbuilder';\nimport { FetchTransport, XHRTransport } from './transports';\n/**\n * The Sentry Browser SDK Backend.\n * @hidden\n */\nvar BrowserBackend = /** @class */ (function (_super) {\n    __extends(BrowserBackend, _super);\n    function BrowserBackend() {\n        return _super !== null && _super.apply(this, arguments) || this;\n    }\n    /**\n     * @inheritDoc\n     */\n    BrowserBackend.prototype.eventFromException = function (exception, hint) {\n        return eventFromException(this._options, exception, hint);\n    };\n    /**\n     * @inheritDoc\n     */\n    BrowserBackend.prototype.eventFromMessage = function (message, level, hint) {\n        if (level === void 0) { level = Severity.Info; }\n        return eventFromMessage(this._options, message, level, hint);\n    };\n    /**\n     * @inheritDoc\n     */\n    BrowserBackend.prototype._setupTransport = function () {\n        if (!this._options.dsn) {\n            // We return the noop transport here in case there is no Dsn.\n            return _super.prototype._setupTransport.call(this);\n        }\n        var transportOptions = __assign(__assign({}, this._options.transportOptions), { dsn: this._options.dsn, tunnel: this._options.tunnel, sendClientReports: this._options.sendClientReports, _metadata: this._options._metadata });\n        if (this._options.transport) {\n            return new this._options.transport(transportOptions);\n        }\n        if (supportsFetch()) {\n            return new FetchTransport(transportOptions);\n        }\n        return new XHRTransport(transportOptions);\n    };\n    return BrowserBackend;\n}(BaseBackend));\nexport { BrowserBackend };\n//# sourceMappingURL=backend.js.map","import { __assign } from \"tslib\";\nimport { captureException, getReportDialogEndpoint, withScope } from '@sentry/core';\nimport { addExceptionMechanism, addExceptionTypeValue, addNonEnumerableProperty, getGlobalObject, getOriginalFunction, isDebugBuild, logger, markFunctionWrapped, } from '@sentry/utils';\nvar global = getGlobalObject();\nvar ignoreOnError = 0;\n/**\n * @hidden\n */\nexport function shouldIgnoreOnError() {\n    return ignoreOnError > 0;\n}\n/**\n * @hidden\n */\nexport function ignoreNextOnError() {\n    // onerror should trigger before setTimeout\n    ignoreOnError += 1;\n    setTimeout(function () {\n        ignoreOnError -= 1;\n    });\n}\n/**\n * Instruments the given function and sends an event to Sentry every time the\n * function throws an exception.\n *\n * @param fn A function to wrap.\n * @returns The wrapped function.\n * @hidden\n */\nexport function wrap(fn, options, before) {\n    // for future readers what this does is wrap a function and then create\n    // a bi-directional wrapping between them.\n    //\n    // example: wrapped = wrap(original);\n    //  original.__sentry_wrapped__ -> wrapped\n    //  wrapped.__sentry_original__ -> original\n    if (options === void 0) { options = {}; }\n    if (typeof fn !== 'function') {\n        return fn;\n    }\n    try {\n        // if we're dealing with a function that was previously wrapped, return\n        // the original wrapper.\n        var wrapper = fn.__sentry_wrapped__;\n        if (wrapper) {\n            return wrapper;\n        }\n        // We don't wanna wrap it twice\n        if (getOriginalFunction(fn)) {\n            return fn;\n        }\n    }\n    catch (e) {\n        // Just accessing custom props in some Selenium environments\n        // can cause a \"Permission denied\" exception (see raven-js#495).\n        // Bail on wrapping and return the function as-is (defers to window.onerror).\n        return fn;\n    }\n    /* eslint-disable prefer-rest-params */\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    var sentryWrapped = function () {\n        var args = Array.prototype.slice.call(arguments);\n        try {\n            if (before && typeof before === 'function') {\n                before.apply(this, arguments);\n            }\n            // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-member-access\n            var wrappedArguments = args.map(function (arg) { return wrap(arg, options); });\n            // Attempt to invoke user-land function\n            // NOTE: If you are a Sentry user, and you are seeing this stack frame, it\n            //       means the sentry.javascript SDK caught an error invoking your application code. This\n            //       is expected behavior and NOT indicative of a bug with sentry.javascript.\n            return fn.apply(this, wrappedArguments);\n        }\n        catch (ex) {\n            ignoreNextOnError();\n            withScope(function (scope) {\n                scope.addEventProcessor(function (event) {\n                    if (options.mechanism) {\n                        addExceptionTypeValue(event, undefined, undefined);\n                        addExceptionMechanism(event, options.mechanism);\n                    }\n                    event.extra = __assign(__assign({}, event.extra), { arguments: args });\n                    return event;\n                });\n                captureException(ex);\n            });\n            throw ex;\n        }\n    };\n    /* eslint-enable prefer-rest-params */\n    // Accessing some objects may throw\n    // ref: https://github.com/getsentry/sentry-javascript/issues/1168\n    try {\n        for (var property in fn) {\n            if (Object.prototype.hasOwnProperty.call(fn, property)) {\n                sentryWrapped[property] = fn[property];\n            }\n        }\n    }\n    catch (_oO) { } // eslint-disable-line no-empty\n    // Signal that this function has been wrapped/filled already\n    // for both debugging and to prevent it to being wrapped/filled twice\n    markFunctionWrapped(sentryWrapped, fn);\n    addNonEnumerableProperty(fn, '__sentry_wrapped__', sentryWrapped);\n    // Restore original function name (not all browsers allow that)\n    try {\n        var descriptor = Object.getOwnPropertyDescriptor(sentryWrapped, 'name');\n        if (descriptor.configurable) {\n            Object.defineProperty(sentryWrapped, 'name', {\n                get: function () {\n                    return fn.name;\n                },\n            });\n        }\n        // eslint-disable-next-line no-empty\n    }\n    catch (_oO) { }\n    return sentryWrapped;\n}\n/**\n * Injects the Report Dialog script\n * @hidden\n */\nexport function injectReportDialog(options) {\n    if (options === void 0) { options = {}; }\n    if (!global.document) {\n        return;\n    }\n    if (!options.eventId) {\n        if (isDebugBuild()) {\n            logger.error(\"Missing eventId option in showReportDialog call\");\n        }\n        return;\n    }\n    if (!options.dsn) {\n        if (isDebugBuild()) {\n            logger.error(\"Missing dsn option in showReportDialog call\");\n        }\n        return;\n    }\n    var script = global.document.createElement('script');\n    script.async = true;\n    script.src = getReportDialogEndpoint(options.dsn, options);\n    if (options.onLoad) {\n        // eslint-disable-next-line @typescript-eslint/unbound-method\n        script.onload = options.onLoad;\n    }\n    var injectionPoint = global.document.head || global.document.body;\n    if (injectionPoint) {\n        injectionPoint.appendChild(script);\n    }\n}\n//# sourceMappingURL=helpers.js.map","import { __assign, __read } from \"tslib\";\n/* eslint-disable @typescript-eslint/no-unsafe-member-access */\nimport { getCurrentHub } from '@sentry/core';\nimport { Severity } from '@sentry/types';\nimport { addExceptionMechanism, addInstrumentationHandler, getLocationHref, isDebugBuild, isErrorEvent, isPrimitive, isString, logger, } from '@sentry/utils';\nimport { eventFromUnknownInput } from '../eventbuilder';\nimport { shouldIgnoreOnError } from '../helpers';\n/** Global handlers */\nvar GlobalHandlers = /** @class */ (function () {\n    /** JSDoc */\n    function GlobalHandlers(options) {\n        /**\n         * @inheritDoc\n         */\n        this.name = GlobalHandlers.id;\n        /**\n         * Stores references functions to installing handlers. Will set to undefined\n         * after they have been run so that they are not used twice.\n         */\n        this._installFunc = {\n            onerror: _installGlobalOnErrorHandler,\n            onunhandledrejection: _installGlobalOnUnhandledRejectionHandler,\n        };\n        this._options = __assign({ onerror: true, onunhandledrejection: true }, options);\n    }\n    /**\n     * @inheritDoc\n     */\n    GlobalHandlers.prototype.setupOnce = function () {\n        Error.stackTraceLimit = 50;\n        var options = this._options;\n        // We can disable guard-for-in as we construct the options object above + do checks against\n        // `this._installFunc` for the property.\n        // eslint-disable-next-line guard-for-in\n        for (var key in options) {\n            var installFunc = this._installFunc[key];\n            if (installFunc && options[key]) {\n                globalHandlerLog(key);\n                installFunc();\n                this._installFunc[key] = undefined;\n            }\n        }\n    };\n    /**\n     * @inheritDoc\n     */\n    GlobalHandlers.id = 'GlobalHandlers';\n    return GlobalHandlers;\n}());\nexport { GlobalHandlers };\n/** JSDoc */\nfunction _installGlobalOnErrorHandler() {\n    addInstrumentationHandler('error', \n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    function (data) {\n        var _a = __read(getHubAndAttachStacktrace(), 2), hub = _a[0], attachStacktrace = _a[1];\n        if (!hub.getIntegration(GlobalHandlers)) {\n            return;\n        }\n        var msg = data.msg, url = data.url, line = data.line, column = data.column, error = data.error;\n        if (shouldIgnoreOnError() || (error && error.__sentry_own_request__)) {\n            return;\n        }\n        var event = error === undefined && isString(msg)\n            ? _eventFromIncompleteOnError(msg, url, line, column)\n            : _enhanceEventWithInitialFrame(eventFromUnknownInput(error || msg, undefined, {\n                attachStacktrace: attachStacktrace,\n                isRejection: false,\n            }), url, line, column);\n        event.level = Severity.Error;\n        addMechanismAndCapture(hub, error, event, 'onerror');\n    });\n}\n/** JSDoc */\nfunction _installGlobalOnUnhandledRejectionHandler() {\n    addInstrumentationHandler('unhandledrejection', \n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    function (e) {\n        var _a = __read(getHubAndAttachStacktrace(), 2), hub = _a[0], attachStacktrace = _a[1];\n        if (!hub.getIntegration(GlobalHandlers)) {\n            return;\n        }\n        var error = e;\n        // dig the object of the rejection out of known event types\n        try {\n            // PromiseRejectionEvents store the object of the rejection under 'reason'\n            // see https://developer.mozilla.org/en-US/docs/Web/API/PromiseRejectionEvent\n            if ('reason' in e) {\n                error = e.reason;\n            }\n            // something, somewhere, (likely a browser extension) effectively casts PromiseRejectionEvents\n            // to CustomEvents, moving the `promise` and `reason` attributes of the PRE into\n            // the CustomEvent's `detail` attribute, since they're not part of CustomEvent's spec\n            // see https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent and\n            // https://github.com/getsentry/sentry-javascript/issues/2380\n            else if ('detail' in e && 'reason' in e.detail) {\n                error = e.detail.reason;\n            }\n        }\n        catch (_oO) {\n            // no-empty\n        }\n        if (shouldIgnoreOnError() || (error && error.__sentry_own_request__)) {\n            return true;\n        }\n        var event = isPrimitive(error)\n            ? _eventFromRejectionWithPrimitive(error)\n            : eventFromUnknownInput(error, undefined, {\n                attachStacktrace: attachStacktrace,\n                isRejection: true,\n            });\n        event.level = Severity.Error;\n        addMechanismAndCapture(hub, error, event, 'onunhandledrejection');\n        return;\n    });\n}\n/**\n * Create an event from a promise rejection where the `reason` is a primitive.\n *\n * @param reason: The `reason` property of the promise rejection\n * @returns An Event object with an appropriate `exception` value\n */\nfunction _eventFromRejectionWithPrimitive(reason) {\n    return {\n        exception: {\n            values: [\n                {\n                    type: 'UnhandledRejection',\n                    // String() is needed because the Primitive type includes symbols (which can't be automatically stringified)\n                    value: \"Non-Error promise rejection captured with value: \" + String(reason),\n                },\n            ],\n        },\n    };\n}\n/**\n * This function creates a stack from an old, error-less onerror handler.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction _eventFromIncompleteOnError(msg, url, line, column) {\n    var ERROR_TYPES_RE = /^(?:[Uu]ncaught (?:exception: )?)?(?:((?:Eval|Internal|Range|Reference|Syntax|Type|URI|)Error): )?(.*)$/i;\n    // If 'message' is ErrorEvent, get real message from inside\n    var message = isErrorEvent(msg) ? msg.message : msg;\n    var name = 'Error';\n    var groups = message.match(ERROR_TYPES_RE);\n    if (groups) {\n        name = groups[1];\n        message = groups[2];\n    }\n    var event = {\n        exception: {\n            values: [\n                {\n                    type: name,\n                    value: message,\n                },\n            ],\n        },\n    };\n    return _enhanceEventWithInitialFrame(event, url, line, column);\n}\n/** JSDoc */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction _enhanceEventWithInitialFrame(event, url, line, column) {\n    // event.exception\n    var e = (event.exception = event.exception || {});\n    // event.exception.values\n    var ev = (e.values = e.values || []);\n    // event.exception.values[0]\n    var ev0 = (ev[0] = ev[0] || {});\n    // event.exception.values[0].stacktrace\n    var ev0s = (ev0.stacktrace = ev0.stacktrace || {});\n    // event.exception.values[0].stacktrace.frames\n    var ev0sf = (ev0s.frames = ev0s.frames || []);\n    var colno = isNaN(parseInt(column, 10)) ? undefined : column;\n    var lineno = isNaN(parseInt(line, 10)) ? undefined : line;\n    var filename = isString(url) && url.length > 0 ? url : getLocationHref();\n    // event.exception.values[0].stacktrace.frames\n    if (ev0sf.length === 0) {\n        ev0sf.push({\n            colno: colno,\n            filename: filename,\n            function: '?',\n            in_app: true,\n            lineno: lineno,\n        });\n    }\n    return event;\n}\nfunction globalHandlerLog(type) {\n    if (isDebugBuild()) {\n        logger.log(\"Global Handler attached: \" + type);\n    }\n}\nfunction addMechanismAndCapture(hub, error, event, type) {\n    addExceptionMechanism(event, {\n        handled: false,\n        type: type,\n    });\n    hub.captureEvent(event, {\n        originalException: error,\n    });\n}\nfunction getHubAndAttachStacktrace() {\n    var hub = getCurrentHub();\n    var client = hub.getClient();\n    var attachStacktrace = client && client.getOptions().attachStacktrace;\n    return [hub, attachStacktrace];\n}\n//# sourceMappingURL=globalhandlers.js.map","import { __assign } from \"tslib\";\nimport { fill, getFunctionName, getGlobalObject, getOriginalFunction } from '@sentry/utils';\nimport { wrap } from '../helpers';\nvar DEFAULT_EVENT_TARGET = [\n    'EventTarget',\n    'Window',\n    'Node',\n    'ApplicationCache',\n    'AudioTrackList',\n    'ChannelMergerNode',\n    'CryptoOperation',\n    'EventSource',\n    'FileReader',\n    'HTMLUnknownElement',\n    'IDBDatabase',\n    'IDBRequest',\n    'IDBTransaction',\n    'KeyOperation',\n    'MediaController',\n    'MessagePort',\n    'ModalWindow',\n    'Notification',\n    'SVGElementInstance',\n    'Screen',\n    'TextTrack',\n    'TextTrackCue',\n    'TextTrackList',\n    'WebSocket',\n    'WebSocketWorker',\n    'Worker',\n    'XMLHttpRequest',\n    'XMLHttpRequestEventTarget',\n    'XMLHttpRequestUpload',\n];\n/** Wrap timer functions and event targets to catch errors and provide better meta data */\nvar TryCatch = /** @class */ (function () {\n    /**\n     * @inheritDoc\n     */\n    function TryCatch(options) {\n        /**\n         * @inheritDoc\n         */\n        this.name = TryCatch.id;\n        this._options = __assign({ XMLHttpRequest: true, eventTarget: true, requestAnimationFrame: true, setInterval: true, setTimeout: true }, options);\n    }\n    /**\n     * Wrap timer functions and event targets to catch errors\n     * and provide better metadata.\n     */\n    TryCatch.prototype.setupOnce = function () {\n        var global = getGlobalObject();\n        if (this._options.setTimeout) {\n            fill(global, 'setTimeout', _wrapTimeFunction);\n        }\n        if (this._options.setInterval) {\n            fill(global, 'setInterval', _wrapTimeFunction);\n        }\n        if (this._options.requestAnimationFrame) {\n            fill(global, 'requestAnimationFrame', _wrapRAF);\n        }\n        if (this._options.XMLHttpRequest && 'XMLHttpRequest' in global) {\n            fill(XMLHttpRequest.prototype, 'send', _wrapXHR);\n        }\n        var eventTargetOption = this._options.eventTarget;\n        if (eventTargetOption) {\n            var eventTarget = Array.isArray(eventTargetOption) ? eventTargetOption : DEFAULT_EVENT_TARGET;\n            eventTarget.forEach(_wrapEventTarget);\n        }\n    };\n    /**\n     * @inheritDoc\n     */\n    TryCatch.id = 'TryCatch';\n    return TryCatch;\n}());\nexport { TryCatch };\n/** JSDoc */\nfunction _wrapTimeFunction(original) {\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    return function () {\n        var args = [];\n        for (var _i = 0; _i < arguments.length; _i++) {\n            args[_i] = arguments[_i];\n        }\n        var originalCallback = args[0];\n        args[0] = wrap(originalCallback, {\n            mechanism: {\n                data: { function: getFunctionName(original) },\n                handled: true,\n                type: 'instrument',\n            },\n        });\n        return original.apply(this, args);\n    };\n}\n/** JSDoc */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction _wrapRAF(original) {\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    return function (callback) {\n        // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n        return original.call(this, wrap(callback, {\n            mechanism: {\n                data: {\n                    function: 'requestAnimationFrame',\n                    handler: getFunctionName(original),\n                },\n                handled: true,\n                type: 'instrument',\n            },\n        }));\n    };\n}\n/** JSDoc */\nfunction _wrapXHR(originalSend) {\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    return function () {\n        var args = [];\n        for (var _i = 0; _i < arguments.length; _i++) {\n            args[_i] = arguments[_i];\n        }\n        // eslint-disable-next-line @typescript-eslint/no-this-alias\n        var xhr = this;\n        var xmlHttpRequestProps = ['onload', 'onerror', 'onprogress', 'onreadystatechange'];\n        xmlHttpRequestProps.forEach(function (prop) {\n            if (prop in xhr && typeof xhr[prop] === 'function') {\n                // eslint-disable-next-line @typescript-eslint/no-explicit-any\n                fill(xhr, prop, function (original) {\n                    var wrapOptions = {\n                        mechanism: {\n                            data: {\n                                function: prop,\n                                handler: getFunctionName(original),\n                            },\n                            handled: true,\n                            type: 'instrument',\n                        },\n                    };\n                    // If Instrument integration has been called before TryCatch, get the name of original function\n                    var originalFunction = getOriginalFunction(original);\n                    if (originalFunction) {\n                        wrapOptions.mechanism.data.handler = getFunctionName(originalFunction);\n                    }\n                    // Otherwise wrap directly\n                    return wrap(original, wrapOptions);\n                });\n            }\n        });\n        return originalSend.apply(this, args);\n    };\n}\n/** JSDoc */\nfunction _wrapEventTarget(target) {\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    var global = getGlobalObject();\n    // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n    var proto = global[target] && global[target].prototype;\n    // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, no-prototype-builtins\n    if (!proto || !proto.hasOwnProperty || !proto.hasOwnProperty('addEventListener')) {\n        return;\n    }\n    fill(proto, 'addEventListener', function (original) {\n        return function (eventName, fn, options) {\n            try {\n                if (typeof fn.handleEvent === 'function') {\n                    fn.handleEvent = wrap(fn.handleEvent.bind(fn), {\n                        mechanism: {\n                            data: {\n                                function: 'handleEvent',\n                                handler: getFunctionName(fn),\n                                target: target,\n                            },\n                            handled: true,\n                            type: 'instrument',\n                        },\n                    });\n                }\n            }\n            catch (err) {\n                // can sometimes get 'Permission denied to access property \"handle Event'\n            }\n            return original.call(this, eventName, \n            // eslint-disable-next-line @typescript-eslint/no-explicit-any\n            wrap(fn, {\n                mechanism: {\n                    data: {\n                        function: 'addEventListener',\n                        handler: getFunctionName(fn),\n                        target: target,\n                    },\n                    handled: true,\n                    type: 'instrument',\n                },\n            }), options);\n        };\n    });\n    fill(proto, 'removeEventListener', function (originalRemoveEventListener) {\n        return function (eventName, fn, options) {\n            /**\n             * There are 2 possible scenarios here:\n             *\n             * 1. Someone passes a callback, which was attached prior to Sentry initialization, or by using unmodified\n             * method, eg. `document.addEventListener.call(el, name, handler). In this case, we treat this function\n             * as a pass-through, and call original `removeEventListener` with it.\n             *\n             * 2. Someone passes a callback, which was attached after Sentry was initialized, which means that it was using\n             * our wrapped version of `addEventListener`, which internally calls `wrap` helper.\n             * This helper \"wraps\" whole callback inside a try/catch statement, and attached appropriate metadata to it,\n             * in order for us to make a distinction between wrapped/non-wrapped functions possible.\n             * If a function was wrapped, it has additional property of `__sentry_wrapped__`, holding the handler.\n             *\n             * When someone adds a handler prior to initialization, and then do it again, but after,\n             * then we have to detach both of them. Otherwise, if we'd detach only wrapped one, it'd be impossible\n             * to get rid of the initial handler and it'd stick there forever.\n             */\n            var wrappedEventHandler = fn;\n            try {\n                var originalEventHandler = wrappedEventHandler && wrappedEventHandler.__sentry_wrapped__;\n                if (originalEventHandler) {\n                    originalRemoveEventListener.call(this, eventName, originalEventHandler, options);\n                }\n            }\n            catch (e) {\n                // ignore, accessing __sentry_wrapped__ will throw in some Selenium environments\n            }\n            return originalRemoveEventListener.call(this, eventName, wrappedEventHandler, options);\n        };\n    });\n}\n//# sourceMappingURL=trycatch.js.map","import { __assign } from \"tslib\";\n/* eslint-disable @typescript-eslint/no-unsafe-member-access */\n/* eslint-disable max-lines */\nimport { getCurrentHub } from '@sentry/core';\nimport { Severity } from '@sentry/types';\nimport { addInstrumentationHandler, getEventDescription, getGlobalObject, htmlTreeAsString, parseUrl, safeJoin, severityFromString, } from '@sentry/utils';\n/**\n * Default Breadcrumbs instrumentations\n * TODO: Deprecated - with v6, this will be renamed to `Instrument`\n */\nvar Breadcrumbs = /** @class */ (function () {\n    /**\n     * @inheritDoc\n     */\n    function Breadcrumbs(options) {\n        /**\n         * @inheritDoc\n         */\n        this.name = Breadcrumbs.id;\n        this._options = __assign({ console: true, dom: true, fetch: true, history: true, sentry: true, xhr: true }, options);\n    }\n    /**\n     * Create a breadcrumb of `sentry` from the events themselves\n     */\n    Breadcrumbs.prototype.addSentryBreadcrumb = function (event) {\n        if (!this._options.sentry) {\n            return;\n        }\n        getCurrentHub().addBreadcrumb({\n            category: \"sentry.\" + (event.type === 'transaction' ? 'transaction' : 'event'),\n            event_id: event.event_id,\n            level: event.level,\n            message: getEventDescription(event),\n        }, {\n            event: event,\n        });\n    };\n    /**\n     * Instrument browser built-ins w/ breadcrumb capturing\n     *  - Console API\n     *  - DOM API (click/typing)\n     *  - XMLHttpRequest API\n     *  - Fetch API\n     *  - History API\n     */\n    Breadcrumbs.prototype.setupOnce = function () {\n        if (this._options.console) {\n            addInstrumentationHandler('console', _consoleBreadcrumb);\n        }\n        if (this._options.dom) {\n            addInstrumentationHandler('dom', _domBreadcrumb(this._options.dom));\n        }\n        if (this._options.xhr) {\n            addInstrumentationHandler('xhr', _xhrBreadcrumb);\n        }\n        if (this._options.fetch) {\n            addInstrumentationHandler('fetch', _fetchBreadcrumb);\n        }\n        if (this._options.history) {\n            addInstrumentationHandler('history', _historyBreadcrumb);\n        }\n    };\n    /**\n     * @inheritDoc\n     */\n    Breadcrumbs.id = 'Breadcrumbs';\n    return Breadcrumbs;\n}());\nexport { Breadcrumbs };\n/**\n * A HOC that creaes a function that creates breadcrumbs from DOM API calls.\n * This is a HOC so that we get access to dom options in the closure.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction _domBreadcrumb(dom) {\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    function _innerDomBreadcrumb(handlerData) {\n        var target;\n        var keyAttrs = typeof dom === 'object' ? dom.serializeAttribute : undefined;\n        if (typeof keyAttrs === 'string') {\n            keyAttrs = [keyAttrs];\n        }\n        // Accessing event.target can throw (see getsentry/raven-js#838, #768)\n        try {\n            target = handlerData.event.target\n                ? htmlTreeAsString(handlerData.event.target, keyAttrs)\n                : htmlTreeAsString(handlerData.event, keyAttrs);\n        }\n        catch (e) {\n            target = '<unknown>';\n        }\n        if (target.length === 0) {\n            return;\n        }\n        getCurrentHub().addBreadcrumb({\n            category: \"ui.\" + handlerData.name,\n            message: target,\n        }, {\n            event: handlerData.event,\n            name: handlerData.name,\n            global: handlerData.global,\n        });\n    }\n    return _innerDomBreadcrumb;\n}\n/**\n * Creates breadcrumbs from console API calls\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction _consoleBreadcrumb(handlerData) {\n    var breadcrumb = {\n        category: 'console',\n        data: {\n            arguments: handlerData.args,\n            logger: 'console',\n        },\n        level: severityFromString(handlerData.level),\n        message: safeJoin(handlerData.args, ' '),\n    };\n    if (handlerData.level === 'assert') {\n        if (handlerData.args[0] === false) {\n            breadcrumb.message = \"Assertion failed: \" + (safeJoin(handlerData.args.slice(1), ' ') || 'console.assert');\n            breadcrumb.data.arguments = handlerData.args.slice(1);\n        }\n        else {\n            // Don't capture a breadcrumb for passed assertions\n            return;\n        }\n    }\n    getCurrentHub().addBreadcrumb(breadcrumb, {\n        input: handlerData.args,\n        level: handlerData.level,\n    });\n}\n/**\n * Creates breadcrumbs from XHR API calls\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction _xhrBreadcrumb(handlerData) {\n    if (handlerData.endTimestamp) {\n        // We only capture complete, non-sentry requests\n        if (handlerData.xhr.__sentry_own_request__) {\n            return;\n        }\n        var _a = handlerData.xhr.__sentry_xhr__ || {}, method = _a.method, url = _a.url, status_code = _a.status_code, body = _a.body;\n        getCurrentHub().addBreadcrumb({\n            category: 'xhr',\n            data: {\n                method: method,\n                url: url,\n                status_code: status_code,\n            },\n            type: 'http',\n        }, {\n            xhr: handlerData.xhr,\n            input: body,\n        });\n        return;\n    }\n}\n/**\n * Creates breadcrumbs from fetch API calls\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction _fetchBreadcrumb(handlerData) {\n    // We only capture complete fetch requests\n    if (!handlerData.endTimestamp) {\n        return;\n    }\n    if (handlerData.fetchData.url.match(/sentry_key/) && handlerData.fetchData.method === 'POST') {\n        // We will not create breadcrumbs for fetch requests that contain `sentry_key` (internal sentry requests)\n        return;\n    }\n    if (handlerData.error) {\n        getCurrentHub().addBreadcrumb({\n            category: 'fetch',\n            data: handlerData.fetchData,\n            level: Severity.Error,\n            type: 'http',\n        }, {\n            data: handlerData.error,\n            input: handlerData.args,\n        });\n    }\n    else {\n        getCurrentHub().addBreadcrumb({\n            category: 'fetch',\n            data: __assign(__assign({}, handlerData.fetchData), { status_code: handlerData.response.status }),\n            type: 'http',\n        }, {\n            input: handlerData.args,\n            response: handlerData.response,\n        });\n    }\n}\n/**\n * Creates breadcrumbs from history API calls\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction _historyBreadcrumb(handlerData) {\n    var global = getGlobalObject();\n    var from = handlerData.from;\n    var to = handlerData.to;\n    var parsedLoc = parseUrl(global.location.href);\n    var parsedFrom = parseUrl(from);\n    var parsedTo = parseUrl(to);\n    // Initial pushState doesn't provide `from` information\n    if (!parsedFrom.path) {\n        parsedFrom = parsedLoc;\n    }\n    // Use only the path component of the URL if the URL matches the current\n    // document (almost all the time when using pushState)\n    if (parsedLoc.protocol === parsedTo.protocol && parsedLoc.host === parsedTo.host) {\n        to = parsedTo.relative;\n    }\n    if (parsedLoc.protocol === parsedFrom.protocol && parsedLoc.host === parsedFrom.host) {\n        from = parsedFrom.relative;\n    }\n    getCurrentHub().addBreadcrumb({\n        category: 'navigation',\n        data: {\n            from: from,\n            to: to,\n        },\n    });\n}\n//# sourceMappingURL=breadcrumbs.js.map","import { __read, __spread } from \"tslib\";\nimport { addGlobalEventProcessor, getCurrentHub } from '@sentry/core';\nimport { isInstanceOf } from '@sentry/utils';\nimport { exceptionFromError } from '../parsers';\nvar DEFAULT_KEY = 'cause';\nvar DEFAULT_LIMIT = 5;\n/** Adds SDK info to an event. */\nvar LinkedErrors = /** @class */ (function () {\n    /**\n     * @inheritDoc\n     */\n    function LinkedErrors(options) {\n        if (options === void 0) { options = {}; }\n        /**\n         * @inheritDoc\n         */\n        this.name = LinkedErrors.id;\n        this._key = options.key || DEFAULT_KEY;\n        this._limit = options.limit || DEFAULT_LIMIT;\n    }\n    /**\n     * @inheritDoc\n     */\n    LinkedErrors.prototype.setupOnce = function () {\n        addGlobalEventProcessor(function (event, hint) {\n            var self = getCurrentHub().getIntegration(LinkedErrors);\n            return self ? _handler(self._key, self._limit, event, hint) : event;\n        });\n    };\n    /**\n     * @inheritDoc\n     */\n    LinkedErrors.id = 'LinkedErrors';\n    return LinkedErrors;\n}());\nexport { LinkedErrors };\n/**\n * @inheritDoc\n */\nexport function _handler(key, limit, event, hint) {\n    if (!event.exception || !event.exception.values || !hint || !isInstanceOf(hint.originalException, Error)) {\n        return event;\n    }\n    var linkedErrors = _walkErrorTree(limit, hint.originalException, key);\n    event.exception.values = __spread(linkedErrors, event.exception.values);\n    return event;\n}\n/**\n * JSDOC\n */\nexport function _walkErrorTree(limit, error, key, stack) {\n    if (stack === void 0) { stack = []; }\n    if (!isInstanceOf(error[key], Error) || stack.length + 1 >= limit) {\n        return stack;\n    }\n    var exception = exceptionFromError(error[key]);\n    return _walkErrorTree(limit, error[key], key, __spread([exception], stack));\n}\n//# sourceMappingURL=linkederrors.js.map","import { __assign } from \"tslib\";\nimport { addGlobalEventProcessor, getCurrentHub } from '@sentry/core';\nimport { getGlobalObject } from '@sentry/utils';\nvar global = getGlobalObject();\n/** UserAgent */\nvar UserAgent = /** @class */ (function () {\n    function UserAgent() {\n        /**\n         * @inheritDoc\n         */\n        this.name = UserAgent.id;\n    }\n    /**\n     * @inheritDoc\n     */\n    UserAgent.prototype.setupOnce = function () {\n        addGlobalEventProcessor(function (event) {\n            if (getCurrentHub().getIntegration(UserAgent)) {\n                // if none of the information we want exists, don't bother\n                if (!global.navigator && !global.location && !global.document) {\n                    return event;\n                }\n                // grab as much info as exists and add it to the event\n                var url = (event.request && event.request.url) || (global.location && global.location.href);\n                var referrer = (global.document || {}).referrer;\n                var userAgent = (global.navigator || {}).userAgent;\n                var headers = __assign(__assign(__assign({}, (event.request && event.request.headers)), (referrer && { Referer: referrer })), (userAgent && { 'User-Agent': userAgent }));\n                var request = __assign(__assign({}, (url && { url: url })), { headers: headers });\n                return __assign(__assign({}, event), { request: request });\n            }\n            return event;\n        });\n    };\n    /**\n     * @inheritDoc\n     */\n    UserAgent.id = 'UserAgent';\n    return UserAgent;\n}());\nexport { UserAgent };\n//# sourceMappingURL=useragent.js.map","import { logger } from '@sentry/utils';\n/** Deduplication filter */\nvar Dedupe = /** @class */ (function () {\n    function Dedupe() {\n        /**\n         * @inheritDoc\n         */\n        this.name = Dedupe.id;\n    }\n    /**\n     * @inheritDoc\n     */\n    Dedupe.prototype.setupOnce = function (addGlobalEventProcessor, getCurrentHub) {\n        addGlobalEventProcessor(function (currentEvent) {\n            var self = getCurrentHub().getIntegration(Dedupe);\n            if (self) {\n                // Juuust in case something goes wrong\n                try {\n                    if (_shouldDropEvent(currentEvent, self._previousEvent)) {\n                        logger.warn(\"Event dropped due to being a duplicate of previously captured event.\");\n                        return null;\n                    }\n                }\n                catch (_oO) {\n                    return (self._previousEvent = currentEvent);\n                }\n                return (self._previousEvent = currentEvent);\n            }\n            return currentEvent;\n        });\n    };\n    /**\n     * @inheritDoc\n     */\n    Dedupe.id = 'Dedupe';\n    return Dedupe;\n}());\nexport { Dedupe };\n/** JSDoc */\nfunction _shouldDropEvent(currentEvent, previousEvent) {\n    if (!previousEvent) {\n        return false;\n    }\n    if (_isSameMessageEvent(currentEvent, previousEvent)) {\n        return true;\n    }\n    if (_isSameExceptionEvent(currentEvent, previousEvent)) {\n        return true;\n    }\n    return false;\n}\n/** JSDoc */\nfunction _isSameMessageEvent(currentEvent, previousEvent) {\n    var currentMessage = currentEvent.message;\n    var previousMessage = previousEvent.message;\n    // If neither event has a message property, they were both exceptions, so bail out\n    if (!currentMessage && !previousMessage) {\n        return false;\n    }\n    // If only one event has a stacktrace, but not the other one, they are not the same\n    if ((currentMessage && !previousMessage) || (!currentMessage && previousMessage)) {\n        return false;\n    }\n    if (currentMessage !== previousMessage) {\n        return false;\n    }\n    if (!_isSameFingerprint(currentEvent, previousEvent)) {\n        return false;\n    }\n    if (!_isSameStacktrace(currentEvent, previousEvent)) {\n        return false;\n    }\n    return true;\n}\n/** JSDoc */\nfunction _isSameExceptionEvent(currentEvent, previousEvent) {\n    var previousException = _getExceptionFromEvent(previousEvent);\n    var currentException = _getExceptionFromEvent(currentEvent);\n    if (!previousException || !currentException) {\n        return false;\n    }\n    if (previousException.type !== currentException.type || previousException.value !== currentException.value) {\n        return false;\n    }\n    if (!_isSameFingerprint(currentEvent, previousEvent)) {\n        return false;\n    }\n    if (!_isSameStacktrace(currentEvent, previousEvent)) {\n        return false;\n    }\n    return true;\n}\n/** JSDoc */\nfunction _isSameStacktrace(currentEvent, previousEvent) {\n    var currentFrames = _getFramesFromEvent(currentEvent);\n    var previousFrames = _getFramesFromEvent(previousEvent);\n    // If neither event has a stacktrace, they are assumed to be the same\n    if (!currentFrames && !previousFrames) {\n        return true;\n    }\n    // If only one event has a stacktrace, but not the other one, they are not the same\n    if ((currentFrames && !previousFrames) || (!currentFrames && previousFrames)) {\n        return false;\n    }\n    currentFrames = currentFrames;\n    previousFrames = previousFrames;\n    // If number of frames differ, they are not the same\n    if (previousFrames.length !== currentFrames.length) {\n        return false;\n    }\n    // Otherwise, compare the two\n    for (var i = 0; i < previousFrames.length; i++) {\n        var frameA = previousFrames[i];\n        var frameB = currentFrames[i];\n        if (frameA.filename !== frameB.filename ||\n            frameA.lineno !== frameB.lineno ||\n            frameA.colno !== frameB.colno ||\n            frameA.function !== frameB.function) {\n            return false;\n        }\n    }\n    return true;\n}\n/** JSDoc */\nfunction _isSameFingerprint(currentEvent, previousEvent) {\n    var currentFingerprint = currentEvent.fingerprint;\n    var previousFingerprint = previousEvent.fingerprint;\n    // If neither event has a fingerprint, they are assumed to be the same\n    if (!currentFingerprint && !previousFingerprint) {\n        return true;\n    }\n    // If only one event has a fingerprint, but not the other one, they are not the same\n    if ((currentFingerprint && !previousFingerprint) || (!currentFingerprint && previousFingerprint)) {\n        return false;\n    }\n    currentFingerprint = currentFingerprint;\n    previousFingerprint = previousFingerprint;\n    // Otherwise, compare the two\n    try {\n        return !!(currentFingerprint.join('') === previousFingerprint.join(''));\n    }\n    catch (_oO) {\n        return false;\n    }\n}\n/** JSDoc */\nfunction _getExceptionFromEvent(event) {\n    return event.exception && event.exception.values && event.exception.values[0];\n}\n/** JSDoc */\nfunction _getFramesFromEvent(event) {\n    var exception = event.exception;\n    if (exception) {\n        try {\n            // @ts-ignore Object could be undefined\n            return exception.values[0].stacktrace.frames;\n        }\n        catch (_oO) {\n            return undefined;\n        }\n    }\n    else if (event.stacktrace) {\n        return event.stacktrace.frames;\n    }\n    return undefined;\n}\n//# sourceMappingURL=dedupe.js.map","import { __assign, __extends } from \"tslib\";\nimport { BaseClient, SDK_VERSION } from '@sentry/core';\nimport { getGlobalObject, logger } from '@sentry/utils';\nimport { BrowserBackend } from './backend';\nimport { injectReportDialog } from './helpers';\nimport { Breadcrumbs } from './integrations';\n/**\n * The Sentry Browser SDK Client.\n *\n * @see BrowserOptions for documentation on configuration options.\n * @see SentryClient for usage documentation.\n */\nvar BrowserClient = /** @class */ (function (_super) {\n    __extends(BrowserClient, _super);\n    /**\n     * Creates a new Browser SDK instance.\n     *\n     * @param options Configuration options for this SDK.\n     */\n    function BrowserClient(options) {\n        if (options === void 0) { options = {}; }\n        var _this = this;\n        options._metadata = options._metadata || {};\n        options._metadata.sdk = options._metadata.sdk || {\n            name: 'sentry.javascript.browser',\n            packages: [\n                {\n                    name: 'npm:@sentry/browser',\n                    version: SDK_VERSION,\n                },\n            ],\n            version: SDK_VERSION,\n        };\n        _this = _super.call(this, BrowserBackend, options) || this;\n        return _this;\n    }\n    /**\n     * Show a report dialog to the user to send feedback to a specific event.\n     *\n     * @param options Set individual options for the dialog\n     */\n    BrowserClient.prototype.showReportDialog = function (options) {\n        if (options === void 0) { options = {}; }\n        // doesn't work without a document (React Native)\n        var document = getGlobalObject().document;\n        if (!document) {\n            return;\n        }\n        if (!this._isEnabled()) {\n            logger.error('Trying to call showReportDialog with Sentry Client disabled');\n            return;\n        }\n        injectReportDialog(__assign(__assign({}, options), { dsn: options.dsn || this.getDsn() }));\n    };\n    /**\n     * @inheritDoc\n     */\n    BrowserClient.prototype._prepareEvent = function (event, scope, hint) {\n        event.platform = event.platform || 'javascript';\n        return _super.prototype._prepareEvent.call(this, event, scope, hint);\n    };\n    /**\n     * @inheritDoc\n     */\n    BrowserClient.prototype._sendEvent = function (event) {\n        var integration = this.getIntegration(Breadcrumbs);\n        if (integration) {\n            integration.addSentryBreadcrumb(event);\n        }\n        _super.prototype._sendEvent.call(this, event);\n    };\n    return BrowserClient;\n}(BaseClient));\nexport { BrowserClient };\n//# sourceMappingURL=client.js.map","import { __assign } from \"tslib\";\nimport { getCurrentHub, initAndBind, Integrations as CoreIntegrations } from '@sentry/core';\nimport { addInstrumentationHandler, getGlobalObject, isDebugBuild, logger, resolvedSyncPromise } from '@sentry/utils';\nimport { BrowserClient } from './client';\nimport { wrap as internalWrap } from './helpers';\nimport { Breadcrumbs, Dedupe, GlobalHandlers, LinkedErrors, TryCatch, UserAgent } from './integrations';\nexport var defaultIntegrations = [\n    new CoreIntegrations.InboundFilters(),\n    new CoreIntegrations.FunctionToString(),\n    new TryCatch(),\n    new Breadcrumbs(),\n    new GlobalHandlers(),\n    new LinkedErrors(),\n    new Dedupe(),\n    new UserAgent(),\n];\n/**\n * The Sentry Browser SDK Client.\n *\n * To use this SDK, call the {@link init} function as early as possible when\n * loading the web page. To set context information or send manual events, use\n * the provided methods.\n *\n * @example\n *\n * ```\n *\n * import { init } from '@sentry/browser';\n *\n * init({\n *   dsn: '__DSN__',\n *   // ...\n * });\n * ```\n *\n * @example\n * ```\n *\n * import { configureScope } from '@sentry/browser';\n * configureScope((scope: Scope) => {\n *   scope.setExtra({ battery: 0.7 });\n *   scope.setTag({ user_mode: 'admin' });\n *   scope.setUser({ id: '4711' });\n * });\n * ```\n *\n * @example\n * ```\n *\n * import { addBreadcrumb } from '@sentry/browser';\n * addBreadcrumb({\n *   message: 'My Breadcrumb',\n *   // ...\n * });\n * ```\n *\n * @example\n *\n * ```\n *\n * import * as Sentry from '@sentry/browser';\n * Sentry.captureMessage('Hello, world!');\n * Sentry.captureException(new Error('Good bye'));\n * Sentry.captureEvent({\n *   message: 'Manual',\n *   stacktrace: [\n *     // ...\n *   ],\n * });\n * ```\n *\n * @see {@link BrowserOptions} for documentation on configuration options.\n */\nexport function init(options) {\n    if (options === void 0) { options = {}; }\n    if (options.defaultIntegrations === undefined) {\n        options.defaultIntegrations = defaultIntegrations;\n    }\n    if (options.release === undefined) {\n        var window_1 = getGlobalObject();\n        // This supports the variable that sentry-webpack-plugin injects\n        if (window_1.SENTRY_RELEASE && window_1.SENTRY_RELEASE.id) {\n            options.release = window_1.SENTRY_RELEASE.id;\n        }\n    }\n    if (options.autoSessionTracking === undefined) {\n        options.autoSessionTracking = true;\n    }\n    if (options.sendClientReports === undefined) {\n        options.sendClientReports = true;\n    }\n    initAndBind(BrowserClient, options);\n    if (options.autoSessionTracking) {\n        startSessionTracking();\n    }\n}\n/**\n * Present the user with a report dialog.\n *\n * @param options Everything is optional, we try to fetch all info need from the global scope.\n */\nexport function showReportDialog(options) {\n    if (options === void 0) { options = {}; }\n    var hub = getCurrentHub();\n    var scope = hub.getScope();\n    if (scope) {\n        options.user = __assign(__assign({}, scope.getUser()), options.user);\n    }\n    if (!options.eventId) {\n        options.eventId = hub.lastEventId();\n    }\n    var client = hub.getClient();\n    if (client) {\n        client.showReportDialog(options);\n    }\n}\n/**\n * This is the getter for lastEventId.\n *\n * @returns The last event id of a captured event.\n */\nexport function lastEventId() {\n    return getCurrentHub().lastEventId();\n}\n/**\n * This function is here to be API compatible with the loader.\n * @hidden\n */\nexport function forceLoad() {\n    // Noop\n}\n/**\n * This function is here to be API compatible with the loader.\n * @hidden\n */\nexport function onLoad(callback) {\n    callback();\n}\n/**\n * Call `flush()` on the current client, if there is one. See {@link Client.flush}.\n *\n * @param timeout Maximum time in ms the client should wait to flush its event queue. Omitting this parameter will cause\n * the client to wait until all events are sent before resolving the promise.\n * @returns A promise which resolves to `true` if the queue successfully drains before the timeout, or `false` if it\n * doesn't (or if there's no client defined).\n */\nexport function flush(timeout) {\n    var client = getCurrentHub().getClient();\n    if (client) {\n        return client.flush(timeout);\n    }\n    if (isDebugBuild()) {\n        logger.warn('Cannot flush events. No client defined.');\n    }\n    return resolvedSyncPromise(false);\n}\n/**\n * Call `close()` on the current client, if there is one. See {@link Client.close}.\n *\n * @param timeout Maximum time in ms the client should wait to flush its event queue before shutting down. Omitting this\n * parameter will cause the client to wait until all events are sent before disabling itself.\n * @returns A promise which resolves to `true` if the queue successfully drains before the timeout, or `false` if it\n * doesn't (or if there's no client defined).\n */\nexport function close(timeout) {\n    var client = getCurrentHub().getClient();\n    if (client) {\n        return client.close(timeout);\n    }\n    if (isDebugBuild()) {\n        logger.warn('Cannot flush events and disable SDK. No client defined.');\n    }\n    return resolvedSyncPromise(false);\n}\n/**\n * Wrap code within a try/catch block so the SDK is able to capture errors.\n *\n * @param fn A function to wrap.\n *\n * @returns The result of wrapped function call.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function wrap(fn) {\n    return internalWrap(fn)();\n}\nfunction startSessionOnHub(hub) {\n    hub.startSession({ ignoreDuration: true });\n    hub.captureSession();\n}\n/**\n * Enable automatic Session Tracking for the initial page load.\n */\nfunction startSessionTracking() {\n    var window = getGlobalObject();\n    var document = window.document;\n    if (typeof document === 'undefined') {\n        if (isDebugBuild()) {\n            logger.warn('Session tracking in non-browser environment with @sentry/browser is not supported.');\n        }\n        return;\n    }\n    var hub = getCurrentHub();\n    // The only way for this to be false is for there to be a version mismatch between @sentry/browser (>= 6.0.0) and\n    // @sentry/hub (< 5.27.0). In the simple case, there won't ever be such a mismatch, because the two packages are\n    // pinned at the same version in package.json, but there are edge cases where it's possible. See\n    // https://github.com/getsentry/sentry-javascript/issues/3207 and\n    // https://github.com/getsentry/sentry-javascript/issues/3234 and\n    // https://github.com/getsentry/sentry-javascript/issues/3278.\n    if (!hub.captureSession) {\n        return;\n    }\n    // The session duration for browser sessions does not track a meaningful\n    // concept that can be used as a metric.\n    // Automatically captured sessions are akin to page views, and thus we\n    // discard their duration.\n    startSessionOnHub(hub);\n    // We want to create a session for every navigation as well\n    addInstrumentationHandler('history', function (_a) {\n        var from = _a.from, to = _a.to;\n        // Don't create an additional session for the initial route or if the location did not change\n        if (!(from === undefined || from === to)) {\n            startSessionOnHub(getCurrentHub());\n        }\n    });\n}\n//# sourceMappingURL=sdk.js.map","import { init as browserInit, SDK_VERSION } from '@sentry/browser';\n/**\n * Inits the React SDK\n */\nexport function init(options) {\n    options._metadata = options._metadata || {};\n    options._metadata.sdk = options._metadata.sdk || {\n        name: 'sentry.javascript.react',\n        packages: [\n            {\n                name: 'npm:@sentry/react',\n                version: SDK_VERSION,\n            },\n        ],\n        version: SDK_VERSION,\n    };\n    browserInit(options);\n}\n//# sourceMappingURL=sdk.js.map","/** @license React v16.13.1\n * react-is.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';var b=\"function\"===typeof Symbol&&Symbol.for,c=b?Symbol.for(\"react.element\"):60103,d=b?Symbol.for(\"react.portal\"):60106,e=b?Symbol.for(\"react.fragment\"):60107,f=b?Symbol.for(\"react.strict_mode\"):60108,g=b?Symbol.for(\"react.profiler\"):60114,h=b?Symbol.for(\"react.provider\"):60109,k=b?Symbol.for(\"react.context\"):60110,l=b?Symbol.for(\"react.async_mode\"):60111,m=b?Symbol.for(\"react.concurrent_mode\"):60111,n=b?Symbol.for(\"react.forward_ref\"):60112,p=b?Symbol.for(\"react.suspense\"):60113,q=b?\nSymbol.for(\"react.suspense_list\"):60120,r=b?Symbol.for(\"react.memo\"):60115,t=b?Symbol.for(\"react.lazy\"):60116,v=b?Symbol.for(\"react.block\"):60121,w=b?Symbol.for(\"react.fundamental\"):60117,x=b?Symbol.for(\"react.responder\"):60118,y=b?Symbol.for(\"react.scope\"):60119;\nfunction z(a){if(\"object\"===typeof a&&null!==a){var u=a.$$typeof;switch(u){case c:switch(a=a.type,a){case l:case m:case e:case g:case f:case p:return a;default:switch(a=a&&a.$$typeof,a){case k:case n:case t:case r:case h:return a;default:return u}}case d:return u}}}function A(a){return z(a)===m}exports.AsyncMode=l;exports.ConcurrentMode=m;exports.ContextConsumer=k;exports.ContextProvider=h;exports.Element=c;exports.ForwardRef=n;exports.Fragment=e;exports.Lazy=t;exports.Memo=r;exports.Portal=d;\nexports.Profiler=g;exports.StrictMode=f;exports.Suspense=p;exports.isAsyncMode=function(a){return A(a)||z(a)===l};exports.isConcurrentMode=A;exports.isContextConsumer=function(a){return z(a)===k};exports.isContextProvider=function(a){return z(a)===h};exports.isElement=function(a){return\"object\"===typeof a&&null!==a&&a.$$typeof===c};exports.isForwardRef=function(a){return z(a)===n};exports.isFragment=function(a){return z(a)===e};exports.isLazy=function(a){return z(a)===t};\nexports.isMemo=function(a){return z(a)===r};exports.isPortal=function(a){return z(a)===d};exports.isProfiler=function(a){return z(a)===g};exports.isStrictMode=function(a){return z(a)===f};exports.isSuspense=function(a){return z(a)===p};\nexports.isValidElementType=function(a){return\"string\"===typeof a||\"function\"===typeof a||a===e||a===m||a===g||a===f||a===p||a===q||\"object\"===typeof a&&null!==a&&(a.$$typeof===t||a.$$typeof===r||a.$$typeof===h||a.$$typeof===k||a.$$typeof===n||a.$$typeof===w||a.$$typeof===x||a.$$typeof===y||a.$$typeof===v)};exports.typeOf=z;\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n  module.exports = require('./cjs/react-is.production.min.js');\n} else {\n  module.exports = require('./cjs/react-is.development.js');\n}\n","'use strict';\n\nvar reactIs = require('react-is');\n\n/**\n * Copyright 2015, Yahoo! Inc.\n * Copyrights licensed under the New BSD License. See the accompanying LICENSE file for terms.\n */\nvar REACT_STATICS = {\n  childContextTypes: true,\n  contextType: true,\n  contextTypes: true,\n  defaultProps: true,\n  displayName: true,\n  getDefaultProps: true,\n  getDerivedStateFromError: true,\n  getDerivedStateFromProps: true,\n  mixins: true,\n  propTypes: true,\n  type: true\n};\nvar KNOWN_STATICS = {\n  name: true,\n  length: true,\n  prototype: true,\n  caller: true,\n  callee: true,\n  arguments: true,\n  arity: true\n};\nvar FORWARD_REF_STATICS = {\n  '$$typeof': true,\n  render: true,\n  defaultProps: true,\n  displayName: true,\n  propTypes: true\n};\nvar MEMO_STATICS = {\n  '$$typeof': true,\n  compare: true,\n  defaultProps: true,\n  displayName: true,\n  propTypes: true,\n  type: true\n};\nvar TYPE_STATICS = {};\nTYPE_STATICS[reactIs.ForwardRef] = FORWARD_REF_STATICS;\nTYPE_STATICS[reactIs.Memo] = MEMO_STATICS;\n\nfunction getStatics(component) {\n  // React v16.11 and below\n  if (reactIs.isMemo(component)) {\n    return MEMO_STATICS;\n  } // React v16.12 and above\n\n\n  return TYPE_STATICS[component['$$typeof']] || REACT_STATICS;\n}\n\nvar defineProperty = Object.defineProperty;\nvar getOwnPropertyNames = Object.getOwnPropertyNames;\nvar getOwnPropertySymbols = Object.getOwnPropertySymbols;\nvar getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\nvar getPrototypeOf = Object.getPrototypeOf;\nvar objectPrototype = Object.prototype;\nfunction hoistNonReactStatics(targetComponent, sourceComponent, blacklist) {\n  if (typeof sourceComponent !== 'string') {\n    // don't hoist over string (html) components\n    if (objectPrototype) {\n      var inheritedComponent = getPrototypeOf(sourceComponent);\n\n      if (inheritedComponent && inheritedComponent !== objectPrototype) {\n        hoistNonReactStatics(targetComponent, inheritedComponent, blacklist);\n      }\n    }\n\n    var keys = getOwnPropertyNames(sourceComponent);\n\n    if (getOwnPropertySymbols) {\n      keys = keys.concat(getOwnPropertySymbols(sourceComponent));\n    }\n\n    var targetStatics = getStatics(targetComponent);\n    var sourceStatics = getStatics(sourceComponent);\n\n    for (var i = 0; i < keys.length; ++i) {\n      var key = keys[i];\n\n      if (!KNOWN_STATICS[key] && !(blacklist && blacklist[key]) && !(sourceStatics && sourceStatics[key]) && !(targetStatics && targetStatics[key])) {\n        var descriptor = getOwnPropertyDescriptor(sourceComponent, key);\n\n        try {\n          // Avoid failures from read-only properties\n          defineProperty(targetComponent, key, descriptor);\n        } catch (e) {}\n      }\n    }\n  }\n\n  return targetComponent;\n}\n\nmodule.exports = hoistNonReactStatics;\n","/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n    extendStatics = Object.setPrototypeOf ||\r\n        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\r\n    return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n    extendStatics(d, b);\r\n    function __() { this.constructor = d; }\r\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n    __assign = Object.assign || function __assign(t) {\r\n        for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n            s = arguments[i];\r\n            for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n        }\r\n        return t;\r\n    }\r\n    return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n    var t = {};\r\n    for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n        t[p] = s[p];\r\n    if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n        for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n            if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n                t[p[i]] = s[p[i]];\r\n        }\r\n    return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n    return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n    if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n    return new (P || (P = Promise))(function (resolve, reject) {\r\n        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n        function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n        step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n    });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n    var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n    return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n    function verb(n) { return function (v) { return step([n, v]); }; }\r\n    function step(op) {\r\n        if (f) throw new TypeError(\"Generator is already executing.\");\r\n        while (_) try {\r\n            if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n            if (y = 0, t) op = [op[0] & 2, t.value];\r\n            switch (op[0]) {\r\n                case 0: case 1: t = op; break;\r\n                case 4: _.label++; return { value: op[1], done: false };\r\n                case 5: _.label++; y = op[1]; op = [0]; continue;\r\n                case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n                default:\r\n                    if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n                    if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n                    if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n                    if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n                    if (t[2]) _.ops.pop();\r\n                    _.trys.pop(); continue;\r\n            }\r\n            op = body.call(thisArg, _);\r\n        } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n        if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n    }\r\n}\r\n\r\nexport function __createBinding(o, m, k, k2) {\r\n    if (k2 === undefined) k2 = k;\r\n    o[k2] = m[k];\r\n}\r\n\r\nexport function __exportStar(m, exports) {\r\n    for (var p in m) if (p !== \"default\" && !exports.hasOwnProperty(p)) exports[p] = m[p];\r\n}\r\n\r\nexport function __values(o) {\r\n    var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n    if (m) return m.call(o);\r\n    if (o && typeof o.length === \"number\") return {\r\n        next: function () {\r\n            if (o && i >= o.length) o = void 0;\r\n            return { value: o && o[i++], done: !o };\r\n        }\r\n    };\r\n    throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n    var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n    if (!m) return o;\r\n    var i = m.call(o), r, ar = [], e;\r\n    try {\r\n        while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n    }\r\n    catch (error) { e = { error: error }; }\r\n    finally {\r\n        try {\r\n            if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n        }\r\n        finally { if (e) throw e.error; }\r\n    }\r\n    return ar;\r\n}\r\n\r\nexport function __spread() {\r\n    for (var ar = [], i = 0; i < arguments.length; i++)\r\n        ar = ar.concat(__read(arguments[i]));\r\n    return ar;\r\n}\r\n\r\nexport function __spreadArrays() {\r\n    for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n    for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n        for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n            r[k] = a[j];\r\n    return r;\r\n};\r\n\r\nexport function __await(v) {\r\n    return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n    if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n    var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n    return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n    function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n    function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n    function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n    function fulfill(value) { resume(\"next\", value); }\r\n    function reject(value) { resume(\"throw\", value); }\r\n    function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n    var i, p;\r\n    return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n    function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n    if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n    var m = o[Symbol.asyncIterator], i;\r\n    return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n    function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n    function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n    if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n    return cooked;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n    if (mod && mod.__esModule) return mod;\r\n    var result = {};\r\n    if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];\r\n    result.default = mod;\r\n    return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n    return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, privateMap) {\r\n    if (!privateMap.has(receiver)) {\r\n        throw new TypeError(\"attempted to get private field on non-instance\");\r\n    }\r\n    return privateMap.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, privateMap, value) {\r\n    if (!privateMap.has(receiver)) {\r\n        throw new TypeError(\"attempted to set private field on non-instance\");\r\n    }\r\n    privateMap.set(receiver, value);\r\n    return value;\r\n}\r\n","import { getCurrentHub } from '@sentry/hub';\nexport var TRACEPARENT_REGEXP = new RegExp('^[ \\\\t]*' + // whitespace\n    '([0-9a-f]{32})?' + // trace_id\n    '-?([0-9a-f]{16})?' + // span_id\n    '-?([01])?' + // sampled\n    '[ \\\\t]*$');\n/**\n * Determines if tracing is currently enabled.\n *\n * Tracing is enabled when at least one of `tracesSampleRate` and `tracesSampler` is defined in the SDK config.\n */\nexport function hasTracingEnabled(maybeOptions) {\n    var client = getCurrentHub().getClient();\n    var options = maybeOptions || (client && client.getOptions());\n    return !!options && ('tracesSampleRate' in options || 'tracesSampler' in options);\n}\n/**\n * Extract transaction context data from a `sentry-trace` header.\n *\n * @param traceparent Traceparent string\n *\n * @returns Object containing data from the header, or undefined if traceparent string is malformed\n */\nexport function extractTraceparentData(traceparent) {\n    var matches = traceparent.match(TRACEPARENT_REGEXP);\n    if (matches) {\n        var parentSampled = void 0;\n        if (matches[3] === '1') {\n            parentSampled = true;\n        }\n        else if (matches[3] === '0') {\n            parentSampled = false;\n        }\n        return {\n            traceId: matches[1],\n            parentSampled: parentSampled,\n            parentSpanId: matches[2],\n        };\n    }\n    return undefined;\n}\n/** Grabs active transaction off scope, if any */\nexport function getActiveTransaction(maybeHub) {\n    var hub = maybeHub || getCurrentHub();\n    var scope = hub.getScope();\n    return scope && scope.getTransaction();\n}\n/**\n * Converts from milliseconds to seconds\n * @param time time in ms\n */\nexport function msToSec(time) {\n    return time / 1000;\n}\n/**\n * Converts from seconds to milliseconds\n * @param time time in seconds\n */\nexport function secToMs(time) {\n    return time * 1000;\n}\n// so it can be used in manual instrumentation without necessitating a hard dependency on @sentry/utils\nexport { stripUrlQueryAndFragment } from '@sentry/utils';\n//# sourceMappingURL=utils.js.map","import { addInstrumentationHandler, logger } from '@sentry/utils';\nimport { getActiveTransaction } from './utils';\n/**\n * Configures global error listeners\n */\nexport function registerErrorInstrumentation() {\n    addInstrumentationHandler('error', errorCallback);\n    addInstrumentationHandler('unhandledrejection', errorCallback);\n}\n/**\n * If an error or unhandled promise occurs, we mark the active transaction as failed\n */\nfunction errorCallback() {\n    var activeTransaction = getActiveTransaction();\n    if (activeTransaction) {\n        var status_1 = 'internal_error';\n        logger.log(\"[Tracing] Transaction: \" + status_1 + \" -> Global error occured\");\n        activeTransaction.setStatus(status_1);\n    }\n}\n//# sourceMappingURL=errors.js.map","// Store finish reasons in tuple to save on bundle size\n// Readonly type should enforce that this is not mutated.\nexport var FINISH_REASON_TAG = 'finishReason';\nexport var IDLE_TRANSACTION_FINISH_REASONS = ['heartbeatFailed', 'idleTimeout', 'documentHidden'];\n//# sourceMappingURL=constants.js.map","import { __assign } from \"tslib\";\nimport { dropUndefinedKeys, timestampWithMs, uuid4 } from '@sentry/utils';\n/**\n * Keeps track of finished spans for a given transaction\n * @internal\n * @hideconstructor\n * @hidden\n */\nvar SpanRecorder = /** @class */ (function () {\n    function SpanRecorder(maxlen) {\n        if (maxlen === void 0) { maxlen = 1000; }\n        this.spans = [];\n        this._maxlen = maxlen;\n    }\n    /**\n     * This is just so that we don't run out of memory while recording a lot\n     * of spans. At some point we just stop and flush out the start of the\n     * trace tree (i.e.the first n spans with the smallest\n     * start_timestamp).\n     */\n    SpanRecorder.prototype.add = function (span) {\n        if (this.spans.length > this._maxlen) {\n            span.spanRecorder = undefined;\n        }\n        else {\n            this.spans.push(span);\n        }\n    };\n    return SpanRecorder;\n}());\nexport { SpanRecorder };\n/**\n * Span contains all data about a span\n */\nvar Span = /** @class */ (function () {\n    /**\n     * You should never call the constructor manually, always use `Sentry.startTransaction()`\n     * or call `startChild()` on an existing span.\n     * @internal\n     * @hideconstructor\n     * @hidden\n     */\n    function Span(spanContext) {\n        /**\n         * @inheritDoc\n         */\n        this.traceId = uuid4();\n        /**\n         * @inheritDoc\n         */\n        this.spanId = uuid4().substring(16);\n        /**\n         * Timestamp in seconds when the span was created.\n         */\n        this.startTimestamp = timestampWithMs();\n        /**\n         * @inheritDoc\n         */\n        this.tags = {};\n        /**\n         * @inheritDoc\n         */\n        // eslint-disable-next-line @typescript-eslint/no-explicit-any\n        this.data = {};\n        if (!spanContext) {\n            return this;\n        }\n        if (spanContext.traceId) {\n            this.traceId = spanContext.traceId;\n        }\n        if (spanContext.spanId) {\n            this.spanId = spanContext.spanId;\n        }\n        if (spanContext.parentSpanId) {\n            this.parentSpanId = spanContext.parentSpanId;\n        }\n        // We want to include booleans as well here\n        if ('sampled' in spanContext) {\n            this.sampled = spanContext.sampled;\n        }\n        if (spanContext.op) {\n            this.op = spanContext.op;\n        }\n        if (spanContext.description) {\n            this.description = spanContext.description;\n        }\n        if (spanContext.data) {\n            this.data = spanContext.data;\n        }\n        if (spanContext.tags) {\n            this.tags = spanContext.tags;\n        }\n        if (spanContext.status) {\n            this.status = spanContext.status;\n        }\n        if (spanContext.startTimestamp) {\n            this.startTimestamp = spanContext.startTimestamp;\n        }\n        if (spanContext.endTimestamp) {\n            this.endTimestamp = spanContext.endTimestamp;\n        }\n    }\n    /**\n     * @inheritDoc\n     * @deprecated\n     */\n    Span.prototype.child = function (spanContext) {\n        return this.startChild(spanContext);\n    };\n    /**\n     * @inheritDoc\n     */\n    Span.prototype.startChild = function (spanContext) {\n        var childSpan = new Span(__assign(__assign({}, spanContext), { parentSpanId: this.spanId, sampled: this.sampled, traceId: this.traceId }));\n        childSpan.spanRecorder = this.spanRecorder;\n        if (childSpan.spanRecorder) {\n            childSpan.spanRecorder.add(childSpan);\n        }\n        childSpan.transaction = this.transaction;\n        return childSpan;\n    };\n    /**\n     * @inheritDoc\n     */\n    Span.prototype.setTag = function (key, value) {\n        var _a;\n        this.tags = __assign(__assign({}, this.tags), (_a = {}, _a[key] = value, _a));\n        return this;\n    };\n    /**\n     * @inheritDoc\n     */\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types\n    Span.prototype.setData = function (key, value) {\n        var _a;\n        this.data = __assign(__assign({}, this.data), (_a = {}, _a[key] = value, _a));\n        return this;\n    };\n    /**\n     * @inheritDoc\n     */\n    Span.prototype.setStatus = function (value) {\n        this.status = value;\n        return this;\n    };\n    /**\n     * @inheritDoc\n     */\n    Span.prototype.setHttpStatus = function (httpStatus) {\n        this.setTag('http.status_code', String(httpStatus));\n        var spanStatus = spanStatusfromHttpCode(httpStatus);\n        if (spanStatus !== 'unknown_error') {\n            this.setStatus(spanStatus);\n        }\n        return this;\n    };\n    /**\n     * @inheritDoc\n     */\n    Span.prototype.isSuccess = function () {\n        return this.status === 'ok';\n    };\n    /**\n     * @inheritDoc\n     */\n    Span.prototype.finish = function (endTimestamp) {\n        this.endTimestamp = typeof endTimestamp === 'number' ? endTimestamp : timestampWithMs();\n    };\n    /**\n     * @inheritDoc\n     */\n    Span.prototype.toTraceparent = function () {\n        var sampledString = '';\n        if (this.sampled !== undefined) {\n            sampledString = this.sampled ? '-1' : '-0';\n        }\n        return this.traceId + \"-\" + this.spanId + sampledString;\n    };\n    /**\n     * @inheritDoc\n     */\n    Span.prototype.toContext = function () {\n        return dropUndefinedKeys({\n            data: this.data,\n            description: this.description,\n            endTimestamp: this.endTimestamp,\n            op: this.op,\n            parentSpanId: this.parentSpanId,\n            sampled: this.sampled,\n            spanId: this.spanId,\n            startTimestamp: this.startTimestamp,\n            status: this.status,\n            tags: this.tags,\n            traceId: this.traceId,\n        });\n    };\n    /**\n     * @inheritDoc\n     */\n    Span.prototype.updateWithContext = function (spanContext) {\n        var _a, _b, _c, _d, _e;\n        this.data = (_a = spanContext.data, (_a !== null && _a !== void 0 ? _a : {}));\n        this.description = spanContext.description;\n        this.endTimestamp = spanContext.endTimestamp;\n        this.op = spanContext.op;\n        this.parentSpanId = spanContext.parentSpanId;\n        this.sampled = spanContext.sampled;\n        this.spanId = (_b = spanContext.spanId, (_b !== null && _b !== void 0 ? _b : this.spanId));\n        this.startTimestamp = (_c = spanContext.startTimestamp, (_c !== null && _c !== void 0 ? _c : this.startTimestamp));\n        this.status = spanContext.status;\n        this.tags = (_d = spanContext.tags, (_d !== null && _d !== void 0 ? _d : {}));\n        this.traceId = (_e = spanContext.traceId, (_e !== null && _e !== void 0 ? _e : this.traceId));\n        return this;\n    };\n    /**\n     * @inheritDoc\n     */\n    Span.prototype.getTraceContext = function () {\n        return dropUndefinedKeys({\n            data: Object.keys(this.data).length > 0 ? this.data : undefined,\n            description: this.description,\n            op: this.op,\n            parent_span_id: this.parentSpanId,\n            span_id: this.spanId,\n            status: this.status,\n            tags: Object.keys(this.tags).length > 0 ? this.tags : undefined,\n            trace_id: this.traceId,\n        });\n    };\n    /**\n     * @inheritDoc\n     */\n    Span.prototype.toJSON = function () {\n        return dropUndefinedKeys({\n            data: Object.keys(this.data).length > 0 ? this.data : undefined,\n            description: this.description,\n            op: this.op,\n            parent_span_id: this.parentSpanId,\n            span_id: this.spanId,\n            start_timestamp: this.startTimestamp,\n            status: this.status,\n            tags: Object.keys(this.tags).length > 0 ? this.tags : undefined,\n            timestamp: this.endTimestamp,\n            trace_id: this.traceId,\n        });\n    };\n    return Span;\n}());\nexport { Span };\n/**\n * Converts a HTTP status code into a {@link SpanStatusType}.\n *\n * @param httpStatus The HTTP response status code.\n * @returns The span status or unknown_error.\n */\nexport function spanStatusfromHttpCode(httpStatus) {\n    if (httpStatus < 400 && httpStatus >= 100) {\n        return 'ok';\n    }\n    if (httpStatus >= 400 && httpStatus < 500) {\n        switch (httpStatus) {\n            case 401:\n                return 'unauthenticated';\n            case 403:\n                return 'permission_denied';\n            case 404:\n                return 'not_found';\n            case 409:\n                return 'already_exists';\n            case 413:\n                return 'failed_precondition';\n            case 429:\n                return 'resource_exhausted';\n            default:\n                return 'invalid_argument';\n        }\n    }\n    if (httpStatus >= 500 && httpStatus < 600) {\n        switch (httpStatus) {\n            case 501:\n                return 'unimplemented';\n            case 503:\n                return 'unavailable';\n            case 504:\n                return 'deadline_exceeded';\n            default:\n                return 'internal_error';\n        }\n    }\n    return 'unknown_error';\n}\n//# sourceMappingURL=span.js.map","import { __assign, __extends } from \"tslib\";\nimport { getCurrentHub, Hub } from '@sentry/hub';\nimport { dropUndefinedKeys, isInstanceOf, logger } from '@sentry/utils';\nimport { Span as SpanClass, SpanRecorder } from './span';\n/** JSDoc */\nvar Transaction = /** @class */ (function (_super) {\n    __extends(Transaction, _super);\n    /**\n     * This constructor should never be called manually. Those instrumenting tracing should use\n     * `Sentry.startTransaction()`, and internal methods should use `hub.startTransaction()`.\n     * @internal\n     * @hideconstructor\n     * @hidden\n     */\n    function Transaction(transactionContext, hub) {\n        var _this = _super.call(this, transactionContext) || this;\n        _this._measurements = {};\n        /**\n         * The reference to the current hub.\n         */\n        _this._hub = getCurrentHub();\n        if (isInstanceOf(hub, Hub)) {\n            _this._hub = hub;\n        }\n        _this.name = transactionContext.name || '';\n        _this.metadata = transactionContext.metadata || {};\n        _this._trimEnd = transactionContext.trimEnd;\n        // this is because transactions are also spans, and spans have a transaction pointer\n        _this.transaction = _this;\n        return _this;\n    }\n    /**\n     * JSDoc\n     */\n    Transaction.prototype.setName = function (name) {\n        this.name = name;\n    };\n    /**\n     * Attaches SpanRecorder to the span itself\n     * @param maxlen maximum number of spans that can be recorded\n     */\n    Transaction.prototype.initSpanRecorder = function (maxlen) {\n        if (maxlen === void 0) { maxlen = 1000; }\n        if (!this.spanRecorder) {\n            this.spanRecorder = new SpanRecorder(maxlen);\n        }\n        this.spanRecorder.add(this);\n    };\n    /**\n     * Set observed measurements for this transaction.\n     * @hidden\n     */\n    Transaction.prototype.setMeasurements = function (measurements) {\n        this._measurements = __assign({}, measurements);\n    };\n    /**\n     * Set metadata for this transaction.\n     * @hidden\n     */\n    Transaction.prototype.setMetadata = function (newMetadata) {\n        this.metadata = __assign(__assign({}, this.metadata), newMetadata);\n    };\n    /**\n     * @inheritDoc\n     */\n    Transaction.prototype.finish = function (endTimestamp) {\n        var _this = this;\n        // This transaction is already finished, so we should not flush it again.\n        if (this.endTimestamp !== undefined) {\n            return undefined;\n        }\n        if (!this.name) {\n            logger.warn('Transaction has no name, falling back to `<unlabeled transaction>`.');\n            this.name = '<unlabeled transaction>';\n        }\n        // just sets the end timestamp\n        _super.prototype.finish.call(this, endTimestamp);\n        if (this.sampled !== true) {\n            // At this point if `sampled !== true` we want to discard the transaction.\n            logger.log('[Tracing] Discarding transaction because its trace was not chosen to be sampled.');\n            var client = this._hub.getClient();\n            var transport = client && client.getTransport && client.getTransport();\n            if (transport && transport.recordLostEvent) {\n                transport.recordLostEvent('sample_rate', 'transaction');\n            }\n            return undefined;\n        }\n        var finishedSpans = this.spanRecorder ? this.spanRecorder.spans.filter(function (s) { return s !== _this && s.endTimestamp; }) : [];\n        if (this._trimEnd && finishedSpans.length > 0) {\n            this.endTimestamp = finishedSpans.reduce(function (prev, current) {\n                if (prev.endTimestamp && current.endTimestamp) {\n                    return prev.endTimestamp > current.endTimestamp ? prev : current;\n                }\n                return prev;\n            }).endTimestamp;\n        }\n        var transaction = {\n            contexts: {\n                trace: this.getTraceContext(),\n            },\n            spans: finishedSpans,\n            start_timestamp: this.startTimestamp,\n            tags: this.tags,\n            timestamp: this.endTimestamp,\n            transaction: this.name,\n            type: 'transaction',\n            sdkProcessingMetadata: this.metadata,\n        };\n        var hasMeasurements = Object.keys(this._measurements).length > 0;\n        if (hasMeasurements) {\n            logger.log('[Measurements] Adding measurements to transaction', JSON.stringify(this._measurements, undefined, 2));\n            transaction.measurements = this._measurements;\n        }\n        logger.log(\"[Tracing] Finishing \" + this.op + \" transaction: \" + this.name + \".\");\n        return this._hub.captureEvent(transaction);\n    };\n    /**\n     * @inheritDoc\n     */\n    Transaction.prototype.toContext = function () {\n        var spanContext = _super.prototype.toContext.call(this);\n        return dropUndefinedKeys(__assign(__assign({}, spanContext), { name: this.name, trimEnd: this._trimEnd }));\n    };\n    /**\n     * @inheritDoc\n     */\n    Transaction.prototype.updateWithContext = function (transactionContext) {\n        var _a;\n        _super.prototype.updateWithContext.call(this, transactionContext);\n        this.name = (_a = transactionContext.name, (_a !== null && _a !== void 0 ? _a : ''));\n        this._trimEnd = transactionContext.trimEnd;\n        return this;\n    };\n    return Transaction;\n}(SpanClass));\nexport { Transaction };\n//# sourceMappingURL=transaction.js.map","import { __extends, __values } from \"tslib\";\nimport { logger, timestampWithMs } from '@sentry/utils';\nimport { FINISH_REASON_TAG, IDLE_TRANSACTION_FINISH_REASONS } from './constants';\nimport { SpanRecorder } from './span';\nimport { Transaction } from './transaction';\nexport var DEFAULT_IDLE_TIMEOUT = 1000;\nexport var HEARTBEAT_INTERVAL = 5000;\n/**\n * @inheritDoc\n */\nvar IdleTransactionSpanRecorder = /** @class */ (function (_super) {\n    __extends(IdleTransactionSpanRecorder, _super);\n    function IdleTransactionSpanRecorder(_pushActivity, _popActivity, transactionSpanId, maxlen) {\n        if (transactionSpanId === void 0) { transactionSpanId = ''; }\n        var _this = _super.call(this, maxlen) || this;\n        _this._pushActivity = _pushActivity;\n        _this._popActivity = _popActivity;\n        _this.transactionSpanId = transactionSpanId;\n        return _this;\n    }\n    /**\n     * @inheritDoc\n     */\n    IdleTransactionSpanRecorder.prototype.add = function (span) {\n        var _this = this;\n        // We should make sure we do not push and pop activities for\n        // the transaction that this span recorder belongs to.\n        if (span.spanId !== this.transactionSpanId) {\n            // We patch span.finish() to pop an activity after setting an endTimestamp.\n            span.finish = function (endTimestamp) {\n                span.endTimestamp = typeof endTimestamp === 'number' ? endTimestamp : timestampWithMs();\n                _this._popActivity(span.spanId);\n            };\n            // We should only push new activities if the span does not have an end timestamp.\n            if (span.endTimestamp === undefined) {\n                this._pushActivity(span.spanId);\n            }\n        }\n        _super.prototype.add.call(this, span);\n    };\n    return IdleTransactionSpanRecorder;\n}(SpanRecorder));\nexport { IdleTransactionSpanRecorder };\n/**\n * An IdleTransaction is a transaction that automatically finishes. It does this by tracking child spans as activities.\n * You can have multiple IdleTransactions active, but if the `onScope` option is specified, the idle transaction will\n * put itself on the scope on creation.\n */\nvar IdleTransaction = /** @class */ (function (_super) {\n    __extends(IdleTransaction, _super);\n    function IdleTransaction(transactionContext, _idleHub, \n    /**\n     * The time to wait in ms until the idle transaction will be finished.\n     * @default 1000\n     */\n    _idleTimeout, \n    // Whether or not the transaction should put itself on the scope when it starts and pop itself off when it ends\n    _onScope) {\n        if (_idleTimeout === void 0) { _idleTimeout = DEFAULT_IDLE_TIMEOUT; }\n        if (_onScope === void 0) { _onScope = false; }\n        var _this = _super.call(this, transactionContext, _idleHub) || this;\n        _this._idleHub = _idleHub;\n        _this._idleTimeout = _idleTimeout;\n        _this._onScope = _onScope;\n        // Activities store a list of active spans\n        _this.activities = {};\n        // Amount of times heartbeat has counted. Will cause transaction to finish after 3 beats.\n        _this._heartbeatCounter = 0;\n        // We should not use heartbeat if we finished a transaction\n        _this._finished = false;\n        _this._beforeFinishCallbacks = [];\n        if (_idleHub && _onScope) {\n            // There should only be one active transaction on the scope\n            clearActiveTransaction(_idleHub);\n            // We set the transaction here on the scope so error events pick up the trace\n            // context and attach it to the error.\n            logger.log(\"Setting idle transaction on scope. Span ID: \" + _this.spanId);\n            _idleHub.configureScope(function (scope) { return scope.setSpan(_this); });\n        }\n        _this._initTimeout = setTimeout(function () {\n            if (!_this._finished) {\n                _this.finish();\n            }\n        }, _this._idleTimeout);\n        return _this;\n    }\n    /** {@inheritDoc} */\n    IdleTransaction.prototype.finish = function (endTimestamp) {\n        var e_1, _a;\n        var _this = this;\n        if (endTimestamp === void 0) { endTimestamp = timestampWithMs(); }\n        this._finished = true;\n        this.activities = {};\n        if (this.spanRecorder) {\n            logger.log('[Tracing] finishing IdleTransaction', new Date(endTimestamp * 1000).toISOString(), this.op);\n            try {\n                for (var _b = __values(this._beforeFinishCallbacks), _c = _b.next(); !_c.done; _c = _b.next()) {\n                    var callback = _c.value;\n                    callback(this, endTimestamp);\n                }\n            }\n            catch (e_1_1) { e_1 = { error: e_1_1 }; }\n            finally {\n                try {\n                    if (_c && !_c.done && (_a = _b.return)) _a.call(_b);\n                }\n                finally { if (e_1) throw e_1.error; }\n            }\n            this.spanRecorder.spans = this.spanRecorder.spans.filter(function (span) {\n                // If we are dealing with the transaction itself, we just return it\n                if (span.spanId === _this.spanId) {\n                    return true;\n                }\n                // We cancel all pending spans with status \"cancelled\" to indicate the idle transaction was finished early\n                if (!span.endTimestamp) {\n                    span.endTimestamp = endTimestamp;\n                    span.setStatus('cancelled');\n                    logger.log('[Tracing] cancelling span since transaction ended early', JSON.stringify(span, undefined, 2));\n                }\n                var keepSpan = span.startTimestamp < endTimestamp;\n                if (!keepSpan) {\n                    logger.log('[Tracing] discarding Span since it happened after Transaction was finished', JSON.stringify(span, undefined, 2));\n                }\n                return keepSpan;\n            });\n            logger.log('[Tracing] flushing IdleTransaction');\n        }\n        else {\n            logger.log('[Tracing] No active IdleTransaction');\n        }\n        // if `this._onScope` is `true`, the transaction put itself on the scope when it started\n        if (this._onScope) {\n            clearActiveTransaction(this._idleHub);\n        }\n        return _super.prototype.finish.call(this, endTimestamp);\n    };\n    /**\n     * Register a callback function that gets excecuted before the transaction finishes.\n     * Useful for cleanup or if you want to add any additional spans based on current context.\n     *\n     * This is exposed because users have no other way of running something before an idle transaction\n     * finishes.\n     */\n    IdleTransaction.prototype.registerBeforeFinishCallback = function (callback) {\n        this._beforeFinishCallbacks.push(callback);\n    };\n    /**\n     * @inheritDoc\n     */\n    IdleTransaction.prototype.initSpanRecorder = function (maxlen) {\n        var _this = this;\n        if (!this.spanRecorder) {\n            var pushActivity = function (id) {\n                if (_this._finished) {\n                    return;\n                }\n                _this._pushActivity(id);\n            };\n            var popActivity = function (id) {\n                if (_this._finished) {\n                    return;\n                }\n                _this._popActivity(id);\n            };\n            this.spanRecorder = new IdleTransactionSpanRecorder(pushActivity, popActivity, this.spanId, maxlen);\n            // Start heartbeat so that transactions do not run forever.\n            logger.log('Starting heartbeat');\n            this._pingHeartbeat();\n        }\n        this.spanRecorder.add(this);\n    };\n    /**\n     * Start tracking a specific activity.\n     * @param spanId The span id that represents the activity\n     */\n    IdleTransaction.prototype._pushActivity = function (spanId) {\n        if (this._initTimeout) {\n            clearTimeout(this._initTimeout);\n            this._initTimeout = undefined;\n        }\n        logger.log(\"[Tracing] pushActivity: \" + spanId);\n        this.activities[spanId] = true;\n        logger.log('[Tracing] new activities count', Object.keys(this.activities).length);\n    };\n    /**\n     * Remove an activity from usage\n     * @param spanId The span id that represents the activity\n     */\n    IdleTransaction.prototype._popActivity = function (spanId) {\n        var _this = this;\n        if (this.activities[spanId]) {\n            logger.log(\"[Tracing] popActivity \" + spanId);\n            // eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n            delete this.activities[spanId];\n            logger.log('[Tracing] new activities count', Object.keys(this.activities).length);\n        }\n        if (Object.keys(this.activities).length === 0) {\n            var timeout = this._idleTimeout;\n            // We need to add the timeout here to have the real endtimestamp of the transaction\n            // Remember timestampWithMs is in seconds, timeout is in ms\n            var end_1 = timestampWithMs() + timeout / 1000;\n            setTimeout(function () {\n                if (!_this._finished) {\n                    _this.setTag(FINISH_REASON_TAG, IDLE_TRANSACTION_FINISH_REASONS[1]);\n                    _this.finish(end_1);\n                }\n            }, timeout);\n        }\n    };\n    /**\n     * Checks when entries of this.activities are not changing for 3 beats.\n     * If this occurs we finish the transaction.\n     */\n    IdleTransaction.prototype._beat = function () {\n        // We should not be running heartbeat if the idle transaction is finished.\n        if (this._finished) {\n            return;\n        }\n        var heartbeatString = Object.keys(this.activities).join('');\n        if (heartbeatString === this._prevHeartbeatString) {\n            this._heartbeatCounter += 1;\n        }\n        else {\n            this._heartbeatCounter = 1;\n        }\n        this._prevHeartbeatString = heartbeatString;\n        if (this._heartbeatCounter >= 3) {\n            logger.log(\"[Tracing] Transaction finished because of no change for 3 heart beats\");\n            this.setStatus('deadline_exceeded');\n            this.setTag(FINISH_REASON_TAG, IDLE_TRANSACTION_FINISH_REASONS[0]);\n            this.finish();\n        }\n        else {\n            this._pingHeartbeat();\n        }\n    };\n    /**\n     * Pings the heartbeat\n     */\n    IdleTransaction.prototype._pingHeartbeat = function () {\n        var _this = this;\n        logger.log(\"pinging Heartbeat -> current counter: \" + this._heartbeatCounter);\n        setTimeout(function () {\n            _this._beat();\n        }, HEARTBEAT_INTERVAL);\n    };\n    return IdleTransaction;\n}(Transaction));\nexport { IdleTransaction };\n/**\n * Reset transaction on scope to `undefined`\n */\nfunction clearActiveTransaction(hub) {\n    if (hub) {\n        var scope = hub.getScope();\n        if (scope) {\n            var transaction = scope.getTransaction();\n            if (transaction) {\n                scope.setSpan(undefined);\n            }\n        }\n    }\n}\n//# sourceMappingURL=idletransaction.js.map","import { __assign, __read, __spread } from \"tslib\";\nimport { getMainCarrier } from '@sentry/hub';\nimport { dynamicRequire, isNodeEnv, loadModule, logger } from '@sentry/utils';\nimport { registerErrorInstrumentation } from './errors';\nimport { IdleTransaction } from './idletransaction';\nimport { Transaction } from './transaction';\nimport { hasTracingEnabled } from './utils';\n/** Returns all trace headers that are currently on the top scope. */\nfunction traceHeaders() {\n    var scope = this.getScope();\n    if (scope) {\n        var span = scope.getSpan();\n        if (span) {\n            return {\n                'sentry-trace': span.toTraceparent(),\n            };\n        }\n    }\n    return {};\n}\n/**\n * Makes a sampling decision for the given transaction and stores it on the transaction.\n *\n * Called every time a transaction is created. Only transactions which emerge with a `sampled` value of `true` will be\n * sent to Sentry.\n *\n * @param transaction: The transaction needing a sampling decision\n * @param options: The current client's options, so we can access `tracesSampleRate` and/or `tracesSampler`\n * @param samplingContext: Default and user-provided data which may be used to help make the decision\n *\n * @returns The given transaction with its `sampled` value set\n */\nfunction sample(transaction, options, samplingContext) {\n    // nothing to do if tracing is not enabled\n    if (!hasTracingEnabled(options)) {\n        transaction.sampled = false;\n        return transaction;\n    }\n    // if the user has forced a sampling decision by passing a `sampled` value in their transaction context, go with that\n    if (transaction.sampled !== undefined) {\n        transaction.setMetadata({\n            transactionSampling: { method: 'explicitly_set' },\n        });\n        return transaction;\n    }\n    // we would have bailed already if neither `tracesSampler` nor `tracesSampleRate` were defined, so one of these should\n    // work; prefer the hook if so\n    var sampleRate;\n    if (typeof options.tracesSampler === 'function') {\n        sampleRate = options.tracesSampler(samplingContext);\n        transaction.setMetadata({\n            transactionSampling: {\n                method: 'client_sampler',\n                // cast to number in case it's a boolean\n                rate: Number(sampleRate),\n            },\n        });\n    }\n    else if (samplingContext.parentSampled !== undefined) {\n        sampleRate = samplingContext.parentSampled;\n        transaction.setMetadata({\n            transactionSampling: { method: 'inheritance' },\n        });\n    }\n    else {\n        sampleRate = options.tracesSampleRate;\n        transaction.setMetadata({\n            transactionSampling: {\n                method: 'client_rate',\n                // cast to number in case it's a boolean\n                rate: Number(sampleRate),\n            },\n        });\n    }\n    // Since this is coming from the user (or from a function provided by the user), who knows what we might get. (The\n    // only valid values are booleans or numbers between 0 and 1.)\n    if (!isValidSampleRate(sampleRate)) {\n        logger.warn(\"[Tracing] Discarding transaction because of invalid sample rate.\");\n        transaction.sampled = false;\n        return transaction;\n    }\n    // if the function returned 0 (or false), or if `tracesSampleRate` is 0, it's a sign the transaction should be dropped\n    if (!sampleRate) {\n        logger.log(\"[Tracing] Discarding transaction because \" + (typeof options.tracesSampler === 'function'\n            ? 'tracesSampler returned 0 or false'\n            : 'a negative sampling decision was inherited or tracesSampleRate is set to 0'));\n        transaction.sampled = false;\n        return transaction;\n    }\n    // Now we roll the dice. Math.random is inclusive of 0, but not of 1, so strict < is safe here. In case sampleRate is\n    // a boolean, the < comparison will cause it to be automatically cast to 1 if it's true and 0 if it's false.\n    transaction.sampled = Math.random() < sampleRate;\n    // if we're not going to keep it, we're done\n    if (!transaction.sampled) {\n        logger.log(\"[Tracing] Discarding transaction because it's not included in the random sample (sampling rate = \" + Number(sampleRate) + \")\");\n        return transaction;\n    }\n    logger.log(\"[Tracing] starting \" + transaction.op + \" transaction - \" + transaction.name);\n    return transaction;\n}\n/**\n * Checks the given sample rate to make sure it is valid type and value (a boolean, or a number between 0 and 1).\n */\nfunction isValidSampleRate(rate) {\n    // we need to check NaN explicitly because it's of type 'number' and therefore wouldn't get caught by this typecheck\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    if (isNaN(rate) || !(typeof rate === 'number' || typeof rate === 'boolean')) {\n        logger.warn(\"[Tracing] Given sample rate is invalid. Sample rate must be a boolean or a number between 0 and 1. Got \" + JSON.stringify(rate) + \" of type \" + JSON.stringify(typeof rate) + \".\");\n        return false;\n    }\n    // in case sampleRate is a boolean, it will get automatically cast to 1 if it's true and 0 if it's false\n    if (rate < 0 || rate > 1) {\n        logger.warn(\"[Tracing] Given sample rate is invalid. Sample rate must be between 0 and 1. Got \" + rate + \".\");\n        return false;\n    }\n    return true;\n}\n/**\n * Creates a new transaction and adds a sampling decision if it doesn't yet have one.\n *\n * The Hub.startTransaction method delegates to this method to do its work, passing the Hub instance in as `this`, as if\n * it had been called on the hub directly. Exists as a separate function so that it can be injected into the class as an\n * \"extension method.\"\n *\n * @param this: The Hub starting the transaction\n * @param transactionContext: Data used to configure the transaction\n * @param CustomSamplingContext: Optional data to be provided to the `tracesSampler` function (if any)\n *\n * @returns The new transaction\n *\n * @see {@link Hub.startTransaction}\n */\nfunction _startTransaction(transactionContext, customSamplingContext) {\n    var client = this.getClient();\n    var options = (client && client.getOptions()) || {};\n    var transaction = new Transaction(transactionContext, this);\n    transaction = sample(transaction, options, __assign({ parentSampled: transactionContext.parentSampled, transactionContext: transactionContext }, customSamplingContext));\n    if (transaction.sampled) {\n        transaction.initSpanRecorder(options._experiments && options._experiments.maxSpans);\n    }\n    return transaction;\n}\n/**\n * Create new idle transaction.\n */\nexport function startIdleTransaction(hub, transactionContext, idleTimeout, onScope, customSamplingContext) {\n    var client = hub.getClient();\n    var options = (client && client.getOptions()) || {};\n    var transaction = new IdleTransaction(transactionContext, hub, idleTimeout, onScope);\n    transaction = sample(transaction, options, __assign({ parentSampled: transactionContext.parentSampled, transactionContext: transactionContext }, customSamplingContext));\n    if (transaction.sampled) {\n        transaction.initSpanRecorder(options._experiments && options._experiments.maxSpans);\n    }\n    return transaction;\n}\n/**\n * @private\n */\nexport function _addTracingExtensions() {\n    var carrier = getMainCarrier();\n    if (!carrier.__SENTRY__) {\n        return;\n    }\n    carrier.__SENTRY__.extensions = carrier.__SENTRY__.extensions || {};\n    if (!carrier.__SENTRY__.extensions.startTransaction) {\n        carrier.__SENTRY__.extensions.startTransaction = _startTransaction;\n    }\n    if (!carrier.__SENTRY__.extensions.traceHeaders) {\n        carrier.__SENTRY__.extensions.traceHeaders = traceHeaders;\n    }\n}\n/**\n * @private\n */\nfunction _autoloadDatabaseIntegrations() {\n    var carrier = getMainCarrier();\n    if (!carrier.__SENTRY__) {\n        return;\n    }\n    var packageToIntegrationMapping = {\n        mongodb: function () {\n            var integration = dynamicRequire(module, './integrations/node/mongo');\n            return new integration.Mongo();\n        },\n        mongoose: function () {\n            var integration = dynamicRequire(module, './integrations/node/mongo');\n            return new integration.Mongo({ mongoose: true });\n        },\n        mysql: function () {\n            var integration = dynamicRequire(module, './integrations/node/mysql');\n            return new integration.Mysql();\n        },\n        pg: function () {\n            var integration = dynamicRequire(module, './integrations/node/postgres');\n            return new integration.Postgres();\n        },\n    };\n    var mappedPackages = Object.keys(packageToIntegrationMapping)\n        .filter(function (moduleName) { return !!loadModule(moduleName); })\n        .map(function (pkg) {\n        try {\n            return packageToIntegrationMapping[pkg]();\n        }\n        catch (e) {\n            return undefined;\n        }\n    })\n        .filter(function (p) { return p; });\n    if (mappedPackages.length > 0) {\n        carrier.__SENTRY__.integrations = __spread((carrier.__SENTRY__.integrations || []), mappedPackages);\n    }\n}\n/**\n * This patches the global object and injects the Tracing extensions methods\n */\nexport function addExtensionMethods() {\n    _addTracingExtensions();\n    // Detect and automatically load specified integrations.\n    if (isNodeEnv()) {\n        _autoloadDatabaseIntegrations();\n    }\n    // If an error happens globally, we should make sure transaction status is set to error.\n    registerErrorInstrumentation();\n}\n//# sourceMappingURL=hubextensions.js.map","import { getGlobalObject, logger } from '@sentry/utils';\nimport { FINISH_REASON_TAG, IDLE_TRANSACTION_FINISH_REASONS } from '../constants';\nimport { getActiveTransaction } from '../utils';\nvar global = getGlobalObject();\n/**\n * Add a listener that cancels and finishes a transaction when the global\n * document is hidden.\n */\nexport function registerBackgroundTabDetection() {\n    if (global && global.document) {\n        global.document.addEventListener('visibilitychange', function () {\n            var activeTransaction = getActiveTransaction();\n            if (global.document.hidden && activeTransaction) {\n                var statusType = 'cancelled';\n                logger.log(\"[Tracing] Transaction: \" + statusType + \" -> since tab moved to the background, op: \" + activeTransaction.op);\n                // We should not set status if it is already set, this prevent important statuses like\n                // error or data loss from being overwritten on transaction.\n                if (!activeTransaction.status) {\n                    activeTransaction.setStatus(statusType);\n                }\n                activeTransaction.setTag('visibilitychange', 'document.hidden');\n                activeTransaction.setTag(FINISH_REASON_TAG, IDLE_TRANSACTION_FINISH_REASONS[2]);\n                activeTransaction.finish();\n            }\n        });\n    }\n    else {\n        logger.warn('[Tracing] Could not set up background tab detection due to lack of global document');\n    }\n}\n//# sourceMappingURL=backgroundtab.js.map","/*\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nexport var bindReporter = function (callback, metric, reportAllChanges) {\n    var prevValue;\n    return function (forceReport) {\n        if (metric.value >= 0) {\n            if (forceReport || reportAllChanges) {\n                metric.delta = metric.value - (prevValue || 0);\n                // Report the metric if there's a non-zero delta or if no previous\n                // value exists (which can happen in the case of the document becoming\n                // hidden when the metric value is 0).\n                // See: https://github.com/GoogleChrome/web-vitals/issues/14\n                if (metric.delta || prevValue === undefined) {\n                    prevValue = metric.value;\n                    callback(metric);\n                }\n            }\n        }\n    };\n};\n//# sourceMappingURL=bindReporter.js.map","/*\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * Performantly generate a unique, 30-char string by combining a version\n * number, the current timestamp with a 13-digit number integer.\n * @return {string}\n */\nexport var generateUniqueID = function () {\n    return \"v2-\" + Date.now() + \"-\" + (Math.floor(Math.random() * (9e12 - 1)) + 1e12);\n};\n//# sourceMappingURL=generateUniqueID.js.map","/*\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { generateUniqueID } from './generateUniqueID';\nexport var initMetric = function (name, value) {\n    return {\n        name: name,\n        value: (value !== null && value !== void 0 ? value : -1),\n        delta: 0,\n        entries: [],\n        id: generateUniqueID(),\n    };\n};\n//# sourceMappingURL=initMetric.js.map","/*\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * Takes a performance entry type and a callback function, and creates a\n * `PerformanceObserver` instance that will observe the specified entry type\n * with buffering enabled and call the callback _for each entry_.\n *\n * This function also feature-detects entry support and wraps the logic in a\n * try/catch to avoid errors in unsupporting browsers.\n */\nexport var observe = function (type, callback) {\n    try {\n        if (PerformanceObserver.supportedEntryTypes.includes(type)) {\n            // More extensive feature detect needed for Firefox due to:\n            // https://github.com/GoogleChrome/web-vitals/issues/142\n            if (type === 'first-input' && !('PerformanceEventTiming' in self)) {\n                return;\n            }\n            var po = new PerformanceObserver(function (l) { return l.getEntries().map(callback); });\n            po.observe({ type: type, buffered: true });\n            return po;\n        }\n    }\n    catch (e) {\n        // Do nothing.\n    }\n    return;\n};\n//# sourceMappingURL=observe.js.map","/*\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { getGlobalObject } from '@sentry/utils';\nexport var onHidden = function (cb, once) {\n    var onHiddenOrPageHide = function (event) {\n        if (event.type === 'pagehide' || getGlobalObject().document.visibilityState === 'hidden') {\n            cb(event);\n            if (once) {\n                removeEventListener('visibilitychange', onHiddenOrPageHide, true);\n                removeEventListener('pagehide', onHiddenOrPageHide, true);\n            }\n        }\n    };\n    addEventListener('visibilitychange', onHiddenOrPageHide, true);\n    // Some browsers have buggy implementations of visibilitychange,\n    // so we use pagehide in addition, just to be safe.\n    addEventListener('pagehide', onHiddenOrPageHide, true);\n};\n//# sourceMappingURL=onHidden.js.map","/*\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { bindReporter } from './lib/bindReporter';\nimport { initMetric } from './lib/initMetric';\nimport { observe } from './lib/observe';\nimport { onHidden } from './lib/onHidden';\nexport var getCLS = function (onReport, reportAllChanges) {\n    var metric = initMetric('CLS', 0);\n    var report;\n    var sessionValue = 0;\n    var sessionEntries = [];\n    var entryHandler = function (entry) {\n        // Only count layout shifts without recent user input.\n        // TODO: Figure out why entry can be undefined\n        if (entry && !entry.hadRecentInput) {\n            var firstSessionEntry = sessionEntries[0];\n            var lastSessionEntry = sessionEntries[sessionEntries.length - 1];\n            // If the entry occurred less than 1 second after the previous entry and\n            // less than 5 seconds after the first entry in the session, include the\n            // entry in the current session. Otherwise, start a new session.\n            if (sessionValue &&\n                sessionEntries.length !== 0 &&\n                entry.startTime - lastSessionEntry.startTime < 1000 &&\n                entry.startTime - firstSessionEntry.startTime < 5000) {\n                sessionValue += entry.value;\n                sessionEntries.push(entry);\n            }\n            else {\n                sessionValue = entry.value;\n                sessionEntries = [entry];\n            }\n            // If the current session value is larger than the current CLS value,\n            // update CLS and the entries contributing to it.\n            if (sessionValue > metric.value) {\n                metric.value = sessionValue;\n                metric.entries = sessionEntries;\n                if (report) {\n                    report();\n                }\n            }\n        }\n    };\n    var po = observe('layout-shift', entryHandler);\n    if (po) {\n        report = bindReporter(onReport, metric, reportAllChanges);\n        onHidden(function () {\n            po.takeRecords().map(entryHandler);\n            report(true);\n        });\n    }\n};\n//# sourceMappingURL=getCLS.js.map","/*\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { getGlobalObject } from '@sentry/utils';\nimport { onHidden } from './onHidden';\nvar firstHiddenTime = -1;\nvar initHiddenTime = function () {\n    return getGlobalObject().document.visibilityState === 'hidden' ? 0 : Infinity;\n};\nvar trackChanges = function () {\n    // Update the time if/when the document becomes hidden.\n    onHidden(function (_a) {\n        var timeStamp = _a.timeStamp;\n        firstHiddenTime = timeStamp;\n    }, true);\n};\nexport var getVisibilityWatcher = function () {\n    if (firstHiddenTime < 0) {\n        // If the document is hidden when this code runs, assume it was hidden\n        // since navigation start. This isn't a perfect heuristic, but it's the\n        // best we can do until an API is available to support querying past\n        // visibilityState.\n        firstHiddenTime = initHiddenTime();\n        trackChanges();\n    }\n    return {\n        get firstHiddenTime() {\n            return firstHiddenTime;\n        },\n    };\n};\n//# sourceMappingURL=getVisibilityWatcher.js.map","/*\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { bindReporter } from './lib/bindReporter';\nimport { getVisibilityWatcher } from './lib/getVisibilityWatcher';\nimport { initMetric } from './lib/initMetric';\nimport { observe } from './lib/observe';\nimport { onHidden } from './lib/onHidden';\nexport var getFID = function (onReport, reportAllChanges) {\n    var visibilityWatcher = getVisibilityWatcher();\n    var metric = initMetric('FID');\n    var report;\n    var entryHandler = function (entry) {\n        // Only report if the page wasn't hidden prior to the first input.\n        if (report && entry.startTime < visibilityWatcher.firstHiddenTime) {\n            metric.value = entry.processingStart - entry.startTime;\n            metric.entries.push(entry);\n            report(true);\n        }\n    };\n    var po = observe('first-input', entryHandler);\n    if (po) {\n        report = bindReporter(onReport, metric, reportAllChanges);\n        onHidden(function () {\n            po.takeRecords().map(entryHandler);\n            po.disconnect();\n        }, true);\n    }\n};\n//# sourceMappingURL=getFID.js.map","/*\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { bindReporter } from './lib/bindReporter';\nimport { getVisibilityWatcher } from './lib/getVisibilityWatcher';\nimport { initMetric } from './lib/initMetric';\nimport { observe } from './lib/observe';\nimport { onHidden } from './lib/onHidden';\nvar reportedMetricIDs = {};\nexport var getLCP = function (onReport, reportAllChanges) {\n    var visibilityWatcher = getVisibilityWatcher();\n    var metric = initMetric('LCP');\n    var report;\n    var entryHandler = function (entry) {\n        // The startTime attribute returns the value of the renderTime if it is not 0,\n        // and the value of the loadTime otherwise.\n        var value = entry.startTime;\n        // If the page was hidden prior to paint time of the entry,\n        // ignore it and mark the metric as final, otherwise add the entry.\n        if (value < visibilityWatcher.firstHiddenTime) {\n            metric.value = value;\n            metric.entries.push(entry);\n        }\n        if (report) {\n            report();\n        }\n    };\n    var po = observe('largest-contentful-paint', entryHandler);\n    if (po) {\n        report = bindReporter(onReport, metric, reportAllChanges);\n        var stopListening_1 = function () {\n            if (!reportedMetricIDs[metric.id]) {\n                po.takeRecords().map(entryHandler);\n                po.disconnect();\n                reportedMetricIDs[metric.id] = true;\n                report(true);\n            }\n        };\n        // Stop listening after input. Note: while scrolling is an input that\n        // stop LCP observation, it's unreliable since it can be programmatically\n        // generated. See: https://github.com/GoogleChrome/web-vitals/issues/75\n        ['keydown', 'click'].forEach(function (type) {\n            addEventListener(type, stopListening_1, { once: true, capture: true });\n        });\n        onHidden(stopListening_1, true);\n    }\n};\n//# sourceMappingURL=getLCP.js.map","import { __assign, __rest } from \"tslib\";\nimport { browserPerformanceTimeOrigin, getGlobalObject, htmlTreeAsString, isNodeEnv, logger } from '@sentry/utils';\nimport { msToSec } from '../utils';\nimport { getCLS } from './web-vitals/getCLS';\nimport { getFID } from './web-vitals/getFID';\nimport { getLCP } from './web-vitals/getLCP';\nimport { getVisibilityWatcher } from './web-vitals/lib/getVisibilityWatcher';\nvar global = getGlobalObject();\n/** Class tracking metrics  */\nvar MetricsInstrumentation = /** @class */ (function () {\n    function MetricsInstrumentation(_reportAllChanges) {\n        if (_reportAllChanges === void 0) { _reportAllChanges = false; }\n        this._reportAllChanges = _reportAllChanges;\n        this._measurements = {};\n        this._performanceCursor = 0;\n        if (!isNodeEnv() && global && global.performance && global.document) {\n            if (global.performance.mark) {\n                global.performance.mark('sentry-tracing-init');\n            }\n            this._trackCLS();\n            this._trackLCP();\n            this._trackFID();\n        }\n    }\n    /** Add performance related spans to a transaction */\n    MetricsInstrumentation.prototype.addPerformanceEntries = function (transaction) {\n        var _this = this;\n        if (!global || !global.performance || !global.performance.getEntries || !browserPerformanceTimeOrigin) {\n            // Gatekeeper if performance API not available\n            return;\n        }\n        logger.log('[Tracing] Adding & adjusting spans using Performance API');\n        var timeOrigin = msToSec(browserPerformanceTimeOrigin);\n        var responseStartTimestamp;\n        var requestStartTimestamp;\n        global.performance\n            .getEntries()\n            .slice(this._performanceCursor)\n            .forEach(function (entry) {\n            var startTime = msToSec(entry.startTime);\n            var duration = msToSec(entry.duration);\n            if (transaction.op === 'navigation' && timeOrigin + startTime < transaction.startTimestamp) {\n                return;\n            }\n            switch (entry.entryType) {\n                case 'navigation': {\n                    addNavigationSpans(transaction, entry, timeOrigin);\n                    responseStartTimestamp = timeOrigin + msToSec(entry.responseStart);\n                    requestStartTimestamp = timeOrigin + msToSec(entry.requestStart);\n                    break;\n                }\n                case 'mark':\n                case 'paint':\n                case 'measure': {\n                    var startTimestamp = addMeasureSpans(transaction, entry, startTime, duration, timeOrigin);\n                    // capture web vitals\n                    var firstHidden = getVisibilityWatcher();\n                    // Only report if the page wasn't hidden prior to the web vital.\n                    var shouldRecord = entry.startTime < firstHidden.firstHiddenTime;\n                    if (entry.name === 'first-paint' && shouldRecord) {\n                        logger.log('[Measurements] Adding FP');\n                        _this._measurements['fp'] = { value: entry.startTime };\n                        _this._measurements['mark.fp'] = { value: startTimestamp };\n                    }\n                    if (entry.name === 'first-contentful-paint' && shouldRecord) {\n                        logger.log('[Measurements] Adding FCP');\n                        _this._measurements['fcp'] = { value: entry.startTime };\n                        _this._measurements['mark.fcp'] = { value: startTimestamp };\n                    }\n                    break;\n                }\n                case 'resource': {\n                    var resourceName = entry.name.replace(global.location.origin, '');\n                    addResourceSpans(transaction, entry, resourceName, startTime, duration, timeOrigin);\n                    break;\n                }\n                default:\n                // Ignore other entry types.\n            }\n        });\n        this._performanceCursor = Math.max(performance.getEntries().length - 1, 0);\n        this._trackNavigator(transaction);\n        // Measurements are only available for pageload transactions\n        if (transaction.op === 'pageload') {\n            // normalize applicable web vital values to be relative to transaction.startTimestamp\n            var timeOrigin_1 = msToSec(browserPerformanceTimeOrigin);\n            // Generate TTFB (Time to First Byte), which measured as the time between the beginning of the transaction and the\n            // start of the response in milliseconds\n            if (typeof responseStartTimestamp === 'number') {\n                logger.log('[Measurements] Adding TTFB');\n                this._measurements['ttfb'] = { value: (responseStartTimestamp - transaction.startTimestamp) * 1000 };\n                if (typeof requestStartTimestamp === 'number' && requestStartTimestamp <= responseStartTimestamp) {\n                    // Capture the time spent making the request and receiving the first byte of the response.\n                    // This is the time between the start of the request and the start of the response in milliseconds.\n                    this._measurements['ttfb.requestTime'] = { value: (responseStartTimestamp - requestStartTimestamp) * 1000 };\n                }\n            }\n            ['fcp', 'fp', 'lcp'].forEach(function (name) {\n                if (!_this._measurements[name] || timeOrigin_1 >= transaction.startTimestamp) {\n                    return;\n                }\n                // The web vitals, fcp, fp, lcp, and ttfb, all measure relative to timeOrigin.\n                // Unfortunately, timeOrigin is not captured within the transaction span data, so these web vitals will need\n                // to be adjusted to be relative to transaction.startTimestamp.\n                var oldValue = _this._measurements[name].value;\n                var measurementTimestamp = timeOrigin_1 + msToSec(oldValue);\n                // normalizedValue should be in milliseconds\n                var normalizedValue = Math.abs((measurementTimestamp - transaction.startTimestamp) * 1000);\n                var delta = normalizedValue - oldValue;\n                logger.log(\"[Measurements] Normalized \" + name + \" from \" + oldValue + \" to \" + normalizedValue + \" (\" + delta + \")\");\n                _this._measurements[name].value = normalizedValue;\n            });\n            if (this._measurements['mark.fid'] && this._measurements['fid']) {\n                // create span for FID\n                _startChild(transaction, {\n                    description: 'first input delay',\n                    endTimestamp: this._measurements['mark.fid'].value + msToSec(this._measurements['fid'].value),\n                    op: 'web.vitals',\n                    startTimestamp: this._measurements['mark.fid'].value,\n                });\n            }\n            // If FCP is not recorded we should not record the cls value\n            // according to the new definition of CLS.\n            if (!('fcp' in this._measurements)) {\n                delete this._measurements.cls;\n            }\n            transaction.setMeasurements(this._measurements);\n            tagMetricInfo(transaction, this._lcpEntry, this._clsEntry);\n            transaction.setTag('sentry_reportAllChanges', this._reportAllChanges);\n        }\n    };\n    /**\n     * Capture the information of the user agent.\n     */\n    MetricsInstrumentation.prototype._trackNavigator = function (transaction) {\n        var navigator = global.navigator;\n        if (!navigator) {\n            return;\n        }\n        // track network connectivity\n        var connection = navigator.connection;\n        if (connection) {\n            if (connection.effectiveType) {\n                transaction.setTag('effectiveConnectionType', connection.effectiveType);\n            }\n            if (connection.type) {\n                transaction.setTag('connectionType', connection.type);\n            }\n            if (isMeasurementValue(connection.rtt)) {\n                this._measurements['connection.rtt'] = { value: connection.rtt };\n            }\n            if (isMeasurementValue(connection.downlink)) {\n                this._measurements['connection.downlink'] = { value: connection.downlink };\n            }\n        }\n        if (isMeasurementValue(navigator.deviceMemory)) {\n            transaction.setTag('deviceMemory', String(navigator.deviceMemory));\n        }\n        if (isMeasurementValue(navigator.hardwareConcurrency)) {\n            transaction.setTag('hardwareConcurrency', String(navigator.hardwareConcurrency));\n        }\n    };\n    /** Starts tracking the Cumulative Layout Shift on the current page. */\n    MetricsInstrumentation.prototype._trackCLS = function () {\n        var _this = this;\n        // See:\n        // https://web.dev/evolving-cls/\n        // https://web.dev/cls-web-tooling/\n        getCLS(function (metric) {\n            var entry = metric.entries.pop();\n            if (!entry) {\n                return;\n            }\n            logger.log('[Measurements] Adding CLS');\n            _this._measurements['cls'] = { value: metric.value };\n            _this._clsEntry = entry;\n        });\n    };\n    /** Starts tracking the Largest Contentful Paint on the current page. */\n    MetricsInstrumentation.prototype._trackLCP = function () {\n        var _this = this;\n        getLCP(function (metric) {\n            var entry = metric.entries.pop();\n            if (!entry) {\n                return;\n            }\n            var timeOrigin = msToSec(browserPerformanceTimeOrigin);\n            var startTime = msToSec(entry.startTime);\n            logger.log('[Measurements] Adding LCP');\n            _this._measurements['lcp'] = { value: metric.value };\n            _this._measurements['mark.lcp'] = { value: timeOrigin + startTime };\n            _this._lcpEntry = entry;\n        }, this._reportAllChanges);\n    };\n    /** Starts tracking the First Input Delay on the current page. */\n    MetricsInstrumentation.prototype._trackFID = function () {\n        var _this = this;\n        getFID(function (metric) {\n            var entry = metric.entries.pop();\n            if (!entry) {\n                return;\n            }\n            var timeOrigin = msToSec(browserPerformanceTimeOrigin);\n            var startTime = msToSec(entry.startTime);\n            logger.log('[Measurements] Adding FID');\n            _this._measurements['fid'] = { value: metric.value };\n            _this._measurements['mark.fid'] = { value: timeOrigin + startTime };\n        });\n    };\n    return MetricsInstrumentation;\n}());\nexport { MetricsInstrumentation };\n/** Instrument navigation entries */\nfunction addNavigationSpans(transaction, entry, timeOrigin) {\n    ['unloadEvent', 'redirect', 'domContentLoadedEvent', 'loadEvent', 'connect'].forEach(function (event) {\n        addPerformanceNavigationTiming(transaction, entry, event, timeOrigin);\n    });\n    addPerformanceNavigationTiming(transaction, entry, 'secureConnection', timeOrigin, 'TLS/SSL', 'connectEnd');\n    addPerformanceNavigationTiming(transaction, entry, 'fetch', timeOrigin, 'cache', 'domainLookupStart');\n    addPerformanceNavigationTiming(transaction, entry, 'domainLookup', timeOrigin, 'DNS');\n    addRequest(transaction, entry, timeOrigin);\n}\n/** Create measure related spans */\nfunction addMeasureSpans(transaction, entry, startTime, duration, timeOrigin) {\n    var measureStartTimestamp = timeOrigin + startTime;\n    var measureEndTimestamp = measureStartTimestamp + duration;\n    _startChild(transaction, {\n        description: entry.name,\n        endTimestamp: measureEndTimestamp,\n        op: entry.entryType,\n        startTimestamp: measureStartTimestamp,\n    });\n    return measureStartTimestamp;\n}\n/** Create resource-related spans */\nexport function addResourceSpans(transaction, entry, resourceName, startTime, duration, timeOrigin) {\n    // we already instrument based on fetch and xhr, so we don't need to\n    // duplicate spans here.\n    if (entry.initiatorType === 'xmlhttprequest' || entry.initiatorType === 'fetch') {\n        return;\n    }\n    var data = {};\n    if ('transferSize' in entry) {\n        data['Transfer Size'] = entry.transferSize;\n    }\n    if ('encodedBodySize' in entry) {\n        data['Encoded Body Size'] = entry.encodedBodySize;\n    }\n    if ('decodedBodySize' in entry) {\n        data['Decoded Body Size'] = entry.decodedBodySize;\n    }\n    var startTimestamp = timeOrigin + startTime;\n    var endTimestamp = startTimestamp + duration;\n    _startChild(transaction, {\n        description: resourceName,\n        endTimestamp: endTimestamp,\n        op: entry.initiatorType ? \"resource.\" + entry.initiatorType : 'resource',\n        startTimestamp: startTimestamp,\n        data: data,\n    });\n}\n/** Create performance navigation related spans */\nfunction addPerformanceNavigationTiming(transaction, entry, event, timeOrigin, description, eventEnd) {\n    var end = eventEnd ? entry[eventEnd] : entry[event + \"End\"];\n    var start = entry[event + \"Start\"];\n    if (!start || !end) {\n        return;\n    }\n    _startChild(transaction, {\n        op: 'browser',\n        description: (description !== null && description !== void 0 ? description : event),\n        startTimestamp: timeOrigin + msToSec(start),\n        endTimestamp: timeOrigin + msToSec(end),\n    });\n}\n/** Create request and response related spans */\nfunction addRequest(transaction, entry, timeOrigin) {\n    _startChild(transaction, {\n        op: 'browser',\n        description: 'request',\n        startTimestamp: timeOrigin + msToSec(entry.requestStart),\n        endTimestamp: timeOrigin + msToSec(entry.responseEnd),\n    });\n    _startChild(transaction, {\n        op: 'browser',\n        description: 'response',\n        startTimestamp: timeOrigin + msToSec(entry.responseStart),\n        endTimestamp: timeOrigin + msToSec(entry.responseEnd),\n    });\n}\n/**\n * Helper function to start child on transactions. This function will make sure that the transaction will\n * use the start timestamp of the created child span if it is earlier than the transactions actual\n * start timestamp.\n */\nexport function _startChild(transaction, _a) {\n    var startTimestamp = _a.startTimestamp, ctx = __rest(_a, [\"startTimestamp\"]);\n    if (startTimestamp && transaction.startTimestamp > startTimestamp) {\n        transaction.startTimestamp = startTimestamp;\n    }\n    return transaction.startChild(__assign({ startTimestamp: startTimestamp }, ctx));\n}\n/**\n * Checks if a given value is a valid measurement value.\n */\nfunction isMeasurementValue(value) {\n    return typeof value === 'number' && isFinite(value);\n}\n/** Add LCP / CLS data to transaction to allow debugging */\nfunction tagMetricInfo(transaction, lcpEntry, clsEntry) {\n    if (lcpEntry) {\n        logger.log('[Measurements] Adding LCP Data');\n        // Capture Properties of the LCP element that contributes to the LCP.\n        if (lcpEntry.element) {\n            transaction.setTag('lcp.element', htmlTreeAsString(lcpEntry.element));\n        }\n        if (lcpEntry.id) {\n            transaction.setTag('lcp.id', lcpEntry.id);\n        }\n        if (lcpEntry.url) {\n            // Trim URL to the first 200 characters.\n            transaction.setTag('lcp.url', lcpEntry.url.trim().slice(0, 200));\n        }\n        transaction.setTag('lcp.size', lcpEntry.size);\n    }\n    // See: https://developer.mozilla.org/en-US/docs/Web/API/LayoutShift\n    if (clsEntry && clsEntry.sources) {\n        logger.log('[Measurements] Adding CLS Data');\n        clsEntry.sources.forEach(function (source, index) {\n            return transaction.setTag(\"cls.source.\" + (index + 1), htmlTreeAsString(source.node));\n        });\n    }\n}\n//# sourceMappingURL=metrics.js.map","import { __assign, __read, __spread } from \"tslib\";\nimport { addInstrumentationHandler, isInstanceOf, isMatchingPattern } from '@sentry/utils';\nimport { getActiveTransaction, hasTracingEnabled } from '../utils';\nexport var DEFAULT_TRACING_ORIGINS = ['localhost', /^\\//];\nexport var defaultRequestInstrumentationOptions = {\n    traceFetch: true,\n    traceXHR: true,\n    tracingOrigins: DEFAULT_TRACING_ORIGINS,\n};\n/** Registers span creators for xhr and fetch requests  */\nexport function instrumentOutgoingRequests(_options) {\n    // eslint-disable-next-line @typescript-eslint/unbound-method\n    var _a = __assign(__assign({}, defaultRequestInstrumentationOptions), _options), traceFetch = _a.traceFetch, traceXHR = _a.traceXHR, tracingOrigins = _a.tracingOrigins, shouldCreateSpanForRequest = _a.shouldCreateSpanForRequest;\n    // We should cache url -> decision so that we don't have to compute\n    // regexp everytime we create a request.\n    var urlMap = {};\n    var defaultShouldCreateSpan = function (url) {\n        if (urlMap[url]) {\n            return urlMap[url];\n        }\n        var origins = tracingOrigins;\n        urlMap[url] =\n            origins.some(function (origin) { return isMatchingPattern(url, origin); }) &&\n                !isMatchingPattern(url, 'sentry_key');\n        return urlMap[url];\n    };\n    // We want that our users don't have to re-implement shouldCreateSpanForRequest themselves\n    // That's why we filter out already unwanted Spans from tracingOrigins\n    var shouldCreateSpan = defaultShouldCreateSpan;\n    if (typeof shouldCreateSpanForRequest === 'function') {\n        shouldCreateSpan = function (url) {\n            return defaultShouldCreateSpan(url) && shouldCreateSpanForRequest(url);\n        };\n    }\n    var spans = {};\n    if (traceFetch) {\n        addInstrumentationHandler('fetch', function (handlerData) {\n            fetchCallback(handlerData, shouldCreateSpan, spans);\n        });\n    }\n    if (traceXHR) {\n        addInstrumentationHandler('xhr', function (handlerData) {\n            xhrCallback(handlerData, shouldCreateSpan, spans);\n        });\n    }\n}\n/**\n * Create and track fetch request spans\n */\nexport function fetchCallback(handlerData, shouldCreateSpan, spans) {\n    if (!hasTracingEnabled() || !(handlerData.fetchData && shouldCreateSpan(handlerData.fetchData.url))) {\n        return;\n    }\n    if (handlerData.endTimestamp) {\n        var spanId = handlerData.fetchData.__span;\n        if (!spanId)\n            return;\n        var span = spans[spanId];\n        if (span) {\n            if (handlerData.response) {\n                // TODO (kmclb) remove this once types PR goes through\n                // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n                span.setHttpStatus(handlerData.response.status);\n            }\n            else if (handlerData.error) {\n                span.setStatus('internal_error');\n            }\n            span.finish();\n            // eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n            delete spans[spanId];\n        }\n        return;\n    }\n    var activeTransaction = getActiveTransaction();\n    if (activeTransaction) {\n        var span = activeTransaction.startChild({\n            data: __assign(__assign({}, handlerData.fetchData), { type: 'fetch' }),\n            description: handlerData.fetchData.method + \" \" + handlerData.fetchData.url,\n            op: 'http.client',\n        });\n        handlerData.fetchData.__span = span.spanId;\n        spans[span.spanId] = span;\n        var request = (handlerData.args[0] = handlerData.args[0]);\n        // eslint-disable-next-line @typescript-eslint/no-explicit-any\n        var options = (handlerData.args[1] = handlerData.args[1] || {});\n        var headers = options.headers;\n        if (isInstanceOf(request, Request)) {\n            headers = request.headers;\n        }\n        if (headers) {\n            // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n            if (typeof headers.append === 'function') {\n                // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n                headers.append('sentry-trace', span.toTraceparent());\n            }\n            else if (Array.isArray(headers)) {\n                headers = __spread(headers, [['sentry-trace', span.toTraceparent()]]);\n            }\n            else {\n                headers = __assign(__assign({}, headers), { 'sentry-trace': span.toTraceparent() });\n            }\n        }\n        else {\n            headers = { 'sentry-trace': span.toTraceparent() };\n        }\n        options.headers = headers;\n    }\n}\n/**\n * Create and track xhr request spans\n */\nexport function xhrCallback(handlerData, shouldCreateSpan, spans) {\n    if (!hasTracingEnabled() ||\n        (handlerData.xhr && handlerData.xhr.__sentry_own_request__) ||\n        !(handlerData.xhr && handlerData.xhr.__sentry_xhr__ && shouldCreateSpan(handlerData.xhr.__sentry_xhr__.url))) {\n        return;\n    }\n    var xhr = handlerData.xhr.__sentry_xhr__;\n    // check first if the request has finished and is tracked by an existing span which should now end\n    if (handlerData.endTimestamp) {\n        var spanId = handlerData.xhr.__sentry_xhr_span_id__;\n        if (!spanId)\n            return;\n        var span = spans[spanId];\n        if (span) {\n            span.setHttpStatus(xhr.status_code);\n            span.finish();\n            // eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n            delete spans[spanId];\n        }\n        return;\n    }\n    // if not, create a new span to track it\n    var activeTransaction = getActiveTransaction();\n    if (activeTransaction) {\n        var span = activeTransaction.startChild({\n            data: __assign(__assign({}, xhr.data), { type: 'xhr', method: xhr.method, url: xhr.url }),\n            description: xhr.method + \" \" + xhr.url,\n            op: 'http.client',\n        });\n        handlerData.xhr.__sentry_xhr_span_id__ = span.spanId;\n        spans[handlerData.xhr.__sentry_xhr_span_id__] = span;\n        if (handlerData.xhr.setRequestHeader) {\n            try {\n                handlerData.xhr.setRequestHeader('sentry-trace', span.toTraceparent());\n            }\n            catch (_) {\n                // Error: InvalidStateError: Failed to execute 'setRequestHeader' on 'XMLHttpRequest': The object's state must be OPENED.\n            }\n        }\n    }\n}\n//# sourceMappingURL=request.js.map","import { addInstrumentationHandler, getGlobalObject, logger } from '@sentry/utils';\nvar global = getGlobalObject();\n/**\n * Default function implementing pageload and navigation transactions\n */\nexport function instrumentRoutingWithDefaults(customStartTransaction, startTransactionOnPageLoad, startTransactionOnLocationChange) {\n    if (startTransactionOnPageLoad === void 0) { startTransactionOnPageLoad = true; }\n    if (startTransactionOnLocationChange === void 0) { startTransactionOnLocationChange = true; }\n    if (!global || !global.location) {\n        logger.warn('Could not initialize routing instrumentation due to invalid location');\n        return;\n    }\n    var startingUrl = global.location.href;\n    var activeTransaction;\n    if (startTransactionOnPageLoad) {\n        activeTransaction = customStartTransaction({ name: global.location.pathname, op: 'pageload' });\n    }\n    if (startTransactionOnLocationChange) {\n        addInstrumentationHandler('history', function (_a) {\n            var to = _a.to, from = _a.from;\n            /**\n             * This early return is there to account for some cases where a navigation transaction starts right after\n             * long-running pageload. We make sure that if `from` is undefined and a valid `startingURL` exists, we don't\n             * create an uneccessary navigation transaction.\n             *\n             * This was hard to duplicate, but this behavior stopped as soon as this fix was applied. This issue might also\n             * only be caused in certain development environments where the usage of a hot module reloader is causing\n             * errors.\n             */\n            if (from === undefined && startingUrl && startingUrl.indexOf(to) !== -1) {\n                startingUrl = undefined;\n                return;\n            }\n            if (from !== to) {\n                startingUrl = undefined;\n                if (activeTransaction) {\n                    logger.log(\"[Tracing] Finishing current transaction with op: \" + activeTransaction.op);\n                    // If there's an open transaction on the scope, we need to finish it before creating an new one.\n                    activeTransaction.finish();\n                }\n                activeTransaction = customStartTransaction({ name: global.location.pathname, op: 'navigation' });\n            }\n        });\n    }\n}\n//# sourceMappingURL=router.js.map","import { __assign } from \"tslib\";\nimport { getGlobalObject, logger } from '@sentry/utils';\nimport { startIdleTransaction } from '../hubextensions';\nimport { DEFAULT_IDLE_TIMEOUT } from '../idletransaction';\nimport { extractTraceparentData, secToMs } from '../utils';\nimport { registerBackgroundTabDetection } from './backgroundtab';\nimport { MetricsInstrumentation } from './metrics';\nimport { defaultRequestInstrumentationOptions, instrumentOutgoingRequests, } from './request';\nimport { instrumentRoutingWithDefaults } from './router';\nexport var DEFAULT_MAX_TRANSACTION_DURATION_SECONDS = 600;\nvar DEFAULT_BROWSER_TRACING_OPTIONS = __assign({ idleTimeout: DEFAULT_IDLE_TIMEOUT, markBackgroundTransactions: true, maxTransactionDuration: DEFAULT_MAX_TRANSACTION_DURATION_SECONDS, routingInstrumentation: instrumentRoutingWithDefaults, startTransactionOnLocationChange: true, startTransactionOnPageLoad: true }, defaultRequestInstrumentationOptions);\n/**\n * The Browser Tracing integration automatically instruments browser pageload/navigation\n * actions as transactions, and captures requests, metrics and errors as spans.\n *\n * The integration can be configured with a variety of options, and can be extended to use\n * any routing library. This integration uses {@see IdleTransaction} to create transactions.\n */\nvar BrowserTracing = /** @class */ (function () {\n    function BrowserTracing(_options) {\n        /**\n         * @inheritDoc\n         */\n        this.name = BrowserTracing.id;\n        this._emitOptionsWarning = false;\n        /** Store configured idle timeout so that it can be added as a tag to transactions */\n        this._configuredIdleTimeout = undefined;\n        var tracingOrigins = defaultRequestInstrumentationOptions.tracingOrigins;\n        // NOTE: Logger doesn't work in constructors, as it's initialized after integrations instances\n        if (_options) {\n            this._configuredIdleTimeout = _options.idleTimeout;\n            if (_options.tracingOrigins && Array.isArray(_options.tracingOrigins) && _options.tracingOrigins.length !== 0) {\n                tracingOrigins = _options.tracingOrigins;\n            }\n            else {\n                this._emitOptionsWarning = true;\n            }\n        }\n        this.options = __assign(__assign(__assign({}, DEFAULT_BROWSER_TRACING_OPTIONS), _options), { tracingOrigins: tracingOrigins });\n        var _metricOptions = this.options._metricOptions;\n        this._metrics = new MetricsInstrumentation(_metricOptions && _metricOptions._reportAllChanges);\n    }\n    /**\n     * @inheritDoc\n     */\n    BrowserTracing.prototype.setupOnce = function (_, getCurrentHub) {\n        var _this = this;\n        this._getCurrentHub = getCurrentHub;\n        if (this._emitOptionsWarning) {\n            logger.warn('[Tracing] You need to define `tracingOrigins` in the options. Set an array of urls or patterns to trace.');\n            logger.warn(\"[Tracing] We added a reasonable default for you: \" + defaultRequestInstrumentationOptions.tracingOrigins);\n        }\n        // eslint-disable-next-line @typescript-eslint/unbound-method\n        var _a = this.options, instrumentRouting = _a.routingInstrumentation, startTransactionOnLocationChange = _a.startTransactionOnLocationChange, startTransactionOnPageLoad = _a.startTransactionOnPageLoad, markBackgroundTransactions = _a.markBackgroundTransactions, traceFetch = _a.traceFetch, traceXHR = _a.traceXHR, tracingOrigins = _a.tracingOrigins, shouldCreateSpanForRequest = _a.shouldCreateSpanForRequest;\n        instrumentRouting(function (context) { return _this._createRouteTransaction(context); }, startTransactionOnPageLoad, startTransactionOnLocationChange);\n        if (markBackgroundTransactions) {\n            registerBackgroundTabDetection();\n        }\n        instrumentOutgoingRequests({ traceFetch: traceFetch, traceXHR: traceXHR, tracingOrigins: tracingOrigins, shouldCreateSpanForRequest: shouldCreateSpanForRequest });\n    };\n    /** Create routing idle transaction. */\n    BrowserTracing.prototype._createRouteTransaction = function (context) {\n        var _this = this;\n        if (!this._getCurrentHub) {\n            logger.warn(\"[Tracing] Did not create \" + context.op + \" transaction because _getCurrentHub is invalid.\");\n            return undefined;\n        }\n        // eslint-disable-next-line @typescript-eslint/unbound-method\n        var _a = this.options, beforeNavigate = _a.beforeNavigate, idleTimeout = _a.idleTimeout, maxTransactionDuration = _a.maxTransactionDuration;\n        var parentContextFromHeader = context.op === 'pageload' ? getHeaderContext() : undefined;\n        var expandedContext = __assign(__assign(__assign({}, context), parentContextFromHeader), { trimEnd: true });\n        var modifiedContext = typeof beforeNavigate === 'function' ? beforeNavigate(expandedContext) : expandedContext;\n        // For backwards compatibility reasons, beforeNavigate can return undefined to \"drop\" the transaction (prevent it\n        // from being sent to Sentry).\n        var finalContext = modifiedContext === undefined ? __assign(__assign({}, expandedContext), { sampled: false }) : modifiedContext;\n        if (finalContext.sampled === false) {\n            logger.log(\"[Tracing] Will not send \" + finalContext.op + \" transaction because of beforeNavigate.\");\n        }\n        logger.log(\"[Tracing] Starting \" + finalContext.op + \" transaction on scope\");\n        var hub = this._getCurrentHub();\n        var location = getGlobalObject().location;\n        var idleTransaction = startIdleTransaction(hub, finalContext, idleTimeout, true, { location: location });\n        idleTransaction.registerBeforeFinishCallback(function (transaction, endTimestamp) {\n            _this._metrics.addPerformanceEntries(transaction);\n            adjustTransactionDuration(secToMs(maxTransactionDuration), transaction, endTimestamp);\n        });\n        idleTransaction.setTag('idleTimeout', this._configuredIdleTimeout);\n        return idleTransaction;\n    };\n    /**\n     * @inheritDoc\n     */\n    BrowserTracing.id = 'BrowserTracing';\n    return BrowserTracing;\n}());\nexport { BrowserTracing };\n/**\n * Gets transaction context from a sentry-trace meta.\n *\n * @returns Transaction context data from the header or undefined if there's no header or the header is malformed\n */\nexport function getHeaderContext() {\n    var header = getMetaContent('sentry-trace');\n    if (header) {\n        return extractTraceparentData(header);\n    }\n    return undefined;\n}\n/** Returns the value of a meta tag */\nexport function getMetaContent(metaName) {\n    var el = getGlobalObject().document.querySelector(\"meta[name=\" + metaName + \"]\");\n    return el ? el.getAttribute('content') : null;\n}\n/** Adjusts transaction value based on max transaction duration */\nfunction adjustTransactionDuration(maxDuration, transaction, endTimestamp) {\n    var diff = endTimestamp - transaction.startTimestamp;\n    var isOutdatedTransaction = endTimestamp && (diff > maxDuration || diff < 0);\n    if (isOutdatedTransaction) {\n        transaction.setStatus('deadline_exceeded');\n        transaction.setTag('maxTransactionDurationExceeded', 'true');\n    }\n}\n//# sourceMappingURL=browsertracing.js.map","import { addExtensionMethods } from './hubextensions';\nimport * as Integrations from './integrations';\nexport { Integrations };\n// This is already exported as part of `Integrations` above (and for the moment will remain so for\n// backwards compatibility), but that interferes with treeshaking, so we also export it separately\n// here.\n//\n// Previously we expected users to import tracing integrations like\n//\n// import { Integrations } from '@sentry/tracing';\n// const instance = new Integrations.BrowserTracing();\n//\n// This makes the integrations unable to be treeshaken though. To address this, we now have\n// this individual export. We now expect users to consume BrowserTracing like so:\n//\n// import { BrowserTracing } from '@sentry/tracing';\n// const instance = new BrowserTracing();\n//\n// For an example of of the new usage of BrowserTracing, see @sentry/nextjs index.client.ts\nexport { BrowserTracing } from './browser';\nexport { Span, spanStatusfromHttpCode } from './span';\n// eslint-disable-next-line deprecation/deprecation\nexport { SpanStatus } from './spanstatus';\nexport { Transaction } from './transaction';\nexport { \n// TODO deprecate old name in v7\ninstrumentOutgoingRequests as registerRequestInstrumentation, defaultRequestInstrumentationOptions, } from './browser';\nexport { IdleTransaction } from './idletransaction';\nexport { startIdleTransaction } from './hubextensions';\n// We are patching the global object with our hub extension methods\naddExtensionMethods();\nexport { addExtensionMethods };\nexport { extractTraceparentData, getActiveTransaction, hasTracingEnabled, stripUrlQueryAndFragment, TRACEPARENT_REGEXP, } from './utils';\n//# sourceMappingURL=index.js.map","/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n    extendStatics = Object.setPrototypeOf ||\r\n        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n        function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n    return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n    if (typeof b !== \"function\" && b !== null)\r\n        throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n    extendStatics(d, b);\r\n    function __() { this.constructor = d; }\r\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n    __assign = Object.assign || function __assign(t) {\r\n        for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n            s = arguments[i];\r\n            for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n        }\r\n        return t;\r\n    }\r\n    return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n    var t = {};\r\n    for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n        t[p] = s[p];\r\n    if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n        for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n            if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n                t[p[i]] = s[p[i]];\r\n        }\r\n    return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n    return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n    if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n    return new (P || (P = Promise))(function (resolve, reject) {\r\n        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n        function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n        step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n    });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n    var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n    return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n    function verb(n) { return function (v) { return step([n, v]); }; }\r\n    function step(op) {\r\n        if (f) throw new TypeError(\"Generator is already executing.\");\r\n        while (_) try {\r\n            if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n            if (y = 0, t) op = [op[0] & 2, t.value];\r\n            switch (op[0]) {\r\n                case 0: case 1: t = op; break;\r\n                case 4: _.label++; return { value: op[1], done: false };\r\n                case 5: _.label++; y = op[1]; op = [0]; continue;\r\n                case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n                default:\r\n                    if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n                    if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n                    if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n                    if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n                    if (t[2]) _.ops.pop();\r\n                    _.trys.pop(); continue;\r\n            }\r\n            op = body.call(thisArg, _);\r\n        } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n        if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n    }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n    if (k2 === undefined) k2 = k;\r\n    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\r\n}) : (function(o, m, k, k2) {\r\n    if (k2 === undefined) k2 = k;\r\n    o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n    for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n    var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n    if (m) return m.call(o);\r\n    if (o && typeof o.length === \"number\") return {\r\n        next: function () {\r\n            if (o && i >= o.length) o = void 0;\r\n            return { value: o && o[i++], done: !o };\r\n        }\r\n    };\r\n    throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n    var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n    if (!m) return o;\r\n    var i = m.call(o), r, ar = [], e;\r\n    try {\r\n        while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n    }\r\n    catch (error) { e = { error: error }; }\r\n    finally {\r\n        try {\r\n            if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n        }\r\n        finally { if (e) throw e.error; }\r\n    }\r\n    return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n    for (var ar = [], i = 0; i < arguments.length; i++)\r\n        ar = ar.concat(__read(arguments[i]));\r\n    return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n    for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n    for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n        for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n            r[k] = a[j];\r\n    return r;\r\n}\r\n\r\nexport function __spreadArray(to, from, pack) {\r\n    if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n        if (ar || !(i in from)) {\r\n            if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n            ar[i] = from[i];\r\n        }\r\n    }\r\n    return to.concat(ar || Array.prototype.slice.call(from));\r\n}\r\n\r\nexport function __await(v) {\r\n    return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n    if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n    var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n    return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n    function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n    function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n    function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n    function fulfill(value) { resume(\"next\", value); }\r\n    function reject(value) { resume(\"throw\", value); }\r\n    function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n    var i, p;\r\n    return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n    function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n    if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n    var m = o[Symbol.asyncIterator], i;\r\n    return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n    function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n    function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n    if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n    return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n    Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n    o[\"default\"] = v;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n    if (mod && mod.__esModule) return mod;\r\n    var result = {};\r\n    if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\r\n    __setModuleDefault(result, mod);\r\n    return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n    return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n    if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n    if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n    return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n    if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n    if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n    if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n    return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n","/**\n * Cannot do Math.log(x) / Math.log(10) bc if IEEE floating point issue\n * @param x number\n */\nexport function getMagnitude(x) {\n    // Cannot count string length via Number.toString because it may use scientific notation\n    // for very small or very large numbers.\n    return Math.floor(Math.log(x) * Math.LOG10E);\n}\nexport function repeat(s, times) {\n    if (typeof s.repeat === 'function') {\n        return s.repeat(times);\n    }\n    var arr = new Array(times);\n    for (var i = 0; i < arr.length; i++) {\n        arr[i] = s;\n    }\n    return arr.join('');\n}\nexport function setInternalSlot(map, pl, field, value) {\n    if (!map.get(pl)) {\n        map.set(pl, Object.create(null));\n    }\n    var slots = map.get(pl);\n    slots[field] = value;\n}\nexport function setMultiInternalSlots(map, pl, props) {\n    for (var _i = 0, _a = Object.keys(props); _i < _a.length; _i++) {\n        var k = _a[_i];\n        setInternalSlot(map, pl, k, props[k]);\n    }\n}\nexport function getInternalSlot(map, pl, field) {\n    return getMultiInternalSlots(map, pl, field)[field];\n}\nexport function getMultiInternalSlots(map, pl) {\n    var fields = [];\n    for (var _i = 2; _i < arguments.length; _i++) {\n        fields[_i - 2] = arguments[_i];\n    }\n    var slots = map.get(pl);\n    if (!slots) {\n        throw new TypeError(\"\".concat(pl, \" InternalSlot has not been initialized\"));\n    }\n    return fields.reduce(function (all, f) {\n        all[f] = slots[f];\n        return all;\n    }, Object.create(null));\n}\nexport function isLiteralPart(patternPart) {\n    return patternPart.type === 'literal';\n}\n/*\n  17 ECMAScript Standard Built-in Objects:\n    Every built-in Function object, including constructors, that is not\n    identified as an anonymous function has a name property whose value\n    is a String.\n\n    Unless otherwise specified, the name property of a built-in Function\n    object, if it exists, has the attributes { [[Writable]]: false,\n    [[Enumerable]]: false, [[Configurable]]: true }.\n*/\nexport function defineProperty(target, name, _a) {\n    var value = _a.value;\n    Object.defineProperty(target, name, {\n        configurable: true,\n        enumerable: false,\n        writable: true,\n        value: value,\n    });\n}\nexport var UNICODE_EXTENSION_SEQUENCE_REGEX = /-u(?:-[0-9a-z]{2,8})+/gi;\nexport function invariant(condition, message, Err) {\n    if (Err === void 0) { Err = Error; }\n    if (!condition) {\n        throw new Err(message);\n    }\n}\n","export var ErrorKind;\n(function (ErrorKind) {\n    /** Argument is unclosed (e.g. `{0`) */\n    ErrorKind[ErrorKind[\"EXPECT_ARGUMENT_CLOSING_BRACE\"] = 1] = \"EXPECT_ARGUMENT_CLOSING_BRACE\";\n    /** Argument is empty (e.g. `{}`). */\n    ErrorKind[ErrorKind[\"EMPTY_ARGUMENT\"] = 2] = \"EMPTY_ARGUMENT\";\n    /** Argument is malformed (e.g. `{foo!}``) */\n    ErrorKind[ErrorKind[\"MALFORMED_ARGUMENT\"] = 3] = \"MALFORMED_ARGUMENT\";\n    /** Expect an argument type (e.g. `{foo,}`) */\n    ErrorKind[ErrorKind[\"EXPECT_ARGUMENT_TYPE\"] = 4] = \"EXPECT_ARGUMENT_TYPE\";\n    /** Unsupported argument type (e.g. `{foo,foo}`) */\n    ErrorKind[ErrorKind[\"INVALID_ARGUMENT_TYPE\"] = 5] = \"INVALID_ARGUMENT_TYPE\";\n    /** Expect an argument style (e.g. `{foo, number, }`) */\n    ErrorKind[ErrorKind[\"EXPECT_ARGUMENT_STYLE\"] = 6] = \"EXPECT_ARGUMENT_STYLE\";\n    /** The number skeleton is invalid. */\n    ErrorKind[ErrorKind[\"INVALID_NUMBER_SKELETON\"] = 7] = \"INVALID_NUMBER_SKELETON\";\n    /** The date time skeleton is invalid. */\n    ErrorKind[ErrorKind[\"INVALID_DATE_TIME_SKELETON\"] = 8] = \"INVALID_DATE_TIME_SKELETON\";\n    /** Exepct a number skeleton following the `::` (e.g. `{foo, number, ::}`) */\n    ErrorKind[ErrorKind[\"EXPECT_NUMBER_SKELETON\"] = 9] = \"EXPECT_NUMBER_SKELETON\";\n    /** Exepct a date time skeleton following the `::` (e.g. `{foo, date, ::}`) */\n    ErrorKind[ErrorKind[\"EXPECT_DATE_TIME_SKELETON\"] = 10] = \"EXPECT_DATE_TIME_SKELETON\";\n    /** Unmatched apostrophes in the argument style (e.g. `{foo, number, 'test`) */\n    ErrorKind[ErrorKind[\"UNCLOSED_QUOTE_IN_ARGUMENT_STYLE\"] = 11] = \"UNCLOSED_QUOTE_IN_ARGUMENT_STYLE\";\n    /** Missing select argument options (e.g. `{foo, select}`) */\n    ErrorKind[ErrorKind[\"EXPECT_SELECT_ARGUMENT_OPTIONS\"] = 12] = \"EXPECT_SELECT_ARGUMENT_OPTIONS\";\n    /** Expecting an offset value in `plural` or `selectordinal` argument (e.g `{foo, plural, offset}`) */\n    ErrorKind[ErrorKind[\"EXPECT_PLURAL_ARGUMENT_OFFSET_VALUE\"] = 13] = \"EXPECT_PLURAL_ARGUMENT_OFFSET_VALUE\";\n    /** Offset value in `plural` or `selectordinal` is invalid (e.g. `{foo, plural, offset: x}`) */\n    ErrorKind[ErrorKind[\"INVALID_PLURAL_ARGUMENT_OFFSET_VALUE\"] = 14] = \"INVALID_PLURAL_ARGUMENT_OFFSET_VALUE\";\n    /** Expecting a selector in `select` argument (e.g `{foo, select}`) */\n    ErrorKind[ErrorKind[\"EXPECT_SELECT_ARGUMENT_SELECTOR\"] = 15] = \"EXPECT_SELECT_ARGUMENT_SELECTOR\";\n    /** Expecting a selector in `plural` or `selectordinal` argument (e.g `{foo, plural}`) */\n    ErrorKind[ErrorKind[\"EXPECT_PLURAL_ARGUMENT_SELECTOR\"] = 16] = \"EXPECT_PLURAL_ARGUMENT_SELECTOR\";\n    /** Expecting a message fragment after the `select` selector (e.g. `{foo, select, apple}`) */\n    ErrorKind[ErrorKind[\"EXPECT_SELECT_ARGUMENT_SELECTOR_FRAGMENT\"] = 17] = \"EXPECT_SELECT_ARGUMENT_SELECTOR_FRAGMENT\";\n    /**\n     * Expecting a message fragment after the `plural` or `selectordinal` selector\n     * (e.g. `{foo, plural, one}`)\n     */\n    ErrorKind[ErrorKind[\"EXPECT_PLURAL_ARGUMENT_SELECTOR_FRAGMENT\"] = 18] = \"EXPECT_PLURAL_ARGUMENT_SELECTOR_FRAGMENT\";\n    /** Selector in `plural` or `selectordinal` is malformed (e.g. `{foo, plural, =x {#}}`) */\n    ErrorKind[ErrorKind[\"INVALID_PLURAL_ARGUMENT_SELECTOR\"] = 19] = \"INVALID_PLURAL_ARGUMENT_SELECTOR\";\n    /**\n     * Duplicate selectors in `plural` or `selectordinal` argument.\n     * (e.g. {foo, plural, one {#} one {#}})\n     */\n    ErrorKind[ErrorKind[\"DUPLICATE_PLURAL_ARGUMENT_SELECTOR\"] = 20] = \"DUPLICATE_PLURAL_ARGUMENT_SELECTOR\";\n    /** Duplicate selectors in `select` argument.\n     * (e.g. {foo, select, apple {apple} apple {apple}})\n     */\n    ErrorKind[ErrorKind[\"DUPLICATE_SELECT_ARGUMENT_SELECTOR\"] = 21] = \"DUPLICATE_SELECT_ARGUMENT_SELECTOR\";\n    /** Plural or select argument option must have `other` clause. */\n    ErrorKind[ErrorKind[\"MISSING_OTHER_CLAUSE\"] = 22] = \"MISSING_OTHER_CLAUSE\";\n    /** The tag is malformed. (e.g. `<bold!>foo</bold!>) */\n    ErrorKind[ErrorKind[\"INVALID_TAG\"] = 23] = \"INVALID_TAG\";\n    /** The tag name is invalid. (e.g. `<123>foo</123>`) */\n    ErrorKind[ErrorKind[\"INVALID_TAG_NAME\"] = 25] = \"INVALID_TAG_NAME\";\n    /** The closing tag does not match the opening tag. (e.g. `<bold>foo</italic>`) */\n    ErrorKind[ErrorKind[\"UNMATCHED_CLOSING_TAG\"] = 26] = \"UNMATCHED_CLOSING_TAG\";\n    /** The opening tag has unmatched closing tag. (e.g. `<bold>foo`) */\n    ErrorKind[ErrorKind[\"UNCLOSED_TAG\"] = 27] = \"UNCLOSED_TAG\";\n})(ErrorKind || (ErrorKind = {}));\n","export var TYPE;\n(function (TYPE) {\n    /**\n     * Raw text\n     */\n    TYPE[TYPE[\"literal\"] = 0] = \"literal\";\n    /**\n     * Variable w/o any format, e.g `var` in `this is a {var}`\n     */\n    TYPE[TYPE[\"argument\"] = 1] = \"argument\";\n    /**\n     * Variable w/ number format\n     */\n    TYPE[TYPE[\"number\"] = 2] = \"number\";\n    /**\n     * Variable w/ date format\n     */\n    TYPE[TYPE[\"date\"] = 3] = \"date\";\n    /**\n     * Variable w/ time format\n     */\n    TYPE[TYPE[\"time\"] = 4] = \"time\";\n    /**\n     * Variable w/ select format\n     */\n    TYPE[TYPE[\"select\"] = 5] = \"select\";\n    /**\n     * Variable w/ plural format\n     */\n    TYPE[TYPE[\"plural\"] = 6] = \"plural\";\n    /**\n     * Only possible within plural argument.\n     * This is the `#` symbol that will be substituted with the count.\n     */\n    TYPE[TYPE[\"pound\"] = 7] = \"pound\";\n    /**\n     * XML-like tag\n     */\n    TYPE[TYPE[\"tag\"] = 8] = \"tag\";\n})(TYPE || (TYPE = {}));\nexport var SKELETON_TYPE;\n(function (SKELETON_TYPE) {\n    SKELETON_TYPE[SKELETON_TYPE[\"number\"] = 0] = \"number\";\n    SKELETON_TYPE[SKELETON_TYPE[\"dateTime\"] = 1] = \"dateTime\";\n})(SKELETON_TYPE || (SKELETON_TYPE = {}));\n/**\n * Type Guards\n */\nexport function isLiteralElement(el) {\n    return el.type === TYPE.literal;\n}\nexport function isArgumentElement(el) {\n    return el.type === TYPE.argument;\n}\nexport function isNumberElement(el) {\n    return el.type === TYPE.number;\n}\nexport function isDateElement(el) {\n    return el.type === TYPE.date;\n}\nexport function isTimeElement(el) {\n    return el.type === TYPE.time;\n}\nexport function isSelectElement(el) {\n    return el.type === TYPE.select;\n}\nexport function isPluralElement(el) {\n    return el.type === TYPE.plural;\n}\nexport function isPoundElement(el) {\n    return el.type === TYPE.pound;\n}\nexport function isTagElement(el) {\n    return el.type === TYPE.tag;\n}\nexport function isNumberSkeleton(el) {\n    return !!(el && typeof el === 'object' && el.type === SKELETON_TYPE.number);\n}\nexport function isDateTimeSkeleton(el) {\n    return !!(el && typeof el === 'object' && el.type === SKELETON_TYPE.dateTime);\n}\nexport function createLiteralElement(value) {\n    return {\n        type: TYPE.literal,\n        value: value,\n    };\n}\nexport function createNumberElement(value, style) {\n    return {\n        type: TYPE.number,\n        value: value,\n        style: style,\n    };\n}\n","// @generated from regex-gen.ts\nexport var SPACE_SEPARATOR_REGEX = /[ \\xA0\\u1680\\u2000-\\u200A\\u202F\\u205F\\u3000]/;\nexport var WHITE_SPACE_REGEX = /[\\t-\\r \\x85\\u200E\\u200F\\u2028\\u2029]/;\n","/**\n * https://unicode.org/reports/tr35/tr35-dates.html#Date_Field_Symbol_Table\n * Credit: https://github.com/caridy/intl-datetimeformat-pattern/blob/master/index.js\n * with some tweaks\n */\nvar DATE_TIME_REGEX = /(?:[Eec]{1,6}|G{1,5}|[Qq]{1,5}|(?:[yYur]+|U{1,5})|[ML]{1,5}|d{1,2}|D{1,3}|F{1}|[abB]{1,5}|[hkHK]{1,2}|w{1,2}|W{1}|m{1,2}|s{1,2}|[zZOvVxX]{1,4})(?=([^']*'[^']*')*[^']*$)/g;\n/**\n * Parse Date time skeleton into Intl.DateTimeFormatOptions\n * Ref: https://unicode.org/reports/tr35/tr35-dates.html#Date_Field_Symbol_Table\n * @public\n * @param skeleton skeleton string\n */\nexport function parseDateTimeSkeleton(skeleton) {\n    var result = {};\n    skeleton.replace(DATE_TIME_REGEX, function (match) {\n        var len = match.length;\n        switch (match[0]) {\n            // Era\n            case 'G':\n                result.era = len === 4 ? 'long' : len === 5 ? 'narrow' : 'short';\n                break;\n            // Year\n            case 'y':\n                result.year = len === 2 ? '2-digit' : 'numeric';\n                break;\n            case 'Y':\n            case 'u':\n            case 'U':\n            case 'r':\n                throw new RangeError('`Y/u/U/r` (year) patterns are not supported, use `y` instead');\n            // Quarter\n            case 'q':\n            case 'Q':\n                throw new RangeError('`q/Q` (quarter) patterns are not supported');\n            // Month\n            case 'M':\n            case 'L':\n                result.month = ['numeric', '2-digit', 'short', 'long', 'narrow'][len - 1];\n                break;\n            // Week\n            case 'w':\n            case 'W':\n                throw new RangeError('`w/W` (week) patterns are not supported');\n            case 'd':\n                result.day = ['numeric', '2-digit'][len - 1];\n                break;\n            case 'D':\n            case 'F':\n            case 'g':\n                throw new RangeError('`D/F/g` (day) patterns are not supported, use `d` instead');\n            // Weekday\n            case 'E':\n                result.weekday = len === 4 ? 'short' : len === 5 ? 'narrow' : 'short';\n                break;\n            case 'e':\n                if (len < 4) {\n                    throw new RangeError('`e..eee` (weekday) patterns are not supported');\n                }\n                result.weekday = ['short', 'long', 'narrow', 'short'][len - 4];\n                break;\n            case 'c':\n                if (len < 4) {\n                    throw new RangeError('`c..ccc` (weekday) patterns are not supported');\n                }\n                result.weekday = ['short', 'long', 'narrow', 'short'][len - 4];\n                break;\n            // Period\n            case 'a': // AM, PM\n                result.hour12 = true;\n                break;\n            case 'b': // am, pm, noon, midnight\n            case 'B': // flexible day periods\n                throw new RangeError('`b/B` (period) patterns are not supported, use `a` instead');\n            // Hour\n            case 'h':\n                result.hourCycle = 'h12';\n                result.hour = ['numeric', '2-digit'][len - 1];\n                break;\n            case 'H':\n                result.hourCycle = 'h23';\n                result.hour = ['numeric', '2-digit'][len - 1];\n                break;\n            case 'K':\n                result.hourCycle = 'h11';\n                result.hour = ['numeric', '2-digit'][len - 1];\n                break;\n            case 'k':\n                result.hourCycle = 'h24';\n                result.hour = ['numeric', '2-digit'][len - 1];\n                break;\n            case 'j':\n            case 'J':\n            case 'C':\n                throw new RangeError('`j/J/C` (hour) patterns are not supported, use `h/H/K/k` instead');\n            // Minute\n            case 'm':\n                result.minute = ['numeric', '2-digit'][len - 1];\n                break;\n            // Second\n            case 's':\n                result.second = ['numeric', '2-digit'][len - 1];\n                break;\n            case 'S':\n            case 'A':\n                throw new RangeError('`S/A` (second) patterns are not supported, use `s` instead');\n            // Zone\n            case 'z': // 1..3, 4: specific non-location format\n                result.timeZoneName = len < 4 ? 'short' : 'long';\n                break;\n            case 'Z': // 1..3, 4, 5: The ISO8601 varios formats\n            case 'O': // 1, 4: miliseconds in day short, long\n            case 'v': // 1, 4: generic non-location format\n            case 'V': // 1, 2, 3, 4: time zone ID or city\n            case 'X': // 1, 2, 3, 4: The ISO8601 varios formats\n            case 'x': // 1, 2, 3, 4: The ISO8601 varios formats\n                throw new RangeError('`Z/O/v/V/X/x` (timeZone) patterns are not supported, use `z` instead');\n        }\n        return '';\n    });\n    return result;\n}\n","// @generated from regex-gen.ts\nexport var WHITE_SPACE_REGEX = /[\\t-\\r \\x85\\u200E\\u200F\\u2028\\u2029]/i;\n","import { __assign } from \"tslib\";\nimport { WHITE_SPACE_REGEX } from './regex.generated';\nexport function parseNumberSkeletonFromString(skeleton) {\n    if (skeleton.length === 0) {\n        throw new Error('Number skeleton cannot be empty');\n    }\n    // Parse the skeleton\n    var stringTokens = skeleton\n        .split(WHITE_SPACE_REGEX)\n        .filter(function (x) { return x.length > 0; });\n    var tokens = [];\n    for (var _i = 0, stringTokens_1 = stringTokens; _i < stringTokens_1.length; _i++) {\n        var stringToken = stringTokens_1[_i];\n        var stemAndOptions = stringToken.split('/');\n        if (stemAndOptions.length === 0) {\n            throw new Error('Invalid number skeleton');\n        }\n        var stem = stemAndOptions[0], options = stemAndOptions.slice(1);\n        for (var _a = 0, options_1 = options; _a < options_1.length; _a++) {\n            var option = options_1[_a];\n            if (option.length === 0) {\n                throw new Error('Invalid number skeleton');\n            }\n        }\n        tokens.push({ stem: stem, options: options });\n    }\n    return tokens;\n}\nfunction icuUnitToEcma(unit) {\n    return unit.replace(/^(.*?)-/, '');\n}\nvar FRACTION_PRECISION_REGEX = /^\\.(?:(0+)(\\*)?|(#+)|(0+)(#+))$/g;\nvar SIGNIFICANT_PRECISION_REGEX = /^(@+)?(\\+|#+)?[rs]?$/g;\nvar INTEGER_WIDTH_REGEX = /(\\*)(0+)|(#+)(0+)|(0+)/g;\nvar CONCISE_INTEGER_WIDTH_REGEX = /^(0+)$/;\nfunction parseSignificantPrecision(str) {\n    var result = {};\n    if (str[str.length - 1] === 'r') {\n        result.roundingPriority = 'morePrecision';\n    }\n    else if (str[str.length - 1] === 's') {\n        result.roundingPriority = 'lessPrecision';\n    }\n    str.replace(SIGNIFICANT_PRECISION_REGEX, function (_, g1, g2) {\n        // @@@ case\n        if (typeof g2 !== 'string') {\n            result.minimumSignificantDigits = g1.length;\n            result.maximumSignificantDigits = g1.length;\n        }\n        // @@@+ case\n        else if (g2 === '+') {\n            result.minimumSignificantDigits = g1.length;\n        }\n        // .### case\n        else if (g1[0] === '#') {\n            result.maximumSignificantDigits = g1.length;\n        }\n        // .@@## or .@@@ case\n        else {\n            result.minimumSignificantDigits = g1.length;\n            result.maximumSignificantDigits =\n                g1.length + (typeof g2 === 'string' ? g2.length : 0);\n        }\n        return '';\n    });\n    return result;\n}\nfunction parseSign(str) {\n    switch (str) {\n        case 'sign-auto':\n            return {\n                signDisplay: 'auto',\n            };\n        case 'sign-accounting':\n        case '()':\n            return {\n                currencySign: 'accounting',\n            };\n        case 'sign-always':\n        case '+!':\n            return {\n                signDisplay: 'always',\n            };\n        case 'sign-accounting-always':\n        case '()!':\n            return {\n                signDisplay: 'always',\n                currencySign: 'accounting',\n            };\n        case 'sign-except-zero':\n        case '+?':\n            return {\n                signDisplay: 'exceptZero',\n            };\n        case 'sign-accounting-except-zero':\n        case '()?':\n            return {\n                signDisplay: 'exceptZero',\n                currencySign: 'accounting',\n            };\n        case 'sign-never':\n        case '+_':\n            return {\n                signDisplay: 'never',\n            };\n    }\n}\nfunction parseConciseScientificAndEngineeringStem(stem) {\n    // Engineering\n    var result;\n    if (stem[0] === 'E' && stem[1] === 'E') {\n        result = {\n            notation: 'engineering',\n        };\n        stem = stem.slice(2);\n    }\n    else if (stem[0] === 'E') {\n        result = {\n            notation: 'scientific',\n        };\n        stem = stem.slice(1);\n    }\n    if (result) {\n        var signDisplay = stem.slice(0, 2);\n        if (signDisplay === '+!') {\n            result.signDisplay = 'always';\n            stem = stem.slice(2);\n        }\n        else if (signDisplay === '+?') {\n            result.signDisplay = 'exceptZero';\n            stem = stem.slice(2);\n        }\n        if (!CONCISE_INTEGER_WIDTH_REGEX.test(stem)) {\n            throw new Error('Malformed concise eng/scientific notation');\n        }\n        result.minimumIntegerDigits = stem.length;\n    }\n    return result;\n}\nfunction parseNotationOptions(opt) {\n    var result = {};\n    var signOpts = parseSign(opt);\n    if (signOpts) {\n        return signOpts;\n    }\n    return result;\n}\n/**\n * https://github.com/unicode-org/icu/blob/master/docs/userguide/format_parse/numbers/skeletons.md#skeleton-stems-and-options\n */\nexport function parseNumberSkeleton(tokens) {\n    var result = {};\n    for (var _i = 0, tokens_1 = tokens; _i < tokens_1.length; _i++) {\n        var token = tokens_1[_i];\n        switch (token.stem) {\n            case 'percent':\n            case '%':\n                result.style = 'percent';\n                continue;\n            case '%x100':\n                result.style = 'percent';\n                result.scale = 100;\n                continue;\n            case 'currency':\n                result.style = 'currency';\n                result.currency = token.options[0];\n                continue;\n            case 'group-off':\n            case ',_':\n                result.useGrouping = false;\n                continue;\n            case 'precision-integer':\n            case '.':\n                result.maximumFractionDigits = 0;\n                continue;\n            case 'measure-unit':\n            case 'unit':\n                result.style = 'unit';\n                result.unit = icuUnitToEcma(token.options[0]);\n                continue;\n            case 'compact-short':\n            case 'K':\n                result.notation = 'compact';\n                result.compactDisplay = 'short';\n                continue;\n            case 'compact-long':\n            case 'KK':\n                result.notation = 'compact';\n                result.compactDisplay = 'long';\n                continue;\n            case 'scientific':\n                result = __assign(__assign(__assign({}, result), { notation: 'scientific' }), token.options.reduce(function (all, opt) { return (__assign(__assign({}, all), parseNotationOptions(opt))); }, {}));\n                continue;\n            case 'engineering':\n                result = __assign(__assign(__assign({}, result), { notation: 'engineering' }), token.options.reduce(function (all, opt) { return (__assign(__assign({}, all), parseNotationOptions(opt))); }, {}));\n                continue;\n            case 'notation-simple':\n                result.notation = 'standard';\n                continue;\n            // https://github.com/unicode-org/icu/blob/master/icu4c/source/i18n/unicode/unumberformatter.h\n            case 'unit-width-narrow':\n                result.currencyDisplay = 'narrowSymbol';\n                result.unitDisplay = 'narrow';\n                continue;\n            case 'unit-width-short':\n                result.currencyDisplay = 'code';\n                result.unitDisplay = 'short';\n                continue;\n            case 'unit-width-full-name':\n                result.currencyDisplay = 'name';\n                result.unitDisplay = 'long';\n                continue;\n            case 'unit-width-iso-code':\n                result.currencyDisplay = 'symbol';\n                continue;\n            case 'scale':\n                result.scale = parseFloat(token.options[0]);\n                continue;\n            // https://unicode-org.github.io/icu/userguide/format_parse/numbers/skeletons.html#integer-width\n            case 'integer-width':\n                if (token.options.length > 1) {\n                    throw new RangeError('integer-width stems only accept a single optional option');\n                }\n                token.options[0].replace(INTEGER_WIDTH_REGEX, function (_, g1, g2, g3, g4, g5) {\n                    if (g1) {\n                        result.minimumIntegerDigits = g2.length;\n                    }\n                    else if (g3 && g4) {\n                        throw new Error('We currently do not support maximum integer digits');\n                    }\n                    else if (g5) {\n                        throw new Error('We currently do not support exact integer digits');\n                    }\n                    return '';\n                });\n                continue;\n        }\n        // https://unicode-org.github.io/icu/userguide/format_parse/numbers/skeletons.html#integer-width\n        if (CONCISE_INTEGER_WIDTH_REGEX.test(token.stem)) {\n            result.minimumIntegerDigits = token.stem.length;\n            continue;\n        }\n        if (FRACTION_PRECISION_REGEX.test(token.stem)) {\n            // Precision\n            // https://unicode-org.github.io/icu/userguide/format_parse/numbers/skeletons.html#fraction-precision\n            // precision-integer case\n            if (token.options.length > 1) {\n                throw new RangeError('Fraction-precision stems only accept a single optional option');\n            }\n            token.stem.replace(FRACTION_PRECISION_REGEX, function (_, g1, g2, g3, g4, g5) {\n                // .000* case (before ICU67 it was .000+)\n                if (g2 === '*') {\n                    result.minimumFractionDigits = g1.length;\n                }\n                // .### case\n                else if (g3 && g3[0] === '#') {\n                    result.maximumFractionDigits = g3.length;\n                }\n                // .00## case\n                else if (g4 && g5) {\n                    result.minimumFractionDigits = g4.length;\n                    result.maximumFractionDigits = g4.length + g5.length;\n                }\n                else {\n                    result.minimumFractionDigits = g1.length;\n                    result.maximumFractionDigits = g1.length;\n                }\n                return '';\n            });\n            var opt = token.options[0];\n            // https://unicode-org.github.io/icu/userguide/format_parse/numbers/skeletons.html#trailing-zero-display\n            if (opt === 'w') {\n                result = __assign(__assign({}, result), { trailingZeroDisplay: 'stripIfInteger' });\n            }\n            else if (opt) {\n                result = __assign(__assign({}, result), parseSignificantPrecision(opt));\n            }\n            continue;\n        }\n        // https://unicode-org.github.io/icu/userguide/format_parse/numbers/skeletons.html#significant-digits-precision\n        if (SIGNIFICANT_PRECISION_REGEX.test(token.stem)) {\n            result = __assign(__assign({}, result), parseSignificantPrecision(token.stem));\n            continue;\n        }\n        var signOpts = parseSign(token.stem);\n        if (signOpts) {\n            result = __assign(__assign({}, result), signOpts);\n        }\n        var conciseScientificAndEngineeringOpts = parseConciseScientificAndEngineeringStem(token.stem);\n        if (conciseScientificAndEngineeringOpts) {\n            result = __assign(__assign({}, result), conciseScientificAndEngineeringOpts);\n        }\n    }\n    return result;\n}\n","var _a;\nimport { __assign } from \"tslib\";\nimport { ErrorKind } from './error';\nimport { SKELETON_TYPE, TYPE, } from './types';\nimport { SPACE_SEPARATOR_REGEX } from './regex.generated';\nimport { parseNumberSkeleton, parseNumberSkeletonFromString, parseDateTimeSkeleton, } from '@formatjs/icu-skeleton-parser';\nvar SPACE_SEPARATOR_START_REGEX = new RegExp(\"^\".concat(SPACE_SEPARATOR_REGEX.source, \"*\"));\nvar SPACE_SEPARATOR_END_REGEX = new RegExp(\"\".concat(SPACE_SEPARATOR_REGEX.source, \"*$\"));\nfunction createLocation(start, end) {\n    return { start: start, end: end };\n}\n// #region Ponyfills\n// Consolidate these variables up top for easier toggling during debugging\nvar hasNativeStartsWith = !!String.prototype.startsWith;\nvar hasNativeFromCodePoint = !!String.fromCodePoint;\nvar hasNativeFromEntries = !!Object.fromEntries;\nvar hasNativeCodePointAt = !!String.prototype.codePointAt;\nvar hasTrimStart = !!String.prototype.trimStart;\nvar hasTrimEnd = !!String.prototype.trimEnd;\nvar hasNativeIsSafeInteger = !!Number.isSafeInteger;\nvar isSafeInteger = hasNativeIsSafeInteger\n    ? Number.isSafeInteger\n    : function (n) {\n        return (typeof n === 'number' &&\n            isFinite(n) &&\n            Math.floor(n) === n &&\n            Math.abs(n) <= 0x1fffffffffffff);\n    };\n// IE11 does not support y and u.\nvar REGEX_SUPPORTS_U_AND_Y = true;\ntry {\n    var re = RE('([^\\\\p{White_Space}\\\\p{Pattern_Syntax}]*)', 'yu');\n    /**\n     * legacy Edge or Xbox One browser\n     * Unicode flag support: supported\n     * Pattern_Syntax support: not supported\n     * See https://github.com/formatjs/formatjs/issues/2822\n     */\n    REGEX_SUPPORTS_U_AND_Y = ((_a = re.exec('a')) === null || _a === void 0 ? void 0 : _a[0]) === 'a';\n}\ncatch (_) {\n    REGEX_SUPPORTS_U_AND_Y = false;\n}\nvar startsWith = hasNativeStartsWith\n    ? // Native\n        function startsWith(s, search, position) {\n            return s.startsWith(search, position);\n        }\n    : // For IE11\n        function startsWith(s, search, position) {\n            return s.slice(position, position + search.length) === search;\n        };\nvar fromCodePoint = hasNativeFromCodePoint\n    ? String.fromCodePoint\n    : // IE11\n        function fromCodePoint() {\n            var codePoints = [];\n            for (var _i = 0; _i < arguments.length; _i++) {\n                codePoints[_i] = arguments[_i];\n            }\n            var elements = '';\n            var length = codePoints.length;\n            var i = 0;\n            var code;\n            while (length > i) {\n                code = codePoints[i++];\n                if (code > 0x10ffff)\n                    throw RangeError(code + ' is not a valid code point');\n                elements +=\n                    code < 0x10000\n                        ? String.fromCharCode(code)\n                        : String.fromCharCode(((code -= 0x10000) >> 10) + 0xd800, (code % 0x400) + 0xdc00);\n            }\n            return elements;\n        };\nvar fromEntries = \n// native\nhasNativeFromEntries\n    ? Object.fromEntries\n    : // Ponyfill\n        function fromEntries(entries) {\n            var obj = {};\n            for (var _i = 0, entries_1 = entries; _i < entries_1.length; _i++) {\n                var _a = entries_1[_i], k = _a[0], v = _a[1];\n                obj[k] = v;\n            }\n            return obj;\n        };\nvar codePointAt = hasNativeCodePointAt\n    ? // Native\n        function codePointAt(s, index) {\n            return s.codePointAt(index);\n        }\n    : // IE 11\n        function codePointAt(s, index) {\n            var size = s.length;\n            if (index < 0 || index >= size) {\n                return undefined;\n            }\n            var first = s.charCodeAt(index);\n            var second;\n            return first < 0xd800 ||\n                first > 0xdbff ||\n                index + 1 === size ||\n                (second = s.charCodeAt(index + 1)) < 0xdc00 ||\n                second > 0xdfff\n                ? first\n                : ((first - 0xd800) << 10) + (second - 0xdc00) + 0x10000;\n        };\nvar trimStart = hasTrimStart\n    ? // Native\n        function trimStart(s) {\n            return s.trimStart();\n        }\n    : // Ponyfill\n        function trimStart(s) {\n            return s.replace(SPACE_SEPARATOR_START_REGEX, '');\n        };\nvar trimEnd = hasTrimEnd\n    ? // Native\n        function trimEnd(s) {\n            return s.trimEnd();\n        }\n    : // Ponyfill\n        function trimEnd(s) {\n            return s.replace(SPACE_SEPARATOR_END_REGEX, '');\n        };\n// Prevent minifier to translate new RegExp to literal form that might cause syntax error on IE11.\nfunction RE(s, flag) {\n    return new RegExp(s, flag);\n}\n// #endregion\nvar matchIdentifierAtIndex;\nif (REGEX_SUPPORTS_U_AND_Y) {\n    // Native\n    var IDENTIFIER_PREFIX_RE_1 = RE('([^\\\\p{White_Space}\\\\p{Pattern_Syntax}]*)', 'yu');\n    matchIdentifierAtIndex = function matchIdentifierAtIndex(s, index) {\n        var _a;\n        IDENTIFIER_PREFIX_RE_1.lastIndex = index;\n        var match = IDENTIFIER_PREFIX_RE_1.exec(s);\n        return (_a = match[1]) !== null && _a !== void 0 ? _a : '';\n    };\n}\nelse {\n    // IE11\n    matchIdentifierAtIndex = function matchIdentifierAtIndex(s, index) {\n        var match = [];\n        while (true) {\n            var c = codePointAt(s, index);\n            if (c === undefined || _isWhiteSpace(c) || _isPatternSyntax(c)) {\n                break;\n            }\n            match.push(c);\n            index += c >= 0x10000 ? 2 : 1;\n        }\n        return fromCodePoint.apply(void 0, match);\n    };\n}\nvar Parser = /** @class */ (function () {\n    function Parser(message, options) {\n        if (options === void 0) { options = {}; }\n        this.message = message;\n        this.position = { offset: 0, line: 1, column: 1 };\n        this.ignoreTag = !!options.ignoreTag;\n        this.requiresOtherClause = !!options.requiresOtherClause;\n        this.shouldParseSkeletons = !!options.shouldParseSkeletons;\n    }\n    Parser.prototype.parse = function () {\n        if (this.offset() !== 0) {\n            throw Error('parser can only be used once');\n        }\n        return this.parseMessage(0, '', false);\n    };\n    Parser.prototype.parseMessage = function (nestingLevel, parentArgType, expectingCloseTag) {\n        var elements = [];\n        while (!this.isEOF()) {\n            var char = this.char();\n            if (char === 123 /* `{` */) {\n                var result = this.parseArgument(nestingLevel, expectingCloseTag);\n                if (result.err) {\n                    return result;\n                }\n                elements.push(result.val);\n            }\n            else if (char === 125 /* `}` */ && nestingLevel > 0) {\n                break;\n            }\n            else if (char === 35 /* `#` */ &&\n                (parentArgType === 'plural' || parentArgType === 'selectordinal')) {\n                var position = this.clonePosition();\n                this.bump();\n                elements.push({\n                    type: TYPE.pound,\n                    location: createLocation(position, this.clonePosition()),\n                });\n            }\n            else if (char === 60 /* `<` */ &&\n                !this.ignoreTag &&\n                this.peek() === 47 // char code for '/'\n            ) {\n                if (expectingCloseTag) {\n                    break;\n                }\n                else {\n                    return this.error(ErrorKind.UNMATCHED_CLOSING_TAG, createLocation(this.clonePosition(), this.clonePosition()));\n                }\n            }\n            else if (char === 60 /* `<` */ &&\n                !this.ignoreTag &&\n                _isAlpha(this.peek() || 0)) {\n                var result = this.parseTag(nestingLevel, parentArgType);\n                if (result.err) {\n                    return result;\n                }\n                elements.push(result.val);\n            }\n            else {\n                var result = this.parseLiteral(nestingLevel, parentArgType);\n                if (result.err) {\n                    return result;\n                }\n                elements.push(result.val);\n            }\n        }\n        return { val: elements, err: null };\n    };\n    /**\n     * A tag name must start with an ASCII lower/upper case letter. The grammar is based on the\n     * [custom element name][] except that a dash is NOT always mandatory and uppercase letters\n     * are accepted:\n     *\n     * ```\n     * tag ::= \"<\" tagName (whitespace)* \"/>\" | \"<\" tagName (whitespace)* \">\" message \"</\" tagName (whitespace)* \">\"\n     * tagName ::= [a-z] (PENChar)*\n     * PENChar ::=\n     *     \"-\" | \".\" | [0-9] | \"_\" | [a-z] | [A-Z] | #xB7 | [#xC0-#xD6] | [#xD8-#xF6] | [#xF8-#x37D] |\n     *     [#x37F-#x1FFF] | [#x200C-#x200D] | [#x203F-#x2040] | [#x2070-#x218F] | [#x2C00-#x2FEF] |\n     *     [#x3001-#xD7FF] | [#xF900-#xFDCF] | [#xFDF0-#xFFFD] | [#x10000-#xEFFFF]\n     * ```\n     *\n     * [custom element name]: https://html.spec.whatwg.org/multipage/custom-elements.html#valid-custom-element-name\n     * NOTE: We're a bit more lax here since HTML technically does not allow uppercase HTML element but we do\n     * since other tag-based engines like React allow it\n     */\n    Parser.prototype.parseTag = function (nestingLevel, parentArgType) {\n        var startPosition = this.clonePosition();\n        this.bump(); // `<`\n        var tagName = this.parseTagName();\n        this.bumpSpace();\n        if (this.bumpIf('/>')) {\n            // Self closing tag\n            return {\n                val: {\n                    type: TYPE.literal,\n                    value: \"<\".concat(tagName, \"/>\"),\n                    location: createLocation(startPosition, this.clonePosition()),\n                },\n                err: null,\n            };\n        }\n        else if (this.bumpIf('>')) {\n            var childrenResult = this.parseMessage(nestingLevel + 1, parentArgType, true);\n            if (childrenResult.err) {\n                return childrenResult;\n            }\n            var children = childrenResult.val;\n            // Expecting a close tag\n            var endTagStartPosition = this.clonePosition();\n            if (this.bumpIf('</')) {\n                if (this.isEOF() || !_isAlpha(this.char())) {\n                    return this.error(ErrorKind.INVALID_TAG, createLocation(endTagStartPosition, this.clonePosition()));\n                }\n                var closingTagNameStartPosition = this.clonePosition();\n                var closingTagName = this.parseTagName();\n                if (tagName !== closingTagName) {\n                    return this.error(ErrorKind.UNMATCHED_CLOSING_TAG, createLocation(closingTagNameStartPosition, this.clonePosition()));\n                }\n                this.bumpSpace();\n                if (!this.bumpIf('>')) {\n                    return this.error(ErrorKind.INVALID_TAG, createLocation(endTagStartPosition, this.clonePosition()));\n                }\n                return {\n                    val: {\n                        type: TYPE.tag,\n                        value: tagName,\n                        children: children,\n                        location: createLocation(startPosition, this.clonePosition()),\n                    },\n                    err: null,\n                };\n            }\n            else {\n                return this.error(ErrorKind.UNCLOSED_TAG, createLocation(startPosition, this.clonePosition()));\n            }\n        }\n        else {\n            return this.error(ErrorKind.INVALID_TAG, createLocation(startPosition, this.clonePosition()));\n        }\n    };\n    /**\n     * This method assumes that the caller has peeked ahead for the first tag character.\n     */\n    Parser.prototype.parseTagName = function () {\n        var startOffset = this.offset();\n        this.bump(); // the first tag name character\n        while (!this.isEOF() && _isPotentialElementNameChar(this.char())) {\n            this.bump();\n        }\n        return this.message.slice(startOffset, this.offset());\n    };\n    Parser.prototype.parseLiteral = function (nestingLevel, parentArgType) {\n        var start = this.clonePosition();\n        var value = '';\n        while (true) {\n            var parseQuoteResult = this.tryParseQuote(parentArgType);\n            if (parseQuoteResult) {\n                value += parseQuoteResult;\n                continue;\n            }\n            var parseUnquotedResult = this.tryParseUnquoted(nestingLevel, parentArgType);\n            if (parseUnquotedResult) {\n                value += parseUnquotedResult;\n                continue;\n            }\n            var parseLeftAngleResult = this.tryParseLeftAngleBracket();\n            if (parseLeftAngleResult) {\n                value += parseLeftAngleResult;\n                continue;\n            }\n            break;\n        }\n        var location = createLocation(start, this.clonePosition());\n        return {\n            val: { type: TYPE.literal, value: value, location: location },\n            err: null,\n        };\n    };\n    Parser.prototype.tryParseLeftAngleBracket = function () {\n        if (!this.isEOF() &&\n            this.char() === 60 /* `<` */ &&\n            (this.ignoreTag ||\n                // If at the opening tag or closing tag position, bail.\n                !_isAlphaOrSlash(this.peek() || 0))) {\n            this.bump(); // `<`\n            return '<';\n        }\n        return null;\n    };\n    /**\n     * Starting with ICU 4.8, an ASCII apostrophe only starts quoted text if it immediately precedes\n     * a character that requires quoting (that is, \"only where needed\"), and works the same in\n     * nested messages as on the top level of the pattern. The new behavior is otherwise compatible.\n     */\n    Parser.prototype.tryParseQuote = function (parentArgType) {\n        if (this.isEOF() || this.char() !== 39 /* `'` */) {\n            return null;\n        }\n        // Parse escaped char following the apostrophe, or early return if there is no escaped char.\n        // Check if is valid escaped character\n        switch (this.peek()) {\n            case 39 /* `'` */:\n                // double quote, should return as a single quote.\n                this.bump();\n                this.bump();\n                return \"'\";\n            // '{', '<', '>', '}'\n            case 123:\n            case 60:\n            case 62:\n            case 125:\n                break;\n            case 35: // '#'\n                if (parentArgType === 'plural' || parentArgType === 'selectordinal') {\n                    break;\n                }\n                return null;\n            default:\n                return null;\n        }\n        this.bump(); // apostrophe\n        var codePoints = [this.char()]; // escaped char\n        this.bump();\n        // read chars until the optional closing apostrophe is found\n        while (!this.isEOF()) {\n            var ch = this.char();\n            if (ch === 39 /* `'` */) {\n                if (this.peek() === 39 /* `'` */) {\n                    codePoints.push(39);\n                    // Bump one more time because we need to skip 2 characters.\n                    this.bump();\n                }\n                else {\n                    // Optional closing apostrophe.\n                    this.bump();\n                    break;\n                }\n            }\n            else {\n                codePoints.push(ch);\n            }\n            this.bump();\n        }\n        return fromCodePoint.apply(void 0, codePoints);\n    };\n    Parser.prototype.tryParseUnquoted = function (nestingLevel, parentArgType) {\n        if (this.isEOF()) {\n            return null;\n        }\n        var ch = this.char();\n        if (ch === 60 /* `<` */ ||\n            ch === 123 /* `{` */ ||\n            (ch === 35 /* `#` */ &&\n                (parentArgType === 'plural' || parentArgType === 'selectordinal')) ||\n            (ch === 125 /* `}` */ && nestingLevel > 0)) {\n            return null;\n        }\n        else {\n            this.bump();\n            return fromCodePoint(ch);\n        }\n    };\n    Parser.prototype.parseArgument = function (nestingLevel, expectingCloseTag) {\n        var openingBracePosition = this.clonePosition();\n        this.bump(); // `{`\n        this.bumpSpace();\n        if (this.isEOF()) {\n            return this.error(ErrorKind.EXPECT_ARGUMENT_CLOSING_BRACE, createLocation(openingBracePosition, this.clonePosition()));\n        }\n        if (this.char() === 125 /* `}` */) {\n            this.bump();\n            return this.error(ErrorKind.EMPTY_ARGUMENT, createLocation(openingBracePosition, this.clonePosition()));\n        }\n        // argument name\n        var value = this.parseIdentifierIfPossible().value;\n        if (!value) {\n            return this.error(ErrorKind.MALFORMED_ARGUMENT, createLocation(openingBracePosition, this.clonePosition()));\n        }\n        this.bumpSpace();\n        if (this.isEOF()) {\n            return this.error(ErrorKind.EXPECT_ARGUMENT_CLOSING_BRACE, createLocation(openingBracePosition, this.clonePosition()));\n        }\n        switch (this.char()) {\n            // Simple argument: `{name}`\n            case 125 /* `}` */: {\n                this.bump(); // `}`\n                return {\n                    val: {\n                        type: TYPE.argument,\n                        // value does not include the opening and closing braces.\n                        value: value,\n                        location: createLocation(openingBracePosition, this.clonePosition()),\n                    },\n                    err: null,\n                };\n            }\n            // Argument with options: `{name, format, ...}`\n            case 44 /* `,` */: {\n                this.bump(); // `,`\n                this.bumpSpace();\n                if (this.isEOF()) {\n                    return this.error(ErrorKind.EXPECT_ARGUMENT_CLOSING_BRACE, createLocation(openingBracePosition, this.clonePosition()));\n                }\n                return this.parseArgumentOptions(nestingLevel, expectingCloseTag, value, openingBracePosition);\n            }\n            default:\n                return this.error(ErrorKind.MALFORMED_ARGUMENT, createLocation(openingBracePosition, this.clonePosition()));\n        }\n    };\n    /**\n     * Advance the parser until the end of the identifier, if it is currently on\n     * an identifier character. Return an empty string otherwise.\n     */\n    Parser.prototype.parseIdentifierIfPossible = function () {\n        var startingPosition = this.clonePosition();\n        var startOffset = this.offset();\n        var value = matchIdentifierAtIndex(this.message, startOffset);\n        var endOffset = startOffset + value.length;\n        this.bumpTo(endOffset);\n        var endPosition = this.clonePosition();\n        var location = createLocation(startingPosition, endPosition);\n        return { value: value, location: location };\n    };\n    Parser.prototype.parseArgumentOptions = function (nestingLevel, expectingCloseTag, value, openingBracePosition) {\n        var _a;\n        // Parse this range:\n        // {name, type, style}\n        //        ^---^\n        var typeStartPosition = this.clonePosition();\n        var argType = this.parseIdentifierIfPossible().value;\n        var typeEndPosition = this.clonePosition();\n        switch (argType) {\n            case '':\n                // Expecting a style string number, date, time, plural, selectordinal, or select.\n                return this.error(ErrorKind.EXPECT_ARGUMENT_TYPE, createLocation(typeStartPosition, typeEndPosition));\n            case 'number':\n            case 'date':\n            case 'time': {\n                // Parse this range:\n                // {name, number, style}\n                //              ^-------^\n                this.bumpSpace();\n                var styleAndLocation = null;\n                if (this.bumpIf(',')) {\n                    this.bumpSpace();\n                    var styleStartPosition = this.clonePosition();\n                    var result = this.parseSimpleArgStyleIfPossible();\n                    if (result.err) {\n                        return result;\n                    }\n                    var style = trimEnd(result.val);\n                    if (style.length === 0) {\n                        return this.error(ErrorKind.EXPECT_ARGUMENT_STYLE, createLocation(this.clonePosition(), this.clonePosition()));\n                    }\n                    var styleLocation = createLocation(styleStartPosition, this.clonePosition());\n                    styleAndLocation = { style: style, styleLocation: styleLocation };\n                }\n                var argCloseResult = this.tryParseArgumentClose(openingBracePosition);\n                if (argCloseResult.err) {\n                    return argCloseResult;\n                }\n                var location_1 = createLocation(openingBracePosition, this.clonePosition());\n                // Extract style or skeleton\n                if (styleAndLocation && startsWith(styleAndLocation === null || styleAndLocation === void 0 ? void 0 : styleAndLocation.style, '::', 0)) {\n                    // Skeleton starts with `::`.\n                    var skeleton = trimStart(styleAndLocation.style.slice(2));\n                    if (argType === 'number') {\n                        var result = this.parseNumberSkeletonFromString(skeleton, styleAndLocation.styleLocation);\n                        if (result.err) {\n                            return result;\n                        }\n                        return {\n                            val: { type: TYPE.number, value: value, location: location_1, style: result.val },\n                            err: null,\n                        };\n                    }\n                    else {\n                        if (skeleton.length === 0) {\n                            return this.error(ErrorKind.EXPECT_DATE_TIME_SKELETON, location_1);\n                        }\n                        var style = {\n                            type: SKELETON_TYPE.dateTime,\n                            pattern: skeleton,\n                            location: styleAndLocation.styleLocation,\n                            parsedOptions: this.shouldParseSkeletons\n                                ? parseDateTimeSkeleton(skeleton)\n                                : {},\n                        };\n                        var type = argType === 'date' ? TYPE.date : TYPE.time;\n                        return {\n                            val: { type: type, value: value, location: location_1, style: style },\n                            err: null,\n                        };\n                    }\n                }\n                // Regular style or no style.\n                return {\n                    val: {\n                        type: argType === 'number'\n                            ? TYPE.number\n                            : argType === 'date'\n                                ? TYPE.date\n                                : TYPE.time,\n                        value: value,\n                        location: location_1,\n                        style: (_a = styleAndLocation === null || styleAndLocation === void 0 ? void 0 : styleAndLocation.style) !== null && _a !== void 0 ? _a : null,\n                    },\n                    err: null,\n                };\n            }\n            case 'plural':\n            case 'selectordinal':\n            case 'select': {\n                // Parse this range:\n                // {name, plural, options}\n                //              ^---------^\n                var typeEndPosition_1 = this.clonePosition();\n                this.bumpSpace();\n                if (!this.bumpIf(',')) {\n                    return this.error(ErrorKind.EXPECT_SELECT_ARGUMENT_OPTIONS, createLocation(typeEndPosition_1, __assign({}, typeEndPosition_1)));\n                }\n                this.bumpSpace();\n                // Parse offset:\n                // {name, plural, offset:1, options}\n                //                ^-----^\n                //\n                // or the first option:\n                //\n                // {name, plural, one {...} other {...}}\n                //                ^--^\n                var identifierAndLocation = this.parseIdentifierIfPossible();\n                var pluralOffset = 0;\n                if (argType !== 'select' && identifierAndLocation.value === 'offset') {\n                    if (!this.bumpIf(':')) {\n                        return this.error(ErrorKind.EXPECT_PLURAL_ARGUMENT_OFFSET_VALUE, createLocation(this.clonePosition(), this.clonePosition()));\n                    }\n                    this.bumpSpace();\n                    var result = this.tryParseDecimalInteger(ErrorKind.EXPECT_PLURAL_ARGUMENT_OFFSET_VALUE, ErrorKind.INVALID_PLURAL_ARGUMENT_OFFSET_VALUE);\n                    if (result.err) {\n                        return result;\n                    }\n                    // Parse another identifier for option parsing\n                    this.bumpSpace();\n                    identifierAndLocation = this.parseIdentifierIfPossible();\n                    pluralOffset = result.val;\n                }\n                var optionsResult = this.tryParsePluralOrSelectOptions(nestingLevel, argType, expectingCloseTag, identifierAndLocation);\n                if (optionsResult.err) {\n                    return optionsResult;\n                }\n                var argCloseResult = this.tryParseArgumentClose(openingBracePosition);\n                if (argCloseResult.err) {\n                    return argCloseResult;\n                }\n                var location_2 = createLocation(openingBracePosition, this.clonePosition());\n                if (argType === 'select') {\n                    return {\n                        val: {\n                            type: TYPE.select,\n                            value: value,\n                            options: fromEntries(optionsResult.val),\n                            location: location_2,\n                        },\n                        err: null,\n                    };\n                }\n                else {\n                    return {\n                        val: {\n                            type: TYPE.plural,\n                            value: value,\n                            options: fromEntries(optionsResult.val),\n                            offset: pluralOffset,\n                            pluralType: argType === 'plural' ? 'cardinal' : 'ordinal',\n                            location: location_2,\n                        },\n                        err: null,\n                    };\n                }\n            }\n            default:\n                return this.error(ErrorKind.INVALID_ARGUMENT_TYPE, createLocation(typeStartPosition, typeEndPosition));\n        }\n    };\n    Parser.prototype.tryParseArgumentClose = function (openingBracePosition) {\n        // Parse: {value, number, ::currency/GBP }\n        //\n        if (this.isEOF() || this.char() !== 125 /* `}` */) {\n            return this.error(ErrorKind.EXPECT_ARGUMENT_CLOSING_BRACE, createLocation(openingBracePosition, this.clonePosition()));\n        }\n        this.bump(); // `}`\n        return { val: true, err: null };\n    };\n    /**\n     * See: https://github.com/unicode-org/icu/blob/af7ed1f6d2298013dc303628438ec4abe1f16479/icu4c/source/common/messagepattern.cpp#L659\n     */\n    Parser.prototype.parseSimpleArgStyleIfPossible = function () {\n        var nestedBraces = 0;\n        var startPosition = this.clonePosition();\n        while (!this.isEOF()) {\n            var ch = this.char();\n            switch (ch) {\n                case 39 /* `'` */: {\n                    // Treat apostrophe as quoting but include it in the style part.\n                    // Find the end of the quoted literal text.\n                    this.bump();\n                    var apostrophePosition = this.clonePosition();\n                    if (!this.bumpUntil(\"'\")) {\n                        return this.error(ErrorKind.UNCLOSED_QUOTE_IN_ARGUMENT_STYLE, createLocation(apostrophePosition, this.clonePosition()));\n                    }\n                    this.bump();\n                    break;\n                }\n                case 123 /* `{` */: {\n                    nestedBraces += 1;\n                    this.bump();\n                    break;\n                }\n                case 125 /* `}` */: {\n                    if (nestedBraces > 0) {\n                        nestedBraces -= 1;\n                    }\n                    else {\n                        return {\n                            val: this.message.slice(startPosition.offset, this.offset()),\n                            err: null,\n                        };\n                    }\n                    break;\n                }\n                default:\n                    this.bump();\n                    break;\n            }\n        }\n        return {\n            val: this.message.slice(startPosition.offset, this.offset()),\n            err: null,\n        };\n    };\n    Parser.prototype.parseNumberSkeletonFromString = function (skeleton, location) {\n        var tokens = [];\n        try {\n            tokens = parseNumberSkeletonFromString(skeleton);\n        }\n        catch (e) {\n            return this.error(ErrorKind.INVALID_NUMBER_SKELETON, location);\n        }\n        return {\n            val: {\n                type: SKELETON_TYPE.number,\n                tokens: tokens,\n                location: location,\n                parsedOptions: this.shouldParseSkeletons\n                    ? parseNumberSkeleton(tokens)\n                    : {},\n            },\n            err: null,\n        };\n    };\n    /**\n     * @param nesting_level The current nesting level of messages.\n     *     This can be positive when parsing message fragment in select or plural argument options.\n     * @param parent_arg_type The parent argument's type.\n     * @param parsed_first_identifier If provided, this is the first identifier-like selector of\n     *     the argument. It is a by-product of a previous parsing attempt.\n     * @param expecting_close_tag If true, this message is directly or indirectly nested inside\n     *     between a pair of opening and closing tags. The nested message will not parse beyond\n     *     the closing tag boundary.\n     */\n    Parser.prototype.tryParsePluralOrSelectOptions = function (nestingLevel, parentArgType, expectCloseTag, parsedFirstIdentifier) {\n        var _a;\n        var hasOtherClause = false;\n        var options = [];\n        var parsedSelectors = new Set();\n        var selector = parsedFirstIdentifier.value, selectorLocation = parsedFirstIdentifier.location;\n        // Parse:\n        // one {one apple}\n        // ^--^\n        while (true) {\n            if (selector.length === 0) {\n                var startPosition = this.clonePosition();\n                if (parentArgType !== 'select' && this.bumpIf('=')) {\n                    // Try parse `={number}` selector\n                    var result = this.tryParseDecimalInteger(ErrorKind.EXPECT_PLURAL_ARGUMENT_SELECTOR, ErrorKind.INVALID_PLURAL_ARGUMENT_SELECTOR);\n                    if (result.err) {\n                        return result;\n                    }\n                    selectorLocation = createLocation(startPosition, this.clonePosition());\n                    selector = this.message.slice(startPosition.offset, this.offset());\n                }\n                else {\n                    break;\n                }\n            }\n            // Duplicate selector clauses\n            if (parsedSelectors.has(selector)) {\n                return this.error(parentArgType === 'select'\n                    ? ErrorKind.DUPLICATE_SELECT_ARGUMENT_SELECTOR\n                    : ErrorKind.DUPLICATE_PLURAL_ARGUMENT_SELECTOR, selectorLocation);\n            }\n            if (selector === 'other') {\n                hasOtherClause = true;\n            }\n            // Parse:\n            // one {one apple}\n            //     ^----------^\n            this.bumpSpace();\n            var openingBracePosition = this.clonePosition();\n            if (!this.bumpIf('{')) {\n                return this.error(parentArgType === 'select'\n                    ? ErrorKind.EXPECT_SELECT_ARGUMENT_SELECTOR_FRAGMENT\n                    : ErrorKind.EXPECT_PLURAL_ARGUMENT_SELECTOR_FRAGMENT, createLocation(this.clonePosition(), this.clonePosition()));\n            }\n            var fragmentResult = this.parseMessage(nestingLevel + 1, parentArgType, expectCloseTag);\n            if (fragmentResult.err) {\n                return fragmentResult;\n            }\n            var argCloseResult = this.tryParseArgumentClose(openingBracePosition);\n            if (argCloseResult.err) {\n                return argCloseResult;\n            }\n            options.push([\n                selector,\n                {\n                    value: fragmentResult.val,\n                    location: createLocation(openingBracePosition, this.clonePosition()),\n                },\n            ]);\n            // Keep track of the existing selectors\n            parsedSelectors.add(selector);\n            // Prep next selector clause.\n            this.bumpSpace();\n            (_a = this.parseIdentifierIfPossible(), selector = _a.value, selectorLocation = _a.location);\n        }\n        if (options.length === 0) {\n            return this.error(parentArgType === 'select'\n                ? ErrorKind.EXPECT_SELECT_ARGUMENT_SELECTOR\n                : ErrorKind.EXPECT_PLURAL_ARGUMENT_SELECTOR, createLocation(this.clonePosition(), this.clonePosition()));\n        }\n        if (this.requiresOtherClause && !hasOtherClause) {\n            return this.error(ErrorKind.MISSING_OTHER_CLAUSE, createLocation(this.clonePosition(), this.clonePosition()));\n        }\n        return { val: options, err: null };\n    };\n    Parser.prototype.tryParseDecimalInteger = function (expectNumberError, invalidNumberError) {\n        var sign = 1;\n        var startingPosition = this.clonePosition();\n        if (this.bumpIf('+')) {\n        }\n        else if (this.bumpIf('-')) {\n            sign = -1;\n        }\n        var hasDigits = false;\n        var decimal = 0;\n        while (!this.isEOF()) {\n            var ch = this.char();\n            if (ch >= 48 /* `0` */ && ch <= 57 /* `9` */) {\n                hasDigits = true;\n                decimal = decimal * 10 + (ch - 48);\n                this.bump();\n            }\n            else {\n                break;\n            }\n        }\n        var location = createLocation(startingPosition, this.clonePosition());\n        if (!hasDigits) {\n            return this.error(expectNumberError, location);\n        }\n        decimal *= sign;\n        if (!isSafeInteger(decimal)) {\n            return this.error(invalidNumberError, location);\n        }\n        return { val: decimal, err: null };\n    };\n    Parser.prototype.offset = function () {\n        return this.position.offset;\n    };\n    Parser.prototype.isEOF = function () {\n        return this.offset() === this.message.length;\n    };\n    Parser.prototype.clonePosition = function () {\n        // This is much faster than `Object.assign` or spread.\n        return {\n            offset: this.position.offset,\n            line: this.position.line,\n            column: this.position.column,\n        };\n    };\n    /**\n     * Return the code point at the current position of the parser.\n     * Throws if the index is out of bound.\n     */\n    Parser.prototype.char = function () {\n        var offset = this.position.offset;\n        if (offset >= this.message.length) {\n            throw Error('out of bound');\n        }\n        var code = codePointAt(this.message, offset);\n        if (code === undefined) {\n            throw Error(\"Offset \".concat(offset, \" is at invalid UTF-16 code unit boundary\"));\n        }\n        return code;\n    };\n    Parser.prototype.error = function (kind, location) {\n        return {\n            val: null,\n            err: {\n                kind: kind,\n                message: this.message,\n                location: location,\n            },\n        };\n    };\n    /** Bump the parser to the next UTF-16 code unit. */\n    Parser.prototype.bump = function () {\n        if (this.isEOF()) {\n            return;\n        }\n        var code = this.char();\n        if (code === 10 /* '\\n' */) {\n            this.position.line += 1;\n            this.position.column = 1;\n            this.position.offset += 1;\n        }\n        else {\n            this.position.column += 1;\n            // 0 ~ 0x10000 -> unicode BMP, otherwise skip the surrogate pair.\n            this.position.offset += code < 0x10000 ? 1 : 2;\n        }\n    };\n    /**\n     * If the substring starting at the current position of the parser has\n     * the given prefix, then bump the parser to the character immediately\n     * following the prefix and return true. Otherwise, don't bump the parser\n     * and return false.\n     */\n    Parser.prototype.bumpIf = function (prefix) {\n        if (startsWith(this.message, prefix, this.offset())) {\n            for (var i = 0; i < prefix.length; i++) {\n                this.bump();\n            }\n            return true;\n        }\n        return false;\n    };\n    /**\n     * Bump the parser until the pattern character is found and return `true`.\n     * Otherwise bump to the end of the file and return `false`.\n     */\n    Parser.prototype.bumpUntil = function (pattern) {\n        var currentOffset = this.offset();\n        var index = this.message.indexOf(pattern, currentOffset);\n        if (index >= 0) {\n            this.bumpTo(index);\n            return true;\n        }\n        else {\n            this.bumpTo(this.message.length);\n            return false;\n        }\n    };\n    /**\n     * Bump the parser to the target offset.\n     * If target offset is beyond the end of the input, bump the parser to the end of the input.\n     */\n    Parser.prototype.bumpTo = function (targetOffset) {\n        if (this.offset() > targetOffset) {\n            throw Error(\"targetOffset \".concat(targetOffset, \" must be greater than or equal to the current offset \").concat(this.offset()));\n        }\n        targetOffset = Math.min(targetOffset, this.message.length);\n        while (true) {\n            var offset = this.offset();\n            if (offset === targetOffset) {\n                break;\n            }\n            if (offset > targetOffset) {\n                throw Error(\"targetOffset \".concat(targetOffset, \" is at invalid UTF-16 code unit boundary\"));\n            }\n            this.bump();\n            if (this.isEOF()) {\n                break;\n            }\n        }\n    };\n    /** advance the parser through all whitespace to the next non-whitespace code unit. */\n    Parser.prototype.bumpSpace = function () {\n        while (!this.isEOF() && _isWhiteSpace(this.char())) {\n            this.bump();\n        }\n    };\n    /**\n     * Peek at the *next* Unicode codepoint in the input without advancing the parser.\n     * If the input has been exhausted, then this returns null.\n     */\n    Parser.prototype.peek = function () {\n        if (this.isEOF()) {\n            return null;\n        }\n        var code = this.char();\n        var offset = this.offset();\n        var nextCode = this.message.charCodeAt(offset + (code >= 0x10000 ? 2 : 1));\n        return nextCode !== null && nextCode !== void 0 ? nextCode : null;\n    };\n    return Parser;\n}());\nexport { Parser };\n/**\n * This check if codepoint is alphabet (lower & uppercase)\n * @param codepoint\n * @returns\n */\nfunction _isAlpha(codepoint) {\n    return ((codepoint >= 97 && codepoint <= 122) ||\n        (codepoint >= 65 && codepoint <= 90));\n}\nfunction _isAlphaOrSlash(codepoint) {\n    return _isAlpha(codepoint) || codepoint === 47; /* '/' */\n}\n/** See `parseTag` function docs. */\nfunction _isPotentialElementNameChar(c) {\n    return (c === 45 /* '-' */ ||\n        c === 46 /* '.' */ ||\n        (c >= 48 && c <= 57) /* 0..9 */ ||\n        c === 95 /* '_' */ ||\n        (c >= 97 && c <= 122) /** a..z */ ||\n        (c >= 65 && c <= 90) /* A..Z */ ||\n        c == 0xb7 ||\n        (c >= 0xc0 && c <= 0xd6) ||\n        (c >= 0xd8 && c <= 0xf6) ||\n        (c >= 0xf8 && c <= 0x37d) ||\n        (c >= 0x37f && c <= 0x1fff) ||\n        (c >= 0x200c && c <= 0x200d) ||\n        (c >= 0x203f && c <= 0x2040) ||\n        (c >= 0x2070 && c <= 0x218f) ||\n        (c >= 0x2c00 && c <= 0x2fef) ||\n        (c >= 0x3001 && c <= 0xd7ff) ||\n        (c >= 0xf900 && c <= 0xfdcf) ||\n        (c >= 0xfdf0 && c <= 0xfffd) ||\n        (c >= 0x10000 && c <= 0xeffff));\n}\n/**\n * Code point equivalent of regex `\\p{White_Space}`.\n * From: https://www.unicode.org/Public/UCD/latest/ucd/PropList.txt\n */\nfunction _isWhiteSpace(c) {\n    return ((c >= 0x0009 && c <= 0x000d) ||\n        c === 0x0020 ||\n        c === 0x0085 ||\n        (c >= 0x200e && c <= 0x200f) ||\n        c === 0x2028 ||\n        c === 0x2029);\n}\n/**\n * Code point equivalent of regex `\\p{Pattern_Syntax}`.\n * See https://www.unicode.org/Public/UCD/latest/ucd/PropList.txt\n */\nfunction _isPatternSyntax(c) {\n    return ((c >= 0x0021 && c <= 0x0023) ||\n        c === 0x0024 ||\n        (c >= 0x0025 && c <= 0x0027) ||\n        c === 0x0028 ||\n        c === 0x0029 ||\n        c === 0x002a ||\n        c === 0x002b ||\n        c === 0x002c ||\n        c === 0x002d ||\n        (c >= 0x002e && c <= 0x002f) ||\n        (c >= 0x003a && c <= 0x003b) ||\n        (c >= 0x003c && c <= 0x003e) ||\n        (c >= 0x003f && c <= 0x0040) ||\n        c === 0x005b ||\n        c === 0x005c ||\n        c === 0x005d ||\n        c === 0x005e ||\n        c === 0x0060 ||\n        c === 0x007b ||\n        c === 0x007c ||\n        c === 0x007d ||\n        c === 0x007e ||\n        c === 0x00a1 ||\n        (c >= 0x00a2 && c <= 0x00a5) ||\n        c === 0x00a6 ||\n        c === 0x00a7 ||\n        c === 0x00a9 ||\n        c === 0x00ab ||\n        c === 0x00ac ||\n        c === 0x00ae ||\n        c === 0x00b0 ||\n        c === 0x00b1 ||\n        c === 0x00b6 ||\n        c === 0x00bb ||\n        c === 0x00bf ||\n        c === 0x00d7 ||\n        c === 0x00f7 ||\n        (c >= 0x2010 && c <= 0x2015) ||\n        (c >= 0x2016 && c <= 0x2017) ||\n        c === 0x2018 ||\n        c === 0x2019 ||\n        c === 0x201a ||\n        (c >= 0x201b && c <= 0x201c) ||\n        c === 0x201d ||\n        c === 0x201e ||\n        c === 0x201f ||\n        (c >= 0x2020 && c <= 0x2027) ||\n        (c >= 0x2030 && c <= 0x2038) ||\n        c === 0x2039 ||\n        c === 0x203a ||\n        (c >= 0x203b && c <= 0x203e) ||\n        (c >= 0x2041 && c <= 0x2043) ||\n        c === 0x2044 ||\n        c === 0x2045 ||\n        c === 0x2046 ||\n        (c >= 0x2047 && c <= 0x2051) ||\n        c === 0x2052 ||\n        c === 0x2053 ||\n        (c >= 0x2055 && c <= 0x205e) ||\n        (c >= 0x2190 && c <= 0x2194) ||\n        (c >= 0x2195 && c <= 0x2199) ||\n        (c >= 0x219a && c <= 0x219b) ||\n        (c >= 0x219c && c <= 0x219f) ||\n        c === 0x21a0 ||\n        (c >= 0x21a1 && c <= 0x21a2) ||\n        c === 0x21a3 ||\n        (c >= 0x21a4 && c <= 0x21a5) ||\n        c === 0x21a6 ||\n        (c >= 0x21a7 && c <= 0x21ad) ||\n        c === 0x21ae ||\n        (c >= 0x21af && c <= 0x21cd) ||\n        (c >= 0x21ce && c <= 0x21cf) ||\n        (c >= 0x21d0 && c <= 0x21d1) ||\n        c === 0x21d2 ||\n        c === 0x21d3 ||\n        c === 0x21d4 ||\n        (c >= 0x21d5 && c <= 0x21f3) ||\n        (c >= 0x21f4 && c <= 0x22ff) ||\n        (c >= 0x2300 && c <= 0x2307) ||\n        c === 0x2308 ||\n        c === 0x2309 ||\n        c === 0x230a ||\n        c === 0x230b ||\n        (c >= 0x230c && c <= 0x231f) ||\n        (c >= 0x2320 && c <= 0x2321) ||\n        (c >= 0x2322 && c <= 0x2328) ||\n        c === 0x2329 ||\n        c === 0x232a ||\n        (c >= 0x232b && c <= 0x237b) ||\n        c === 0x237c ||\n        (c >= 0x237d && c <= 0x239a) ||\n        (c >= 0x239b && c <= 0x23b3) ||\n        (c >= 0x23b4 && c <= 0x23db) ||\n        (c >= 0x23dc && c <= 0x23e1) ||\n        (c >= 0x23e2 && c <= 0x2426) ||\n        (c >= 0x2427 && c <= 0x243f) ||\n        (c >= 0x2440 && c <= 0x244a) ||\n        (c >= 0x244b && c <= 0x245f) ||\n        (c >= 0x2500 && c <= 0x25b6) ||\n        c === 0x25b7 ||\n        (c >= 0x25b8 && c <= 0x25c0) ||\n        c === 0x25c1 ||\n        (c >= 0x25c2 && c <= 0x25f7) ||\n        (c >= 0x25f8 && c <= 0x25ff) ||\n        (c >= 0x2600 && c <= 0x266e) ||\n        c === 0x266f ||\n        (c >= 0x2670 && c <= 0x2767) ||\n        c === 0x2768 ||\n        c === 0x2769 ||\n        c === 0x276a ||\n        c === 0x276b ||\n        c === 0x276c ||\n        c === 0x276d ||\n        c === 0x276e ||\n        c === 0x276f ||\n        c === 0x2770 ||\n        c === 0x2771 ||\n        c === 0x2772 ||\n        c === 0x2773 ||\n        c === 0x2774 ||\n        c === 0x2775 ||\n        (c >= 0x2794 && c <= 0x27bf) ||\n        (c >= 0x27c0 && c <= 0x27c4) ||\n        c === 0x27c5 ||\n        c === 0x27c6 ||\n        (c >= 0x27c7 && c <= 0x27e5) ||\n        c === 0x27e6 ||\n        c === 0x27e7 ||\n        c === 0x27e8 ||\n        c === 0x27e9 ||\n        c === 0x27ea ||\n        c === 0x27eb ||\n        c === 0x27ec ||\n        c === 0x27ed ||\n        c === 0x27ee ||\n        c === 0x27ef ||\n        (c >= 0x27f0 && c <= 0x27ff) ||\n        (c >= 0x2800 && c <= 0x28ff) ||\n        (c >= 0x2900 && c <= 0x2982) ||\n        c === 0x2983 ||\n        c === 0x2984 ||\n        c === 0x2985 ||\n        c === 0x2986 ||\n        c === 0x2987 ||\n        c === 0x2988 ||\n        c === 0x2989 ||\n        c === 0x298a ||\n        c === 0x298b ||\n        c === 0x298c ||\n        c === 0x298d ||\n        c === 0x298e ||\n        c === 0x298f ||\n        c === 0x2990 ||\n        c === 0x2991 ||\n        c === 0x2992 ||\n        c === 0x2993 ||\n        c === 0x2994 ||\n        c === 0x2995 ||\n        c === 0x2996 ||\n        c === 0x2997 ||\n        c === 0x2998 ||\n        (c >= 0x2999 && c <= 0x29d7) ||\n        c === 0x29d8 ||\n        c === 0x29d9 ||\n        c === 0x29da ||\n        c === 0x29db ||\n        (c >= 0x29dc && c <= 0x29fb) ||\n        c === 0x29fc ||\n        c === 0x29fd ||\n        (c >= 0x29fe && c <= 0x2aff) ||\n        (c >= 0x2b00 && c <= 0x2b2f) ||\n        (c >= 0x2b30 && c <= 0x2b44) ||\n        (c >= 0x2b45 && c <= 0x2b46) ||\n        (c >= 0x2b47 && c <= 0x2b4c) ||\n        (c >= 0x2b4d && c <= 0x2b73) ||\n        (c >= 0x2b74 && c <= 0x2b75) ||\n        (c >= 0x2b76 && c <= 0x2b95) ||\n        c === 0x2b96 ||\n        (c >= 0x2b97 && c <= 0x2bff) ||\n        (c >= 0x2e00 && c <= 0x2e01) ||\n        c === 0x2e02 ||\n        c === 0x2e03 ||\n        c === 0x2e04 ||\n        c === 0x2e05 ||\n        (c >= 0x2e06 && c <= 0x2e08) ||\n        c === 0x2e09 ||\n        c === 0x2e0a ||\n        c === 0x2e0b ||\n        c === 0x2e0c ||\n        c === 0x2e0d ||\n        (c >= 0x2e0e && c <= 0x2e16) ||\n        c === 0x2e17 ||\n        (c >= 0x2e18 && c <= 0x2e19) ||\n        c === 0x2e1a ||\n        c === 0x2e1b ||\n        c === 0x2e1c ||\n        c === 0x2e1d ||\n        (c >= 0x2e1e && c <= 0x2e1f) ||\n        c === 0x2e20 ||\n        c === 0x2e21 ||\n        c === 0x2e22 ||\n        c === 0x2e23 ||\n        c === 0x2e24 ||\n        c === 0x2e25 ||\n        c === 0x2e26 ||\n        c === 0x2e27 ||\n        c === 0x2e28 ||\n        c === 0x2e29 ||\n        (c >= 0x2e2a && c <= 0x2e2e) ||\n        c === 0x2e2f ||\n        (c >= 0x2e30 && c <= 0x2e39) ||\n        (c >= 0x2e3a && c <= 0x2e3b) ||\n        (c >= 0x2e3c && c <= 0x2e3f) ||\n        c === 0x2e40 ||\n        c === 0x2e41 ||\n        c === 0x2e42 ||\n        (c >= 0x2e43 && c <= 0x2e4f) ||\n        (c >= 0x2e50 && c <= 0x2e51) ||\n        c === 0x2e52 ||\n        (c >= 0x2e53 && c <= 0x2e7f) ||\n        (c >= 0x3001 && c <= 0x3003) ||\n        c === 0x3008 ||\n        c === 0x3009 ||\n        c === 0x300a ||\n        c === 0x300b ||\n        c === 0x300c ||\n        c === 0x300d ||\n        c === 0x300e ||\n        c === 0x300f ||\n        c === 0x3010 ||\n        c === 0x3011 ||\n        (c >= 0x3012 && c <= 0x3013) ||\n        c === 0x3014 ||\n        c === 0x3015 ||\n        c === 0x3016 ||\n        c === 0x3017 ||\n        c === 0x3018 ||\n        c === 0x3019 ||\n        c === 0x301a ||\n        c === 0x301b ||\n        c === 0x301c ||\n        c === 0x301d ||\n        (c >= 0x301e && c <= 0x301f) ||\n        c === 0x3020 ||\n        c === 0x3030 ||\n        c === 0xfd3e ||\n        c === 0xfd3f ||\n        (c >= 0xfe45 && c <= 0xfe46));\n}\n","import { __assign } from \"tslib\";\nimport { ErrorKind } from './error';\nimport { Parser } from './parser';\nimport { isDateElement, isDateTimeSkeleton, isNumberElement, isNumberSkeleton, isPluralElement, isSelectElement, isTagElement, isTimeElement, } from './types';\nfunction pruneLocation(els) {\n    els.forEach(function (el) {\n        delete el.location;\n        if (isSelectElement(el) || isPluralElement(el)) {\n            for (var k in el.options) {\n                delete el.options[k].location;\n                pruneLocation(el.options[k].value);\n            }\n        }\n        else if (isNumberElement(el) && isNumberSkeleton(el.style)) {\n            delete el.style.location;\n        }\n        else if ((isDateElement(el) || isTimeElement(el)) &&\n            isDateTimeSkeleton(el.style)) {\n            delete el.style.location;\n        }\n        else if (isTagElement(el)) {\n            pruneLocation(el.children);\n        }\n    });\n}\nexport function parse(message, opts) {\n    if (opts === void 0) { opts = {}; }\n    opts = __assign({ shouldParseSkeletons: true, requiresOtherClause: true }, opts);\n    var result = new Parser(message, opts).parse();\n    if (result.err) {\n        var error = SyntaxError(ErrorKind[result.err.kind]);\n        // @ts-expect-error Assign to error object\n        error.location = result.err.location;\n        // @ts-expect-error Assign to error object\n        error.originalMessage = result.err.message;\n        throw error;\n    }\n    if (!(opts === null || opts === void 0 ? void 0 : opts.captureLocation)) {\n        pruneLocation(result.val);\n    }\n    return result.val;\n}\nexport * from './types';\n","//\n// Main\n//\nexport default function memoize(fn, options) {\n    var cache = options && options.cache ? options.cache : cacheDefault;\n    var serializer = options && options.serializer ? options.serializer : serializerDefault;\n    var strategy = options && options.strategy ? options.strategy : strategyDefault;\n    return strategy(fn, {\n        cache: cache,\n        serializer: serializer,\n    });\n}\n//\n// Strategy\n//\nfunction isPrimitive(value) {\n    return (value == null || typeof value === 'number' || typeof value === 'boolean'); // || typeof value === \"string\" 'unsafe' primitive for our needs\n}\nfunction monadic(fn, cache, serializer, arg) {\n    var cacheKey = isPrimitive(arg) ? arg : serializer(arg);\n    var computedValue = cache.get(cacheKey);\n    if (typeof computedValue === 'undefined') {\n        computedValue = fn.call(this, arg);\n        cache.set(cacheKey, computedValue);\n    }\n    return computedValue;\n}\nfunction variadic(fn, cache, serializer) {\n    var args = Array.prototype.slice.call(arguments, 3);\n    var cacheKey = serializer(args);\n    var computedValue = cache.get(cacheKey);\n    if (typeof computedValue === 'undefined') {\n        computedValue = fn.apply(this, args);\n        cache.set(cacheKey, computedValue);\n    }\n    return computedValue;\n}\nfunction assemble(fn, context, strategy, cache, serialize) {\n    return strategy.bind(context, fn, cache, serialize);\n}\nfunction strategyDefault(fn, options) {\n    var strategy = fn.length === 1 ? monadic : variadic;\n    return assemble(fn, this, strategy, options.cache.create(), options.serializer);\n}\nfunction strategyVariadic(fn, options) {\n    return assemble(fn, this, variadic, options.cache.create(), options.serializer);\n}\nfunction strategyMonadic(fn, options) {\n    return assemble(fn, this, monadic, options.cache.create(), options.serializer);\n}\n//\n// Serializer\n//\nvar serializerDefault = function () {\n    return JSON.stringify(arguments);\n};\n//\n// Cache\n//\nfunction ObjectWithoutPrototypeCache() {\n    this.cache = Object.create(null);\n}\nObjectWithoutPrototypeCache.prototype.get = function (key) {\n    return this.cache[key];\n};\nObjectWithoutPrototypeCache.prototype.set = function (key, value) {\n    this.cache[key] = value;\n};\nvar cacheDefault = {\n    create: function create() {\n        // @ts-ignore\n        return new ObjectWithoutPrototypeCache();\n    },\n};\nexport var strategies = {\n    variadic: strategyVariadic,\n    monadic: strategyMonadic,\n};\n","import { __extends } from \"tslib\";\nexport var ErrorCode;\n(function (ErrorCode) {\n    // When we have a placeholder but no value to format\n    ErrorCode[\"MISSING_VALUE\"] = \"MISSING_VALUE\";\n    // When value supplied is invalid\n    ErrorCode[\"INVALID_VALUE\"] = \"INVALID_VALUE\";\n    // When we need specific Intl API but it's not available\n    ErrorCode[\"MISSING_INTL_API\"] = \"MISSING_INTL_API\";\n})(ErrorCode || (ErrorCode = {}));\nvar FormatError = /** @class */ (function (_super) {\n    __extends(FormatError, _super);\n    function FormatError(msg, code, originalMessage) {\n        var _this = _super.call(this, msg) || this;\n        _this.code = code;\n        _this.originalMessage = originalMessage;\n        return _this;\n    }\n    FormatError.prototype.toString = function () {\n        return \"[formatjs Error: \".concat(this.code, \"] \").concat(this.message);\n    };\n    return FormatError;\n}(Error));\nexport { FormatError };\nvar InvalidValueError = /** @class */ (function (_super) {\n    __extends(InvalidValueError, _super);\n    function InvalidValueError(variableId, value, options, originalMessage) {\n        return _super.call(this, \"Invalid values for \\\"\".concat(variableId, \"\\\": \\\"\").concat(value, \"\\\". Options are \\\"\").concat(Object.keys(options).join('\", \"'), \"\\\"\"), ErrorCode.INVALID_VALUE, originalMessage) || this;\n    }\n    return InvalidValueError;\n}(FormatError));\nexport { InvalidValueError };\nvar InvalidValueTypeError = /** @class */ (function (_super) {\n    __extends(InvalidValueTypeError, _super);\n    function InvalidValueTypeError(value, type, originalMessage) {\n        return _super.call(this, \"Value for \\\"\".concat(value, \"\\\" must be of type \").concat(type), ErrorCode.INVALID_VALUE, originalMessage) || this;\n    }\n    return InvalidValueTypeError;\n}(FormatError));\nexport { InvalidValueTypeError };\nvar MissingValueError = /** @class */ (function (_super) {\n    __extends(MissingValueError, _super);\n    function MissingValueError(variableId, originalMessage) {\n        return _super.call(this, \"The intl string context variable \\\"\".concat(variableId, \"\\\" was not provided to the string \\\"\").concat(originalMessage, \"\\\"\"), ErrorCode.MISSING_VALUE, originalMessage) || this;\n    }\n    return MissingValueError;\n}(FormatError));\nexport { MissingValueError };\n","import { isArgumentElement, isDateElement, isDateTimeSkeleton, isLiteralElement, isNumberElement, isNumberSkeleton, isPluralElement, isPoundElement, isSelectElement, isTimeElement, isTagElement, } from '@formatjs/icu-messageformat-parser';\nimport { MissingValueError, InvalidValueError, ErrorCode, FormatError, InvalidValueTypeError, } from './error';\nexport var PART_TYPE;\n(function (PART_TYPE) {\n    PART_TYPE[PART_TYPE[\"literal\"] = 0] = \"literal\";\n    PART_TYPE[PART_TYPE[\"object\"] = 1] = \"object\";\n})(PART_TYPE || (PART_TYPE = {}));\nfunction mergeLiteral(parts) {\n    if (parts.length < 2) {\n        return parts;\n    }\n    return parts.reduce(function (all, part) {\n        var lastPart = all[all.length - 1];\n        if (!lastPart ||\n            lastPart.type !== PART_TYPE.literal ||\n            part.type !== PART_TYPE.literal) {\n            all.push(part);\n        }\n        else {\n            lastPart.value += part.value;\n        }\n        return all;\n    }, []);\n}\nexport function isFormatXMLElementFn(el) {\n    return typeof el === 'function';\n}\n// TODO(skeleton): add skeleton support\nexport function formatToParts(els, locales, formatters, formats, values, currentPluralValue, \n// For debugging\noriginalMessage) {\n    // Hot path for straight simple msg translations\n    if (els.length === 1 && isLiteralElement(els[0])) {\n        return [\n            {\n                type: PART_TYPE.literal,\n                value: els[0].value,\n            },\n        ];\n    }\n    var result = [];\n    for (var _i = 0, els_1 = els; _i < els_1.length; _i++) {\n        var el = els_1[_i];\n        // Exit early for string parts.\n        if (isLiteralElement(el)) {\n            result.push({\n                type: PART_TYPE.literal,\n                value: el.value,\n            });\n            continue;\n        }\n        // TODO: should this part be literal type?\n        // Replace `#` in plural rules with the actual numeric value.\n        if (isPoundElement(el)) {\n            if (typeof currentPluralValue === 'number') {\n                result.push({\n                    type: PART_TYPE.literal,\n                    value: formatters.getNumberFormat(locales).format(currentPluralValue),\n                });\n            }\n            continue;\n        }\n        var varName = el.value;\n        // Enforce that all required values are provided by the caller.\n        if (!(values && varName in values)) {\n            throw new MissingValueError(varName, originalMessage);\n        }\n        var value = values[varName];\n        if (isArgumentElement(el)) {\n            if (!value || typeof value === 'string' || typeof value === 'number') {\n                value =\n                    typeof value === 'string' || typeof value === 'number'\n                        ? String(value)\n                        : '';\n            }\n            result.push({\n                type: typeof value === 'string' ? PART_TYPE.literal : PART_TYPE.object,\n                value: value,\n            });\n            continue;\n        }\n        // Recursively format plural and select parts' option — which can be a\n        // nested pattern structure. The choosing of the option to use is\n        // abstracted-by and delegated-to the part helper object.\n        if (isDateElement(el)) {\n            var style = typeof el.style === 'string'\n                ? formats.date[el.style]\n                : isDateTimeSkeleton(el.style)\n                    ? el.style.parsedOptions\n                    : undefined;\n            result.push({\n                type: PART_TYPE.literal,\n                value: formatters\n                    .getDateTimeFormat(locales, style)\n                    .format(value),\n            });\n            continue;\n        }\n        if (isTimeElement(el)) {\n            var style = typeof el.style === 'string'\n                ? formats.time[el.style]\n                : isDateTimeSkeleton(el.style)\n                    ? el.style.parsedOptions\n                    : undefined;\n            result.push({\n                type: PART_TYPE.literal,\n                value: formatters\n                    .getDateTimeFormat(locales, style)\n                    .format(value),\n            });\n            continue;\n        }\n        if (isNumberElement(el)) {\n            var style = typeof el.style === 'string'\n                ? formats.number[el.style]\n                : isNumberSkeleton(el.style)\n                    ? el.style.parsedOptions\n                    : undefined;\n            if (style && style.scale) {\n                value =\n                    value *\n                        (style.scale || 1);\n            }\n            result.push({\n                type: PART_TYPE.literal,\n                value: formatters\n                    .getNumberFormat(locales, style)\n                    .format(value),\n            });\n            continue;\n        }\n        if (isTagElement(el)) {\n            var children = el.children, value_1 = el.value;\n            var formatFn = values[value_1];\n            if (!isFormatXMLElementFn(formatFn)) {\n                throw new InvalidValueTypeError(value_1, 'function', originalMessage);\n            }\n            var parts = formatToParts(children, locales, formatters, formats, values, currentPluralValue);\n            var chunks = formatFn(parts.map(function (p) { return p.value; }));\n            if (!Array.isArray(chunks)) {\n                chunks = [chunks];\n            }\n            result.push.apply(result, chunks.map(function (c) {\n                return {\n                    type: typeof c === 'string' ? PART_TYPE.literal : PART_TYPE.object,\n                    value: c,\n                };\n            }));\n        }\n        if (isSelectElement(el)) {\n            var opt = el.options[value] || el.options.other;\n            if (!opt) {\n                throw new InvalidValueError(el.value, value, Object.keys(el.options), originalMessage);\n            }\n            result.push.apply(result, formatToParts(opt.value, locales, formatters, formats, values));\n            continue;\n        }\n        if (isPluralElement(el)) {\n            var opt = el.options[\"=\".concat(value)];\n            if (!opt) {\n                if (!Intl.PluralRules) {\n                    throw new FormatError(\"Intl.PluralRules is not available in this environment.\\nTry polyfilling it using \\\"@formatjs/intl-pluralrules\\\"\\n\", ErrorCode.MISSING_INTL_API, originalMessage);\n                }\n                var rule = formatters\n                    .getPluralRules(locales, { type: el.pluralType })\n                    .select(value - (el.offset || 0));\n                opt = el.options[rule] || el.options.other;\n            }\n            if (!opt) {\n                throw new InvalidValueError(el.value, value, Object.keys(el.options), originalMessage);\n            }\n            result.push.apply(result, formatToParts(opt.value, locales, formatters, formats, values, value - (el.offset || 0)));\n            continue;\n        }\n    }\n    return mergeLiteral(result);\n}\n","/*\nCopyright (c) 2014, Yahoo! Inc. All rights reserved.\nCopyrights licensed under the New BSD License.\nSee the accompanying LICENSE file for terms.\n*/\nimport { __assign, __spreadArray } from \"tslib\";\nimport { parse } from '@formatjs/icu-messageformat-parser';\nimport memoize, { strategies } from '@formatjs/fast-memoize';\nimport { formatToParts, PART_TYPE, } from './formatters';\n// -- MessageFormat --------------------------------------------------------\nfunction mergeConfig(c1, c2) {\n    if (!c2) {\n        return c1;\n    }\n    return __assign(__assign(__assign({}, (c1 || {})), (c2 || {})), Object.keys(c1).reduce(function (all, k) {\n        all[k] = __assign(__assign({}, c1[k]), (c2[k] || {}));\n        return all;\n    }, {}));\n}\nfunction mergeConfigs(defaultConfig, configs) {\n    if (!configs) {\n        return defaultConfig;\n    }\n    return Object.keys(defaultConfig).reduce(function (all, k) {\n        all[k] = mergeConfig(defaultConfig[k], configs[k]);\n        return all;\n    }, __assign({}, defaultConfig));\n}\nfunction createFastMemoizeCache(store) {\n    return {\n        create: function () {\n            return {\n                get: function (key) {\n                    return store[key];\n                },\n                set: function (key, value) {\n                    store[key] = value;\n                },\n            };\n        },\n    };\n}\nfunction createDefaultFormatters(cache) {\n    if (cache === void 0) { cache = {\n        number: {},\n        dateTime: {},\n        pluralRules: {},\n    }; }\n    return {\n        getNumberFormat: memoize(function () {\n            var _a;\n            var args = [];\n            for (var _i = 0; _i < arguments.length; _i++) {\n                args[_i] = arguments[_i];\n            }\n            return new ((_a = Intl.NumberFormat).bind.apply(_a, __spreadArray([void 0], args, false)))();\n        }, {\n            cache: createFastMemoizeCache(cache.number),\n            strategy: strategies.variadic,\n        }),\n        getDateTimeFormat: memoize(function () {\n            var _a;\n            var args = [];\n            for (var _i = 0; _i < arguments.length; _i++) {\n                args[_i] = arguments[_i];\n            }\n            return new ((_a = Intl.DateTimeFormat).bind.apply(_a, __spreadArray([void 0], args, false)))();\n        }, {\n            cache: createFastMemoizeCache(cache.dateTime),\n            strategy: strategies.variadic,\n        }),\n        getPluralRules: memoize(function () {\n            var _a;\n            var args = [];\n            for (var _i = 0; _i < arguments.length; _i++) {\n                args[_i] = arguments[_i];\n            }\n            return new ((_a = Intl.PluralRules).bind.apply(_a, __spreadArray([void 0], args, false)))();\n        }, {\n            cache: createFastMemoizeCache(cache.pluralRules),\n            strategy: strategies.variadic,\n        }),\n    };\n}\nvar IntlMessageFormat = /** @class */ (function () {\n    function IntlMessageFormat(message, locales, overrideFormats, opts) {\n        var _this = this;\n        if (locales === void 0) { locales = IntlMessageFormat.defaultLocale; }\n        this.formatterCache = {\n            number: {},\n            dateTime: {},\n            pluralRules: {},\n        };\n        this.format = function (values) {\n            var parts = _this.formatToParts(values);\n            // Hot path for straight simple msg translations\n            if (parts.length === 1) {\n                return parts[0].value;\n            }\n            var result = parts.reduce(function (all, part) {\n                if (!all.length ||\n                    part.type !== PART_TYPE.literal ||\n                    typeof all[all.length - 1] !== 'string') {\n                    all.push(part.value);\n                }\n                else {\n                    all[all.length - 1] += part.value;\n                }\n                return all;\n            }, []);\n            if (result.length <= 1) {\n                return result[0] || '';\n            }\n            return result;\n        };\n        this.formatToParts = function (values) {\n            return formatToParts(_this.ast, _this.locales, _this.formatters, _this.formats, values, undefined, _this.message);\n        };\n        this.resolvedOptions = function () { return ({\n            locale: Intl.NumberFormat.supportedLocalesOf(_this.locales)[0],\n        }); };\n        this.getAst = function () { return _this.ast; };\n        if (typeof message === 'string') {\n            this.message = message;\n            if (!IntlMessageFormat.__parse) {\n                throw new TypeError('IntlMessageFormat.__parse must be set to process `message` of type `string`');\n            }\n            // Parse string messages into an AST.\n            this.ast = IntlMessageFormat.__parse(message, {\n                ignoreTag: opts === null || opts === void 0 ? void 0 : opts.ignoreTag,\n            });\n        }\n        else {\n            this.ast = message;\n        }\n        if (!Array.isArray(this.ast)) {\n            throw new TypeError('A message must be provided as a String or AST.');\n        }\n        // Creates a new object with the specified `formats` merged with the default\n        // formats.\n        this.formats = mergeConfigs(IntlMessageFormat.formats, overrideFormats);\n        // Defined first because it's used to build the format pattern.\n        this.locales = locales;\n        this.formatters =\n            (opts && opts.formatters) || createDefaultFormatters(this.formatterCache);\n    }\n    Object.defineProperty(IntlMessageFormat, \"defaultLocale\", {\n        get: function () {\n            if (!IntlMessageFormat.memoizedDefaultLocale) {\n                IntlMessageFormat.memoizedDefaultLocale =\n                    new Intl.NumberFormat().resolvedOptions().locale;\n            }\n            return IntlMessageFormat.memoizedDefaultLocale;\n        },\n        enumerable: false,\n        configurable: true\n    });\n    IntlMessageFormat.memoizedDefaultLocale = null;\n    IntlMessageFormat.__parse = parse;\n    // Default format options used as the prototype of the `formats` provided to the\n    // constructor. These are used when constructing the internal Intl.NumberFormat\n    // and Intl.DateTimeFormat instances.\n    IntlMessageFormat.formats = {\n        number: {\n            integer: {\n                maximumFractionDigits: 0,\n            },\n            currency: {\n                style: 'currency',\n            },\n            percent: {\n                style: 'percent',\n            },\n        },\n        date: {\n            short: {\n                month: 'numeric',\n                day: 'numeric',\n                year: '2-digit',\n            },\n            medium: {\n                month: 'short',\n                day: 'numeric',\n                year: 'numeric',\n            },\n            long: {\n                month: 'long',\n                day: 'numeric',\n                year: 'numeric',\n            },\n            full: {\n                weekday: 'long',\n                month: 'long',\n                day: 'numeric',\n                year: 'numeric',\n            },\n        },\n        time: {\n            short: {\n                hour: 'numeric',\n                minute: 'numeric',\n            },\n            medium: {\n                hour: 'numeric',\n                minute: 'numeric',\n                second: 'numeric',\n            },\n            long: {\n                hour: 'numeric',\n                minute: 'numeric',\n                second: 'numeric',\n                timeZoneName: 'short',\n            },\n            full: {\n                hour: 'numeric',\n                minute: 'numeric',\n                second: 'numeric',\n                timeZoneName: 'short',\n            },\n        },\n    };\n    return IntlMessageFormat;\n}());\nexport { IntlMessageFormat };\n","/*\nCopyright (c) 2014, Yahoo! Inc. All rights reserved.\nCopyrights licensed under the New BSD License.\nSee the accompanying LICENSE file for terms.\n*/\nimport { IntlMessageFormat } from './src/core';\nexport * from './src/formatters';\nexport * from './src/core';\nexport * from './src/error';\nexport default IntlMessageFormat;\n","import { __extends } from \"tslib\";\nexport var IntlErrorCode;\n(function (IntlErrorCode) {\n    IntlErrorCode[\"FORMAT_ERROR\"] = \"FORMAT_ERROR\";\n    IntlErrorCode[\"UNSUPPORTED_FORMATTER\"] = \"UNSUPPORTED_FORMATTER\";\n    IntlErrorCode[\"INVALID_CONFIG\"] = \"INVALID_CONFIG\";\n    IntlErrorCode[\"MISSING_DATA\"] = \"MISSING_DATA\";\n    IntlErrorCode[\"MISSING_TRANSLATION\"] = \"MISSING_TRANSLATION\";\n})(IntlErrorCode || (IntlErrorCode = {}));\nvar IntlError = /** @class */ (function (_super) {\n    __extends(IntlError, _super);\n    function IntlError(code, message, exception) {\n        var _this = this;\n        var err = exception\n            ? exception instanceof Error\n                ? exception\n                : new Error(String(exception))\n            : undefined;\n        _this = _super.call(this, \"[@formatjs/intl Error \".concat(code, \"] \").concat(message, \" \\n\").concat(err ? \"\\n\".concat(err.message, \"\\n\").concat(err.stack) : '')) || this;\n        _this.code = code;\n        // @ts-ignore just so we don't need to declare dep on @types/node\n        if (typeof Error.captureStackTrace === 'function') {\n            // @ts-ignore just so we don't need to declare dep on @types/node\n            Error.captureStackTrace(_this, IntlError);\n        }\n        return _this;\n    }\n    return IntlError;\n}(Error));\nexport { IntlError };\nvar UnsupportedFormatterError = /** @class */ (function (_super) {\n    __extends(UnsupportedFormatterError, _super);\n    function UnsupportedFormatterError(message, exception) {\n        return _super.call(this, IntlErrorCode.UNSUPPORTED_FORMATTER, message, exception) || this;\n    }\n    return UnsupportedFormatterError;\n}(IntlError));\nexport { UnsupportedFormatterError };\nvar InvalidConfigError = /** @class */ (function (_super) {\n    __extends(InvalidConfigError, _super);\n    function InvalidConfigError(message, exception) {\n        return _super.call(this, IntlErrorCode.INVALID_CONFIG, message, exception) || this;\n    }\n    return InvalidConfigError;\n}(IntlError));\nexport { InvalidConfigError };\nvar MissingDataError = /** @class */ (function (_super) {\n    __extends(MissingDataError, _super);\n    function MissingDataError(message, exception) {\n        return _super.call(this, IntlErrorCode.MISSING_DATA, message, exception) || this;\n    }\n    return MissingDataError;\n}(IntlError));\nexport { MissingDataError };\nvar IntlFormatError = /** @class */ (function (_super) {\n    __extends(IntlFormatError, _super);\n    function IntlFormatError(message, locale, exception) {\n        return _super.call(this, IntlErrorCode.FORMAT_ERROR, \"\".concat(message, \" \\nLocale: \").concat(locale, \"\\n\"), exception) || this;\n    }\n    return IntlFormatError;\n}(IntlError));\nexport { IntlFormatError };\nvar MessageFormatError = /** @class */ (function (_super) {\n    __extends(MessageFormatError, _super);\n    function MessageFormatError(message, locale, descriptor, exception) {\n        var _this = _super.call(this, \"\".concat(message, \" \\nMessageID: \").concat(descriptor === null || descriptor === void 0 ? void 0 : descriptor.id, \"\\nDefault Message: \").concat(descriptor === null || descriptor === void 0 ? void 0 : descriptor.defaultMessage, \"\\nDescription: \").concat(descriptor === null || descriptor === void 0 ? void 0 : descriptor.description, \" \\n\"), locale, exception) || this;\n        _this.descriptor = descriptor;\n        return _this;\n    }\n    return MessageFormatError;\n}(IntlFormatError));\nexport { MessageFormatError };\nvar MissingTranslationError = /** @class */ (function (_super) {\n    __extends(MissingTranslationError, _super);\n    function MissingTranslationError(descriptor, locale) {\n        var _this = _super.call(this, IntlErrorCode.MISSING_TRANSLATION, \"Missing message: \\\"\".concat(descriptor.id, \"\\\" for locale \\\"\").concat(locale, \"\\\", using \").concat(descriptor.defaultMessage ? 'default message' : 'id', \" as fallback.\")) || this;\n        _this.descriptor = descriptor;\n        return _this;\n    }\n    return MissingTranslationError;\n}(IntlError));\nexport { MissingTranslationError };\n","import { __assign, __spreadArray } from \"tslib\";\nimport { IntlMessageFormat } from 'intl-messageformat';\nimport memoize, { strategies } from '@formatjs/fast-memoize';\nimport { UnsupportedFormatterError } from './error';\nexport function filterProps(props, allowlist, defaults) {\n    if (defaults === void 0) { defaults = {}; }\n    return allowlist.reduce(function (filtered, name) {\n        if (name in props) {\n            filtered[name] = props[name];\n        }\n        else if (name in defaults) {\n            filtered[name] = defaults[name];\n        }\n        return filtered;\n    }, {});\n}\nvar defaultErrorHandler = function (error) {\n    // @ts-ignore just so we don't need to declare dep on @types/node\n    if (process.env.NODE_ENV !== 'production') {\n        console.error(error);\n    }\n};\nexport var DEFAULT_INTL_CONFIG = {\n    formats: {},\n    messages: {},\n    timeZone: undefined,\n    defaultLocale: 'en',\n    defaultFormats: {},\n    fallbackOnEmptyString: true,\n    onError: defaultErrorHandler,\n};\nexport function createIntlCache() {\n    return {\n        dateTime: {},\n        number: {},\n        message: {},\n        relativeTime: {},\n        pluralRules: {},\n        list: {},\n        displayNames: {},\n    };\n}\nfunction createFastMemoizeCache(store) {\n    return {\n        create: function () {\n            return {\n                get: function (key) {\n                    return store[key];\n                },\n                set: function (key, value) {\n                    store[key] = value;\n                },\n            };\n        },\n    };\n}\n/**\n * Create intl formatters and populate cache\n * @param cache explicit cache to prevent leaking memory\n */\nexport function createFormatters(cache) {\n    if (cache === void 0) { cache = createIntlCache(); }\n    var RelativeTimeFormat = Intl.RelativeTimeFormat;\n    var ListFormat = Intl.ListFormat;\n    var DisplayNames = Intl.DisplayNames;\n    var getDateTimeFormat = memoize(function () {\n        var _a;\n        var args = [];\n        for (var _i = 0; _i < arguments.length; _i++) {\n            args[_i] = arguments[_i];\n        }\n        return new ((_a = Intl.DateTimeFormat).bind.apply(_a, __spreadArray([void 0], args, false)))();\n    }, {\n        cache: createFastMemoizeCache(cache.dateTime),\n        strategy: strategies.variadic,\n    });\n    var getNumberFormat = memoize(function () {\n        var _a;\n        var args = [];\n        for (var _i = 0; _i < arguments.length; _i++) {\n            args[_i] = arguments[_i];\n        }\n        return new ((_a = Intl.NumberFormat).bind.apply(_a, __spreadArray([void 0], args, false)))();\n    }, {\n        cache: createFastMemoizeCache(cache.number),\n        strategy: strategies.variadic,\n    });\n    var getPluralRules = memoize(function () {\n        var _a;\n        var args = [];\n        for (var _i = 0; _i < arguments.length; _i++) {\n            args[_i] = arguments[_i];\n        }\n        return new ((_a = Intl.PluralRules).bind.apply(_a, __spreadArray([void 0], args, false)))();\n    }, {\n        cache: createFastMemoizeCache(cache.pluralRules),\n        strategy: strategies.variadic,\n    });\n    return {\n        getDateTimeFormat: getDateTimeFormat,\n        getNumberFormat: getNumberFormat,\n        getMessageFormat: memoize(function (message, locales, overrideFormats, opts) {\n            return new IntlMessageFormat(message, locales, overrideFormats, __assign({ formatters: {\n                    getNumberFormat: getNumberFormat,\n                    getDateTimeFormat: getDateTimeFormat,\n                    getPluralRules: getPluralRules,\n                } }, (opts || {})));\n        }, {\n            cache: createFastMemoizeCache(cache.message),\n            strategy: strategies.variadic,\n        }),\n        getRelativeTimeFormat: memoize(function () {\n            var args = [];\n            for (var _i = 0; _i < arguments.length; _i++) {\n                args[_i] = arguments[_i];\n            }\n            return new (RelativeTimeFormat.bind.apply(RelativeTimeFormat, __spreadArray([void 0], args, false)))();\n        }, {\n            cache: createFastMemoizeCache(cache.relativeTime),\n            strategy: strategies.variadic,\n        }),\n        getPluralRules: getPluralRules,\n        getListFormat: memoize(function () {\n            var args = [];\n            for (var _i = 0; _i < arguments.length; _i++) {\n                args[_i] = arguments[_i];\n            }\n            return new (ListFormat.bind.apply(ListFormat, __spreadArray([void 0], args, false)))();\n        }, {\n            cache: createFastMemoizeCache(cache.list),\n            strategy: strategies.variadic,\n        }),\n        getDisplayNames: memoize(function () {\n            var args = [];\n            for (var _i = 0; _i < arguments.length; _i++) {\n                args[_i] = arguments[_i];\n            }\n            return new (DisplayNames.bind.apply(DisplayNames, __spreadArray([void 0], args, false)))();\n        }, {\n            cache: createFastMemoizeCache(cache.displayNames),\n            strategy: strategies.variadic,\n        }),\n    };\n}\nexport function getNamedFormat(formats, type, name, onError) {\n    var formatType = formats && formats[type];\n    var format;\n    if (formatType) {\n        format = formatType[name];\n    }\n    if (format) {\n        return format;\n    }\n    onError(new UnsupportedFormatterError(\"No \".concat(type, \" format named: \").concat(name)));\n}\n","import { __assign } from \"tslib\";\nimport { invariant } from '@formatjs/ecma402-abstract';\nimport { IntlMessageFormat, } from 'intl-messageformat';\nimport { MissingTranslationError, MessageFormatError } from './error';\nimport { TYPE } from '@formatjs/icu-messageformat-parser';\nfunction setTimeZoneInOptions(opts, timeZone) {\n    return Object.keys(opts).reduce(function (all, k) {\n        all[k] = __assign({ timeZone: timeZone }, opts[k]);\n        return all;\n    }, {});\n}\nfunction deepMergeOptions(opts1, opts2) {\n    var keys = Object.keys(__assign(__assign({}, opts1), opts2));\n    return keys.reduce(function (all, k) {\n        all[k] = __assign(__assign({}, (opts1[k] || {})), (opts2[k] || {}));\n        return all;\n    }, {});\n}\nfunction deepMergeFormatsAndSetTimeZone(f1, timeZone) {\n    if (!timeZone) {\n        return f1;\n    }\n    var mfFormats = IntlMessageFormat.formats;\n    return __assign(__assign(__assign({}, mfFormats), f1), { date: deepMergeOptions(setTimeZoneInOptions(mfFormats.date, timeZone), setTimeZoneInOptions(f1.date || {}, timeZone)), time: deepMergeOptions(setTimeZoneInOptions(mfFormats.time, timeZone), setTimeZoneInOptions(f1.time || {}, timeZone)) });\n}\nexport function formatMessage(_a, state, messageDescriptor, values, opts) {\n    var locale = _a.locale, formats = _a.formats, messages = _a.messages, defaultLocale = _a.defaultLocale, defaultFormats = _a.defaultFormats, fallbackOnEmptyString = _a.fallbackOnEmptyString, onError = _a.onError, timeZone = _a.timeZone, defaultRichTextElements = _a.defaultRichTextElements;\n    if (messageDescriptor === void 0) { messageDescriptor = { id: '' }; }\n    var msgId = messageDescriptor.id, defaultMessage = messageDescriptor.defaultMessage;\n    // `id` is a required field of a Message Descriptor.\n    invariant(!!msgId, \"[@formatjs/intl] An `id` must be provided to format a message. You can either:\\n1. Configure your build toolchain with [babel-plugin-formatjs](https://formatjs.io/docs/tooling/babel-plugin)\\nor [@formatjs/ts-transformer](https://formatjs.io/docs/tooling/ts-transformer) OR\\n2. Configure your `eslint` config to include [eslint-plugin-formatjs](https://formatjs.io/docs/tooling/linter#enforce-id)\\nto autofix this issue\");\n    var id = String(msgId);\n    var message = \n    // In case messages is Object.create(null)\n    // e.g import('foo.json') from webpack)\n    // See https://github.com/formatjs/formatjs/issues/1914\n    messages &&\n        Object.prototype.hasOwnProperty.call(messages, id) &&\n        messages[id];\n    // IMPORTANT: Hot path if `message` is AST with a single literal node\n    if (Array.isArray(message) &&\n        message.length === 1 &&\n        message[0].type === TYPE.literal) {\n        return message[0].value;\n    }\n    // IMPORTANT: Hot path straight lookup for performance\n    if (!values &&\n        message &&\n        typeof message === 'string' &&\n        !defaultRichTextElements) {\n        return message.replace(/'\\{(.*?)\\}'/gi, \"{$1}\");\n    }\n    values = __assign(__assign({}, defaultRichTextElements), (values || {}));\n    formats = deepMergeFormatsAndSetTimeZone(formats, timeZone);\n    defaultFormats = deepMergeFormatsAndSetTimeZone(defaultFormats, timeZone);\n    if (!message) {\n        if (fallbackOnEmptyString === false && message === '') {\n            return message;\n        }\n        if (!defaultMessage ||\n            (locale && locale.toLowerCase() !== defaultLocale.toLowerCase())) {\n            // This prevents warnings from littering the console in development\n            // when no `messages` are passed into the <IntlProvider> for the\n            // default locale.\n            onError(new MissingTranslationError(messageDescriptor, locale));\n        }\n        if (defaultMessage) {\n            try {\n                var formatter = state.getMessageFormat(defaultMessage, defaultLocale, defaultFormats, opts);\n                return formatter.format(values);\n            }\n            catch (e) {\n                onError(new MessageFormatError(\"Error formatting default message for: \\\"\".concat(id, \"\\\", rendering default message verbatim\"), locale, messageDescriptor, e));\n                return typeof defaultMessage === 'string' ? defaultMessage : id;\n            }\n        }\n        return id;\n    }\n    // We have the translated message\n    try {\n        var formatter = state.getMessageFormat(message, locale, formats, __assign({ formatters: state }, (opts || {})));\n        return formatter.format(values);\n    }\n    catch (e) {\n        onError(new MessageFormatError(\"Error formatting message: \\\"\".concat(id, \"\\\", using \").concat(defaultMessage ? 'default message' : 'id', \" as fallback.\"), locale, messageDescriptor, e));\n    }\n    if (defaultMessage) {\n        try {\n            var formatter = state.getMessageFormat(defaultMessage, defaultLocale, defaultFormats, opts);\n            return formatter.format(values);\n        }\n        catch (e) {\n            onError(new MessageFormatError(\"Error formatting the default message for: \\\"\".concat(id, \"\\\", rendering message verbatim\"), locale, messageDescriptor, e));\n        }\n    }\n    if (typeof message === 'string') {\n        return message;\n    }\n    if (typeof defaultMessage === 'string') {\n        return defaultMessage;\n    }\n    return id;\n}\n","import { __assign } from \"tslib\";\nimport { filterProps, getNamedFormat } from './utils';\nimport { IntlError, IntlErrorCode } from './error';\nvar DATE_TIME_FORMAT_OPTIONS = [\n    'localeMatcher',\n    'formatMatcher',\n    'timeZone',\n    'hour12',\n    'weekday',\n    'era',\n    'year',\n    'month',\n    'day',\n    'hour',\n    'minute',\n    'second',\n    'timeZoneName',\n    'hourCycle',\n    'dateStyle',\n    'timeStyle',\n    'calendar',\n    // 'dayPeriod',\n    'numberingSystem',\n];\nexport function getFormatter(_a, type, getDateTimeFormat, options) {\n    var locale = _a.locale, formats = _a.formats, onError = _a.onError, timeZone = _a.timeZone;\n    if (options === void 0) { options = {}; }\n    var format = options.format;\n    var defaults = __assign(__assign({}, (timeZone && { timeZone: timeZone })), (format && getNamedFormat(formats, type, format, onError)));\n    var filteredOptions = filterProps(options, DATE_TIME_FORMAT_OPTIONS, defaults);\n    if (type === 'time' &&\n        !filteredOptions.hour &&\n        !filteredOptions.minute &&\n        !filteredOptions.second &&\n        !filteredOptions.timeStyle &&\n        !filteredOptions.dateStyle) {\n        // Add default formatting options if hour, minute, or second isn't defined.\n        filteredOptions = __assign(__assign({}, filteredOptions), { hour: 'numeric', minute: 'numeric' });\n    }\n    return getDateTimeFormat(locale, filteredOptions);\n}\nexport function formatDate(config, getDateTimeFormat) {\n    var _a = [];\n    for (var _i = 2; _i < arguments.length; _i++) {\n        _a[_i - 2] = arguments[_i];\n    }\n    var value = _a[0], _b = _a[1], options = _b === void 0 ? {} : _b;\n    var date = typeof value === 'string' ? new Date(value || 0) : value;\n    try {\n        return getFormatter(config, 'date', getDateTimeFormat, options).format(date);\n    }\n    catch (e) {\n        config.onError(new IntlError(IntlErrorCode.FORMAT_ERROR, 'Error formatting date.', e));\n    }\n    return String(date);\n}\nexport function formatTime(config, getDateTimeFormat) {\n    var _a = [];\n    for (var _i = 2; _i < arguments.length; _i++) {\n        _a[_i - 2] = arguments[_i];\n    }\n    var value = _a[0], _b = _a[1], options = _b === void 0 ? {} : _b;\n    var date = typeof value === 'string' ? new Date(value || 0) : value;\n    try {\n        return getFormatter(config, 'time', getDateTimeFormat, options).format(date);\n    }\n    catch (e) {\n        config.onError(new IntlError(IntlErrorCode.FORMAT_ERROR, 'Error formatting time.', e));\n    }\n    return String(date);\n}\nexport function formatDateTimeRange(config, getDateTimeFormat) {\n    var _a = [];\n    for (var _i = 2; _i < arguments.length; _i++) {\n        _a[_i - 2] = arguments[_i];\n    }\n    var from = _a[0], to = _a[1], _b = _a[2], options = _b === void 0 ? {} : _b;\n    var timeZone = config.timeZone, locale = config.locale, onError = config.onError;\n    var filteredOptions = filterProps(options, DATE_TIME_FORMAT_OPTIONS, timeZone ? { timeZone: timeZone } : {});\n    try {\n        return getDateTimeFormat(locale, filteredOptions).formatRange(from, to);\n    }\n    catch (e) {\n        onError(new IntlError(IntlErrorCode.FORMAT_ERROR, 'Error formatting date time range.', e));\n    }\n    return String(from);\n}\nexport function formatDateToParts(config, getDateTimeFormat) {\n    var _a = [];\n    for (var _i = 2; _i < arguments.length; _i++) {\n        _a[_i - 2] = arguments[_i];\n    }\n    var value = _a[0], _b = _a[1], options = _b === void 0 ? {} : _b;\n    var date = typeof value === 'string' ? new Date(value || 0) : value;\n    try {\n        return getFormatter(config, 'date', getDateTimeFormat, options).formatToParts(date);\n    }\n    catch (e) {\n        config.onError(new IntlError(IntlErrorCode.FORMAT_ERROR, 'Error formatting date.', e));\n    }\n    return [];\n}\nexport function formatTimeToParts(config, getDateTimeFormat) {\n    var _a = [];\n    for (var _i = 2; _i < arguments.length; _i++) {\n        _a[_i - 2] = arguments[_i];\n    }\n    var value = _a[0], _b = _a[1], options = _b === void 0 ? {} : _b;\n    var date = typeof value === 'string' ? new Date(value || 0) : value;\n    try {\n        return getFormatter(config, 'time', getDateTimeFormat, options).formatToParts(date);\n    }\n    catch (e) {\n        config.onError(new IntlError(IntlErrorCode.FORMAT_ERROR, 'Error formatting time.', e));\n    }\n    return [];\n}\n","import { filterProps } from './utils';\nimport { FormatError, ErrorCode } from 'intl-messageformat';\nimport { IntlErrorCode, IntlError } from './error';\nvar DISPLAY_NAMES_OPTONS = [\n    'localeMatcher',\n    'style',\n    'type',\n    'fallback',\n];\nexport function formatDisplayName(_a, getDisplayNames, value, options) {\n    var locale = _a.locale, onError = _a.onError;\n    var DisplayNames = Intl.DisplayNames;\n    if (!DisplayNames) {\n        onError(new FormatError(\"Intl.DisplayNames is not available in this environment.\\nTry polyfilling it using \\\"@formatjs/intl-displaynames\\\"\\n\", ErrorCode.MISSING_INTL_API));\n    }\n    var filteredOptions = filterProps(options, DISPLAY_NAMES_OPTONS);\n    try {\n        return getDisplayNames(locale, filteredOptions).of(value);\n    }\n    catch (e) {\n        onError(new IntlError(IntlErrorCode.FORMAT_ERROR, 'Error formatting display name.', e));\n    }\n}\n","import { __assign } from \"tslib\";\nimport { filterProps } from './utils';\nimport { FormatError, ErrorCode } from 'intl-messageformat';\nimport { IntlError, IntlErrorCode } from './error';\nvar LIST_FORMAT_OPTIONS = [\n    'localeMatcher',\n    'type',\n    'style',\n];\nvar now = Date.now();\nfunction generateToken(i) {\n    return \"\".concat(now, \"_\").concat(i, \"_\").concat(now);\n}\nexport function formatList(opts, getListFormat, values, options) {\n    if (options === void 0) { options = {}; }\n    var results = formatListToParts(opts, getListFormat, values, options).reduce(function (all, el) {\n        var val = el.value;\n        if (typeof val !== 'string') {\n            all.push(val);\n        }\n        else if (typeof all[all.length - 1] === 'string') {\n            all[all.length - 1] += val;\n        }\n        else {\n            all.push(val);\n        }\n        return all;\n    }, []);\n    return results.length === 1 ? results[0] : results;\n}\nexport function formatListToParts(_a, getListFormat, values, options) {\n    var locale = _a.locale, onError = _a.onError;\n    if (options === void 0) { options = {}; }\n    var ListFormat = Intl.ListFormat;\n    if (!ListFormat) {\n        onError(new FormatError(\"Intl.ListFormat is not available in this environment.\\nTry polyfilling it using \\\"@formatjs/intl-listformat\\\"\\n\", ErrorCode.MISSING_INTL_API));\n    }\n    var filteredOptions = filterProps(options, LIST_FORMAT_OPTIONS);\n    try {\n        var richValues_1 = {};\n        var serializedValues = values.map(function (v, i) {\n            if (typeof v === 'object') {\n                var id = generateToken(i);\n                richValues_1[id] = v;\n                return id;\n            }\n            return String(v);\n        });\n        return getListFormat(locale, filteredOptions)\n            .formatToParts(serializedValues)\n            .map(function (part) {\n            return part.type === 'literal'\n                ? part\n                : __assign(__assign({}, part), { value: richValues_1[part.value] || part.value });\n        });\n    }\n    catch (e) {\n        onError(new IntlError(IntlErrorCode.FORMAT_ERROR, 'Error formatting list.', e));\n    }\n    // @ts-ignore\n    return values;\n}\n","import { filterProps } from './utils';\nimport { IntlFormatError } from './error';\nimport { ErrorCode, FormatError } from 'intl-messageformat';\nvar PLURAL_FORMAT_OPTIONS = [\n    'localeMatcher',\n    'type',\n];\nexport function formatPlural(_a, getPluralRules, value, options) {\n    var locale = _a.locale, onError = _a.onError;\n    if (options === void 0) { options = {}; }\n    if (!Intl.PluralRules) {\n        onError(new FormatError(\"Intl.PluralRules is not available in this environment.\\nTry polyfilling it using \\\"@formatjs/intl-pluralrules\\\"\\n\", ErrorCode.MISSING_INTL_API));\n    }\n    var filteredOptions = filterProps(options, PLURAL_FORMAT_OPTIONS);\n    try {\n        return getPluralRules(locale, filteredOptions).select(value);\n    }\n    catch (e) {\n        onError(new IntlFormatError('Error formatting plural.', locale, e));\n    }\n    return 'other';\n}\n","import { getNamedFormat, filterProps } from './utils';\nimport { FormatError, ErrorCode } from 'intl-messageformat';\nimport { IntlFormatError } from './error';\nvar RELATIVE_TIME_FORMAT_OPTIONS = ['numeric', 'style'];\nfunction getFormatter(_a, getRelativeTimeFormat, options) {\n    var locale = _a.locale, formats = _a.formats, onError = _a.onError;\n    if (options === void 0) { options = {}; }\n    var format = options.format;\n    var defaults = (!!format && getNamedFormat(formats, 'relative', format, onError)) || {};\n    var filteredOptions = filterProps(options, RELATIVE_TIME_FORMAT_OPTIONS, defaults);\n    return getRelativeTimeFormat(locale, filteredOptions);\n}\nexport function formatRelativeTime(config, getRelativeTimeFormat, value, unit, options) {\n    if (options === void 0) { options = {}; }\n    if (!unit) {\n        unit = 'second';\n    }\n    var RelativeTimeFormat = Intl.RelativeTimeFormat;\n    if (!RelativeTimeFormat) {\n        config.onError(new FormatError(\"Intl.RelativeTimeFormat is not available in this environment.\\nTry polyfilling it using \\\"@formatjs/intl-relativetimeformat\\\"\\n\", ErrorCode.MISSING_INTL_API));\n    }\n    try {\n        return getFormatter(config, getRelativeTimeFormat, options).format(value, unit);\n    }\n    catch (e) {\n        config.onError(new IntlFormatError('Error formatting relative time.', config.locale, e));\n    }\n    return String(value);\n}\n","import { getNamedFormat, filterProps } from './utils';\nimport { IntlError, IntlErrorCode } from './error';\nvar NUMBER_FORMAT_OPTIONS = [\n    'localeMatcher',\n    'style',\n    'currency',\n    'currencyDisplay',\n    'unit',\n    'unitDisplay',\n    'useGrouping',\n    'minimumIntegerDigits',\n    'minimumFractionDigits',\n    'maximumFractionDigits',\n    'minimumSignificantDigits',\n    'maximumSignificantDigits',\n    // ES2020 NumberFormat\n    'compactDisplay',\n    'currencyDisplay',\n    'currencySign',\n    'notation',\n    'signDisplay',\n    'unit',\n    'unitDisplay',\n    'numberingSystem',\n];\nexport function getFormatter(_a, getNumberFormat, options) {\n    var locale = _a.locale, formats = _a.formats, onError = _a.onError;\n    if (options === void 0) { options = {}; }\n    var format = options.format;\n    var defaults = ((format &&\n        getNamedFormat(formats, 'number', format, onError)) ||\n        {});\n    var filteredOptions = filterProps(options, NUMBER_FORMAT_OPTIONS, defaults);\n    return getNumberFormat(locale, filteredOptions);\n}\nexport function formatNumber(config, getNumberFormat, value, options) {\n    if (options === void 0) { options = {}; }\n    try {\n        return getFormatter(config, getNumberFormat, options).format(value);\n    }\n    catch (e) {\n        config.onError(new IntlError(IntlErrorCode.FORMAT_ERROR, 'Error formatting number.', e));\n    }\n    return String(value);\n}\nexport function formatNumberToParts(config, getNumberFormat, value, options) {\n    if (options === void 0) { options = {}; }\n    try {\n        return getFormatter(config, getNumberFormat, options).formatToParts(value);\n    }\n    catch (e) {\n        config.onError(new IntlError(IntlErrorCode.FORMAT_ERROR, 'Error formatting number.', e));\n    }\n    return [];\n}\n","import { __assign } from \"tslib\";\nimport { createFormatters, DEFAULT_INTL_CONFIG } from './utils';\nimport { InvalidConfigError, MissingDataError } from './error';\nimport { formatNumber, formatNumberToParts } from './number';\nimport { formatRelativeTime } from './relativeTime';\nimport { formatDate, formatDateToParts, formatTime, formatTimeToParts, formatDateTimeRange, } from './dateTime';\nimport { formatPlural } from './plural';\nimport { formatMessage } from './message';\nimport { formatList, formatListToParts } from './list';\nimport { formatDisplayName } from './displayName';\nfunction messagesContainString(messages) {\n    var firstMessage = messages ? messages[Object.keys(messages)[0]] : undefined;\n    return typeof firstMessage === 'string';\n}\nfunction verifyConfigMessages(config) {\n    if (config.defaultRichTextElements &&\n        messagesContainString(config.messages || {})) {\n        console.warn(\"[@formatjs/intl] \\\"defaultRichTextElements\\\" was specified but \\\"message\\\" was not pre-compiled. \\nPlease consider using \\\"@formatjs/cli\\\" to pre-compile your messages for performance.\\nFor more details see https://formatjs.io/docs/getting-started/message-distribution\");\n    }\n}\n/**\n * Create intl object\n * @param config intl config\n * @param cache cache for formatter instances to prevent memory leak\n */\nexport function createIntl(config, cache) {\n    var formatters = createFormatters(cache);\n    var resolvedConfig = __assign(__assign({}, DEFAULT_INTL_CONFIG), config);\n    var locale = resolvedConfig.locale, defaultLocale = resolvedConfig.defaultLocale, onError = resolvedConfig.onError;\n    if (!locale) {\n        if (onError) {\n            onError(new InvalidConfigError(\"\\\"locale\\\" was not configured, using \\\"\".concat(defaultLocale, \"\\\" as fallback. See https://formatjs.io/docs/react-intl/api#intlshape for more details\")));\n        }\n        // Since there's no registered locale data for `locale`, this will\n        // fallback to the `defaultLocale` to make sure things can render.\n        // The `messages` are overridden to the `defaultProps` empty object\n        // to maintain referential equality across re-renders. It's assumed\n        // each <FormattedMessage> contains a `defaultMessage` prop.\n        resolvedConfig.locale = resolvedConfig.defaultLocale || 'en';\n    }\n    else if (!Intl.NumberFormat.supportedLocalesOf(locale).length && onError) {\n        onError(new MissingDataError(\"Missing locale data for locale: \\\"\".concat(locale, \"\\\" in Intl.NumberFormat. Using default locale: \\\"\").concat(defaultLocale, \"\\\" as fallback. See https://formatjs.io/docs/react-intl#runtime-requirements for more details\")));\n    }\n    else if (!Intl.DateTimeFormat.supportedLocalesOf(locale).length &&\n        onError) {\n        onError(new MissingDataError(\"Missing locale data for locale: \\\"\".concat(locale, \"\\\" in Intl.DateTimeFormat. Using default locale: \\\"\").concat(defaultLocale, \"\\\" as fallback. See https://formatjs.io/docs/react-intl#runtime-requirements for more details\")));\n    }\n    verifyConfigMessages(resolvedConfig);\n    return __assign(__assign({}, resolvedConfig), { formatters: formatters, formatNumber: formatNumber.bind(null, resolvedConfig, formatters.getNumberFormat), formatNumberToParts: formatNumberToParts.bind(null, resolvedConfig, formatters.getNumberFormat), formatRelativeTime: formatRelativeTime.bind(null, resolvedConfig, formatters.getRelativeTimeFormat), formatDate: formatDate.bind(null, resolvedConfig, formatters.getDateTimeFormat), formatDateToParts: formatDateToParts.bind(null, resolvedConfig, formatters.getDateTimeFormat), formatTime: formatTime.bind(null, resolvedConfig, formatters.getDateTimeFormat), formatDateTimeRange: formatDateTimeRange.bind(null, resolvedConfig, formatters.getDateTimeFormat), formatTimeToParts: formatTimeToParts.bind(null, resolvedConfig, formatters.getDateTimeFormat), formatPlural: formatPlural.bind(null, resolvedConfig, formatters.getPluralRules), formatMessage: formatMessage.bind(null, resolvedConfig, formatters), formatList: formatList.bind(null, resolvedConfig, formatters.getListFormat), formatListToParts: formatListToParts.bind(null, resolvedConfig, formatters.getListFormat), formatDisplayName: formatDisplayName.bind(null, resolvedConfig, formatters.getDisplayNames) });\n}\n","import { __assign } from \"tslib\";\nimport * as React from 'react';\nimport { invariant } from '@formatjs/ecma402-abstract';\nimport { DEFAULT_INTL_CONFIG as CORE_DEFAULT_INTL_CONFIG } from '@formatjs/intl';\nexport function invariantIntlContext(intl) {\n    invariant(intl, '[React Intl] Could not find required `intl` object. ' +\n        '<IntlProvider> needs to exist in the component ancestry.');\n}\nexport var DEFAULT_INTL_CONFIG = __assign(__assign({}, CORE_DEFAULT_INTL_CONFIG), { textComponent: React.Fragment });\n/**\n * Takes a `formatXMLElementFn`, and composes it in function, which passes\n * argument `parts` through, assigning unique key to each part, to prevent\n * \"Each child in a list should have a unique \"key\"\" React error.\n * @param formatXMLElementFn\n */\nexport function assignUniqueKeysToParts(formatXMLElementFn) {\n    return function (parts) {\n        // eslint-disable-next-line prefer-rest-params\n        return formatXMLElementFn(React.Children.toArray(parts));\n    };\n}\nexport function shallowEqual(objA, objB) {\n    if (objA === objB) {\n        return true;\n    }\n    if (!objA || !objB) {\n        return false;\n    }\n    var aKeys = Object.keys(objA);\n    var bKeys = Object.keys(objB);\n    var len = aKeys.length;\n    if (bKeys.length !== len) {\n        return false;\n    }\n    for (var i = 0; i < len; i++) {\n        var key = aKeys[i];\n        if (objA[key] !== objB[key] ||\n            !Object.prototype.hasOwnProperty.call(objB, key)) {\n            return false;\n        }\n    }\n    return true;\n}\n","import { __assign } from \"tslib\";\nimport * as React from 'react';\nimport hoistNonReactStatics from 'hoist-non-react-statics';\nimport { invariantIntlContext } from '../utils';\nfunction getDisplayName(Component) {\n    return Component.displayName || Component.name || 'Component';\n}\n// TODO: We should provide initial value here\nvar IntlContext = React.createContext(null);\nvar IntlConsumer = IntlContext.Consumer, IntlProvider = IntlContext.Provider;\nexport var Provider = IntlProvider;\nexport var Context = IntlContext;\nexport default function injectIntl(WrappedComponent, options) {\n    var _a = options || {}, _b = _a.intlPropName, intlPropName = _b === void 0 ? 'intl' : _b, _c = _a.forwardRef, forwardRef = _c === void 0 ? false : _c, _d = _a.enforceContext, enforceContext = _d === void 0 ? true : _d;\n    var WithIntl = function (props) { return (React.createElement(IntlConsumer, null, function (intl) {\n        var _a;\n        if (enforceContext) {\n            invariantIntlContext(intl);\n        }\n        var intlProp = (_a = {}, _a[intlPropName] = intl, _a);\n        return (React.createElement(WrappedComponent, __assign({}, props, intlProp, { ref: forwardRef ? props.forwardedRef : null })));\n    })); };\n    WithIntl.displayName = \"injectIntl(\".concat(getDisplayName(WrappedComponent), \")\");\n    WithIntl.WrappedComponent = WrappedComponent;\n    if (forwardRef) {\n        return hoistNonReactStatics(React.forwardRef(function (props, ref) { return (React.createElement(WithIntl, __assign({}, props, { forwardedRef: ref }))); }), WrappedComponent);\n    }\n    return hoistNonReactStatics(WithIntl, WrappedComponent);\n}\n","import * as React from 'react';\nimport { Context } from './injectIntl';\nimport { invariantIntlContext } from '../utils';\nexport default function useIntl() {\n    var intl = React.useContext(Context);\n    invariantIntlContext(intl);\n    return intl;\n}\n","/*\n * Copyright 2015, Yahoo Inc.\n * Copyrights licensed under the New BSD License.\n * See the accompanying LICENSE file for terms.\n */\nimport { __assign, __extends, __rest, __spreadArray } from \"tslib\";\nimport * as React from 'react';\nimport { Provider } from './injectIntl';\nimport { DEFAULT_INTL_CONFIG, invariantIntlContext, assignUniqueKeysToParts, shallowEqual, } from '../utils';\nimport { formatMessage as coreFormatMessage, createIntl as coreCreateIntl, createIntlCache, } from '@formatjs/intl';\nimport { isFormatXMLElementFn, } from 'intl-messageformat';\nfunction processIntlConfig(config) {\n    return {\n        locale: config.locale,\n        timeZone: config.timeZone,\n        fallbackOnEmptyString: config.fallbackOnEmptyString,\n        formats: config.formats,\n        textComponent: config.textComponent,\n        messages: config.messages,\n        defaultLocale: config.defaultLocale,\n        defaultFormats: config.defaultFormats,\n        onError: config.onError,\n        wrapRichTextChunksInFragment: config.wrapRichTextChunksInFragment,\n        defaultRichTextElements: config.defaultRichTextElements,\n    };\n}\nfunction assignUniqueKeysToFormatXMLElementFnArgument(values) {\n    if (!values) {\n        return values;\n    }\n    return Object.keys(values).reduce(function (acc, k) {\n        var v = values[k];\n        acc[k] = isFormatXMLElementFn(v)\n            ? assignUniqueKeysToParts(v)\n            : v;\n        return acc;\n    }, {});\n}\nvar formatMessage = function (config, formatters, descriptor, rawValues) {\n    var rest = [];\n    for (var _i = 4; _i < arguments.length; _i++) {\n        rest[_i - 4] = arguments[_i];\n    }\n    var values = assignUniqueKeysToFormatXMLElementFnArgument(rawValues);\n    var chunks = coreFormatMessage.apply(void 0, __spreadArray([config,\n        formatters,\n        descriptor,\n        values], rest, false));\n    if (Array.isArray(chunks)) {\n        return React.Children.toArray(chunks);\n    }\n    return chunks;\n};\n/**\n * Create intl object\n * @param config intl config\n * @param cache cache for formatter instances to prevent memory leak\n */\nexport var createIntl = function (_a, cache) {\n    var rawDefaultRichTextElements = _a.defaultRichTextElements, config = __rest(_a, [\"defaultRichTextElements\"]);\n    var defaultRichTextElements = assignUniqueKeysToFormatXMLElementFnArgument(rawDefaultRichTextElements);\n    var coreIntl = coreCreateIntl(__assign(__assign(__assign({}, DEFAULT_INTL_CONFIG), config), { defaultRichTextElements: defaultRichTextElements }), cache);\n    return __assign(__assign({}, coreIntl), { formatMessage: formatMessage.bind(null, {\n            locale: coreIntl.locale,\n            timeZone: coreIntl.timeZone,\n            fallbackOnEmptyString: coreIntl.fallbackOnEmptyString,\n            formats: coreIntl.formats,\n            defaultLocale: coreIntl.defaultLocale,\n            defaultFormats: coreIntl.defaultFormats,\n            messages: coreIntl.messages,\n            onError: coreIntl.onError,\n            defaultRichTextElements: defaultRichTextElements,\n        }, coreIntl.formatters) });\n};\nvar IntlProvider = /** @class */ (function (_super) {\n    __extends(IntlProvider, _super);\n    function IntlProvider() {\n        var _this = _super !== null && _super.apply(this, arguments) || this;\n        _this.cache = createIntlCache();\n        _this.state = {\n            cache: _this.cache,\n            intl: createIntl(processIntlConfig(_this.props), _this.cache),\n            prevConfig: processIntlConfig(_this.props),\n        };\n        return _this;\n    }\n    IntlProvider.getDerivedStateFromProps = function (props, _a) {\n        var prevConfig = _a.prevConfig, cache = _a.cache;\n        var config = processIntlConfig(props);\n        if (!shallowEqual(prevConfig, config)) {\n            return {\n                intl: createIntl(config, cache),\n                prevConfig: config,\n            };\n        }\n        return null;\n    };\n    IntlProvider.prototype.render = function () {\n        invariantIntlContext(this.state.intl);\n        return React.createElement(Provider, { value: this.state.intl }, this.props.children);\n    };\n    IntlProvider.displayName = 'IntlProvider';\n    IntlProvider.defaultProps = DEFAULT_INTL_CONFIG;\n    return IntlProvider;\n}(React.PureComponent));\nexport default IntlProvider;\n","/*\n * Copyright 2015, Yahoo Inc.\n * Copyrights licensed under the New BSD License.\n * See the accompanying LICENSE file for terms.\n */\nimport { __rest } from \"tslib\";\nimport * as React from 'react';\nimport useIntl from './useIntl';\nimport { shallowEqual } from '../utils';\nfunction areEqual(prevProps, nextProps) {\n    var values = prevProps.values, otherProps = __rest(prevProps, [\"values\"]);\n    var nextValues = nextProps.values, nextOtherProps = __rest(nextProps, [\"values\"]);\n    return (shallowEqual(nextValues, values) &&\n        shallowEqual(otherProps, nextOtherProps));\n}\nfunction FormattedMessage(props) {\n    var intl = useIntl();\n    var formatMessage = intl.formatMessage, _a = intl.textComponent, Text = _a === void 0 ? React.Fragment : _a;\n    var id = props.id, description = props.description, defaultMessage = props.defaultMessage, values = props.values, children = props.children, _b = props.tagName, Component = _b === void 0 ? Text : _b, ignoreTag = props.ignoreTag;\n    var descriptor = { id: id, description: description, defaultMessage: defaultMessage };\n    var nodes = formatMessage(descriptor, values, {\n        ignoreTag: ignoreTag,\n    });\n    if (typeof children === 'function') {\n        return children(Array.isArray(nodes) ? nodes : [nodes]);\n    }\n    if (Component) {\n        return React.createElement(Component, null, React.Children.toArray(nodes));\n    }\n    return React.createElement(React.Fragment, null, nodes);\n}\nFormattedMessage.displayName = 'FormattedMessage';\nvar MemoizedFormattedMessage = React.memo(FormattedMessage, areEqual);\nMemoizedFormattedMessage.displayName = 'MemoizedFormattedMessage';\nexport default MemoizedFormattedMessage;\n","import { createFormattedComponent, createFormattedDateTimePartsComponent, } from './src/components/createFormattedComponent';\nimport injectIntl, { Provider as RawIntlProvider, Context as IntlContext, } from './src/components/injectIntl';\nimport useIntl from './src/components/useIntl';\nimport IntlProvider, { createIntl } from './src/components/provider';\nimport FormattedRelativeTime from './src/components/relative';\nimport FormattedPlural from './src/components/plural';\nimport FormattedMessage from './src/components/message';\nimport FormattedDateTimeRange from './src/components/dateTimeRange';\nexport { FormattedDateTimeRange, FormattedMessage, FormattedPlural, FormattedRelativeTime, IntlContext, IntlProvider, RawIntlProvider, createIntl, injectIntl, useIntl, };\nexport { createIntlCache, UnsupportedFormatterError, InvalidConfigError, MissingDataError, MessageFormatError, MissingTranslationError, IntlErrorCode as ReactIntlErrorCode, IntlError as ReactIntlError, } from '@formatjs/intl';\nexport function defineMessages(msgs) {\n    return msgs;\n}\nexport function defineMessage(msg) {\n    return msg;\n}\n// IMPORTANT: Explicit here to prevent api-extractor from outputing `import('./src/types').CustomFormatConfig`\nexport var FormattedDate = createFormattedComponent('formatDate');\nexport var FormattedTime = createFormattedComponent('formatTime');\n// @ts-ignore issue w/ TS Intl types\nexport var FormattedNumber = createFormattedComponent('formatNumber');\nexport var FormattedList = createFormattedComponent('formatList');\nexport var FormattedDisplayName = createFormattedComponent('formatDisplayName');\nexport var FormattedDateParts = createFormattedDateTimePartsComponent('formatDate');\nexport var FormattedTimeParts = createFormattedDateTimePartsComponent('formatTime');\nexport { FormattedNumberParts, FormattedListParts, } from './src/components/createFormattedComponent';\n","export enum EditorMode {\n  INLINE = 'inline',\n  OVERLAY = 'overlay',\n}\n","export enum NavPosition {\n  TOP = 'top',\n  BOTTOM = 'bottom',\n  HIDDEN = '',\n}\n\nexport enum MenubarPosition {\n  TOP = 'top',\n  BOTTOM = 'bottom',\n  HIDDEN = '',\n}\n","import {ICircleOptions, IObjectOptions, IRectOptions} from 'fabric/fabric-impl';\n\nexport interface PathOptions extends IObjectOptions {\n  path: string | undefined;\n}\n\nexport interface BasicShape {\n  name: string;\n  type: string;\n  options?: IObjectOptions | IRectOptions | PathOptions | ICircleOptions;\n}\n\nexport const defaultShapes: BasicShape[] = [\n  {\n    name: 'circle',\n    type: 'Circle',\n  },\n  {\n    name: 'square',\n    type: 'Rect',\n    options: {\n      lockUniScaling: false,\n    },\n  },\n  {\n    name: 'triangle',\n    type: 'Triangle',\n  },\n  {\n    name: 'ellipse',\n    type: 'Ellipse',\n    options: {\n      lockUniScaling: false,\n    },\n  },\n  {\n    name: 'Arrow #1',\n    type: 'Path',\n    options: {\n      path: 'M 294.9 16.4 l 15.7 42.2 c -171.4 70.3 -294 242.3 -289.1 437.4 l 14.7 -1 c 9.1 -0.6 18.1 -1.2 27.1 -1.9 l 14.7 -1 c -4.3 -170.1 102.5 -320 252 -381.3 l 15.7 42.2 c 34.7 -40.5 83.1 -76.6 144.8 -99.8 c -58.1 -26.2 -124.9 -39.6 -195.6 -36.8 z',\n    },\n  },\n  {\n    name: 'Arrow #2',\n    type: 'Path',\n    options: {\n      path: 'M 16 248.4 v 14.9 h 447.5 l -93.2 82.5 l 11.9 10.5 l 113.8 -100.2 l -113.6 -100.4 l -11.8 10.5 l 92.9 82.2 z',\n    },\n  },\n  {\n    name: 'Arrow #3',\n    type: 'Path',\n    options: {\n      path: 'M 496 256 l -118.6 -66 v 40.8 h -361.4 v 50.4 h 361.4 v 40.8 l 118.6 -66 z',\n    },\n  },\n  {\n    name: 'Line',\n    type: 'Path',\n    options: {\n      path: 'M 16 256 h 480',\n      strokeWidth: 10,\n      stroke: '#000',\n      padding: 10,\n    },\n  },\n  {\n    name: 'Star',\n    type: 'Path',\n    options: {\n      path: 'M 256 406.3 l 148.3 78 l -28.3 -165.2 l 120 -117 l -165.8 -24.1 l -74.2 -150.3 l -74.2 150.3 l -165.8 24.1 l 120 117 l -28.3 165.2 z',\n    },\n  },\n  {\n    name: 'Polygon',\n    type: 'Path',\n    options: {\n      path: 'M 256 19.6 l 156.6 57.1 l 83.4 144.3 l -28.9 164.2 l -127.7 107.2 h -166.8 l -127.7 -107.2 l -28.9 -164.2 l 83.4 -144.3 z',\n    },\n  },\n  {\n    name: 'Badge',\n    type: 'Path',\n    options: {\n      path: 'M 257.3 16.2 s -148 58.2 -204.4 81.4 c 0 75.7 -16.8 303.5 204.4 398.2 c 218.7 -94.6 201.9 -322.4 201.9 -398.2 c -62.1 -23.6 -201.9 -81.4 -201.9 -81.4 z',\n    },\n  },\n];\n","export const emoticonsList = [\n  'afro-1',\n  'afro',\n  'agent',\n  'alien-1',\n  'alien',\n  'angel',\n  'angry-1',\n  'angry-2',\n  'angry-3',\n  'angry-4',\n  'angry-5',\n  'angry',\n  'arguing',\n  'arrogant',\n  'asian-1',\n  'asian',\n  'avatar',\n  'baby-1',\n  'baby-2',\n  'baby',\n  'bully',\n  'burglar',\n  'businessman',\n  'cheeky-1',\n  'cheeky',\n  'clown',\n  'confused-1',\n  'confused-2',\n  'confused-3',\n  'confused',\n  'creepy',\n  'crying-1',\n  'crying-2',\n  'crying-3',\n  'crying',\n  'dazed-1',\n  'dazed-2',\n  'dazed-3',\n  'dazed',\n  'dead-1',\n  'dead-2',\n  'dead-3',\n  'dead-4',\n  'dead-5',\n  'dead-6',\n  'dead',\n  'desperate-1',\n  'desperate',\n  'detective',\n  'dissapointment',\n  'doctor',\n  'drunk',\n  'dumb',\n  'emo-1',\n  'emo-2',\n  'emo',\n  'emoticon',\n  'evil',\n  'faint-1',\n  'faint',\n  'flirt-1',\n  'flirt-2',\n  'flirt',\n  'flirty',\n  'gangster',\n  'geek-1',\n  'geek',\n  'gentleman-1',\n  'gentleman-2',\n  'gentleman-3',\n  'gentleman-4',\n  'gentleman',\n  'ginger',\n  'girl-1',\n  'girl',\n  'goofy-1',\n  'goofy-2',\n  'goofy-3',\n  'goofy-4',\n  'goofy',\n  'grubby-1',\n  'grubby',\n  'happy-1',\n  'happy-10',\n  'happy-11',\n  'happy-12',\n  'happy-13',\n  'happy-14',\n  'happy-15',\n  'happy-16',\n  'happy-2',\n  'happy-3',\n  'happy-4',\n  'happy-5',\n  'happy-6',\n  'happy-7',\n  'happy-8',\n  'happy-9',\n  'happy',\n  'harry-potter',\n  'heisenberg',\n  'hipster-1',\n  'hipster-2',\n  'hipster',\n  'in-love-1',\n  'in-love-2',\n  'in-love-3',\n  'in-love-4',\n  'in-love-5',\n  'in-love-6',\n  'in-love',\n  'japan',\n  'jew',\n  'joyful-1',\n  'joyful-2',\n  'joyful',\n  'kiss-1',\n  'kiss-2',\n  'kiss-3',\n  'kiss-4',\n  'kiss',\n  'laughing-1',\n  'laughing-2',\n  'laughing-3',\n  'laughing',\n  'listening',\n  'love',\n  'manly',\n  'miserly-1',\n  'miserly',\n  'nerd-1',\n  'nerd-2',\n  'nerd-3',\n  'nerd-4',\n  'nerd',\n  'ninja',\n  'pirate-1',\n  'pirate-2',\n  'pirate',\n  'punk-1',\n  'punk-2',\n  'punk',\n  'rapper',\n  'relieved',\n  'rich-1',\n  'rich-2',\n  'rich',\n  'rockstar',\n  'sad-1',\n  'sad-2',\n  'sad-3',\n  'sad-4',\n  'sad-5',\n  'sad-6',\n  'sad',\n  'scared-1',\n  'scared-2',\n  'scared-3',\n  'scared',\n  'sceptic-1',\n  'sceptic-2',\n  'sceptic-3',\n  'sceptic-4',\n  'sceptic-5',\n  'sceptic-6',\n  'sceptic-7',\n  'sceptic',\n  'secret',\n  'shocked-1',\n  'shocked-2',\n  'shocked-3',\n  'shocked',\n  'sick-1',\n  'sick-2',\n  'sick-3',\n  'sick-4',\n  'sick',\n  'silent',\n  'skeleton',\n  'smile',\n  'smiling-1',\n  'smiling',\n  'smoked',\n  'smug-1',\n  'smug-2',\n  'smug-3',\n  'smug-4',\n  'smug-5',\n  'smug-6',\n  'smug',\n  'sporty',\n  'stunned',\n  'superhero-1',\n  'superhero-2',\n  'superhero-3',\n  'superhero-4',\n  'superhero',\n  'surprised-1',\n  'surprised',\n  'thinking',\n  'tired-1',\n  'tired-2',\n  'tired-3',\n  'tired',\n  'tough-1',\n  'tough',\n  'trendy',\n  'vampire-1',\n  'vampire',\n  'wink-1',\n  'wink-2',\n  'wink',\n  'winking-1',\n  'winking',\n  'yawning-1',\n  'yawning-2',\n  'yawning-3',\n  'yawning',\n  'yelling',\n  'zombie',\n];\n","import {defineMessages, MessageDescriptor} from 'react-intl';\nimport {emoticonsList} from './emoticons';\n\nexport interface StickerCategory {\n  name: string;\n  items?: number;\n  list?: string[];\n  type: 'svg' | 'png';\n  thumbnailUrl?: string;\n  invertPreview?: boolean;\n}\n\nexport const defaultStickers: StickerCategory[] = [\n  {\n    name: 'emoticons',\n    list: emoticonsList,\n    type: 'svg',\n    thumbnailUrl: 'images/stickers/categories/emoticon.svg',\n  },\n  {\n    name: 'doodles',\n    items: 100,\n    type: 'svg',\n    thumbnailUrl: 'images/stickers/categories/doodles.svg',\n  },\n  {\n    name: 'landmarks',\n    items: 100,\n    type: 'svg',\n    thumbnailUrl: 'images/stickers/categories/landmark.svg',\n    invertPreview: true,\n  },\n  {\n    name: 'bubbles',\n    items: 104,\n    type: 'png',\n    thumbnailUrl: 'images/stickers/categories/speech-bubble.svg',\n  },\n  {\n    name: 'transportation',\n    items: 22,\n    type: 'svg',\n    thumbnailUrl: 'images/stickers/categories/transportation.svg',\n    invertPreview: true,\n  },\n  {\n    name: 'beach',\n    items: 22,\n    type: 'svg',\n    thumbnailUrl: 'images/stickers/categories/beach.svg',\n    invertPreview: true,\n  },\n];\n\nexport const StickerCategoryMessages: Record<string, MessageDescriptor> =\n  defineMessages({\n    emoticons: {\n      defaultMessage: 'Emoticons',\n      description: 'Sticker category name',\n    },\n    doodles: {\n      defaultMessage: 'Doodles',\n      description: 'Sticker category name',\n    },\n    landmarks: {\n      defaultMessage: 'Landmarks',\n      description: 'Sticker category name',\n    },\n    bubbles: {\n      defaultMessage: 'Bubbles',\n      description: 'Sticker category name',\n    },\n    transportation: {\n      defaultMessage: 'Transportation',\n      description: 'Sticker category name',\n    },\n    beach: {\n      defaultMessage: 'Beach',\n      description: 'Sticker category name',\n    },\n  });\n","export const defaultObjectProps = {\n  fill: '#1565C0',\n  opacity: 1,\n  backgroundColor: null,\n  strokeWidth: 0.05,\n  stroke: '#000',\n};\n","export const BrushTypes = [\n  'PencilBrush',\n  'SprayBrush',\n  'CircleBrush',\n  'DiamondBrush',\n  'VLineBrush',\n  'HLineBrush',\n  'SquareBrush',\n];\n\nexport const BrushSizes = [1, 8, 15, 20, 25];\n","export enum EditorTheme {\n  DARK = 'dark',\n  LIGHT = 'light',\n}\n","import {EditorTheme} from './editor-theme';\nimport type {PixieTheme} from './default-config';\n\nexport const DEFAULT_THEMES: PixieTheme[] = [\n  {\n    name: EditorTheme.LIGHT,\n    colors: {\n      '--be-foreground-base': '0 0 0',\n      '--be-primary-light': '191 219 254', // 200\n      '--be-primary': '59 130 246', // 500\n      '--be-primary-dark': '37 99 235',\n      '--be-on-primary': '255 255 255',\n      '--be-error': '179 38 30',\n      '--be-on-error': '255 255 255',\n      '--be-background': '255 255 255',\n      '--be-background-alt': '250 250 250',\n      '--be-paper': '255 255 255',\n      '--be-disabled-bg-opacity': '12%',\n      '--be-disabled-fg-opacity': '26%',\n      '--be-hover-opacity': '4%',\n      '--be-focus-opacity': '12%',\n      '--be-selected-opacity': '8%',\n      '--be-text-main-opacity': '87%',\n      '--be-text-muted-opacity': '60%',\n      '--be-divider-opacity': '12%',\n    },\n  },\n  {\n    name: EditorTheme.DARK,\n    isDark: true,\n    colors: {\n      '--be-foreground-base': '255 255 255',\n      '--be-primary-light': '239 246 255', // 50\n      '--be-primary': '191 219 254', // 200\n      '--be-primary-dark': '147 197 253', // 300\n      '--be-on-primary': '56 30 114',\n      '--be-error': '242 184 181',\n      '--be-on-error': '96 20 16',\n      '--be-background': '20 21 23',\n      '--be-background-alt': '26 27 30',\n      '--be-paper': '44 46 51',\n      '--be-disabled-bg-opacity': '12%',\n      '--be-disabled-fg-opacity': '30%',\n      '--be-hover-opacity': '8%',\n      '--be-focus-opacity': '12%',\n      '--be-selected-opacity': '16%',\n      '--be-text-main-opacity': '100%',\n      '--be-text-muted-opacity': '70%',\n      '--be-divider-opacity': '12%',\n    },\n  },\n];\n","export enum ToolName {\n  FILTER = 'filter',\n  RESIZE = 'resize',\n  CROP = 'crop',\n  DRAW = 'draw',\n  TEXT = 'text',\n  SHAPES = 'shapes',\n  STICKERS = 'stickers',\n  FRAME = 'frame',\n  CORNERS = 'corners',\n  MERGE = 'merge',\n}\n","/*\nobject-assign\n(c) Sindre Sorhus\n@license MIT\n*/\n\n'use strict';\n/* eslint-disable no-unused-vars */\nvar getOwnPropertySymbols = Object.getOwnPropertySymbols;\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\nvar propIsEnumerable = Object.prototype.propertyIsEnumerable;\n\nfunction toObject(val) {\n\tif (val === null || val === undefined) {\n\t\tthrow new TypeError('Object.assign cannot be called with null or undefined');\n\t}\n\n\treturn Object(val);\n}\n\nfunction shouldUseNative() {\n\ttry {\n\t\tif (!Object.assign) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// Detect buggy property enumeration order in older V8 versions.\n\n\t\t// https://bugs.chromium.org/p/v8/issues/detail?id=4118\n\t\tvar test1 = new String('abc');  // eslint-disable-line no-new-wrappers\n\t\ttest1[5] = 'de';\n\t\tif (Object.getOwnPropertyNames(test1)[0] === '5') {\n\t\t\treturn false;\n\t\t}\n\n\t\t// https://bugs.chromium.org/p/v8/issues/detail?id=3056\n\t\tvar test2 = {};\n\t\tfor (var i = 0; i < 10; i++) {\n\t\t\ttest2['_' + String.fromCharCode(i)] = i;\n\t\t}\n\t\tvar order2 = Object.getOwnPropertyNames(test2).map(function (n) {\n\t\t\treturn test2[n];\n\t\t});\n\t\tif (order2.join('') !== '0123456789') {\n\t\t\treturn false;\n\t\t}\n\n\t\t// https://bugs.chromium.org/p/v8/issues/detail?id=3056\n\t\tvar test3 = {};\n\t\t'abcdefghijklmnopqrst'.split('').forEach(function (letter) {\n\t\t\ttest3[letter] = letter;\n\t\t});\n\t\tif (Object.keys(Object.assign({}, test3)).join('') !==\n\t\t\t\t'abcdefghijklmnopqrst') {\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t} catch (err) {\n\t\t// We don't expect any of the above to throw, but better to be safe.\n\t\treturn false;\n\t}\n}\n\nmodule.exports = shouldUseNative() ? Object.assign : function (target, source) {\n\tvar from;\n\tvar to = toObject(target);\n\tvar symbols;\n\n\tfor (var s = 1; s < arguments.length; s++) {\n\t\tfrom = Object(arguments[s]);\n\n\t\tfor (var key in from) {\n\t\t\tif (hasOwnProperty.call(from, key)) {\n\t\t\t\tto[key] = from[key];\n\t\t\t}\n\t\t}\n\n\t\tif (getOwnPropertySymbols) {\n\t\t\tsymbols = getOwnPropertySymbols(from);\n\t\t\tfor (var i = 0; i < symbols.length; i++) {\n\t\t\t\tif (propIsEnumerable.call(from, symbols[i])) {\n\t\t\t\t\tto[symbols[i]] = from[symbols[i]];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn to;\n};\n","/** @license React v17.0.2\n * react-jsx-runtime.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n'use strict';require(\"object-assign\");var f=require(\"react\"),g=60103;exports.Fragment=60107;if(\"function\"===typeof Symbol&&Symbol.for){var h=Symbol.for;g=h(\"react.element\");exports.Fragment=h(\"react.fragment\")}var m=f.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,n=Object.prototype.hasOwnProperty,p={key:!0,ref:!0,__self:!0,__source:!0};\nfunction q(c,a,k){var b,d={},e=null,l=null;void 0!==k&&(e=\"\"+k);void 0!==a.key&&(e=\"\"+a.key);void 0!==a.ref&&(l=a.ref);for(b in a)n.call(a,b)&&!p.hasOwnProperty(b)&&(d[b]=a[b]);if(c&&c.defaultProps)for(b in a=c.defaultProps,a)void 0===d[b]&&(d[b]=a[b]);return{$$typeof:g,type:c,key:e,ref:l,props:d,_owner:m.current}}exports.jsx=q;exports.jsxs=q;\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n  module.exports = require('./cjs/react-jsx-runtime.production.min.js');\n} else {\n  module.exports = require('./cjs/react-jsx-runtime.development.js');\n}\n","import * as jsxRuntime from \"/Users/ramunas/dev/projects/pixie/editor/node_modules/react/jsx-runtime.js\"\nexport const jsx = jsxRuntime.jsx\nexport const jsxs = jsxRuntime.jsxs\nexport const Fragment = jsxRuntime.Fragment","import React, {forwardRef} from 'react';\n\nexport interface SvgIconProps extends React.SVGAttributes<SVGElement> {\n  children?: React.ReactNode;\n  size?: string | number;\n  color?: string;\n  title?: string;\n}\n\nexport const SvgIcon = forwardRef<SVGSVGElement, SvgIconProps & {attr?: {}}>(\n  (props, ref) => {\n    const {\n      attr,\n      size,\n      title,\n      className,\n      color,\n      style,\n      children,\n      viewBox,\n      ...svgProps\n    } = props;\n    const computedSize = size || '1em';\n    let mergedClassName = 'svg-icon';\n    if (className) {\n      mergedClassName += ` ${className}`;\n    }\n\n    return (\n      <svg\n        aria-hidden={!title}\n        focusable={false}\n        xmlns=\"http://www.w3.org/2000/svg\"\n        viewBox={viewBox || '0 0 24 24'}\n        {...attr}\n        {...svgProps}\n        className={mergedClassName}\n        style={{\n          color,\n          ...style,\n        }}\n        ref={ref}\n        height={computedSize}\n        width={computedSize}\n      >\n        {title && <title>{title}</title>}\n        {children}\n      </svg>\n    );\n  }\n);\n","import React, {ComponentType, ReactElement, RefObject} from 'react';\nimport {SvgIcon, SvgIconProps} from './svg-icon';\n\nexport function createSvgIcon(\n  path: ReactElement | ReactElement[],\n  displayName: string = ''\n): ComponentType<SvgIconProps> {\n  const Component = (props: SvgIconProps, ref: RefObject<SVGSVGElement>) => (\n    <SvgIcon data-testid={`${displayName}Icon`} ref={ref} {...props}>\n      {path}\n    </SvgIcon>\n  );\n\n  if (process.env.NODE_ENV !== 'production') {\n    // Need to set `displayName` on the inner component for React.memo.\n    // React prior to 16.14 ignores `displayName` on the wrapper.\n    Component.displayName = `${displayName}Icon`;\n  }\n\n  return React.memo(React.forwardRef(Component as any));\n}\n\nexport interface IconTree {\n  tag: string;\n  attr?: {[key: string]: string};\n  child?: IconTree[];\n}\nexport function createSvgIconFromTree(\n  data: IconTree[],\n  displayName: string = ''\n) {\n  const path = Tree2Element(data);\n  return createSvgIcon(path!, displayName);\n}\n\nfunction Tree2Element(tree?: IconTree[]): React.ReactElement<{}>[] | undefined {\n  return (\n    tree &&\n    tree.map((node, i) => {\n      return React.createElement(\n        node.tag,\n        // eslint-disable-next-line react/no-array-index-key\n        {key: i, ...node.attr},\n        Tree2Element(node.child)\n      );\n    })\n  );\n}\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const TuneIcon = createSvgIcon(\n  <path d=\"M3 17v2h6v-2H3zM3 5v2h10V5H3zm10 16v-2h8v-2h-8v-2h-2v6h2zM7 9v2H3v2h4v2h2V9H7zm14 4v-2H11v2h10zm-6-4h2V7h4V5h-4V3h-2v6z\" />\n, 'TuneOutlined');\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const PhotoSizeSelectLargeIcon = createSvgIcon(\n  <path d=\"M21 15h2v2h-2v-2zm0-4h2v2h-2v-2zm2 8h-2v2c1 0 2-1 2-2zM13 3h2v2h-2V3zm8 4h2v2h-2V7zm0-4v2h2c0-1-1-2-2-2zM1 7h2v2H1V7zm16-4h2v2h-2V3zm0 16h2v2h-2v-2zM3 3C2 3 1 4 1 5h2V3zm6 0h2v2H9V3zM5 3h2v2H5V3zm-4 8v8c0 1.1.9 2 2 2h12V11H1zm2 8 2.5-3.21 1.79 2.15 2.5-3.22L13 19H3z\" />\n, 'PhotoSizeSelectLargeOutlined');\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const CropIcon = createSvgIcon(\n  <path d=\"M17 15h2V7c0-1.1-.9-2-2-2H9v2h8v8zM7 17V1H5v4H1v2h4v10c0 1.1.9 2 2 2h10v4h2v-4h4v-2H7z\" />\n, 'CropOutlined');\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const TextFieldsIcon = createSvgIcon(\n  <path d=\"M2.5 4v3h5v12h3V7h5V4h-13zm19 5h-9v3h3v7h3v-7h3V9z\" />\n, 'TextFieldsOutlined');\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const ExtensionIcon = createSvgIcon(\n  <path d=\"M10.5 4.5c.28 0 .5.22.5.5v2h6v6h2c.28 0 .5.22.5.5s-.22.5-.5.5h-2v6h-2.12c-.68-1.75-2.39-3-4.38-3s-3.7 1.25-4.38 3H4v-2.12c1.75-.68 3-2.39 3-4.38 0-1.99-1.24-3.7-2.99-4.38L4 7h6V5c0-.28.22-.5.5-.5m0-2C9.12 2.5 8 3.62 8 5H4c-1.1 0-1.99.9-1.99 2v3.8h.29c1.49 0 2.7 1.21 2.7 2.7s-1.21 2.7-2.7 2.7H2V20c0 1.1.9 2 2 2h3.8v-.3c0-1.49 1.21-2.7 2.7-2.7s2.7 1.21 2.7 2.7v.3H17c1.1 0 2-.9 2-2v-4c1.38 0 2.5-1.12 2.5-2.5S20.38 11 19 11V7c0-1.1-.9-2-2-2h-4c0-1.38-1.12-2.5-2.5-2.5z\" />\n, 'ExtensionOutlined');\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const FaceIcon = createSvgIcon(\n  <path d=\"M10.25 13c0 .69-.56 1.25-1.25 1.25S7.75 13.69 7.75 13s.56-1.25 1.25-1.25 1.25.56 1.25 1.25zM15 11.75c-.69 0-1.25.56-1.25 1.25s.56 1.25 1.25 1.25 1.25-.56 1.25-1.25-.56-1.25-1.25-1.25zm7 .25c0 5.52-4.48 10-10 10S2 17.52 2 12 6.48 2 12 2s10 4.48 10 10zM10.66 4.12C12.06 6.44 14.6 8 17.5 8c.46 0 .91-.05 1.34-.12C17.44 5.56 14.9 4 12 4c-.46 0-.91.05-1.34.12zM4.42 9.47c1.71-.97 3.03-2.55 3.66-4.44C6.37 6 5.05 7.58 4.42 9.47zM20 12c0-.78-.12-1.53-.33-2.24-.7.15-1.42.24-2.17.24-3.13 0-5.92-1.44-7.76-3.69C8.69 8.87 6.6 10.88 4 11.86c.01.04 0 .09 0 .14 0 4.41 3.59 8 8 8s8-3.59 8-8z\" />\n, 'FaceOutlined');\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const FilterFramesIcon = createSvgIcon(\n  <path d=\"M20 4h-4l-4-4-4 4H4c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2zm0 16H4V6h4.52l3.52-3.5L15.52 6H20v14zM6 18h12V8H6v10zm2-8h8v6H8v-6z\" />\n, 'FilterFramesOutlined');\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const MergeIcon = createSvgIcon(\n  <path d=\"M6.41 21 5 19.59l4.83-4.83c.75-.75 1.17-1.77 1.17-2.83v-5.1L9.41 8.41 8 7l4-4 4 4-1.41 1.41L13 6.83v5.1c0 1.06.42 2.08 1.17 2.83L19 19.59 17.59 21 12 15.41 6.41 21z\" />\n, 'MergeOutlined');\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const RoundedCornerIcon = createSvgIcon(\n  <path d=\"M19 19h2v2h-2v-2zm0-2h2v-2h-2v2zM3 13h2v-2H3v2zm0 4h2v-2H3v2zm0-8h2V7H3v2zm0-4h2V3H3v2zm4 0h2V3H7v2zm8 16h2v-2h-2v2zm-4 0h2v-2h-2v2zm4 0h2v-2h-2v2zm-8 0h2v-2H7v2zm-4 0h2v-2H3v2zM21 8c0-2.76-2.24-5-5-5h-5v2h5c1.65 0 3 1.35 3 3v5h2V8z\" />\n, 'RoundedCornerOutlined');\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const PhotoLibraryIcon = createSvgIcon(\n  <path d=\"M20 4v12H8V4h12m0-2H8c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zm-8.5 9.67 1.69 2.26 2.48-3.1L19 15H9zM2 6v14c0 1.1.9 2 2 2h14v-2H4V6H2z\" />\n, 'PhotoLibraryOutlined');\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const HistoryIcon = createSvgIcon(\n  <path 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.25 2.52.77-1.28-3.52-2.09V8z\" />\n, 'HistoryOutlined');\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const StyleIcon = createSvgIcon(\n  [<path d=\"m2.53 19.65 1.34.56v-9.03l-2.43 5.86c-.41 1.02.08 2.19 1.09 2.61zm19.5-3.7L17.07 3.98c-.31-.75-1.04-1.21-1.81-1.23-.26 0-.53.04-.79.15L7.1 5.95c-.75.31-1.21 1.03-1.23 1.8-.01.27.04.54.15.8l4.96 11.97c.31.76 1.05 1.22 1.83 1.23.26 0 .52-.05.77-.15l7.36-3.05c1.02-.42 1.51-1.59 1.09-2.6zm-9.2 3.8L7.87 7.79l7.35-3.04h.01l4.95 11.95-7.35 3.05z\" key=\"0\" />,<circle cx=\"11\" cy=\"9\" r=\"1\" key=\"1\" />,<path d=\"M5.88 19.75c0 1.1.9 2 2 2h1.45l-3.45-8.34v6.34z\" key=\"2\" />,]\n, 'StyleOutlined');\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const DeleteIcon = createSvgIcon(\n  <path d=\"M16 9v10H8V9h8m-1.5-6h-5l-1 1H5v2h14V4h-3.5l-1-1zM18 7H6v12c0 1.1.9 2 2 2h8c1.1 0 2-.9 2-2V7z\" />\n, 'DeleteOutlined');\n","import {createSvgIcon} from '../../common/icons/create-svg-icon';\n\nexport const DrawIcon = createSvgIcon(\n  <path d=\"M18.85,10.39l1.06-1.06c0.78-0.78,0.78-2.05,0-2.83L18.5,5.09c-0.78-0.78-2.05-0.78-2.83,0l-1.06,1.06L18.85,10.39z M14.61,11.81L7.41,19H6v-1.41l7.19-7.19L14.61,11.81z M13.19,7.56L4,16.76V21h4.24l9.19-9.19L13.19,7.56L13.19,7.56z M19,17.5 c0,2.19-2.54,3.5-5,3.5c-0.55,0-1-0.45-1-1s0.45-1,1-1c1.54,0,3-0.73,3-1.5c0-0.47-0.48-0.87-1.23-1.2l1.48-1.48 C18.32,15.45,19,16.29,19,17.5z M4.58,13.35C3.61,12.79,3,12.06,3,11c0-1.8,1.89-2.63,3.56-3.36C7.59,7.18,9,6.56,9,6 c0-0.41-0.78-1-2-1C5.74,5,5.2,5.61,5.17,5.64C4.82,6.05,4.19,6.1,3.77,5.76C3.36,5.42,3.28,4.81,3.62,4.38C3.73,4.24,4.76,3,7,3 c2.24,0,4,1.32,4,3c0,1.87-1.93,2.72-3.64,3.47C6.42,9.88,5,10.5,5,11c0,0.31,0.43,0.6,1.07,0.86L4.58,13.35z\" />,\n  'Draw'\n);\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const HomeIcon = createSvgIcon(\n  <path d=\"m12 5.69 5 4.5V18h-2v-6H9v6H7v-7.81l5-4.5M12 3 2 12h3v8h6v-6h2v6h6v-8h3L12 3z\" />\n, 'HomeOutlined');\n","import {ComponentType} from 'react';\nimport {defineMessage, MessageDescriptor} from 'react-intl';\nimport {ToolName} from '../tool-name';\nimport {TuneIcon} from '../../common/icons/material/Tune';\nimport {PhotoSizeSelectLargeIcon} from '../../common/icons/material/PhotoSizeSelectLarge';\nimport {CropIcon} from '../../common/icons/material/Crop';\nimport {TextFieldsIcon} from '../../common/icons/material/TextFields';\nimport {ExtensionIcon} from '../../common/icons/material/Extension';\nimport {FaceIcon} from '../../common/icons/material/Face';\nimport {FilterFramesIcon} from '../../common/icons/material/FilterFrames';\nimport {MergeIcon} from '../../common/icons/material/Merge';\nimport {RoundedCornerIcon} from '../../common/icons/material/RoundedCorner';\nimport {PhotoLibraryIcon} from '../../common/icons/material/PhotoLibrary';\nimport {HistoryIcon} from '../../common/icons/material/History';\nimport {StyleIcon} from '../../common/icons/material/Style';\nimport {DeleteIcon} from '../../common/icons/material/Delete';\nimport {SvgIconProps} from '../../common/icons/svg-icon';\nimport {DrawIcon} from '../../ui/icons/draw';\nimport {HomeIcon} from '../../common/icons/material/Home';\n\nexport const HISTORY_DISPLAY_NAMES: Record<\n  HistoryName,\n  {name: MessageDescriptor; icon: ComponentType<SvgIconProps>}\n> = {\n  [ToolName.FILTER]: {\n    name: defineMessage({defaultMessage: 'Applied Filters'}),\n    icon: TuneIcon,\n  },\n  [ToolName.RESIZE]: {\n    name: defineMessage({defaultMessage: 'Resized Image'}),\n    icon: PhotoSizeSelectLargeIcon,\n  },\n  [ToolName.CROP]: {\n    name: defineMessage({defaultMessage: 'Cropped Image'}),\n    icon: CropIcon,\n  },\n  [ToolName.DRAW]: {\n    name: defineMessage({defaultMessage: 'Added Drawing'}),\n    icon: DrawIcon,\n  },\n  [ToolName.TEXT]: {\n    name: defineMessage({defaultMessage: 'Added Text'}),\n    icon: TextFieldsIcon,\n  },\n  [ToolName.SHAPES]: {\n    name: defineMessage({defaultMessage: 'Added Shape'}),\n    icon: ExtensionIcon,\n  },\n  [ToolName.STICKERS]: {\n    name: defineMessage({defaultMessage: 'Added Sticker'}),\n    icon: FaceIcon,\n  },\n  [ToolName.FRAME]: {\n    name: defineMessage({defaultMessage: 'Added Frame'}),\n    icon: FilterFramesIcon,\n  },\n  [ToolName.MERGE]: {\n    name: defineMessage({defaultMessage: 'Merged Objects'}),\n    icon: MergeIcon,\n  },\n  [ToolName.CORNERS]: {\n    name: defineMessage({defaultMessage: 'Rounded Corner'}),\n    icon: RoundedCornerIcon,\n  },\n  bgImage: {\n    name: defineMessage({defaultMessage: 'Replaced Background Image'}),\n    icon: PhotoLibraryIcon,\n  },\n  overlayImage: {\n    name: defineMessage({defaultMessage: 'Added Image'}),\n    icon: PhotoLibraryIcon,\n  },\n  initial: {name: defineMessage({defaultMessage: 'Initial'}), icon: HomeIcon},\n  loadedState: {\n    name: defineMessage({defaultMessage: 'Loaded State'}),\n    icon: HistoryIcon,\n  },\n  objectStyle: {\n    name: defineMessage({defaultMessage: 'Changed Style'}),\n    icon: StyleIcon,\n  },\n  deletedObject: {\n    name: defineMessage({defaultMessage: 'Deleted object'}),\n    icon: DeleteIcon,\n  },\n};\n\nexport type HistoryName =\n  | ToolName\n  | 'initial'\n  | 'loadedState'\n  | 'bgImage'\n  | 'overlayImage'\n  | 'objectStyle'\n  | 'deletedObject';\n","import {defineMessages, MessageDescriptor} from 'react-intl';\nimport {ToolName} from '../tools/tool-name';\nimport type {NavItem} from './default-config';\nimport type {Pixie} from '../pixie';\nimport {HISTORY_DISPLAY_NAMES} from '../tools/history/history-display-names';\n\nexport const DEFAULT_NAV_ITEMS: NavItem[] = Object.values(ToolName).map(\n  toolName => {\n    return {\n      name: toolName,\n      icon: HISTORY_DISPLAY_NAMES[toolName].icon,\n      action:\n        toolName === ToolName.MERGE\n          ? (editor: Pixie) => {\n              editor.tools.merge.apply();\n            }\n          : toolName,\n    };\n  }\n);\n\nexport const navItemMessages: Record<string, MessageDescriptor> =\n  defineMessages({\n    filter: {defaultMessage: 'Filter', description: 'Navbar item'},\n    resize: {defaultMessage: 'Resize', description: 'Navbar item'},\n    crop: {defaultMessage: 'Crop', description: 'Navbar item'},\n    draw: {defaultMessage: 'Draw', description: 'Navbar item'},\n    text: {defaultMessage: 'Text', description: 'Navbar item'},\n    shapes: {defaultMessage: 'Shapes', description: 'Navbar item'},\n    Stickers: {defaultMessage: 'Stickers', description: 'Navbar item'},\n    frame: {defaultMessage: 'Frame', description: 'Navbar item'},\n    corners: {defaultMessage: 'Corners', description: 'Navbar item'},\n    merge: {defaultMessage: 'Merge', description: 'Navbar item'},\n  });\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const FileDownloadIcon = createSvgIcon(\n  <path d=\"M18 15v3H6v-3H4v3c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2v-3h-2zm-1-4-1.41-1.41L13 12.17V4h-2v8.17L8.41 9.59 7 11l5 5 5-5z\" />\n, 'FileDownloadOutlined');\n","import React, {ComponentType} from 'react';\nimport {defineMessage, MessageDescriptor} from 'react-intl';\nimport {ToolName} from '../tools/tool-name';\nimport {EditorMode} from './editor-mode';\nimport {MenubarPosition, NavPosition} from '../ui/navbar/nav-position';\nimport {SampleImage} from '../tools/sample-image';\nimport {BasicShape, defaultShapes} from './default-shapes';\nimport {defaultStickers, StickerCategory} from './default-stickers';\nimport {defaultObjectProps} from './default-object-props';\nimport {BrushSizes, BrushTypes} from '../tools/draw/draw-defaults';\nimport {EditorTheme} from './editor-theme';\nimport type {Frame} from '../tools/frame/frame';\nimport type {FontFaceConfig} from '../common/ui/font-picker/font-face-config';\nimport {DEFAULT_THEMES} from './default-themes';\nimport {DEFAULT_NAV_ITEMS} from './default-nav-items';\nimport type {Pixie} from '../pixie';\nimport {FileDownloadIcon} from '../common/icons/material/FileDownload';\nimport {HistoryIcon} from '../common/icons/material/History';\nimport {ObjectName} from '../objects/object-name';\nimport packageConfig from '../../package.json';\n\nexport const PIXIE_VERSION = packageConfig.version;\n\nexport interface NavItem {\n  /**\n   * unique identifier for this navigation item.\n   */\n  name: string;\n\n  /**\n   * Action to perform when this nav item is clicked. Either name of panel to open or custom function.\n   */\n  action: Function | ToolName;\n\n  /**\n   * Name or url of icon for this navigation item.\n   */\n  icon: React.ComponentType;\n}\n\nexport interface ToolbarItemConfig {\n  /**\n   * Type for this toolbar item.\n   */\n  type: 'button' | 'zoomWidget' | 'undoWidget' | 'image';\n\n  /**\n   * Url for image when toolbar item type is set to \"image\".\n   */\n  src?: string;\n\n  /**\n   * Icon that should be shown for this item.\n   */\n  icon?: ComponentType;\n\n  /**\n   * Label that should be shown for this item.\n   */\n  label?: string | MessageDescriptor;\n\n  /**\n   * Action that should be performed when user clicks on this item.\n   */\n  action?: (editor: Pixie) => void;\n\n  /**\n   * On which side of the menubar should this item be shown.\n   */\n  align?: 'left' | 'center' | 'right';\n\n  /**\n   * Whether this toolbar item should only show on mobile.\n   */\n  mobileOnly?: boolean;\n\n  /**\n   * Whether this toolbar item should only show on desktop.\n   */\n  desktopOnly?: boolean;\n\n  /**\n   * List of dropdown menu items that will be shown when this button is clicked.\n   */\n  menuItems?: {label: string; action: () => void}[];\n}\n\nexport interface ObjectDefaults {\n  /**\n   * Default object background color.\n   */\n  fill?: string;\n\n  /**\n   * Default align for text added via pixie.\n   */\n  textAlign?:\n    | 'initial'\n    | 'left'\n    | 'center'\n    | 'right'\n    | 'justify'\n    | 'justify-left'\n    | 'justify-center'\n    | 'justify-right';\n\n  /**\n   * Whether text should have an underline.\n   */\n  underline?: boolean;\n\n  /**\n   * Whether text should have a strikethrough line.\n   */\n  linethrough?: boolean;\n\n  /**\n   * Default font style for text added via pixie.\n   */\n  fontStyle?: 'normal' | 'italic' | 'oblique';\n\n  /**\n   * Default font family for text added via pixie.\n   */\n  fontFamily?: string;\n\n  /**\n   * Default font size for text added via pixie.\n   */\n  fontSize?: number;\n\n  /**\n   * Default font weight text added via pixie.\n   */\n  fontWeight?:\n    | 'bold'\n    | 'normal'\n    | 100\n    | 200\n    | 300\n    | 400\n    | 500\n    | 600\n    | 700\n    | 800\n    | 900;\n\n  /**\n   * Text border color.\n   */\n  stroke?: string;\n\n  /**\n   * Default object width. Will be 1/4 of canvas size if not specified.\n   */\n  width?: number;\n\n  /**\n   * Default object width. Will be 1/4 of canvas size if not specified.\n   */\n  height?: number;\n}\n\nexport interface ObjectControlConfig {\n  hideTopLeft?: boolean;\n  hideTopRight?: boolean;\n  hideBottomRight?: boolean;\n  hideBottomLeft?: boolean;\n  hideRotatingPoint?: boolean;\n  hideFloatingControls?: boolean;\n  unlockAspectRatio?: boolean;\n  lockMovement?: boolean;\n}\n\nexport interface PixieTheme {\n  name: string;\n  isDark?: boolean;\n  colors: Record<string, string>;\n}\n\nexport interface PixieConfig {\n  /**\n   * Selector for the container into which pixie should be loaded.\n   */\n  selector: string;\n\n  /**\n   * Image or pixie state that should be loaded into editor with initial load.\n   * Will accept url or image/state data.\n   */\n  image?: string;\n\n  /**\n   * Pixie state to load into the editor.\n   */\n  state?: string;\n\n  /**\n   * Opens new empty canvas at specified size. Alternative to \"image\" and \"state\".\n   */\n  blankCanvasSize?: {width: number; height: number};\n\n  /**\n   * Whether images loaded into pixie will be hosted on another domain from where pixie is hosted.\n   */\n  crossOrigin?: boolean;\n\n  /**\n   * Adds specified text as watermark on downloaded or exported image.\n   */\n  watermarkText?: string;\n\n  /**\n   * Maximum memory pixie will use when applying filters.\n   * https://support.vebto.com/help-center/articles/10/45/164/filter-texture-size\n   */\n  textureSize?: number;\n\n  /**\n   * From where should pixie assets be loaded.\n   * https://support.vebto.com/help-center/articles/10/45/150/specifying-base-url\n   */\n  baseUrl?: string;\n\n  ui?: {\n    /**\n     * Tool that should be activated when editor is opened initially.\n     */\n    defaultTool?: ToolName;\n\n    /**\n     * Whether pixie is currently visible.\n     */\n    visible?: boolean;\n\n    /**\n     * Theme that is currently active.\n     */\n    activeTheme?: string;\n\n    /**\n     * List of available themes.\n     */\n    themes?: PixieTheme[];\n\n    /**\n     * Whether inline or overlay (modal) mode should be used.\n     */\n    mode?: EditorMode;\n\n    /**\n     * If true, editor will always show as overlay on mobile, regardless of specified \"mode\".\n     */\n    forceOverlayModeOnMobile?: boolean;\n\n    /**\n     * Whether user should be able to close editor while in overlay mode.\n     */\n    allowEditorClose?: boolean;\n\n    /**\n     * When user clicks on \"done\" button, show panel where image format, name and quality can be selected before download.\n     */\n    showExportPanel?: boolean;\n\n    /**\n     * Preset colors that will be shown in pixie color widgets.\n     */\n    colorPresets?: {\n      /**\n       * Lists of colors in hex or rgba format.\n       */\n      items: string[];\n\n      /**\n       * Whether default pixie colors should be overwritten with specified ones.\n       */\n      replaceDefault?: boolean;\n    };\n\n    /**\n     * Navigation bar configuration.\n     */\n    nav?: {\n      /**\n       * At which predefined position should navigation bar be displayed.\n       */\n      position?: NavPosition;\n\n      /**\n       * Whether specified navigation items should replace default ones.\n       */\n      replaceDefault?: boolean;\n\n      /**\n       * What Items should be shown in the navigation bar.\n       */\n      items?: NavItem[];\n    };\n\n    /**\n     * If no image or state is provided via configuration, this panel can be opened to allow\n     * user to select from sample images, upload new image, or enter blank canvas size.\n     */\n    openImageDialog?: {\n      /**\n       * Whether this panel should be shown.\n       */\n      show: boolean;\n\n      /**\n       * Sample images that user should be able to pick from.\n       */\n      sampleImages?: SampleImage[];\n    };\n\n    /**\n     * Menubar appearance and items configuration.\n     */\n    menubar?: {\n      /**\n       * Where should menubar appear.\n       */\n      position?: MenubarPosition;\n\n      /**\n       * Items to show in the menubar.\n       */\n      items?: ToolbarItemConfig[];\n    };\n  };\n\n  /**\n   * Currently active language for the editor.\n   */\n  activeLanguage?: string;\n\n  /**\n   * List of available translations.\n   */\n  languages?: {\n    [key: string]: Record<string, string>;\n  };\n\n  /**\n   * On \"save\" button click pixie will automatically send image data to specified url.\n   */\n  saveUrl?: string;\n\n  /**\n   * Called when image is saved via save button, export panel or pixie API.\n   */\n  onSave?: Function;\n\n  /**\n   * Called when pixie editor is fully loaded.\n   */\n  onLoad?: Function;\n\n  /**\n   * Called when editor is closed (via pixie API or close button click)\n   */\n  onClose?: Function;\n\n  /**\n   * Called when editor is opened (via pixie API or custom open button)\n   */\n  onOpen?: Function;\n\n  /**\n   * Called whenever a new file (image or state) is opened via file picker.\n   */\n  onFileOpen?: Function;\n\n  /**\n   * Called when main image is loaded (or changed) in the editor.\n   */\n  onMainImageLoaded?: Function;\n\n  tools?: {\n    /**\n     * Filter tool configuration.\n     */\n    filter?: {\n      /**\n       * Whether specified filters should replace default ones.\n       */\n      replaceDefault?: boolean;\n\n      /**\n       * Filters that should be shown in filter panel.\n       */\n      items: string[];\n    };\n\n    /**\n     * Resize tool configuration.\n     */\n    resize?: {\n      /**\n       * Minimum width user should be able to resize image to.\n       */\n      minWidth?: number;\n\n      /**\n       * Maximum width user should be able to resize image to.\n       */\n      maxWidth?: number;\n\n      /**\n       * Minimum height user should be able to resize image to.\n       */\n      minHeight?: number;\n\n      /**\n       * Maximum height user should be able to resize image to.\n       */\n      maxHeight?: number;\n    };\n\n    crop?: {\n      /**\n       * Initial aspect ratio for cropzone.\n       */\n      defaultRatio?: string;\n\n      /**\n       * Whether user should be able to resize cropzone to any aspect ratio.\n       */\n      allowCustomRatio?: boolean;\n\n      /**\n       * Whether built-in cropzone aspect ratios should be overwritten with specified ones.\n       */\n      replaceDefaultPresets?: boolean;\n\n      /**\n       * Custom cropzone aspect ratios.\n       */\n      presets?: {ratio: string | null; name?: string}[];\n\n      /**\n       * Cropzone appearance and functionality configuration.\n       */\n      cropzone?: ObjectControlConfig;\n    };\n\n    /**\n     * Draw tool configuration.\n     */\n    draw?: {\n      /**\n       * Whether default brush sizes should be replaced.\n       */\n      replaceDefaultBrushSizes?: boolean;\n\n      /**\n       * Whether default brush types should be replaced.\n       */\n      replaceDefaultBrushTypes?: boolean;\n\n      /**\n       * Brush sizes that user should be able to pick from.\n       */\n      brushSizes: number[];\n\n      /**\n       * Brush types that user should be able to pick from.\n       */\n      brushTypes: string[];\n    };\n\n    text?: {\n      /**\n       * Whether default fonts should be replaced with specified custom ones.\n       */\n      replaceDefaultItems?: boolean;\n\n      /**\n       * Text that should be added by default when clicking on \"add text\" button.\n       */\n      defaultText?: string;\n\n      /**\n       * Custom fonts that should be shown in font picker.\n       */\n      items?: FontFaceConfig[];\n    };\n\n    frame?: {\n      /**\n       * Whether default frames should be replaced with specified custom ones.\n       */\n      replaceDefault?: boolean;\n\n      /**\n       * Custom frames that user should be able to add to the image.\n       */\n      items?: Frame[];\n    };\n\n    shapes?: {\n      /**\n       * Whether default shapes should be replaced with specified custom ones.\n       */\n      replaceDefault?: boolean;\n\n      /**\n       * Custom shapes that user should be able to add to the image.\n       */\n      items?: BasicShape[];\n    };\n\n    stickers?: {\n      /**\n       * Whether default sticker categories should be replaced with specified custom ones.\n       */\n      replaceDefault?: boolean;\n\n      /**\n       * Custom sticker categories and their stickers that should appear in stickers panel.\n       */\n      items?: StickerCategory[];\n    };\n\n    import?: {\n      /**\n       * File extensions user should be able to select when opening new image.\n       */\n      validImgExtensions?: string[];\n\n      /**\n       * Maximum file size when opening new image or state file.\n       */\n      maxFileSize?: number; // in bytes\n\n      /**\n       * Whether new image overlays should be automatically resized to fit available canvas space.\n       */\n      fitOverlayToScreen?: boolean;\n\n      /**\n       * When user drags image from desktop onto pixie, should that image be opened as background or overlay.\n       */\n      openDroppedImageAsBackground?: boolean;\n    };\n\n    export?: {\n      /**\n       * Which format should images be downloaded in by default.\n       */\n      defaultFormat: 'png' | 'jpeg' | 'json';\n\n      /**\n       * What compression level should be applied to downloaded images. 0 to 1.\n       */\n      defaultQuality: number;\n\n      /**\n       * Default file name for downloaded images.\n       */\n      defaultName: string;\n    };\n\n    zoom?: {\n      /**\n       * Whether user should be able to manually zoom in and out via toolbar buttons.\n       */\n      allowUserZoom?: boolean;\n\n      /**\n       * Whether new image should be automatically zoomed, so it fits into available screen space.\n       */\n      fitImageToScreen?: boolean;\n    };\n  };\n\n  /**\n   * Default styles and behaviour for various objects in pixie.\n   */\n  objectDefaults?: {\n    /**\n     * Styles and behaviour for all objects.\n     */\n    global?: ObjectDefaults;\n\n    /**\n     * Styles and behaviour for new basic shapes (circle, triangle etc.)\n     */\n    [ObjectName.Shape]?: ObjectDefaults;\n\n    /**\n     * Styles and behaviour for new stickers.\n     */\n    [ObjectName.Sticker]?: ObjectDefaults;\n\n    /**\n     * Styles and behaviour for text added to image via pixie.\n     */\n    [ObjectName.Text]?: ObjectDefaults;\n  };\n\n  /**\n   * Visibility and behaviour of object controls.\n   */\n  objectControls?: {\n    /**\n     * Object controls and behaviour for all objects.\n     */\n    global?: ObjectControlConfig;\n\n    /**\n     * Object controls and behaviour for new basic shapes (circle, triangle etc.)\n     */\n    [ObjectName.Shape]?: ObjectControlConfig;\n\n    /**\n     * Object controls and behaviour for new stickers.\n     */\n    [ObjectName.Sticker]?: ObjectControlConfig;\n\n    /**\n     * Object controls and behaviour for text added to image via pixie.\n     */\n    [ObjectName.Text]?: ObjectControlConfig;\n  };\n\n  sentryDsn?: string;\n}\n\nexport const DEFAULT_CONFIG: PixieConfig = {\n  selector: 'pixie-editor',\n  textureSize: 4096,\n  ui: {\n    visible: true,\n    mode: EditorMode.INLINE,\n    forceOverlayModeOnMobile: true,\n    activeTheme: EditorTheme.LIGHT,\n    themes: DEFAULT_THEMES,\n    allowEditorClose: true,\n    menubar: {\n      items: [\n        {\n          type: 'undoWidget',\n          align: 'left',\n        },\n        {\n          type: 'zoomWidget',\n          align: 'center',\n          desktopOnly: true,\n        },\n        {\n          type: 'button',\n          icon: HistoryIcon,\n          align: 'right',\n          desktopOnly: true,\n          action: editor => {\n            editor.togglePanel('history');\n          },\n        },\n        {\n          type: 'button',\n          icon: FileDownloadIcon,\n          label: defineMessage({defaultMessage: 'Done'}),\n          align: 'right',\n          action: editor => {\n            if (editor.state.config.ui?.showExportPanel) {\n              editor.state.togglePanel('export', true);\n            } else {\n              editor.tools.export.save('image');\n            }\n          },\n        },\n      ],\n    },\n    nav: {\n      position: NavPosition.BOTTOM,\n      items: [...DEFAULT_NAV_ITEMS],\n    },\n    openImageDialog: {\n      show: true,\n      sampleImages: [\n        {\n          url: 'images/samples/sample1.jpg',\n          thumbnail: 'images/samples/sample1_thumbnail.jpg',\n        },\n        {\n          url: 'images/samples/sample2.jpg',\n          thumbnail: 'images/samples/sample2_thumbnail.jpg',\n        },\n        {\n          url: 'images/samples/sample3.jpg',\n          thumbnail: 'images/samples/sample3_thumbnail.jpg',\n        },\n      ],\n    },\n    colorPresets: {\n      items: [\n        'rgb(0,0,0)',\n        'rgb(255, 255, 255)',\n        'rgb(242, 38, 19)',\n        'rgb(249, 105, 14)',\n        'rgb(253, 227, 167)',\n        'rgb(4, 147, 114)',\n        'rgb(30, 139, 195)',\n        'rgb(142, 68, 173)',\n      ],\n    },\n  },\n  objectDefaults: {\n    global: {\n      ...defaultObjectProps,\n    },\n    sticker: {\n      fill: undefined,\n    },\n    text: {\n      textAlign: 'initial',\n      underline: false,\n      linethrough: false,\n      fontStyle: 'normal',\n      fontFamily: 'Times New Roman',\n      fontWeight: 'normal',\n      stroke: undefined,\n      fontSize: 40,\n    },\n  },\n  tools: {\n    filter: {\n      items: [\n        'grayscale',\n        'blackWhite',\n        'sharpen',\n        'invert',\n        'vintage',\n        'polaroid',\n        'kodachrome',\n        'technicolor',\n        'brownie',\n        'sepia',\n        'removeColor',\n        'brightness',\n        'gamma',\n        'noise',\n        'pixelate',\n        'blur',\n        'emboss',\n        'blendColor',\n      ],\n    },\n    zoom: {\n      allowUserZoom: true,\n      fitImageToScreen: true,\n    },\n    crop: {\n      allowCustomRatio: true,\n      defaultRatio: '1:1',\n      presets: [\n        {ratio: null, name: 'Custom'},\n        {ratio: '1:1', name: 'Square'},\n        {ratio: '4:3'},\n        {ratio: '16:9'},\n        {ratio: '5:3'},\n        {ratio: '5:4'},\n        {ratio: '6:4'},\n        {ratio: '7:5'},\n        {ratio: '10:8'},\n      ],\n    },\n    text: {\n      defaultText: 'Double click to edit',\n      items: [\n        {\n          family: 'Roboto',\n          src: 'fonts/open-sans-v27-latin-ext_latin-regular.woff2',\n        },\n        {\n          family: 'Fuzzy Bubbles',\n          src: 'fonts/fuzzy-bubbles-v3-latin-700.woff2',\n          descriptors: {weight: '700'},\n        },\n        {\n          family: 'Aleo Bold',\n          src: 'fonts/aleo-v4-latin-ext_latin-700.woff2',\n          descriptors: {weight: '700'},\n        },\n        {\n          family: 'Amatic SC',\n          src: 'fonts/amatic-sc-v16-latin-ext_latin-regular.woff2',\n        },\n        {\n          family: 'Corinthia Bold',\n          src: 'fonts/corinthia-v7-latin-ext_latin-700.woff2',\n        },\n        {\n          family: 'Bungee Inline',\n          src: 'fonts/bungee-inline-v6-latin-ext_latin-regular.woff2',\n        },\n        {\n          family: 'Robot Slab Bold',\n          src: 'fonts/roboto-slab-v16-latin-ext_latin-500.woff2',\n        },\n        {\n          family: 'Carter One',\n          src: 'fonts/carter-one-v12-latin-regular.woff2',\n        },\n        {\n          family: 'Cody Star',\n          src: 'fonts/codystar-v10-latin-ext_latin-regular.woff2',\n        },\n        {\n          family: 'Fira Sans',\n          src: 'fonts/fira-sans-v11-latin-ext_latin_cyrillic-regular.woff2',\n        },\n        {\n          family: 'Krona One',\n          src: 'fonts/krona-one-v9-latin-ext_latin-regular.woff2',\n        },\n        {\n          family: 'Kumar One Outline',\n          src: 'fonts/kumar-one-outline-v8-latin-ext_latin-regular.woff2',\n        },\n        {\n          family: 'Lobster Two',\n          src: 'fonts/lobster-two-v13-latin-regular.woff2',\n        },\n        {\n          family: 'Molle Italic',\n          src: 'fonts/molle-v11-latin-ext_latin-italic.woff2',\n        },\n        {\n          family: 'Monoton',\n          src: 'fonts/monoton-v10-latin-regular.woff2',\n        },\n        {\n          family: 'Nixie One',\n          src: 'fonts/nixie-one-v11-latin-regular.woff2',\n        },\n        {\n          family: 'Permanent Marker',\n          src: 'fonts/permanent-marker-v10-latin-regular.woff2',\n        },\n        {\n          family: 'Sancreek',\n          src: 'fonts/sancreek-v13-latin-ext_latin-regular.woff2',\n        },\n        {\n          family: 'Stint Ultra Expanded',\n          src: 'fonts/stint-ultra-expanded-v10-latin-regular.woff2',\n        },\n        {\n          family: 'VT323',\n          src: 'fonts/vt323-v12-latin-ext_latin-regular.woff2',\n        },\n        {\n          family: 'Trash Hand',\n          src: 'fonts/TrashHand.ttf',\n        },\n      ],\n    },\n    draw: {\n      brushSizes: BrushSizes,\n      brushTypes: BrushTypes,\n    },\n    shapes: {\n      items: defaultShapes.slice(),\n    },\n    stickers: {\n      items: defaultStickers,\n    },\n    import: {\n      validImgExtensions: ['png', 'jpg', 'jpeg', 'svg', 'gif'],\n      fitOverlayToScreen: true,\n      openDroppedImageAsBackground: false,\n    },\n    export: {\n      defaultFormat: 'png',\n      defaultQuality: 0.8,\n      defaultName: 'image',\n    },\n    frame: {\n      items: [\n        {\n          name: 'basic',\n          mode: 'basic',\n          size: {\n            min: 1,\n            max: 35,\n            default: 10,\n          },\n        },\n        {\n          name: 'pine',\n          mode: 'stretch',\n          size: {\n            min: 1,\n            max: 35,\n            default: 15,\n          },\n        },\n        {\n          name: 'oak',\n          mode: 'stretch',\n          size: {\n            min: 1,\n            max: 35,\n            default: 15,\n          },\n        },\n        {\n          name: 'rainbow',\n          mode: 'stretch',\n          size: {\n            min: 1,\n            max: 35,\n            default: 15,\n          },\n        },\n        {\n          name: 'grunge1',\n          display_name: 'grunge #1',\n          mode: 'stretch',\n          size: {\n            min: 1,\n            max: 35,\n            default: 15,\n          },\n        },\n        {\n          name: 'grunge2',\n          display_name: 'grunge #2',\n          mode: 'stretch',\n          size: {\n            min: 1,\n            max: 35,\n            default: 20,\n          },\n        },\n        {\n          name: 'ebony',\n          mode: 'stretch',\n          size: {\n            min: 1,\n            max: 35,\n            default: 15,\n          },\n        },\n        {\n          name: 'art1',\n          display_name: 'Art #1',\n          mode: 'repeat',\n          size: {\n            min: 10,\n            max: 70,\n            default: 55,\n          },\n        },\n        {\n          name: 'art2',\n          display_name: 'Art #2',\n          mode: 'repeat',\n          size: {\n            min: 10,\n            max: 70,\n            default: 55,\n          },\n        },\n      ],\n    },\n  },\n};\n","import { useReducer, useRef, useDebugValue, useEffect, useLayoutEffect } from 'react';\n\nfunction createStore(createState) {\n  let state;\n  const listeners = /* @__PURE__ */ new Set();\n  const setState = (partial, replace) => {\n    const nextState = typeof partial === \"function\" ? partial(state) : partial;\n    if (nextState !== state) {\n      const previousState = state;\n      state = replace ? nextState : Object.assign({}, state, nextState);\n      listeners.forEach((listener) => listener(state, previousState));\n    }\n  };\n  const getState = () => state;\n  const subscribeWithSelector = (listener, selector = getState, equalityFn = Object.is) => {\n    console.warn(\"[DEPRECATED] Please use `subscribeWithSelector` middleware\");\n    let currentSlice = selector(state);\n    function listenerToAdd() {\n      const nextSlice = selector(state);\n      if (!equalityFn(currentSlice, nextSlice)) {\n        const previousSlice = currentSlice;\n        listener(currentSlice = nextSlice, previousSlice);\n      }\n    }\n    listeners.add(listenerToAdd);\n    return () => listeners.delete(listenerToAdd);\n  };\n  const subscribe = (listener, selector, equalityFn) => {\n    if (selector || equalityFn) {\n      return subscribeWithSelector(listener, selector, equalityFn);\n    }\n    listeners.add(listener);\n    return () => listeners.delete(listener);\n  };\n  const destroy = () => listeners.clear();\n  const api = { setState, getState, subscribe, destroy };\n  state = createState(setState, getState, api);\n  return api;\n}\n\nconst isSSR = typeof window === \"undefined\" || !window.navigator || /ServerSideRendering|^Deno\\//.test(window.navigator.userAgent);\nconst useIsomorphicLayoutEffect = isSSR ? useEffect : useLayoutEffect;\nfunction create(createState) {\n  const api = typeof createState === \"function\" ? createStore(createState) : createState;\n  const useStore = (selector = api.getState, equalityFn = Object.is) => {\n    const [, forceUpdate] = useReducer((c) => c + 1, 0);\n    const state = api.getState();\n    const stateRef = useRef(state);\n    const selectorRef = useRef(selector);\n    const equalityFnRef = useRef(equalityFn);\n    const erroredRef = useRef(false);\n    const currentSliceRef = useRef();\n    if (currentSliceRef.current === void 0) {\n      currentSliceRef.current = selector(state);\n    }\n    let newStateSlice;\n    let hasNewStateSlice = false;\n    if (stateRef.current !== state || selectorRef.current !== selector || equalityFnRef.current !== equalityFn || erroredRef.current) {\n      newStateSlice = selector(state);\n      hasNewStateSlice = !equalityFn(currentSliceRef.current, newStateSlice);\n    }\n    useIsomorphicLayoutEffect(() => {\n      if (hasNewStateSlice) {\n        currentSliceRef.current = newStateSlice;\n      }\n      stateRef.current = state;\n      selectorRef.current = selector;\n      equalityFnRef.current = equalityFn;\n      erroredRef.current = false;\n    });\n    const stateBeforeSubscriptionRef = useRef(state);\n    useIsomorphicLayoutEffect(() => {\n      const listener = () => {\n        try {\n          const nextState = api.getState();\n          const nextStateSlice = selectorRef.current(nextState);\n          if (!equalityFnRef.current(currentSliceRef.current, nextStateSlice)) {\n            stateRef.current = nextState;\n            currentSliceRef.current = nextStateSlice;\n            forceUpdate();\n          }\n        } catch (error) {\n          erroredRef.current = true;\n          forceUpdate();\n        }\n      };\n      const unsubscribe = api.subscribe(listener);\n      if (api.getState() !== stateBeforeSubscriptionRef.current) {\n        listener();\n      }\n      return unsubscribe;\n    }, []);\n    const sliceToReturn = hasNewStateSlice ? newStateSlice : currentSliceRef.current;\n    useDebugValue(sliceToReturn);\n    return sliceToReturn;\n  };\n  Object.assign(useStore, api);\n  useStore[Symbol.iterator] = function() {\n    console.warn(\"[useStore, api] = create() is deprecated and will be removed in v4\");\n    const items = [useStore, api];\n    return {\n      next() {\n        const done = items.length <= 0;\n        return { value: items.shift(), done };\n      }\n    };\n  };\n  return useStore;\n}\n\nexport { create as default };\n","var __defProp$1 = Object.defineProperty;\nvar __getOwnPropSymbols$1 = Object.getOwnPropertySymbols;\nvar __hasOwnProp$1 = Object.prototype.hasOwnProperty;\nvar __propIsEnum$1 = Object.prototype.propertyIsEnumerable;\nvar __defNormalProp$1 = (obj, key, value) => key in obj ? __defProp$1(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __spreadValues$1 = (a, b) => {\n  for (var prop in b || (b = {}))\n    if (__hasOwnProp$1.call(b, prop))\n      __defNormalProp$1(a, prop, b[prop]);\n  if (__getOwnPropSymbols$1)\n    for (var prop of __getOwnPropSymbols$1(b)) {\n      if (__propIsEnum$1.call(b, prop))\n        __defNormalProp$1(a, prop, b[prop]);\n    }\n  return a;\n};\nconst redux = (reducer, initial) => (set, get, api) => {\n  api.dispatch = (action) => {\n    set((state) => reducer(state, action), false, action);\n    return action;\n  };\n  api.dispatchFromDevtools = true;\n  return __spreadValues$1({ dispatch: (...a) => api.dispatch(...a) }, initial);\n};\n\nfunction devtools(fn, options) {\n  return (set, get, api) => {\n    let didWarnAboutNameDeprecation = false;\n    if (typeof options === \"string\" && !didWarnAboutNameDeprecation) {\n      console.warn(\"[zustand devtools middleware]: passing `name` as directly will be not allowed in next majorpass the `name` in an object `{ name: ... }` instead\");\n      didWarnAboutNameDeprecation = true;\n    }\n    const devtoolsOptions = options === void 0 ? { name: void 0, anonymousActionType: void 0 } : typeof options === \"string\" ? { name: options } : options;\n    let extensionConnector;\n    try {\n      extensionConnector = window.__REDUX_DEVTOOLS_EXTENSION__ || window.top.__REDUX_DEVTOOLS_EXTENSION__;\n    } catch {\n    }\n    if (!extensionConnector) {\n      if ((import.meta.env && import.meta.env.MODE) !== \"production\" && typeof window !== \"undefined\") {\n        console.warn(\"[zustand devtools middleware] Please install/enable Redux devtools extension\");\n      }\n      return fn(set, get, api);\n    }\n    let extension = Object.create(extensionConnector.connect(devtoolsOptions));\n    let didWarnAboutDevtools = false;\n    Object.defineProperty(api, \"devtools\", {\n      get: () => {\n        if (!didWarnAboutDevtools) {\n          console.warn(\"[zustand devtools middleware] `devtools` property on the store is deprecated it will be removed in the next major.\\nYou shouldn't interact with the extension directly. But in case you still want to you can patch `window.__REDUX_DEVTOOLS_EXTENSION__` directly\");\n          didWarnAboutDevtools = true;\n        }\n        return extension;\n      },\n      set: (value) => {\n        if (!didWarnAboutDevtools) {\n          console.warn(\"[zustand devtools middleware] `api.devtools` is deprecated, it will be removed in the next major.\\nYou shouldn't interact with the extension directly. But in case you still want to you can patch `window.__REDUX_DEVTOOLS_EXTENSION__` directly\");\n          didWarnAboutDevtools = true;\n        }\n        extension = value;\n      }\n    });\n    let didWarnAboutPrefix = false;\n    Object.defineProperty(extension, \"prefix\", {\n      get: () => {\n        if (!didWarnAboutPrefix) {\n          console.warn(\"[zustand devtools middleware] along with `api.devtools`, `api.devtools.prefix` is deprecated.\\nWe no longer prefix the actions/names\" + devtoolsOptions.name === void 0 ? \", pass the `name` option to create a separate instance of devtools for each store.\" : \", because the `name` option already creates a separate instance of devtools for each store.\");\n          didWarnAboutPrefix = true;\n        }\n        return \"\";\n      },\n      set: () => {\n        if (!didWarnAboutPrefix) {\n          console.warn(\"[zustand devtools middleware] along with `api.devtools`, `api.devtools.prefix` is deprecated.\\nWe no longer prefix the actions/names\" + devtoolsOptions.name === void 0 ? \", pass the `name` option to create a separate instance of devtools for each store.\" : \", because the `name` option already creates a separate instance of devtools for each store.\");\n          didWarnAboutPrefix = true;\n        }\n      }\n    });\n    let isRecording = true;\n    api.setState = (state, replace, nameOrAction) => {\n      set(state, replace);\n      if (!isRecording)\n        return;\n      extension.send(nameOrAction === void 0 ? { type: devtoolsOptions.anonymousActionType || \"anonymous\" } : typeof nameOrAction === \"string\" ? { type: nameOrAction } : nameOrAction, get());\n    };\n    const setStateFromDevtools = (...a) => {\n      const originalIsRecording = isRecording;\n      isRecording = false;\n      set(...a);\n      isRecording = originalIsRecording;\n    };\n    const initialState = fn(api.setState, get, api);\n    extension.init(initialState);\n    if (api.dispatchFromDevtools && typeof api.dispatch === \"function\") {\n      let didWarnAboutReservedActionType = false;\n      const originalDispatch = api.dispatch;\n      api.dispatch = (...a) => {\n        if (a[0].type === \"__setState\" && !didWarnAboutReservedActionType) {\n          console.warn('[zustand devtools middleware] \"__setState\" action type is reserved to set state from the devtools. Avoid using it.');\n          didWarnAboutReservedActionType = true;\n        }\n        originalDispatch(...a);\n      };\n    }\n    extension.subscribe((message) => {\n      var _a;\n      switch (message.type) {\n        case \"ACTION\":\n          if (typeof message.payload !== \"string\") {\n            console.error(\"[zustand devtools middleware] Unsupported action format\");\n            return;\n          }\n          return parseJsonThen(message.payload, (action) => {\n            if (action.type === \"__setState\") {\n              setStateFromDevtools(action.state);\n              return;\n            }\n            if (!api.dispatchFromDevtools)\n              return;\n            if (typeof api.dispatch !== \"function\")\n              return;\n            api.dispatch(action);\n          });\n        case \"DISPATCH\":\n          switch (message.payload.type) {\n            case \"RESET\":\n              setStateFromDevtools(initialState);\n              return extension.init(api.getState());\n            case \"COMMIT\":\n              return extension.init(api.getState());\n            case \"ROLLBACK\":\n              return parseJsonThen(message.state, (state) => {\n                setStateFromDevtools(state);\n                extension.init(api.getState());\n              });\n            case \"JUMP_TO_STATE\":\n            case \"JUMP_TO_ACTION\":\n              return parseJsonThen(message.state, (state) => {\n                setStateFromDevtools(state);\n              });\n            case \"IMPORT_STATE\": {\n              const { nextLiftedState } = message.payload;\n              const lastComputedState = (_a = nextLiftedState.computedStates.slice(-1)[0]) == null ? void 0 : _a.state;\n              if (!lastComputedState)\n                return;\n              setStateFromDevtools(lastComputedState);\n              extension.send(null, nextLiftedState);\n              return;\n            }\n            case \"PAUSE_RECORDING\":\n              return isRecording = !isRecording;\n          }\n          return;\n      }\n    });\n    return initialState;\n  };\n}\nconst parseJsonThen = (stringified, f) => {\n  let parsed;\n  try {\n    parsed = JSON.parse(stringified);\n  } catch (e) {\n    console.error(\"[zustand devtools middleware] Could not parse the received json\", e);\n  }\n  if (parsed !== void 0)\n    f(parsed);\n};\n\nconst subscribeWithSelector = (fn) => (set, get, api) => {\n  const origSubscribe = api.subscribe;\n  api.subscribe = (selector, optListener, options) => {\n    let listener = selector;\n    if (optListener) {\n      const equalityFn = (options == null ? void 0 : options.equalityFn) || Object.is;\n      let currentSlice = selector(api.getState());\n      listener = (state) => {\n        const nextSlice = selector(state);\n        if (!equalityFn(currentSlice, nextSlice)) {\n          const previousSlice = currentSlice;\n          optListener(currentSlice = nextSlice, previousSlice);\n        }\n      };\n      if (options == null ? void 0 : options.fireImmediately) {\n        optListener(currentSlice, currentSlice);\n      }\n    }\n    return origSubscribe(listener);\n  };\n  const initialState = fn(set, get, api);\n  return initialState;\n};\n\nconst combine = (initialState, create) => (set, get, api) => Object.assign({}, initialState, create(set, get, api));\n\nvar __defProp = Object.defineProperty;\nvar __getOwnPropSymbols = Object.getOwnPropertySymbols;\nvar __hasOwnProp = Object.prototype.hasOwnProperty;\nvar __propIsEnum = Object.prototype.propertyIsEnumerable;\nvar __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __spreadValues = (a, b) => {\n  for (var prop in b || (b = {}))\n    if (__hasOwnProp.call(b, prop))\n      __defNormalProp(a, prop, b[prop]);\n  if (__getOwnPropSymbols)\n    for (var prop of __getOwnPropSymbols(b)) {\n      if (__propIsEnum.call(b, prop))\n        __defNormalProp(a, prop, b[prop]);\n    }\n  return a;\n};\nconst toThenable = (fn) => (input) => {\n  try {\n    const result = fn(input);\n    if (result instanceof Promise) {\n      return result;\n    }\n    return {\n      then(onFulfilled) {\n        return toThenable(onFulfilled)(result);\n      },\n      catch(_onRejected) {\n        return this;\n      }\n    };\n  } catch (e) {\n    return {\n      then(_onFulfilled) {\n        return this;\n      },\n      catch(onRejected) {\n        return toThenable(onRejected)(e);\n      }\n    };\n  }\n};\nconst persist = (config, baseOptions) => (set, get, api) => {\n  let options = __spreadValues({\n    getStorage: () => localStorage,\n    serialize: JSON.stringify,\n    deserialize: JSON.parse,\n    partialize: (state) => state,\n    version: 0,\n    merge: (persistedState, currentState) => __spreadValues(__spreadValues({}, currentState), persistedState)\n  }, baseOptions);\n  if (options.blacklist || options.whitelist) {\n    console.warn(`The ${options.blacklist ? \"blacklist\" : \"whitelist\"} option is deprecated and will be removed in the next version. Please use the 'partialize' option instead.`);\n  }\n  let hasHydrated = false;\n  const hydrationListeners = /* @__PURE__ */ new Set();\n  const finishHydrationListeners = /* @__PURE__ */ new Set();\n  let storage;\n  try {\n    storage = options.getStorage();\n  } catch (e) {\n  }\n  if (!storage) {\n    return config((...args) => {\n      console.warn(`[zustand persist middleware] Unable to update item '${options.name}', the given storage is currently unavailable.`);\n      set(...args);\n    }, get, api);\n  } else if (!storage.removeItem) {\n    console.warn(`[zustand persist middleware] The given storage for item '${options.name}' does not contain a 'removeItem' method, which will be required in v4.`);\n  }\n  const thenableSerialize = toThenable(options.serialize);\n  const setItem = () => {\n    const state = options.partialize(__spreadValues({}, get()));\n    if (options.whitelist) {\n      Object.keys(state).forEach((key) => {\n        var _a;\n        !((_a = options.whitelist) == null ? void 0 : _a.includes(key)) && delete state[key];\n      });\n    }\n    if (options.blacklist) {\n      options.blacklist.forEach((key) => delete state[key]);\n    }\n    let errorInSync;\n    const thenable = thenableSerialize({ state, version: options.version }).then((serializedValue) => storage.setItem(options.name, serializedValue)).catch((e) => {\n      errorInSync = e;\n    });\n    if (errorInSync) {\n      throw errorInSync;\n    }\n    return thenable;\n  };\n  const savedSetState = api.setState;\n  api.setState = (state, replace) => {\n    savedSetState(state, replace);\n    void setItem();\n  };\n  const configResult = config((...args) => {\n    set(...args);\n    void setItem();\n  }, get, api);\n  let stateFromStorage;\n  const hydrate = () => {\n    var _a;\n    if (!storage)\n      return;\n    hasHydrated = false;\n    hydrationListeners.forEach((cb) => cb(get()));\n    const postRehydrationCallback = ((_a = options.onRehydrateStorage) == null ? void 0 : _a.call(options, get())) || void 0;\n    return toThenable(storage.getItem.bind(storage))(options.name).then((storageValue) => {\n      if (storageValue) {\n        return options.deserialize(storageValue);\n      }\n    }).then((deserializedStorageValue) => {\n      if (deserializedStorageValue) {\n        if (typeof deserializedStorageValue.version === \"number\" && deserializedStorageValue.version !== options.version) {\n          if (options.migrate) {\n            return options.migrate(deserializedStorageValue.state, deserializedStorageValue.version);\n          }\n          console.error(`State loaded from storage couldn't be migrated since no migrate function was provided`);\n        } else {\n          return deserializedStorageValue.state;\n        }\n      }\n    }).then((migratedState) => {\n      stateFromStorage = options.merge(migratedState, configResult);\n      set(stateFromStorage, true);\n      return setItem();\n    }).then(() => {\n      postRehydrationCallback == null ? void 0 : postRehydrationCallback(stateFromStorage, void 0);\n      hasHydrated = true;\n      finishHydrationListeners.forEach((cb) => cb(stateFromStorage));\n    }).catch((e) => {\n      postRehydrationCallback == null ? void 0 : postRehydrationCallback(void 0, e);\n    });\n  };\n  api.persist = {\n    setOptions: (newOptions) => {\n      options = __spreadValues(__spreadValues({}, options), newOptions);\n      if (newOptions.getStorage) {\n        storage = newOptions.getStorage();\n      }\n    },\n    clearStorage: () => {\n      var _a;\n      (_a = storage == null ? void 0 : storage.removeItem) == null ? void 0 : _a.call(storage, options.name);\n    },\n    rehydrate: () => hydrate(),\n    hasHydrated: () => hasHydrated,\n    onHydrate: (cb) => {\n      hydrationListeners.add(cb);\n      return () => {\n        hydrationListeners.delete(cb);\n      };\n    },\n    onFinishHydration: (cb) => {\n      finishHydrationListeners.add(cb);\n      return () => {\n        finishHydrationListeners.delete(cb);\n      };\n    }\n  };\n  hydrate();\n  return stateFromStorage || configResult;\n};\n\nexport { combine, devtools, persist, redux, subscribeWithSelector };\n","function n(n){for(var r=arguments.length,t=Array(r>1?r-1:0),e=1;e<r;e++)t[e-1]=arguments[e];if(\"production\"!==process.env.NODE_ENV){var i=Y[n],o=i?\"function\"==typeof i?i.apply(null,t):i:\"unknown error nr: \"+n;throw Error(\"[Immer] \"+o)}throw Error(\"[Immer] minified error nr: \"+n+(t.length?\" \"+t.map((function(n){return\"'\"+n+\"'\"})).join(\",\"):\"\")+\". Find the full error at: https://bit.ly/3cXEKWf\")}function r(n){return!!n&&!!n[Q]}function t(n){return!!n&&(function(n){if(!n||\"object\"!=typeof n)return!1;var r=Object.getPrototypeOf(n);if(null===r)return!0;var t=Object.hasOwnProperty.call(r,\"constructor\")&&r.constructor;return t===Object||\"function\"==typeof t&&Function.toString.call(t)===Z}(n)||Array.isArray(n)||!!n[L]||!!n.constructor[L]||s(n)||v(n))}function e(t){return r(t)||n(23,t),t[Q].t}function i(n,r,t){void 0===t&&(t=!1),0===o(n)?(t?Object.keys:nn)(n).forEach((function(e){t&&\"symbol\"==typeof e||r(e,n[e],n)})):n.forEach((function(t,e){return r(e,t,n)}))}function o(n){var r=n[Q];return r?r.i>3?r.i-4:r.i:Array.isArray(n)?1:s(n)?2:v(n)?3:0}function u(n,r){return 2===o(n)?n.has(r):Object.prototype.hasOwnProperty.call(n,r)}function a(n,r){return 2===o(n)?n.get(r):n[r]}function f(n,r,t){var e=o(n);2===e?n.set(r,t):3===e?(n.delete(r),n.add(t)):n[r]=t}function c(n,r){return n===r?0!==n||1/n==1/r:n!=n&&r!=r}function s(n){return X&&n instanceof Map}function v(n){return q&&n instanceof Set}function p(n){return n.o||n.t}function l(n){if(Array.isArray(n))return Array.prototype.slice.call(n);var r=rn(n);delete r[Q];for(var t=nn(r),e=0;e<t.length;e++){var i=t[e],o=r[i];!1===o.writable&&(o.writable=!0,o.configurable=!0),(o.get||o.set)&&(r[i]={configurable:!0,writable:!0,enumerable:o.enumerable,value:n[i]})}return Object.create(Object.getPrototypeOf(n),r)}function d(n,e){return void 0===e&&(e=!1),y(n)||r(n)||!t(n)?n:(o(n)>1&&(n.set=n.add=n.clear=n.delete=h),Object.freeze(n),e&&i(n,(function(n,r){return d(r,!0)}),!0),n)}function h(){n(2)}function y(n){return null==n||\"object\"!=typeof n||Object.isFrozen(n)}function b(r){var t=tn[r];return t||n(18,r),t}function m(n,r){tn[n]||(tn[n]=r)}function _(){return\"production\"===process.env.NODE_ENV||U||n(0),U}function j(n,r){r&&(b(\"Patches\"),n.u=[],n.s=[],n.v=r)}function O(n){g(n),n.p.forEach(S),n.p=null}function g(n){n===U&&(U=n.l)}function w(n){return U={p:[],l:U,h:n,m:!0,_:0}}function S(n){var r=n[Q];0===r.i||1===r.i?r.j():r.O=!0}function P(r,e){e._=e.p.length;var i=e.p[0],o=void 0!==r&&r!==i;return e.h.g||b(\"ES5\").S(e,r,o),o?(i[Q].P&&(O(e),n(4)),t(r)&&(r=M(e,r),e.l||x(e,r)),e.u&&b(\"Patches\").M(i[Q].t,r,e.u,e.s)):r=M(e,i,[]),O(e),e.u&&e.v(e.u,e.s),r!==H?r:void 0}function M(n,r,t){if(y(r))return r;var e=r[Q];if(!e)return i(r,(function(i,o){return A(n,e,r,i,o,t)}),!0),r;if(e.A!==n)return r;if(!e.P)return x(n,e.t,!0),e.t;if(!e.I){e.I=!0,e.A._--;var o=4===e.i||5===e.i?e.o=l(e.k):e.o;i(3===e.i?new Set(o):o,(function(r,i){return A(n,e,o,r,i,t)})),x(n,o,!1),t&&n.u&&b(\"Patches\").R(e,t,n.u,n.s)}return e.o}function A(e,i,o,a,c,s){if(\"production\"!==process.env.NODE_ENV&&c===o&&n(5),r(c)){var v=M(e,c,s&&i&&3!==i.i&&!u(i.D,a)?s.concat(a):void 0);if(f(o,a,v),!r(v))return;e.m=!1}if(t(c)&&!y(c)){if(!e.h.F&&e._<1)return;M(e,c),i&&i.A.l||x(e,c)}}function x(n,r,t){void 0===t&&(t=!1),n.h.F&&n.m&&d(r,t)}function z(n,r){var t=n[Q];return(t?p(t):n)[r]}function I(n,r){if(r in n)for(var t=Object.getPrototypeOf(n);t;){var e=Object.getOwnPropertyDescriptor(t,r);if(e)return e;t=Object.getPrototypeOf(t)}}function k(n){n.P||(n.P=!0,n.l&&k(n.l))}function E(n){n.o||(n.o=l(n.t))}function R(n,r,t){var e=s(r)?b(\"MapSet\").N(r,t):v(r)?b(\"MapSet\").T(r,t):n.g?function(n,r){var t=Array.isArray(n),e={i:t?1:0,A:r?r.A:_(),P:!1,I:!1,D:{},l:r,t:n,k:null,o:null,j:null,C:!1},i=e,o=en;t&&(i=[e],o=on);var u=Proxy.revocable(i,o),a=u.revoke,f=u.proxy;return e.k=f,e.j=a,f}(r,t):b(\"ES5\").J(r,t);return(t?t.A:_()).p.push(e),e}function D(e){return r(e)||n(22,e),function n(r){if(!t(r))return r;var e,u=r[Q],c=o(r);if(u){if(!u.P&&(u.i<4||!b(\"ES5\").K(u)))return u.t;u.I=!0,e=F(r,c),u.I=!1}else e=F(r,c);return i(e,(function(r,t){u&&a(u.t,r)===t||f(e,r,n(t))})),3===c?new Set(e):e}(e)}function F(n,r){switch(r){case 2:return new Map(n);case 3:return Array.from(n)}return l(n)}function N(){function t(n,r){var t=s[n];return t?t.enumerable=r:s[n]=t={configurable:!0,enumerable:r,get:function(){var r=this[Q];return\"production\"!==process.env.NODE_ENV&&f(r),en.get(r,n)},set:function(r){var t=this[Q];\"production\"!==process.env.NODE_ENV&&f(t),en.set(t,n,r)}},t}function e(n){for(var r=n.length-1;r>=0;r--){var t=n[r][Q];if(!t.P)switch(t.i){case 5:a(t)&&k(t);break;case 4:o(t)&&k(t)}}}function o(n){for(var r=n.t,t=n.k,e=nn(t),i=e.length-1;i>=0;i--){var o=e[i];if(o!==Q){var a=r[o];if(void 0===a&&!u(r,o))return!0;var f=t[o],s=f&&f[Q];if(s?s.t!==a:!c(f,a))return!0}}var v=!!r[Q];return e.length!==nn(r).length+(v?0:1)}function a(n){var r=n.k;if(r.length!==n.t.length)return!0;var t=Object.getOwnPropertyDescriptor(r,r.length-1);if(t&&!t.get)return!0;for(var e=0;e<r.length;e++)if(!r.hasOwnProperty(e))return!0;return!1}function f(r){r.O&&n(3,JSON.stringify(p(r)))}var s={};m(\"ES5\",{J:function(n,r){var e=Array.isArray(n),i=function(n,r){if(n){for(var e=Array(r.length),i=0;i<r.length;i++)Object.defineProperty(e,\"\"+i,t(i,!0));return e}var o=rn(r);delete o[Q];for(var u=nn(o),a=0;a<u.length;a++){var f=u[a];o[f]=t(f,n||!!o[f].enumerable)}return Object.create(Object.getPrototypeOf(r),o)}(e,n),o={i:e?5:4,A:r?r.A:_(),P:!1,I:!1,D:{},l:r,t:n,k:i,o:null,O:!1,C:!1};return Object.defineProperty(i,Q,{value:o,writable:!0}),i},S:function(n,t,o){o?r(t)&&t[Q].A===n&&e(n.p):(n.u&&function n(r){if(r&&\"object\"==typeof r){var t=r[Q];if(t){var e=t.t,o=t.k,f=t.D,c=t.i;if(4===c)i(o,(function(r){r!==Q&&(void 0!==e[r]||u(e,r)?f[r]||n(o[r]):(f[r]=!0,k(t)))})),i(e,(function(n){void 0!==o[n]||u(o,n)||(f[n]=!1,k(t))}));else if(5===c){if(a(t)&&(k(t),f.length=!0),o.length<e.length)for(var s=o.length;s<e.length;s++)f[s]=!1;else for(var v=e.length;v<o.length;v++)f[v]=!0;for(var p=Math.min(o.length,e.length),l=0;l<p;l++)o.hasOwnProperty(l)||(f[l]=!0),void 0===f[l]&&n(o[l])}}}}(n.p[0]),e(n.p))},K:function(n){return 4===n.i?o(n):a(n)}})}function T(){function e(n){if(!t(n))return n;if(Array.isArray(n))return n.map(e);if(s(n))return new Map(Array.from(n.entries()).map((function(n){return[n[0],e(n[1])]})));if(v(n))return new Set(Array.from(n).map(e));var r=Object.create(Object.getPrototypeOf(n));for(var i in n)r[i]=e(n[i]);return u(n,L)&&(r[L]=n[L]),r}function f(n){return r(n)?e(n):n}var c=\"add\";m(\"Patches\",{$:function(r,t){return t.forEach((function(t){for(var i=t.path,u=t.op,f=r,s=0;s<i.length-1;s++){var v=o(f),p=\"\"+i[s];0!==v&&1!==v||\"__proto__\"!==p&&\"constructor\"!==p||n(24),\"function\"==typeof f&&\"prototype\"===p&&n(24),\"object\"!=typeof(f=a(f,p))&&n(15,i.join(\"/\"))}var l=o(f),d=e(t.value),h=i[i.length-1];switch(u){case\"replace\":switch(l){case 2:return f.set(h,d);case 3:n(16);default:return f[h]=d}case c:switch(l){case 1:return\"-\"===h?f.push(d):f.splice(h,0,d);case 2:return f.set(h,d);case 3:return f.add(d);default:return f[h]=d}case\"remove\":switch(l){case 1:return f.splice(h,1);case 2:return f.delete(h);case 3:return f.delete(t.value);default:return delete f[h]}default:n(17,u)}})),r},R:function(n,r,t,e){switch(n.i){case 0:case 4:case 2:return function(n,r,t,e){var o=n.t,s=n.o;i(n.D,(function(n,i){var v=a(o,n),p=a(s,n),l=i?u(o,n)?\"replace\":c:\"remove\";if(v!==p||\"replace\"!==l){var d=r.concat(n);t.push(\"remove\"===l?{op:l,path:d}:{op:l,path:d,value:p}),e.push(l===c?{op:\"remove\",path:d}:\"remove\"===l?{op:c,path:d,value:f(v)}:{op:\"replace\",path:d,value:f(v)})}}))}(n,r,t,e);case 5:case 1:return function(n,r,t,e){var i=n.t,o=n.D,u=n.o;if(u.length<i.length){var a=[u,i];i=a[0],u=a[1];var s=[e,t];t=s[0],e=s[1]}for(var v=0;v<i.length;v++)if(o[v]&&u[v]!==i[v]){var p=r.concat([v]);t.push({op:\"replace\",path:p,value:f(u[v])}),e.push({op:\"replace\",path:p,value:f(i[v])})}for(var l=i.length;l<u.length;l++){var d=r.concat([l]);t.push({op:c,path:d,value:f(u[l])})}i.length<u.length&&e.push({op:\"replace\",path:r.concat([\"length\"]),value:i.length})}(n,r,t,e);case 3:return function(n,r,t,e){var i=n.t,o=n.o,u=0;i.forEach((function(n){if(!o.has(n)){var i=r.concat([u]);t.push({op:\"remove\",path:i,value:n}),e.unshift({op:c,path:i,value:n})}u++})),u=0,o.forEach((function(n){if(!i.has(n)){var o=r.concat([u]);t.push({op:c,path:o,value:n}),e.unshift({op:\"remove\",path:o,value:n})}u++}))}(n,r,t,e)}},M:function(n,r,t,e){t.push({op:\"replace\",path:[],value:r===H?void 0:r}),e.push({op:\"replace\",path:[],value:n})}})}function C(){function r(n,r){function t(){this.constructor=n}a(n,r),n.prototype=(t.prototype=r.prototype,new t)}function e(n){n.o||(n.D=new Map,n.o=new Map(n.t))}function o(n){n.o||(n.o=new Set,n.t.forEach((function(r){if(t(r)){var e=R(n.A.h,r,n);n.p.set(r,e),n.o.add(e)}else n.o.add(r)})))}function u(r){r.O&&n(3,JSON.stringify(p(r)))}var a=function(n,r){return(a=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(n,r){n.__proto__=r}||function(n,r){for(var t in r)r.hasOwnProperty(t)&&(n[t]=r[t])})(n,r)},f=function(){function n(n,r){return this[Q]={i:2,l:r,A:r?r.A:_(),P:!1,I:!1,o:void 0,D:void 0,t:n,k:this,C:!1,O:!1},this}r(n,Map);var o=n.prototype;return Object.defineProperty(o,\"size\",{get:function(){return p(this[Q]).size}}),o.has=function(n){return p(this[Q]).has(n)},o.set=function(n,r){var t=this[Q];return u(t),p(t).has(n)&&p(t).get(n)===r||(e(t),k(t),t.D.set(n,!0),t.o.set(n,r),t.D.set(n,!0)),this},o.delete=function(n){if(!this.has(n))return!1;var r=this[Q];return u(r),e(r),k(r),r.t.has(n)?r.D.set(n,!1):r.D.delete(n),r.o.delete(n),!0},o.clear=function(){var n=this[Q];u(n),p(n).size&&(e(n),k(n),n.D=new Map,i(n.t,(function(r){n.D.set(r,!1)})),n.o.clear())},o.forEach=function(n,r){var t=this;p(this[Q]).forEach((function(e,i){n.call(r,t.get(i),i,t)}))},o.get=function(n){var r=this[Q];u(r);var i=p(r).get(n);if(r.I||!t(i))return i;if(i!==r.t.get(n))return i;var o=R(r.A.h,i,r);return e(r),r.o.set(n,o),o},o.keys=function(){return p(this[Q]).keys()},o.values=function(){var n,r=this,t=this.keys();return(n={})[V]=function(){return r.values()},n.next=function(){var n=t.next();return n.done?n:{done:!1,value:r.get(n.value)}},n},o.entries=function(){var n,r=this,t=this.keys();return(n={})[V]=function(){return r.entries()},n.next=function(){var n=t.next();if(n.done)return n;var e=r.get(n.value);return{done:!1,value:[n.value,e]}},n},o[V]=function(){return this.entries()},n}(),c=function(){function n(n,r){return this[Q]={i:3,l:r,A:r?r.A:_(),P:!1,I:!1,o:void 0,t:n,k:this,p:new Map,O:!1,C:!1},this}r(n,Set);var t=n.prototype;return Object.defineProperty(t,\"size\",{get:function(){return p(this[Q]).size}}),t.has=function(n){var r=this[Q];return u(r),r.o?!!r.o.has(n)||!(!r.p.has(n)||!r.o.has(r.p.get(n))):r.t.has(n)},t.add=function(n){var r=this[Q];return u(r),this.has(n)||(o(r),k(r),r.o.add(n)),this},t.delete=function(n){if(!this.has(n))return!1;var r=this[Q];return u(r),o(r),k(r),r.o.delete(n)||!!r.p.has(n)&&r.o.delete(r.p.get(n))},t.clear=function(){var n=this[Q];u(n),p(n).size&&(o(n),k(n),n.o.clear())},t.values=function(){var n=this[Q];return u(n),o(n),n.o.values()},t.entries=function(){var n=this[Q];return u(n),o(n),n.o.entries()},t.keys=function(){return this.values()},t[V]=function(){return this.values()},t.forEach=function(n,r){for(var t=this.values(),e=t.next();!e.done;)n.call(r,e.value,e.value,this),e=t.next()},n}();m(\"MapSet\",{N:function(n,r){return new f(n,r)},T:function(n,r){return new c(n,r)}})}function J(){N(),C(),T()}function K(n){return n}function $(n){return n}var G,U,W=\"undefined\"!=typeof Symbol&&\"symbol\"==typeof Symbol(\"x\"),X=\"undefined\"!=typeof Map,q=\"undefined\"!=typeof Set,B=\"undefined\"!=typeof Proxy&&void 0!==Proxy.revocable&&\"undefined\"!=typeof Reflect,H=W?Symbol.for(\"immer-nothing\"):((G={})[\"immer-nothing\"]=!0,G),L=W?Symbol.for(\"immer-draftable\"):\"__$immer_draftable\",Q=W?Symbol.for(\"immer-state\"):\"__$immer_state\",V=\"undefined\"!=typeof Symbol&&Symbol.iterator||\"@@iterator\",Y={0:\"Illegal state\",1:\"Immer drafts cannot have computed properties\",2:\"This object has been frozen and should not be mutated\",3:function(n){return\"Cannot use a proxy that has been revoked. Did you pass an object from inside an immer function to an async process? \"+n},4:\"An immer producer returned a new value *and* modified its draft. Either return a new value *or* modify the draft.\",5:\"Immer forbids circular references\",6:\"The first or second argument to `produce` must be a function\",7:\"The third argument to `produce` must be a function or undefined\",8:\"First argument to `createDraft` must be a plain object, an array, or an immerable object\",9:\"First argument to `finishDraft` must be a draft returned by `createDraft`\",10:\"The given draft is already finalized\",11:\"Object.defineProperty() cannot be used on an Immer draft\",12:\"Object.setPrototypeOf() cannot be used on an Immer draft\",13:\"Immer only supports deleting array indices\",14:\"Immer only supports setting array indices and the 'length' property\",15:function(n){return\"Cannot apply patch, path doesn't resolve: \"+n},16:'Sets cannot have \"replace\" patches.',17:function(n){return\"Unsupported patch operation: \"+n},18:function(n){return\"The plugin for '\"+n+\"' has not been loaded into Immer. To enable the plugin, import and call `enable\"+n+\"()` when initializing your application.\"},20:\"Cannot use proxies if Proxy, Proxy.revocable or Reflect are not available\",21:function(n){return\"produce can only be called on things that are draftable: plain objects, arrays, Map, Set or classes that are marked with '[immerable]: true'. Got '\"+n+\"'\"},22:function(n){return\"'current' expects a draft, got: \"+n},23:function(n){return\"'original' expects a draft, got: \"+n},24:\"Patching reserved attributes like __proto__, prototype and constructor is not allowed\"},Z=\"\"+Object.prototype.constructor,nn=\"undefined\"!=typeof Reflect&&Reflect.ownKeys?Reflect.ownKeys:void 0!==Object.getOwnPropertySymbols?function(n){return Object.getOwnPropertyNames(n).concat(Object.getOwnPropertySymbols(n))}:Object.getOwnPropertyNames,rn=Object.getOwnPropertyDescriptors||function(n){var r={};return nn(n).forEach((function(t){r[t]=Object.getOwnPropertyDescriptor(n,t)})),r},tn={},en={get:function(n,r){if(r===Q)return n;var e=p(n);if(!u(e,r))return function(n,r,t){var e,i=I(r,t);return i?\"value\"in i?i.value:null===(e=i.get)||void 0===e?void 0:e.call(n.k):void 0}(n,e,r);var i=e[r];return n.I||!t(i)?i:i===z(n.t,r)?(E(n),n.o[r]=R(n.A.h,i,n)):i},has:function(n,r){return r in p(n)},ownKeys:function(n){return Reflect.ownKeys(p(n))},set:function(n,r,t){var e=I(p(n),r);if(null==e?void 0:e.set)return e.set.call(n.k,t),!0;if(!n.P){var i=z(p(n),r),o=null==i?void 0:i[Q];if(o&&o.t===t)return n.o[r]=t,n.D[r]=!1,!0;if(c(t,i)&&(void 0!==t||u(n.t,r)))return!0;E(n),k(n)}return n.o[r]===t&&\"number\"!=typeof t&&(void 0!==t||r in n.o)||(n.o[r]=t,n.D[r]=!0,!0)},deleteProperty:function(n,r){return void 0!==z(n.t,r)||r in n.t?(n.D[r]=!1,E(n),k(n)):delete n.D[r],n.o&&delete n.o[r],!0},getOwnPropertyDescriptor:function(n,r){var t=p(n),e=Reflect.getOwnPropertyDescriptor(t,r);return e?{writable:!0,configurable:1!==n.i||\"length\"!==r,enumerable:e.enumerable,value:t[r]}:e},defineProperty:function(){n(11)},getPrototypeOf:function(n){return Object.getPrototypeOf(n.t)},setPrototypeOf:function(){n(12)}},on={};i(en,(function(n,r){on[n]=function(){return arguments[0]=arguments[0][0],r.apply(this,arguments)}})),on.deleteProperty=function(r,t){return\"production\"!==process.env.NODE_ENV&&isNaN(parseInt(t))&&n(13),on.set.call(this,r,t,void 0)},on.set=function(r,t,e){return\"production\"!==process.env.NODE_ENV&&\"length\"!==t&&isNaN(parseInt(t))&&n(14),en.set.call(this,r[0],t,e,r[0])};var un=function(){function e(r){var e=this;this.g=B,this.F=!0,this.produce=function(r,i,o){if(\"function\"==typeof r&&\"function\"!=typeof i){var u=i;i=r;var a=e;return function(n){var r=this;void 0===n&&(n=u);for(var t=arguments.length,e=Array(t>1?t-1:0),o=1;o<t;o++)e[o-1]=arguments[o];return a.produce(n,(function(n){var t;return(t=i).call.apply(t,[r,n].concat(e))}))}}var f;if(\"function\"!=typeof i&&n(6),void 0!==o&&\"function\"!=typeof o&&n(7),t(r)){var c=w(e),s=R(e,r,void 0),v=!0;try{f=i(s),v=!1}finally{v?O(c):g(c)}return\"undefined\"!=typeof Promise&&f instanceof Promise?f.then((function(n){return j(c,o),P(n,c)}),(function(n){throw O(c),n})):(j(c,o),P(f,c))}if(!r||\"object\"!=typeof r){if(void 0===(f=i(r))&&(f=r),f===H&&(f=void 0),e.F&&d(f,!0),o){var p=[],l=[];b(\"Patches\").M(r,f,p,l),o(p,l)}return f}n(21,r)},this.produceWithPatches=function(n,r){if(\"function\"==typeof n)return function(r){for(var t=arguments.length,i=Array(t>1?t-1:0),o=1;o<t;o++)i[o-1]=arguments[o];return e.produceWithPatches(r,(function(r){return n.apply(void 0,[r].concat(i))}))};var t,i,o=e.produce(n,r,(function(n,r){t=n,i=r}));return\"undefined\"!=typeof Promise&&o instanceof Promise?o.then((function(n){return[n,t,i]})):[o,t,i]},\"boolean\"==typeof(null==r?void 0:r.useProxies)&&this.setUseProxies(r.useProxies),\"boolean\"==typeof(null==r?void 0:r.autoFreeze)&&this.setAutoFreeze(r.autoFreeze)}var i=e.prototype;return i.createDraft=function(e){t(e)||n(8),r(e)&&(e=D(e));var i=w(this),o=R(this,e,void 0);return o[Q].C=!0,g(i),o},i.finishDraft=function(r,t){var e=r&&r[Q];\"production\"!==process.env.NODE_ENV&&(e&&e.C||n(9),e.I&&n(10));var i=e.A;return j(i,t),P(void 0,i)},i.setAutoFreeze=function(n){this.F=n},i.setUseProxies=function(r){r&&!B&&n(20),this.g=r},i.applyPatches=function(n,t){var e;for(e=t.length-1;e>=0;e--){var i=t[e];if(0===i.path.length&&\"replace\"===i.op){n=i.value;break}}e>-1&&(t=t.slice(e+1));var o=b(\"Patches\").$;return r(n)?o(n,t):this.produce(n,(function(n){return o(n,t)}))},e}(),an=new un,fn=an.produce,cn=an.produceWithPatches.bind(an),sn=an.setAutoFreeze.bind(an),vn=an.setUseProxies.bind(an),pn=an.applyPatches.bind(an),ln=an.createDraft.bind(an),dn=an.finishDraft.bind(an);export default fn;export{un as Immer,pn as applyPatches,K as castDraft,$ as castImmutable,ln as createDraft,D as current,J as enableAllPlugins,N as enableES5,C as enableMapSet,T as enablePatches,dn as finishDraft,d as freeze,L as immerable,r as isDraft,t as isDraftable,H as nothing,e as original,fn as produce,cn as produceWithPatches,sn as setAutoFreeze,vn as setUseProxies};\n//# sourceMappingURL=immer.esm.js.map\n","export function lowerFirst(string: string): string {\n  if (!string) return '';\n  return string.charAt(0).toLowerCase() + string.slice(1);\n}\n","import deepmerge from 'deepmerge';\nimport {PixieConfig} from './default-config';\nimport {lowerFirst} from '../common/utils/string/lower-first';\n\nexport function mergeConfig(\n  userConfig: Partial<PixieConfig>,\n  currentConfig: PixieConfig\n): PixieConfig {\n  const merged = deepmerge(currentConfig, userConfig);\n  return replaceDefaultConfigItems(merged, userConfig) as PixieConfig;\n}\n\nfunction replaceDefaultConfigItems(\n  config: Record<string, any>,\n  userConfig: Record<string, any> | undefined\n) {\n  Object.keys(config).forEach(key => {\n    if (key.startsWith('replaceDefault') && config[key]) {\n      // \"replaceDefaultSamples\" => \"samples\" or just \"items\"\n      const iterablesKey = lowerFirst(\n        key.replace('replaceDefault', '') || 'items'\n      );\n      config[iterablesKey] = userConfig ? userConfig[iterablesKey] : [];\n      // remove passed in \"replaceDefaultItems\" option, so\n      // it does not cause issues on subsequent config merged\n      delete config[key];\n    } else if (typeof config[key] === 'object' && config[key] !== null) {\n      replaceDefaultConfigItems(config[key], userConfig?.[key]);\n    }\n  });\n  return config;\n}\n","import {castDraft} from 'immer';\nimport {HistoryItem} from '../history-item.interface';\nimport type {StoreSlice} from '../../../state/store';\n\nexport interface HistorySlice {\n  history: {\n    items: HistoryItem[];\n    pointer: number;\n    canUndo: boolean;\n    canRedo: boolean;\n    updatePointerById: (id: string) => void;\n    update: (pointer: number, items?: HistoryItem[]) => void;\n    reset: () => void;\n  };\n}\n\nexport const createHistorySlice: StoreSlice<HistorySlice> = (set, get) => ({\n  history: {\n    ...historySliceDefaults,\n    updatePointerById: id => {\n      const index = get().history.items.findIndex(i => i.id === id);\n      get().history.update(index);\n    },\n    update: (pointer, items) => {\n      set(state => {\n        state.history.pointer = pointer;\n        if (items) {\n          state.history.items = castDraft(items);\n        }\n        state.history.canUndo = state.history.pointer > 0;\n        state.history.canRedo =\n          state.history.items.length > state.history.pointer + 1;\n      });\n    },\n    reset: () => {\n      set({history: {...get().history, ...historySliceDefaults}});\n    },\n  },\n});\n\nconst historySliceDefaults = {\n  items: [],\n  pointer: 0,\n  canUndo: false,\n  canRedo: false,\n};\n","import {Canvas} from 'fabric/fabric-impl';\nimport type {Pixie} from '../pixie';\nimport type {PixieConfig} from '../config/default-config';\nimport type {PlainRect} from '../common/utils/dom/get-bounding-client-rect';\nimport type {ToolName} from '../tools/tool-name';\n\nexport type LoadingType = 'newCanvas' | 'mainImage' | 'state' | 'merge' | false;\n\nexport enum ActiveToolOverlay {\n  Filter = 'filter',\n  Frame = 'frame',\n  ActiveObject = 'activeObj',\n  Text = 'text',\n}\n\nexport type EditorState = {\n  editor: Pixie;\n  fabric: Canvas;\n  config: PixieConfig;\n  loading: LoadingType;\n  openPanels: {\n    newImage: boolean;\n    history: boolean;\n    objects: boolean;\n    export: boolean;\n  };\n  zoom: number;\n  // original width and height, either size of main image or user selected\n  original: {\n    width: number;\n    height: number;\n  };\n  stageSize: PlainRect;\n  canvasSize: PlainRect;\n  activeTool: ToolName | null;\n  activeToolOverlay: ActiveToolOverlay | null;\n  dirty: boolean;\n\n  // actions\n  cancelChanges: () => void;\n  applyChanges: () => void;\n  setZoom: (zoom: number) => void;\n  setOriginal: (width: number, height: number) => void;\n  setDirty: (isDirty: boolean) => void;\n  toggleLoading: (loading: LoadingType) => void;\n  setStageSize: (size: PlainRect) => void;\n  setCanvasSize: (size: PlainRect) => void;\n  togglePanel: (\n    name: keyof EditorState['openPanels'],\n    isOpen?: boolean\n  ) => void;\n  setActiveTool: (\n    tool: ToolName | null,\n    overlay: ActiveToolOverlay | null\n  ) => void;\n  setConfig: (partialConfig: Partial<PixieConfig>) => void;\n  reset: () => void;\n};\n","import type {StoreSlice} from '../../state/store';\nimport {ToolSlice} from '../../state/tool-slice';\nimport {ActiveToolOverlay} from '../../state/editor-state';\n\nexport interface FilterSlice {\n  filter: ToolSlice & {\n    selected: string | null;\n    applied: string[];\n    select: (selected: string, hasOptions?: boolean) => void;\n    deselect: (filterName: string) => void;\n  };\n}\n\nexport const createFilterSlice: StoreSlice<FilterSlice> = (set, get) => ({\n  filter: {\n    ...filterSliceDefaults,\n    select(filterName, hasOptions = false) {\n      set(state => {\n        state.filter.selected = filterName;\n        state.activeToolOverlay = hasOptions ? ActiveToolOverlay.Filter : null;\n        state.dirty = true;\n      });\n    },\n    deselect(filterName: string) {\n      if (get().filter.selected === filterName) {\n        set(state => {\n          state.filter.selected = null;\n          state.activeToolOverlay = null;\n          state.dirty = true;\n        });\n      }\n    },\n    reset() {\n      set({filter: {...get().filter, ...filterSliceDefaults}});\n    },\n  },\n});\n\nconst filterSliceDefaults = {\n  selected: null,\n  applied: [],\n};\n","import type {InteractableRect} from '../../common/ui/interactions/interactable-rect';\nimport type {StoreSlice} from '../../state/store';\nimport {ToolSlice} from '../../state/tool-slice';\n\nexport interface CropSlice {\n  crop: ToolSlice & {\n    zoneRect: InteractableRect | null;\n    selectedAspectRatio: string | null;\n    straightenAngle: number;\n\n    setCropzoneRect: (rect: InteractableRect) => void;\n    setAspectRatio: (ratio: string | null) => void;\n    setTransformAngle: (angle: number) => void;\n  };\n}\n\nexport const createCropSlice: StoreSlice<CropSlice> = (set, get) => ({\n  crop: {\n    ...cropSliceDefaults,\n    setCropzoneRect: rect => {\n      set(state => {\n        state.crop.zoneRect = rect;\n      });\n    },\n    setAspectRatio: ratio => {\n      set(state => {\n        state.crop.selectedAspectRatio = ratio;\n      });\n    },\n    setTransformAngle: angle => {\n      set(state => {\n        state.crop.straightenAngle = angle;\n      });\n    },\n    apply: async () => {\n      const rect = get().crop.zoneRect;\n      if (rect) {\n        const scaledRect = {\n          width: Math.ceil(rect.width / get().zoom),\n          height: Math.ceil(rect.height / get().zoom),\n          left: Math.ceil(rect.left / get().zoom),\n          top: Math.ceil(rect.top / get().zoom),\n        };\n        await get().editor.tools.crop.apply(scaledRect);\n      }\n    },\n    reset: () => {\n      set({crop: {...get().crop, ...cropSliceDefaults}});\n    },\n  },\n});\n\nconst cropSliceDefaults = {\n  zoneRect: null,\n  selectedAspectRatio: null,\n  straightenAngle: 0,\n};\n","import {IObjectOptions, IText, Object} from 'fabric/fabric-impl';\n\nexport function isText(\n  obj: Object | IObjectOptions | null | undefined\n): obj is IText {\n  return obj?.type === 'i-text';\n}\n","import {defineMessage} from 'react-intl';\nimport {HISTORY_DISPLAY_NAMES} from '../tools/history/history-display-names';\n\nexport enum ObjectName {\n  Text = 'text',\n  Shape = 'shape',\n  Sticker = 'sticker',\n  Drawing = 'drawing',\n  Image = 'image',\n  MainImage = 'mainImage',\n  StraightenAnchor = 'straightenHelper',\n}\n\nexport const OBJ_DISPLAY_NAMES = {\n  [ObjectName.Text]: {\n    name: defineMessage({defaultMessage: 'Text'}),\n    icon: HISTORY_DISPLAY_NAMES.text.icon,\n  },\n  [ObjectName.Shape]: {\n    name: defineMessage({defaultMessage: 'Shape'}),\n    icon: HISTORY_DISPLAY_NAMES.shapes.icon,\n  },\n  [ObjectName.Sticker]: {\n    name: defineMessage({defaultMessage: 'Sticker'}),\n    icon: HISTORY_DISPLAY_NAMES.stickers.icon,\n  },\n  [ObjectName.Drawing]: {\n    name: defineMessage({defaultMessage: 'Drawing'}),\n    icon: HISTORY_DISPLAY_NAMES.draw.icon,\n  },\n  [ObjectName.Image]: {\n    name: defineMessage({defaultMessage: 'Image'}),\n    icon: HISTORY_DISPLAY_NAMES.overlayImage.icon,\n  },\n  [ObjectName.MainImage]: {\n    name: defineMessage({defaultMessage: 'Background Image'}),\n    icon: HISTORY_DISPLAY_NAMES.bgImage.icon,\n  },\n};\n","import {Image, Object} from 'fabric/fabric-impl';\nimport {ObjectName} from '../object-name';\n\nexport function isImage(obj: Object): obj is Image {\n  return obj.name === ObjectName.Image;\n}\n","import type {ObjectsSlice} from './objects-slice';\n\nexport const DEFAULT_ACTIVE_OBJ_PROPS: ObjectsSlice['objects']['active'] = {\n  isMoving: false,\n  editableProps: {},\n  id: null,\n  isText: false,\n  isImage: false,\n  name: null,\n};\n","import {Object, Shadow} from 'fabric/fabric-impl';\nimport {isText} from '../utils/is-text';\nimport {EditableObjProps} from './editable-obj-props';\nimport {TextAlign} from './text-align';\n\nexport function fabricObjToState(obj: Object): EditableObjProps {\n  if (!obj) return {};\n\n  const props: EditableObjProps = {\n    fill: obj.fill,\n    opacity: obj.opacity,\n    backgroundColor: obj.backgroundColor,\n    stroke: obj.stroke,\n    strokeWidth: obj.strokeWidth,\n  };\n\n  const shadow = obj.shadow as Shadow | null;\n  if (shadow) {\n    props.shadow = {\n      color: shadow.color,\n      blur: shadow.blur,\n      offsetX: shadow.offsetX,\n      offsetY: shadow.offsetY,\n    };\n  }\n\n  if (isText(obj)) {\n    props.textAlign = obj.textAlign as TextAlign;\n    props.underline = obj.underline;\n    props.linethrough = obj.linethrough;\n    props.fontStyle = obj.fontStyle;\n    props.fontFamily = obj.fontFamily;\n    props.fontWeight = obj.fontWeight;\n    props.fontSize = obj.fontSize;\n  }\n\n  return props;\n}\n","import {Object} from 'fabric/fabric-impl';\nimport {castDraft} from 'immer';\nimport type {StoreSlice} from '../../state/store';\nimport {isText} from '../utils/is-text';\nimport {ObjectName} from '../object-name';\nimport {isImage} from '../utils/is-image';\nimport {DEFAULT_ACTIVE_OBJ_PROPS} from './default-active-obj-props';\nimport {fabricObjToState} from './fabric-obj-to-state';\nimport type {EditableObjProps} from './editable-obj-props';\nimport {PartialObject} from './partial-object';\n\nexport interface ObjectsSlice {\n  objects: {\n    all: PartialObject[];\n    isEditingText: boolean;\n    active: {\n      id: string | null;\n      isText: boolean;\n      isImage: boolean;\n      editableProps: Partial<EditableObjProps>;\n      isMoving: boolean;\n      name: ObjectName | null;\n    };\n\n    setActive: (obj: Object | null) => void;\n    setActiveIsMoving: (value: boolean) => void;\n    setIsEditingText: (value: boolean) => void;\n    reset: () => void;\n  };\n}\n\nexport const createObjectsSlice: StoreSlice<ObjectsSlice> = (set, get) => ({\n  objects: {\n    ...objectsSliceDefaults,\n    setActiveIsMoving: (value: boolean) => {\n      set(state => {\n        state.objects.active.isMoving = value;\n      });\n    },\n    setIsEditingText: (value: boolean) => {\n      set(state => {\n        state.objects.isEditingText = value;\n      });\n    },\n    setActive: obj => {\n      if (obj) {\n        set(state => {\n          state.objects.active.editableProps = castDraft(fabricObjToState(obj));\n          state.objects.active.id = obj.data.id;\n          state.objects.active.name = (obj.name as ObjectName) ?? null;\n          state.objects.active.isText = isText(obj);\n          state.objects.active.isImage = isImage(obj);\n        });\n      } else {\n        set(state => {\n          const defaultEditableProps = {\n            ...get().config.objectDefaults?.global,\n            fontFamily: get().config.objectDefaults?.text?.fontFamily,\n            fontSize: get().config.objectDefaults?.text?.fontSize,\n          };\n          state.objects.active = {\n            ...DEFAULT_ACTIVE_OBJ_PROPS,\n            editableProps: defaultEditableProps,\n          };\n        });\n      }\n    },\n    reset() {\n      set({objects: {...get().objects, ...objectsSliceDefaults}});\n    },\n  },\n});\n\nconst objectsSliceDefaults = {\n  all: [],\n  isEditingText: false,\n  active: DEFAULT_ACTIVE_OBJ_PROPS,\n};\n","import type {StoreSlice} from '../../state/store';\nimport {Frame} from './frame';\nimport {ToolSlice} from '../../state/tool-slice';\nimport {ToolName} from '../tool-name';\nimport {ActiveToolOverlay} from '../../state/editor-state';\n\nexport interface FrameSlice {\n  frame: ToolSlice & {\n    active: Frame | null;\n    select: (frame: Frame) => void;\n    deselect: () => void;\n    showOptionsPanel: () => void;\n  };\n}\n\nexport const createFrameSlice: StoreSlice<FrameSlice> = (set, get) => ({\n  frame: {\n    ...frameSliceDefaults,\n    select: frame => {\n      set(state => {\n        state.frame.active = frame;\n      });\n      get().frame.showOptionsPanel();\n    },\n    deselect: () => {\n      set(state => {\n        state.frame.active = null;\n        state.activeToolOverlay = null;\n      });\n    },\n    showOptionsPanel: () => {\n      if (get().activeTool === ToolName.FRAME) {\n        set(state => {\n          state.activeToolOverlay = ActiveToolOverlay.Frame;\n        });\n      }\n    },\n    reset() {\n      set({frame: {...get().frame, ...frameSliceDefaults}});\n    },\n  },\n});\n\nconst frameSliceDefaults = {\n  active: null,\n};\n","import type {StoreSlice} from '../../../state/store';\nimport {ToolSlice} from '../../../state/tool-slice';\n\ninterface ResizeFormValue {\n  width: number;\n  height: number;\n  maintainAspect: boolean;\n  usePercentages: boolean;\n}\n\nexport interface ResizeSlice {\n  resize: ToolSlice & {\n    formValue: ResizeFormValue;\n    setFormValue: (val: Partial<ResizeFormValue>) => void;\n    reset: () => void;\n  };\n}\n\nexport const createResizeSlice: StoreSlice<ResizeSlice> = (set, get) => ({\n  resize: {\n    ...resizeSliceDefaults,\n    setFormValue: value => {\n      set(state => {\n        Object.entries(value).forEach(([k, v]) => {\n          // @ts-ignore\n          state.resize.formValue[k] = v;\n        });\n      });\n    },\n    apply() {\n      const newSize = get().resize.formValue;\n      const oldSize = get().original;\n      // no need to add history item if we did not apply resize\n      if (\n        newSize.width === oldSize.width &&\n        newSize.height === oldSize.height\n      ) {\n        return false;\n      }\n      get().editor.tools.resize.apply(newSize);\n    },\n    reset() {\n      set({resize: {...get().resize, ...resizeSliceDefaults}});\n    },\n  },\n});\n\nconst resizeSliceDefaults = {\n  formValue: {\n    width: 1,\n    height: 1,\n    maintainAspect: true,\n    usePercentages: false,\n  },\n};\n","import {ToolSlice} from '../../state/tool-slice';\nimport type {StoreSlice} from '../../state/store';\n\nexport interface CornersSlice {\n  corners: ToolSlice & {\n    radius: number;\n    setRadius: (radius: number) => void;\n  };\n}\n\nexport const createCornersSlice: StoreSlice<CornersSlice> = (set, get) => ({\n  corners: {\n    ...cornerSliceDefaults,\n    setRadius: newRadius => {\n      set(s => {\n        s.corners.radius = newRadius;\n      });\n    },\n    apply() {\n      return get().editor.tools.corners.apply(get().corners.radius);\n    },\n    reset() {\n      set({corners: {...get().corners, ...cornerSliceDefaults}});\n    },\n  },\n});\n\nconst cornerSliceDefaults = {\n  radius: 50,\n};\n","import create, {\n  GetState,\n  SetState,\n  State,\n  StateCreator,\n  StoreApi,\n} from 'zustand';\nimport {\n  StoreApiWithSubscribeWithSelector,\n  subscribeWithSelector,\n} from 'zustand/middleware';\nimport produce, {castDraft, Draft} from 'immer';\nimport {DEFAULT_CONFIG} from '../config/default-config';\nimport {mergeConfig} from '../config/merge-config';\nimport {\n  createHistorySlice,\n  HistorySlice,\n} from '../tools/history/state/history-slice';\nimport {createFilterSlice, FilterSlice} from '../tools/filter/filter-slice';\nimport {createCropSlice, CropSlice} from '../tools/crop/crop-slice';\nimport {createObjectsSlice, ObjectsSlice} from '../objects/state/objects-slice';\nimport {PlainRect} from '../common/utils/dom/get-bounding-client-rect';\nimport {createFrameSlice, FrameSlice} from '../tools/frame/frame-slice';\nimport {\n  createResizeSlice,\n  ResizeSlice,\n} from '../tools/resize/state/resize-slice';\nimport {EditorState} from './editor-state';\nimport {CornersSlice, createCornersSlice} from '../tools/corners/corners-slice';\n\nexport type StoreSlice<T> = (\n  set: (\n    partial: ((draft: Draft<PixieState>) => void) | Partial<PixieState>,\n    replace?: boolean\n  ) => void,\n  get: GetState<PixieState>\n) => T;\n\nexport type PixieState = EditorState &\n  HistorySlice &\n  ObjectsSlice &\n  FilterSlice &\n  CropSlice &\n  FrameSlice &\n  ResizeSlice &\n  CornersSlice;\n\nconst EMPTY_PLAIN_RECT: PlainRect = {\n  top: 0,\n  right: 0,\n  bottom: 0,\n  left: 0,\n  width: 0,\n  height: 0,\n};\n\nconst immer =\n  <\n    T extends State,\n    CustomSetState extends SetState<T>,\n    CustomGetState extends GetState<T>,\n    CustomStoreApi extends StoreApi<T>\n  >(\n    config: StateCreator<\n      T,\n      (\n        partial: ((draft: Draft<T>) => void) | Partial<T>,\n        replace?: boolean\n      ) => void,\n      CustomGetState,\n      CustomStoreApi\n    >\n  ): StateCreator<T, CustomSetState, CustomGetState, CustomStoreApi> =>\n  (set, get, api) =>\n    config(\n      (partial, replace) => {\n        const nextState =\n          typeof partial === 'function'\n            ? produce(partial as (state: Draft<T>) => T)\n            : (partial as T);\n        return set(nextState, replace);\n      },\n      get,\n      api\n    );\n\nexport const useStore = create<\n  PixieState,\n  SetState<PixieState>,\n  GetState<PixieState>,\n  StoreApiWithSubscribeWithSelector<PixieState>\n>(\n  subscribeWithSelector(\n    immer((set, get) => ({\n      editor: null!,\n      fabric: null!,\n      config: DEFAULT_CONFIG,\n      zoom: 1,\n      dirty: false,\n      original: {\n        width: 1,\n        height: 1,\n      },\n      stageSize: EMPTY_PLAIN_RECT,\n      canvasSize: EMPTY_PLAIN_RECT,\n      activeTool: null,\n      activeToolOverlay: null,\n      loading: false,\n      openPanels: {\n        newImage: false,\n        history: false,\n        objects: false,\n        export: false,\n      },\n      ...createHistorySlice(set, get),\n      ...createObjectsSlice(set, get),\n      ...createFilterSlice(set, get),\n      ...createCropSlice(set, get),\n      ...createFrameSlice(set, get),\n      ...createResizeSlice(set, get),\n      ...createCornersSlice(set, get),\n\n      // actions\n      setZoom: newZoom =>\n        set(state => {\n          state.zoom = newZoom;\n        }),\n      setOriginal: (width, height) =>\n        set(state => {\n          state.original = {width, height};\n        }),\n      setDirty: isDirty =>\n        set(state => {\n          state.dirty = isDirty;\n        }),\n      toggleLoading: isLoading =>\n        set(state => {\n          state.loading = isLoading;\n        }),\n      setStageSize: size =>\n        set(state => {\n          state.stageSize = size;\n        }),\n      setCanvasSize: size =>\n        set(state => {\n          state.canvasSize = size;\n        }),\n      setActiveTool: (toolName, overlay) =>\n        set(state => {\n          state.activeTool = toolName;\n          state.activeToolOverlay = overlay;\n        }),\n      setConfig: partialConfig =>\n        set(state => {\n          state.config = castDraft(mergeConfig(partialConfig, get().config));\n        }),\n      togglePanel: (panelName, isOpen) =>\n        set(state => {\n          state.openPanels[panelName] = isOpen ?? !state.openPanels[panelName];\n        }),\n\n      applyChanges: async () => {\n        const activeToolName = get().activeTool;\n        if (!activeToolName) return;\n\n        // @ts-ignore\n        const toolSlice = get()[activeToolName];\n\n        const result = await toolSlice?.apply?.();\n\n        set(state => {\n          state.dirty = false;\n          state.activeTool = null;\n          state.activeToolOverlay = null;\n        });\n\n        // allow tools to prevent history item addition\n        if (result !== false) {\n          get().editor.tools.history.addHistoryItem({name: activeToolName});\n        }\n\n        toolSlice?.reset();\n      },\n      cancelChanges: async () => {\n        const activeToolName = get().activeTool;\n        if (!activeToolName) return;\n\n        const wasDirty = get().dirty;\n\n        set(state => {\n          state.dirty = false;\n          state.activeTool = null;\n          state.activeToolOverlay = null;\n        });\n\n        if (wasDirty) {\n          await get().editor.tools.history.reload();\n        }\n\n        // @ts-ignore\n        const toolSlice = get()[activeToolName];\n\n        // run reset after history is loaded so too state can perform any needed changes.\n        // Removing straighten anchor for example.\n        toolSlice?.reset();\n      },\n      reset: () => {\n        get().editor.tools.transform.resetStraightenAnchor();\n        set({\n          activeTool: null,\n          activeToolOverlay: null,\n          zoom: 1,\n          dirty: false,\n          loading: false,\n          openPanels: {\n            newImage: false,\n            history: false,\n            objects: false,\n            export: false,\n          },\n        });\n        get().history.reset();\n        get().objects.reset();\n        get().filter.reset();\n        get().crop.reset();\n        get().frame.reset();\n        get().resize.reset();\n        get().corners.reset();\n      },\n    }))\n  )\n);\n","var createDefinition = function (propNames) { return ({\n    isEnabled: function (props) { return propNames.some(function (name) { return !!props[name]; }); },\n}); };\nvar featureDefinitions = {\n    measureLayout: createDefinition([\"layout\", \"layoutId\", \"drag\"]),\n    animation: createDefinition([\n        \"animate\",\n        \"exit\",\n        \"variants\",\n        \"whileHover\",\n        \"whileTap\",\n        \"whileFocus\",\n        \"whileDrag\",\n        \"whileInView\",\n    ]),\n    exit: createDefinition([\"exit\"]),\n    drag: createDefinition([\"drag\", \"dragControls\"]),\n    focus: createDefinition([\"whileFocus\"]),\n    hover: createDefinition([\"whileHover\", \"onHoverStart\", \"onHoverEnd\"]),\n    tap: createDefinition([\"whileTap\", \"onTap\", \"onTapStart\", \"onTapCancel\"]),\n    pan: createDefinition([\n        \"onPan\",\n        \"onPanStart\",\n        \"onPanSessionStart\",\n        \"onPanEnd\",\n    ]),\n    inView: createDefinition([\n        \"whileInView\",\n        \"onViewportEnter\",\n        \"onViewportLeave\",\n    ]),\n};\nfunction loadFeatures(features) {\n    for (var key in features) {\n        if (features[key] === null)\n            continue;\n        if (key === \"projectionNodeConstructor\") {\n            featureDefinitions.projectionNodeConstructor = features[key];\n        }\n        else {\n            featureDefinitions[key].Component = features[key];\n        }\n    }\n}\n\nexport { featureDefinitions, loadFeatures };\n","var warning = function () { };\r\nvar invariant = function () { };\r\nif (process.env.NODE_ENV !== 'production') {\r\n    warning = function (check, message) {\r\n        if (!check && typeof console !== 'undefined') {\r\n            console.warn(message);\r\n        }\r\n    };\r\n    invariant = function (check, message) {\r\n        if (!check) {\r\n            throw new Error(message);\r\n        }\r\n    };\r\n}\n\nexport { invariant, warning };\n","import { createContext } from 'react';\n\nvar LazyContext = createContext({ strict: false });\n\nexport { LazyContext };\n","import { __assign } from 'tslib';\nimport * as React from 'react';\nimport { useContext } from 'react';\nimport { featureDefinitions } from './definitions.mjs';\nimport { invariant } from 'hey-listen';\nimport { LazyContext } from '../../context/LazyContext.mjs';\n\nvar featureNames = Object.keys(featureDefinitions);\nvar numFeatures = featureNames.length;\n/**\n * Load features via renderless components based on the provided MotionProps.\n */\nfunction useFeatures(props, visualElement, preloadedFeatures) {\n    var features = [];\n    var lazyContext = useContext(LazyContext);\n    if (!visualElement)\n        return null;\n    /**\n     * If we're in development mode, check to make sure we're not rendering a motion component\n     * as a child of LazyMotion, as this will break the file-size benefits of using it.\n     */\n    if (process.env.NODE_ENV !== \"production\" &&\n        preloadedFeatures &&\n        lazyContext.strict) {\n        invariant(false, \"You have rendered a `motion` component within a `LazyMotion` component. This will break tree shaking. Import and render a `m` component instead.\");\n    }\n    for (var i = 0; i < numFeatures; i++) {\n        var name_1 = featureNames[i];\n        var _a = featureDefinitions[name_1], isEnabled = _a.isEnabled, Component = _a.Component;\n        /**\n         * It might be possible in the future to use this moment to\n         * dynamically request functionality. In initial tests this\n         * was producing a lot of duplication amongst bundles.\n         */\n        if (isEnabled(props) && Component) {\n            features.push(React.createElement(Component, __assign({ key: name_1 }, props, { visualElement: visualElement })));\n        }\n    }\n    return features;\n}\n\nexport { useFeatures };\n","import { createContext } from 'react';\n\n/**\n * @public\n */\nvar MotionConfigContext = createContext({\n    transformPagePoint: function (p) { return p; },\n    isStatic: false,\n});\n\nexport { MotionConfigContext };\n","import { createContext, useContext } from 'react';\n\nvar MotionContext = createContext({});\nfunction useVisualElementContext() {\n    return useContext(MotionContext).visualElement;\n}\n\nexport { MotionContext, useVisualElementContext };\n","import { createContext } from 'react';\n\n/**\n * @public\n */\nvar PresenceContext = createContext(null);\n\nexport { PresenceContext };\n","var isBrowser = typeof window !== \"undefined\";\n\nexport { isBrowser };\n","import { useLayoutEffect, useEffect } from 'react';\nimport { isBrowser } from './is-browser.mjs';\n\nvar useIsomorphicLayoutEffect = isBrowser ? useLayoutEffect : useEffect;\n\nexport { useIsomorphicLayoutEffect };\n","import { useContext, useRef, useEffect } from 'react';\nimport { PresenceContext } from '../../context/PresenceContext.mjs';\nimport { useVisualElementContext } from '../../context/MotionContext/index.mjs';\nimport { useIsomorphicLayoutEffect } from '../../utils/use-isomorphic-effect.mjs';\nimport { LazyContext } from '../../context/LazyContext.mjs';\n\nfunction useVisualElement(Component, visualState, props, createVisualElement) {\n    var lazyContext = useContext(LazyContext);\n    var parent = useVisualElementContext();\n    var presenceContext = useContext(PresenceContext);\n    var visualElementRef = useRef(undefined);\n    /**\n     * If we haven't preloaded a renderer, check to see if we have one lazy-loaded\n     */\n    if (!createVisualElement)\n        createVisualElement = lazyContext.renderer;\n    if (!visualElementRef.current && createVisualElement) {\n        visualElementRef.current = createVisualElement(Component, {\n            visualState: visualState,\n            parent: parent,\n            props: props,\n            presenceId: presenceContext === null || presenceContext === void 0 ? void 0 : presenceContext.id,\n            blockInitialAnimation: (presenceContext === null || presenceContext === void 0 ? void 0 : presenceContext.initial) === false,\n        });\n    }\n    var visualElement = visualElementRef.current;\n    useIsomorphicLayoutEffect(function () {\n        visualElement === null || visualElement === void 0 ? void 0 : visualElement.syncRender();\n    });\n    useEffect(function () {\n        var _a;\n        (_a = visualElement === null || visualElement === void 0 ? void 0 : visualElement.animationState) === null || _a === void 0 ? void 0 : _a.animateChanges();\n    });\n    useIsomorphicLayoutEffect(function () { return function () { return visualElement === null || visualElement === void 0 ? void 0 : visualElement.notifyUnmount(); }; }, []);\n    return visualElement;\n}\n\nexport { useVisualElement };\n","function isRefObject(ref) {\n    return (typeof ref === \"object\" &&\n        Object.prototype.hasOwnProperty.call(ref, \"current\"));\n}\n\nexport { isRefObject };\n","import { useCallback } from 'react';\nimport { isRefObject } from '../../utils/is-ref-object.mjs';\n\n/**\n * Creates a ref function that, when called, hydrates the provided\n * external ref and VisualElement.\n */\nfunction useMotionRef(visualState, visualElement, externalRef) {\n    return useCallback(function (instance) {\n        var _a;\n        instance && ((_a = visualState.mount) === null || _a === void 0 ? void 0 : _a.call(visualState, instance));\n        if (visualElement) {\n            instance\n                ? visualElement.mount(instance)\n                : visualElement.unmount();\n        }\n        if (externalRef) {\n            if (typeof externalRef === \"function\") {\n                externalRef(instance);\n            }\n            else if (isRefObject(externalRef)) {\n                externalRef.current = instance;\n            }\n        }\n    }, \n    /**\n     * Only pass a new ref callback to React if we've received a visual element\n     * factory. Otherwise we'll be mounting/remounting every time externalRef\n     * or other dependencies change.\n     */\n    [visualElement]);\n}\n\nexport { useMotionRef };\n","/**\n * Decides if the supplied variable is an array of variant labels\n */\nfunction isVariantLabels(v) {\n    return Array.isArray(v);\n}\n/**\n * Decides if the supplied variable is variant label\n */\nfunction isVariantLabel(v) {\n    return typeof v === \"string\" || isVariantLabels(v);\n}\n/**\n * Creates an object containing the latest state of every MotionValue on a VisualElement\n */\nfunction getCurrent(visualElement) {\n    var current = {};\n    visualElement.forEachValue(function (value, key) { return (current[key] = value.get()); });\n    return current;\n}\n/**\n * Creates an object containing the latest velocity of every MotionValue on a VisualElement\n */\nfunction getVelocity(visualElement) {\n    var velocity = {};\n    visualElement.forEachValue(function (value, key) { return (velocity[key] = value.getVelocity()); });\n    return velocity;\n}\nfunction resolveVariantFromProps(props, definition, custom, currentValues, currentVelocity) {\n    var _a;\n    if (currentValues === void 0) { currentValues = {}; }\n    if (currentVelocity === void 0) { currentVelocity = {}; }\n    /**\n     * If the variant definition is a function, resolve.\n     */\n    if (typeof definition === \"function\") {\n        definition = definition(custom !== null && custom !== void 0 ? custom : props.custom, currentValues, currentVelocity);\n    }\n    /**\n     * If the variant definition is a variant label, or\n     * the function returned a variant label, resolve.\n     */\n    if (typeof definition === \"string\") {\n        definition = (_a = props.variants) === null || _a === void 0 ? void 0 : _a[definition];\n    }\n    /**\n     * At this point we've resolved both functions and variant labels,\n     * but the resolved variant label might itself have been a function.\n     * If so, resolve. This can only have returned a valid target object.\n     */\n    if (typeof definition === \"function\") {\n        definition = definition(custom !== null && custom !== void 0 ? custom : props.custom, currentValues, currentVelocity);\n    }\n    return definition;\n}\nfunction resolveVariant(visualElement, definition, custom) {\n    var props = visualElement.getProps();\n    return resolveVariantFromProps(props, definition, custom !== null && custom !== void 0 ? custom : props.custom, getCurrent(visualElement), getVelocity(visualElement));\n}\nfunction checkIfControllingVariants(props) {\n    var _a;\n    return (typeof ((_a = props.animate) === null || _a === void 0 ? void 0 : _a.start) === \"function\" ||\n        isVariantLabel(props.initial) ||\n        isVariantLabel(props.animate) ||\n        isVariantLabel(props.whileHover) ||\n        isVariantLabel(props.whileDrag) ||\n        isVariantLabel(props.whileTap) ||\n        isVariantLabel(props.whileFocus) ||\n        isVariantLabel(props.exit));\n}\nfunction checkIfVariantNode(props) {\n    return Boolean(checkIfControllingVariants(props) || props.variants);\n}\n\nexport { checkIfControllingVariants, checkIfVariantNode, isVariantLabel, isVariantLabels, resolveVariant, resolveVariantFromProps };\n","import { checkIfControllingVariants, isVariantLabel } from '../../render/utils/variants.mjs';\n\nfunction getCurrentTreeVariants(props, context) {\n    if (checkIfControllingVariants(props)) {\n        var initial = props.initial, animate = props.animate;\n        return {\n            initial: initial === false || isVariantLabel(initial)\n                ? initial\n                : undefined,\n            animate: isVariantLabel(animate) ? animate : undefined,\n        };\n    }\n    return props.inherit !== false ? context : {};\n}\n\nexport { getCurrentTreeVariants };\n","import { useMemo, useContext } from 'react';\nimport { MotionContext } from './index.mjs';\nimport { getCurrentTreeVariants } from './utils.mjs';\n\nfunction useCreateMotionContext(props) {\n    var _a = getCurrentTreeVariants(props, useContext(MotionContext)), initial = _a.initial, animate = _a.animate;\n    return useMemo(function () { return ({ initial: initial, animate: animate }); }, [variantLabelsAsDependency(initial), variantLabelsAsDependency(animate)]);\n}\nfunction variantLabelsAsDependency(prop) {\n    return Array.isArray(prop) ? prop.join(\" \") : prop;\n}\n\nexport { useCreateMotionContext };\n","import { useRef } from 'react';\n\n/**\n * Creates a constant value over the lifecycle of a component.\n *\n * Even if `useMemo` is provided an empty array as its final argument, it doesn't offer\n * a guarantee that it won't re-run for performance reasons later on. By using `useConstant`\n * you can ensure that initialisers don't execute twice or more.\n */\nfunction useConstant(init) {\n    var ref = useRef(null);\n    if (ref.current === null) {\n        ref.current = init();\n    }\n    return ref.current;\n}\n\nexport { useConstant };\n","const defaultTimestep = (1 / 60) * 1000;\nconst getCurrentTime = typeof performance !== \"undefined\"\n    ? () => performance.now()\n    : () => Date.now();\nconst onNextFrame = typeof window !== \"undefined\"\n    ? (callback) => window.requestAnimationFrame(callback)\n    : (callback) => setTimeout(() => callback(getCurrentTime()), defaultTimestep);\n\nexport { defaultTimestep, onNextFrame };\n","function createRenderStep(runNextFrame) {\n    let toRun = [];\n    let toRunNextFrame = [];\n    let numToRun = 0;\n    let isProcessing = false;\n    let flushNextFrame = false;\n    const toKeepAlive = new WeakSet();\n    const step = {\n        schedule: (callback, keepAlive = false, immediate = false) => {\n            const addToCurrentFrame = immediate && isProcessing;\n            const buffer = addToCurrentFrame ? toRun : toRunNextFrame;\n            if (keepAlive)\n                toKeepAlive.add(callback);\n            if (buffer.indexOf(callback) === -1) {\n                buffer.push(callback);\n                if (addToCurrentFrame && isProcessing)\n                    numToRun = toRun.length;\n            }\n            return callback;\n        },\n        cancel: (callback) => {\n            const index = toRunNextFrame.indexOf(callback);\n            if (index !== -1)\n                toRunNextFrame.splice(index, 1);\n            toKeepAlive.delete(callback);\n        },\n        process: (frameData) => {\n            if (isProcessing) {\n                flushNextFrame = true;\n                return;\n            }\n            isProcessing = true;\n            [toRun, toRunNextFrame] = [toRunNextFrame, toRun];\n            toRunNextFrame.length = 0;\n            numToRun = toRun.length;\n            if (numToRun) {\n                for (let i = 0; i < numToRun; i++) {\n                    const callback = toRun[i];\n                    callback(frameData);\n                    if (toKeepAlive.has(callback)) {\n                        step.schedule(callback);\n                        runNextFrame();\n                    }\n                }\n            }\n            isProcessing = false;\n            if (flushNextFrame) {\n                flushNextFrame = false;\n                step.process(frameData);\n            }\n        },\n    };\n    return step;\n}\n\nexport { createRenderStep };\n","import { onNextFrame, defaultTimestep } from './on-next-frame.mjs';\nimport { createRenderStep } from './create-render-step.mjs';\n\nconst maxElapsed = 40;\nlet useDefaultElapsed = true;\nlet runNextFrame = false;\nlet isProcessing = false;\nconst frame = {\n    delta: 0,\n    timestamp: 0,\n};\nconst stepsOrder = [\n    \"read\",\n    \"update\",\n    \"preRender\",\n    \"render\",\n    \"postRender\",\n];\nconst steps = stepsOrder.reduce((acc, key) => {\n    acc[key] = createRenderStep(() => (runNextFrame = true));\n    return acc;\n}, {});\nconst sync = stepsOrder.reduce((acc, key) => {\n    const step = steps[key];\n    acc[key] = (process, keepAlive = false, immediate = false) => {\n        if (!runNextFrame)\n            startLoop();\n        return step.schedule(process, keepAlive, immediate);\n    };\n    return acc;\n}, {});\nconst cancelSync = stepsOrder.reduce((acc, key) => {\n    acc[key] = steps[key].cancel;\n    return acc;\n}, {});\nconst flushSync = stepsOrder.reduce((acc, key) => {\n    acc[key] = () => steps[key].process(frame);\n    return acc;\n}, {});\nconst processStep = (stepId) => steps[stepId].process(frame);\nconst processFrame = (timestamp) => {\n    runNextFrame = false;\n    frame.delta = useDefaultElapsed\n        ? defaultTimestep\n        : Math.max(Math.min(timestamp - frame.timestamp, maxElapsed), 1);\n    frame.timestamp = timestamp;\n    isProcessing = true;\n    stepsOrder.forEach(processStep);\n    isProcessing = false;\n    if (runNextFrame) {\n        useDefaultElapsed = false;\n        onNextFrame(processFrame);\n    }\n};\nconst startLoop = () => {\n    runNextFrame = true;\n    useDefaultElapsed = true;\n    if (!isProcessing)\n        onNextFrame(processFrame);\n};\nconst getFrameData = () => frame;\n\nexport default sync;\nexport { cancelSync, flushSync, getFrameData };\n","const clamp = (min, max, v) => Math.min(Math.max(v, min), max);\n\nexport { clamp };\n","import { warning } from 'hey-listen';\nimport { clamp } from '../../utils/clamp.mjs';\n\nconst safeMin = 0.001;\nconst minDuration = 0.01;\nconst maxDuration = 10.0;\nconst minDamping = 0.05;\nconst maxDamping = 1;\nfunction findSpring({ duration = 800, bounce = 0.25, velocity = 0, mass = 1, }) {\n    let envelope;\n    let derivative;\n    warning(duration <= maxDuration * 1000, \"Spring duration must be 10 seconds or less\");\n    let dampingRatio = 1 - bounce;\n    dampingRatio = clamp(minDamping, maxDamping, dampingRatio);\n    duration = clamp(minDuration, maxDuration, duration / 1000);\n    if (dampingRatio < 1) {\n        envelope = (undampedFreq) => {\n            const exponentialDecay = undampedFreq * dampingRatio;\n            const delta = exponentialDecay * duration;\n            const a = exponentialDecay - velocity;\n            const b = calcAngularFreq(undampedFreq, dampingRatio);\n            const c = Math.exp(-delta);\n            return safeMin - (a / b) * c;\n        };\n        derivative = (undampedFreq) => {\n            const exponentialDecay = undampedFreq * dampingRatio;\n            const delta = exponentialDecay * duration;\n            const d = delta * velocity + velocity;\n            const e = Math.pow(dampingRatio, 2) * Math.pow(undampedFreq, 2) * duration;\n            const f = Math.exp(-delta);\n            const g = calcAngularFreq(Math.pow(undampedFreq, 2), dampingRatio);\n            const factor = -envelope(undampedFreq) + safeMin > 0 ? -1 : 1;\n            return (factor * ((d - e) * f)) / g;\n        };\n    }\n    else {\n        envelope = (undampedFreq) => {\n            const a = Math.exp(-undampedFreq * duration);\n            const b = (undampedFreq - velocity) * duration + 1;\n            return -safeMin + a * b;\n        };\n        derivative = (undampedFreq) => {\n            const a = Math.exp(-undampedFreq * duration);\n            const b = (velocity - undampedFreq) * (duration * duration);\n            return a * b;\n        };\n    }\n    const initialGuess = 5 / duration;\n    const undampedFreq = approximateRoot(envelope, derivative, initialGuess);\n    duration = duration * 1000;\n    if (isNaN(undampedFreq)) {\n        return {\n            stiffness: 100,\n            damping: 10,\n            duration,\n        };\n    }\n    else {\n        const stiffness = Math.pow(undampedFreq, 2) * mass;\n        return {\n            stiffness,\n            damping: dampingRatio * 2 * Math.sqrt(mass * stiffness),\n            duration,\n        };\n    }\n}\nconst rootIterations = 12;\nfunction approximateRoot(envelope, derivative, initialGuess) {\n    let result = initialGuess;\n    for (let i = 1; i < rootIterations; i++) {\n        result = result - envelope(result) / derivative(result);\n    }\n    return result;\n}\nfunction calcAngularFreq(undampedFreq, dampingRatio) {\n    return undampedFreq * Math.sqrt(1 - dampingRatio * dampingRatio);\n}\n\nexport { calcAngularFreq, findSpring, maxDamping, maxDuration, minDamping, minDuration };\n","import { __rest } from 'tslib';\nimport { findSpring, calcAngularFreq } from '../utils/find-spring.mjs';\n\nconst durationKeys = [\"duration\", \"bounce\"];\nconst physicsKeys = [\"stiffness\", \"damping\", \"mass\"];\nfunction isSpringType(options, keys) {\n    return keys.some((key) => options[key] !== undefined);\n}\nfunction getSpringOptions(options) {\n    let springOptions = Object.assign({ velocity: 0.0, stiffness: 100, damping: 10, mass: 1.0, isResolvedFromDuration: false }, options);\n    if (!isSpringType(options, physicsKeys) &&\n        isSpringType(options, durationKeys)) {\n        const derived = findSpring(options);\n        springOptions = Object.assign(Object.assign(Object.assign({}, springOptions), derived), { velocity: 0.0, mass: 1.0 });\n        springOptions.isResolvedFromDuration = true;\n    }\n    return springOptions;\n}\nfunction spring(_a) {\n    var { from = 0.0, to = 1.0, restSpeed = 2, restDelta } = _a, options = __rest(_a, [\"from\", \"to\", \"restSpeed\", \"restDelta\"]);\n    const state = { done: false, value: from };\n    let { stiffness, damping, mass, velocity, duration, isResolvedFromDuration, } = getSpringOptions(options);\n    let resolveSpring = zero;\n    let resolveVelocity = zero;\n    function createSpring() {\n        const initialVelocity = velocity ? -(velocity / 1000) : 0.0;\n        const initialDelta = to - from;\n        const dampingRatio = damping / (2 * Math.sqrt(stiffness * mass));\n        const undampedAngularFreq = Math.sqrt(stiffness / mass) / 1000;\n        if (restDelta === undefined) {\n            restDelta = Math.min(Math.abs(to - from) / 100, 0.4);\n        }\n        if (dampingRatio < 1) {\n            const angularFreq = calcAngularFreq(undampedAngularFreq, dampingRatio);\n            resolveSpring = (t) => {\n                const envelope = Math.exp(-dampingRatio * undampedAngularFreq * t);\n                return (to -\n                    envelope *\n                        (((initialVelocity +\n                            dampingRatio * undampedAngularFreq * initialDelta) /\n                            angularFreq) *\n                            Math.sin(angularFreq * t) +\n                            initialDelta * Math.cos(angularFreq * t)));\n            };\n            resolveVelocity = (t) => {\n                const envelope = Math.exp(-dampingRatio * undampedAngularFreq * t);\n                return (dampingRatio *\n                    undampedAngularFreq *\n                    envelope *\n                    ((Math.sin(angularFreq * t) *\n                        (initialVelocity +\n                            dampingRatio *\n                                undampedAngularFreq *\n                                initialDelta)) /\n                        angularFreq +\n                        initialDelta * Math.cos(angularFreq * t)) -\n                    envelope *\n                        (Math.cos(angularFreq * t) *\n                            (initialVelocity +\n                                dampingRatio *\n                                    undampedAngularFreq *\n                                    initialDelta) -\n                            angularFreq *\n                                initialDelta *\n                                Math.sin(angularFreq * t)));\n            };\n        }\n        else if (dampingRatio === 1) {\n            resolveSpring = (t) => to -\n                Math.exp(-undampedAngularFreq * t) *\n                    (initialDelta +\n                        (initialVelocity + undampedAngularFreq * initialDelta) *\n                            t);\n        }\n        else {\n            const dampedAngularFreq = undampedAngularFreq * Math.sqrt(dampingRatio * dampingRatio - 1);\n            resolveSpring = (t) => {\n                const envelope = Math.exp(-dampingRatio * undampedAngularFreq * t);\n                const freqForT = Math.min(dampedAngularFreq * t, 300);\n                return (to -\n                    (envelope *\n                        ((initialVelocity +\n                            dampingRatio * undampedAngularFreq * initialDelta) *\n                            Math.sinh(freqForT) +\n                            dampedAngularFreq *\n                                initialDelta *\n                                Math.cosh(freqForT))) /\n                        dampedAngularFreq);\n            };\n        }\n    }\n    createSpring();\n    return {\n        next: (t) => {\n            const current = resolveSpring(t);\n            if (!isResolvedFromDuration) {\n                const currentVelocity = resolveVelocity(t) * 1000;\n                const isBelowVelocityThreshold = Math.abs(currentVelocity) <= restSpeed;\n                const isBelowDisplacementThreshold = Math.abs(to - current) <= restDelta;\n                state.done =\n                    isBelowVelocityThreshold && isBelowDisplacementThreshold;\n            }\n            else {\n                state.done = t >= duration;\n            }\n            state.value = state.done ? to : current;\n            return state;\n        },\n        flipTarget: () => {\n            velocity = -velocity;\n            [from, to] = [to, from];\n            createSpring();\n        },\n    };\n}\nspring.needsInterpolation = (a, b) => typeof a === \"string\" || typeof b === \"string\";\nconst zero = (_t) => 0;\n\nexport { spring };\n","const progress = (from, to, value) => {\n    const toFromDifference = to - from;\n    return toFromDifference === 0 ? 1 : (value - from) / toFromDifference;\n};\n\nexport { progress };\n","const mix = (from, to, progress) => -progress * from + progress * to + from;\n\nexport { mix };\n","const clamp = (min, max) => (v) => Math.max(Math.min(v, max), min);\nconst sanitize = (v) => (v % 1 ? Number(v.toFixed(5)) : v);\nconst floatRegex = /(-)?([\\d]*\\.?[\\d])+/g;\nconst colorRegex = /(#[0-9a-f]{6}|#[0-9a-f]{3}|#(?:[0-9a-f]{2}){2,4}|(rgb|hsl)a?\\((-?[\\d\\.]+%?[,\\s]+){2,3}\\s*\\/*\\s*[\\d\\.]+%?\\))/gi;\nconst singleColorRegex = /^(#[0-9a-f]{3}|#(?:[0-9a-f]{2}){2,4}|(rgb|hsl)a?\\((-?[\\d\\.]+%?[,\\s]+){2,3}\\s*\\/*\\s*[\\d\\.]+%?\\))$/i;\nfunction isString(v) {\n    return typeof v === 'string';\n}\n\nexport { clamp, colorRegex, floatRegex, isString, sanitize, singleColorRegex };\n","import { clamp } from '../utils.mjs';\n\nconst number = {\n    test: (v) => typeof v === 'number',\n    parse: parseFloat,\n    transform: (v) => v,\n};\nconst alpha = Object.assign(Object.assign({}, number), { transform: clamp(0, 1) });\nconst scale = Object.assign(Object.assign({}, number), { default: 1 });\n\nexport { alpha, number, scale };\n","import { isString } from '../utils.mjs';\n\nconst createUnitType = (unit) => ({\n    test: (v) => isString(v) && v.endsWith(unit) && v.split(' ').length === 1,\n    parse: parseFloat,\n    transform: (v) => `${v}${unit}`,\n});\nconst degrees = createUnitType('deg');\nconst percent = createUnitType('%');\nconst px = createUnitType('px');\nconst vh = createUnitType('vh');\nconst vw = createUnitType('vw');\nconst progressPercentage = Object.assign(Object.assign({}, percent), { parse: (v) => percent.parse(v) / 100, transform: (v) => percent.transform(v * 100) });\n\nexport { degrees, percent, progressPercentage, px, vh, vw };\n","import { isString, singleColorRegex, floatRegex } from '../utils.mjs';\n\nconst isColorString = (type, testProp) => (v) => {\n    return Boolean((isString(v) && singleColorRegex.test(v) && v.startsWith(type)) ||\n        (testProp && Object.prototype.hasOwnProperty.call(v, testProp)));\n};\nconst splitColor = (aName, bName, cName) => (v) => {\n    if (!isString(v))\n        return v;\n    const [a, b, c, alpha] = v.match(floatRegex);\n    return {\n        [aName]: parseFloat(a),\n        [bName]: parseFloat(b),\n        [cName]: parseFloat(c),\n        alpha: alpha !== undefined ? parseFloat(alpha) : 1,\n    };\n};\n\nexport { isColorString, splitColor };\n","import { alpha } from '../numbers/index.mjs';\nimport { percent } from '../numbers/units.mjs';\nimport { sanitize } from '../utils.mjs';\nimport { isColorString, splitColor } from './utils.mjs';\n\nconst hsla = {\n    test: isColorString('hsl', 'hue'),\n    parse: splitColor('hue', 'saturation', 'lightness'),\n    transform: ({ hue, saturation, lightness, alpha: alpha$1 = 1 }) => {\n        return ('hsla(' +\n            Math.round(hue) +\n            ', ' +\n            percent.transform(sanitize(saturation)) +\n            ', ' +\n            percent.transform(sanitize(lightness)) +\n            ', ' +\n            sanitize(alpha.transform(alpha$1)) +\n            ')');\n    },\n};\n\nexport { hsla };\n","import { number, alpha } from '../numbers/index.mjs';\nimport { sanitize, clamp } from '../utils.mjs';\nimport { isColorString, splitColor } from './utils.mjs';\n\nconst clampRgbUnit = clamp(0, 255);\nconst rgbUnit = Object.assign(Object.assign({}, number), { transform: (v) => Math.round(clampRgbUnit(v)) });\nconst rgba = {\n    test: isColorString('rgb', 'red'),\n    parse: splitColor('red', 'green', 'blue'),\n    transform: ({ red, green, blue, alpha: alpha$1 = 1 }) => 'rgba(' +\n        rgbUnit.transform(red) +\n        ', ' +\n        rgbUnit.transform(green) +\n        ', ' +\n        rgbUnit.transform(blue) +\n        ', ' +\n        sanitize(alpha.transform(alpha$1)) +\n        ')',\n};\n\nexport { rgbUnit, rgba };\n","import { rgba } from './rgba.mjs';\nimport { isColorString } from './utils.mjs';\n\nfunction parseHex(v) {\n    let r = '';\n    let g = '';\n    let b = '';\n    let a = '';\n    if (v.length > 5) {\n        r = v.substr(1, 2);\n        g = v.substr(3, 2);\n        b = v.substr(5, 2);\n        a = v.substr(7, 2);\n    }\n    else {\n        r = v.substr(1, 1);\n        g = v.substr(2, 1);\n        b = v.substr(3, 1);\n        a = v.substr(4, 1);\n        r += r;\n        g += g;\n        b += b;\n        a += a;\n    }\n    return {\n        red: parseInt(r, 16),\n        green: parseInt(g, 16),\n        blue: parseInt(b, 16),\n        alpha: a ? parseInt(a, 16) / 255 : 1,\n    };\n}\nconst hex = {\n    test: isColorString('#'),\n    parse: parseHex,\n    transform: rgba.transform,\n};\n\nexport { hex };\n","import { isString } from '../utils.mjs';\nimport { hex } from './hex.mjs';\nimport { hsla } from './hsla.mjs';\nimport { rgba } from './rgba.mjs';\n\nconst color = {\n    test: (v) => rgba.test(v) || hex.test(v) || hsla.test(v),\n    parse: (v) => {\n        if (rgba.test(v)) {\n            return rgba.parse(v);\n        }\n        else if (hsla.test(v)) {\n            return hsla.parse(v);\n        }\n        else {\n            return hex.parse(v);\n        }\n    },\n    transform: (v) => {\n        return isString(v)\n            ? v\n            : v.hasOwnProperty('red')\n                ? rgba.transform(v)\n                : hsla.transform(v);\n    },\n};\n\nexport { color };\n","import { color } from '../color/index.mjs';\nimport { number } from '../numbers/index.mjs';\nimport { isString, floatRegex, colorRegex, sanitize } from '../utils.mjs';\n\nconst colorToken = '${c}';\nconst numberToken = '${n}';\nfunction test(v) {\n    var _a, _b, _c, _d;\n    return (isNaN(v) &&\n        isString(v) &&\n        ((_b = (_a = v.match(floatRegex)) === null || _a === void 0 ? void 0 : _a.length) !== null && _b !== void 0 ? _b : 0) + ((_d = (_c = v.match(colorRegex)) === null || _c === void 0 ? void 0 : _c.length) !== null && _d !== void 0 ? _d : 0) > 0);\n}\nfunction analyse(v) {\n    if (typeof v === 'number')\n        v = `${v}`;\n    const values = [];\n    let numColors = 0;\n    const colors = v.match(colorRegex);\n    if (colors) {\n        numColors = colors.length;\n        v = v.replace(colorRegex, colorToken);\n        values.push(...colors.map(color.parse));\n    }\n    const numbers = v.match(floatRegex);\n    if (numbers) {\n        v = v.replace(floatRegex, numberToken);\n        values.push(...numbers.map(number.parse));\n    }\n    return { values, numColors, tokenised: v };\n}\nfunction parse(v) {\n    return analyse(v).values;\n}\nfunction createTransformer(v) {\n    const { values, numColors, tokenised } = analyse(v);\n    const numValues = values.length;\n    return (v) => {\n        let output = tokenised;\n        for (let i = 0; i < numValues; i++) {\n            output = output.replace(i < numColors ? colorToken : numberToken, i < numColors ? color.transform(v[i]) : sanitize(v[i]));\n        }\n        return output;\n    };\n}\nconst convertNumbersToZero = (v) => typeof v === 'number' ? 0 : v;\nfunction getAnimatableNone(v) {\n    const parsed = parse(v);\n    const transformer = createTransformer(v);\n    return transformer(parsed.map(convertNumbersToZero));\n}\nconst complex = { test, parse, createTransformer, getAnimatableNone };\n\nexport { complex };\n","import { complex } from './index.mjs';\nimport { floatRegex } from '../utils.mjs';\n\nconst maxDefaults = new Set(['brightness', 'contrast', 'saturate', 'opacity']);\nfunction applyDefaultFilter(v) {\n    let [name, value] = v.slice(0, -1).split('(');\n    if (name === 'drop-shadow')\n        return v;\n    const [number] = value.match(floatRegex) || [];\n    if (!number)\n        return v;\n    const unit = value.replace(number, '');\n    let defaultValue = maxDefaults.has(name) ? 1 : 0;\n    if (number !== value)\n        defaultValue *= 100;\n    return name + '(' + defaultValue + unit + ')';\n}\nconst functionRegex = /([a-z-]*)\\(.*?\\)/g;\nconst filter = Object.assign(Object.assign({}, complex), { getAnimatableNone: (v) => {\n        const functions = v.match(functionRegex);\n        return functions ? functions.map(applyDefaultFilter).join(' ') : v;\n    } });\n\nexport { filter };\n","function hueToRgb(p, q, t) {\n    if (t < 0)\n        t += 1;\n    if (t > 1)\n        t -= 1;\n    if (t < 1 / 6)\n        return p + (q - p) * 6 * t;\n    if (t < 1 / 2)\n        return q;\n    if (t < 2 / 3)\n        return p + (q - p) * (2 / 3 - t) * 6;\n    return p;\n}\nfunction hslaToRgba({ hue, saturation, lightness, alpha }) {\n    hue /= 360;\n    saturation /= 100;\n    lightness /= 100;\n    let red = 0;\n    let green = 0;\n    let blue = 0;\n    if (!saturation) {\n        red = green = blue = lightness;\n    }\n    else {\n        const q = lightness < 0.5\n            ? lightness * (1 + saturation)\n            : lightness + saturation - lightness * saturation;\n        const p = 2 * lightness - q;\n        red = hueToRgb(p, q, hue + 1 / 3);\n        green = hueToRgb(p, q, hue);\n        blue = hueToRgb(p, q, hue - 1 / 3);\n    }\n    return {\n        red: Math.round(red * 255),\n        green: Math.round(green * 255),\n        blue: Math.round(blue * 255),\n        alpha,\n    };\n}\n\nexport { hslaToRgba };\n","import { mix } from './mix.mjs';\nimport { hsla, rgba, hex } from 'style-value-types';\nimport { invariant } from 'hey-listen';\nimport { hslaToRgba } from './hsla-to-rgba.mjs';\n\nconst mixLinearColor = (from, to, v) => {\n    const fromExpo = from * from;\n    const toExpo = to * to;\n    return Math.sqrt(Math.max(0, v * (toExpo - fromExpo) + fromExpo));\n};\nconst colorTypes = [hex, rgba, hsla];\nconst getColorType = (v) => colorTypes.find((type) => type.test(v));\nconst notAnimatable = (color) => `'${color}' is not an animatable color. Use the equivalent color code instead.`;\nconst mixColor = (from, to) => {\n    let fromColorType = getColorType(from);\n    let toColorType = getColorType(to);\n    invariant(!!fromColorType, notAnimatable(from));\n    invariant(!!toColorType, notAnimatable(to));\n    let fromColor = fromColorType.parse(from);\n    let toColor = toColorType.parse(to);\n    if (fromColorType === hsla) {\n        fromColor = hslaToRgba(fromColor);\n        fromColorType = rgba;\n    }\n    if (toColorType === hsla) {\n        toColor = hslaToRgba(toColor);\n        toColorType = rgba;\n    }\n    const blended = Object.assign({}, fromColor);\n    return (v) => {\n        for (const key in blended) {\n            if (key !== \"alpha\") {\n                blended[key] = mixLinearColor(fromColor[key], toColor[key], v);\n            }\n        }\n        blended.alpha = mix(fromColor.alpha, toColor.alpha, v);\n        return fromColorType.transform(blended);\n    };\n};\n\nexport { mixColor, mixLinearColor };\n","const zeroPoint = {\n    x: 0,\n    y: 0,\n    z: 0\n};\nconst isNum = (v) => typeof v === 'number';\n\nexport { isNum, zeroPoint };\n","const combineFunctions = (a, b) => (v) => b(a(v));\nconst pipe = (...transformers) => transformers.reduce(combineFunctions);\n\nexport { pipe };\n","import { complex, color } from 'style-value-types';\nimport { mix } from './mix.mjs';\nimport { mixColor } from './mix-color.mjs';\nimport { isNum } from './inc.mjs';\nimport { pipe } from './pipe.mjs';\nimport { warning } from 'hey-listen';\n\nfunction getMixer(origin, target) {\n    if (isNum(origin)) {\n        return (v) => mix(origin, target, v);\n    }\n    else if (color.test(origin)) {\n        return mixColor(origin, target);\n    }\n    else {\n        return mixComplex(origin, target);\n    }\n}\nconst mixArray = (from, to) => {\n    const output = [...from];\n    const numValues = output.length;\n    const blendValue = from.map((fromThis, i) => getMixer(fromThis, to[i]));\n    return (v) => {\n        for (let i = 0; i < numValues; i++) {\n            output[i] = blendValue[i](v);\n        }\n        return output;\n    };\n};\nconst mixObject = (origin, target) => {\n    const output = Object.assign(Object.assign({}, origin), target);\n    const blendValue = {};\n    for (const key in output) {\n        if (origin[key] !== undefined && target[key] !== undefined) {\n            blendValue[key] = getMixer(origin[key], target[key]);\n        }\n    }\n    return (v) => {\n        for (const key in blendValue) {\n            output[key] = blendValue[key](v);\n        }\n        return output;\n    };\n};\nfunction analyse(value) {\n    const parsed = complex.parse(value);\n    const numValues = parsed.length;\n    let numNumbers = 0;\n    let numRGB = 0;\n    let numHSL = 0;\n    for (let i = 0; i < numValues; i++) {\n        if (numNumbers || typeof parsed[i] === \"number\") {\n            numNumbers++;\n        }\n        else {\n            if (parsed[i].hue !== undefined) {\n                numHSL++;\n            }\n            else {\n                numRGB++;\n            }\n        }\n    }\n    return { parsed, numNumbers, numRGB, numHSL };\n}\nconst mixComplex = (origin, target) => {\n    const template = complex.createTransformer(target);\n    const originStats = analyse(origin);\n    const targetStats = analyse(target);\n    const canInterpolate = originStats.numHSL === targetStats.numHSL &&\n        originStats.numRGB === targetStats.numRGB &&\n        originStats.numNumbers >= targetStats.numNumbers;\n    if (canInterpolate) {\n        return pipe(mixArray(originStats.parsed, targetStats.parsed), template);\n    }\n    else {\n        warning(true, `Complex values '${origin}' and '${target}' too different to mix. Ensure all colors are of the same type, and that each contains the same quantity of number and color values. Falling back to instant transition.`);\n        return (p) => `${p > 0 ? target : origin}`;\n    }\n};\n\nexport { mixArray, mixComplex, mixObject };\n","import { progress } from './progress.mjs';\nimport { mix } from './mix.mjs';\nimport { mixColor } from './mix-color.mjs';\nimport { mixComplex, mixArray, mixObject } from './mix-complex.mjs';\nimport { color } from 'style-value-types';\nimport { clamp } from './clamp.mjs';\nimport { pipe } from './pipe.mjs';\nimport { invariant } from 'hey-listen';\n\nconst mixNumber = (from, to) => (p) => mix(from, to, p);\nfunction detectMixerFactory(v) {\n    if (typeof v === 'number') {\n        return mixNumber;\n    }\n    else if (typeof v === 'string') {\n        if (color.test(v)) {\n            return mixColor;\n        }\n        else {\n            return mixComplex;\n        }\n    }\n    else if (Array.isArray(v)) {\n        return mixArray;\n    }\n    else if (typeof v === 'object') {\n        return mixObject;\n    }\n}\nfunction createMixers(output, ease, customMixer) {\n    const mixers = [];\n    const mixerFactory = customMixer || detectMixerFactory(output[0]);\n    const numMixers = output.length - 1;\n    for (let i = 0; i < numMixers; i++) {\n        let mixer = mixerFactory(output[i], output[i + 1]);\n        if (ease) {\n            const easingFunction = Array.isArray(ease) ? ease[i] : ease;\n            mixer = pipe(easingFunction, mixer);\n        }\n        mixers.push(mixer);\n    }\n    return mixers;\n}\nfunction fastInterpolate([from, to], [mixer]) {\n    return (v) => mixer(progress(from, to, v));\n}\nfunction slowInterpolate(input, mixers) {\n    const inputLength = input.length;\n    const lastInputIndex = inputLength - 1;\n    return (v) => {\n        let mixerIndex = 0;\n        let foundMixerIndex = false;\n        if (v <= input[0]) {\n            foundMixerIndex = true;\n        }\n        else if (v >= input[lastInputIndex]) {\n            mixerIndex = lastInputIndex - 1;\n            foundMixerIndex = true;\n        }\n        if (!foundMixerIndex) {\n            let i = 1;\n            for (; i < inputLength; i++) {\n                if (input[i] > v || i === lastInputIndex) {\n                    break;\n                }\n            }\n            mixerIndex = i - 1;\n        }\n        const progressInRange = progress(input[mixerIndex], input[mixerIndex + 1], v);\n        return mixers[mixerIndex](progressInRange);\n    };\n}\nfunction interpolate(input, output, { clamp: isClamp = true, ease, mixer } = {}) {\n    const inputLength = input.length;\n    invariant(inputLength === output.length, 'Both input and output ranges must be the same length');\n    invariant(!ease || !Array.isArray(ease) || ease.length === inputLength - 1, 'Array of easing functions must be of length `input.length - 1`, as it applies to the transitions **between** the defined values.');\n    if (input[0] > input[inputLength - 1]) {\n        input = [].concat(input);\n        output = [].concat(output);\n        input.reverse();\n        output.reverse();\n    }\n    const mixers = createMixers(output, ease, mixer);\n    const interpolator = inputLength === 2\n        ? fastInterpolate(input, mixers)\n        : slowInterpolate(input, mixers);\n    return isClamp\n        ? (v) => interpolator(clamp(input[0], input[inputLength - 1], v))\n        : interpolator;\n}\n\nexport { interpolate };\n","const reverseEasing = easing => p => 1 - easing(1 - p);\nconst mirrorEasing = easing => p => p <= 0.5 ? easing(2 * p) / 2 : (2 - easing(2 * (1 - p))) / 2;\nconst createExpoIn = (power) => p => Math.pow(p, power);\nconst createBackIn = (power) => p => p * p * ((power + 1) * p - power);\nconst createAnticipate = (power) => {\n    const backEasing = createBackIn(power);\n    return p => (p *= 2) < 1\n        ? 0.5 * backEasing(p)\n        : 0.5 * (2 - Math.pow(2, -10 * (p - 1)));\n};\n\nexport { createAnticipate, createBackIn, createExpoIn, mirrorEasing, reverseEasing };\n","import { createExpoIn, reverseEasing, mirrorEasing, createBackIn, createAnticipate } from './utils.mjs';\n\nconst DEFAULT_OVERSHOOT_STRENGTH = 1.525;\nconst BOUNCE_FIRST_THRESHOLD = 4.0 / 11.0;\nconst BOUNCE_SECOND_THRESHOLD = 8.0 / 11.0;\nconst BOUNCE_THIRD_THRESHOLD = 9.0 / 10.0;\nconst linear = p => p;\nconst easeIn = createExpoIn(2);\nconst easeOut = reverseEasing(easeIn);\nconst easeInOut = mirrorEasing(easeIn);\nconst circIn = p => 1 - Math.sin(Math.acos(p));\nconst circOut = reverseEasing(circIn);\nconst circInOut = mirrorEasing(circOut);\nconst backIn = createBackIn(DEFAULT_OVERSHOOT_STRENGTH);\nconst backOut = reverseEasing(backIn);\nconst backInOut = mirrorEasing(backIn);\nconst anticipate = createAnticipate(DEFAULT_OVERSHOOT_STRENGTH);\nconst ca = 4356.0 / 361.0;\nconst cb = 35442.0 / 1805.0;\nconst cc = 16061.0 / 1805.0;\nconst bounceOut = (p) => {\n    if (p === 1 || p === 0)\n        return p;\n    const p2 = p * p;\n    return p < BOUNCE_FIRST_THRESHOLD\n        ? 7.5625 * p2\n        : p < BOUNCE_SECOND_THRESHOLD\n            ? 9.075 * p2 - 9.9 * p + 3.4\n            : p < BOUNCE_THIRD_THRESHOLD\n                ? ca * p2 - cb * p + cc\n                : 10.8 * p * p - 20.52 * p + 10.72;\n};\nconst bounceIn = reverseEasing(bounceOut);\nconst bounceInOut = (p) => p < 0.5\n    ? 0.5 * (1.0 - bounceOut(1.0 - p * 2.0))\n    : 0.5 * bounceOut(p * 2.0 - 1.0) + 0.5;\n\nexport { anticipate, backIn, backInOut, backOut, bounceIn, bounceInOut, bounceOut, circIn, circInOut, circOut, easeIn, easeInOut, easeOut, linear };\n","import { interpolate } from '../../utils/interpolate.mjs';\nimport { easeInOut } from '../../easing/index.mjs';\n\nfunction defaultEasing(values, easing) {\n    return values.map(() => easing || easeInOut).splice(0, values.length - 1);\n}\nfunction defaultOffset(values) {\n    const numValues = values.length;\n    return values.map((_value, i) => i !== 0 ? i / (numValues - 1) : 0);\n}\nfunction convertOffsetToTimes(offset, duration) {\n    return offset.map((o) => o * duration);\n}\nfunction keyframes({ from = 0, to = 1, ease, offset, duration = 300, }) {\n    const state = { done: false, value: from };\n    const values = Array.isArray(to) ? to : [from, to];\n    const times = convertOffsetToTimes(offset && offset.length === values.length\n        ? offset\n        : defaultOffset(values), duration);\n    function createInterpolator() {\n        return interpolate(times, values, {\n            ease: Array.isArray(ease) ? ease : defaultEasing(values, ease),\n        });\n    }\n    let interpolator = createInterpolator();\n    return {\n        next: (t) => {\n            state.value = interpolator(t);\n            state.done = t >= duration;\n            return state;\n        },\n        flipTarget: () => {\n            values.reverse();\n            interpolator = createInterpolator();\n        },\n    };\n}\n\nexport { convertOffsetToTimes, defaultEasing, defaultOffset, keyframes };\n","function decay({ velocity = 0, from = 0, power = 0.8, timeConstant = 350, restDelta = 0.5, modifyTarget, }) {\n    const state = { done: false, value: from };\n    let amplitude = power * velocity;\n    const ideal = from + amplitude;\n    const target = modifyTarget === undefined ? ideal : modifyTarget(ideal);\n    if (target !== ideal)\n        amplitude = target - from;\n    return {\n        next: (t) => {\n            const delta = -amplitude * Math.exp(-t / timeConstant);\n            state.done = !(delta > restDelta || delta < -restDelta);\n            state.value = state.done ? target : target + delta;\n            return state;\n        },\n        flipTarget: () => { },\n    };\n}\n\nexport { decay };\n","import { spring } from '../generators/spring.mjs';\nimport { keyframes } from '../generators/keyframes.mjs';\nimport { decay } from '../generators/decay.mjs';\n\nconst types = { keyframes, spring, decay };\nfunction detectAnimationFromOptions(config) {\n    if (Array.isArray(config.to)) {\n        return keyframes;\n    }\n    else if (types[config.type]) {\n        return types[config.type];\n    }\n    const keys = new Set(Object.keys(config));\n    if (keys.has(\"ease\") ||\n        (keys.has(\"duration\") && !keys.has(\"dampingRatio\"))) {\n        return keyframes;\n    }\n    else if (keys.has(\"dampingRatio\") ||\n        keys.has(\"stiffness\") ||\n        keys.has(\"mass\") ||\n        keys.has(\"damping\") ||\n        keys.has(\"restSpeed\") ||\n        keys.has(\"restDelta\")) {\n        return spring;\n    }\n    return keyframes;\n}\n\nexport { detectAnimationFromOptions };\n","function loopElapsed(elapsed, duration, delay = 0) {\n    return elapsed - duration - delay;\n}\nfunction reverseElapsed(elapsed, duration, delay = 0, isForwardPlayback = true) {\n    return isForwardPlayback\n        ? loopElapsed(duration + -elapsed, duration, delay)\n        : duration - (elapsed - duration) + delay;\n}\nfunction hasRepeatDelayElapsed(elapsed, duration, delay, isForwardPlayback) {\n    return isForwardPlayback ? elapsed >= duration + delay : elapsed <= -delay;\n}\n\nexport { hasRepeatDelayElapsed, loopElapsed, reverseElapsed };\n","import { __rest } from 'tslib';\nimport { detectAnimationFromOptions } from './utils/detect-animation-from-options.mjs';\nimport sync, { cancelSync } from 'framesync';\nimport { interpolate } from '../utils/interpolate.mjs';\nimport { hasRepeatDelayElapsed, reverseElapsed, loopElapsed } from './utils/elapsed.mjs';\n\nconst framesync = (update) => {\n    const passTimestamp = ({ delta }) => update(delta);\n    return {\n        start: () => sync.update(passTimestamp, true),\n        stop: () => cancelSync.update(passTimestamp),\n    };\n};\nfunction animate(_a) {\n    var _b, _c;\n    var { from, autoplay = true, driver = framesync, elapsed = 0, repeat: repeatMax = 0, repeatType = \"loop\", repeatDelay = 0, onPlay, onStop, onComplete, onRepeat, onUpdate } = _a, options = __rest(_a, [\"from\", \"autoplay\", \"driver\", \"elapsed\", \"repeat\", \"repeatType\", \"repeatDelay\", \"onPlay\", \"onStop\", \"onComplete\", \"onRepeat\", \"onUpdate\"]);\n    let { to } = options;\n    let driverControls;\n    let repeatCount = 0;\n    let computedDuration = options.duration;\n    let latest;\n    let isComplete = false;\n    let isForwardPlayback = true;\n    let interpolateFromNumber;\n    const animator = detectAnimationFromOptions(options);\n    if ((_c = (_b = animator).needsInterpolation) === null || _c === void 0 ? void 0 : _c.call(_b, from, to)) {\n        interpolateFromNumber = interpolate([0, 100], [from, to], {\n            clamp: false,\n        });\n        from = 0;\n        to = 100;\n    }\n    const animation = animator(Object.assign(Object.assign({}, options), { from, to }));\n    function repeat() {\n        repeatCount++;\n        if (repeatType === \"reverse\") {\n            isForwardPlayback = repeatCount % 2 === 0;\n            elapsed = reverseElapsed(elapsed, computedDuration, repeatDelay, isForwardPlayback);\n        }\n        else {\n            elapsed = loopElapsed(elapsed, computedDuration, repeatDelay);\n            if (repeatType === \"mirror\")\n                animation.flipTarget();\n        }\n        isComplete = false;\n        onRepeat && onRepeat();\n    }\n    function complete() {\n        driverControls.stop();\n        onComplete && onComplete();\n    }\n    function update(delta) {\n        if (!isForwardPlayback)\n            delta = -delta;\n        elapsed += delta;\n        if (!isComplete) {\n            const state = animation.next(Math.max(0, elapsed));\n            latest = state.value;\n            if (interpolateFromNumber)\n                latest = interpolateFromNumber(latest);\n            isComplete = isForwardPlayback ? state.done : elapsed <= 0;\n        }\n        onUpdate === null || onUpdate === void 0 ? void 0 : onUpdate(latest);\n        if (isComplete) {\n            if (repeatCount === 0)\n                computedDuration !== null && computedDuration !== void 0 ? computedDuration : (computedDuration = elapsed);\n            if (repeatCount < repeatMax) {\n                hasRepeatDelayElapsed(elapsed, computedDuration, repeatDelay, isForwardPlayback) && repeat();\n            }\n            else {\n                complete();\n            }\n        }\n    }\n    function play() {\n        onPlay === null || onPlay === void 0 ? void 0 : onPlay();\n        driverControls = driver(update);\n        driverControls.start();\n    }\n    autoplay && play();\n    return {\n        stop: () => {\n            onStop === null || onStop === void 0 ? void 0 : onStop();\n            driverControls.stop();\n        },\n    };\n}\n\nexport { animate };\n","function velocityPerSecond(velocity, frameDuration) {\n    return frameDuration ? velocity * (1000 / frameDuration) : 0;\n}\n\nexport { velocityPerSecond };\n","import { animate } from './index.mjs';\nimport { velocityPerSecond } from '../utils/velocity-per-second.mjs';\nimport { getFrameData } from 'framesync';\n\nfunction inertia({ from = 0, velocity = 0, min, max, power = 0.8, timeConstant = 750, bounceStiffness = 500, bounceDamping = 10, restDelta = 1, modifyTarget, driver, onUpdate, onComplete, onStop, }) {\n    let currentAnimation;\n    function isOutOfBounds(v) {\n        return (min !== undefined && v < min) || (max !== undefined && v > max);\n    }\n    function boundaryNearest(v) {\n        if (min === undefined)\n            return max;\n        if (max === undefined)\n            return min;\n        return Math.abs(min - v) < Math.abs(max - v) ? min : max;\n    }\n    function startAnimation(options) {\n        currentAnimation === null || currentAnimation === void 0 ? void 0 : currentAnimation.stop();\n        currentAnimation = animate(Object.assign(Object.assign({}, options), { driver, onUpdate: (v) => {\n                var _a;\n                onUpdate === null || onUpdate === void 0 ? void 0 : onUpdate(v);\n                (_a = options.onUpdate) === null || _a === void 0 ? void 0 : _a.call(options, v);\n            }, onComplete,\n            onStop }));\n    }\n    function startSpring(options) {\n        startAnimation(Object.assign({ type: \"spring\", stiffness: bounceStiffness, damping: bounceDamping, restDelta }, options));\n    }\n    if (isOutOfBounds(from)) {\n        startSpring({ from, velocity, to: boundaryNearest(from) });\n    }\n    else {\n        let target = power * velocity + from;\n        if (typeof modifyTarget !== \"undefined\")\n            target = modifyTarget(target);\n        const boundary = boundaryNearest(target);\n        const heading = boundary === min ? -1 : 1;\n        let prev;\n        let current;\n        const checkBoundary = (v) => {\n            prev = current;\n            current = v;\n            velocity = velocityPerSecond(v - prev, getFrameData().delta);\n            if ((heading === 1 && v > boundary) ||\n                (heading === -1 && v < boundary)) {\n                startSpring({ from: v, to: boundary, velocity });\n            }\n        };\n        startAnimation({\n            type: \"decay\",\n            from,\n            velocity,\n            timeConstant,\n            power,\n            restDelta,\n            modifyTarget,\n            onUpdate: isOutOfBounds(target) ? checkBoundary : undefined,\n        });\n    }\n    return {\n        stop: () => currentAnimation === null || currentAnimation === void 0 ? void 0 : currentAnimation.stop(),\n    };\n}\n\nexport { inertia };\n","import { linear } from './index.mjs';\n\nconst a = (a1, a2) => 1.0 - 3.0 * a2 + 3.0 * a1;\nconst b = (a1, a2) => 3.0 * a2 - 6.0 * a1;\nconst c = (a1) => 3.0 * a1;\nconst calcBezier = (t, a1, a2) => ((a(a1, a2) * t + b(a1, a2)) * t + c(a1)) * t;\nconst getSlope = (t, a1, a2) => 3.0 * a(a1, a2) * t * t + 2.0 * b(a1, a2) * t + c(a1);\nconst subdivisionPrecision = 0.0000001;\nconst subdivisionMaxIterations = 10;\nfunction binarySubdivide(aX, aA, aB, mX1, mX2) {\n    let currentX;\n    let currentT;\n    let i = 0;\n    do {\n        currentT = aA + (aB - aA) / 2.0;\n        currentX = calcBezier(currentT, mX1, mX2) - aX;\n        if (currentX > 0.0) {\n            aB = currentT;\n        }\n        else {\n            aA = currentT;\n        }\n    } while (Math.abs(currentX) > subdivisionPrecision &&\n        ++i < subdivisionMaxIterations);\n    return currentT;\n}\nconst newtonIterations = 8;\nconst newtonMinSlope = 0.001;\nfunction newtonRaphsonIterate(aX, aGuessT, mX1, mX2) {\n    for (let i = 0; i < newtonIterations; ++i) {\n        const currentSlope = getSlope(aGuessT, mX1, mX2);\n        if (currentSlope === 0.0) {\n            return aGuessT;\n        }\n        const currentX = calcBezier(aGuessT, mX1, mX2) - aX;\n        aGuessT -= currentX / currentSlope;\n    }\n    return aGuessT;\n}\nconst kSplineTableSize = 11;\nconst kSampleStepSize = 1.0 / (kSplineTableSize - 1.0);\nfunction cubicBezier(mX1, mY1, mX2, mY2) {\n    if (mX1 === mY1 && mX2 === mY2)\n        return linear;\n    const sampleValues = new Float32Array(kSplineTableSize);\n    for (let i = 0; i < kSplineTableSize; ++i) {\n        sampleValues[i] = calcBezier(i * kSampleStepSize, mX1, mX2);\n    }\n    function getTForX(aX) {\n        let intervalStart = 0.0;\n        let currentSample = 1;\n        const lastSample = kSplineTableSize - 1;\n        for (; currentSample !== lastSample && sampleValues[currentSample] <= aX; ++currentSample) {\n            intervalStart += kSampleStepSize;\n        }\n        --currentSample;\n        const dist = (aX - sampleValues[currentSample]) /\n            (sampleValues[currentSample + 1] - sampleValues[currentSample]);\n        const guessForT = intervalStart + dist * kSampleStepSize;\n        const initialSlope = getSlope(guessForT, mX1, mX2);\n        if (initialSlope >= newtonMinSlope) {\n            return newtonRaphsonIterate(aX, guessForT, mX1, mX2);\n        }\n        else if (initialSlope === 0.0) {\n            return guessForT;\n        }\n        else {\n            return binarySubdivide(aX, intervalStart, intervalStart + kSampleStepSize, mX1, mX2);\n        }\n    }\n    return (t) => t === 0 || t === 1 ? t : calcBezier(getTForX(t), mY1, mY2);\n}\n\nexport { cubicBezier };\n","import { __read } from 'tslib';\n\nfunction addUniqueItem(arr, item) {\n    arr.indexOf(item) === -1 && arr.push(item);\n}\nfunction removeItem(arr, item) {\n    var index = arr.indexOf(item);\n    index > -1 && arr.splice(index, 1);\n}\n// Adapted from array-move\nfunction moveItem(_a, fromIndex, toIndex) {\n    var _b = __read(_a), arr = _b.slice(0);\n    var startIndex = fromIndex < 0 ? arr.length + fromIndex : fromIndex;\n    if (startIndex >= 0 && startIndex < arr.length) {\n        var endIndex = toIndex < 0 ? arr.length + toIndex : toIndex;\n        var _c = __read(arr.splice(fromIndex, 1), 1), item = _c[0];\n        arr.splice(endIndex, 0, item);\n    }\n    return arr;\n}\n\nexport { addUniqueItem, moveItem, removeItem };\n","import { addUniqueItem, removeItem } from './array.mjs';\n\nvar SubscriptionManager = /** @class */ (function () {\n    function SubscriptionManager() {\n        this.subscriptions = [];\n    }\n    SubscriptionManager.prototype.add = function (handler) {\n        var _this = this;\n        addUniqueItem(this.subscriptions, handler);\n        return function () { return removeItem(_this.subscriptions, handler); };\n    };\n    SubscriptionManager.prototype.notify = function (a, b, c) {\n        var numSubscriptions = this.subscriptions.length;\n        if (!numSubscriptions)\n            return;\n        if (numSubscriptions === 1) {\n            /**\n             * If there's only a single handler we can just call it without invoking a loop.\n             */\n            this.subscriptions[0](a, b, c);\n        }\n        else {\n            for (var i = 0; i < numSubscriptions; i++) {\n                /**\n                 * Check whether the handler exists before firing as it's possible\n                 * the subscriptions were modified during this loop running.\n                 */\n                var handler = this.subscriptions[i];\n                handler && handler(a, b, c);\n            }\n        }\n    };\n    SubscriptionManager.prototype.getSize = function () {\n        return this.subscriptions.length;\n    };\n    SubscriptionManager.prototype.clear = function () {\n        this.subscriptions.length = 0;\n    };\n    return SubscriptionManager;\n}());\n\nexport { SubscriptionManager };\n","import sync, { getFrameData } from 'framesync';\nimport { velocityPerSecond } from 'popmotion';\nimport { SubscriptionManager } from '../utils/subscription-manager.mjs';\n\nvar isFloat = function (value) {\n    return !isNaN(parseFloat(value));\n};\n/**\n * `MotionValue` is used to track the state and velocity of motion values.\n *\n * @public\n */\nvar MotionValue = /** @class */ (function () {\n    /**\n     * @param init - The initiating value\n     * @param config - Optional configuration options\n     *\n     * -  `transformer`: A function to transform incoming values with.\n     *\n     * @internal\n     */\n    function MotionValue(init) {\n        var _this = this;\n        /**\n         * Duration, in milliseconds, since last updating frame.\n         *\n         * @internal\n         */\n        this.timeDelta = 0;\n        /**\n         * Timestamp of the last time this `MotionValue` was updated.\n         *\n         * @internal\n         */\n        this.lastUpdated = 0;\n        /**\n         * Functions to notify when the `MotionValue` updates.\n         *\n         * @internal\n         */\n        this.updateSubscribers = new SubscriptionManager();\n        /**\n         * Functions to notify when the velocity updates.\n         *\n         * @internal\n         */\n        this.velocityUpdateSubscribers = new SubscriptionManager();\n        /**\n         * Functions to notify when the `MotionValue` updates and `render` is set to `true`.\n         *\n         * @internal\n         */\n        this.renderSubscribers = new SubscriptionManager();\n        /**\n         * Tracks whether this value can output a velocity. Currently this is only true\n         * if the value is numerical, but we might be able to widen the scope here and support\n         * other value types.\n         *\n         * @internal\n         */\n        this.canTrackVelocity = false;\n        this.updateAndNotify = function (v, render) {\n            if (render === void 0) { render = true; }\n            _this.prev = _this.current;\n            _this.current = v;\n            // Update timestamp\n            var _a = getFrameData(), delta = _a.delta, timestamp = _a.timestamp;\n            if (_this.lastUpdated !== timestamp) {\n                _this.timeDelta = delta;\n                _this.lastUpdated = timestamp;\n                sync.postRender(_this.scheduleVelocityCheck);\n            }\n            // Update update subscribers\n            if (_this.prev !== _this.current) {\n                _this.updateSubscribers.notify(_this.current);\n            }\n            // Update velocity subscribers\n            if (_this.velocityUpdateSubscribers.getSize()) {\n                _this.velocityUpdateSubscribers.notify(_this.getVelocity());\n            }\n            // Update render subscribers\n            if (render) {\n                _this.renderSubscribers.notify(_this.current);\n            }\n        };\n        /**\n         * Schedule a velocity check for the next frame.\n         *\n         * This is an instanced and bound function to prevent generating a new\n         * function once per frame.\n         *\n         * @internal\n         */\n        this.scheduleVelocityCheck = function () { return sync.postRender(_this.velocityCheck); };\n        /**\n         * Updates `prev` with `current` if the value hasn't been updated this frame.\n         * This ensures velocity calculations return `0`.\n         *\n         * This is an instanced and bound function to prevent generating a new\n         * function once per frame.\n         *\n         * @internal\n         */\n        this.velocityCheck = function (_a) {\n            var timestamp = _a.timestamp;\n            if (timestamp !== _this.lastUpdated) {\n                _this.prev = _this.current;\n                _this.velocityUpdateSubscribers.notify(_this.getVelocity());\n            }\n        };\n        this.hasAnimated = false;\n        this.prev = this.current = init;\n        this.canTrackVelocity = isFloat(this.current);\n    }\n    /**\n     * Adds a function that will be notified when the `MotionValue` is updated.\n     *\n     * It returns a function that, when called, will cancel the subscription.\n     *\n     * When calling `onChange` inside a React component, it should be wrapped with the\n     * `useEffect` hook. As it returns an unsubscribe function, this should be returned\n     * from the `useEffect` function to ensure you don't add duplicate subscribers..\n     *\n     * ```jsx\n     * export const MyComponent = () => {\n     *   const x = useMotionValue(0)\n     *   const y = useMotionValue(0)\n     *   const opacity = useMotionValue(1)\n     *\n     *   useEffect(() => {\n     *     function updateOpacity() {\n     *       const maxXY = Math.max(x.get(), y.get())\n     *       const newOpacity = transform(maxXY, [0, 100], [1, 0])\n     *       opacity.set(newOpacity)\n     *     }\n     *\n     *     const unsubscribeX = x.onChange(updateOpacity)\n     *     const unsubscribeY = y.onChange(updateOpacity)\n     *\n     *     return () => {\n     *       unsubscribeX()\n     *       unsubscribeY()\n     *     }\n     *   }, [])\n     *\n     *   return <motion.div style={{ x }} />\n     * }\n     * ```\n     *\n     * @internalremarks\n     *\n     * We could look into a `useOnChange` hook if the above lifecycle management proves confusing.\n     *\n     * ```jsx\n     * useOnChange(x, () => {})\n     * ```\n     *\n     * @param subscriber - A function that receives the latest value.\n     * @returns A function that, when called, will cancel this subscription.\n     *\n     * @public\n     */\n    MotionValue.prototype.onChange = function (subscription) {\n        return this.updateSubscribers.add(subscription);\n    };\n    MotionValue.prototype.clearListeners = function () {\n        this.updateSubscribers.clear();\n    };\n    /**\n     * Adds a function that will be notified when the `MotionValue` requests a render.\n     *\n     * @param subscriber - A function that's provided the latest value.\n     * @returns A function that, when called, will cancel this subscription.\n     *\n     * @internal\n     */\n    MotionValue.prototype.onRenderRequest = function (subscription) {\n        // Render immediately\n        subscription(this.get());\n        return this.renderSubscribers.add(subscription);\n    };\n    /**\n     * Attaches a passive effect to the `MotionValue`.\n     *\n     * @internal\n     */\n    MotionValue.prototype.attach = function (passiveEffect) {\n        this.passiveEffect = passiveEffect;\n    };\n    /**\n     * Sets the state of the `MotionValue`.\n     *\n     * @remarks\n     *\n     * ```jsx\n     * const x = useMotionValue(0)\n     * x.set(10)\n     * ```\n     *\n     * @param latest - Latest value to set.\n     * @param render - Whether to notify render subscribers. Defaults to `true`\n     *\n     * @public\n     */\n    MotionValue.prototype.set = function (v, render) {\n        if (render === void 0) { render = true; }\n        if (!render || !this.passiveEffect) {\n            this.updateAndNotify(v, render);\n        }\n        else {\n            this.passiveEffect(v, this.updateAndNotify);\n        }\n    };\n    /**\n     * Returns the latest state of `MotionValue`\n     *\n     * @returns - The latest state of `MotionValue`\n     *\n     * @public\n     */\n    MotionValue.prototype.get = function () {\n        return this.current;\n    };\n    /**\n     * @public\n     */\n    MotionValue.prototype.getPrevious = function () {\n        return this.prev;\n    };\n    /**\n     * Returns the latest velocity of `MotionValue`\n     *\n     * @returns - The latest velocity of `MotionValue`. Returns `0` if the state is non-numerical.\n     *\n     * @public\n     */\n    MotionValue.prototype.getVelocity = function () {\n        // This could be isFloat(this.prev) && isFloat(this.current), but that would be wasteful\n        return this.canTrackVelocity\n            ? // These casts could be avoided if parseFloat would be typed better\n                velocityPerSecond(parseFloat(this.current) -\n                    parseFloat(this.prev), this.timeDelta)\n            : 0;\n    };\n    /**\n     * Registers a new animation to control this `MotionValue`. Only one\n     * animation can drive a `MotionValue` at one time.\n     *\n     * ```jsx\n     * value.start()\n     * ```\n     *\n     * @param animation - A function that starts the provided animation\n     *\n     * @internal\n     */\n    MotionValue.prototype.start = function (animation) {\n        var _this = this;\n        this.stop();\n        return new Promise(function (resolve) {\n            _this.hasAnimated = true;\n            _this.stopAnimation = animation(resolve);\n        }).then(function () { return _this.clearAnimation(); });\n    };\n    /**\n     * Stop the currently active animation.\n     *\n     * @public\n     */\n    MotionValue.prototype.stop = function () {\n        if (this.stopAnimation)\n            this.stopAnimation();\n        this.clearAnimation();\n    };\n    /**\n     * Returns `true` if this value is currently animating.\n     *\n     * @public\n     */\n    MotionValue.prototype.isAnimating = function () {\n        return !!this.stopAnimation;\n    };\n    MotionValue.prototype.clearAnimation = function () {\n        this.stopAnimation = null;\n    };\n    /**\n     * Destroy and clean up subscribers to this `MotionValue`.\n     *\n     * The `MotionValue` hooks like `useMotionValue` and `useTransform` automatically\n     * handle the lifecycle of the returned `MotionValue`, so this method is only necessary if you've manually\n     * created a `MotionValue` via the `motionValue` function.\n     *\n     * @public\n     */\n    MotionValue.prototype.destroy = function () {\n        this.updateSubscribers.clear();\n        this.renderSubscribers.clear();\n        this.stop();\n    };\n    return MotionValue;\n}());\n/**\n * @internal\n */\nfunction motionValue(init) {\n    return new MotionValue(init);\n}\n\nexport { MotionValue, motionValue };\n","var isMotionValue = function (value) {\n    return Boolean(value !== null && typeof value === \"object\" && value.getVelocity);\n};\n\nexport { isMotionValue };\n","/**\n * Converts seconds to milliseconds\n *\n * @param seconds - Time in seconds.\n * @return milliseconds - Converted time in milliseconds.\n */\nvar secondsToMilliseconds = function (seconds) { return seconds * 1000; };\n\nexport { secondsToMilliseconds };\n","import { __read } from 'tslib';\nimport { invariant } from 'hey-listen';\nimport { cubicBezier, linear, easeIn, easeInOut, easeOut, circIn, circInOut, circOut, backIn, backInOut, backOut, anticipate, bounceIn, bounceInOut, bounceOut } from 'popmotion';\n\nvar easingLookup = {\n    linear: linear,\n    easeIn: easeIn,\n    easeInOut: easeInOut,\n    easeOut: easeOut,\n    circIn: circIn,\n    circInOut: circInOut,\n    circOut: circOut,\n    backIn: backIn,\n    backInOut: backInOut,\n    backOut: backOut,\n    anticipate: anticipate,\n    bounceIn: bounceIn,\n    bounceInOut: bounceInOut,\n    bounceOut: bounceOut,\n};\nvar easingDefinitionToFunction = function (definition) {\n    if (Array.isArray(definition)) {\n        // If cubic bezier definition, create bezier curve\n        invariant(definition.length === 4, \"Cubic bezier arrays must contain four numerical values.\");\n        var _a = __read(definition, 4), x1 = _a[0], y1 = _a[1], x2 = _a[2], y2 = _a[3];\n        return cubicBezier(x1, y1, x2, y2);\n    }\n    else if (typeof definition === \"string\") {\n        // Else lookup from table\n        invariant(easingLookup[definition] !== undefined, \"Invalid easing type '\".concat(definition, \"'\"));\n        return easingLookup[definition];\n    }\n    return definition;\n};\nvar isEasingArray = function (ease) {\n    return Array.isArray(ease) && typeof ease[0] !== \"number\";\n};\n\nexport { easingDefinitionToFunction, isEasingArray };\n","import { complex } from 'style-value-types';\n\n/**\n * Check if a value is animatable. Examples:\n *\n * ✅: 100, \"100px\", \"#fff\"\n * ❌: \"block\", \"url(2.jpg)\"\n * @param value\n *\n * @internal\n */\nvar isAnimatable = function (key, value) {\n    // If the list of keys tat might be non-animatable grows, replace with Set\n    if (key === \"zIndex\")\n        return false;\n    // If it's a number or a keyframes array, we can animate it. We might at some point\n    // need to do a deep isAnimatable check of keyframes, or let Popmotion handle this,\n    // but for now lets leave it like this for performance reasons\n    if (typeof value === \"number\" || Array.isArray(value))\n        return true;\n    if (typeof value === \"string\" && // It's animatable if we have a string\n        complex.test(value) && // And it contains numbers and/or colors\n        !value.startsWith(\"url(\") // Unless it starts with \"url(\"\n    ) {\n        return true;\n    }\n    return false;\n};\n\nexport { isAnimatable };\n","var isKeyframesTarget = function (v) {\n    return Array.isArray(v);\n};\n\nexport { isKeyframesTarget };\n","import { __assign } from 'tslib';\nimport { isKeyframesTarget } from './is-keyframes-target.mjs';\n\nvar underDampedSpring = function () { return ({\n    type: \"spring\",\n    stiffness: 500,\n    damping: 25,\n    restSpeed: 10,\n}); };\nvar criticallyDampedSpring = function (to) { return ({\n    type: \"spring\",\n    stiffness: 550,\n    damping: to === 0 ? 2 * Math.sqrt(550) : 30,\n    restSpeed: 10,\n}); };\nvar linearTween = function () { return ({\n    type: \"keyframes\",\n    ease: \"linear\",\n    duration: 0.3,\n}); };\nvar keyframes = function (values) { return ({\n    type: \"keyframes\",\n    duration: 0.8,\n    values: values,\n}); };\nvar defaultTransitions = {\n    x: underDampedSpring,\n    y: underDampedSpring,\n    z: underDampedSpring,\n    rotate: underDampedSpring,\n    rotateX: underDampedSpring,\n    rotateY: underDampedSpring,\n    rotateZ: underDampedSpring,\n    scaleX: criticallyDampedSpring,\n    scaleY: criticallyDampedSpring,\n    scale: criticallyDampedSpring,\n    opacity: linearTween,\n    backgroundColor: linearTween,\n    color: linearTween,\n    default: criticallyDampedSpring,\n};\nvar getDefaultTransition = function (valueKey, to) {\n    var transitionFactory;\n    if (isKeyframesTarget(to)) {\n        transitionFactory = keyframes;\n    }\n    else {\n        transitionFactory =\n            defaultTransitions[valueKey] || defaultTransitions.default;\n    }\n    return __assign({ to: to }, transitionFactory(to));\n};\n\nexport { criticallyDampedSpring, getDefaultTransition, linearTween, underDampedSpring };\n","import { __assign } from 'tslib';\nimport { number } from 'style-value-types';\n\nvar int = __assign(__assign({}, number), { transform: Math.round });\n\nexport { int };\n","import { px, degrees, scale, alpha, progressPercentage } from 'style-value-types';\nimport { int } from './type-int.mjs';\n\nvar numberValueTypes = {\n    // Border props\n    borderWidth: px,\n    borderTopWidth: px,\n    borderRightWidth: px,\n    borderBottomWidth: px,\n    borderLeftWidth: px,\n    borderRadius: px,\n    radius: px,\n    borderTopLeftRadius: px,\n    borderTopRightRadius: px,\n    borderBottomRightRadius: px,\n    borderBottomLeftRadius: px,\n    // Positioning props\n    width: px,\n    maxWidth: px,\n    height: px,\n    maxHeight: px,\n    size: px,\n    top: px,\n    right: px,\n    bottom: px,\n    left: px,\n    // Spacing props\n    padding: px,\n    paddingTop: px,\n    paddingRight: px,\n    paddingBottom: px,\n    paddingLeft: px,\n    margin: px,\n    marginTop: px,\n    marginRight: px,\n    marginBottom: px,\n    marginLeft: px,\n    // Transform props\n    rotate: degrees,\n    rotateX: degrees,\n    rotateY: degrees,\n    rotateZ: degrees,\n    scale: scale,\n    scaleX: scale,\n    scaleY: scale,\n    scaleZ: scale,\n    skew: degrees,\n    skewX: degrees,\n    skewY: degrees,\n    distance: px,\n    translateX: px,\n    translateY: px,\n    translateZ: px,\n    x: px,\n    y: px,\n    z: px,\n    perspective: px,\n    transformPerspective: px,\n    opacity: alpha,\n    originX: progressPercentage,\n    originY: progressPercentage,\n    originZ: px,\n    // Misc\n    zIndex: int,\n    // SVG\n    fillOpacity: alpha,\n    strokeOpacity: alpha,\n    numOctaves: int,\n};\n\nexport { numberValueTypes };\n","import { __assign } from 'tslib';\nimport { color, filter } from 'style-value-types';\nimport { numberValueTypes } from './number.mjs';\n\n/**\n * A map of default value types for common values\n */\nvar defaultValueTypes = __assign(__assign({}, numberValueTypes), { \n    // Color props\n    color: color, backgroundColor: color, outlineColor: color, fill: color, stroke: color, \n    // Border props\n    borderColor: color, borderTopColor: color, borderRightColor: color, borderBottomColor: color, borderLeftColor: color, filter: filter, WebkitFilter: filter });\n/**\n * Gets the default ValueType for the provided value key\n */\nvar getDefaultValueType = function (key) { return defaultValueTypes[key]; };\n\nexport { defaultValueTypes, getDefaultValueType };\n","import { filter, complex } from 'style-value-types';\nimport { getDefaultValueType } from './defaults.mjs';\n\nfunction getAnimatableNone(key, value) {\n    var _a;\n    var defaultValueType = getDefaultValueType(key);\n    if (defaultValueType !== filter)\n        defaultValueType = complex;\n    // If value is not recognised as animatable, ie \"none\", create an animatable version origin based on the target\n    return (_a = defaultValueType.getAnimatableNone) === null || _a === void 0 ? void 0 : _a.call(defaultValueType, value);\n}\n\nexport { getAnimatableNone };\n","var instantAnimationState = {\n    current: false,\n};\n\nexport { instantAnimationState };\n","import { isKeyframesTarget } from '../animation/utils/is-keyframes-target.mjs';\n\nvar isCustomValue = function (v) {\n    return Boolean(v && typeof v === \"object\" && v.mix && v.toValue);\n};\nvar resolveFinalValueInKeyframes = function (v) {\n    // TODO maybe throw if v.length - 1 is placeholder token?\n    return isKeyframesTarget(v) ? v[v.length - 1] || 0 : v;\n};\n\nexport { isCustomValue, resolveFinalValueInKeyframes };\n","import { __assign, __rest, __spreadArray, __read } from 'tslib';\nimport { inertia, animate } from 'popmotion';\nimport { secondsToMilliseconds } from '../../utils/time-conversion.mjs';\nimport { isEasingArray, easingDefinitionToFunction } from './easing.mjs';\nimport { isAnimatable } from './is-animatable.mjs';\nimport { getDefaultTransition } from './default-transitions.mjs';\nimport { warning } from 'hey-listen';\nimport { getAnimatableNone } from '../../render/dom/value-types/animatable-none.mjs';\nimport { instantAnimationState } from '../../utils/use-instant-transition-state.mjs';\nimport { resolveFinalValueInKeyframes } from '../../utils/resolve-value.mjs';\n\n/**\n * Decide whether a transition is defined on a given Transition.\n * This filters out orchestration options and returns true\n * if any options are left.\n */\nfunction isTransitionDefined(_a) {\n    _a.when; _a.delay; _a.delayChildren; _a.staggerChildren; _a.staggerDirection; _a.repeat; _a.repeatType; _a.repeatDelay; _a.from; var transition = __rest(_a, [\"when\", \"delay\", \"delayChildren\", \"staggerChildren\", \"staggerDirection\", \"repeat\", \"repeatType\", \"repeatDelay\", \"from\"]);\n    return !!Object.keys(transition).length;\n}\nvar legacyRepeatWarning = false;\n/**\n * Convert Framer Motion's Transition type into Popmotion-compatible options.\n */\nfunction convertTransitionToAnimationOptions(_a) {\n    var ease = _a.ease, times = _a.times, yoyo = _a.yoyo, flip = _a.flip, loop = _a.loop, transition = __rest(_a, [\"ease\", \"times\", \"yoyo\", \"flip\", \"loop\"]);\n    var options = __assign({}, transition);\n    if (times)\n        options[\"offset\"] = times;\n    /**\n     * Convert any existing durations from seconds to milliseconds\n     */\n    if (transition.duration)\n        options[\"duration\"] = secondsToMilliseconds(transition.duration);\n    if (transition.repeatDelay)\n        options.repeatDelay = secondsToMilliseconds(transition.repeatDelay);\n    /**\n     * Map easing names to Popmotion's easing functions\n     */\n    if (ease) {\n        options[\"ease\"] = isEasingArray(ease)\n            ? ease.map(easingDefinitionToFunction)\n            : easingDefinitionToFunction(ease);\n    }\n    /**\n     * Support legacy transition API\n     */\n    if (transition.type === \"tween\")\n        options.type = \"keyframes\";\n    /**\n     * TODO: These options are officially removed from the API.\n     */\n    if (yoyo || loop || flip) {\n        warning(!legacyRepeatWarning, \"yoyo, loop and flip have been removed from the API. Replace with repeat and repeatType options.\");\n        legacyRepeatWarning = true;\n        if (yoyo) {\n            options.repeatType = \"reverse\";\n        }\n        else if (loop) {\n            options.repeatType = \"loop\";\n        }\n        else if (flip) {\n            options.repeatType = \"mirror\";\n        }\n        options.repeat = loop || yoyo || flip || transition.repeat;\n    }\n    /**\n     * TODO: Popmotion 9 has the ability to automatically detect whether to use\n     * a keyframes or spring animation, but does so by detecting velocity and other spring options.\n     * It'd be good to introduce a similar thing here.\n     */\n    if (transition.type !== \"spring\")\n        options.type = \"keyframes\";\n    return options;\n}\n/**\n * Get the delay for a value by checking Transition with decreasing specificity.\n */\nfunction getDelayFromTransition(transition, key) {\n    var _a, _b;\n    var valueTransition = getValueTransition(transition, key) || {};\n    return (_b = (_a = valueTransition.delay) !== null && _a !== void 0 ? _a : transition.delay) !== null && _b !== void 0 ? _b : 0;\n}\nfunction hydrateKeyframes(options) {\n    if (Array.isArray(options.to) && options.to[0] === null) {\n        options.to = __spreadArray([], __read(options.to), false);\n        options.to[0] = options.from;\n    }\n    return options;\n}\nfunction getPopmotionAnimationOptions(transition, options, key) {\n    var _a;\n    if (Array.isArray(options.to)) {\n        (_a = transition.duration) !== null && _a !== void 0 ? _a : (transition.duration = 0.8);\n    }\n    hydrateKeyframes(options);\n    /**\n     * Get a default transition if none is determined to be defined.\n     */\n    if (!isTransitionDefined(transition)) {\n        transition = __assign(__assign({}, transition), getDefaultTransition(key, options.to));\n    }\n    return __assign(__assign({}, options), convertTransitionToAnimationOptions(transition));\n}\n/**\n *\n */\nfunction getAnimation(key, value, target, transition, onComplete) {\n    var _a;\n    var valueTransition = getValueTransition(transition, key);\n    var origin = (_a = valueTransition.from) !== null && _a !== void 0 ? _a : value.get();\n    var isTargetAnimatable = isAnimatable(key, target);\n    if (origin === \"none\" && isTargetAnimatable && typeof target === \"string\") {\n        /**\n         * If we're trying to animate from \"none\", try and get an animatable version\n         * of the target. This could be improved to work both ways.\n         */\n        origin = getAnimatableNone(key, target);\n    }\n    else if (isZero(origin) && typeof target === \"string\") {\n        origin = getZeroUnit(target);\n    }\n    else if (!Array.isArray(target) &&\n        isZero(target) &&\n        typeof origin === \"string\") {\n        target = getZeroUnit(origin);\n    }\n    var isOriginAnimatable = isAnimatable(key, origin);\n    warning(isOriginAnimatable === isTargetAnimatable, \"You are trying to animate \".concat(key, \" from \\\"\").concat(origin, \"\\\" to \\\"\").concat(target, \"\\\". \").concat(origin, \" is not an animatable value - to enable this animation set \").concat(origin, \" to a value animatable to \").concat(target, \" via the `style` property.\"));\n    function start() {\n        var options = {\n            from: origin,\n            to: target,\n            velocity: value.getVelocity(),\n            onComplete: onComplete,\n            onUpdate: function (v) { return value.set(v); },\n        };\n        return valueTransition.type === \"inertia\" ||\n            valueTransition.type === \"decay\"\n            ? inertia(__assign(__assign({}, options), valueTransition))\n            : animate(__assign(__assign({}, getPopmotionAnimationOptions(valueTransition, options, key)), { onUpdate: function (v) {\n                    var _a;\n                    options.onUpdate(v);\n                    (_a = valueTransition.onUpdate) === null || _a === void 0 ? void 0 : _a.call(valueTransition, v);\n                }, onComplete: function () {\n                    var _a;\n                    options.onComplete();\n                    (_a = valueTransition.onComplete) === null || _a === void 0 ? void 0 : _a.call(valueTransition);\n                } }));\n    }\n    function set() {\n        var _a, _b;\n        var finalTarget = resolveFinalValueInKeyframes(target);\n        value.set(finalTarget);\n        onComplete();\n        (_a = valueTransition === null || valueTransition === void 0 ? void 0 : valueTransition.onUpdate) === null || _a === void 0 ? void 0 : _a.call(valueTransition, finalTarget);\n        (_b = valueTransition === null || valueTransition === void 0 ? void 0 : valueTransition.onComplete) === null || _b === void 0 ? void 0 : _b.call(valueTransition);\n        return { stop: function () { } };\n    }\n    return !isOriginAnimatable ||\n        !isTargetAnimatable ||\n        valueTransition.type === false\n        ? set\n        : start;\n}\nfunction isZero(value) {\n    return (value === 0 ||\n        (typeof value === \"string\" &&\n            parseFloat(value) === 0 &&\n            value.indexOf(\" \") === -1));\n}\nfunction getZeroUnit(potentialUnitType) {\n    return typeof potentialUnitType === \"number\"\n        ? 0\n        : getAnimatableNone(\"\", potentialUnitType);\n}\nfunction getValueTransition(transition, key) {\n    return transition[key] || transition[\"default\"] || transition;\n}\n/**\n * Start animation on a MotionValue. This function is an interface between\n * Framer Motion and Popmotion\n *\n * @internal\n */\nfunction startAnimation(key, value, target, transition) {\n    if (transition === void 0) { transition = {}; }\n    if (instantAnimationState.current) {\n        transition = { type: false };\n    }\n    return value.start(function (onComplete) {\n        var delayTimer;\n        var controls;\n        var animation = getAnimation(key, value, target, transition, onComplete);\n        var delay = getDelayFromTransition(transition, key);\n        var start = function () { return (controls = animation()); };\n        if (delay) {\n            delayTimer = setTimeout(start, secondsToMilliseconds(delay));\n        }\n        else {\n            start();\n        }\n        return function () {\n            clearTimeout(delayTimer);\n            controls === null || controls === void 0 ? void 0 : controls.stop();\n        };\n    });\n}\n\nexport { convertTransitionToAnimationOptions, getDelayFromTransition, getPopmotionAnimationOptions, getValueTransition, getZeroUnit, hydrateKeyframes, isTransitionDefined, isZero, startAnimation };\n","var scaleCorrectors = {};\nfunction addScaleCorrector(correctors) {\n    Object.assign(scaleCorrectors, correctors);\n}\n\nexport { addScaleCorrector, scaleCorrectors };\n","/**\n * A list of all transformable axes. We'll use this list to generated a version\n * of each axes for each transform.\n */\nvar transformAxes = [\"\", \"X\", \"Y\", \"Z\"];\n/**\n * An ordered array of each transformable value. By default, transform values\n * will be sorted to this order.\n */\nvar order = [\"translate\", \"scale\", \"rotate\", \"skew\"];\n/**\n * Generate a list of every possible transform key.\n */\nvar transformProps = [\"transformPerspective\", \"x\", \"y\", \"z\"];\norder.forEach(function (operationKey) {\n    return transformAxes.forEach(function (axesKey) {\n        return transformProps.push(operationKey + axesKey);\n    });\n});\n/**\n * A function to use with Array.sort to sort transform keys by their default order.\n */\nfunction sortTransformProps(a, b) {\n    return transformProps.indexOf(a) - transformProps.indexOf(b);\n}\n/**\n * A quick lookup for transform props.\n */\nvar transformPropSet = new Set(transformProps);\nfunction isTransformProp(key) {\n    return transformPropSet.has(key);\n}\n/**\n * A quick lookup for transform origin props\n */\nvar transformOriginProps = new Set([\"originX\", \"originY\", \"originZ\"]);\nfunction isTransformOriginProp(key) {\n    return transformOriginProps.has(key);\n}\n\nexport { isTransformOriginProp, isTransformProp, sortTransformProps, transformAxes, transformProps };\n","import { isCustomValue } from '../../utils/resolve-value.mjs';\nimport { isMotionValue } from './is-motion-value.mjs';\n\n/**\n * If the provided value is a MotionValue, this returns the actual value, otherwise just the value itself\n *\n * TODO: Remove and move to library\n *\n * @internal\n */\nfunction resolveMotionValue(value) {\n    var unwrappedValue = isMotionValue(value) ? value.get() : value;\n    return isCustomValue(unwrappedValue)\n        ? unwrappedValue.toValue()\n        : unwrappedValue;\n}\n\nexport { resolveMotionValue };\n","import { __spreadArray, __read, __assign } from 'tslib';\nimport sync, { cancelSync, flushSync } from 'framesync';\nimport { mix } from 'popmotion';\nimport { animate } from '../../animation/animate.mjs';\nimport { SubscriptionManager } from '../../utils/subscription-manager.mjs';\nimport { mixValues } from '../animation/mix-values.mjs';\nimport { copyBoxInto } from '../geometry/copy.mjs';\nimport { translateAxis, transformBox, applyBoxDelta, applyTreeDeltas } from '../geometry/delta-apply.mjs';\nimport { calcRelativePosition, calcRelativeBox, calcBoxDelta, calcLength } from '../geometry/delta-calc.mjs';\nimport { removeBoxTransforms } from '../geometry/delta-remove.mjs';\nimport { createBox, createDelta } from '../geometry/models.mjs';\nimport { getValueTransition } from '../../animation/utils/transitions.mjs';\nimport { boxEquals, isDeltaZero } from '../geometry/utils.mjs';\nimport { NodeStack } from '../shared/stack.mjs';\nimport { scaleCorrectors } from '../styles/scale-correction.mjs';\nimport { buildProjectionTransform } from '../styles/transform.mjs';\nimport { eachAxis } from '../utils/each-axis.mjs';\nimport { hasTransform, hasScale } from '../utils/has-transform.mjs';\nimport { transformAxes } from '../../render/html/utils/transform.mjs';\nimport { FlatTree } from '../../render/utils/flat-tree.mjs';\nimport { resolveMotionValue } from '../../value/utils/resolve-motion-value.mjs';\n\n/**\n * We use 1000 as the animation target as 0-1000 maps better to pixels than 0-1\n * which has a noticeable difference in spring animations\n */\nvar animationTarget = 1000;\n/**\n * This should only ever be modified on the client otherwise it'll\n * persist through server requests. If we need instanced states we\n * could lazy-init via root.\n */\nvar globalProjectionState = {\n    /**\n     * Global flag as to whether the tree has animated since the last time\n     * we resized the window\n     */\n    hasAnimatedSinceResize: true,\n    /**\n     * We set this to true once, on the first update. Any nodes added to the tree beyond that\n     * update will be given a `data-projection-id` attribute.\n     */\n    hasEverUpdated: false,\n};\nfunction createProjectionNode(_a) {\n    var attachResizeListener = _a.attachResizeListener, defaultParent = _a.defaultParent, measureScroll = _a.measureScroll, resetTransform = _a.resetTransform;\n    return /** @class */ (function () {\n        function ProjectionNode(id, latestValues, parent) {\n            var _this = this;\n            if (latestValues === void 0) { latestValues = {}; }\n            if (parent === void 0) { parent = defaultParent === null || defaultParent === void 0 ? void 0 : defaultParent(); }\n            /**\n             * A Set containing all this component's children. This is used to iterate\n             * through the children.\n             *\n             * TODO: This could be faster to iterate as a flat array stored on the root node.\n             */\n            this.children = new Set();\n            /**\n             * Options for the node. We use this to configure what kind of layout animations\n             * we should perform (if any).\n             */\n            this.options = {};\n            /**\n             * We use this to detect when its safe to shut down part of a projection tree.\n             * We have to keep projecting children for scale correction and relative projection\n             * until all their parents stop performing layout animations.\n             */\n            this.isTreeAnimating = false;\n            this.isAnimationBlocked = false;\n            /**\n             * Flag to true if we think this layout has been changed. We can't always know this,\n             * currently we set it to true every time a component renders, or if it has a layoutDependency\n             * if that has changed between renders. Additionally, components can be grouped by LayoutGroup\n             * and if one node is dirtied, they all are.\n             */\n            this.isLayoutDirty = false;\n            /**\n             * Block layout updates for instant layout transitions throughout the tree.\n             */\n            this.updateManuallyBlocked = false;\n            this.updateBlockedByResize = false;\n            /**\n             * Set to true between the start of the first `willUpdate` call and the end of the `didUpdate`\n             * call.\n             */\n            this.isUpdating = false;\n            /**\n             * If this is an SVG element we currently disable projection transforms\n             */\n            this.isSVG = false;\n            /**\n             * Flag to true (during promotion) if a node doing an instant layout transition needs to reset\n             * its projection styles.\n             */\n            this.needsReset = false;\n            /**\n             * Flags whether this node should have its transform reset prior to measuring.\n             */\n            this.shouldResetTransform = false;\n            /**\n             * An object representing the calculated contextual/accumulated/tree scale.\n             * This will be used to scale calculcated projection transforms, as these are\n             * calculated in screen-space but need to be scaled for elements to actually\n             * make it to their calculated destinations.\n             *\n             * TODO: Lazy-init\n             */\n            this.treeScale = { x: 1, y: 1 };\n            /**\n             *\n             */\n            this.eventHandlers = new Map();\n            // Note: Currently only running on root node\n            this.potentialNodes = new Map();\n            this.checkUpdateFailed = function () {\n                if (_this.isUpdating) {\n                    _this.isUpdating = false;\n                    _this.clearAllSnapshots();\n                }\n            };\n            this.updateProjection = function () {\n                _this.nodes.forEach(resolveTargetDelta);\n                _this.nodes.forEach(calcProjection);\n            };\n            this.hasProjected = false;\n            this.isVisible = true;\n            /**\n             * Animation\n             */\n            this.animationProgress = 0;\n            /**\n             * Shared layout\n             */\n            // TODO Only running on root node\n            this.sharedNodes = new Map();\n            this.id = id;\n            this.latestValues = latestValues;\n            this.root = parent ? parent.root || parent : this;\n            this.path = parent ? __spreadArray(__spreadArray([], __read(parent.path), false), [parent], false) : [];\n            this.parent = parent;\n            this.depth = parent ? parent.depth + 1 : 0;\n            id && this.root.registerPotentialNode(id, this);\n            for (var i = 0; i < this.path.length; i++) {\n                this.path[i].shouldResetTransform = true;\n            }\n            if (this.root === this)\n                this.nodes = new FlatTree();\n        }\n        ProjectionNode.prototype.addEventListener = function (name, handler) {\n            if (!this.eventHandlers.has(name)) {\n                this.eventHandlers.set(name, new SubscriptionManager());\n            }\n            return this.eventHandlers.get(name).add(handler);\n        };\n        ProjectionNode.prototype.notifyListeners = function (name) {\n            var args = [];\n            for (var _i = 1; _i < arguments.length; _i++) {\n                args[_i - 1] = arguments[_i];\n            }\n            var subscriptionManager = this.eventHandlers.get(name);\n            subscriptionManager === null || subscriptionManager === void 0 ? void 0 : subscriptionManager.notify.apply(subscriptionManager, __spreadArray([], __read(args), false));\n        };\n        ProjectionNode.prototype.hasListeners = function (name) {\n            return this.eventHandlers.has(name);\n        };\n        ProjectionNode.prototype.registerPotentialNode = function (id, node) {\n            this.potentialNodes.set(id, node);\n        };\n        /**\n         * Lifecycles\n         */\n        ProjectionNode.prototype.mount = function (instance, isLayoutDirty) {\n            var _this = this;\n            var _a;\n            if (isLayoutDirty === void 0) { isLayoutDirty = false; }\n            if (this.instance)\n                return;\n            this.isSVG =\n                instance instanceof SVGElement && instance.tagName !== \"svg\";\n            this.instance = instance;\n            var _b = this.options, layoutId = _b.layoutId, layout = _b.layout, visualElement = _b.visualElement;\n            if (visualElement && !visualElement.getInstance()) {\n                visualElement.mount(instance);\n            }\n            this.root.nodes.add(this);\n            (_a = this.parent) === null || _a === void 0 ? void 0 : _a.children.add(this);\n            this.id && this.root.potentialNodes.delete(this.id);\n            if (isLayoutDirty && (layout || layoutId)) {\n                this.isLayoutDirty = true;\n            }\n            if (attachResizeListener) {\n                var unblockTimeout_1;\n                var resizeUnblockUpdate_1 = function () {\n                    return (_this.root.updateBlockedByResize = false);\n                };\n                attachResizeListener(instance, function () {\n                    _this.root.updateBlockedByResize = true;\n                    clearTimeout(unblockTimeout_1);\n                    unblockTimeout_1 = setTimeout(resizeUnblockUpdate_1, 250);\n                    if (globalProjectionState.hasAnimatedSinceResize) {\n                        globalProjectionState.hasAnimatedSinceResize = false;\n                        _this.nodes.forEach(finishAnimation);\n                    }\n                });\n            }\n            if (layoutId) {\n                this.root.registerSharedNode(layoutId, this);\n            }\n            // Only register the handler if it requires layout animation\n            if (this.options.animate !== false &&\n                visualElement &&\n                (layoutId || layout)) {\n                this.addEventListener(\"didUpdate\", function (_a) {\n                    var _b, _c, _d, _e, _f;\n                    var delta = _a.delta, hasLayoutChanged = _a.hasLayoutChanged, hasRelativeTargetChanged = _a.hasRelativeTargetChanged, newLayout = _a.layout;\n                    if (_this.isTreeAnimationBlocked()) {\n                        _this.target = undefined;\n                        _this.relativeTarget = undefined;\n                        return;\n                    }\n                    // TODO: Check here if an animation exists\n                    var layoutTransition = (_c = (_b = _this.options.transition) !== null && _b !== void 0 ? _b : visualElement.getDefaultTransition()) !== null && _c !== void 0 ? _c : defaultLayoutTransition;\n                    var onLayoutAnimationComplete = visualElement.getProps().onLayoutAnimationComplete;\n                    /**\n                     * The target layout of the element might stay the same,\n                     * but its position relative to its parent has changed.\n                     */\n                    var targetChanged = !_this.targetLayout ||\n                        !boxEquals(_this.targetLayout, newLayout) ||\n                        hasRelativeTargetChanged;\n                    /**\n                     * If the layout hasn't seemed to have changed, it might be that the\n                     * element is visually in the same place in the document but its position\n                     * relative to its parent has indeed changed. So here we check for that.\n                     */\n                    var hasOnlyRelativeTargetChanged = !hasLayoutChanged && hasRelativeTargetChanged;\n                    if (((_d = _this.resumeFrom) === null || _d === void 0 ? void 0 : _d.instance) ||\n                        hasOnlyRelativeTargetChanged ||\n                        (hasLayoutChanged &&\n                            (targetChanged || !_this.currentAnimation))) {\n                        if (_this.resumeFrom) {\n                            _this.resumingFrom = _this.resumeFrom;\n                            _this.resumingFrom.resumingFrom = undefined;\n                        }\n                        _this.setAnimationOrigin(delta, hasOnlyRelativeTargetChanged);\n                        _this.startAnimation(__assign(__assign({}, getValueTransition(layoutTransition, \"layout\")), { onComplete: onLayoutAnimationComplete }));\n                    }\n                    else {\n                        _this.isLead() && ((_f = (_e = _this.options).onExitComplete) === null || _f === void 0 ? void 0 : _f.call(_e));\n                    }\n                    _this.targetLayout = newLayout;\n                });\n            }\n        };\n        ProjectionNode.prototype.unmount = function () {\n            var _a, _b;\n            this.options.layoutId && this.willUpdate();\n            this.root.nodes.remove(this);\n            (_a = this.getStack()) === null || _a === void 0 ? void 0 : _a.remove(this);\n            (_b = this.parent) === null || _b === void 0 ? void 0 : _b.children.delete(this);\n            this.instance = undefined;\n            cancelSync.preRender(this.updateProjection);\n        };\n        // only on the root\n        ProjectionNode.prototype.blockUpdate = function () {\n            this.updateManuallyBlocked = true;\n        };\n        ProjectionNode.prototype.unblockUpdate = function () {\n            this.updateManuallyBlocked = false;\n        };\n        ProjectionNode.prototype.isUpdateBlocked = function () {\n            return this.updateManuallyBlocked || this.updateBlockedByResize;\n        };\n        ProjectionNode.prototype.isTreeAnimationBlocked = function () {\n            var _a;\n            return (this.isAnimationBlocked ||\n                ((_a = this.parent) === null || _a === void 0 ? void 0 : _a.isTreeAnimationBlocked()) ||\n                false);\n        };\n        // Note: currently only running on root node\n        ProjectionNode.prototype.startUpdate = function () {\n            var _a;\n            if (this.isUpdateBlocked())\n                return;\n            this.isUpdating = true;\n            (_a = this.nodes) === null || _a === void 0 ? void 0 : _a.forEach(resetRotation);\n        };\n        ProjectionNode.prototype.willUpdate = function (shouldNotifyListeners) {\n            var _a, _b, _c;\n            if (shouldNotifyListeners === void 0) { shouldNotifyListeners = true; }\n            if (this.root.isUpdateBlocked()) {\n                (_b = (_a = this.options).onExitComplete) === null || _b === void 0 ? void 0 : _b.call(_a);\n                return;\n            }\n            !this.root.isUpdating && this.root.startUpdate();\n            if (this.isLayoutDirty)\n                return;\n            this.isLayoutDirty = true;\n            for (var i = 0; i < this.path.length; i++) {\n                var node = this.path[i];\n                node.shouldResetTransform = true;\n                /**\n                 * TODO: Check we haven't updated the scroll\n                 * since the last didUpdate\n                 */\n                node.updateScroll();\n            }\n            var _d = this.options, layoutId = _d.layoutId, layout = _d.layout;\n            if (layoutId === undefined && !layout)\n                return;\n            var transformTemplate = (_c = this.options.visualElement) === null || _c === void 0 ? void 0 : _c.getProps().transformTemplate;\n            this.prevTransformTemplateValue = transformTemplate === null || transformTemplate === void 0 ? void 0 : transformTemplate(this.latestValues, \"\");\n            this.updateSnapshot();\n            shouldNotifyListeners && this.notifyListeners(\"willUpdate\");\n        };\n        // Note: Currently only running on root node\n        ProjectionNode.prototype.didUpdate = function () {\n            var updateWasBlocked = this.isUpdateBlocked();\n            // When doing an instant transition, we skip the layout update,\n            // but should still clean up the measurements so that the next\n            // snapshot could be taken correctly.\n            if (updateWasBlocked) {\n                this.unblockUpdate();\n                this.clearAllSnapshots();\n                this.nodes.forEach(clearMeasurements);\n                return;\n            }\n            if (!this.isUpdating)\n                return;\n            this.isUpdating = false;\n            /**\n             * Search for and mount newly-added projection elements.\n             *\n             * TODO: Every time a new component is rendered we could search up the tree for\n             * the closest mounted node and query from there rather than document.\n             */\n            if (this.potentialNodes.size) {\n                this.potentialNodes.forEach(mountNodeEarly);\n                this.potentialNodes.clear();\n            }\n            /**\n             * Write\n             */\n            this.nodes.forEach(resetTransformStyle);\n            /**\n             * Read ==================\n             */\n            // Update layout measurements of updated children\n            this.nodes.forEach(updateLayout);\n            /**\n             * Write\n             */\n            // Notify listeners that the layout is updated\n            this.nodes.forEach(notifyLayoutUpdate);\n            this.clearAllSnapshots();\n            // Flush any scheduled updates\n            flushSync.update();\n            flushSync.preRender();\n            flushSync.render();\n        };\n        ProjectionNode.prototype.clearAllSnapshots = function () {\n            this.nodes.forEach(clearSnapshot);\n            this.sharedNodes.forEach(removeLeadSnapshots);\n        };\n        ProjectionNode.prototype.scheduleUpdateProjection = function () {\n            sync.preRender(this.updateProjection, false, true);\n        };\n        ProjectionNode.prototype.scheduleCheckAfterUnmount = function () {\n            var _this = this;\n            /**\n             * If the unmounting node is in a layoutGroup and did trigger a willUpdate,\n             * we manually call didUpdate to give a chance to the siblings to animate.\n             * Otherwise, cleanup all snapshots to prevents future nodes from reusing them.\n             */\n            sync.postRender(function () {\n                if (_this.isLayoutDirty) {\n                    _this.root.didUpdate();\n                }\n                else {\n                    _this.root.checkUpdateFailed();\n                }\n            });\n        };\n        /**\n         * Update measurements\n         */\n        ProjectionNode.prototype.updateSnapshot = function () {\n            if (this.snapshot || !this.instance)\n                return;\n            var measured = this.measure();\n            var layout = this.removeTransform(this.removeElementScroll(measured));\n            roundBox(layout);\n            this.snapshot = {\n                measured: measured,\n                layout: layout,\n                latestValues: {},\n            };\n        };\n        ProjectionNode.prototype.updateLayout = function () {\n            var _a;\n            if (!this.instance)\n                return;\n            // TODO: Incorporate into a forwarded scroll offset\n            this.updateScroll();\n            if (!(this.options.alwaysMeasureLayout && this.isLead()) &&\n                !this.isLayoutDirty) {\n                return;\n            }\n            /**\n             * When a node is mounted, it simply resumes from the prevLead's\n             * snapshot instead of taking a new one, but the ancestors scroll\n             * might have updated while the prevLead is unmounted. We need to\n             * update the scroll again to make sure the layout we measure is\n             * up to date.\n             */\n            if (this.resumeFrom && !this.resumeFrom.instance) {\n                for (var i = 0; i < this.path.length; i++) {\n                    var node = this.path[i];\n                    node.updateScroll();\n                }\n            }\n            var measured = this.measure();\n            roundBox(measured);\n            var prevLayout = this.layout;\n            this.layout = {\n                measured: measured,\n                actual: this.removeElementScroll(measured),\n            };\n            this.layoutCorrected = createBox();\n            this.isLayoutDirty = false;\n            this.projectionDelta = undefined;\n            this.notifyListeners(\"measure\", this.layout.actual);\n            (_a = this.options.visualElement) === null || _a === void 0 ? void 0 : _a.notifyLayoutMeasure(this.layout.actual, prevLayout === null || prevLayout === void 0 ? void 0 : prevLayout.actual);\n        };\n        ProjectionNode.prototype.updateScroll = function () {\n            if (this.options.layoutScroll && this.instance) {\n                this.scroll = measureScroll(this.instance);\n            }\n        };\n        ProjectionNode.prototype.resetTransform = function () {\n            var _a;\n            if (!resetTransform)\n                return;\n            var isResetRequested = this.isLayoutDirty || this.shouldResetTransform;\n            var hasProjection = this.projectionDelta && !isDeltaZero(this.projectionDelta);\n            var transformTemplate = (_a = this.options.visualElement) === null || _a === void 0 ? void 0 : _a.getProps().transformTemplate;\n            var transformTemplateValue = transformTemplate === null || transformTemplate === void 0 ? void 0 : transformTemplate(this.latestValues, \"\");\n            var transformTemplateHasChanged = transformTemplateValue !== this.prevTransformTemplateValue;\n            if (isResetRequested &&\n                (hasProjection ||\n                    hasTransform(this.latestValues) ||\n                    transformTemplateHasChanged)) {\n                resetTransform(this.instance, transformTemplateValue);\n                this.shouldResetTransform = false;\n                this.scheduleRender();\n            }\n        };\n        ProjectionNode.prototype.measure = function () {\n            var visualElement = this.options.visualElement;\n            if (!visualElement)\n                return createBox();\n            var box = visualElement.measureViewportBox();\n            // Remove viewport scroll to give page-relative coordinates\n            var scroll = this.root.scroll;\n            if (scroll) {\n                translateAxis(box.x, scroll.x);\n                translateAxis(box.y, scroll.y);\n            }\n            return box;\n        };\n        ProjectionNode.prototype.removeElementScroll = function (box) {\n            var boxWithoutScroll = createBox();\n            copyBoxInto(boxWithoutScroll, box);\n            /**\n             * Performance TODO: Keep a cumulative scroll offset down the tree\n             * rather than loop back up the path.\n             */\n            for (var i = 0; i < this.path.length; i++) {\n                var node = this.path[i];\n                var scroll_1 = node.scroll, options = node.options;\n                if (node !== this.root && scroll_1 && options.layoutScroll) {\n                    translateAxis(boxWithoutScroll.x, scroll_1.x);\n                    translateAxis(boxWithoutScroll.y, scroll_1.y);\n                }\n            }\n            return boxWithoutScroll;\n        };\n        ProjectionNode.prototype.applyTransform = function (box, transformOnly) {\n            if (transformOnly === void 0) { transformOnly = false; }\n            var withTransforms = createBox();\n            copyBoxInto(withTransforms, box);\n            for (var i = 0; i < this.path.length; i++) {\n                var node = this.path[i];\n                if (!transformOnly &&\n                    node.options.layoutScroll &&\n                    node.scroll &&\n                    node !== node.root) {\n                    transformBox(withTransforms, {\n                        x: -node.scroll.x,\n                        y: -node.scroll.y,\n                    });\n                }\n                if (!hasTransform(node.latestValues))\n                    continue;\n                transformBox(withTransforms, node.latestValues);\n            }\n            if (hasTransform(this.latestValues)) {\n                transformBox(withTransforms, this.latestValues);\n            }\n            return withTransforms;\n        };\n        ProjectionNode.prototype.removeTransform = function (box) {\n            var _a;\n            var boxWithoutTransform = createBox();\n            copyBoxInto(boxWithoutTransform, box);\n            for (var i = 0; i < this.path.length; i++) {\n                var node = this.path[i];\n                if (!node.instance)\n                    continue;\n                if (!hasTransform(node.latestValues))\n                    continue;\n                hasScale(node.latestValues) && node.updateSnapshot();\n                var sourceBox = createBox();\n                var nodeBox = node.measure();\n                copyBoxInto(sourceBox, nodeBox);\n                removeBoxTransforms(boxWithoutTransform, node.latestValues, (_a = node.snapshot) === null || _a === void 0 ? void 0 : _a.layout, sourceBox);\n            }\n            if (hasTransform(this.latestValues)) {\n                removeBoxTransforms(boxWithoutTransform, this.latestValues);\n            }\n            return boxWithoutTransform;\n        };\n        /**\n         *\n         */\n        ProjectionNode.prototype.setTargetDelta = function (delta) {\n            this.targetDelta = delta;\n            this.root.scheduleUpdateProjection();\n        };\n        ProjectionNode.prototype.setOptions = function (options) {\n            var _a;\n            this.options = __assign(__assign(__assign({}, this.options), options), { crossfade: (_a = options.crossfade) !== null && _a !== void 0 ? _a : true });\n        };\n        ProjectionNode.prototype.clearMeasurements = function () {\n            this.scroll = undefined;\n            this.layout = undefined;\n            this.snapshot = undefined;\n            this.prevTransformTemplateValue = undefined;\n            this.targetDelta = undefined;\n            this.target = undefined;\n            this.isLayoutDirty = false;\n        };\n        /**\n         * Frame calculations\n         */\n        ProjectionNode.prototype.resolveTargetDelta = function () {\n            var _a;\n            var _b = this.options, layout = _b.layout, layoutId = _b.layoutId;\n            /**\n             * If we have no layout, we can't perform projection, so early return\n             */\n            if (!this.layout || !(layout || layoutId))\n                return;\n            /**\n             * If we don't have a targetDelta but do have a layout, we can attempt to resolve\n             * a relativeParent. This will allow a component to perform scale correction\n             * even if no animation has started.\n             */\n            // TODO If this is unsuccessful this currently happens every frame\n            if (!this.targetDelta && !this.relativeTarget) {\n                // TODO: This is a semi-repetition of further down this function, make DRY\n                this.relativeParent = this.getClosestProjectingParent();\n                if (this.relativeParent && this.relativeParent.layout) {\n                    this.relativeTarget = createBox();\n                    this.relativeTargetOrigin = createBox();\n                    calcRelativePosition(this.relativeTargetOrigin, this.layout.actual, this.relativeParent.layout.actual);\n                    copyBoxInto(this.relativeTarget, this.relativeTargetOrigin);\n                }\n            }\n            /**\n             * If we have no relative target or no target delta our target isn't valid\n             * for this frame.\n             */\n            if (!this.relativeTarget && !this.targetDelta)\n                return;\n            /**\n             * Lazy-init target data structure\n             */\n            if (!this.target) {\n                this.target = createBox();\n                this.targetWithTransforms = createBox();\n            }\n            /**\n             * If we've got a relative box for this component, resolve it into a target relative to the parent.\n             */\n            if (this.relativeTarget &&\n                this.relativeTargetOrigin &&\n                ((_a = this.relativeParent) === null || _a === void 0 ? void 0 : _a.target)) {\n                calcRelativeBox(this.target, this.relativeTarget, this.relativeParent.target);\n                /**\n                 * If we've only got a targetDelta, resolve it into a target\n                 */\n            }\n            else if (this.targetDelta) {\n                if (Boolean(this.resumingFrom)) {\n                    // TODO: This is creating a new object every frame\n                    this.target = this.applyTransform(this.layout.actual);\n                }\n                else {\n                    copyBoxInto(this.target, this.layout.actual);\n                }\n                applyBoxDelta(this.target, this.targetDelta);\n            }\n            else {\n                /**\n                 * If no target, use own layout as target\n                 */\n                copyBoxInto(this.target, this.layout.actual);\n            }\n            /**\n             * If we've been told to attempt to resolve a relative target, do so.\n             */\n            if (this.attemptToResolveRelativeTarget) {\n                this.attemptToResolveRelativeTarget = false;\n                this.relativeParent = this.getClosestProjectingParent();\n                if (this.relativeParent &&\n                    Boolean(this.relativeParent.resumingFrom) ===\n                        Boolean(this.resumingFrom) &&\n                    !this.relativeParent.options.layoutScroll &&\n                    this.relativeParent.target) {\n                    this.relativeTarget = createBox();\n                    this.relativeTargetOrigin = createBox();\n                    calcRelativePosition(this.relativeTargetOrigin, this.target, this.relativeParent.target);\n                    copyBoxInto(this.relativeTarget, this.relativeTargetOrigin);\n                }\n            }\n        };\n        ProjectionNode.prototype.getClosestProjectingParent = function () {\n            if (!this.parent || hasTransform(this.parent.latestValues))\n                return undefined;\n            if ((this.parent.relativeTarget || this.parent.targetDelta) &&\n                this.parent.layout) {\n                return this.parent;\n            }\n            else {\n                return this.parent.getClosestProjectingParent();\n            }\n        };\n        ProjectionNode.prototype.calcProjection = function () {\n            var _a;\n            var _b = this.options, layout = _b.layout, layoutId = _b.layoutId;\n            /**\n             * If this section of the tree isn't animating we can\n             * delete our target sources for the following frame.\n             */\n            this.isTreeAnimating = Boolean(((_a = this.parent) === null || _a === void 0 ? void 0 : _a.isTreeAnimating) ||\n                this.currentAnimation ||\n                this.pendingAnimation);\n            if (!this.isTreeAnimating) {\n                this.targetDelta = this.relativeTarget = undefined;\n            }\n            if (!this.layout || !(layout || layoutId))\n                return;\n            var lead = this.getLead();\n            /**\n             * Reset the corrected box with the latest values from box, as we're then going\n             * to perform mutative operations on it.\n             */\n            copyBoxInto(this.layoutCorrected, this.layout.actual);\n            /**\n             * Apply all the parent deltas to this box to produce the corrected box. This\n             * is the layout box, as it will appear on screen as a result of the transforms of its parents.\n             */\n            applyTreeDeltas(this.layoutCorrected, this.treeScale, this.path, Boolean(this.resumingFrom) || this !== lead);\n            var target = lead.target;\n            if (!target)\n                return;\n            if (!this.projectionDelta) {\n                this.projectionDelta = createDelta();\n                this.projectionDeltaWithTransform = createDelta();\n            }\n            var prevTreeScaleX = this.treeScale.x;\n            var prevTreeScaleY = this.treeScale.y;\n            var prevProjectionTransform = this.projectionTransform;\n            /**\n             * Update the delta between the corrected box and the target box before user-set transforms were applied.\n             * This will allow us to calculate the corrected borderRadius and boxShadow to compensate\n             * for our layout reprojection, but still allow them to be scaled correctly by the user.\n             * It might be that to simplify this we may want to accept that user-set scale is also corrected\n             * and we wouldn't have to keep and calc both deltas, OR we could support a user setting\n             * to allow people to choose whether these styles are corrected based on just the\n             * layout reprojection or the final bounding box.\n             */\n            calcBoxDelta(this.projectionDelta, this.layoutCorrected, target, this.latestValues);\n            this.projectionTransform = buildProjectionTransform(this.projectionDelta, this.treeScale);\n            if (this.projectionTransform !== prevProjectionTransform ||\n                this.treeScale.x !== prevTreeScaleX ||\n                this.treeScale.y !== prevTreeScaleY) {\n                this.hasProjected = true;\n                this.scheduleRender();\n                this.notifyListeners(\"projectionUpdate\", target);\n            }\n        };\n        ProjectionNode.prototype.hide = function () {\n            this.isVisible = false;\n            // TODO: Schedule render\n        };\n        ProjectionNode.prototype.show = function () {\n            this.isVisible = true;\n            // TODO: Schedule render\n        };\n        ProjectionNode.prototype.scheduleRender = function (notifyAll) {\n            var _a, _b, _c;\n            if (notifyAll === void 0) { notifyAll = true; }\n            (_b = (_a = this.options).scheduleRender) === null || _b === void 0 ? void 0 : _b.call(_a);\n            notifyAll && ((_c = this.getStack()) === null || _c === void 0 ? void 0 : _c.scheduleRender());\n            if (this.resumingFrom && !this.resumingFrom.instance) {\n                this.resumingFrom = undefined;\n            }\n        };\n        ProjectionNode.prototype.setAnimationOrigin = function (delta, hasOnlyRelativeTargetChanged) {\n            var _this = this;\n            var _a;\n            if (hasOnlyRelativeTargetChanged === void 0) { hasOnlyRelativeTargetChanged = false; }\n            var snapshot = this.snapshot;\n            var snapshotLatestValues = (snapshot === null || snapshot === void 0 ? void 0 : snapshot.latestValues) || {};\n            var mixedValues = __assign({}, this.latestValues);\n            var targetDelta = createDelta();\n            this.relativeTarget = this.relativeTargetOrigin = undefined;\n            this.attemptToResolveRelativeTarget = !hasOnlyRelativeTargetChanged;\n            var relativeLayout = createBox();\n            var isSharedLayoutAnimation = snapshot === null || snapshot === void 0 ? void 0 : snapshot.isShared;\n            var isOnlyMember = (((_a = this.getStack()) === null || _a === void 0 ? void 0 : _a.members.length) || 0) <= 1;\n            var shouldCrossfadeOpacity = Boolean(isSharedLayoutAnimation &&\n                !isOnlyMember &&\n                this.options.crossfade === true &&\n                !this.path.some(hasOpacityCrossfade));\n            this.mixTargetDelta = function (latest) {\n                var _a;\n                var progress = latest / 1000;\n                mixAxisDelta(targetDelta.x, delta.x, progress);\n                mixAxisDelta(targetDelta.y, delta.y, progress);\n                _this.setTargetDelta(targetDelta);\n                if (_this.relativeTarget &&\n                    _this.relativeTargetOrigin &&\n                    _this.layout &&\n                    ((_a = _this.relativeParent) === null || _a === void 0 ? void 0 : _a.layout)) {\n                    calcRelativePosition(relativeLayout, _this.layout.actual, _this.relativeParent.layout.actual);\n                    mixBox(_this.relativeTarget, _this.relativeTargetOrigin, relativeLayout, progress);\n                }\n                if (isSharedLayoutAnimation) {\n                    _this.animationValues = mixedValues;\n                    mixValues(mixedValues, snapshotLatestValues, _this.latestValues, progress, shouldCrossfadeOpacity, isOnlyMember);\n                }\n                _this.root.scheduleUpdateProjection();\n                _this.scheduleRender();\n            };\n            this.mixTargetDelta(0);\n        };\n        ProjectionNode.prototype.startAnimation = function (options) {\n            var _this = this;\n            var _a, _b;\n            (_a = this.currentAnimation) === null || _a === void 0 ? void 0 : _a.stop();\n            if (this.resumingFrom) {\n                (_b = this.resumingFrom.currentAnimation) === null || _b === void 0 ? void 0 : _b.stop();\n            }\n            if (this.pendingAnimation) {\n                cancelSync.update(this.pendingAnimation);\n                this.pendingAnimation = undefined;\n            }\n            /**\n             * Start the animation in the next frame to have a frame with progress 0,\n             * where the target is the same as when the animation started, so we can\n             * calculate the relative positions correctly for instant transitions.\n             */\n            this.pendingAnimation = sync.update(function () {\n                globalProjectionState.hasAnimatedSinceResize = true;\n                _this.currentAnimation = animate(0, animationTarget, __assign(__assign({}, options), { onUpdate: function (latest) {\n                        var _a;\n                        _this.mixTargetDelta(latest);\n                        (_a = options.onUpdate) === null || _a === void 0 ? void 0 : _a.call(options, latest);\n                    }, onComplete: function () {\n                        var _a;\n                        (_a = options.onComplete) === null || _a === void 0 ? void 0 : _a.call(options);\n                        _this.completeAnimation();\n                    } }));\n                if (_this.resumingFrom) {\n                    _this.resumingFrom.currentAnimation = _this.currentAnimation;\n                }\n                _this.pendingAnimation = undefined;\n            });\n        };\n        ProjectionNode.prototype.completeAnimation = function () {\n            var _a;\n            if (this.resumingFrom) {\n                this.resumingFrom.currentAnimation = undefined;\n                this.resumingFrom.preserveOpacity = undefined;\n            }\n            (_a = this.getStack()) === null || _a === void 0 ? void 0 : _a.exitAnimationComplete();\n            this.resumingFrom =\n                this.currentAnimation =\n                    this.animationValues =\n                        undefined;\n            this.notifyListeners(\"animationComplete\");\n        };\n        ProjectionNode.prototype.finishAnimation = function () {\n            var _a;\n            if (this.currentAnimation) {\n                (_a = this.mixTargetDelta) === null || _a === void 0 ? void 0 : _a.call(this, animationTarget);\n                this.currentAnimation.stop();\n            }\n            this.completeAnimation();\n        };\n        ProjectionNode.prototype.applyTransformsToTarget = function () {\n            var _a = this.getLead(), targetWithTransforms = _a.targetWithTransforms, target = _a.target, layout = _a.layout, latestValues = _a.latestValues;\n            if (!targetWithTransforms || !target || !layout)\n                return;\n            copyBoxInto(targetWithTransforms, target);\n            /**\n             * Apply the latest user-set transforms to the targetBox to produce the targetBoxFinal.\n             * This is the final box that we will then project into by calculating a transform delta and\n             * applying it to the corrected box.\n             */\n            transformBox(targetWithTransforms, latestValues);\n            /**\n             * Update the delta between the corrected box and the final target box, after\n             * user-set transforms are applied to it. This will be used by the renderer to\n             * create a transform style that will reproject the element from its actual layout\n             * into the desired bounding box.\n             */\n            calcBoxDelta(this.projectionDeltaWithTransform, this.layoutCorrected, targetWithTransforms, latestValues);\n        };\n        ProjectionNode.prototype.registerSharedNode = function (layoutId, node) {\n            var _a, _b, _c;\n            if (!this.sharedNodes.has(layoutId)) {\n                this.sharedNodes.set(layoutId, new NodeStack());\n            }\n            var stack = this.sharedNodes.get(layoutId);\n            stack.add(node);\n            node.promote({\n                transition: (_a = node.options.initialPromotionConfig) === null || _a === void 0 ? void 0 : _a.transition,\n                preserveFollowOpacity: (_c = (_b = node.options.initialPromotionConfig) === null || _b === void 0 ? void 0 : _b.shouldPreserveFollowOpacity) === null || _c === void 0 ? void 0 : _c.call(_b, node),\n            });\n        };\n        ProjectionNode.prototype.isLead = function () {\n            var stack = this.getStack();\n            return stack ? stack.lead === this : true;\n        };\n        ProjectionNode.prototype.getLead = function () {\n            var _a;\n            var layoutId = this.options.layoutId;\n            return layoutId ? ((_a = this.getStack()) === null || _a === void 0 ? void 0 : _a.lead) || this : this;\n        };\n        ProjectionNode.prototype.getPrevLead = function () {\n            var _a;\n            var layoutId = this.options.layoutId;\n            return layoutId ? (_a = this.getStack()) === null || _a === void 0 ? void 0 : _a.prevLead : undefined;\n        };\n        ProjectionNode.prototype.getStack = function () {\n            var layoutId = this.options.layoutId;\n            if (layoutId)\n                return this.root.sharedNodes.get(layoutId);\n        };\n        ProjectionNode.prototype.promote = function (_a) {\n            var _b = _a === void 0 ? {} : _a, needsReset = _b.needsReset, transition = _b.transition, preserveFollowOpacity = _b.preserveFollowOpacity;\n            var stack = this.getStack();\n            if (stack)\n                stack.promote(this, preserveFollowOpacity);\n            if (needsReset) {\n                this.projectionDelta = undefined;\n                this.needsReset = true;\n            }\n            if (transition)\n                this.setOptions({ transition: transition });\n        };\n        ProjectionNode.prototype.relegate = function () {\n            var stack = this.getStack();\n            if (stack) {\n                return stack.relegate(this);\n            }\n            else {\n                return false;\n            }\n        };\n        ProjectionNode.prototype.resetRotation = function () {\n            var visualElement = this.options.visualElement;\n            if (!visualElement)\n                return;\n            // If there's no detected rotation values, we can early return without a forced render.\n            var hasRotate = false;\n            // Keep a record of all the values we've reset\n            var resetValues = {};\n            // Check the rotate value of all axes and reset to 0\n            for (var i = 0; i < transformAxes.length; i++) {\n                var axis = transformAxes[i];\n                var key = \"rotate\" + axis;\n                // If this rotation doesn't exist as a motion value, then we don't\n                // need to reset it\n                if (!visualElement.getStaticValue(key)) {\n                    continue;\n                }\n                hasRotate = true;\n                // Record the rotation and then temporarily set it to 0\n                resetValues[key] = visualElement.getStaticValue(key);\n                visualElement.setStaticValue(key, 0);\n            }\n            // If there's no rotation values, we don't need to do any more.\n            if (!hasRotate)\n                return;\n            // Force a render of this element to apply the transform with all rotations\n            // set to 0.\n            visualElement === null || visualElement === void 0 ? void 0 : visualElement.syncRender();\n            // Put back all the values we reset\n            for (var key in resetValues) {\n                visualElement.setStaticValue(key, resetValues[key]);\n            }\n            // Schedule a render for the next frame. This ensures we won't visually\n            // see the element with the reset rotate value applied.\n            visualElement.scheduleRender();\n        };\n        ProjectionNode.prototype.getProjectionStyles = function (styleProp) {\n            var _a, _b, _c, _d, _e, _f;\n            if (styleProp === void 0) { styleProp = {}; }\n            // TODO: Return lifecycle-persistent object\n            var styles = {};\n            if (!this.instance || this.isSVG)\n                return styles;\n            if (!this.isVisible) {\n                return { visibility: \"hidden\" };\n            }\n            else {\n                styles.visibility = \"\";\n            }\n            var transformTemplate = (_a = this.options.visualElement) === null || _a === void 0 ? void 0 : _a.getProps().transformTemplate;\n            if (this.needsReset) {\n                this.needsReset = false;\n                styles.opacity = \"\";\n                styles.pointerEvents =\n                    resolveMotionValue(styleProp.pointerEvents) || \"\";\n                styles.transform = transformTemplate\n                    ? transformTemplate(this.latestValues, \"\")\n                    : \"none\";\n                return styles;\n            }\n            var lead = this.getLead();\n            if (!this.projectionDelta || !this.layout || !lead.target) {\n                var emptyStyles = {};\n                if (this.options.layoutId) {\n                    emptyStyles.opacity = (_b = this.latestValues.opacity) !== null && _b !== void 0 ? _b : 1;\n                    emptyStyles.pointerEvents =\n                        resolveMotionValue(styleProp.pointerEvents) || \"\";\n                }\n                if (this.hasProjected && !hasTransform(this.latestValues)) {\n                    emptyStyles.transform = transformTemplate\n                        ? transformTemplate({}, \"\")\n                        : \"none\";\n                    this.hasProjected = false;\n                }\n                return emptyStyles;\n            }\n            var valuesToRender = lead.animationValues || lead.latestValues;\n            this.applyTransformsToTarget();\n            styles.transform = buildProjectionTransform(this.projectionDeltaWithTransform, this.treeScale, valuesToRender);\n            if (transformTemplate) {\n                styles.transform = transformTemplate(valuesToRender, styles.transform);\n            }\n            var _g = this.projectionDelta, x = _g.x, y = _g.y;\n            styles.transformOrigin = \"\".concat(x.origin * 100, \"% \").concat(y.origin * 100, \"% 0\");\n            if (lead.animationValues) {\n                /**\n                 * If the lead component is animating, assign this either the entering/leaving\n                 * opacity\n                 */\n                styles.opacity =\n                    lead === this\n                        ? (_d = (_c = valuesToRender.opacity) !== null && _c !== void 0 ? _c : this.latestValues.opacity) !== null && _d !== void 0 ? _d : 1\n                        : this.preserveOpacity\n                            ? this.latestValues.opacity\n                            : valuesToRender.opacityExit;\n            }\n            else {\n                /**\n                 * Or we're not animating at all, set the lead component to its actual\n                 * opacity and other components to hidden.\n                 */\n                styles.opacity =\n                    lead === this\n                        ? (_e = valuesToRender.opacity) !== null && _e !== void 0 ? _e : \"\"\n                        : (_f = valuesToRender.opacityExit) !== null && _f !== void 0 ? _f : 0;\n            }\n            /**\n             * Apply scale correction\n             */\n            for (var key in scaleCorrectors) {\n                if (valuesToRender[key] === undefined)\n                    continue;\n                var _h = scaleCorrectors[key], correct = _h.correct, applyTo = _h.applyTo;\n                var corrected = correct(valuesToRender[key], lead);\n                if (applyTo) {\n                    var num = applyTo.length;\n                    for (var i = 0; i < num; i++) {\n                        styles[applyTo[i]] = corrected;\n                    }\n                }\n                else {\n                    styles[key] = corrected;\n                }\n            }\n            /**\n             * Disable pointer events on follow components. This is to ensure\n             * that if a follow component covers a lead component it doesn't block\n             * pointer events on the lead.\n             */\n            if (this.options.layoutId) {\n                styles.pointerEvents =\n                    lead === this\n                        ? resolveMotionValue(styleProp.pointerEvents) || \"\"\n                        : \"none\";\n            }\n            return styles;\n        };\n        ProjectionNode.prototype.clearSnapshot = function () {\n            this.resumeFrom = this.snapshot = undefined;\n        };\n        // Only run on root\n        ProjectionNode.prototype.resetTree = function () {\n            this.root.nodes.forEach(function (node) { var _a; return (_a = node.currentAnimation) === null || _a === void 0 ? void 0 : _a.stop(); });\n            this.root.nodes.forEach(clearMeasurements);\n            this.root.sharedNodes.clear();\n        };\n        return ProjectionNode;\n    }());\n}\nfunction updateLayout(node) {\n    node.updateLayout();\n}\nfunction notifyLayoutUpdate(node) {\n    var _a, _b, _c, _d;\n    var snapshot = (_b = (_a = node.resumeFrom) === null || _a === void 0 ? void 0 : _a.snapshot) !== null && _b !== void 0 ? _b : node.snapshot;\n    if (node.isLead() &&\n        node.layout &&\n        snapshot &&\n        node.hasListeners(\"didUpdate\")) {\n        var _e = node.layout, layout_1 = _e.actual, measuredLayout = _e.measured;\n        // TODO Maybe we want to also resize the layout snapshot so we don't trigger\n        // animations for instance if layout=\"size\" and an element has only changed position\n        if (node.options.animationType === \"size\") {\n            eachAxis(function (axis) {\n                var axisSnapshot = snapshot.isShared\n                    ? snapshot.measured[axis]\n                    : snapshot.layout[axis];\n                var length = calcLength(axisSnapshot);\n                axisSnapshot.min = layout_1[axis].min;\n                axisSnapshot.max = axisSnapshot.min + length;\n            });\n        }\n        else if (node.options.animationType === \"position\") {\n            eachAxis(function (axis) {\n                var axisSnapshot = snapshot.isShared\n                    ? snapshot.measured[axis]\n                    : snapshot.layout[axis];\n                var length = calcLength(layout_1[axis]);\n                axisSnapshot.max = axisSnapshot.min + length;\n            });\n        }\n        var layoutDelta = createDelta();\n        calcBoxDelta(layoutDelta, layout_1, snapshot.layout);\n        var visualDelta = createDelta();\n        if (snapshot.isShared) {\n            calcBoxDelta(visualDelta, node.applyTransform(measuredLayout, true), snapshot.measured);\n        }\n        else {\n            calcBoxDelta(visualDelta, layout_1, snapshot.layout);\n        }\n        var hasLayoutChanged = !isDeltaZero(layoutDelta);\n        var hasRelativeTargetChanged = false;\n        if (!node.resumeFrom) {\n            node.relativeParent = node.getClosestProjectingParent();\n            /**\n             * If the relativeParent is itself resuming from a different element then\n             * the relative snapshot is not relavent\n             */\n            if (node.relativeParent && !node.relativeParent.resumeFrom) {\n                var _f = node.relativeParent, parentSnapshot = _f.snapshot, parentLayout = _f.layout;\n                if (parentSnapshot && parentLayout) {\n                    var relativeSnapshot = createBox();\n                    calcRelativePosition(relativeSnapshot, snapshot.layout, parentSnapshot.layout);\n                    var relativeLayout = createBox();\n                    calcRelativePosition(relativeLayout, layout_1, parentLayout.actual);\n                    if (!boxEquals(relativeSnapshot, relativeLayout)) {\n                        hasRelativeTargetChanged = true;\n                    }\n                }\n            }\n        }\n        node.notifyListeners(\"didUpdate\", {\n            layout: layout_1,\n            snapshot: snapshot,\n            delta: visualDelta,\n            layoutDelta: layoutDelta,\n            hasLayoutChanged: hasLayoutChanged,\n            hasRelativeTargetChanged: hasRelativeTargetChanged,\n        });\n    }\n    else if (node.isLead()) {\n        (_d = (_c = node.options).onExitComplete) === null || _d === void 0 ? void 0 : _d.call(_c);\n    }\n    /**\n     * Clearing transition\n     * TODO: Investigate why this transition is being passed in as {type: false } from Framer\n     * and why we need it at all\n     */\n    node.options.transition = undefined;\n}\nfunction clearSnapshot(node) {\n    node.clearSnapshot();\n}\nfunction clearMeasurements(node) {\n    node.clearMeasurements();\n}\nfunction resetTransformStyle(node) {\n    node.resetTransform();\n}\nfunction finishAnimation(node) {\n    node.finishAnimation();\n    node.targetDelta = node.relativeTarget = node.target = undefined;\n}\nfunction resolveTargetDelta(node) {\n    node.resolveTargetDelta();\n}\nfunction calcProjection(node) {\n    node.calcProjection();\n}\nfunction resetRotation(node) {\n    node.resetRotation();\n}\nfunction removeLeadSnapshots(stack) {\n    stack.removeLeadSnapshot();\n}\nfunction mixAxisDelta(output, delta, p) {\n    output.translate = mix(delta.translate, 0, p);\n    output.scale = mix(delta.scale, 1, p);\n    output.origin = delta.origin;\n    output.originPoint = delta.originPoint;\n}\nfunction mixAxis(output, from, to, p) {\n    output.min = mix(from.min, to.min, p);\n    output.max = mix(from.max, to.max, p);\n}\nfunction mixBox(output, from, to, p) {\n    mixAxis(output.x, from.x, to.x, p);\n    mixAxis(output.y, from.y, to.y, p);\n}\nfunction hasOpacityCrossfade(node) {\n    return (node.animationValues && node.animationValues.opacityExit !== undefined);\n}\nvar defaultLayoutTransition = {\n    duration: 0.45,\n    ease: [0.4, 0, 0.1, 1],\n};\nfunction mountNodeEarly(node, id) {\n    /**\n     * Rather than searching the DOM from document we can search the\n     * path for the deepest mounted ancestor and search from there\n     */\n    var searchNode = node.root;\n    for (var i = node.path.length - 1; i >= 0; i--) {\n        if (Boolean(node.path[i].instance)) {\n            searchNode = node.path[i];\n            break;\n        }\n    }\n    var searchElement = searchNode && searchNode !== node.root ? searchNode.instance : document;\n    var element = searchElement.querySelector(\"[data-projection-id=\\\"\".concat(id, \"\\\"]\"));\n    if (element)\n        node.mount(element, true);\n}\nfunction roundAxis(axis) {\n    axis.min = Math.round(axis.min);\n    axis.max = Math.round(axis.max);\n}\nfunction roundBox(box) {\n    roundAxis(box.x);\n    roundAxis(box.y);\n}\n\nexport { createProjectionNode, globalProjectionState, mixAxis, mixAxisDelta, mixBox };\n","import { useConstant } from '../../utils/use-constant.mjs';\nimport { globalProjectionState } from './create-projection-node.mjs';\n\nvar id = 1;\nfunction useProjectionId() {\n    return useConstant(function () {\n        if (globalProjectionState.hasEverUpdated) {\n            return id++;\n        }\n    });\n}\n\nexport { useProjectionId };\n","import { createContext } from 'react';\n\n/**\n * @internal\n */\nvar LayoutGroupContext = createContext({});\n\nexport { LayoutGroupContext };\n","import { createContext } from 'react';\n\n/**\n * @internal\n */\nvar SwitchLayoutGroupContext = createContext({});\n\nexport { SwitchLayoutGroupContext };\n","import { isRefObject } from '../../utils/is-ref-object.mjs';\nimport { useContext } from 'react';\nimport { SwitchLayoutGroupContext } from '../../context/SwitchLayoutGroupContext.mjs';\n\nfunction useProjection(projectionId, _a, visualElement, ProjectionNodeConstructor) {\n    var _b;\n    var layoutId = _a.layoutId, layout = _a.layout, drag = _a.drag, dragConstraints = _a.dragConstraints, layoutScroll = _a.layoutScroll;\n    var initialPromotionConfig = useContext(SwitchLayoutGroupContext);\n    if (!ProjectionNodeConstructor ||\n        !visualElement ||\n        (visualElement === null || visualElement === void 0 ? void 0 : visualElement.projection)) {\n        return;\n    }\n    visualElement.projection = new ProjectionNodeConstructor(projectionId, visualElement.getLatestValues(), (_b = visualElement.parent) === null || _b === void 0 ? void 0 : _b.projection);\n    visualElement.projection.setOptions({\n        layoutId: layoutId,\n        layout: layout,\n        alwaysMeasureLayout: Boolean(drag) || (dragConstraints && isRefObject(dragConstraints)),\n        visualElement: visualElement,\n        scheduleRender: function () { return visualElement.scheduleRender(); },\n        /**\n         * TODO: Update options in an effect. This could be tricky as it'll be too late\n         * to update by the time layout animations run.\n         * We also need to fix this safeToRemove by linking it up to the one returned by usePresence,\n         * ensuring it gets called if there's no potential layout animations.\n         *\n         */\n        animationType: typeof layout === \"string\" ? layout : \"both\",\n        initialPromotionConfig: initialPromotionConfig,\n        layoutScroll: layoutScroll,\n    });\n}\n\nexport { useProjection };\n","import { __extends } from 'tslib';\nimport React__default from 'react';\n\nvar VisualElementHandler = /** @class */ (function (_super) {\n    __extends(VisualElementHandler, _super);\n    function VisualElementHandler() {\n        return _super !== null && _super.apply(this, arguments) || this;\n    }\n    /**\n     * Update visual element props as soon as we know this update is going to be commited.\n     */\n    VisualElementHandler.prototype.getSnapshotBeforeUpdate = function () {\n        this.updateProps();\n        return null;\n    };\n    VisualElementHandler.prototype.componentDidUpdate = function () { };\n    VisualElementHandler.prototype.updateProps = function () {\n        var _a = this.props, visualElement = _a.visualElement, props = _a.props;\n        if (visualElement)\n            visualElement.setProps(props);\n    };\n    VisualElementHandler.prototype.render = function () {\n        return this.props.children;\n    };\n    return VisualElementHandler;\n}(React__default.Component));\n\nexport { VisualElementHandler };\n","import { __assign } from 'tslib';\nimport * as React from 'react';\nimport { forwardRef, useContext } from 'react';\nimport { useFeatures } from './features/use-features.mjs';\nimport { MotionConfigContext } from '../context/MotionConfigContext.mjs';\nimport { MotionContext } from '../context/MotionContext/index.mjs';\nimport { useVisualElement } from './utils/use-visual-element.mjs';\nimport { useMotionRef } from './utils/use-motion-ref.mjs';\nimport { useCreateMotionContext } from '../context/MotionContext/create.mjs';\nimport { loadFeatures, featureDefinitions } from './features/definitions.mjs';\nimport { isBrowser } from '../utils/is-browser.mjs';\nimport { useProjectionId } from '../projection/node/id.mjs';\nimport { LayoutGroupContext } from '../context/LayoutGroupContext.mjs';\nimport { useProjection } from './features/use-projection.mjs';\nimport { VisualElementHandler } from './utils/VisualElementHandler.mjs';\n\n/**\n * Create a `motion` component.\n *\n * This function accepts a Component argument, which can be either a string (ie \"div\"\n * for `motion.div`), or an actual React component.\n *\n * Alongside this is a config option which provides a way of rendering the provided\n * component \"offline\", or outside the React render cycle.\n *\n * @internal\n */\nfunction createMotionComponent(_a) {\n    var preloadedFeatures = _a.preloadedFeatures, createVisualElement = _a.createVisualElement, projectionNodeConstructor = _a.projectionNodeConstructor, useRender = _a.useRender, useVisualState = _a.useVisualState, Component = _a.Component;\n    preloadedFeatures && loadFeatures(preloadedFeatures);\n    function MotionComponent(props, externalRef) {\n        var layoutId = useLayoutId(props);\n        props = __assign(__assign({}, props), { layoutId: layoutId });\n        /**\n         * If we're rendering in a static environment, we only visually update the component\n         * as a result of a React-rerender rather than interactions or animations. This\n         * means we don't need to load additional memory structures like VisualElement,\n         * or any gesture/animation features.\n         */\n        var config = useContext(MotionConfigContext);\n        var features = null;\n        var context = useCreateMotionContext(props);\n        /**\n         * Create a unique projection ID for this component. If a new component is added\n         * during a layout animation we'll use this to query the DOM and hydrate its ref early, allowing\n         * us to measure it as soon as any layout effect flushes pending layout animations.\n         *\n         * Performance note: It'd be better not to have to search the DOM for these elements.\n         * For newly-entering components it could be enough to only correct treeScale, in which\n         * case we could mount in a scale-correction mode. This wouldn't be enough for\n         * shared element transitions however. Perhaps for those we could revert to a root node\n         * that gets forceRendered and layout animations are triggered on its layout effect.\n         */\n        var projectionId = config.isStatic ? undefined : useProjectionId();\n        /**\n         *\n         */\n        var visualState = useVisualState(props, config.isStatic);\n        if (!config.isStatic && isBrowser) {\n            /**\n             * Create a VisualElement for this component. A VisualElement provides a common\n             * interface to renderer-specific APIs (ie DOM/Three.js etc) as well as\n             * providing a way of rendering to these APIs outside of the React render loop\n             * for more performant animations and interactions\n             */\n            context.visualElement = useVisualElement(Component, visualState, __assign(__assign({}, config), props), createVisualElement);\n            useProjection(projectionId, props, context.visualElement, projectionNodeConstructor ||\n                featureDefinitions.projectionNodeConstructor);\n            /**\n             * Load Motion gesture and animation features. These are rendered as renderless\n             * components so each feature can optionally make use of React lifecycle methods.\n             */\n            features = useFeatures(props, context.visualElement, preloadedFeatures);\n        }\n        /**\n         * The mount order and hierarchy is specific to ensure our element ref\n         * is hydrated by the time features fire their effects.\n         */\n        return (React.createElement(VisualElementHandler, { visualElement: context.visualElement, props: __assign(__assign({}, config), props) },\n            features,\n            React.createElement(MotionContext.Provider, { value: context }, useRender(Component, props, projectionId, useMotionRef(visualState, context.visualElement, externalRef), visualState, config.isStatic, context.visualElement))));\n    }\n    return forwardRef(MotionComponent);\n}\nfunction useLayoutId(_a) {\n    var _b;\n    var layoutId = _a.layoutId;\n    var layoutGroupId = (_b = useContext(LayoutGroupContext)) === null || _b === void 0 ? void 0 : _b.id;\n    return layoutGroupId && layoutId !== undefined\n        ? layoutGroupId + \"-\" + layoutId\n        : layoutId;\n}\n\nexport { createMotionComponent };\n","import { createMotionComponent } from '../../motion/index.mjs';\n\n/**\n * Convert any React component into a `motion` component. The provided component\n * **must** use `React.forwardRef` to the underlying DOM component you want to animate.\n *\n * ```jsx\n * const Component = React.forwardRef((props, ref) => {\n *   return <div ref={ref} />\n * })\n *\n * const MotionComponent = motion(Component)\n * ```\n *\n * @public\n */\nfunction createMotionProxy(createConfig) {\n    function custom(Component, customMotionComponentConfig) {\n        if (customMotionComponentConfig === void 0) { customMotionComponentConfig = {}; }\n        return createMotionComponent(createConfig(Component, customMotionComponentConfig));\n    }\n    if (typeof Proxy === \"undefined\") {\n        return custom;\n    }\n    /**\n     * A cache of generated `motion` components, e.g `motion.div`, `motion.input` etc.\n     * Rather than generating them anew every render.\n     */\n    var componentCache = new Map();\n    return new Proxy(custom, {\n        /**\n         * Called when `motion` is referenced with a prop: `motion.div`, `motion.input` etc.\n         * The prop name is passed through as `key` and we can use that to generate a `motion`\n         * DOM component with that name.\n         */\n        get: function (_target, key) {\n            /**\n             * If this element doesn't exist in the component cache, create it and cache.\n             */\n            if (!componentCache.has(key)) {\n                componentCache.set(key, custom(key));\n            }\n            return componentCache.get(key);\n        },\n    });\n}\n\nexport { createMotionProxy };\n","/**\n * We keep these listed seperately as we use the lowercase tag names as part\n * of the runtime bundle to detect SVG components\n */\nvar lowercaseSVGElements = [\n    \"animate\",\n    \"circle\",\n    \"defs\",\n    \"desc\",\n    \"ellipse\",\n    \"g\",\n    \"image\",\n    \"line\",\n    \"filter\",\n    \"marker\",\n    \"mask\",\n    \"metadata\",\n    \"path\",\n    \"pattern\",\n    \"polygon\",\n    \"polyline\",\n    \"rect\",\n    \"stop\",\n    \"svg\",\n    \"switch\",\n    \"symbol\",\n    \"text\",\n    \"tspan\",\n    \"use\",\n    \"view\",\n];\n\nexport { lowercaseSVGElements };\n","import { lowercaseSVGElements } from '../../svg/lowercase-elements.mjs';\n\nfunction isSVGComponent(Component) {\n    if (\n    /**\n     * If it's not a string, it's a custom React component. Currently we only support\n     * HTML custom React components.\n     */\n    typeof Component !== \"string\" ||\n        /**\n         * If it contains a dash, the element is a custom HTML webcomponent.\n         */\n        Component.includes(\"-\")) {\n        return false;\n    }\n    else if (\n    /**\n     * If it's in our list of lowercase SVG tags, it's an SVG component\n     */\n    lowercaseSVGElements.indexOf(Component) > -1 ||\n        /**\n         * If it contains a capital letter, it's an SVG component\n         */\n        /[A-Z]/.test(Component)) {\n        return true;\n    }\n    return false;\n}\n\nexport { isSVGComponent };\n","import { scaleCorrectors } from '../../projection/styles/scale-correction.mjs';\nimport { isTransformProp, isTransformOriginProp } from '../../render/html/utils/transform.mjs';\n\nfunction isForcedMotionValue(key, _a) {\n    var layout = _a.layout, layoutId = _a.layoutId;\n    return (isTransformProp(key) ||\n        isTransformOriginProp(key) ||\n        ((layout || layoutId !== undefined) &&\n            (!!scaleCorrectors[key] || key === \"opacity\")));\n}\n\nexport { isForcedMotionValue };\n","import { sortTransformProps } from './transform.mjs';\n\nvar translateAlias = {\n    x: \"translateX\",\n    y: \"translateY\",\n    z: \"translateZ\",\n    transformPerspective: \"perspective\",\n};\n/**\n * Build a CSS transform style from individual x/y/scale etc properties.\n *\n * This outputs with a default order of transforms/scales/rotations, this can be customised by\n * providing a transformTemplate function.\n */\nfunction buildTransform(_a, _b, transformIsDefault, transformTemplate) {\n    var transform = _a.transform, transformKeys = _a.transformKeys;\n    var _c = _b.enableHardwareAcceleration, enableHardwareAcceleration = _c === void 0 ? true : _c, _d = _b.allowTransformNone, allowTransformNone = _d === void 0 ? true : _d;\n    // The transform string we're going to build into.\n    var transformString = \"\";\n    // Transform keys into their default order - this will determine the output order.\n    transformKeys.sort(sortTransformProps);\n    // Track whether the defined transform has a defined z so we don't add a\n    // second to enable hardware acceleration\n    var transformHasZ = false;\n    // Loop over each transform and build them into transformString\n    var numTransformKeys = transformKeys.length;\n    for (var i = 0; i < numTransformKeys; i++) {\n        var key = transformKeys[i];\n        transformString += \"\".concat(translateAlias[key] || key, \"(\").concat(transform[key], \") \");\n        if (key === \"z\")\n            transformHasZ = true;\n    }\n    if (!transformHasZ && enableHardwareAcceleration) {\n        transformString += \"translateZ(0)\";\n    }\n    else {\n        transformString = transformString.trim();\n    }\n    // If we have a custom `transform` template, pass our transform values and\n    // generated transformString to that before returning\n    if (transformTemplate) {\n        transformString = transformTemplate(transform, transformIsDefault ? \"\" : transformString);\n    }\n    else if (allowTransformNone && transformIsDefault) {\n        transformString = \"none\";\n    }\n    return transformString;\n}\n/**\n * Build a transformOrigin style. Uses the same defaults as the browser for\n * undefined origins.\n */\nfunction buildTransformOrigin(_a) {\n    var _b = _a.originX, originX = _b === void 0 ? \"50%\" : _b, _c = _a.originY, originY = _c === void 0 ? \"50%\" : _c, _d = _a.originZ, originZ = _d === void 0 ? 0 : _d;\n    return \"\".concat(originX, \" \").concat(originY, \" \").concat(originZ);\n}\n\nexport { buildTransform, buildTransformOrigin };\n","/**\n * Returns true if the provided key is a CSS variable\n */\nfunction isCSSVariable(key) {\n    return key.startsWith(\"--\");\n}\n\nexport { isCSSVariable };\n","/**\n * Provided a value and a ValueType, returns the value as that value type.\n */\nvar getValueAsType = function (value, type) {\n    return type && typeof value === \"number\"\n        ? type.transform(value)\n        : value;\n};\n\nexport { getValueAsType };\n","import { buildTransform, buildTransformOrigin } from './build-transform.mjs';\nimport { isCSSVariable } from '../../dom/utils/is-css-variable.mjs';\nimport { isTransformProp, isTransformOriginProp } from './transform.mjs';\nimport { getValueAsType } from '../../dom/value-types/get-as-type.mjs';\nimport { numberValueTypes } from '../../dom/value-types/number.mjs';\n\nfunction buildHTMLStyles(state, latestValues, options, transformTemplate) {\n    var _a;\n    var style = state.style, vars = state.vars, transform = state.transform, transformKeys = state.transformKeys, transformOrigin = state.transformOrigin;\n    // Empty the transformKeys array. As we're throwing out refs to its items\n    // this might not be as cheap as suspected. Maybe using the array as a buffer\n    // with a manual incrementation would be better.\n    transformKeys.length = 0;\n    // Track whether we encounter any transform or transformOrigin values.\n    var hasTransform = false;\n    var hasTransformOrigin = false;\n    // Does the calculated transform essentially equal \"none\"?\n    var transformIsNone = true;\n    /**\n     * Loop over all our latest animated values and decide whether to handle them\n     * as a style or CSS variable.\n     *\n     * Transforms and transform origins are kept seperately for further processing.\n     */\n    for (var key in latestValues) {\n        var value = latestValues[key];\n        /**\n         * If this is a CSS variable we don't do any further processing.\n         */\n        if (isCSSVariable(key)) {\n            vars[key] = value;\n            continue;\n        }\n        // Convert the value to its default value type, ie 0 -> \"0px\"\n        var valueType = numberValueTypes[key];\n        var valueAsType = getValueAsType(value, valueType);\n        if (isTransformProp(key)) {\n            // If this is a transform, flag to enable further transform processing\n            hasTransform = true;\n            transform[key] = valueAsType;\n            transformKeys.push(key);\n            // If we already know we have a non-default transform, early return\n            if (!transformIsNone)\n                continue;\n            // Otherwise check to see if this is a default transform\n            if (value !== ((_a = valueType.default) !== null && _a !== void 0 ? _a : 0))\n                transformIsNone = false;\n        }\n        else if (isTransformOriginProp(key)) {\n            transformOrigin[key] = valueAsType;\n            // If this is a transform origin, flag and enable further transform-origin processing\n            hasTransformOrigin = true;\n        }\n        else {\n            style[key] = valueAsType;\n        }\n    }\n    if (hasTransform) {\n        style.transform = buildTransform(state, options, transformIsNone, transformTemplate);\n    }\n    else if (transformTemplate) {\n        style.transform = transformTemplate({}, \"\");\n    }\n    else if (!latestValues.transform && style.transform) {\n        style.transform = \"none\";\n    }\n    if (hasTransformOrigin) {\n        style.transformOrigin = buildTransformOrigin(transformOrigin);\n    }\n}\n\nexport { buildHTMLStyles };\n","var createHtmlRenderState = function () { return ({\n    style: {},\n    transform: {},\n    transformKeys: [],\n    transformOrigin: {},\n    vars: {},\n}); };\n\nexport { createHtmlRenderState };\n","import { __assign } from 'tslib';\nimport { useMemo } from 'react';\nimport { isForcedMotionValue } from '../../motion/utils/is-forced-motion-value.mjs';\nimport { isMotionValue } from '../../value/utils/is-motion-value.mjs';\nimport { buildHTMLStyles } from './utils/build-styles.mjs';\nimport { createHtmlRenderState } from './utils/create-render-state.mjs';\n\nfunction copyRawValuesOnly(target, source, props) {\n    for (var key in source) {\n        if (!isMotionValue(source[key]) && !isForcedMotionValue(key, props)) {\n            target[key] = source[key];\n        }\n    }\n}\nfunction useInitialMotionValues(_a, visualState, isStatic) {\n    var transformTemplate = _a.transformTemplate;\n    return useMemo(function () {\n        var state = createHtmlRenderState();\n        buildHTMLStyles(state, visualState, { enableHardwareAcceleration: !isStatic }, transformTemplate);\n        var vars = state.vars, style = state.style;\n        return __assign(__assign({}, vars), style);\n    }, [visualState]);\n}\nfunction useStyle(props, visualState, isStatic) {\n    var styleProp = props.style || {};\n    var style = {};\n    /**\n     * Copy non-Motion Values straight into style\n     */\n    copyRawValuesOnly(style, styleProp, props);\n    Object.assign(style, useInitialMotionValues(props, visualState, isStatic));\n    if (props.transformValues) {\n        style = props.transformValues(style);\n    }\n    return style;\n}\nfunction useHTMLProps(props, visualState, isStatic) {\n    // The `any` isn't ideal but it is the type of createElement props argument\n    var htmlProps = {};\n    var style = useStyle(props, visualState, isStatic);\n    if (Boolean(props.drag) && props.dragListener !== false) {\n        // Disable the ghost element when a user drags\n        htmlProps.draggable = false;\n        // Disable text selection\n        style.userSelect =\n            style.WebkitUserSelect =\n                style.WebkitTouchCallout =\n                    \"none\";\n        // Disable scrolling on the draggable direction\n        style.touchAction =\n            props.drag === true\n                ? \"none\"\n                : \"pan-\".concat(props.drag === \"x\" ? \"y\" : \"x\");\n    }\n    htmlProps.style = style;\n    return htmlProps;\n}\n\nexport { copyRawValuesOnly, useHTMLProps, useStyle };\n","/**\n * A list of all valid MotionProps.\n *\n * @internalremarks\n * This doesn't throw if a `MotionProp` name is missing - it should.\n */\nvar validMotionProps = new Set([\n    \"initial\",\n    \"animate\",\n    \"exit\",\n    \"style\",\n    \"variants\",\n    \"transition\",\n    \"transformTemplate\",\n    \"transformValues\",\n    \"custom\",\n    \"inherit\",\n    \"layout\",\n    \"layoutId\",\n    \"layoutDependency\",\n    \"onLayoutAnimationComplete\",\n    \"onLayoutMeasure\",\n    \"onBeforeLayoutMeasure\",\n    \"onAnimationStart\",\n    \"onAnimationComplete\",\n    \"onUpdate\",\n    \"onDragStart\",\n    \"onDrag\",\n    \"onDragEnd\",\n    \"onMeasureDragConstraints\",\n    \"onDirectionLock\",\n    \"onDragTransitionEnd\",\n    \"drag\",\n    \"dragControls\",\n    \"dragListener\",\n    \"dragConstraints\",\n    \"dragDirectionLock\",\n    \"dragSnapToOrigin\",\n    \"_dragX\",\n    \"_dragY\",\n    \"dragElastic\",\n    \"dragMomentum\",\n    \"dragPropagation\",\n    \"dragTransition\",\n    \"whileDrag\",\n    \"onPan\",\n    \"onPanStart\",\n    \"onPanEnd\",\n    \"onPanSessionStart\",\n    \"onTap\",\n    \"onTapStart\",\n    \"onTapCancel\",\n    \"onHoverStart\",\n    \"onHoverEnd\",\n    \"whileFocus\",\n    \"whileTap\",\n    \"whileHover\",\n    \"whileInView\",\n    \"onViewportEnter\",\n    \"onViewportLeave\",\n    \"viewport\",\n    \"layoutScroll\",\n]);\n/**\n * Check whether a prop name is a valid `MotionProp` key.\n *\n * @param key - Name of the property to check\n * @returns `true` is key is a valid `MotionProp`.\n *\n * @public\n */\nfunction isValidMotionProp(key) {\n    return validMotionProps.has(key);\n}\n\nexport { isValidMotionProp };\n","import { isValidMotionProp } from '../../../motion/utils/valid-prop.mjs';\n\nvar shouldForward = function (key) { return !isValidMotionProp(key); };\nfunction loadExternalIsValidProp(isValidProp) {\n    if (!isValidProp)\n        return;\n    // Explicitly filter our events\n    shouldForward = function (key) {\n        return key.startsWith(\"on\") ? !isValidMotionProp(key) : isValidProp(key);\n    };\n}\n/**\n * Emotion and Styled Components both allow users to pass through arbitrary props to their components\n * to dynamically generate CSS. They both use the `@emotion/is-prop-valid` package to determine which\n * of these should be passed to the underlying DOM node.\n *\n * However, when styling a Motion component `styled(motion.div)`, both packages pass through *all* props\n * as it's seen as an arbitrary component rather than a DOM node. Motion only allows arbitrary props\n * passed through the `custom` prop so it doesn't *need* the payload or computational overhead of\n * `@emotion/is-prop-valid`, however to fix this problem we need to use it.\n *\n * By making it an optionalDependency we can offer this functionality only in the situations where it's\n * actually required.\n */\ntry {\n    /**\n     * We attempt to import this package but require won't be defined in esm environments, in that case\n     * isPropValid will have to be provided via `MotionContext`. In a 6.0.0 this should probably be removed\n     * in favour of explicit injection.\n     */\n    loadExternalIsValidProp(require(\"@emotion/is-prop-valid\").default);\n}\ncatch (_a) {\n    // We don't need to actually do anything here - the fallback is the existing `isPropValid`.\n}\nfunction filterProps(props, isDom, forwardMotionProps) {\n    var filteredProps = {};\n    for (var key in props) {\n        if (shouldForward(key) ||\n            (forwardMotionProps === true && isValidMotionProp(key)) ||\n            (!isDom && !isValidMotionProp(key)) ||\n            // If trying to use native HTML drag events, forward drag listeners\n            (props[\"draggable\"] && key.startsWith(\"onDrag\"))) {\n            filteredProps[key] = props[key];\n        }\n    }\n    return filteredProps;\n}\n\nexport { filterProps, loadExternalIsValidProp };\n","import { px } from 'style-value-types';\n\nfunction calcOrigin(origin, offset, size) {\n    return typeof origin === \"string\"\n        ? origin\n        : px.transform(offset + size * origin);\n}\n/**\n * The SVG transform origin defaults are different to CSS and is less intuitive,\n * so we use the measured dimensions of the SVG to reconcile these.\n */\nfunction calcSVGTransformOrigin(dimensions, originX, originY) {\n    var pxOriginX = calcOrigin(originX, dimensions.x, dimensions.width);\n    var pxOriginY = calcOrigin(originY, dimensions.y, dimensions.height);\n    return \"\".concat(pxOriginX, \" \").concat(pxOriginY);\n}\n\nexport { calcSVGTransformOrigin };\n","import { px } from 'style-value-types';\n\nvar dashKeys = {\n    offset: \"stroke-dashoffset\",\n    array: \"stroke-dasharray\",\n};\nvar camelKeys = {\n    offset: \"strokeDashoffset\",\n    array: \"strokeDasharray\",\n};\n/**\n * Build SVG path properties. Uses the path's measured length to convert\n * our custom pathLength, pathSpacing and pathOffset into stroke-dashoffset\n * and stroke-dasharray attributes.\n *\n * This function is mutative to reduce per-frame GC.\n */\nfunction buildSVGPath(attrs, length, spacing, offset, useDashCase) {\n    if (spacing === void 0) { spacing = 1; }\n    if (offset === void 0) { offset = 0; }\n    if (useDashCase === void 0) { useDashCase = true; }\n    // Normalise path length by setting SVG attribute pathLength to 1\n    attrs.pathLength = 1;\n    // We use dash case when setting attributes directly to the DOM node and camel case\n    // when defining props on a React component.\n    var keys = useDashCase ? dashKeys : camelKeys;\n    // Build the dash offset\n    attrs[keys.offset] = px.transform(-offset);\n    // Build the dash array\n    var pathLength = px.transform(length);\n    var pathSpacing = px.transform(spacing);\n    attrs[keys.array] = \"\".concat(pathLength, \" \").concat(pathSpacing);\n}\n\nexport { buildSVGPath };\n","import { __rest } from 'tslib';\nimport { buildHTMLStyles } from '../../html/utils/build-styles.mjs';\nimport { calcSVGTransformOrigin } from './transform-origin.mjs';\nimport { buildSVGPath } from './path.mjs';\n\n/**\n * Build SVG visual attrbutes, like cx and style.transform\n */\nfunction buildSVGAttrs(state, _a, options, transformTemplate) {\n    var attrX = _a.attrX, attrY = _a.attrY, originX = _a.originX, originY = _a.originY, pathLength = _a.pathLength, _b = _a.pathSpacing, pathSpacing = _b === void 0 ? 1 : _b, _c = _a.pathOffset, pathOffset = _c === void 0 ? 0 : _c, \n    // This is object creation, which we try to avoid per-frame.\n    latest = __rest(_a, [\"attrX\", \"attrY\", \"originX\", \"originY\", \"pathLength\", \"pathSpacing\", \"pathOffset\"]);\n    buildHTMLStyles(state, latest, options, transformTemplate);\n    state.attrs = state.style;\n    state.style = {};\n    var attrs = state.attrs, style = state.style, dimensions = state.dimensions;\n    /**\n     * However, we apply transforms as CSS transforms. So if we detect a transform we take it from attrs\n     * and copy it into style.\n     */\n    if (attrs.transform) {\n        if (dimensions)\n            style.transform = attrs.transform;\n        delete attrs.transform;\n    }\n    // Parse transformOrigin\n    if (dimensions &&\n        (originX !== undefined || originY !== undefined || style.transform)) {\n        style.transformOrigin = calcSVGTransformOrigin(dimensions, originX !== undefined ? originX : 0.5, originY !== undefined ? originY : 0.5);\n    }\n    // Treat x/y not as shortcuts but as actual attributes\n    if (attrX !== undefined)\n        attrs.x = attrX;\n    if (attrY !== undefined)\n        attrs.y = attrY;\n    // Build SVG path if one has been defined\n    if (pathLength !== undefined) {\n        buildSVGPath(attrs, pathLength, pathSpacing, pathOffset, false);\n    }\n}\n\nexport { buildSVGAttrs };\n","import { __assign } from 'tslib';\nimport { createHtmlRenderState } from '../../html/utils/create-render-state.mjs';\n\nvar createSvgRenderState = function () { return (__assign(__assign({}, createHtmlRenderState()), { attrs: {} })); };\n\nexport { createSvgRenderState };\n","import { __assign } from 'tslib';\nimport { useMemo } from 'react';\nimport { copyRawValuesOnly } from '../html/use-props.mjs';\nimport { buildSVGAttrs } from './utils/build-attrs.mjs';\nimport { createSvgRenderState } from './utils/create-render-state.mjs';\n\nfunction useSVGProps(props, visualState) {\n    var visualProps = useMemo(function () {\n        var state = createSvgRenderState();\n        buildSVGAttrs(state, visualState, { enableHardwareAcceleration: false }, props.transformTemplate);\n        return __assign(__assign({}, state.attrs), { style: __assign({}, state.style) });\n    }, [visualState]);\n    if (props.style) {\n        var rawStyles = {};\n        copyRawValuesOnly(rawStyles, props.style, props);\n        visualProps.style = __assign(__assign({}, rawStyles), visualProps.style);\n    }\n    return visualProps;\n}\n\nexport { useSVGProps };\n","import { __assign } from 'tslib';\nimport { createElement } from 'react';\nimport { useHTMLProps } from '../html/use-props.mjs';\nimport { filterProps } from './utils/filter-props.mjs';\nimport { isSVGComponent } from './utils/is-svg-component.mjs';\nimport { useSVGProps } from '../svg/use-props.mjs';\n\nfunction createUseRender(forwardMotionProps) {\n    if (forwardMotionProps === void 0) { forwardMotionProps = false; }\n    var useRender = function (Component, props, projectionId, ref, _a, isStatic) {\n        var latestValues = _a.latestValues;\n        var useVisualProps = isSVGComponent(Component)\n            ? useSVGProps\n            : useHTMLProps;\n        var visualProps = useVisualProps(props, latestValues, isStatic);\n        var filteredProps = filterProps(props, typeof Component === \"string\", forwardMotionProps);\n        var elementProps = __assign(__assign(__assign({}, filteredProps), visualProps), { ref: ref });\n        if (projectionId) {\n            elementProps[\"data-projection-id\"] = projectionId;\n        }\n        return createElement(Component, elementProps);\n    };\n    return useRender;\n}\n\nexport { createUseRender };\n","var CAMEL_CASE_PATTERN = /([a-z])([A-Z])/g;\nvar REPLACE_TEMPLATE = \"$1-$2\";\n/**\n * Convert camelCase to dash-case properties.\n */\nvar camelToDash = function (str) {\n    return str.replace(CAMEL_CASE_PATTERN, REPLACE_TEMPLATE).toLowerCase();\n};\n\nexport { camelToDash };\n","function renderHTML(element, _a, styleProp, projection) {\n    var style = _a.style, vars = _a.vars;\n    Object.assign(element.style, style, projection && projection.getProjectionStyles(styleProp));\n    // Loop over any CSS variables and assign those.\n    for (var key in vars) {\n        element.style.setProperty(key, vars[key]);\n    }\n}\n\nexport { renderHTML };\n","/**\n * A set of attribute names that are always read/written as camel case.\n */\nvar camelCaseAttributes = new Set([\n    \"baseFrequency\",\n    \"diffuseConstant\",\n    \"kernelMatrix\",\n    \"kernelUnitLength\",\n    \"keySplines\",\n    \"keyTimes\",\n    \"limitingConeAngle\",\n    \"markerHeight\",\n    \"markerWidth\",\n    \"numOctaves\",\n    \"targetX\",\n    \"targetY\",\n    \"surfaceScale\",\n    \"specularConstant\",\n    \"specularExponent\",\n    \"stdDeviation\",\n    \"tableValues\",\n    \"viewBox\",\n    \"gradientTransform\",\n    \"pathLength\",\n]);\n\nexport { camelCaseAttributes };\n","import { camelToDash } from '../../dom/utils/camel-to-dash.mjs';\nimport { renderHTML } from '../../html/utils/render.mjs';\nimport { camelCaseAttributes } from './camel-case-attrs.mjs';\n\nfunction renderSVG(element, renderState) {\n    renderHTML(element, renderState);\n    for (var key in renderState.attrs) {\n        element.setAttribute(!camelCaseAttributes.has(key) ? camelToDash(key) : key, renderState.attrs[key]);\n    }\n}\n\nexport { renderSVG };\n","import { isForcedMotionValue } from '../../../motion/utils/is-forced-motion-value.mjs';\nimport { isMotionValue } from '../../../value/utils/is-motion-value.mjs';\n\nfunction scrapeMotionValuesFromProps(props) {\n    var style = props.style;\n    var newValues = {};\n    for (var key in style) {\n        if (isMotionValue(style[key]) || isForcedMotionValue(key, props)) {\n            newValues[key] = style[key];\n        }\n    }\n    return newValues;\n}\n\nexport { scrapeMotionValuesFromProps };\n","import { isMotionValue } from '../../../value/utils/is-motion-value.mjs';\nimport { scrapeMotionValuesFromProps as scrapeMotionValuesFromProps$1 } from '../../html/utils/scrape-motion-values.mjs';\n\nfunction scrapeMotionValuesFromProps(props) {\n    var newValues = scrapeMotionValuesFromProps$1(props);\n    for (var key in props) {\n        if (isMotionValue(props[key])) {\n            var targetKey = key === \"x\" || key === \"y\" ? \"attr\" + key.toUpperCase() : key;\n            newValues[targetKey] = props[key];\n        }\n    }\n    return newValues;\n}\n\nexport { scrapeMotionValuesFromProps };\n","function isAnimationControls(v) {\n    return typeof v === \"object\" && typeof v.start === \"function\";\n}\n\nexport { isAnimationControls };\n","import { __rest } from 'tslib';\nimport { useContext } from 'react';\nimport { isAnimationControls } from '../../animation/utils/is-animation-controls.mjs';\nimport { PresenceContext } from '../../context/PresenceContext.mjs';\nimport { checkIfControllingVariants, checkIfVariantNode, resolveVariantFromProps } from '../../render/utils/variants.mjs';\nimport { useConstant } from '../../utils/use-constant.mjs';\nimport { resolveMotionValue } from '../../value/utils/resolve-motion-value.mjs';\nimport { MotionContext } from '../../context/MotionContext/index.mjs';\n\nfunction makeState(_a, props, context, presenceContext) {\n    var scrapeMotionValuesFromProps = _a.scrapeMotionValuesFromProps, createRenderState = _a.createRenderState, onMount = _a.onMount;\n    var state = {\n        latestValues: makeLatestValues(props, context, presenceContext, scrapeMotionValuesFromProps),\n        renderState: createRenderState(),\n    };\n    if (onMount) {\n        state.mount = function (instance) { return onMount(props, instance, state); };\n    }\n    return state;\n}\nvar makeUseVisualState = function (config) {\n    return function (props, isStatic) {\n        var context = useContext(MotionContext);\n        var presenceContext = useContext(PresenceContext);\n        return isStatic\n            ? makeState(config, props, context, presenceContext)\n            : useConstant(function () {\n                return makeState(config, props, context, presenceContext);\n            });\n    };\n};\nfunction makeLatestValues(props, context, presenceContext, scrapeMotionValues) {\n    var values = {};\n    var blockInitialAnimation = (presenceContext === null || presenceContext === void 0 ? void 0 : presenceContext.initial) === false;\n    var motionValues = scrapeMotionValues(props);\n    for (var key in motionValues) {\n        values[key] = resolveMotionValue(motionValues[key]);\n    }\n    var initial = props.initial, animate = props.animate;\n    var isControllingVariants = checkIfControllingVariants(props);\n    var isVariantNode = checkIfVariantNode(props);\n    if (context &&\n        isVariantNode &&\n        !isControllingVariants &&\n        props.inherit !== false) {\n        initial !== null && initial !== void 0 ? initial : (initial = context.initial);\n        animate !== null && animate !== void 0 ? animate : (animate = context.animate);\n    }\n    var initialAnimationIsBlocked = blockInitialAnimation || initial === false;\n    var variantToSet = initialAnimationIsBlocked ? animate : initial;\n    if (variantToSet &&\n        typeof variantToSet !== \"boolean\" &&\n        !isAnimationControls(variantToSet)) {\n        var list = Array.isArray(variantToSet) ? variantToSet : [variantToSet];\n        list.forEach(function (definition) {\n            var resolved = resolveVariantFromProps(props, definition);\n            if (!resolved)\n                return;\n            var transitionEnd = resolved.transitionEnd; resolved.transition; var target = __rest(resolved, [\"transitionEnd\", \"transition\"]);\n            for (var key in target) {\n                var valueTarget = target[key];\n                if (Array.isArray(valueTarget)) {\n                    /**\n                     * Take final keyframe if the initial animation is blocked because\n                     * we want to initialise at the end of that blocked animation.\n                     */\n                    var index = initialAnimationIsBlocked\n                        ? valueTarget.length - 1\n                        : 0;\n                    valueTarget = valueTarget[index];\n                }\n                if (valueTarget !== null) {\n                    values[key] = valueTarget;\n                }\n            }\n            for (var key in transitionEnd)\n                values[key] = transitionEnd[key];\n        });\n    }\n    return values;\n}\n\nexport { makeUseVisualState };\n","import { renderSVG } from './utils/render.mjs';\nimport { scrapeMotionValuesFromProps } from './utils/scrape-motion-values.mjs';\nimport { makeUseVisualState } from '../../motion/utils/use-visual-state.mjs';\nimport { createSvgRenderState } from './utils/create-render-state.mjs';\nimport { buildSVGAttrs } from './utils/build-attrs.mjs';\n\nvar svgMotionConfig = {\n    useVisualState: makeUseVisualState({\n        scrapeMotionValuesFromProps: scrapeMotionValuesFromProps,\n        createRenderState: createSvgRenderState,\n        onMount: function (props, instance, _a) {\n            var renderState = _a.renderState, latestValues = _a.latestValues;\n            try {\n                renderState.dimensions =\n                    typeof instance.getBBox ===\n                        \"function\"\n                        ? instance.getBBox()\n                        : instance.getBoundingClientRect();\n            }\n            catch (e) {\n                // Most likely trying to measure an unrendered element under Firefox\n                renderState.dimensions = {\n                    x: 0,\n                    y: 0,\n                    width: 0,\n                    height: 0,\n                };\n            }\n            buildSVGAttrs(renderState, latestValues, { enableHardwareAcceleration: false }, props.transformTemplate);\n            // TODO: Replace with direct assignment\n            renderSVG(instance, renderState);\n        },\n    }),\n};\n\nexport { svgMotionConfig };\n","import { makeUseVisualState } from '../../motion/utils/use-visual-state.mjs';\nimport { scrapeMotionValuesFromProps } from './utils/scrape-motion-values.mjs';\nimport { createHtmlRenderState } from './utils/create-render-state.mjs';\n\nvar htmlMotionConfig = {\n    useVisualState: makeUseVisualState({\n        scrapeMotionValuesFromProps: scrapeMotionValuesFromProps,\n        createRenderState: createHtmlRenderState,\n    }),\n};\n\nexport { htmlMotionConfig };\n","import { __assign } from 'tslib';\nimport { isSVGComponent } from './is-svg-component.mjs';\nimport { createUseRender } from '../use-render.mjs';\nimport { svgMotionConfig } from '../../svg/config-motion.mjs';\nimport { htmlMotionConfig } from '../../html/config-motion.mjs';\n\nfunction createDomMotionConfig(Component, _a, preloadedFeatures, createVisualElement, projectionNodeConstructor) {\n    var _b = _a.forwardMotionProps, forwardMotionProps = _b === void 0 ? false : _b;\n    var baseConfig = isSVGComponent(Component)\n        ? svgMotionConfig\n        : htmlMotionConfig;\n    return __assign(__assign({}, baseConfig), { preloadedFeatures: preloadedFeatures, useRender: createUseRender(forwardMotionProps), createVisualElement: createVisualElement, projectionNodeConstructor: projectionNodeConstructor, Component: Component });\n}\n\nexport { createDomMotionConfig };\n","var AnimationType;\n(function (AnimationType) {\n    AnimationType[\"Animate\"] = \"animate\";\n    AnimationType[\"Hover\"] = \"whileHover\";\n    AnimationType[\"Tap\"] = \"whileTap\";\n    AnimationType[\"Drag\"] = \"whileDrag\";\n    AnimationType[\"Focus\"] = \"whileFocus\";\n    AnimationType[\"InView\"] = \"whileInView\";\n    AnimationType[\"Exit\"] = \"exit\";\n})(AnimationType || (AnimationType = {}));\n\nexport { AnimationType };\n","import { useEffect } from 'react';\n\nfunction addDomEvent(target, eventName, handler, options) {\n    target.addEventListener(eventName, handler, options);\n    return function () { return target.removeEventListener(eventName, handler, options); };\n}\n/**\n * Attaches an event listener directly to the provided DOM element.\n *\n * Bypassing React's event system can be desirable, for instance when attaching non-passive\n * event handlers.\n *\n * ```jsx\n * const ref = useRef(null)\n *\n * useDomEvent(ref, 'wheel', onWheel, { passive: false })\n *\n * return <div ref={ref} />\n * ```\n *\n * @param ref - React.RefObject that's been provided to the element you want to bind the listener to.\n * @param eventName - Name of the event you want listen for.\n * @param handler - Function to fire when receiving the event.\n * @param options - Options to pass to `Event.addEventListener`.\n *\n * @public\n */\nfunction useDomEvent(ref, eventName, handler, options) {\n    useEffect(function () {\n        var element = ref.current;\n        if (handler && element) {\n            return addDomEvent(element, eventName, handler, options);\n        }\n    }, [ref, eventName, handler, options]);\n}\n\nexport { addDomEvent, useDomEvent };\n","import { AnimationType } from '../render/utils/types.mjs';\nimport { useDomEvent } from '../events/use-dom-event.mjs';\n\n/**\n *\n * @param props\n * @param ref\n * @internal\n */\nfunction useFocusGesture(_a) {\n    var whileFocus = _a.whileFocus, visualElement = _a.visualElement;\n    var onFocus = function () {\n        var _a;\n        (_a = visualElement.animationState) === null || _a === void 0 ? void 0 : _a.setActive(AnimationType.Focus, true);\n    };\n    var onBlur = function () {\n        var _a;\n        (_a = visualElement.animationState) === null || _a === void 0 ? void 0 : _a.setActive(AnimationType.Focus, false);\n    };\n    useDomEvent(visualElement, \"focus\", whileFocus ? onFocus : undefined);\n    useDomEvent(visualElement, \"blur\", whileFocus ? onBlur : undefined);\n}\n\nexport { useFocusGesture };\n","function isMouseEvent(event) {\n    // PointerEvent inherits from MouseEvent so we can't use a straight instanceof check.\n    if (typeof PointerEvent !== \"undefined\" && event instanceof PointerEvent) {\n        return !!(event.pointerType === \"mouse\");\n    }\n    return event instanceof MouseEvent;\n}\nfunction isTouchEvent(event) {\n    var hasTouches = !!event.touches;\n    return hasTouches;\n}\n\nexport { isMouseEvent, isTouchEvent };\n","import { isTouchEvent } from '../gestures/utils/event-type.mjs';\n\n/**\n * Filters out events not attached to the primary pointer (currently left mouse button)\n * @param eventHandler\n */\nfunction filterPrimaryPointer(eventHandler) {\n    return function (event) {\n        var isMouseEvent = event instanceof MouseEvent;\n        var isPrimaryPointer = !isMouseEvent ||\n            (isMouseEvent && event.button === 0);\n        if (isPrimaryPointer) {\n            eventHandler(event);\n        }\n    };\n}\nvar defaultPagePoint = { pageX: 0, pageY: 0 };\nfunction pointFromTouch(e, pointType) {\n    if (pointType === void 0) { pointType = \"page\"; }\n    var primaryTouch = e.touches[0] || e.changedTouches[0];\n    var point = primaryTouch || defaultPagePoint;\n    return {\n        x: point[pointType + \"X\"],\n        y: point[pointType + \"Y\"],\n    };\n}\nfunction pointFromMouse(point, pointType) {\n    if (pointType === void 0) { pointType = \"page\"; }\n    return {\n        x: point[pointType + \"X\"],\n        y: point[pointType + \"Y\"],\n    };\n}\nfunction extractEventInfo(event, pointType) {\n    if (pointType === void 0) { pointType = \"page\"; }\n    return {\n        point: isTouchEvent(event)\n            ? pointFromTouch(event, pointType)\n            : pointFromMouse(event, pointType),\n    };\n}\nvar wrapHandler = function (handler, shouldFilterPrimaryPointer) {\n    if (shouldFilterPrimaryPointer === void 0) { shouldFilterPrimaryPointer = false; }\n    var listener = function (event) {\n        return handler(event, extractEventInfo(event));\n    };\n    return shouldFilterPrimaryPointer\n        ? filterPrimaryPointer(listener)\n        : listener;\n};\n\nexport { extractEventInfo, wrapHandler };\n","import { isBrowser } from '../utils/is-browser.mjs';\n\n// We check for event support via functions in case they've been mocked by a testing suite.\nvar supportsPointerEvents = function () {\n    return isBrowser && window.onpointerdown === null;\n};\nvar supportsTouchEvents = function () {\n    return isBrowser && window.ontouchstart === null;\n};\nvar supportsMouseEvents = function () {\n    return isBrowser && window.onmousedown === null;\n};\n\nexport { supportsMouseEvents, supportsPointerEvents, supportsTouchEvents };\n","import { useDomEvent, addDomEvent } from './use-dom-event.mjs';\nimport { wrapHandler } from './event-info.mjs';\nimport { supportsPointerEvents, supportsTouchEvents, supportsMouseEvents } from './utils.mjs';\n\nvar mouseEventNames = {\n    pointerdown: \"mousedown\",\n    pointermove: \"mousemove\",\n    pointerup: \"mouseup\",\n    pointercancel: \"mousecancel\",\n    pointerover: \"mouseover\",\n    pointerout: \"mouseout\",\n    pointerenter: \"mouseenter\",\n    pointerleave: \"mouseleave\",\n};\nvar touchEventNames = {\n    pointerdown: \"touchstart\",\n    pointermove: \"touchmove\",\n    pointerup: \"touchend\",\n    pointercancel: \"touchcancel\",\n};\nfunction getPointerEventName(name) {\n    if (supportsPointerEvents()) {\n        return name;\n    }\n    else if (supportsTouchEvents()) {\n        return touchEventNames[name];\n    }\n    else if (supportsMouseEvents()) {\n        return mouseEventNames[name];\n    }\n    return name;\n}\nfunction addPointerEvent(target, eventName, handler, options) {\n    return addDomEvent(target, getPointerEventName(eventName), wrapHandler(handler, eventName === \"pointerdown\"), options);\n}\nfunction usePointerEvent(ref, eventName, handler, options) {\n    return useDomEvent(ref, getPointerEventName(eventName), handler && wrapHandler(handler, eventName === \"pointerdown\"), options);\n}\n\nexport { addPointerEvent, usePointerEvent };\n","function createLock(name) {\n    var lock = null;\n    return function () {\n        var openLock = function () {\n            lock = null;\n        };\n        if (lock === null) {\n            lock = name;\n            return openLock;\n        }\n        return false;\n    };\n}\nvar globalHorizontalLock = createLock(\"dragHorizontal\");\nvar globalVerticalLock = createLock(\"dragVertical\");\nfunction getGlobalLock(drag) {\n    var lock = false;\n    if (drag === \"y\") {\n        lock = globalVerticalLock();\n    }\n    else if (drag === \"x\") {\n        lock = globalHorizontalLock();\n    }\n    else {\n        var openHorizontal_1 = globalHorizontalLock();\n        var openVertical_1 = globalVerticalLock();\n        if (openHorizontal_1 && openVertical_1) {\n            lock = function () {\n                openHorizontal_1();\n                openVertical_1();\n            };\n        }\n        else {\n            // Release the locks because we don't use them\n            if (openHorizontal_1)\n                openHorizontal_1();\n            if (openVertical_1)\n                openVertical_1();\n        }\n    }\n    return lock;\n}\nfunction isDragActive() {\n    // Check the gesture lock - if we get it, it means no drag gesture is active\n    // and we can safely fire the tap gesture.\n    var openGestureLock = getGlobalLock(true);\n    if (!openGestureLock)\n        return true;\n    openGestureLock();\n    return false;\n}\n\nexport { createLock, getGlobalLock, isDragActive };\n","import { isMouseEvent } from './utils/event-type.mjs';\nimport { AnimationType } from '../render/utils/types.mjs';\nimport { usePointerEvent } from '../events/use-pointer-event.mjs';\nimport { isDragActive } from './drag/utils/lock.mjs';\n\nfunction createHoverEvent(visualElement, isActive, callback) {\n    return function (event, info) {\n        var _a;\n        if (!isMouseEvent(event) || isDragActive())\n            return;\n        /**\n         * Ensure we trigger animations before firing event callback\n         */\n        (_a = visualElement.animationState) === null || _a === void 0 ? void 0 : _a.setActive(AnimationType.Hover, isActive);\n        callback === null || callback === void 0 ? void 0 : callback(event, info);\n    };\n}\nfunction useHoverGesture(_a) {\n    var onHoverStart = _a.onHoverStart, onHoverEnd = _a.onHoverEnd, whileHover = _a.whileHover, visualElement = _a.visualElement;\n    usePointerEvent(visualElement, \"pointerenter\", onHoverStart || whileHover\n        ? createHoverEvent(visualElement, true, onHoverStart)\n        : undefined);\n    usePointerEvent(visualElement, \"pointerleave\", onHoverEnd || whileHover\n        ? createHoverEvent(visualElement, false, onHoverEnd)\n        : undefined);\n}\n\nexport { useHoverGesture };\n","/**\n * Recursively traverse up the tree to check whether the provided child node\n * is the parent or a descendant of it.\n *\n * @param parent - Element to find\n * @param child - Element to test against parent\n */\nvar isNodeOrChild = function (parent, child) {\n    if (!child) {\n        return false;\n    }\n    else if (parent === child) {\n        return true;\n    }\n    else {\n        return isNodeOrChild(parent, child.parentElement);\n    }\n};\n\nexport { isNodeOrChild };\n","import { useEffect } from 'react';\n\nfunction useUnmountEffect(callback) {\n    return useEffect(function () { return function () { return callback(); }; }, []);\n}\n\nexport { useUnmountEffect };\n","import { useRef } from 'react';\nimport { isNodeOrChild } from './utils/is-node-or-child.mjs';\nimport { usePointerEvent, addPointerEvent } from '../events/use-pointer-event.mjs';\nimport { useUnmountEffect } from '../utils/use-unmount-effect.mjs';\nimport { pipe } from 'popmotion';\nimport { AnimationType } from '../render/utils/types.mjs';\nimport { isDragActive } from './drag/utils/lock.mjs';\n\n/**\n * @param handlers -\n * @internal\n */\nfunction useTapGesture(_a) {\n    var onTap = _a.onTap, onTapStart = _a.onTapStart, onTapCancel = _a.onTapCancel, whileTap = _a.whileTap, visualElement = _a.visualElement;\n    var hasPressListeners = onTap || onTapStart || onTapCancel || whileTap;\n    var isPressing = useRef(false);\n    var cancelPointerEndListeners = useRef(null);\n    function removePointerEndListener() {\n        var _a;\n        (_a = cancelPointerEndListeners.current) === null || _a === void 0 ? void 0 : _a.call(cancelPointerEndListeners);\n        cancelPointerEndListeners.current = null;\n    }\n    function checkPointerEnd() {\n        var _a;\n        removePointerEndListener();\n        isPressing.current = false;\n        (_a = visualElement.animationState) === null || _a === void 0 ? void 0 : _a.setActive(AnimationType.Tap, false);\n        return !isDragActive();\n    }\n    function onPointerUp(event, info) {\n        if (!checkPointerEnd())\n            return;\n        /**\n         * We only count this as a tap gesture if the event.target is the same\n         * as, or a child of, this component's element\n         */\n        !isNodeOrChild(visualElement.getInstance(), event.target)\n            ? onTapCancel === null || onTapCancel === void 0 ? void 0 : onTapCancel(event, info)\n            : onTap === null || onTap === void 0 ? void 0 : onTap(event, info);\n    }\n    function onPointerCancel(event, info) {\n        if (!checkPointerEnd())\n            return;\n        onTapCancel === null || onTapCancel === void 0 ? void 0 : onTapCancel(event, info);\n    }\n    function onPointerDown(event, info) {\n        var _a;\n        removePointerEndListener();\n        if (isPressing.current)\n            return;\n        isPressing.current = true;\n        cancelPointerEndListeners.current = pipe(addPointerEvent(window, \"pointerup\", onPointerUp), addPointerEvent(window, \"pointercancel\", onPointerCancel));\n        /**\n         * Ensure we trigger animations before firing event callback\n         */\n        (_a = visualElement.animationState) === null || _a === void 0 ? void 0 : _a.setActive(AnimationType.Tap, true);\n        onTapStart === null || onTapStart === void 0 ? void 0 : onTapStart(event, info);\n    }\n    usePointerEvent(visualElement, \"pointerdown\", hasPressListeners ? onPointerDown : undefined);\n    useUnmountEffect(removePointerEndListener);\n}\n\nexport { useTapGesture };\n","import { __rest, __assign } from 'tslib';\n\n/**\n * Map an IntersectionHandler callback to an element. We only ever make one handler for one\n * element, so even though these handlers might all be triggered by different\n * observers, we can keep them in the same map.\n */\nvar observerCallbacks = new WeakMap();\n/**\n * Multiple observers can be created for multiple element/document roots. Each with\n * different settings. So here we store dictionaries of observers to each root,\n * using serialised settings (threshold/margin) as lookup keys.\n */\nvar observers = new WeakMap();\nvar fireObserverCallback = function (entry) {\n    var _a;\n    (_a = observerCallbacks.get(entry.target)) === null || _a === void 0 ? void 0 : _a(entry);\n};\nvar fireAllObserverCallbacks = function (entries) {\n    entries.forEach(fireObserverCallback);\n};\nfunction initIntersectionObserver(_a) {\n    var root = _a.root, options = __rest(_a, [\"root\"]);\n    var lookupRoot = root || document;\n    /**\n     * If we don't have an observer lookup map for this root, create one.\n     */\n    if (!observers.has(lookupRoot)) {\n        observers.set(lookupRoot, {});\n    }\n    var rootObservers = observers.get(lookupRoot);\n    var key = JSON.stringify(options);\n    /**\n     * If we don't have an observer for this combination of root and settings,\n     * create one.\n     */\n    if (!rootObservers[key]) {\n        rootObservers[key] = new IntersectionObserver(fireAllObserverCallbacks, __assign({ root: root }, options));\n    }\n    return rootObservers[key];\n}\nfunction observeIntersection(element, options, callback) {\n    var rootInteresectionObserver = initIntersectionObserver(options);\n    observerCallbacks.set(element, callback);\n    rootInteresectionObserver.observe(element);\n    return function () {\n        observerCallbacks.delete(element);\n        rootInteresectionObserver.unobserve(element);\n    };\n}\n\nexport { observeIntersection };\n","import { useRef, useEffect } from 'react';\nimport { AnimationType } from '../../../render/utils/types.mjs';\nimport { warnOnce } from '../../../utils/warn-once.mjs';\nimport { observeIntersection } from './observers.mjs';\n\nfunction useViewport(_a) {\n    var visualElement = _a.visualElement, whileInView = _a.whileInView, onViewportEnter = _a.onViewportEnter, onViewportLeave = _a.onViewportLeave, _b = _a.viewport, viewport = _b === void 0 ? {} : _b;\n    var state = useRef({\n        hasEnteredView: false,\n        isInView: false,\n    });\n    var shouldObserve = Boolean(whileInView || onViewportEnter || onViewportLeave);\n    if (viewport.once && state.current.hasEnteredView)\n        shouldObserve = false;\n    var useObserver = typeof IntersectionObserver === \"undefined\"\n        ? useMissingIntersectionObserver\n        : useIntersectionObserver;\n    useObserver(shouldObserve, state.current, visualElement, viewport);\n}\nvar thresholdNames = {\n    some: 0,\n    all: 1,\n};\nfunction useIntersectionObserver(shouldObserve, state, visualElement, _a) {\n    var root = _a.root, rootMargin = _a.margin, _b = _a.amount, amount = _b === void 0 ? \"some\" : _b, once = _a.once;\n    useEffect(function () {\n        if (!shouldObserve)\n            return;\n        var options = {\n            root: root === null || root === void 0 ? void 0 : root.current,\n            rootMargin: rootMargin,\n            threshold: typeof amount === \"number\" ? amount : thresholdNames[amount],\n        };\n        var intersectionCallback = function (entry) {\n            var _a;\n            var isIntersecting = entry.isIntersecting;\n            /**\n             * If there's been no change in the viewport state, early return.\n             */\n            if (state.isInView === isIntersecting)\n                return;\n            state.isInView = isIntersecting;\n            /**\n             * Handle hasEnteredView. If this is only meant to run once, and\n             * element isn't visible, early return. Otherwise set hasEnteredView to true.\n             */\n            if (once && !isIntersecting && state.hasEnteredView) {\n                return;\n            }\n            else if (isIntersecting) {\n                state.hasEnteredView = true;\n            }\n            (_a = visualElement.animationState) === null || _a === void 0 ? void 0 : _a.setActive(AnimationType.InView, isIntersecting);\n            /**\n             * Use the latest committed props rather than the ones in scope\n             * when this observer is created\n             */\n            var props = visualElement.getProps();\n            var callback = isIntersecting\n                ? props.onViewportEnter\n                : props.onViewportLeave;\n            callback === null || callback === void 0 ? void 0 : callback(entry);\n        };\n        return observeIntersection(visualElement.getInstance(), options, intersectionCallback);\n    }, [shouldObserve, root, rootMargin, amount]);\n}\n/**\n * If IntersectionObserver is missing, we activate inView and fire onViewportEnter\n * on mount. This way, the page will be in the state the author expects users\n * to see it in for everyone.\n */\nfunction useMissingIntersectionObserver(shouldObserve, state, visualElement) {\n    useEffect(function () {\n        if (!shouldObserve)\n            return;\n        if (process.env.NODE_ENV !== \"production\") {\n            warnOnce(false, \"IntersectionObserver not available on this device. whileInView animations will trigger on mount.\");\n        }\n        /**\n         * Fire this in an rAF because, at this point, the animation state\n         * won't have flushed for the first time and there's certain logic in\n         * there that behaves differently on the initial animation.\n         *\n         * This hook should be quite rarely called so setting this in an rAF\n         * is preferred to changing the behaviour of the animation state.\n         */\n        requestAnimationFrame(function () {\n            var _a;\n            state.hasEnteredView = true;\n            var onViewportEnter = visualElement.getProps().onViewportEnter;\n            onViewportEnter === null || onViewportEnter === void 0 ? void 0 : onViewportEnter(null);\n            (_a = visualElement.animationState) === null || _a === void 0 ? void 0 : _a.setActive(AnimationType.InView, true);\n        });\n    }, [shouldObserve]);\n}\n\nexport { useViewport };\n","var makeRenderlessComponent = function (hook) { return function (props) {\n    hook(props);\n    return null;\n}; };\n\nexport { makeRenderlessComponent };\n","import { useFocusGesture } from '../../gestures/use-focus-gesture.mjs';\nimport { useHoverGesture } from '../../gestures/use-hover-gesture.mjs';\nimport { useTapGesture } from '../../gestures/use-tap-gesture.mjs';\nimport { useViewport } from './viewport/use-viewport.mjs';\nimport { makeRenderlessComponent } from '../utils/make-renderless-component.mjs';\n\nvar gestureAnimations = {\n    inView: makeRenderlessComponent(useViewport),\n    tap: makeRenderlessComponent(useTapGesture),\n    focus: makeRenderlessComponent(useFocusGesture),\n    hover: makeRenderlessComponent(useHoverGesture),\n};\n\nexport { gestureAnimations };\n","import { useContext, useEffect } from 'react';\nimport { PresenceContext } from '../../context/PresenceContext.mjs';\nimport { useConstant } from '../../utils/use-constant.mjs';\n\n/**\n * When a component is the child of `AnimatePresence`, it can use `usePresence`\n * to access information about whether it's still present in the React tree.\n *\n * ```jsx\n * import { usePresence } from \"framer-motion\"\n *\n * export const Component = () => {\n *   const [isPresent, safeToRemove] = usePresence()\n *\n *   useEffect(() => {\n *     !isPresent && setTimeout(safeToRemove, 1000)\n *   }, [isPresent])\n *\n *   return <div />\n * }\n * ```\n *\n * If `isPresent` is `false`, it means that a component has been removed the tree, but\n * `AnimatePresence` won't really remove it until `safeToRemove` has been called.\n *\n * @public\n */\nfunction usePresence() {\n    var context = useContext(PresenceContext);\n    if (context === null)\n        return [true, null];\n    var isPresent = context.isPresent, onExitComplete = context.onExitComplete, register = context.register;\n    // It's safe to call the following hooks conditionally (after an early return) because the context will always\n    // either be null or non-null for the lifespan of the component.\n    // Replace with useOpaqueId when released in React\n    var id = useUniqueId();\n    useEffect(function () { return register(id); }, []);\n    var safeToRemove = function () { return onExitComplete === null || onExitComplete === void 0 ? void 0 : onExitComplete(id); };\n    return !isPresent && onExitComplete ? [false, safeToRemove] : [true];\n}\n/**\n * Similar to `usePresence`, except `useIsPresent` simply returns whether or not the component is present.\n * There is no `safeToRemove` function.\n *\n * ```jsx\n * import { useIsPresent } from \"framer-motion\"\n *\n * export const Component = () => {\n *   const isPresent = useIsPresent()\n *\n *   useEffect(() => {\n *     !isPresent && console.log(\"I've been removed!\")\n *   }, [isPresent])\n *\n *   return <div />\n * }\n * ```\n *\n * @public\n */\nfunction useIsPresent() {\n    return isPresent(useContext(PresenceContext));\n}\nfunction isPresent(context) {\n    return context === null ? true : context.isPresent;\n}\nvar counter = 0;\nvar incrementId = function () { return counter++; };\nvar useUniqueId = function () { return useConstant(incrementId); };\n\nexport { isPresent, useIsPresent, usePresence };\n","function shallowCompare(next, prev) {\n    if (!Array.isArray(prev))\n        return false;\n    var prevLength = prev.length;\n    if (prevLength !== next.length)\n        return false;\n    for (var i = 0; i < prevLength; i++) {\n        if (prev[i] !== next[i])\n            return false;\n    }\n    return true;\n}\n\nexport { shallowCompare };\n","/**\n * Check if value is a numerical string, ie a string that is purely a number eg \"100\" or \"-100.1\"\n */\nvar isNumericalString = function (v) { return /^\\-?\\d*\\.?\\d+$/.test(v); };\n\nexport { isNumericalString };\n","/**\n * Check if the value is a zero value string like \"0px\" or \"0%\"\n */\nvar isZeroValueString = function (v) { return /^0[^.\\s]+$/.test(v); };\n\nexport { isZeroValueString };\n","/**\n * Tests a provided value against a ValueType\n */\nvar testValueType = function (v) { return function (type) { return type.test(v); }; };\n\nexport { testValueType };\n","/**\n * ValueType for \"auto\"\n */\nvar auto = {\n    test: function (v) { return v === \"auto\"; },\n    parse: function (v) { return v; },\n};\n\nexport { auto };\n","import { number, px, percent, degrees, vw, vh } from 'style-value-types';\nimport { testValueType } from './test.mjs';\nimport { auto } from './type-auto.mjs';\n\n/**\n * A list of value types commonly used for dimensions\n */\nvar dimensionValueTypes = [number, px, percent, degrees, vw, vh, auto];\n/**\n * Tests a dimensional value against the list of dimension ValueTypes\n */\nvar findDimensionValueType = function (v) {\n    return dimensionValueTypes.find(testValueType(v));\n};\n\nexport { dimensionValueTypes, findDimensionValueType };\n","import { __spreadArray, __read } from 'tslib';\nimport { color, complex } from 'style-value-types';\nimport { dimensionValueTypes } from './dimensions.mjs';\nimport { testValueType } from './test.mjs';\n\n/**\n * A list of all ValueTypes\n */\nvar valueTypes = __spreadArray(__spreadArray([], __read(dimensionValueTypes), false), [color, complex], false);\n/**\n * Tests a value against the list of ValueTypes\n */\nvar findValueType = function (v) { return valueTypes.find(testValueType(v)); };\n\nexport { findValueType };\n","import { __rest, __assign, __spreadArray, __read } from 'tslib';\nimport { complex } from 'style-value-types';\nimport { isNumericalString } from '../../utils/is-numerical-string.mjs';\nimport { isZeroValueString } from '../../utils/is-zero-value-string.mjs';\nimport { resolveFinalValueInKeyframes } from '../../utils/resolve-value.mjs';\nimport { motionValue } from '../../value/index.mjs';\nimport { getAnimatableNone } from '../dom/value-types/animatable-none.mjs';\nimport { findValueType } from '../dom/value-types/find.mjs';\nimport { resolveVariant } from './variants.mjs';\n\n/**\n * Set VisualElement's MotionValue, creating a new MotionValue for it if\n * it doesn't exist.\n */\nfunction setMotionValue(visualElement, key, value) {\n    if (visualElement.hasValue(key)) {\n        visualElement.getValue(key).set(value);\n    }\n    else {\n        visualElement.addValue(key, motionValue(value));\n    }\n}\nfunction setTarget(visualElement, definition) {\n    var resolved = resolveVariant(visualElement, definition);\n    var _a = resolved ? visualElement.makeTargetAnimatable(resolved, false) : {}, _b = _a.transitionEnd, transitionEnd = _b === void 0 ? {} : _b; _a.transition; var target = __rest(_a, [\"transitionEnd\", \"transition\"]);\n    target = __assign(__assign({}, target), transitionEnd);\n    for (var key in target) {\n        var value = resolveFinalValueInKeyframes(target[key]);\n        setMotionValue(visualElement, key, value);\n    }\n}\nfunction setVariants(visualElement, variantLabels) {\n    var reversedLabels = __spreadArray([], __read(variantLabels), false).reverse();\n    reversedLabels.forEach(function (key) {\n        var _a;\n        var variant = visualElement.getVariant(key);\n        variant && setTarget(visualElement, variant);\n        (_a = visualElement.variantChildren) === null || _a === void 0 ? void 0 : _a.forEach(function (child) {\n            setVariants(child, variantLabels);\n        });\n    });\n}\nfunction setValues(visualElement, definition) {\n    if (Array.isArray(definition)) {\n        return setVariants(visualElement, definition);\n    }\n    else if (typeof definition === \"string\") {\n        return setVariants(visualElement, [definition]);\n    }\n    else {\n        setTarget(visualElement, definition);\n    }\n}\nfunction checkTargetForNewValues(visualElement, target, origin) {\n    var _a, _b, _c;\n    var _d;\n    var newValueKeys = Object.keys(target).filter(function (key) { return !visualElement.hasValue(key); });\n    var numNewValues = newValueKeys.length;\n    if (!numNewValues)\n        return;\n    for (var i = 0; i < numNewValues; i++) {\n        var key = newValueKeys[i];\n        var targetValue = target[key];\n        var value = null;\n        /**\n         * If the target is a series of keyframes, we can use the first value\n         * in the array. If this first value is null, we'll still need to read from the DOM.\n         */\n        if (Array.isArray(targetValue)) {\n            value = targetValue[0];\n        }\n        /**\n         * If the target isn't keyframes, or the first keyframe was null, we need to\n         * first check if an origin value was explicitly defined in the transition as \"from\",\n         * if not read the value from the DOM. As an absolute fallback, take the defined target value.\n         */\n        if (value === null) {\n            value = (_b = (_a = origin[key]) !== null && _a !== void 0 ? _a : visualElement.readValue(key)) !== null && _b !== void 0 ? _b : target[key];\n        }\n        /**\n         * If value is still undefined or null, ignore it. Preferably this would throw,\n         * but this was causing issues in Framer.\n         */\n        if (value === undefined || value === null)\n            continue;\n        if (typeof value === \"string\" &&\n            (isNumericalString(value) || isZeroValueString(value))) {\n            // If this is a number read as a string, ie \"0\" or \"200\", convert it to a number\n            value = parseFloat(value);\n        }\n        else if (!findValueType(value) && complex.test(targetValue)) {\n            value = getAnimatableNone(key, targetValue);\n        }\n        visualElement.addValue(key, motionValue(value));\n        (_c = (_d = origin)[key]) !== null && _c !== void 0 ? _c : (_d[key] = value);\n        visualElement.setBaseTarget(key, value);\n    }\n}\nfunction getOriginFromTransition(key, transition) {\n    if (!transition)\n        return;\n    var valueTransition = transition[key] || transition[\"default\"] || transition;\n    return valueTransition.from;\n}\nfunction getOrigin(target, transition, visualElement) {\n    var _a, _b;\n    var origin = {};\n    for (var key in target) {\n        origin[key] =\n            (_a = getOriginFromTransition(key, transition)) !== null && _a !== void 0 ? _a : (_b = visualElement.getValue(key)) === null || _b === void 0 ? void 0 : _b.get();\n    }\n    return origin;\n}\n\nexport { checkTargetForNewValues, getOrigin, getOriginFromTransition, setTarget, setValues };\n","import { __read, __rest, __assign } from 'tslib';\nimport { startAnimation } from '../../animation/utils/transitions.mjs';\nimport { setTarget } from './setters.mjs';\nimport { resolveVariant } from './variants.mjs';\n\n/**\n * @internal\n */\nfunction animateVisualElement(visualElement, definition, options) {\n    if (options === void 0) { options = {}; }\n    visualElement.notifyAnimationStart(definition);\n    var animation;\n    if (Array.isArray(definition)) {\n        var animations = definition.map(function (variant) {\n            return animateVariant(visualElement, variant, options);\n        });\n        animation = Promise.all(animations);\n    }\n    else if (typeof definition === \"string\") {\n        animation = animateVariant(visualElement, definition, options);\n    }\n    else {\n        var resolvedDefinition = typeof definition === \"function\"\n            ? resolveVariant(visualElement, definition, options.custom)\n            : definition;\n        animation = animateTarget(visualElement, resolvedDefinition, options);\n    }\n    return animation.then(function () {\n        return visualElement.notifyAnimationComplete(definition);\n    });\n}\nfunction animateVariant(visualElement, variant, options) {\n    var _a;\n    if (options === void 0) { options = {}; }\n    var resolved = resolveVariant(visualElement, variant, options.custom);\n    var _b = (resolved || {}).transition, transition = _b === void 0 ? visualElement.getDefaultTransition() || {} : _b;\n    if (options.transitionOverride) {\n        transition = options.transitionOverride;\n    }\n    /**\n     * If we have a variant, create a callback that runs it as an animation.\n     * Otherwise, we resolve a Promise immediately for a composable no-op.\n     */\n    var getAnimation = resolved\n        ? function () { return animateTarget(visualElement, resolved, options); }\n        : function () { return Promise.resolve(); };\n    /**\n     * If we have children, create a callback that runs all their animations.\n     * Otherwise, we resolve a Promise immediately for a composable no-op.\n     */\n    var getChildAnimations = ((_a = visualElement.variantChildren) === null || _a === void 0 ? void 0 : _a.size)\n        ? function (forwardDelay) {\n            if (forwardDelay === void 0) { forwardDelay = 0; }\n            var _a = transition.delayChildren, delayChildren = _a === void 0 ? 0 : _a, staggerChildren = transition.staggerChildren, staggerDirection = transition.staggerDirection;\n            return animateChildren(visualElement, variant, delayChildren + forwardDelay, staggerChildren, staggerDirection, options);\n        }\n        : function () { return Promise.resolve(); };\n    /**\n     * If the transition explicitly defines a \"when\" option, we need to resolve either\n     * this animation or all children animations before playing the other.\n     */\n    var when = transition.when;\n    if (when) {\n        var _c = __read(when === \"beforeChildren\"\n            ? [getAnimation, getChildAnimations]\n            : [getChildAnimations, getAnimation], 2), first = _c[0], last = _c[1];\n        return first().then(last);\n    }\n    else {\n        return Promise.all([getAnimation(), getChildAnimations(options.delay)]);\n    }\n}\n/**\n * @internal\n */\nfunction animateTarget(visualElement, definition, _a) {\n    var _b;\n    var _c = _a === void 0 ? {} : _a, _d = _c.delay, delay = _d === void 0 ? 0 : _d, transitionOverride = _c.transitionOverride, type = _c.type;\n    var _e = visualElement.makeTargetAnimatable(definition), _f = _e.transition, transition = _f === void 0 ? visualElement.getDefaultTransition() : _f, transitionEnd = _e.transitionEnd, target = __rest(_e, [\"transition\", \"transitionEnd\"]);\n    if (transitionOverride)\n        transition = transitionOverride;\n    var animations = [];\n    var animationTypeState = type && ((_b = visualElement.animationState) === null || _b === void 0 ? void 0 : _b.getState()[type]);\n    for (var key in target) {\n        var value = visualElement.getValue(key);\n        var valueTarget = target[key];\n        if (!value ||\n            valueTarget === undefined ||\n            (animationTypeState &&\n                shouldBlockAnimation(animationTypeState, key))) {\n            continue;\n        }\n        var animation = startAnimation(key, value, valueTarget, __assign({ delay: delay }, transition));\n        animations.push(animation);\n    }\n    return Promise.all(animations).then(function () {\n        transitionEnd && setTarget(visualElement, transitionEnd);\n    });\n}\nfunction animateChildren(visualElement, variant, delayChildren, staggerChildren, staggerDirection, options) {\n    if (delayChildren === void 0) { delayChildren = 0; }\n    if (staggerChildren === void 0) { staggerChildren = 0; }\n    if (staggerDirection === void 0) { staggerDirection = 1; }\n    var animations = [];\n    var maxStaggerDuration = (visualElement.variantChildren.size - 1) * staggerChildren;\n    var generateStaggerDuration = staggerDirection === 1\n        ? function (i) {\n            if (i === void 0) { i = 0; }\n            return i * staggerChildren;\n        }\n        : function (i) {\n            if (i === void 0) { i = 0; }\n            return maxStaggerDuration - i * staggerChildren;\n        };\n    Array.from(visualElement.variantChildren)\n        .sort(sortByTreeOrder)\n        .forEach(function (child, i) {\n        animations.push(animateVariant(child, variant, __assign(__assign({}, options), { delay: delayChildren + generateStaggerDuration(i) })).then(function () { return child.notifyAnimationComplete(variant); }));\n    });\n    return Promise.all(animations);\n}\nfunction stopAnimation(visualElement) {\n    visualElement.forEachValue(function (value) { return value.stop(); });\n}\nfunction sortByTreeOrder(a, b) {\n    return a.sortNodePosition(b);\n}\n/**\n * Decide whether we should block this animation. Previously, we achieved this\n * just by checking whether the key was listed in protectedKeys, but this\n * posed problems if an animation was triggered by afterChildren and protectedKeys\n * had been set to true in the meantime.\n */\nfunction shouldBlockAnimation(_a, key) {\n    var protectedKeys = _a.protectedKeys, needsAnimating = _a.needsAnimating;\n    var shouldBlock = protectedKeys.hasOwnProperty(key) && needsAnimating[key] !== true;\n    needsAnimating[key] = false;\n    return shouldBlock;\n}\n\nexport { animateVisualElement, sortByTreeOrder, stopAnimation };\n","import { __spreadArray, __read, __assign, __rest } from 'tslib';\nimport { isAnimationControls } from '../../animation/utils/is-animation-controls.mjs';\nimport { isKeyframesTarget } from '../../animation/utils/is-keyframes-target.mjs';\nimport { shallowCompare } from '../../utils/shallow-compare.mjs';\nimport { animateVisualElement } from './animation.mjs';\nimport { AnimationType } from './types.mjs';\nimport { isVariantLabels, resolveVariant, isVariantLabel } from './variants.mjs';\n\nvar variantPriorityOrder = [\n    AnimationType.Animate,\n    AnimationType.InView,\n    AnimationType.Focus,\n    AnimationType.Hover,\n    AnimationType.Tap,\n    AnimationType.Drag,\n    AnimationType.Exit,\n];\nvar reversePriorityOrder = __spreadArray([], __read(variantPriorityOrder), false).reverse();\nvar numAnimationTypes = variantPriorityOrder.length;\nfunction animateList(visualElement) {\n    return function (animations) {\n        return Promise.all(animations.map(function (_a) {\n            var animation = _a.animation, options = _a.options;\n            return animateVisualElement(visualElement, animation, options);\n        }));\n    };\n}\nfunction createAnimationState(visualElement) {\n    var animate = animateList(visualElement);\n    var state = createState();\n    var allAnimatedKeys = {};\n    var isInitialRender = true;\n    /**\n     * This function will be used to reduce the animation definitions for\n     * each active animation type into an object of resolved values for it.\n     */\n    var buildResolvedTypeValues = function (acc, definition) {\n        var resolved = resolveVariant(visualElement, definition);\n        if (resolved) {\n            resolved.transition; var transitionEnd = resolved.transitionEnd, target = __rest(resolved, [\"transition\", \"transitionEnd\"]);\n            acc = __assign(__assign(__assign({}, acc), target), transitionEnd);\n        }\n        return acc;\n    };\n    function isAnimated(key) {\n        return allAnimatedKeys[key] !== undefined;\n    }\n    /**\n     * This just allows us to inject mocked animation functions\n     * @internal\n     */\n    function setAnimateFunction(makeAnimator) {\n        animate = makeAnimator(visualElement);\n    }\n    /**\n     * When we receive new props, we need to:\n     * 1. Create a list of protected keys for each type. This is a directory of\n     *    value keys that are currently being \"handled\" by types of a higher priority\n     *    so that whenever an animation is played of a given type, these values are\n     *    protected from being animated.\n     * 2. Determine if an animation type needs animating.\n     * 3. Determine if any values have been removed from a type and figure out\n     *    what to animate those to.\n     */\n    function animateChanges(options, changedActiveType) {\n        var _a;\n        var props = visualElement.getProps();\n        var context = visualElement.getVariantContext(true) || {};\n        /**\n         * A list of animations that we'll build into as we iterate through the animation\n         * types. This will get executed at the end of the function.\n         */\n        var animations = [];\n        /**\n         * Keep track of which values have been removed. Then, as we hit lower priority\n         * animation types, we can check if they contain removed values and animate to that.\n         */\n        var removedKeys = new Set();\n        /**\n         * A dictionary of all encountered keys. This is an object to let us build into and\n         * copy it without iteration. Each time we hit an animation type we set its protected\n         * keys - the keys its not allowed to animate - to the latest version of this object.\n         */\n        var encounteredKeys = {};\n        /**\n         * If a variant has been removed at a given index, and this component is controlling\n         * variant animations, we want to ensure lower-priority variants are forced to animate.\n         */\n        var removedVariantIndex = Infinity;\n        var _loop_1 = function (i) {\n            var type = reversePriorityOrder[i];\n            var typeState = state[type];\n            var prop = (_a = props[type]) !== null && _a !== void 0 ? _a : context[type];\n            var propIsVariant = isVariantLabel(prop);\n            /**\n             * If this type has *just* changed isActive status, set activeDelta\n             * to that status. Otherwise set to null.\n             */\n            var activeDelta = type === changedActiveType ? typeState.isActive : null;\n            if (activeDelta === false)\n                removedVariantIndex = i;\n            /**\n             * If this prop is an inherited variant, rather than been set directly on the\n             * component itself, we want to make sure we allow the parent to trigger animations.\n             *\n             * TODO: Can probably change this to a !isControllingVariants check\n             */\n            var isInherited = prop === context[type] && prop !== props[type] && propIsVariant;\n            /**\n             *\n             */\n            if (isInherited &&\n                isInitialRender &&\n                visualElement.manuallyAnimateOnMount) {\n                isInherited = false;\n            }\n            /**\n             * Set all encountered keys so far as the protected keys for this type. This will\n             * be any key that has been animated or otherwise handled by active, higher-priortiy types.\n             */\n            typeState.protectedKeys = __assign({}, encounteredKeys);\n            // Check if we can skip analysing this prop early\n            if (\n            // If it isn't active and hasn't *just* been set as inactive\n            (!typeState.isActive && activeDelta === null) ||\n                // If we didn't and don't have any defined prop for this animation type\n                (!prop && !typeState.prevProp) ||\n                // Or if the prop doesn't define an animation\n                isAnimationControls(prop) ||\n                typeof prop === \"boolean\") {\n                return \"continue\";\n            }\n            /**\n             * As we go look through the values defined on this type, if we detect\n             * a changed value or a value that was removed in a higher priority, we set\n             * this to true and add this prop to the animation list.\n             */\n            var variantDidChange = checkVariantsDidChange(typeState.prevProp, prop);\n            var shouldAnimateType = variantDidChange ||\n                // If we're making this variant active, we want to always make it active\n                (type === changedActiveType &&\n                    typeState.isActive &&\n                    !isInherited &&\n                    propIsVariant) ||\n                // If we removed a higher-priority variant (i is in reverse order)\n                (i > removedVariantIndex && propIsVariant);\n            /**\n             * As animations can be set as variant lists, variants or target objects, we\n             * coerce everything to an array if it isn't one already\n             */\n            var definitionList = Array.isArray(prop) ? prop : [prop];\n            /**\n             * Build an object of all the resolved values. We'll use this in the subsequent\n             * animateChanges calls to determine whether a value has changed.\n             */\n            var resolvedValues = definitionList.reduce(buildResolvedTypeValues, {});\n            if (activeDelta === false)\n                resolvedValues = {};\n            /**\n             * Now we need to loop through all the keys in the prev prop and this prop,\n             * and decide:\n             * 1. If the value has changed, and needs animating\n             * 2. If it has been removed, and needs adding to the removedKeys set\n             * 3. If it has been removed in a higher priority type and needs animating\n             * 4. If it hasn't been removed in a higher priority but hasn't changed, and\n             *    needs adding to the type's protectedKeys list.\n             */\n            var _b = typeState.prevResolvedValues, prevResolvedValues = _b === void 0 ? {} : _b;\n            var allKeys = __assign(__assign({}, prevResolvedValues), resolvedValues);\n            var markToAnimate = function (key) {\n                shouldAnimateType = true;\n                removedKeys.delete(key);\n                typeState.needsAnimating[key] = true;\n            };\n            for (var key in allKeys) {\n                var next = resolvedValues[key];\n                var prev = prevResolvedValues[key];\n                // If we've already handled this we can just skip ahead\n                if (encounteredKeys.hasOwnProperty(key))\n                    continue;\n                /**\n                 * If the value has changed, we probably want to animate it.\n                 */\n                if (next !== prev) {\n                    /**\n                     * If both values are keyframes, we need to shallow compare them to\n                     * detect whether any value has changed. If it has, we animate it.\n                     */\n                    if (isKeyframesTarget(next) && isKeyframesTarget(prev)) {\n                        if (!shallowCompare(next, prev) || variantDidChange) {\n                            markToAnimate(key);\n                        }\n                        else {\n                            /**\n                             * If it hasn't changed, we want to ensure it doesn't animate by\n                             * adding it to the list of protected keys.\n                             */\n                            typeState.protectedKeys[key] = true;\n                        }\n                    }\n                    else if (next !== undefined) {\n                        // If next is defined and doesn't equal prev, it needs animating\n                        markToAnimate(key);\n                    }\n                    else {\n                        // If it's undefined, it's been removed.\n                        removedKeys.add(key);\n                    }\n                }\n                else if (next !== undefined && removedKeys.has(key)) {\n                    /**\n                     * If next hasn't changed and it isn't undefined, we want to check if it's\n                     * been removed by a higher priority\n                     */\n                    markToAnimate(key);\n                }\n                else {\n                    /**\n                     * If it hasn't changed, we add it to the list of protected values\n                     * to ensure it doesn't get animated.\n                     */\n                    typeState.protectedKeys[key] = true;\n                }\n            }\n            /**\n             * Update the typeState so next time animateChanges is called we can compare the\n             * latest prop and resolvedValues to these.\n             */\n            typeState.prevProp = prop;\n            typeState.prevResolvedValues = resolvedValues;\n            /**\n             *\n             */\n            if (typeState.isActive) {\n                encounteredKeys = __assign(__assign({}, encounteredKeys), resolvedValues);\n            }\n            if (isInitialRender && visualElement.blockInitialAnimation) {\n                shouldAnimateType = false;\n            }\n            /**\n             * If this is an inherited prop we want to hard-block animations\n             * TODO: Test as this should probably still handle animations triggered\n             * by removed values?\n             */\n            if (shouldAnimateType && !isInherited) {\n                animations.push.apply(animations, __spreadArray([], __read(definitionList.map(function (animation) { return ({\n                    animation: animation,\n                    options: __assign({ type: type }, options),\n                }); })), false));\n            }\n        };\n        /**\n         * Iterate through all animation types in reverse priority order. For each, we want to\n         * detect which values it's handling and whether or not they've changed (and therefore\n         * need to be animated). If any values have been removed, we want to detect those in\n         * lower priority props and flag for animation.\n         */\n        for (var i = 0; i < numAnimationTypes; i++) {\n            _loop_1(i);\n        }\n        allAnimatedKeys = __assign({}, encounteredKeys);\n        /**\n         * If there are some removed value that haven't been dealt with,\n         * we need to create a new animation that falls back either to the value\n         * defined in the style prop, or the last read value.\n         */\n        if (removedKeys.size) {\n            var fallbackAnimation_1 = {};\n            removedKeys.forEach(function (key) {\n                var fallbackTarget = visualElement.getBaseTarget(key);\n                if (fallbackTarget !== undefined) {\n                    fallbackAnimation_1[key] = fallbackTarget;\n                }\n            });\n            animations.push({ animation: fallbackAnimation_1 });\n        }\n        var shouldAnimate = Boolean(animations.length);\n        if (isInitialRender &&\n            props.initial === false &&\n            !visualElement.manuallyAnimateOnMount) {\n            shouldAnimate = false;\n        }\n        isInitialRender = false;\n        return shouldAnimate ? animate(animations) : Promise.resolve();\n    }\n    /**\n     * Change whether a certain animation type is active.\n     */\n    function setActive(type, isActive, options) {\n        var _a;\n        // If the active state hasn't changed, we can safely do nothing here\n        if (state[type].isActive === isActive)\n            return Promise.resolve();\n        // Propagate active change to children\n        (_a = visualElement.variantChildren) === null || _a === void 0 ? void 0 : _a.forEach(function (child) { var _a; return (_a = child.animationState) === null || _a === void 0 ? void 0 : _a.setActive(type, isActive); });\n        state[type].isActive = isActive;\n        return animateChanges(options, type);\n    }\n    return {\n        isAnimated: isAnimated,\n        animateChanges: animateChanges,\n        setActive: setActive,\n        setAnimateFunction: setAnimateFunction,\n        getState: function () { return state; },\n    };\n}\nfunction checkVariantsDidChange(prev, next) {\n    if (typeof next === \"string\") {\n        return next !== prev;\n    }\n    else if (isVariantLabels(next)) {\n        return !shallowCompare(next, prev);\n    }\n    return false;\n}\nfunction createTypeState(isActive) {\n    if (isActive === void 0) { isActive = false; }\n    return {\n        isActive: isActive,\n        protectedKeys: {},\n        needsAnimating: {},\n        prevResolvedValues: {},\n    };\n}\nfunction createState() {\n    var _a;\n    return _a = {},\n        _a[AnimationType.Animate] = createTypeState(true),\n        _a[AnimationType.InView] = createTypeState(),\n        _a[AnimationType.Hover] = createTypeState(),\n        _a[AnimationType.Tap] = createTypeState(),\n        _a[AnimationType.Drag] = createTypeState(),\n        _a[AnimationType.Focus] = createTypeState(),\n        _a[AnimationType.Exit] = createTypeState(),\n        _a;\n}\n\nexport { checkVariantsDidChange, createAnimationState, variantPriorityOrder };\n","import { __read } from 'tslib';\nimport { useEffect, useContext } from 'react';\nimport { isAnimationControls } from '../../animation/utils/is-animation-controls.mjs';\nimport { usePresence } from '../../components/AnimatePresence/use-presence.mjs';\nimport { PresenceContext } from '../../context/PresenceContext.mjs';\nimport { createAnimationState } from '../../render/utils/animation-state.mjs';\nimport { AnimationType } from '../../render/utils/types.mjs';\nimport { makeRenderlessComponent } from '../utils/make-renderless-component.mjs';\n\nvar animations = {\n    animation: makeRenderlessComponent(function (_a) {\n        var visualElement = _a.visualElement, animate = _a.animate;\n        /**\n         * We dynamically generate the AnimationState manager as it contains a reference\n         * to the underlying animation library. We only want to load that if we load this,\n         * so people can optionally code split it out using the `m` component.\n         */\n        visualElement.animationState || (visualElement.animationState = createAnimationState(visualElement));\n        /**\n         * Subscribe any provided AnimationControls to the component's VisualElement\n         */\n        if (isAnimationControls(animate)) {\n            useEffect(function () { return animate.subscribe(visualElement); }, [animate]);\n        }\n    }),\n    exit: makeRenderlessComponent(function (props) {\n        var custom = props.custom, visualElement = props.visualElement;\n        var _a = __read(usePresence(), 2), isPresent = _a[0], safeToRemove = _a[1];\n        var presenceContext = useContext(PresenceContext);\n        useEffect(function () {\n            var _a, _b;\n            visualElement.isPresent = isPresent;\n            var animation = (_a = visualElement.animationState) === null || _a === void 0 ? void 0 : _a.setActive(AnimationType.Exit, !isPresent, { custom: (_b = presenceContext === null || presenceContext === void 0 ? void 0 : presenceContext.custom) !== null && _b !== void 0 ? _b : custom });\n            !isPresent && (animation === null || animation === void 0 ? void 0 : animation.then(safeToRemove));\n        }, [isPresent]);\n    }),\n};\n\nexport { animations };\n","/**\n * Bounding boxes tend to be defined as top, left, right, bottom. For various operations\n * it's easier to consider each axis individually. This function returns a bounding box\n * as a map of single-axis min/max values.\n */\nfunction convertBoundingBoxToBox(_a) {\n    var top = _a.top, left = _a.left, right = _a.right, bottom = _a.bottom;\n    return {\n        x: { min: left, max: right },\n        y: { min: top, max: bottom },\n    };\n}\nfunction convertBoxToBoundingBox(_a) {\n    var x = _a.x, y = _a.y;\n    return { top: y.min, right: x.max, bottom: y.max, left: x.min };\n}\n/**\n * Applies a TransformPoint function to a bounding box. TransformPoint is usually a function\n * provided by Framer to allow measured points to be corrected for device scaling. This is used\n * when measuring DOM elements and DOM event points.\n */\nfunction transformBoxPoints(point, transformPoint) {\n    if (!transformPoint)\n        return point;\n    var topLeft = transformPoint({ x: point.left, y: point.top });\n    var bottomRight = transformPoint({ x: point.right, y: point.bottom });\n    return {\n        top: topLeft.y,\n        left: topLeft.x,\n        bottom: bottomRight.y,\n        right: bottomRight.x,\n    };\n}\n\nexport { convertBoundingBoxToBox, convertBoxToBoundingBox, transformBoxPoints };\n","import { convertBoundingBoxToBox, transformBoxPoints } from '../geometry/conversion.mjs';\nimport { translateAxis } from '../geometry/delta-apply.mjs';\n\nfunction measureViewportBox(instance, transformPoint) {\n    return convertBoundingBoxToBox(transformBoxPoints(instance.getBoundingClientRect(), transformPoint));\n}\nfunction measurePageBox(element, rootProjectionNode, transformPagePoint) {\n    var viewportBox = measureViewportBox(element, transformPagePoint);\n    var scroll = rootProjectionNode.scroll;\n    if (scroll) {\n        translateAxis(viewportBox.x, scroll.x);\n        translateAxis(viewportBox.y, scroll.y);\n    }\n    return viewportBox;\n}\n\nexport { measurePageBox, measureViewportBox };\n","import { __spreadArray, __read } from 'tslib';\nimport { SubscriptionManager } from '../../utils/subscription-manager.mjs';\n\nvar names = [\n    \"LayoutMeasure\",\n    \"BeforeLayoutMeasure\",\n    \"LayoutUpdate\",\n    \"ViewportBoxUpdate\",\n    \"Update\",\n    \"Render\",\n    \"AnimationComplete\",\n    \"LayoutAnimationComplete\",\n    \"AnimationStart\",\n    \"SetAxisTarget\",\n    \"Unmount\",\n];\nfunction createLifecycles() {\n    var managers = names.map(function () { return new SubscriptionManager(); });\n    var propSubscriptions = {};\n    var lifecycles = {\n        clearAllListeners: function () { return managers.forEach(function (manager) { return manager.clear(); }); },\n        updatePropListeners: function (props) {\n            names.forEach(function (name) {\n                var _a;\n                var on = \"on\" + name;\n                var propListener = props[on];\n                // Unsubscribe existing subscription\n                (_a = propSubscriptions[name]) === null || _a === void 0 ? void 0 : _a.call(propSubscriptions);\n                // Add new subscription\n                if (propListener) {\n                    propSubscriptions[name] = lifecycles[on](propListener);\n                }\n            });\n        },\n    };\n    managers.forEach(function (manager, i) {\n        lifecycles[\"on\" + names[i]] = function (handler) { return manager.add(handler); };\n        lifecycles[\"notify\" + names[i]] = function () {\n            var args = [];\n            for (var _i = 0; _i < arguments.length; _i++) {\n                args[_i] = arguments[_i];\n            }\n            manager.notify.apply(manager, __spreadArray([], __read(args), false));\n        };\n    });\n    return lifecycles;\n}\n\nexport { createLifecycles };\n","import { motionValue } from '../../value/index.mjs';\nimport { isMotionValue } from '../../value/utils/is-motion-value.mjs';\n\nfunction updateMotionValuesFromProps(element, next, prev) {\n    var _a;\n    for (var key in next) {\n        var nextValue = next[key];\n        var prevValue = prev[key];\n        if (isMotionValue(nextValue)) {\n            /**\n             * If this is a motion value found in props or style, we want to add it\n             * to our visual element's motion value map.\n             */\n            element.addValue(key, nextValue);\n        }\n        else if (isMotionValue(prevValue)) {\n            /**\n             * If we're swapping to a new motion value, create a new motion value\n             * from that\n             */\n            element.addValue(key, motionValue(nextValue));\n        }\n        else if (prevValue !== nextValue) {\n            /**\n             * If this is a flat value that has changed, update the motion value\n             * or create one if it doesn't exist. We only want to do this if we're\n             * not handling the value with our animation state.\n             */\n            if (element.hasValue(key)) {\n                var existingValue = element.getValue(key);\n                // TODO: Only update values that aren't being animated or even looked at\n                !existingValue.hasAnimated && existingValue.set(nextValue);\n            }\n            else {\n                element.addValue(key, motionValue((_a = element.getStaticValue(key)) !== null && _a !== void 0 ? _a : nextValue));\n            }\n        }\n    }\n    // Handle removed values\n    for (var key in prev) {\n        if (next[key] === undefined)\n            element.removeValue(key);\n    }\n    return next;\n}\n\nexport { updateMotionValuesFromProps };\n","import { __assign, __spreadArray, __read } from 'tslib';\nimport sync, { cancelSync } from 'framesync';\nimport { motionValue } from '../value/index.mjs';\nimport { isMotionValue } from '../value/utils/is-motion-value.mjs';\nimport { variantPriorityOrder } from './utils/animation-state.mjs';\nimport { createLifecycles } from './utils/lifecycles.mjs';\nimport { updateMotionValuesFromProps } from './utils/motion-values.mjs';\nimport { checkIfControllingVariants, checkIfVariantNode, isVariantLabel } from './utils/variants.mjs';\n\nvar visualElement = function (_a) {\n    var _b = _a.treeType, treeType = _b === void 0 ? \"\" : _b, build = _a.build, getBaseTarget = _a.getBaseTarget, makeTargetAnimatable = _a.makeTargetAnimatable, measureViewportBox = _a.measureViewportBox, renderInstance = _a.render, readValueFromInstance = _a.readValueFromInstance, removeValueFromRenderState = _a.removeValueFromRenderState, sortNodePosition = _a.sortNodePosition, scrapeMotionValuesFromProps = _a.scrapeMotionValuesFromProps;\n    return function (_a, options) {\n        var parent = _a.parent, props = _a.props, presenceId = _a.presenceId, blockInitialAnimation = _a.blockInitialAnimation, visualState = _a.visualState;\n        if (options === void 0) { options = {}; }\n        var isMounted = false;\n        var latestValues = visualState.latestValues, renderState = visualState.renderState;\n        /**\n         * The instance of the render-specific node that will be hydrated by the\n         * exposed React ref. So for example, this visual element can host a\n         * HTMLElement, plain object, or Three.js object. The functions provided\n         * in VisualElementConfig allow us to interface with this instance.\n         */\n        var instance;\n        /**\n         * Manages the subscriptions for a visual element's lifecycle, for instance\n         * onRender\n         */\n        var lifecycles = createLifecycles();\n        /**\n         * A map of all motion values attached to this visual element. Motion\n         * values are source of truth for any given animated value. A motion\n         * value might be provided externally by the component via props.\n         */\n        var values = new Map();\n        /**\n         * A map of every subscription that binds the provided or generated\n         * motion values onChange listeners to this visual element.\n         */\n        var valueSubscriptions = new Map();\n        /**\n         * A reference to the previously-provided motion values as returned\n         * from scrapeMotionValuesFromProps. We use the keys in here to determine\n         * if any motion values need to be removed after props are updated.\n         */\n        var prevMotionValues = {};\n        /**\n         * When values are removed from all animation props we need to search\n         * for a fallback value to animate to. These values are tracked in baseTarget.\n         */\n        var baseTarget = __assign({}, latestValues);\n        // Internal methods ========================\n        /**\n         * On mount, this will be hydrated with a callback to disconnect\n         * this visual element from its parent on unmount.\n         */\n        var removeFromVariantTree;\n        /**\n         * Render the element with the latest styles outside of the React\n         * render lifecycle\n         */\n        function render() {\n            if (!instance || !isMounted)\n                return;\n            triggerBuild();\n            renderInstance(instance, renderState, props.style, element.projection);\n        }\n        function triggerBuild() {\n            build(element, renderState, latestValues, options, props);\n        }\n        function update() {\n            lifecycles.notifyUpdate(latestValues);\n        }\n        /**\n         *\n         */\n        function bindToMotionValue(key, value) {\n            var removeOnChange = value.onChange(function (latestValue) {\n                latestValues[key] = latestValue;\n                props.onUpdate && sync.update(update, false, true);\n            });\n            var removeOnRenderRequest = value.onRenderRequest(element.scheduleRender);\n            valueSubscriptions.set(key, function () {\n                removeOnChange();\n                removeOnRenderRequest();\n            });\n        }\n        /**\n         * Any motion values that are provided to the element when created\n         * aren't yet bound to the element, as this would technically be impure.\n         * However, we iterate through the motion values and set them to the\n         * initial values for this component.\n         *\n         * TODO: This is impure and we should look at changing this to run on mount.\n         * Doing so will break some tests but this isn't neccessarily a breaking change,\n         * more a reflection of the test.\n         */\n        var initialMotionValues = scrapeMotionValuesFromProps(props);\n        for (var key in initialMotionValues) {\n            var value = initialMotionValues[key];\n            if (latestValues[key] !== undefined && isMotionValue(value)) {\n                value.set(latestValues[key], false);\n            }\n        }\n        /**\n         * Determine what role this visual element should take in the variant tree.\n         */\n        var isControllingVariants = checkIfControllingVariants(props);\n        var isVariantNode = checkIfVariantNode(props);\n        var element = __assign(__assign({ treeType: treeType, \n            /**\n             * This is a mirror of the internal instance prop, which keeps\n             * VisualElement type-compatible with React's RefObject.\n             */\n            current: null, \n            /**\n             * The depth of this visual element within the visual element tree.\n             */\n            depth: parent ? parent.depth + 1 : 0, parent: parent, children: new Set(), \n            /**\n             *\n             */\n            presenceId: presenceId, \n            /**\n             * If this component is part of the variant tree, it should track\n             * any children that are also part of the tree. This is essentially\n             * a shadow tree to simplify logic around how to stagger over children.\n             */\n            variantChildren: isVariantNode ? new Set() : undefined, \n            /**\n             * Whether this instance is visible. This can be changed imperatively\n             * by the projection tree, is analogous to CSS's visibility in that\n             * hidden elements should take up layout, and needs enacting by the configured\n             * render function.\n             */\n            isVisible: undefined, \n            /**\n             * Normally, if a component is controlled by a parent's variants, it can\n             * rely on that ancestor to trigger animations further down the tree.\n             * However, if a component is created after its parent is mounted, the parent\n             * won't trigger that mount animation so the child needs to.\n             *\n             * TODO: This might be better replaced with a method isParentMounted\n             */\n            manuallyAnimateOnMount: Boolean(parent === null || parent === void 0 ? void 0 : parent.isMounted()), \n            /**\n             * This can be set by AnimatePresence to force components that mount\n             * at the same time as it to mount as if they have initial={false} set.\n             */\n            blockInitialAnimation: blockInitialAnimation, \n            /**\n             * Determine whether this component has mounted yet. This is mostly used\n             * by variant children to determine whether they need to trigger their\n             * own animations on mount.\n             */\n            isMounted: function () { return Boolean(instance); }, mount: function (newInstance) {\n                isMounted = true;\n                instance = element.current = newInstance;\n                if (element.projection) {\n                    element.projection.mount(newInstance);\n                }\n                if (isVariantNode && parent && !isControllingVariants) {\n                    removeFromVariantTree = parent === null || parent === void 0 ? void 0 : parent.addVariantChild(element);\n                }\n                parent === null || parent === void 0 ? void 0 : parent.children.add(element);\n                element.setProps(props);\n            }, \n            /**\n             *\n             */\n            unmount: function () {\n                var _a;\n                (_a = element.projection) === null || _a === void 0 ? void 0 : _a.unmount();\n                cancelSync.update(update);\n                cancelSync.render(render);\n                valueSubscriptions.forEach(function (remove) { return remove(); });\n                removeFromVariantTree === null || removeFromVariantTree === void 0 ? void 0 : removeFromVariantTree();\n                parent === null || parent === void 0 ? void 0 : parent.children.delete(element);\n                lifecycles.clearAllListeners();\n                instance = undefined;\n                isMounted = false;\n            }, \n            /**\n             * Add a child visual element to our set of children.\n             */\n            addVariantChild: function (child) {\n                var _a;\n                var closestVariantNode = element.getClosestVariantNode();\n                if (closestVariantNode) {\n                    (_a = closestVariantNode.variantChildren) === null || _a === void 0 ? void 0 : _a.add(child);\n                    return function () {\n                        return closestVariantNode.variantChildren.delete(child);\n                    };\n                }\n            }, sortNodePosition: function (other) {\n                /**\n                 * If these nodes aren't even of the same type we can't compare their depth.\n                 */\n                if (!sortNodePosition || treeType !== other.treeType)\n                    return 0;\n                return sortNodePosition(element.getInstance(), other.getInstance());\n            }, \n            /**\n             * Returns the closest variant node in the tree starting from\n             * this visual element.\n             */\n            getClosestVariantNode: function () {\n                return isVariantNode ? element : parent === null || parent === void 0 ? void 0 : parent.getClosestVariantNode();\n            }, \n            /**\n             * Expose the latest layoutId prop.\n             */\n            getLayoutId: function () { return props.layoutId; }, \n            /**\n             * Returns the current instance.\n             */\n            getInstance: function () { return instance; }, \n            /**\n             * Get/set the latest static values.\n             */\n            getStaticValue: function (key) { return latestValues[key]; }, setStaticValue: function (key, value) { return (latestValues[key] = value); }, \n            /**\n             * Returns the latest motion value state. Currently only used to take\n             * a snapshot of the visual element - perhaps this can return the whole\n             * visual state\n             */\n            getLatestValues: function () { return latestValues; }, \n            /**\n             * Set the visiblity of the visual element. If it's changed, schedule\n             * a render to reflect these changes.\n             */\n            setVisibility: function (visibility) {\n                if (element.isVisible === visibility)\n                    return;\n                element.isVisible = visibility;\n                element.scheduleRender();\n            }, \n            /**\n             * Make a target animatable by Popmotion. For instance, if we're\n             * trying to animate width from 100px to 100vw we need to measure 100vw\n             * in pixels to determine what we really need to animate to. This is also\n             * pluggable to support Framer's custom value types like Color,\n             * and CSS variables.\n             */\n            makeTargetAnimatable: function (target, canMutate) {\n                if (canMutate === void 0) { canMutate = true; }\n                return makeTargetAnimatable(element, target, props, canMutate);\n            }, \n            /**\n             * Measure the current viewport box with or without transforms.\n             * Only measures axis-aligned boxes, rotate and skew must be manually\n             * removed with a re-render to work.\n             */\n            measureViewportBox: function () {\n                return measureViewportBox(instance, props);\n            }, \n            // Motion values ========================\n            /**\n             * Add a motion value and bind it to this visual element.\n             */\n            addValue: function (key, value) {\n                // Remove existing value if it exists\n                if (element.hasValue(key))\n                    element.removeValue(key);\n                values.set(key, value);\n                latestValues[key] = value.get();\n                bindToMotionValue(key, value);\n            }, \n            /**\n             * Remove a motion value and unbind any active subscriptions.\n             */\n            removeValue: function (key) {\n                var _a;\n                values.delete(key);\n                (_a = valueSubscriptions.get(key)) === null || _a === void 0 ? void 0 : _a();\n                valueSubscriptions.delete(key);\n                delete latestValues[key];\n                removeValueFromRenderState(key, renderState);\n            }, \n            /**\n             * Check whether we have a motion value for this key\n             */\n            hasValue: function (key) { return values.has(key); }, \n            /**\n             * Get a motion value for this key. If called with a default\n             * value, we'll create one if none exists.\n             */\n            getValue: function (key, defaultValue) {\n                var value = values.get(key);\n                if (value === undefined && defaultValue !== undefined) {\n                    value = motionValue(defaultValue);\n                    element.addValue(key, value);\n                }\n                return value;\n            }, \n            /**\n             * Iterate over our motion values.\n             */\n            forEachValue: function (callback) { return values.forEach(callback); }, \n            /**\n             * If we're trying to animate to a previously unencountered value,\n             * we need to check for it in our state and as a last resort read it\n             * directly from the instance (which might have performance implications).\n             */\n            readValue: function (key) {\n                var _a;\n                return (_a = latestValues[key]) !== null && _a !== void 0 ? _a : readValueFromInstance(instance, key, options);\n            }, \n            /**\n             * Set the base target to later animate back to. This is currently\n             * only hydrated on creation and when we first read a value.\n             */\n            setBaseTarget: function (key, value) {\n                baseTarget[key] = value;\n            }, \n            /**\n             * Find the base target for a value thats been removed from all animation\n             * props.\n             */\n            getBaseTarget: function (key) {\n                if (getBaseTarget) {\n                    var target = getBaseTarget(props, key);\n                    if (target !== undefined && !isMotionValue(target))\n                        return target;\n                }\n                return baseTarget[key];\n            } }, lifecycles), { \n            /**\n             * Build the renderer state based on the latest visual state.\n             */\n            build: function () {\n                triggerBuild();\n                return renderState;\n            }, \n            /**\n             * Schedule a render on the next animation frame.\n             */\n            scheduleRender: function () {\n                sync.render(render, false, true);\n            }, \n            /**\n             * Synchronously fire render. It's prefered that we batch renders but\n             * in many circumstances, like layout measurement, we need to run this\n             * synchronously. However in those instances other measures should be taken\n             * to batch reads/writes.\n             */\n            syncRender: render, \n            /**\n             * Update the provided props. Ensure any newly-added motion values are\n             * added to our map, old ones removed, and listeners updated.\n             */\n            setProps: function (newProps) {\n                if (newProps.transformTemplate || props.transformTemplate) {\n                    element.scheduleRender();\n                }\n                props = newProps;\n                lifecycles.updatePropListeners(newProps);\n                prevMotionValues = updateMotionValuesFromProps(element, scrapeMotionValuesFromProps(props), prevMotionValues);\n            }, getProps: function () { return props; }, \n            // Variants ==============================\n            /**\n             * Returns the variant definition with a given name.\n             */\n            getVariant: function (name) { var _a; return (_a = props.variants) === null || _a === void 0 ? void 0 : _a[name]; }, \n            /**\n             * Returns the defined default transition on this component.\n             */\n            getDefaultTransition: function () { return props.transition; }, getTransformPagePoint: function () {\n                return props.transformPagePoint;\n            }, \n            /**\n             * Used by child variant nodes to get the closest ancestor variant props.\n             */\n            getVariantContext: function (startAtParent) {\n                if (startAtParent === void 0) { startAtParent = false; }\n                if (startAtParent)\n                    return parent === null || parent === void 0 ? void 0 : parent.getVariantContext();\n                if (!isControllingVariants) {\n                    var context_1 = (parent === null || parent === void 0 ? void 0 : parent.getVariantContext()) || {};\n                    if (props.initial !== undefined) {\n                        context_1.initial = props.initial;\n                    }\n                    return context_1;\n                }\n                var context = {};\n                for (var i = 0; i < numVariantProps; i++) {\n                    var name_1 = variantProps[i];\n                    var prop = props[name_1];\n                    if (isVariantLabel(prop) || prop === false) {\n                        context[name_1] = prop;\n                    }\n                }\n                return context;\n            } });\n        return element;\n    };\n};\nvar variantProps = __spreadArray([\"initial\"], __read(variantPriorityOrder), false);\nvar numVariantProps = variantProps.length;\n\nexport { visualElement };\n","import { __rest, __assign, __read } from 'tslib';\nimport { invariant } from 'hey-listen';\n\nfunction isCSSVariable(value) {\n    return typeof value === \"string\" && value.startsWith(\"var(--\");\n}\n/**\n * Parse Framer's special CSS variable format into a CSS token and a fallback.\n *\n * ```\n * `var(--foo, #fff)` => [`--foo`, '#fff']\n * ```\n *\n * @param current\n */\nvar cssVariableRegex = /var\\((--[a-zA-Z0-9-_]+),? ?([a-zA-Z0-9 ()%#.,-]+)?\\)/;\nfunction parseCSSVariable(current) {\n    var match = cssVariableRegex.exec(current);\n    if (!match)\n        return [,];\n    var _a = __read(match, 3), token = _a[1], fallback = _a[2];\n    return [token, fallback];\n}\nvar maxDepth = 4;\nfunction getVariableValue(current, element, depth) {\n    if (depth === void 0) { depth = 1; }\n    invariant(depth <= maxDepth, \"Max CSS variable fallback depth detected in property \\\"\".concat(current, \"\\\". This may indicate a circular fallback dependency.\"));\n    var _a = __read(parseCSSVariable(current), 2), token = _a[0], fallback = _a[1];\n    // No CSS variable detected\n    if (!token)\n        return;\n    // Attempt to read this CSS variable off the element\n    var resolved = window.getComputedStyle(element).getPropertyValue(token);\n    if (resolved) {\n        return resolved.trim();\n    }\n    else if (isCSSVariable(fallback)) {\n        // The fallback might itself be a CSS variable, in which case we attempt to resolve it too.\n        return getVariableValue(fallback, element, depth + 1);\n    }\n    else {\n        return fallback;\n    }\n}\n/**\n * Resolve CSS variables from\n *\n * @internal\n */\nfunction resolveCSSVariables(visualElement, _a, transitionEnd) {\n    var _b;\n    var target = __rest(_a, []);\n    var element = visualElement.getInstance();\n    if (!(element instanceof Element))\n        return { target: target, transitionEnd: transitionEnd };\n    // If `transitionEnd` isn't `undefined`, clone it. We could clone `target` and `transitionEnd`\n    // only if they change but I think this reads clearer and this isn't a performance-critical path.\n    if (transitionEnd) {\n        transitionEnd = __assign({}, transitionEnd);\n    }\n    // Go through existing `MotionValue`s and ensure any existing CSS variables are resolved\n    visualElement.forEachValue(function (value) {\n        var current = value.get();\n        if (!isCSSVariable(current))\n            return;\n        var resolved = getVariableValue(current, element);\n        if (resolved)\n            value.set(resolved);\n    });\n    // Cycle through every target property and resolve CSS variables. Currently\n    // we only read single-var properties like `var(--foo)`, not `calc(var(--foo) + 20px)`\n    for (var key in target) {\n        var current = target[key];\n        if (!isCSSVariable(current))\n            continue;\n        var resolved = getVariableValue(current, element);\n        if (!resolved)\n            continue;\n        // Clone target if it hasn't already been\n        target[key] = resolved;\n        // If the user hasn't already set this key on `transitionEnd`, set it to the unresolved\n        // CSS variable. This will ensure that after the animation the component will reflect\n        // changes in the value of the CSS variable.\n        if (transitionEnd)\n            (_b = transitionEnd[key]) !== null && _b !== void 0 ? _b : (transitionEnd[key] = current);\n    }\n    return { target: target, transitionEnd: transitionEnd };\n}\n\nexport { cssVariableRegex, parseCSSVariable, resolveCSSVariables };\n","import { __assign, __read } from 'tslib';\nimport { number, px } from 'style-value-types';\nimport { isKeyframesTarget } from '../../../animation/utils/is-keyframes-target.mjs';\nimport { invariant } from 'hey-listen';\nimport { transformProps } from '../../html/utils/transform.mjs';\nimport { findDimensionValueType } from '../value-types/dimensions.mjs';\n\nvar positionalKeys = new Set([\n    \"width\",\n    \"height\",\n    \"top\",\n    \"left\",\n    \"right\",\n    \"bottom\",\n    \"x\",\n    \"y\",\n]);\nvar isPositionalKey = function (key) { return positionalKeys.has(key); };\nvar hasPositionalKey = function (target) {\n    return Object.keys(target).some(isPositionalKey);\n};\nvar setAndResetVelocity = function (value, to) {\n    // Looks odd but setting it twice doesn't render, it'll just\n    // set both prev and current to the latest value\n    value.set(to, false);\n    value.set(to);\n};\nvar isNumOrPxType = function (v) {\n    return v === number || v === px;\n};\nvar BoundingBoxDimension;\n(function (BoundingBoxDimension) {\n    BoundingBoxDimension[\"width\"] = \"width\";\n    BoundingBoxDimension[\"height\"] = \"height\";\n    BoundingBoxDimension[\"left\"] = \"left\";\n    BoundingBoxDimension[\"right\"] = \"right\";\n    BoundingBoxDimension[\"top\"] = \"top\";\n    BoundingBoxDimension[\"bottom\"] = \"bottom\";\n})(BoundingBoxDimension || (BoundingBoxDimension = {}));\nvar getPosFromMatrix = function (matrix, pos) {\n    return parseFloat(matrix.split(\", \")[pos]);\n};\nvar getTranslateFromMatrix = function (pos2, pos3) {\n    return function (_bbox, _a) {\n        var transform = _a.transform;\n        if (transform === \"none\" || !transform)\n            return 0;\n        var matrix3d = transform.match(/^matrix3d\\((.+)\\)$/);\n        if (matrix3d) {\n            return getPosFromMatrix(matrix3d[1], pos3);\n        }\n        else {\n            var matrix = transform.match(/^matrix\\((.+)\\)$/);\n            if (matrix) {\n                return getPosFromMatrix(matrix[1], pos2);\n            }\n            else {\n                return 0;\n            }\n        }\n    };\n};\nvar transformKeys = new Set([\"x\", \"y\", \"z\"]);\nvar nonTranslationalTransformKeys = transformProps.filter(function (key) { return !transformKeys.has(key); });\nfunction removeNonTranslationalTransform(visualElement) {\n    var removedTransforms = [];\n    nonTranslationalTransformKeys.forEach(function (key) {\n        var value = visualElement.getValue(key);\n        if (value !== undefined) {\n            removedTransforms.push([key, value.get()]);\n            value.set(key.startsWith(\"scale\") ? 1 : 0);\n        }\n    });\n    // Apply changes to element before measurement\n    if (removedTransforms.length)\n        visualElement.syncRender();\n    return removedTransforms;\n}\nvar positionalValues = {\n    // Dimensions\n    width: function (_a, _b) {\n        var x = _a.x;\n        var _c = _b.paddingLeft, paddingLeft = _c === void 0 ? \"0\" : _c, _d = _b.paddingRight, paddingRight = _d === void 0 ? \"0\" : _d;\n        return x.max - x.min - parseFloat(paddingLeft) - parseFloat(paddingRight);\n    },\n    height: function (_a, _b) {\n        var y = _a.y;\n        var _c = _b.paddingTop, paddingTop = _c === void 0 ? \"0\" : _c, _d = _b.paddingBottom, paddingBottom = _d === void 0 ? \"0\" : _d;\n        return y.max - y.min - parseFloat(paddingTop) - parseFloat(paddingBottom);\n    },\n    top: function (_bbox, _a) {\n        var top = _a.top;\n        return parseFloat(top);\n    },\n    left: function (_bbox, _a) {\n        var left = _a.left;\n        return parseFloat(left);\n    },\n    bottom: function (_a, _b) {\n        var y = _a.y;\n        var top = _b.top;\n        return parseFloat(top) + (y.max - y.min);\n    },\n    right: function (_a, _b) {\n        var x = _a.x;\n        var left = _b.left;\n        return parseFloat(left) + (x.max - x.min);\n    },\n    // Transform\n    x: getTranslateFromMatrix(4, 13),\n    y: getTranslateFromMatrix(5, 14),\n};\nvar convertChangedValueTypes = function (target, visualElement, changedKeys) {\n    var originBbox = visualElement.measureViewportBox();\n    var element = visualElement.getInstance();\n    var elementComputedStyle = getComputedStyle(element);\n    var display = elementComputedStyle.display;\n    var origin = {};\n    // If the element is currently set to display: \"none\", make it visible before\n    // measuring the target bounding box\n    if (display === \"none\") {\n        visualElement.setStaticValue(\"display\", target.display || \"block\");\n    }\n    /**\n     * Record origins before we render and update styles\n     */\n    changedKeys.forEach(function (key) {\n        origin[key] = positionalValues[key](originBbox, elementComputedStyle);\n    });\n    // Apply the latest values (as set in checkAndConvertChangedValueTypes)\n    visualElement.syncRender();\n    var targetBbox = visualElement.measureViewportBox();\n    changedKeys.forEach(function (key) {\n        // Restore styles to their **calculated computed style**, not their actual\n        // originally set style. This allows us to animate between equivalent pixel units.\n        var value = visualElement.getValue(key);\n        setAndResetVelocity(value, origin[key]);\n        target[key] = positionalValues[key](targetBbox, elementComputedStyle);\n    });\n    return target;\n};\nvar checkAndConvertChangedValueTypes = function (visualElement, target, origin, transitionEnd) {\n    if (origin === void 0) { origin = {}; }\n    if (transitionEnd === void 0) { transitionEnd = {}; }\n    target = __assign({}, target);\n    transitionEnd = __assign({}, transitionEnd);\n    var targetPositionalKeys = Object.keys(target).filter(isPositionalKey);\n    // We want to remove any transform values that could affect the element's bounding box before\n    // it's measured. We'll reapply these later.\n    var removedTransformValues = [];\n    var hasAttemptedToRemoveTransformValues = false;\n    var changedValueTypeKeys = [];\n    targetPositionalKeys.forEach(function (key) {\n        var value = visualElement.getValue(key);\n        if (!visualElement.hasValue(key))\n            return;\n        var from = origin[key];\n        var fromType = findDimensionValueType(from);\n        var to = target[key];\n        var toType;\n        // TODO: The current implementation of this basically throws an error\n        // if you try and do value conversion via keyframes. There's probably\n        // a way of doing this but the performance implications would need greater scrutiny,\n        // as it'd be doing multiple resize-remeasure operations.\n        if (isKeyframesTarget(to)) {\n            var numKeyframes = to.length;\n            var fromIndex = to[0] === null ? 1 : 0;\n            from = to[fromIndex];\n            fromType = findDimensionValueType(from);\n            for (var i = fromIndex; i < numKeyframes; i++) {\n                if (!toType) {\n                    toType = findDimensionValueType(to[i]);\n                    invariant(toType === fromType ||\n                        (isNumOrPxType(fromType) && isNumOrPxType(toType)), \"Keyframes must be of the same dimension as the current value\");\n                }\n                else {\n                    invariant(findDimensionValueType(to[i]) === toType, \"All keyframes must be of the same type\");\n                }\n            }\n        }\n        else {\n            toType = findDimensionValueType(to);\n        }\n        if (fromType !== toType) {\n            // If they're both just number or px, convert them both to numbers rather than\n            // relying on resize/remeasure to convert (which is wasteful in this situation)\n            if (isNumOrPxType(fromType) && isNumOrPxType(toType)) {\n                var current = value.get();\n                if (typeof current === \"string\") {\n                    value.set(parseFloat(current));\n                }\n                if (typeof to === \"string\") {\n                    target[key] = parseFloat(to);\n                }\n                else if (Array.isArray(to) && toType === px) {\n                    target[key] = to.map(parseFloat);\n                }\n            }\n            else if ((fromType === null || fromType === void 0 ? void 0 : fromType.transform) &&\n                (toType === null || toType === void 0 ? void 0 : toType.transform) &&\n                (from === 0 || to === 0)) {\n                // If one or the other value is 0, it's safe to coerce it to the\n                // type of the other without measurement\n                if (from === 0) {\n                    value.set(toType.transform(from));\n                }\n                else {\n                    target[key] = fromType.transform(to);\n                }\n            }\n            else {\n                // If we're going to do value conversion via DOM measurements, we first\n                // need to remove non-positional transform values that could affect the bbox measurements.\n                if (!hasAttemptedToRemoveTransformValues) {\n                    removedTransformValues =\n                        removeNonTranslationalTransform(visualElement);\n                    hasAttemptedToRemoveTransformValues = true;\n                }\n                changedValueTypeKeys.push(key);\n                transitionEnd[key] =\n                    transitionEnd[key] !== undefined\n                        ? transitionEnd[key]\n                        : target[key];\n                setAndResetVelocity(value, to);\n            }\n        }\n    });\n    if (changedValueTypeKeys.length) {\n        var convertedTarget = convertChangedValueTypes(target, visualElement, changedValueTypeKeys);\n        // If we removed transform values, reapply them before the next render\n        if (removedTransformValues.length) {\n            removedTransformValues.forEach(function (_a) {\n                var _b = __read(_a, 2), key = _b[0], value = _b[1];\n                visualElement.getValue(key).set(value);\n            });\n        }\n        // Reapply original values\n        visualElement.syncRender();\n        return { target: convertedTarget, transitionEnd: transitionEnd };\n    }\n    else {\n        return { target: target, transitionEnd: transitionEnd };\n    }\n};\n/**\n * Convert value types for x/y/width/height/top/left/bottom/right\n *\n * Allows animation between `'auto'` -> `'100%'` or `0` -> `'calc(50% - 10vw)'`\n *\n * @internal\n */\nfunction unitConversion(visualElement, target, origin, transitionEnd) {\n    return hasPositionalKey(target)\n        ? checkAndConvertChangedValueTypes(visualElement, target, origin, transitionEnd)\n        : { target: target, transitionEnd: transitionEnd };\n}\n\nexport { BoundingBoxDimension, positionalValues, unitConversion };\n","import { resolveCSSVariables } from './css-variables-conversion.mjs';\nimport { unitConversion } from './unit-conversion.mjs';\n\n/**\n * Parse a DOM variant to make it animatable. This involves resolving CSS variables\n * and ensuring animations like \"20%\" => \"calc(50vw)\" are performed in pixels.\n */\nvar parseDomVariant = function (visualElement, target, origin, transitionEnd) {\n    var resolved = resolveCSSVariables(visualElement, target, transitionEnd);\n    target = resolved.target;\n    transitionEnd = resolved.transitionEnd;\n    return unitConversion(visualElement, target, origin, transitionEnd);\n};\n\nexport { parseDomVariant };\n","import { __rest, __assign } from 'tslib';\nimport { visualElement } from '../index.mjs';\nimport { getOrigin, checkTargetForNewValues } from '../utils/setters.mjs';\nimport { buildHTMLStyles } from './utils/build-styles.mjs';\nimport { isCSSVariable } from '../dom/utils/is-css-variable.mjs';\nimport { parseDomVariant } from '../dom/utils/parse-dom-variant.mjs';\nimport { isTransformProp } from './utils/transform.mjs';\nimport { scrapeMotionValuesFromProps } from './utils/scrape-motion-values.mjs';\nimport { renderHTML } from './utils/render.mjs';\nimport { getDefaultValueType } from '../dom/value-types/defaults.mjs';\nimport { measureViewportBox } from '../../projection/utils/measure.mjs';\n\nfunction getComputedStyle(element) {\n    return window.getComputedStyle(element);\n}\nvar htmlConfig = {\n    treeType: \"dom\",\n    readValueFromInstance: function (domElement, key) {\n        if (isTransformProp(key)) {\n            var defaultType = getDefaultValueType(key);\n            return defaultType ? defaultType.default || 0 : 0;\n        }\n        else {\n            var computedStyle = getComputedStyle(domElement);\n            return ((isCSSVariable(key)\n                ? computedStyle.getPropertyValue(key)\n                : computedStyle[key]) || 0);\n        }\n    },\n    sortNodePosition: function (a, b) {\n        /**\n         * compareDocumentPosition returns a bitmask, by using the bitwise &\n         * we're returning true if 2 in that bitmask is set to true. 2 is set\n         * to true if b preceeds a.\n         */\n        return a.compareDocumentPosition(b) & 2 ? 1 : -1;\n    },\n    getBaseTarget: function (props, key) {\n        var _a;\n        return (_a = props.style) === null || _a === void 0 ? void 0 : _a[key];\n    },\n    measureViewportBox: function (element, _a) {\n        var transformPagePoint = _a.transformPagePoint;\n        return measureViewportBox(element, transformPagePoint);\n    },\n    /**\n     * Reset the transform on the current Element. This is called as part\n     * of a batched process across the entire layout tree. To remove this write\n     * cycle it'd be interesting to see if it's possible to \"undo\" all the current\n     * layout transforms up the tree in the same way this.getBoundingBoxWithoutTransforms\n     * works\n     */\n    resetTransform: function (element, domElement, props) {\n        var transformTemplate = props.transformTemplate;\n        domElement.style.transform = transformTemplate\n            ? transformTemplate({}, \"\")\n            : \"none\";\n        // Ensure that whatever happens next, we restore our transform on the next frame\n        element.scheduleRender();\n    },\n    restoreTransform: function (instance, mutableState) {\n        instance.style.transform = mutableState.style.transform;\n    },\n    removeValueFromRenderState: function (key, _a) {\n        var vars = _a.vars, style = _a.style;\n        delete vars[key];\n        delete style[key];\n    },\n    /**\n     * Ensure that HTML and Framer-specific value types like `px`->`%` and `Color`\n     * can be animated by Motion.\n     */\n    makeTargetAnimatable: function (element, _a, _b, isMounted) {\n        var transformValues = _b.transformValues;\n        if (isMounted === void 0) { isMounted = true; }\n        var transition = _a.transition, transitionEnd = _a.transitionEnd, target = __rest(_a, [\"transition\", \"transitionEnd\"]);\n        var origin = getOrigin(target, transition || {}, element);\n        /**\n         * If Framer has provided a function to convert `Color` etc value types, convert them\n         */\n        if (transformValues) {\n            if (transitionEnd)\n                transitionEnd = transformValues(transitionEnd);\n            if (target)\n                target = transformValues(target);\n            if (origin)\n                origin = transformValues(origin);\n        }\n        if (isMounted) {\n            checkTargetForNewValues(element, target, origin);\n            var parsed = parseDomVariant(element, target, origin, transitionEnd);\n            transitionEnd = parsed.transitionEnd;\n            target = parsed.target;\n        }\n        return __assign({ transition: transition, transitionEnd: transitionEnd }, target);\n    },\n    scrapeMotionValuesFromProps: scrapeMotionValuesFromProps,\n    build: function (element, renderState, latestValues, options, props) {\n        if (element.isVisible !== undefined) {\n            renderState.style.visibility = element.isVisible\n                ? \"visible\"\n                : \"hidden\";\n        }\n        buildHTMLStyles(renderState, latestValues, options, props.transformTemplate);\n    },\n    render: renderHTML,\n};\nvar htmlVisualElement = visualElement(htmlConfig);\n\nexport { getComputedStyle, htmlConfig, htmlVisualElement };\n","import { __assign } from 'tslib';\nimport { visualElement } from '../index.mjs';\nimport { scrapeMotionValuesFromProps } from './utils/scrape-motion-values.mjs';\nimport { htmlConfig } from '../html/visual-element.mjs';\nimport { buildSVGAttrs } from './utils/build-attrs.mjs';\nimport { camelToDash } from '../dom/utils/camel-to-dash.mjs';\nimport { camelCaseAttributes } from './utils/camel-case-attrs.mjs';\nimport { isTransformProp } from '../html/utils/transform.mjs';\nimport { renderSVG } from './utils/render.mjs';\nimport { getDefaultValueType } from '../dom/value-types/defaults.mjs';\n\nvar svgVisualElement = visualElement(__assign(__assign({}, htmlConfig), { getBaseTarget: function (props, key) {\n        return props[key];\n    }, readValueFromInstance: function (domElement, key) {\n        var _a;\n        if (isTransformProp(key)) {\n            return ((_a = getDefaultValueType(key)) === null || _a === void 0 ? void 0 : _a.default) || 0;\n        }\n        key = !camelCaseAttributes.has(key) ? camelToDash(key) : key;\n        return domElement.getAttribute(key);\n    }, scrapeMotionValuesFromProps: scrapeMotionValuesFromProps, build: function (_element, renderState, latestValues, options, props) {\n        buildSVGAttrs(renderState, latestValues, options, props.transformTemplate);\n    }, render: renderSVG }));\n\nexport { svgVisualElement };\n","import { htmlVisualElement } from '../html/visual-element.mjs';\nimport { svgVisualElement } from '../svg/visual-element.mjs';\nimport { isSVGComponent } from './utils/is-svg-component.mjs';\n\nvar createDomVisualElement = function (Component, options) {\n    return isSVGComponent(Component)\n        ? svgVisualElement(options, { enableHardwareAcceleration: false })\n        : htmlVisualElement(options, { enableHardwareAcceleration: true });\n};\n\nexport { createDomVisualElement };\n","import { createMotionProxy } from './motion-proxy.mjs';\nimport { createDomMotionConfig } from './utils/create-config.mjs';\n\n/**\n * @public\n */\nvar m = createMotionProxy(createDomMotionConfig);\n\nexport { m };\n","import { __read } from 'tslib';\nimport sync from 'framesync';\nimport { useRef, useState, useCallback } from 'react';\nimport { useUnmountEffect } from './use-unmount-effect.mjs';\n\nfunction useForceUpdate() {\n    var isUnmountingRef = useRef(false);\n    var _a = __read(useState(0), 2), forcedRenderCount = _a[0], setForcedRenderCount = _a[1];\n    useUnmountEffect(function () { return (isUnmountingRef.current = true); });\n    var forceRender = useCallback(function () {\n        !isUnmountingRef.current && setForcedRenderCount(forcedRenderCount + 1);\n    }, [forcedRenderCount]);\n    /**\n     * Defer this to the end of the next animation frame in case there are multiple\n     * synchronous calls.\n     */\n    var deferredForceRender = useCallback(function () { return sync.postRender(forceRender); }, [forceRender]);\n    return [deferredForceRender, forcedRenderCount];\n}\n\nexport { useForceUpdate };\n","import { __values } from 'tslib';\nimport * as React from 'react';\nimport { useMemo } from 'react';\nimport { PresenceContext } from '../../context/PresenceContext.mjs';\nimport { useConstant } from '../../utils/use-constant.mjs';\n\nvar presenceId = 0;\nfunction getPresenceId() {\n    var id = presenceId;\n    presenceId++;\n    return id;\n}\nvar PresenceChild = function (_a) {\n    var children = _a.children, initial = _a.initial, isPresent = _a.isPresent, onExitComplete = _a.onExitComplete, custom = _a.custom, presenceAffectsLayout = _a.presenceAffectsLayout;\n    var presenceChildren = useConstant(newChildrenMap);\n    var id = useConstant(getPresenceId);\n    var context = useMemo(function () { return ({\n        id: id,\n        initial: initial,\n        isPresent: isPresent,\n        custom: custom,\n        onExitComplete: function (childId) {\n            var e_1, _a;\n            presenceChildren.set(childId, true);\n            try {\n                for (var _b = __values(presenceChildren.values()), _c = _b.next(); !_c.done; _c = _b.next()) {\n                    var isComplete = _c.value;\n                    if (!isComplete)\n                        return; // can stop searching when any is incomplete\n                }\n            }\n            catch (e_1_1) { e_1 = { error: e_1_1 }; }\n            finally {\n                try {\n                    if (_c && !_c.done && (_a = _b.return)) _a.call(_b);\n                }\n                finally { if (e_1) throw e_1.error; }\n            }\n            onExitComplete === null || onExitComplete === void 0 ? void 0 : onExitComplete();\n        },\n        register: function (childId) {\n            presenceChildren.set(childId, false);\n            return function () { return presenceChildren.delete(childId); };\n        },\n    }); }, \n    /**\n     * If the presence of a child affects the layout of the components around it,\n     * we want to make a new context value to ensure they get re-rendered\n     * so they can detect that layout change.\n     */\n    presenceAffectsLayout ? undefined : [isPresent]);\n    useMemo(function () {\n        presenceChildren.forEach(function (_, key) { return presenceChildren.set(key, false); });\n    }, [isPresent]);\n    /**\n     * If there's no `motion` components to fire exit animations, we want to remove this\n     * component immediately.\n     */\n    React.useEffect(function () {\n        !isPresent && !presenceChildren.size && (onExitComplete === null || onExitComplete === void 0 ? void 0 : onExitComplete());\n    }, [isPresent]);\n    return (React.createElement(PresenceContext.Provider, { value: context }, children));\n};\nfunction newChildrenMap() {\n    return new Map();\n}\n\nexport { PresenceChild };\n","import { __read, __spreadArray } from 'tslib';\nimport * as React from 'react';\nimport { useContext, useRef, useEffect, cloneElement, Children, isValidElement } from 'react';\nimport { useForceUpdate } from '../../utils/use-force-update.mjs';\nimport { PresenceChild } from './PresenceChild.mjs';\nimport { LayoutGroupContext } from '../../context/LayoutGroupContext.mjs';\n\nfunction getChildKey(child) {\n    return child.key || \"\";\n}\nfunction updateChildLookup(children, allChildren) {\n    var seenChildren = process.env.NODE_ENV !== \"production\" ? new Set() : null;\n    children.forEach(function (child) {\n        var key = getChildKey(child);\n        if (process.env.NODE_ENV !== \"production\" && seenChildren) {\n            if (seenChildren.has(key)) {\n                console.warn(\"Children of AnimatePresence require unique keys. \\\"\".concat(key, \"\\\" is a duplicate.\"));\n            }\n            seenChildren.add(key);\n        }\n        allChildren.set(key, child);\n    });\n}\nfunction onlyElements(children) {\n    var filtered = [];\n    // We use forEach here instead of map as map mutates the component key by preprending `.$`\n    Children.forEach(children, function (child) {\n        if (isValidElement(child))\n            filtered.push(child);\n    });\n    return filtered;\n}\n/**\n * `AnimatePresence` enables the animation of components that have been removed from the tree.\n *\n * When adding/removing more than a single child, every child **must** be given a unique `key` prop.\n *\n * Any `motion` components that have an `exit` property defined will animate out when removed from\n * the tree.\n *\n * ```jsx\n * import { motion, AnimatePresence } from 'framer-motion'\n *\n * export const Items = ({ items }) => (\n *   <AnimatePresence>\n *     {items.map(item => (\n *       <motion.div\n *         key={item.id}\n *         initial={{ opacity: 0 }}\n *         animate={{ opacity: 1 }}\n *         exit={{ opacity: 0 }}\n *       />\n *     ))}\n *   </AnimatePresence>\n * )\n * ```\n *\n * You can sequence exit animations throughout a tree using variants.\n *\n * If a child contains multiple `motion` components with `exit` props, it will only unmount the child\n * once all `motion` components have finished animating out. Likewise, any components using\n * `usePresence` all need to call `safeToRemove`.\n *\n * @public\n */\nvar AnimatePresence = function (_a) {\n    var children = _a.children, custom = _a.custom, _b = _a.initial, initial = _b === void 0 ? true : _b, onExitComplete = _a.onExitComplete, exitBeforeEnter = _a.exitBeforeEnter, _c = _a.presenceAffectsLayout, presenceAffectsLayout = _c === void 0 ? true : _c;\n    // We want to force a re-render once all exiting animations have finished. We\n    // either use a local forceRender function, or one from a parent context if it exists.\n    var _d = __read(useForceUpdate(), 1), forceRender = _d[0];\n    var forceRenderLayoutGroup = useContext(LayoutGroupContext).forceRender;\n    if (forceRenderLayoutGroup)\n        forceRender = forceRenderLayoutGroup;\n    var isInitialRender = useRef(true);\n    var isMounted = useRef(true);\n    useEffect(function () { return function () {\n        isMounted.current = false;\n    }; }, []);\n    // Filter out any children that aren't ReactElements. We can only track ReactElements with a props.key\n    var filteredChildren = onlyElements(children);\n    // Keep a living record of the children we're actually rendering so we\n    // can diff to figure out which are entering and exiting\n    var presentChildren = useRef(filteredChildren);\n    // A lookup table to quickly reference components by key\n    var allChildren = useRef(new Map()).current;\n    // A living record of all currently exiting components.\n    var exiting = useRef(new Set()).current;\n    updateChildLookup(filteredChildren, allChildren);\n    // If this is the initial component render, just deal with logic surrounding whether\n    // we play onMount animations or not.\n    if (isInitialRender.current) {\n        isInitialRender.current = false;\n        return (React.createElement(React.Fragment, null, filteredChildren.map(function (child) { return (React.createElement(PresenceChild, { key: getChildKey(child), isPresent: true, initial: initial ? undefined : false, presenceAffectsLayout: presenceAffectsLayout }, child)); })));\n    }\n    // If this is a subsequent render, deal with entering and exiting children\n    var childrenToRender = __spreadArray([], __read(filteredChildren), false);\n    // Diff the keys of the currently-present and target children to update our\n    // exiting list.\n    var presentKeys = presentChildren.current.map(getChildKey);\n    var targetKeys = filteredChildren.map(getChildKey);\n    // Diff the present children with our target children and mark those that are exiting\n    var numPresent = presentKeys.length;\n    for (var i = 0; i < numPresent; i++) {\n        var key = presentKeys[i];\n        if (targetKeys.indexOf(key) === -1) {\n            exiting.add(key);\n        }\n        else {\n            // In case this key has re-entered, remove from the exiting list\n            exiting.delete(key);\n        }\n    }\n    // If we currently have exiting children, and we're deferring rendering incoming children\n    // until after all current children have exiting, empty the childrenToRender array\n    if (exitBeforeEnter && exiting.size) {\n        childrenToRender = [];\n    }\n    // Loop through all currently exiting components and clone them to overwrite `animate`\n    // with any `exit` prop they might have defined.\n    exiting.forEach(function (key) {\n        // If this component is actually entering again, early return\n        if (targetKeys.indexOf(key) !== -1)\n            return;\n        var child = allChildren.get(key);\n        if (!child)\n            return;\n        var insertionIndex = presentKeys.indexOf(key);\n        var onExit = function () {\n            allChildren.delete(key);\n            exiting.delete(key);\n            // Remove this child from the present children\n            var removeIndex = presentChildren.current.findIndex(function (presentChild) { return presentChild.key === key; });\n            presentChildren.current.splice(removeIndex, 1);\n            // Defer re-rendering until all exiting children have indeed left\n            if (!exiting.size) {\n                presentChildren.current = filteredChildren;\n                if (isMounted.current === false) {\n                    return;\n                }\n                forceRender();\n                onExitComplete && onExitComplete();\n            }\n        };\n        childrenToRender.splice(insertionIndex, 0, React.createElement(PresenceChild, { key: getChildKey(child), isPresent: false, onExitComplete: onExit, custom: custom, presenceAffectsLayout: presenceAffectsLayout }, child));\n    });\n    // Add `MotionContext` even to children that don't need it to ensure we're rendering\n    // the same tree between renders\n    childrenToRender = childrenToRender.map(function (child) {\n        var key = child.key;\n        return exiting.has(key) ? (child) : (React.createElement(PresenceChild, { key: getChildKey(child), isPresent: true, presenceAffectsLayout: presenceAffectsLayout }, child));\n    });\n    presentChildren.current = childrenToRender;\n    if (process.env.NODE_ENV !== \"production\" &&\n        exitBeforeEnter &&\n        childrenToRender.length > 1) {\n        console.warn(\"You're attempting to animate multiple children within AnimatePresence, but its exitBeforeEnter prop is set to true. This will lead to odd visual behaviour.\");\n    }\n    return (React.createElement(React.Fragment, null, exiting.size\n        ? childrenToRender\n        : childrenToRender.map(function (child) { return cloneElement(child); })));\n};\n\nexport { AnimatePresence };\n","import { __read, __rest } from 'tslib';\nimport * as React from 'react';\nimport { useState, useRef, useEffect } from 'react';\nimport { LazyContext } from '../../context/LazyContext.mjs';\nimport { loadFeatures } from '../../motion/features/definitions.mjs';\n\n/**\n * Used in conjunction with the `m` component to reduce bundle size.\n *\n * `m` is a version of the `motion` component that only loads functionality\n * critical for the initial render.\n *\n * `LazyMotion` can then be used to either synchronously or asynchronously\n * load animation and gesture support.\n *\n * ```jsx\n * // Synchronous loading\n * import { LazyMotion, m, domAnimations } from \"framer-motion\"\n *\n * function App() {\n *   return (\n *     <LazyMotion features={domAnimations}>\n *       <m.div animate={{ scale: 2 }} />\n *     </LazyMotion>\n *   )\n * }\n *\n * // Asynchronous loading\n * import { LazyMotion, m } from \"framer-motion\"\n *\n * function App() {\n *   return (\n *     <LazyMotion features={() => import('./path/to/domAnimations')}>\n *       <m.div animate={{ scale: 2 }} />\n *     </LazyMotion>\n *   )\n * }\n * ```\n *\n * @public\n */\nfunction LazyMotion(_a) {\n    var children = _a.children, features = _a.features, _b = _a.strict, strict = _b === void 0 ? false : _b;\n    var _c = __read(useState(!isLazyBundle(features)), 2), setIsLoaded = _c[1];\n    var loadedRenderer = useRef(undefined);\n    /**\n     * If this is a synchronous load, load features immediately\n     */\n    if (!isLazyBundle(features)) {\n        var renderer = features.renderer, loadedFeatures = __rest(features, [\"renderer\"]);\n        loadedRenderer.current = renderer;\n        loadFeatures(loadedFeatures);\n    }\n    useEffect(function () {\n        if (isLazyBundle(features)) {\n            features().then(function (_a) {\n                var renderer = _a.renderer, loadedFeatures = __rest(_a, [\"renderer\"]);\n                loadFeatures(loadedFeatures);\n                loadedRenderer.current = renderer;\n                setIsLoaded(true);\n            });\n        }\n    }, []);\n    return (React.createElement(LazyContext.Provider, { value: { renderer: loadedRenderer.current, strict: strict } }, children));\n}\nfunction isLazyBundle(features) {\n    return typeof features === \"function\";\n}\n\nexport { LazyMotion };\n","import { __assign } from 'tslib';\nimport { animations } from '../../motion/features/animations.mjs';\nimport { gestureAnimations } from '../../motion/features/gestures.mjs';\nimport { createDomVisualElement } from './create-visual-element.mjs';\n\n/**\n * @public\n */\nvar domAnimation = __assign(__assign({ renderer: createDomVisualElement }, animations), gestureAnimations);\n\nexport { domAnimation };\n","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';\n\nvar ReactPropTypesSecret = 'SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED';\n\nmodule.exports = ReactPropTypesSecret;\n","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';\n\nvar ReactPropTypesSecret = require('./lib/ReactPropTypesSecret');\n\nfunction emptyFunction() {}\nfunction emptyFunctionWithReset() {}\nemptyFunctionWithReset.resetWarningCache = emptyFunction;\n\nmodule.exports = function() {\n  function shim(props, propName, componentName, location, propFullName, secret) {\n    if (secret === ReactPropTypesSecret) {\n      // It is still safe when called from React.\n      return;\n    }\n    var err = new Error(\n      'Calling PropTypes validators directly is not supported by the `prop-types` package. ' +\n      'Use PropTypes.checkPropTypes() to call them. ' +\n      'Read more at http://fb.me/use-check-prop-types'\n    );\n    err.name = 'Invariant Violation';\n    throw err;\n  };\n  shim.isRequired = shim;\n  function getShim() {\n    return shim;\n  };\n  // Important!\n  // Keep this list in sync with production version in `./factoryWithTypeCheckers.js`.\n  var ReactPropTypes = {\n    array: shim,\n    bigint: shim,\n    bool: shim,\n    func: shim,\n    number: shim,\n    object: shim,\n    string: shim,\n    symbol: shim,\n\n    any: shim,\n    arrayOf: getShim,\n    element: shim,\n    elementType: shim,\n    instanceOf: getShim,\n    node: shim,\n    objectOf: getShim,\n    oneOf: getShim,\n    oneOfType: getShim,\n    shape: getShim,\n    exact: getShim,\n\n    checkPropTypes: emptyFunctionWithReset,\n    resetWarningCache: emptyFunction\n  };\n\n  ReactPropTypes.PropTypes = ReactPropTypes;\n\n  return ReactPropTypes;\n};\n","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nif (process.env.NODE_ENV !== 'production') {\n  var ReactIs = require('react-is');\n\n  // By explicitly using `prop-types` you are opting into new development behavior.\n  // http://fb.me/prop-types-in-prod\n  var throwOnDirectAccess = true;\n  module.exports = require('./factoryWithTypeCheckers')(ReactIs.isElement, throwOnDirectAccess);\n} else {\n  // By explicitly using `prop-types` you are opting into new production behavior.\n  // http://fb.me/prop-types-in-prod\n  module.exports = require('./factoryWithThrowingShims')();\n}\n","export var COMMON_MIME_TYPES = new Map([\n    // https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types/Common_types\n    ['aac', 'audio/aac'],\n    ['abw', 'application/x-abiword'],\n    ['arc', 'application/x-freearc'],\n    ['avif', 'image/avif'],\n    ['avi', 'video/x-msvideo'],\n    ['azw', 'application/vnd.amazon.ebook'],\n    ['bin', 'application/octet-stream'],\n    ['bmp', 'image/bmp'],\n    ['bz', 'application/x-bzip'],\n    ['bz2', 'application/x-bzip2'],\n    ['cda', 'application/x-cdf'],\n    ['csh', 'application/x-csh'],\n    ['css', 'text/css'],\n    ['csv', 'text/csv'],\n    ['doc', 'application/msword'],\n    ['docx', 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'],\n    ['eot', 'application/vnd.ms-fontobject'],\n    ['epub', 'application/epub+zip'],\n    ['gz', 'application/gzip'],\n    ['gif', 'image/gif'],\n    ['htm', 'text/html'],\n    ['html', 'text/html'],\n    ['ico', 'image/vnd.microsoft.icon'],\n    ['ics', 'text/calendar'],\n    ['jar', 'application/java-archive'],\n    ['jpeg', 'image/jpeg'],\n    ['jpg', 'image/jpeg'],\n    ['js', 'text/javascript'],\n    ['json', 'application/json'],\n    ['jsonld', 'application/ld+json'],\n    ['mid', 'audio/midi'],\n    ['midi', 'audio/midi'],\n    ['mjs', 'text/javascript'],\n    ['mp3', 'audio/mpeg'],\n    ['mp4', 'video/mp4'],\n    ['mpeg', 'video/mpeg'],\n    ['mpkg', 'application/vnd.apple.installer+xml'],\n    ['odp', 'application/vnd.oasis.opendocument.presentation'],\n    ['ods', 'application/vnd.oasis.opendocument.spreadsheet'],\n    ['odt', 'application/vnd.oasis.opendocument.text'],\n    ['oga', 'audio/ogg'],\n    ['ogv', 'video/ogg'],\n    ['ogx', 'application/ogg'],\n    ['opus', 'audio/opus'],\n    ['otf', 'font/otf'],\n    ['png', 'image/png'],\n    ['pdf', 'application/pdf'],\n    ['php', 'application/x-httpd-php'],\n    ['ppt', 'application/vnd.ms-powerpoint'],\n    ['pptx', 'application/vnd.openxmlformats-officedocument.presentationml.presentation'],\n    ['rar', 'application/vnd.rar'],\n    ['rtf', 'application/rtf'],\n    ['sh', 'application/x-sh'],\n    ['svg', 'image/svg+xml'],\n    ['swf', 'application/x-shockwave-flash'],\n    ['tar', 'application/x-tar'],\n    ['tif', 'image/tiff'],\n    ['tiff', 'image/tiff'],\n    ['ts', 'video/mp2t'],\n    ['ttf', 'font/ttf'],\n    ['txt', 'text/plain'],\n    ['vsd', 'application/vnd.visio'],\n    ['wav', 'audio/wav'],\n    ['weba', 'audio/webm'],\n    ['webm', 'video/webm'],\n    ['webp', 'image/webp'],\n    ['woff', 'font/woff'],\n    ['woff2', 'font/woff2'],\n    ['xhtml', 'application/xhtml+xml'],\n    ['xls', 'application/vnd.ms-excel'],\n    ['xlsx', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'],\n    ['xml', 'application/xml'],\n    ['xul', 'application/vnd.mozilla.xul+xml'],\n    ['zip', 'application/zip'],\n    ['7z', 'application/x-7z-compressed'],\n    // Others\n    ['mkv', 'video/x-matroska'],\n    ['mov', 'video/quicktime'],\n    ['msg', 'application/vnd.ms-outlook']\n]);\nexport function toFileWithPath(file, path) {\n    var f = withMimeType(file);\n    if (typeof f.path !== 'string') { // on electron, path is already set to the absolute path\n        var webkitRelativePath = file.webkitRelativePath;\n        Object.defineProperty(f, 'path', {\n            value: typeof path === 'string'\n                ? path\n                // If <input webkitdirectory> is set,\n                // the File will have a {webkitRelativePath} property\n                // https://developer.mozilla.org/en-US/docs/Web/API/HTMLInputElement/webkitdirectory\n                : typeof webkitRelativePath === 'string' && webkitRelativePath.length > 0\n                    ? webkitRelativePath\n                    : file.name,\n            writable: false,\n            configurable: false,\n            enumerable: true\n        });\n    }\n    return f;\n}\nfunction withMimeType(file) {\n    var name = file.name;\n    var hasExtension = name && name.lastIndexOf('.') !== -1;\n    if (hasExtension && !file.type) {\n        var ext = name.split('.')\n            .pop().toLowerCase();\n        var type = COMMON_MIME_TYPES.get(ext);\n        if (type) {\n            Object.defineProperty(file, 'type', {\n                value: type,\n                writable: false,\n                configurable: false,\n                enumerable: true\n            });\n        }\n    }\n    return file;\n}\n//# sourceMappingURL=file.js.map","import { __awaiter, __generator, __read, __spread } from \"tslib\";\nimport { toFileWithPath } from './file';\nvar FILES_TO_IGNORE = [\n    // Thumbnail cache files for macOS and Windows\n    '.DS_Store',\n    'Thumbs.db' // Windows\n];\n/**\n * Convert a DragEvent's DataTrasfer object to a list of File objects\n * NOTE: If some of the items are folders,\n * everything will be flattened and placed in the same list but the paths will be kept as a {path} property.\n *\n * EXPERIMENTAL: A list of https://developer.mozilla.org/en-US/docs/Web/API/FileSystemHandle objects can also be passed as an arg\n * and a list of File objects will be returned.\n *\n * @param evt\n */\nexport function fromEvent(evt) {\n    return __awaiter(this, void 0, void 0, function () {\n        return __generator(this, function (_a) {\n            if (isObject(evt) && isDataTransfer(evt)) {\n                return [2 /*return*/, getDataTransferFiles(evt.dataTransfer, evt.type)];\n            }\n            else if (isChangeEvt(evt)) {\n                return [2 /*return*/, getInputFiles(evt)];\n            }\n            else if (Array.isArray(evt) && evt.every(function (item) { return 'getFile' in item && typeof item.getFile === 'function'; })) {\n                return [2 /*return*/, getFsHandleFiles(evt)];\n            }\n            return [2 /*return*/, []];\n        });\n    });\n}\nfunction isDataTransfer(value) {\n    return isObject(value.dataTransfer);\n}\nfunction isChangeEvt(value) {\n    return isObject(value) && isObject(value.target);\n}\nfunction isObject(v) {\n    return typeof v === 'object' && v !== null;\n}\nfunction getInputFiles(evt) {\n    return fromList(evt.target.files).map(function (file) { return toFileWithPath(file); });\n}\n// Ee expect each handle to be https://developer.mozilla.org/en-US/docs/Web/API/FileSystemFileHandle\nfunction getFsHandleFiles(handles) {\n    return __awaiter(this, void 0, void 0, function () {\n        var files;\n        return __generator(this, function (_a) {\n            switch (_a.label) {\n                case 0: return [4 /*yield*/, Promise.all(handles.map(function (h) { return h.getFile(); }))];\n                case 1:\n                    files = _a.sent();\n                    return [2 /*return*/, files.map(function (file) { return toFileWithPath(file); })];\n            }\n        });\n    });\n}\nfunction getDataTransferFiles(dt, type) {\n    return __awaiter(this, void 0, void 0, function () {\n        var items, files;\n        return __generator(this, function (_a) {\n            switch (_a.label) {\n                case 0:\n                    if (dt === null) {\n                        return [2 /*return*/, []];\n                    }\n                    if (!dt.items) return [3 /*break*/, 2];\n                    items = fromList(dt.items)\n                        .filter(function (item) { return item.kind === 'file'; });\n                    // According to https://html.spec.whatwg.org/multipage/dnd.html#dndevents,\n                    // only 'dragstart' and 'drop' has access to the data (source node)\n                    if (type !== 'drop') {\n                        return [2 /*return*/, items];\n                    }\n                    return [4 /*yield*/, Promise.all(items.map(toFilePromises))];\n                case 1:\n                    files = _a.sent();\n                    return [2 /*return*/, noIgnoredFiles(flatten(files))];\n                case 2: return [2 /*return*/, noIgnoredFiles(fromList(dt.files)\n                        .map(function (file) { return toFileWithPath(file); }))];\n            }\n        });\n    });\n}\nfunction noIgnoredFiles(files) {\n    return files.filter(function (file) { return FILES_TO_IGNORE.indexOf(file.name) === -1; });\n}\n// IE11 does not support Array.from()\n// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/from#Browser_compatibility\n// https://developer.mozilla.org/en-US/docs/Web/API/FileList\n// https://developer.mozilla.org/en-US/docs/Web/API/DataTransferItemList\nfunction fromList(items) {\n    if (items === null) {\n        return [];\n    }\n    var files = [];\n    // tslint:disable: prefer-for-of\n    for (var i = 0; i < items.length; i++) {\n        var file = items[i];\n        files.push(file);\n    }\n    return files;\n}\n// https://developer.mozilla.org/en-US/docs/Web/API/DataTransferItem\nfunction toFilePromises(item) {\n    if (typeof item.webkitGetAsEntry !== 'function') {\n        return fromDataTransferItem(item);\n    }\n    var entry = item.webkitGetAsEntry();\n    // Safari supports dropping an image node from a different window and can be retrieved using\n    // the DataTransferItem.getAsFile() API\n    // NOTE: FileSystemEntry.file() throws if trying to get the file\n    if (entry && entry.isDirectory) {\n        return fromDirEntry(entry);\n    }\n    return fromDataTransferItem(item);\n}\nfunction flatten(items) {\n    return items.reduce(function (acc, files) { return __spread(acc, (Array.isArray(files) ? flatten(files) : [files])); }, []);\n}\nfunction fromDataTransferItem(item) {\n    var file = item.getAsFile();\n    if (!file) {\n        return Promise.reject(item + \" is not a File\");\n    }\n    var fwp = toFileWithPath(file);\n    return Promise.resolve(fwp);\n}\n// https://developer.mozilla.org/en-US/docs/Web/API/FileSystemEntry\nfunction fromEntry(entry) {\n    return __awaiter(this, void 0, void 0, function () {\n        return __generator(this, function (_a) {\n            return [2 /*return*/, entry.isDirectory ? fromDirEntry(entry) : fromFileEntry(entry)];\n        });\n    });\n}\n// https://developer.mozilla.org/en-US/docs/Web/API/FileSystemDirectoryEntry\nfunction fromDirEntry(entry) {\n    var reader = entry.createReader();\n    return new Promise(function (resolve, reject) {\n        var entries = [];\n        function readEntries() {\n            var _this = this;\n            // https://developer.mozilla.org/en-US/docs/Web/API/FileSystemDirectoryEntry/createReader\n            // https://developer.mozilla.org/en-US/docs/Web/API/FileSystemDirectoryReader/readEntries\n            reader.readEntries(function (batch) { return __awaiter(_this, void 0, void 0, function () {\n                var files, err_1, items;\n                return __generator(this, function (_a) {\n                    switch (_a.label) {\n                        case 0:\n                            if (!!batch.length) return [3 /*break*/, 5];\n                            _a.label = 1;\n                        case 1:\n                            _a.trys.push([1, 3, , 4]);\n                            return [4 /*yield*/, Promise.all(entries)];\n                        case 2:\n                            files = _a.sent();\n                            resolve(files);\n                            return [3 /*break*/, 4];\n                        case 3:\n                            err_1 = _a.sent();\n                            reject(err_1);\n                            return [3 /*break*/, 4];\n                        case 4: return [3 /*break*/, 6];\n                        case 5:\n                            items = Promise.all(batch.map(fromEntry));\n                            entries.push(items);\n                            // Continue reading\n                            readEntries();\n                            _a.label = 6;\n                        case 6: return [2 /*return*/];\n                    }\n                });\n            }); }, function (err) {\n                reject(err);\n            });\n        }\n        readEntries();\n    });\n}\n// https://developer.mozilla.org/en-US/docs/Web/API/FileSystemFileEntry\nfunction fromFileEntry(entry) {\n    return __awaiter(this, void 0, void 0, function () {\n        return __generator(this, function (_a) {\n            return [2 /*return*/, new Promise(function (resolve, reject) {\n                    entry.file(function (file) {\n                        var fwp = toFileWithPath(file, entry.fullPath);\n                        resolve(fwp);\n                    }, function (err) {\n                        reject(err);\n                    });\n                })];\n        });\n    });\n}\n//# sourceMappingURL=file-selector.js.map","\"use strict\";\n\nexports.__esModule = true;\n\nexports.default = function (file, acceptedFiles) {\n  if (file && acceptedFiles) {\n    var acceptedFilesArray = Array.isArray(acceptedFiles) ? acceptedFiles : acceptedFiles.split(',');\n    var fileName = file.name || '';\n    var mimeType = (file.type || '').toLowerCase();\n    var baseMimeType = mimeType.replace(/\\/.*$/, '');\n    return acceptedFilesArray.some(function (type) {\n      var validType = type.trim().toLowerCase();\n\n      if (validType.charAt(0) === '.') {\n        return fileName.toLowerCase().endsWith(validType);\n      } else if (validType.endsWith('/*')) {\n        // This is something like a image/* mime type\n        return baseMimeType === validType.replace(/\\/.*$/, '');\n      }\n\n      return mimeType === validType;\n    });\n  }\n\n  return true;\n};","function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\nfunction _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }\n\nfunction _nonIterableRest() { throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\n\nfunction _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === \"string\") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === \"Object\" && o.constructor) n = o.constructor.name; if (n === \"Map\" || n === \"Set\") return Array.from(o); if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }\n\nfunction _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }\n\nfunction _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== \"undefined\" && arr[Symbol.iterator] || arr[\"@@iterator\"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"] != null) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; }\n\nfunction _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }\n\nimport accepts from 'attr-accept'; // Error codes\n\nexport var FILE_INVALID_TYPE = 'file-invalid-type';\nexport var FILE_TOO_LARGE = 'file-too-large';\nexport var FILE_TOO_SMALL = 'file-too-small';\nexport var TOO_MANY_FILES = 'too-many-files';\nexport var ErrorCode = {\n  FileInvalidType: FILE_INVALID_TYPE,\n  FileTooLarge: FILE_TOO_LARGE,\n  FileTooSmall: FILE_TOO_SMALL,\n  TooManyFiles: TOO_MANY_FILES\n}; // File Errors\n\nexport var getInvalidTypeRejectionErr = function getInvalidTypeRejectionErr(accept) {\n  accept = Array.isArray(accept) && accept.length === 1 ? accept[0] : accept;\n  var messageSuffix = Array.isArray(accept) ? \"one of \".concat(accept.join(', ')) : accept;\n  return {\n    code: FILE_INVALID_TYPE,\n    message: \"File type must be \".concat(messageSuffix)\n  };\n};\nexport var getTooLargeRejectionErr = function getTooLargeRejectionErr(maxSize) {\n  return {\n    code: FILE_TOO_LARGE,\n    message: \"File is larger than \".concat(maxSize, \" \").concat(maxSize === 1 ? 'byte' : 'bytes')\n  };\n};\nexport var getTooSmallRejectionErr = function getTooSmallRejectionErr(minSize) {\n  return {\n    code: FILE_TOO_SMALL,\n    message: \"File is smaller than \".concat(minSize, \" \").concat(minSize === 1 ? 'byte' : 'bytes')\n  };\n};\nexport var TOO_MANY_FILES_REJECTION = {\n  code: TOO_MANY_FILES,\n  message: 'Too many files'\n}; // Firefox versions prior to 53 return a bogus MIME type for every file drag, so dragovers with\n// that MIME type will always be accepted\n\nexport function fileAccepted(file, accept) {\n  var isAcceptable = file.type === 'application/x-moz-file' || accepts(file, accept);\n  return [isAcceptable, isAcceptable ? null : getInvalidTypeRejectionErr(accept)];\n}\nexport function fileMatchSize(file, minSize, maxSize) {\n  if (isDefined(file.size)) {\n    if (isDefined(minSize) && isDefined(maxSize)) {\n      if (file.size > maxSize) return [false, getTooLargeRejectionErr(maxSize)];\n      if (file.size < minSize) return [false, getTooSmallRejectionErr(minSize)];\n    } else if (isDefined(minSize) && file.size < minSize) return [false, getTooSmallRejectionErr(minSize)];else if (isDefined(maxSize) && file.size > maxSize) return [false, getTooLargeRejectionErr(maxSize)];\n  }\n\n  return [true, null];\n}\n\nfunction isDefined(value) {\n  return value !== undefined && value !== null;\n}\n\nexport function allFilesAccepted(_ref) {\n  var files = _ref.files,\n      accept = _ref.accept,\n      minSize = _ref.minSize,\n      maxSize = _ref.maxSize,\n      multiple = _ref.multiple,\n      maxFiles = _ref.maxFiles;\n\n  if (!multiple && files.length > 1 || multiple && maxFiles >= 1 && files.length > maxFiles) {\n    return false;\n  }\n\n  return files.every(function (file) {\n    var _fileAccepted = fileAccepted(file, accept),\n        _fileAccepted2 = _slicedToArray(_fileAccepted, 1),\n        accepted = _fileAccepted2[0];\n\n    var _fileMatchSize = fileMatchSize(file, minSize, maxSize),\n        _fileMatchSize2 = _slicedToArray(_fileMatchSize, 1),\n        sizeMatch = _fileMatchSize2[0];\n\n    return accepted && sizeMatch;\n  });\n} // React's synthetic events has event.isPropagationStopped,\n// but to remain compatibility with other libs (Preact) fall back\n// to check event.cancelBubble\n\nexport function isPropagationStopped(event) {\n  if (typeof event.isPropagationStopped === 'function') {\n    return event.isPropagationStopped();\n  } else if (typeof event.cancelBubble !== 'undefined') {\n    return event.cancelBubble;\n  }\n\n  return false;\n}\nexport function isEvtWithFiles(event) {\n  if (!event.dataTransfer) {\n    return !!event.target && !!event.target.files;\n  } // https://developer.mozilla.org/en-US/docs/Web/API/DataTransfer/types\n  // https://developer.mozilla.org/en-US/docs/Web/API/HTML_Drag_and_Drop_API/Recommended_drag_types#file\n\n\n  return Array.prototype.some.call(event.dataTransfer.types, function (type) {\n    return type === 'Files' || type === 'application/x-moz-file';\n  });\n}\nexport function isKindFile(item) {\n  return _typeof(item) === 'object' && item !== null && item.kind === 'file';\n} // allow the entire document to be a drag target\n\nexport function onDocumentDragOver(event) {\n  event.preventDefault();\n}\n\nfunction isIe(userAgent) {\n  return userAgent.indexOf('MSIE') !== -1 || userAgent.indexOf('Trident/') !== -1;\n}\n\nfunction isEdge(userAgent) {\n  return userAgent.indexOf('Edge/') !== -1;\n}\n\nexport function isIeOrEdge() {\n  var userAgent = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : window.navigator.userAgent;\n  return isIe(userAgent) || isEdge(userAgent);\n}\n/**\n * This is intended to be used to compose event handlers\n * They are executed in order until one of them calls `event.isPropagationStopped()`.\n * Note that the check is done on the first invoke too,\n * meaning that if propagation was stopped before invoking the fns,\n * no handlers will be executed.\n *\n * @param {Function} fns the event hanlder functions\n * @return {Function} the event handler to add to an element\n */\n\nexport function composeEventHandlers() {\n  for (var _len = arguments.length, fns = new Array(_len), _key = 0; _key < _len; _key++) {\n    fns[_key] = arguments[_key];\n  }\n\n  return function (event) {\n    for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {\n      args[_key2 - 1] = arguments[_key2];\n    }\n\n    return fns.some(function (fn) {\n      if (!isPropagationStopped(event) && fn) {\n        fn.apply(void 0, [event].concat(args));\n      }\n\n      return isPropagationStopped(event);\n    });\n  };\n}\n/**\n * canUseFileSystemAccessAPI checks if the [File System Access API](https://developer.mozilla.org/en-US/docs/Web/API/File_System_Access_API)\n * is supported by the browser.\n * @returns {boolean}\n */\n\nexport function canUseFileSystemAccessAPI() {\n  return 'showOpenFilePicker' in window;\n}\n/**\n * filePickerOptionsTypes returns the {types} option for https://developer.mozilla.org/en-US/docs/Web/API/window/showOpenFilePicker\n * based on the accept attr (see https://github.com/react-dropzone/attr-accept)\n * E.g: converts ['image/*', 'text/*'] to {'image/*': [], 'text/*': []}\n * @param {string|string[]} accept\n */\n\nexport function filePickerOptionsTypes(accept) {\n  accept = typeof accept === 'string' ? accept.split(',') : accept;\n  return [{\n    description: 'everything',\n    // TODO: Need to handle filtering more elegantly than this!\n    accept: Array.isArray(accept) // Accept just MIME types as per spec\n    // NOTE: accept can be https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/file#unique_file_type_specifiers\n    ? accept.filter(function (item) {\n      return item === 'audio/*' || item === 'video/*' || item === 'image/*' || item === 'text/*' || /\\w+\\/[-+.\\w]+/g.test(item);\n    }).reduce(function (a, b) {\n      return _objectSpread(_objectSpread({}, a), {}, _defineProperty({}, b, []));\n    }, {}) : {}\n  }];\n}","var _excluded = [\"children\"],\n    _excluded2 = [\"open\"],\n    _excluded3 = [\"refKey\", \"role\", \"onKeyDown\", \"onFocus\", \"onBlur\", \"onClick\", \"onDragEnter\", \"onDragOver\", \"onDragLeave\", \"onDrop\"],\n    _excluded4 = [\"refKey\", \"onChange\", \"onClick\"];\n\nfunction _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }\n\nfunction _nonIterableSpread() { 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\nfunction _iterableToArray(iter) { if (typeof Symbol !== \"undefined\" && iter[Symbol.iterator] != null || iter[\"@@iterator\"] != null) return Array.from(iter); }\n\nfunction _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }\n\nfunction _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }\n\nfunction _nonIterableRest() { throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\n\nfunction _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === \"string\") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === \"Object\" && o.constructor) n = o.constructor.name; if (n === \"Map\" || n === \"Set\") return Array.from(o); if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }\n\nfunction _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }\n\nfunction _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== \"undefined\" && arr[Symbol.iterator] || arr[\"@@iterator\"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"] != null) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; }\n\nfunction _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\n/* eslint prefer-template: 0 */\nimport React, { forwardRef, Fragment, useCallback, useEffect, useImperativeHandle, useMemo, useReducer, useRef } from 'react';\nimport PropTypes from 'prop-types';\nimport { fromEvent } from 'file-selector';\nimport { allFilesAccepted, composeEventHandlers, fileAccepted, fileMatchSize, filePickerOptionsTypes, canUseFileSystemAccessAPI, isEvtWithFiles, isIeOrEdge, isPropagationStopped, onDocumentDragOver, TOO_MANY_FILES_REJECTION } from './utils/index';\n/**\n * Convenience wrapper component for the `useDropzone` hook\n *\n * ```jsx\n * <Dropzone>\n *   {({getRootProps, getInputProps}) => (\n *     <div {...getRootProps()}>\n *       <input {...getInputProps()} />\n *       <p>Drag 'n' drop some files here, or click to select files</p>\n *     </div>\n *   )}\n * </Dropzone>\n * ```\n */\n\nvar Dropzone = /*#__PURE__*/forwardRef(function (_ref, ref) {\n  var children = _ref.children,\n      params = _objectWithoutProperties(_ref, _excluded);\n\n  var _useDropzone = useDropzone(params),\n      open = _useDropzone.open,\n      props = _objectWithoutProperties(_useDropzone, _excluded2);\n\n  useImperativeHandle(ref, function () {\n    return {\n      open: open\n    };\n  }, [open]); // TODO: Figure out why react-styleguidist cannot create docs if we don't return a jsx element\n\n  return /*#__PURE__*/React.createElement(Fragment, null, children(_objectSpread(_objectSpread({}, props), {}, {\n    open: open\n  })));\n});\nDropzone.displayName = 'Dropzone'; // Add default props for react-docgen\n\nvar defaultProps = {\n  disabled: false,\n  getFilesFromEvent: fromEvent,\n  maxSize: Infinity,\n  minSize: 0,\n  multiple: true,\n  maxFiles: 0,\n  preventDropOnDocument: true,\n  noClick: false,\n  noKeyboard: false,\n  noDrag: false,\n  noDragEventsBubbling: false,\n  validator: null,\n  useFsAccessApi: false\n};\nDropzone.defaultProps = defaultProps;\nDropzone.propTypes = {\n  /**\n   * Render function that exposes the dropzone state and prop getter fns\n   *\n   * @param {object} params\n   * @param {Function} params.getRootProps Returns the props you should apply to the root drop container you render\n   * @param {Function} params.getInputProps Returns the props you should apply to hidden file input you render\n   * @param {Function} params.open Open the native file selection dialog\n   * @param {boolean} params.isFocused Dropzone area is in focus\n   * @param {boolean} params.isFileDialogActive File dialog is opened\n   * @param {boolean} params.isDragActive Active drag is in progress\n   * @param {boolean} params.isDragAccept Dragged files are accepted\n   * @param {boolean} params.isDragReject Some dragged files are rejected\n   * @param {File[]} params.draggedFiles Files in active drag\n   * @param {File[]} params.acceptedFiles Accepted files\n   * @param {FileRejection[]} params.fileRejections Rejected files and why they were rejected\n   */\n  children: PropTypes.func,\n\n  /**\n   * Set accepted file types.\n   * See https://github.com/okonet/attr-accept for more information.\n   * Keep in mind that mime type determination is not reliable across platforms. CSV files,\n   * for example, are reported as text/plain under macOS but as application/vnd.ms-excel under\n   * Windows. In some cases there might not be a mime type set at all.\n   * See: https://github.com/react-dropzone/react-dropzone/issues/276\n   */\n  accept: PropTypes.oneOfType([PropTypes.string, PropTypes.arrayOf(PropTypes.string)]),\n\n  /**\n   * Allow drag 'n' drop (or selection from the file dialog) of multiple files\n   */\n  multiple: PropTypes.bool,\n\n  /**\n   * If false, allow dropped items to take over the current browser window\n   */\n  preventDropOnDocument: PropTypes.bool,\n\n  /**\n   * If true, disables click to open the native file selection dialog\n   */\n  noClick: PropTypes.bool,\n\n  /**\n   * If true, disables SPACE/ENTER to open the native file selection dialog.\n   * Note that it also stops tracking the focus state.\n   */\n  noKeyboard: PropTypes.bool,\n\n  /**\n   * If true, disables drag 'n' drop\n   */\n  noDrag: PropTypes.bool,\n\n  /**\n   * If true, stops drag event propagation to parents\n   */\n  noDragEventsBubbling: PropTypes.bool,\n\n  /**\n   * Minimum file size (in bytes)\n   */\n  minSize: PropTypes.number,\n\n  /**\n   * Maximum file size (in bytes)\n   */\n  maxSize: PropTypes.number,\n\n  /**\n   * Maximum accepted number of files\n   * The default value is 0 which means there is no limitation to how many files are accepted.\n   */\n  maxFiles: PropTypes.number,\n\n  /**\n   * Enable/disable the dropzone\n   */\n  disabled: PropTypes.bool,\n\n  /**\n   * Use this to provide a custom file aggregator\n   *\n   * @param {(DragEvent|Event)} event A drag event or input change event (if files were selected via the file dialog)\n   */\n  getFilesFromEvent: PropTypes.func,\n\n  /**\n   * Cb for when closing the file dialog with no selection\n   */\n  onFileDialogCancel: PropTypes.func,\n\n  /**\n   * Cb for when opening the file dialog\n   */\n  onFileDialogOpen: PropTypes.func,\n\n  /**\n   * Set to true to use the https://developer.mozilla.org/en-US/docs/Web/API/File_System_Access_API\n   * to open the file picker instead of using an `<input type=\"file\">` click event.\n   */\n  useFsAccessApi: PropTypes.bool,\n\n  /**\n   * Cb for when the `dragenter` event occurs.\n   *\n   * @param {DragEvent} event\n   */\n  onDragEnter: PropTypes.func,\n\n  /**\n   * Cb for when the `dragleave` event occurs\n   *\n   * @param {DragEvent} event\n   */\n  onDragLeave: PropTypes.func,\n\n  /**\n   * Cb for when the `dragover` event occurs\n   *\n   * @param {DragEvent} event\n   */\n  onDragOver: PropTypes.func,\n\n  /**\n   * Cb for when the `drop` event occurs.\n   * Note that this callback is invoked after the `getFilesFromEvent` callback is done.\n   *\n   * Files are accepted or rejected based on the `accept`, `multiple`, `minSize` and `maxSize` props.\n   * `accept` must be a valid [MIME type](http://www.iana.org/assignments/media-types/media-types.xhtml) according to [input element specification](https://www.w3.org/wiki/HTML/Elements/input/file) or a valid file extension.\n   * If `multiple` is set to false and additional files are dropped,\n   * all files besides the first will be rejected.\n   * Any file which does not have a size in the [`minSize`, `maxSize`] range, will be rejected as well.\n   *\n   * Note that the `onDrop` callback will always be invoked regardless if the dropped files were accepted or rejected.\n   * If you'd like to react to a specific scenario, use the `onDropAccepted`/`onDropRejected` props.\n   *\n   * `onDrop` will provide you with an array of [File](https://developer.mozilla.org/en-US/docs/Web/API/File) objects which you can then process and send to a server.\n   * For example, with [SuperAgent](https://github.com/visionmedia/superagent) as a http/ajax library:\n   *\n   * ```js\n   * function onDrop(acceptedFiles) {\n   *   const req = request.post('/upload')\n   *   acceptedFiles.forEach(file => {\n   *     req.attach(file.name, file)\n   *   })\n   *   req.end(callback)\n   * }\n   * ```\n   *\n   * @param {File[]} acceptedFiles\n   * @param {FileRejection[]} fileRejections\n   * @param {(DragEvent|Event)} event A drag event or input change event (if files were selected via the file dialog)\n   */\n  onDrop: PropTypes.func,\n\n  /**\n   * Cb for when the `drop` event occurs.\n   * Note that if no files are accepted, this callback is not invoked.\n   *\n   * @param {File[]} files\n   * @param {(DragEvent|Event)} event\n   */\n  onDropAccepted: PropTypes.func,\n\n  /**\n   * Cb for when the `drop` event occurs.\n   * Note that if no files are rejected, this callback is not invoked.\n   *\n   * @param {FileRejection[]} fileRejections\n   * @param {(DragEvent|Event)} event\n   */\n  onDropRejected: PropTypes.func,\n\n  /**\n   * Custom validation function\n   * @param {File} file\n   * @returns {FileError|FileError[]}\n   */\n  validator: PropTypes.func\n};\nexport default Dropzone;\n/**\n * A function that is invoked for the `dragenter`,\n * `dragover` and `dragleave` events.\n * It is not invoked if the items are not files (such as link, text, etc.).\n *\n * @callback dragCb\n * @param {DragEvent} event\n */\n\n/**\n * A function that is invoked for the `drop` or input change event.\n * It is not invoked if the items are not files (such as link, text, etc.).\n *\n * @callback dropCb\n * @param {File[]} acceptedFiles List of accepted files\n * @param {FileRejection[]} fileRejections List of rejected files and why they were rejected\n * @param {(DragEvent|Event)} event A drag event or input change event (if files were selected via the file dialog)\n */\n\n/**\n * A function that is invoked for the `drop` or input change event.\n * It is not invoked if the items are files (such as link, text, etc.).\n *\n * @callback dropAcceptedCb\n * @param {File[]} files List of accepted files that meet the given criteria\n * (`accept`, `multiple`, `minSize`, `maxSize`)\n * @param {(DragEvent|Event)} event A drag event or input change event (if files were selected via the file dialog)\n */\n\n/**\n * A function that is invoked for the `drop` or input change event.\n *\n * @callback dropRejectedCb\n * @param {File[]} files List of rejected files that do not meet the given criteria\n * (`accept`, `multiple`, `minSize`, `maxSize`)\n * @param {(DragEvent|Event)} event A drag event or input change event (if files were selected via the file dialog)\n */\n\n/**\n * A function that is used aggregate files,\n * in a asynchronous fashion, from drag or input change events.\n *\n * @callback getFilesFromEvent\n * @param {(DragEvent|Event)} event A drag event or input change event (if files were selected via the file dialog)\n * @returns {(File[]|Promise<File[]>)}\n */\n\n/**\n * An object with the current dropzone state and some helper functions.\n *\n * @typedef {object} DropzoneState\n * @property {Function} getRootProps Returns the props you should apply to the root drop container you render\n * @property {Function} getInputProps Returns the props you should apply to hidden file input you render\n * @property {Function} open Open the native file selection dialog\n * @property {boolean} isFocused Dropzone area is in focus\n * @property {boolean} isFileDialogActive File dialog is opened\n * @property {boolean} isDragActive Active drag is in progress\n * @property {boolean} isDragAccept Dragged files are accepted\n * @property {boolean} isDragReject Some dragged files are rejected\n * @property {File[]} draggedFiles Files in active drag\n * @property {File[]} acceptedFiles Accepted files\n * @property {FileRejection[]} fileRejections Rejected files and why they were rejected\n */\n\nvar initialState = {\n  isFocused: false,\n  isFileDialogActive: false,\n  isDragActive: false,\n  isDragAccept: false,\n  isDragReject: false,\n  draggedFiles: [],\n  acceptedFiles: [],\n  fileRejections: []\n};\n/**\n * A React hook that creates a drag 'n' drop area.\n *\n * ```jsx\n * function MyDropzone(props) {\n *   const {getRootProps, getInputProps} = useDropzone({\n *     onDrop: acceptedFiles => {\n *       // do something with the File objects, e.g. upload to some server\n *     }\n *   });\n *   return (\n *     <div {...getRootProps()}>\n *       <input {...getInputProps()} />\n *       <p>Drag and drop some files here, or click to select files</p>\n *     </div>\n *   )\n * }\n * ```\n *\n * @function useDropzone\n *\n * @param {object} props\n * @param {string|string[]} [props.accept] Set accepted file types.\n * See https://github.com/okonet/attr-accept for more information.\n * Keep in mind that mime type determination is not reliable across platforms. CSV files,\n * for example, are reported as text/plain under macOS but as application/vnd.ms-excel under\n * Windows. In some cases there might not be a mime type set at all.\n * See: https://github.com/react-dropzone/react-dropzone/issues/276\n * @param {boolean} [props.multiple=true] Allow drag 'n' drop (or selection from the file dialog) of multiple files\n * @param {boolean} [props.preventDropOnDocument=true] If false, allow dropped items to take over the current browser window\n * @param {boolean} [props.noClick=false] If true, disables click to open the native file selection dialog\n * @param {boolean} [props.noKeyboard=false] If true, disables SPACE/ENTER to open the native file selection dialog.\n * Note that it also stops tracking the focus state.\n * @param {boolean} [props.noDrag=false] If true, disables drag 'n' drop\n * @param {boolean} [props.noDragEventsBubbling=false] If true, stops drag event propagation to parents\n * @param {number} [props.minSize=0] Minimum file size (in bytes)\n * @param {number} [props.maxSize=Infinity] Maximum file size (in bytes)\n * @param {boolean} [props.disabled=false] Enable/disable the dropzone\n * @param {getFilesFromEvent} [props.getFilesFromEvent] Use this to provide a custom file aggregator\n * @param {Function} [props.onFileDialogCancel] Cb for when closing the file dialog with no selection\n * @param {boolean} [props.useFsAccessApi] Set to true to use the https://developer.mozilla.org/en-US/docs/Web/API/File_System_Access_API\n * to open the file picker instead of using an `<input type=\"file\">` click event.\n * @param {Function} [props.onFileDialogOpen] Cb for when opening the file dialog\n * @param {dragCb} [props.onDragEnter] Cb for when the `dragenter` event occurs.\n * @param {dragCb} [props.onDragLeave] Cb for when the `dragleave` event occurs\n * @param {dragCb} [props.onDragOver] Cb for when the `dragover` event occurs\n * @param {dropCb} [props.onDrop] Cb for when the `drop` event occurs.\n * Note that this callback is invoked after the `getFilesFromEvent` callback is done.\n *\n * Files are accepted or rejected based on the `accept`, `multiple`, `minSize` and `maxSize` props.\n * `accept` must be a valid [MIME type](http://www.iana.org/assignments/media-types/media-types.xhtml) according to [input element specification](https://www.w3.org/wiki/HTML/Elements/input/file) or a valid file extension.\n * If `multiple` is set to false and additional files are dropped,\n * all files besides the first will be rejected.\n * Any file which does not have a size in the [`minSize`, `maxSize`] range, will be rejected as well.\n *\n * Note that the `onDrop` callback will always be invoked regardless if the dropped files were accepted or rejected.\n * If you'd like to react to a specific scenario, use the `onDropAccepted`/`onDropRejected` props.\n *\n * `onDrop` will provide you with an array of [File](https://developer.mozilla.org/en-US/docs/Web/API/File) objects which you can then process and send to a server.\n * For example, with [SuperAgent](https://github.com/visionmedia/superagent) as a http/ajax library:\n *\n * ```js\n * function onDrop(acceptedFiles) {\n *   const req = request.post('/upload')\n *   acceptedFiles.forEach(file => {\n *     req.attach(file.name, file)\n *   })\n *   req.end(callback)\n * }\n * ```\n * @param {dropAcceptedCb} [props.onDropAccepted]\n * @param {dropRejectedCb} [props.onDropRejected]\n *\n * @returns {DropzoneState}\n */\n\nexport function useDropzone() {\n  var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n  var _defaultProps$options = _objectSpread(_objectSpread({}, defaultProps), options),\n      accept = _defaultProps$options.accept,\n      disabled = _defaultProps$options.disabled,\n      getFilesFromEvent = _defaultProps$options.getFilesFromEvent,\n      maxSize = _defaultProps$options.maxSize,\n      minSize = _defaultProps$options.minSize,\n      multiple = _defaultProps$options.multiple,\n      maxFiles = _defaultProps$options.maxFiles,\n      onDragEnter = _defaultProps$options.onDragEnter,\n      onDragLeave = _defaultProps$options.onDragLeave,\n      onDragOver = _defaultProps$options.onDragOver,\n      onDrop = _defaultProps$options.onDrop,\n      onDropAccepted = _defaultProps$options.onDropAccepted,\n      onDropRejected = _defaultProps$options.onDropRejected,\n      onFileDialogCancel = _defaultProps$options.onFileDialogCancel,\n      onFileDialogOpen = _defaultProps$options.onFileDialogOpen,\n      useFsAccessApi = _defaultProps$options.useFsAccessApi,\n      preventDropOnDocument = _defaultProps$options.preventDropOnDocument,\n      noClick = _defaultProps$options.noClick,\n      noKeyboard = _defaultProps$options.noKeyboard,\n      noDrag = _defaultProps$options.noDrag,\n      noDragEventsBubbling = _defaultProps$options.noDragEventsBubbling,\n      validator = _defaultProps$options.validator;\n\n  var onFileDialogOpenCb = useMemo(function () {\n    return typeof onFileDialogOpen === 'function' ? onFileDialogOpen : noop;\n  }, [onFileDialogOpen]);\n  var onFileDialogCancelCb = useMemo(function () {\n    return typeof onFileDialogCancel === 'function' ? onFileDialogCancel : noop;\n  }, [onFileDialogCancel]);\n  var rootRef = useRef(null);\n  var inputRef = useRef(null);\n\n  var _useReducer = useReducer(reducer, initialState),\n      _useReducer2 = _slicedToArray(_useReducer, 2),\n      state = _useReducer2[0],\n      dispatch = _useReducer2[1];\n\n  var isFocused = state.isFocused,\n      isFileDialogActive = state.isFileDialogActive,\n      draggedFiles = state.draggedFiles; // Update file dialog active state when the window is focused on\n\n  var onWindowFocus = function onWindowFocus() {\n    // Execute the timeout only if the file dialog is opened in the browser\n    if (isFileDialogActive) {\n      setTimeout(function () {\n        if (inputRef.current) {\n          var files = inputRef.current.files;\n\n          if (!files.length) {\n            dispatch({\n              type: 'closeDialog'\n            });\n            onFileDialogCancelCb();\n          }\n        }\n      }, 300);\n    }\n  };\n\n  useEffect(function () {\n    if (useFsAccessApi && canUseFileSystemAccessAPI()) {\n      return function () {};\n    }\n\n    window.addEventListener('focus', onWindowFocus, false);\n    return function () {\n      window.removeEventListener('focus', onWindowFocus, false);\n    };\n  }, [inputRef, isFileDialogActive, onFileDialogCancelCb, useFsAccessApi]);\n  var dragTargetsRef = useRef([]);\n\n  var onDocumentDrop = function onDocumentDrop(event) {\n    if (rootRef.current && rootRef.current.contains(event.target)) {\n      // If we intercepted an event for our instance, let it propagate down to the instance's onDrop handler\n      return;\n    }\n\n    event.preventDefault();\n    dragTargetsRef.current = [];\n  };\n\n  useEffect(function () {\n    if (preventDropOnDocument) {\n      document.addEventListener('dragover', onDocumentDragOver, false);\n      document.addEventListener('drop', onDocumentDrop, false);\n    }\n\n    return function () {\n      if (preventDropOnDocument) {\n        document.removeEventListener('dragover', onDocumentDragOver);\n        document.removeEventListener('drop', onDocumentDrop);\n      }\n    };\n  }, [rootRef, preventDropOnDocument]);\n  var onDragEnterCb = useCallback(function (event) {\n    event.preventDefault(); // Persist here because we need the event later after getFilesFromEvent() is done\n\n    event.persist();\n    stopPropagation(event);\n    dragTargetsRef.current = [].concat(_toConsumableArray(dragTargetsRef.current), [event.target]);\n\n    if (isEvtWithFiles(event)) {\n      Promise.resolve(getFilesFromEvent(event)).then(function (draggedFiles) {\n        if (isPropagationStopped(event) && !noDragEventsBubbling) {\n          return;\n        }\n\n        dispatch({\n          draggedFiles: draggedFiles,\n          isDragActive: true,\n          type: 'setDraggedFiles'\n        });\n\n        if (onDragEnter) {\n          onDragEnter(event);\n        }\n      });\n    }\n  }, [getFilesFromEvent, onDragEnter, noDragEventsBubbling]);\n  var onDragOverCb = useCallback(function (event) {\n    event.preventDefault();\n    event.persist();\n    stopPropagation(event);\n    var hasFiles = isEvtWithFiles(event);\n\n    if (hasFiles && event.dataTransfer) {\n      try {\n        event.dataTransfer.dropEffect = 'copy';\n      } catch (_unused) {}\n      /* eslint-disable-line no-empty */\n\n    }\n\n    if (hasFiles && onDragOver) {\n      onDragOver(event);\n    }\n\n    return false;\n  }, [onDragOver, noDragEventsBubbling]);\n  var onDragLeaveCb = useCallback(function (event) {\n    event.preventDefault();\n    event.persist();\n    stopPropagation(event); // Only deactivate once the dropzone and all children have been left\n\n    var targets = dragTargetsRef.current.filter(function (target) {\n      return rootRef.current && rootRef.current.contains(target);\n    }); // Make sure to remove a target present multiple times only once\n    // (Firefox may fire dragenter/dragleave multiple times on the same element)\n\n    var targetIdx = targets.indexOf(event.target);\n\n    if (targetIdx !== -1) {\n      targets.splice(targetIdx, 1);\n    }\n\n    dragTargetsRef.current = targets;\n\n    if (targets.length > 0) {\n      return;\n    }\n\n    dispatch({\n      isDragActive: false,\n      type: 'setDraggedFiles',\n      draggedFiles: []\n    });\n\n    if (isEvtWithFiles(event) && onDragLeave) {\n      onDragLeave(event);\n    }\n  }, [rootRef, onDragLeave, noDragEventsBubbling]);\n  var setFiles = useCallback(function (files, event) {\n    var acceptedFiles = [];\n    var fileRejections = [];\n    files.forEach(function (file) {\n      var _fileAccepted = fileAccepted(file, accept),\n          _fileAccepted2 = _slicedToArray(_fileAccepted, 2),\n          accepted = _fileAccepted2[0],\n          acceptError = _fileAccepted2[1];\n\n      var _fileMatchSize = fileMatchSize(file, minSize, maxSize),\n          _fileMatchSize2 = _slicedToArray(_fileMatchSize, 2),\n          sizeMatch = _fileMatchSize2[0],\n          sizeError = _fileMatchSize2[1];\n\n      var customErrors = validator ? validator(file) : null;\n\n      if (accepted && sizeMatch && !customErrors) {\n        acceptedFiles.push(file);\n      } else {\n        var errors = [acceptError, sizeError];\n\n        if (customErrors) {\n          errors = errors.concat(customErrors);\n        }\n\n        fileRejections.push({\n          file: file,\n          errors: errors.filter(function (e) {\n            return e;\n          })\n        });\n      }\n    });\n\n    if (!multiple && acceptedFiles.length > 1 || multiple && maxFiles >= 1 && acceptedFiles.length > maxFiles) {\n      // Reject everything and empty accepted files\n      acceptedFiles.forEach(function (file) {\n        fileRejections.push({\n          file: file,\n          errors: [TOO_MANY_FILES_REJECTION]\n        });\n      });\n      acceptedFiles.splice(0);\n    }\n\n    dispatch({\n      acceptedFiles: acceptedFiles,\n      fileRejections: fileRejections,\n      type: 'setFiles'\n    });\n\n    if (onDrop) {\n      onDrop(acceptedFiles, fileRejections, event);\n    }\n\n    if (fileRejections.length > 0 && onDropRejected) {\n      onDropRejected(fileRejections, event);\n    }\n\n    if (acceptedFiles.length > 0 && onDropAccepted) {\n      onDropAccepted(acceptedFiles, event);\n    }\n  }, [dispatch, multiple, accept, minSize, maxSize, maxFiles, onDrop, onDropAccepted, onDropRejected, validator]);\n  var onDropCb = useCallback(function (event) {\n    event.preventDefault(); // Persist here because we need the event later after getFilesFromEvent() is done\n\n    event.persist();\n    stopPropagation(event);\n    dragTargetsRef.current = [];\n\n    if (isEvtWithFiles(event)) {\n      Promise.resolve(getFilesFromEvent(event)).then(function (files) {\n        if (isPropagationStopped(event) && !noDragEventsBubbling) {\n          return;\n        }\n\n        setFiles(files, event);\n      });\n    }\n\n    dispatch({\n      type: 'reset'\n    });\n  }, [getFilesFromEvent, setFiles, noDragEventsBubbling]); // Fn for opening the file dialog programmatically\n\n  var openFileDialog = useCallback(function () {\n    if (useFsAccessApi && canUseFileSystemAccessAPI()) {\n      dispatch({\n        type: 'openDialog'\n      });\n      onFileDialogOpenCb(); // https://developer.mozilla.org/en-US/docs/Web/API/window/showOpenFilePicker\n\n      var opts = {\n        multiple: multiple,\n        types: filePickerOptionsTypes(accept)\n      };\n      window.showOpenFilePicker(opts).then(function (handles) {\n        return getFilesFromEvent(handles);\n      }).then(function (files) {\n        return setFiles(files, null);\n      }).catch(function (e) {\n        return onFileDialogCancelCb(e);\n      }).finally(function () {\n        return dispatch({\n          type: 'closeDialog'\n        });\n      });\n      return;\n    }\n\n    if (inputRef.current) {\n      dispatch({\n        type: 'openDialog'\n      });\n      onFileDialogOpenCb();\n      inputRef.current.value = null;\n      inputRef.current.click();\n    }\n  }, [dispatch, onFileDialogOpenCb, onFileDialogCancelCb, useFsAccessApi, setFiles, accept, multiple]); // Cb to open the file dialog when SPACE/ENTER occurs on the dropzone\n\n  var onKeyDownCb = useCallback(function (event) {\n    // Ignore keyboard events bubbling up the DOM tree\n    if (!rootRef.current || !rootRef.current.isEqualNode(event.target)) {\n      return;\n    }\n\n    if (event.keyCode === 32 || event.keyCode === 13) {\n      event.preventDefault();\n      openFileDialog();\n    }\n  }, [rootRef, inputRef, openFileDialog]); // Update focus state for the dropzone\n\n  var onFocusCb = useCallback(function () {\n    dispatch({\n      type: 'focus'\n    });\n  }, []);\n  var onBlurCb = useCallback(function () {\n    dispatch({\n      type: 'blur'\n    });\n  }, []); // Cb to open the file dialog when click occurs on the dropzone\n\n  var onClickCb = useCallback(function () {\n    if (noClick) {\n      return;\n    } // In IE11/Edge the file-browser dialog is blocking, therefore, use setTimeout()\n    // to ensure React can handle state changes\n    // See: https://github.com/react-dropzone/react-dropzone/issues/450\n\n\n    if (isIeOrEdge()) {\n      setTimeout(openFileDialog, 0);\n    } else {\n      openFileDialog();\n    }\n  }, [inputRef, noClick, openFileDialog]);\n\n  var composeHandler = function composeHandler(fn) {\n    return disabled ? null : fn;\n  };\n\n  var composeKeyboardHandler = function composeKeyboardHandler(fn) {\n    return noKeyboard ? null : composeHandler(fn);\n  };\n\n  var composeDragHandler = function composeDragHandler(fn) {\n    return noDrag ? null : composeHandler(fn);\n  };\n\n  var stopPropagation = function stopPropagation(event) {\n    if (noDragEventsBubbling) {\n      event.stopPropagation();\n    }\n  };\n\n  var getRootProps = useMemo(function () {\n    return function () {\n      var _ref2 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},\n          _ref2$refKey = _ref2.refKey,\n          refKey = _ref2$refKey === void 0 ? 'ref' : _ref2$refKey,\n          role = _ref2.role,\n          onKeyDown = _ref2.onKeyDown,\n          onFocus = _ref2.onFocus,\n          onBlur = _ref2.onBlur,\n          onClick = _ref2.onClick,\n          onDragEnter = _ref2.onDragEnter,\n          onDragOver = _ref2.onDragOver,\n          onDragLeave = _ref2.onDragLeave,\n          onDrop = _ref2.onDrop,\n          rest = _objectWithoutProperties(_ref2, _excluded3);\n\n      return _objectSpread(_objectSpread(_defineProperty({\n        onKeyDown: composeKeyboardHandler(composeEventHandlers(onKeyDown, onKeyDownCb)),\n        onFocus: composeKeyboardHandler(composeEventHandlers(onFocus, onFocusCb)),\n        onBlur: composeKeyboardHandler(composeEventHandlers(onBlur, onBlurCb)),\n        onClick: composeHandler(composeEventHandlers(onClick, onClickCb)),\n        onDragEnter: composeDragHandler(composeEventHandlers(onDragEnter, onDragEnterCb)),\n        onDragOver: composeDragHandler(composeEventHandlers(onDragOver, onDragOverCb)),\n        onDragLeave: composeDragHandler(composeEventHandlers(onDragLeave, onDragLeaveCb)),\n        onDrop: composeDragHandler(composeEventHandlers(onDrop, onDropCb)),\n        role: typeof role === 'string' && role !== '' ? role : 'button'\n      }, refKey, rootRef), !disabled && !noKeyboard ? {\n        tabIndex: 0\n      } : {}), rest);\n    };\n  }, [rootRef, onKeyDownCb, onFocusCb, onBlurCb, onClickCb, onDragEnterCb, onDragOverCb, onDragLeaveCb, onDropCb, noKeyboard, noDrag, disabled]);\n  var onInputElementClick = useCallback(function (event) {\n    event.stopPropagation();\n  }, []);\n  var getInputProps = useMemo(function () {\n    return function () {\n      var _ref3 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},\n          _ref3$refKey = _ref3.refKey,\n          refKey = _ref3$refKey === void 0 ? 'ref' : _ref3$refKey,\n          onChange = _ref3.onChange,\n          onClick = _ref3.onClick,\n          rest = _objectWithoutProperties(_ref3, _excluded4);\n\n      var inputProps = _defineProperty({\n        accept: accept,\n        multiple: multiple,\n        type: 'file',\n        style: {\n          display: 'none'\n        },\n        onChange: composeHandler(composeEventHandlers(onChange, onDropCb)),\n        onClick: composeHandler(composeEventHandlers(onClick, onInputElementClick)),\n        autoComplete: 'off',\n        tabIndex: -1\n      }, refKey, inputRef);\n\n      return _objectSpread(_objectSpread({}, inputProps), rest);\n    };\n  }, [inputRef, accept, multiple, onDropCb, disabled]);\n  var fileCount = draggedFiles.length;\n  var isDragAccept = fileCount > 0 && allFilesAccepted({\n    files: draggedFiles,\n    accept: accept,\n    minSize: minSize,\n    maxSize: maxSize,\n    multiple: multiple,\n    maxFiles: maxFiles\n  });\n  var isDragReject = fileCount > 0 && !isDragAccept;\n  return _objectSpread(_objectSpread({}, state), {}, {\n    isDragAccept: isDragAccept,\n    isDragReject: isDragReject,\n    isFocused: isFocused && !disabled,\n    getRootProps: getRootProps,\n    getInputProps: getInputProps,\n    rootRef: rootRef,\n    inputRef: inputRef,\n    open: composeHandler(openFileDialog)\n  });\n}\n\nfunction reducer(state, action) {\n  /* istanbul ignore next */\n  switch (action.type) {\n    case 'focus':\n      return _objectSpread(_objectSpread({}, state), {}, {\n        isFocused: true\n      });\n\n    case 'blur':\n      return _objectSpread(_objectSpread({}, state), {}, {\n        isFocused: false\n      });\n\n    case 'openDialog':\n      return _objectSpread(_objectSpread({}, initialState), {}, {\n        isFileDialogActive: true\n      });\n\n    case 'closeDialog':\n      return _objectSpread(_objectSpread({}, state), {}, {\n        isFileDialogActive: false\n      });\n\n    case 'setDraggedFiles':\n      /* eslint no-case-declarations: 0 */\n      var isDragActive = action.isDragActive,\n          draggedFiles = action.draggedFiles;\n      return _objectSpread(_objectSpread({}, state), {}, {\n        draggedFiles: draggedFiles,\n        isDragActive: isDragActive\n      });\n\n    case 'setFiles':\n      return _objectSpread(_objectSpread({}, state), {}, {\n        acceptedFiles: action.acceptedFiles,\n        fileRejections: action.fileRejections\n      });\n\n    case 'reset':\n      return _objectSpread({}, initialState);\n\n    default:\n      return state;\n  }\n}\n\nfunction noop() {}\n\nexport { ErrorCode } from './utils';","function toVal(mix) {\n\tvar k, y, str='';\n\n\tif (typeof mix === 'string' || typeof mix === 'number') {\n\t\tstr += mix;\n\t} else if (typeof mix === 'object') {\n\t\tif (Array.isArray(mix)) {\n\t\t\tfor (k=0; k < mix.length; k++) {\n\t\t\t\tif (mix[k]) {\n\t\t\t\t\tif (y = toVal(mix[k])) {\n\t\t\t\t\t\tstr && (str += ' ');\n\t\t\t\t\t\tstr += y;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tfor (k in mix) {\n\t\t\t\tif (mix[k]) {\n\t\t\t\t\tstr && (str += ' ');\n\t\t\t\t\tstr += k;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn str;\n}\n\nexport default function () {\n\tvar i=0, tmp, x, str='';\n\twhile (i < arguments.length) {\n\t\tif (tmp = arguments[i++]) {\n\t\t\tif (x = toVal(tmp)) {\n\t\t\t\tstr && (str += ' ');\n\t\t\t\tstr += x\n\t\t\t}\n\t\t}\n\t}\n\treturn str;\n}\n","import $cgWTI$react, {useContext as $cgWTI$useContext, useMemo as $cgWTI$useMemo, useState as $cgWTI$useState, useLayoutEffect as $cgWTI$useLayoutEffect} from \"react\";\n\nfunction $parcel$export(e, n, v, s) {\n  Object.defineProperty(e, n, {get: v, set: s, enumerable: true, configurable: true});\n}\nvar $9d939cbc98267846$exports = {};\n\n$parcel$export($9d939cbc98267846$exports, \"SSRProvider\", () => $9d939cbc98267846$export$9f8ac96af4b1b2ae);\n$parcel$export($9d939cbc98267846$exports, \"useSSRSafeId\", () => $9d939cbc98267846$export$619500959fc48b26);\n$parcel$export($9d939cbc98267846$exports, \"useIsSSR\", () => $9d939cbc98267846$export$535bd6ca7f90a273);\n\n// Default context value to use in case there is no SSRProvider. This is fine for\n// client-only apps. In order to support multiple copies of React Aria potentially\n// being on the page at once, the prefix is set to a random number. SSRProvider\n// will reset this to zero for consistency between server and client, so in the\n// SSR case multiple copies of React Aria is not supported.\nconst $9d939cbc98267846$var$defaultContext = {\n    prefix: String(Math.round(Math.random() * 10000000000)),\n    current: 0\n};\nconst $9d939cbc98267846$var$SSRContext = /*#__PURE__*/ $cgWTI$react.createContext($9d939cbc98267846$var$defaultContext);\nfunction $9d939cbc98267846$export$9f8ac96af4b1b2ae(props) {\n    let cur = $cgWTI$useContext($9d939cbc98267846$var$SSRContext);\n    let value = $cgWTI$useMemo(()=>({\n            // If this is the first SSRProvider, start with an empty string prefix, otherwise\n            // append and increment the counter.\n            prefix: cur === $9d939cbc98267846$var$defaultContext ? '' : `${cur.prefix}-${++cur.current}`,\n            current: 0\n        })\n    , [\n        cur\n    ]);\n    return(/*#__PURE__*/ $cgWTI$react.createElement($9d939cbc98267846$var$SSRContext.Provider, {\n        value: value\n    }, props.children));\n}\nlet $9d939cbc98267846$var$canUseDOM = Boolean(typeof window !== 'undefined' && window.document && window.document.createElement);\nfunction $9d939cbc98267846$export$619500959fc48b26(defaultId) {\n    let ctx = $cgWTI$useContext($9d939cbc98267846$var$SSRContext);\n    // If we are rendering in a non-DOM environment, and there's no SSRProvider,\n    // provide a warning to hint to the developer to add one.\n    if (ctx === $9d939cbc98267846$var$defaultContext && !$9d939cbc98267846$var$canUseDOM) console.warn('When server rendering, you must wrap your application in an <SSRProvider> to ensure consistent ids are generated between the client and server.');\n    return $cgWTI$useMemo(()=>defaultId || `react-aria${ctx.prefix}-${++ctx.current}`\n    , [\n        defaultId\n    ]);\n}\nfunction $9d939cbc98267846$export$535bd6ca7f90a273() {\n    let cur = $cgWTI$useContext($9d939cbc98267846$var$SSRContext);\n    let isInSSRContext = cur !== $9d939cbc98267846$var$defaultContext;\n    let [isSSR, setIsSSR] = $cgWTI$useState(isInSSRContext);\n    // If on the client, and the component was initially server rendered,\n    // then schedule a layout effect to update the component after hydration.\n    if (typeof window !== 'undefined' && isInSSRContext) // This if statement technically breaks the rules of hooks, but is safe\n    // because the condition never changes after mounting.\n    // eslint-disable-next-line react-hooks/rules-of-hooks\n    $cgWTI$useLayoutEffect(()=>{\n        setIsSSR(false);\n    }, []);\n    return isSSR;\n}\n\n\n\n\nexport {$9d939cbc98267846$export$9f8ac96af4b1b2ae as SSRProvider, $9d939cbc98267846$export$619500959fc48b26 as useSSRSafeId, $9d939cbc98267846$export$535bd6ca7f90a273 as useIsSSR};\n//# sourceMappingURL=module.js.map\n","import {useState as $11sjw$useState, useRef as $11sjw$useRef, useCallback as $11sjw$useCallback} from \"react\";\n\nfunction $parcel$export(e, n, v, s) {\n  Object.defineProperty(e, n, {get: v, set: s, enumerable: true, configurable: true});\n}\nvar $bfee1151ccb0650f$exports = {};\n\n$parcel$export($bfee1151ccb0650f$exports, \"useControlledState\", () => $bfee1151ccb0650f$export$40bfa8c7b0832715);\n\nfunction $bfee1151ccb0650f$export$40bfa8c7b0832715(value1, defaultValue, onChange) {\n    let [stateValue, setStateValue] = $11sjw$useState(value1 || defaultValue);\n    let ref = $11sjw$useRef(value1 !== undefined);\n    let wasControlled = ref.current;\n    let isControlled = value1 !== undefined;\n    // Internal state reference for useCallback\n    let stateRef = $11sjw$useRef(stateValue);\n    if (wasControlled !== isControlled) console.warn(`WARN: A component changed from ${wasControlled ? 'controlled' : 'uncontrolled'} to ${isControlled ? 'controlled' : 'uncontrolled'}.`);\n    ref.current = isControlled;\n    let setValue = $11sjw$useCallback((value2, ...args)=>{\n        let onChangeCaller = (value, ...onChangeArgs)=>{\n            if (onChange) {\n                if (!Object.is(stateRef.current, value)) onChange(value, ...onChangeArgs);\n            }\n            if (!isControlled) stateRef.current = value;\n        };\n        if (typeof value2 === 'function') {\n            console.warn('We can not support a function callback. See Github Issues for details https://github.com/adobe/react-spectrum/issues/2320');\n            // this supports functional updates https://reactjs.org/docs/hooks-reference.html#functional-updates\n            // when someone using useControlledState calls setControlledState(myFunc)\n            // this will call our useState setState with a function as well which invokes myFunc and calls onChange with the value from myFunc\n            // if we're in an uncontrolled state, then we also return the value of myFunc which to setState looks as though it was just called with myFunc from the beginning\n            // otherwise we just return the controlled value, which won't cause a rerender because React knows to bail out when the value is the same\n            let updateFunction = (oldValue, ...functionArgs)=>{\n                let interceptedValue = value2(isControlled ? stateRef.current : oldValue, ...functionArgs);\n                onChangeCaller(interceptedValue, ...args);\n                if (!isControlled) return interceptedValue;\n                return oldValue;\n            };\n            setStateValue(updateFunction);\n        } else {\n            if (!isControlled) setStateValue(value2);\n            onChangeCaller(value2, ...args);\n        }\n    }, [\n        isControlled,\n        onChange\n    ]);\n    // If a controlled component's value prop changes, we need to update stateRef\n    if (isControlled) stateRef.current = value1;\n    else value1 = stateValue;\n    return [\n        value1,\n        setValue\n    ];\n}\n\n\nvar $48d9f1d165180307$exports = {};\n\n$parcel$export($48d9f1d165180307$exports, \"clamp\", () => $48d9f1d165180307$export$7d15b64cf5a3a4c4);\n$parcel$export($48d9f1d165180307$exports, \"snapValueToStep\", () => $48d9f1d165180307$export$cb6e0bb50bc19463);\n$parcel$export($48d9f1d165180307$exports, \"toFixedNumber\", () => $48d9f1d165180307$export$b6268554fba451f);\nfunction $48d9f1d165180307$export$7d15b64cf5a3a4c4(value, min = -Infinity, max = Infinity) {\n    let newValue = Math.min(Math.max(value, min), max);\n    return newValue;\n}\nfunction $48d9f1d165180307$export$cb6e0bb50bc19463(value, min, max, step) {\n    let remainder = (value - (isNaN(min) ? 0 : min)) % step;\n    let snappedValue = Math.abs(remainder) * 2 >= step ? value + Math.sign(remainder) * (step - Math.abs(remainder)) : value - remainder;\n    if (!isNaN(min)) {\n        if (snappedValue < min) snappedValue = min;\n        else if (!isNaN(max) && snappedValue > max) snappedValue = min + Math.floor((max - min) / step) * step;\n    } else if (!isNaN(max) && snappedValue > max) snappedValue = Math.floor(max / step) * step;\n    // correct floating point behavior by rounding to step precision\n    let string = step.toString();\n    let index = string.indexOf('.');\n    let precision = index >= 0 ? string.length - index : 0;\n    if (precision > 0) {\n        let pow = Math.pow(10, precision);\n        snappedValue = Math.round(snappedValue * pow) / pow;\n    }\n    return snappedValue;\n}\nfunction $48d9f1d165180307$export$b6268554fba451f(value, digits, base = 10) {\n    const pow = Math.pow(base, digits);\n    return Math.round(value * pow) / pow;\n}\n\n\n\n\nexport {$bfee1151ccb0650f$export$40bfa8c7b0832715 as useControlledState, $48d9f1d165180307$export$7d15b64cf5a3a4c4 as clamp, $48d9f1d165180307$export$cb6e0bb50bc19463 as snapValueToStep, $48d9f1d165180307$export$b6268554fba451f as toFixedNumber};\n//# sourceMappingURL=module.js.map\n","import $12uGp$react, {useRef as $12uGp$useRef, useState as $12uGp$useState, useEffect as $12uGp$useEffect, useCallback as $12uGp$useCallback} from \"react\";\nimport {useSSRSafeId as $12uGp$useSSRSafeId} from \"@react-aria/ssr\";\nimport $12uGp$clsx from \"clsx\";\nimport {clamp as $103b0e103f1b5952$re_export$clamp, snapValueToStep as $103b0e103f1b5952$re_export$snapValueToStep} from \"@react-stately/utils\";\n\nfunction $parcel$export(e, n, v, s) {\n  Object.defineProperty(e, n, {get: v, set: s, enumerable: true, configurable: true});\n}\nvar $bdb11010cef70236$exports = {};\n\n$parcel$export($bdb11010cef70236$exports, \"useId\", () => $bdb11010cef70236$export$f680877a34711e37);\n$parcel$export($bdb11010cef70236$exports, \"mergeIds\", () => $bdb11010cef70236$export$cd8c9cb68f842629);\n$parcel$export($bdb11010cef70236$exports, \"useSlotId\", () => $bdb11010cef70236$export$b4cc09c592e8fdb8);\n\nvar $f0a04ccd8dbdd83b$exports = {};\n\n$parcel$export($f0a04ccd8dbdd83b$exports, \"useLayoutEffect\", () => $f0a04ccd8dbdd83b$export$e5c5a5f917a5871c);\n\nconst $f0a04ccd8dbdd83b$export$e5c5a5f917a5871c = typeof window !== 'undefined' ? $12uGp$react.useLayoutEffect : ()=>{\n};\n\n\n\n\nlet $bdb11010cef70236$var$idsUpdaterMap = new Map();\nfunction $bdb11010cef70236$export$f680877a34711e37(defaultId) {\n    let isRendering = $12uGp$useRef(true);\n    isRendering.current = true;\n    let [value, setValue] = $12uGp$useState(defaultId);\n    let nextId = $12uGp$useRef(null);\n    let res = $12uGp$useSSRSafeId(value);\n    // don't memo this, we want it new each render so that the Effects always run\n    let updateValue = (val)=>{\n        if (!isRendering.current) setValue(val);\n        else nextId.current = val;\n    };\n    $bdb11010cef70236$var$idsUpdaterMap.set(res, updateValue);\n    $f0a04ccd8dbdd83b$export$e5c5a5f917a5871c(()=>{\n        isRendering.current = false;\n    }, [\n        updateValue\n    ]);\n    $f0a04ccd8dbdd83b$export$e5c5a5f917a5871c(()=>{\n        let r = res;\n        return ()=>{\n            $bdb11010cef70236$var$idsUpdaterMap.delete(r);\n        };\n    }, [\n        res\n    ]);\n    $12uGp$useEffect(()=>{\n        let newId = nextId.current;\n        if (newId) {\n            setValue(newId);\n            nextId.current = null;\n        }\n    }, [\n        setValue,\n        updateValue\n    ]);\n    return res;\n}\nfunction $bdb11010cef70236$export$cd8c9cb68f842629(idA, idB) {\n    if (idA === idB) return idA;\n    let setIdA = $bdb11010cef70236$var$idsUpdaterMap.get(idA);\n    if (setIdA) {\n        setIdA(idB);\n        return idB;\n    }\n    let setIdB = $bdb11010cef70236$var$idsUpdaterMap.get(idB);\n    if (setIdB) {\n        setIdB(idA);\n        return idA;\n    }\n    return idB;\n}\nfunction $bdb11010cef70236$export$b4cc09c592e8fdb8(depArray = []) {\n    let id = $bdb11010cef70236$export$f680877a34711e37();\n    let [resolvedId, setResolvedId] = $1dbecbe27a04f9af$export$14d238f342723f25(id);\n    let updateId = $12uGp$useCallback(()=>{\n        setResolvedId(function*() {\n            yield id;\n            yield document.getElementById(id) ? id : null;\n        });\n    }, [\n        id,\n        setResolvedId\n    ]);\n    $f0a04ccd8dbdd83b$export$e5c5a5f917a5871c(updateId, [\n        id,\n        updateId,\n        ...depArray\n    ]);\n    return resolvedId;\n}\n\n\nvar $ff5963eb1fccf552$exports = {};\n\n$parcel$export($ff5963eb1fccf552$exports, \"chain\", () => $ff5963eb1fccf552$export$e08e3b67e392101e);\nfunction $ff5963eb1fccf552$export$e08e3b67e392101e(...callbacks) {\n    return (...args)=>{\n        for (let callback of callbacks)if (typeof callback === 'function') callback(...args);\n    };\n}\n\n\nvar $3ef42575df84b30b$exports = {};\n\n$parcel$export($3ef42575df84b30b$exports, \"mergeProps\", () => $3ef42575df84b30b$export$9d1611c77c2fe928);\n\n\n\nfunction $3ef42575df84b30b$export$9d1611c77c2fe928(...args) {\n    // Start with a base clone of the first argument. This is a lot faster than starting\n    // with an empty object and adding properties as we go.\n    let result = {\n        ...args[0]\n    };\n    for(let i = 1; i < args.length; i++){\n        let props = args[i];\n        for(let key in props){\n            let a = result[key];\n            let b = props[key];\n            // Chain events\n            if (typeof a === 'function' && typeof b === 'function' && // This is a lot faster than a regex.\n            key[0] === 'o' && key[1] === 'n' && key.charCodeAt(2) >= /* 'A' */ 65 && key.charCodeAt(2) <= /* 'Z' */ 90) result[key] = $ff5963eb1fccf552$export$e08e3b67e392101e(a, b);\n            else if ((key === 'className' || key === 'UNSAFE_className') && typeof a === 'string' && typeof b === 'string') result[key] = $12uGp$clsx(a, b);\n            else if (key === 'id' && a && b) result.id = $bdb11010cef70236$export$cd8c9cb68f842629(a, b);\n            else result[key] = b !== undefined ? b : a;\n        }\n    }\n    return result;\n}\n\n\nvar $65484d02dcb7eb3e$exports = {};\n\n$parcel$export($65484d02dcb7eb3e$exports, \"filterDOMProps\", () => $65484d02dcb7eb3e$export$457c3d6518dd4c6f);\nconst $65484d02dcb7eb3e$var$DOMPropNames = new Set([\n    'id'\n]);\nconst $65484d02dcb7eb3e$var$labelablePropNames = new Set([\n    'aria-label',\n    'aria-labelledby',\n    'aria-describedby',\n    'aria-details'\n]);\nconst $65484d02dcb7eb3e$var$propRe = /^(data-.*)$/;\nfunction $65484d02dcb7eb3e$export$457c3d6518dd4c6f(props, opts = {\n}) {\n    let { labelable: labelable , propNames: propNames  } = opts;\n    let filteredProps = {\n    };\n    for(const prop in props)if (Object.prototype.hasOwnProperty.call(props, prop) && ($65484d02dcb7eb3e$var$DOMPropNames.has(prop) || labelable && $65484d02dcb7eb3e$var$labelablePropNames.has(prop) || (propNames === null || propNames === void 0 ? void 0 : propNames.has(prop)) || $65484d02dcb7eb3e$var$propRe.test(prop))) filteredProps[prop] = props[prop];\n    return filteredProps;\n}\n\n\nvar $7215afc6de606d6b$exports = {};\n\n$parcel$export($7215afc6de606d6b$exports, \"focusWithoutScrolling\", () => $7215afc6de606d6b$export$de79e2c695e052f3);\nfunction $7215afc6de606d6b$export$de79e2c695e052f3(element) {\n    if ($7215afc6de606d6b$var$supportsPreventScroll()) element.focus({\n        preventScroll: true\n    });\n    else {\n        let scrollableElements = $7215afc6de606d6b$var$getScrollableElements(element);\n        element.focus();\n        $7215afc6de606d6b$var$restoreScrollPosition(scrollableElements);\n    }\n}\nlet $7215afc6de606d6b$var$supportsPreventScrollCached = null;\nfunction $7215afc6de606d6b$var$supportsPreventScroll() {\n    if ($7215afc6de606d6b$var$supportsPreventScrollCached == null) {\n        $7215afc6de606d6b$var$supportsPreventScrollCached = false;\n        try {\n            var focusElem = document.createElement('div');\n            focusElem.focus({\n                get preventScroll () {\n                    $7215afc6de606d6b$var$supportsPreventScrollCached = true;\n                    return true;\n                }\n            });\n        } catch (e) {\n        // Ignore\n        }\n    }\n    return $7215afc6de606d6b$var$supportsPreventScrollCached;\n}\nfunction $7215afc6de606d6b$var$getScrollableElements(element) {\n    var parent = element.parentNode;\n    var scrollableElements = [];\n    var rootScrollingElement = document.scrollingElement || document.documentElement;\n    while(parent instanceof HTMLElement && parent !== rootScrollingElement){\n        if (parent.offsetHeight < parent.scrollHeight || parent.offsetWidth < parent.scrollWidth) scrollableElements.push({\n            element: parent,\n            scrollTop: parent.scrollTop,\n            scrollLeft: parent.scrollLeft\n        });\n        parent = parent.parentNode;\n    }\n    if (rootScrollingElement instanceof HTMLElement) scrollableElements.push({\n        element: rootScrollingElement,\n        scrollTop: rootScrollingElement.scrollTop,\n        scrollLeft: rootScrollingElement.scrollLeft\n    });\n    return scrollableElements;\n}\nfunction $7215afc6de606d6b$var$restoreScrollPosition(scrollableElements) {\n    for (let { element: element , scrollTop: scrollTop , scrollLeft: scrollLeft  } of scrollableElements){\n        element.scrollTop = scrollTop;\n        element.scrollLeft = scrollLeft;\n    }\n}\n\n\nvar $ab71dadb03a6fb2e$exports = {};\n\n$parcel$export($ab71dadb03a6fb2e$exports, \"getOffset\", () => $ab71dadb03a6fb2e$export$622cea445a1c5b7d);\nfunction $ab71dadb03a6fb2e$export$622cea445a1c5b7d(element, reverse, orientation = 'horizontal') {\n    let rect = element.getBoundingClientRect();\n    if (reverse) return orientation === 'horizontal' ? rect.right : rect.bottom;\n    return orientation === 'horizontal' ? rect.left : rect.top;\n}\n\n\nvar $103b0e103f1b5952$exports = {};\n\n$parcel$export($103b0e103f1b5952$exports, \"clamp\", () => $103b0e103f1b5952$re_export$clamp);\n$parcel$export($103b0e103f1b5952$exports, \"snapValueToStep\", () => $103b0e103f1b5952$re_export$snapValueToStep);\n\n\n\nvar $bbed8b41f857bcc0$exports = {};\n\n$parcel$export($bbed8b41f857bcc0$exports, \"runAfterTransition\", () => $bbed8b41f857bcc0$export$24490316f764c430);\n/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */ // We store a global list of elements that are currently transitioning,\n// mapped to a set of CSS properties that are transitioning for that element.\n// This is necessary rather than a simple count of transitions because of browser\n// bugs, e.g. Chrome sometimes fires both transitionend and transitioncancel rather\n// than one or the other. So we need to track what's actually transitioning so that\n// we can ignore these duplicate events.\nlet $bbed8b41f857bcc0$var$transitionsByElement = new Map();\n// A list of callbacks to call once there are no transitioning elements.\nlet $bbed8b41f857bcc0$var$transitionCallbacks = new Set();\nfunction $bbed8b41f857bcc0$var$setupGlobalEvents() {\n    if (typeof window === 'undefined') return;\n    let onTransitionStart = (e)=>{\n        // Add the transitioning property to the list for this element.\n        let transitions = $bbed8b41f857bcc0$var$transitionsByElement.get(e.target);\n        if (!transitions) {\n            transitions = new Set();\n            $bbed8b41f857bcc0$var$transitionsByElement.set(e.target, transitions);\n            // The transitioncancel event must be registered on the element itself, rather than as a global\n            // event. This enables us to handle when the node is deleted from the document while it is transitioning.\n            // In that case, the cancel event would have nowhere to bubble to so we need to handle it directly.\n            e.target.addEventListener('transitioncancel', onTransitionEnd);\n        }\n        transitions.add(e.propertyName);\n    };\n    let onTransitionEnd = (e)=>{\n        // Remove property from list of transitioning properties.\n        let properties = $bbed8b41f857bcc0$var$transitionsByElement.get(e.target);\n        if (!properties) return;\n        properties.delete(e.propertyName);\n        // If empty, remove transitioncancel event, and remove the element from the list of transitioning elements.\n        if (properties.size === 0) {\n            e.target.removeEventListener('transitioncancel', onTransitionEnd);\n            $bbed8b41f857bcc0$var$transitionsByElement.delete(e.target);\n        }\n        // If no transitioning elements, call all of the queued callbacks.\n        if ($bbed8b41f857bcc0$var$transitionsByElement.size === 0) {\n            for (let cb of $bbed8b41f857bcc0$var$transitionCallbacks)cb();\n            $bbed8b41f857bcc0$var$transitionCallbacks.clear();\n        }\n    };\n    document.body.addEventListener('transitionrun', onTransitionStart);\n    document.body.addEventListener('transitionend', onTransitionEnd);\n}\nif (typeof document !== 'undefined') {\n    if (document.readyState !== 'loading') $bbed8b41f857bcc0$var$setupGlobalEvents();\n    else document.addEventListener('DOMContentLoaded', $bbed8b41f857bcc0$var$setupGlobalEvents);\n}\nfunction $bbed8b41f857bcc0$export$24490316f764c430(fn) {\n    // Wait one frame to see if an animation starts, e.g. a transition on mount.\n    requestAnimationFrame(()=>{\n        // If no transitions are running, call the function immediately.\n        // Otherwise, add it to a list of callbacks to run at the end of the animation.\n        if ($bbed8b41f857bcc0$var$transitionsByElement.size === 0) fn();\n        else $bbed8b41f857bcc0$var$transitionCallbacks.add(fn);\n    });\n}\n\n\nvar $9cc09df9fd7676be$exports = {};\n\n$parcel$export($9cc09df9fd7676be$exports, \"useDrag1D\", () => $9cc09df9fd7676be$export$7bbed75feba39706);\n\n\n// Keep track of elements that we are currently handling dragging for via useDrag1D.\n// If there's an ancestor and a descendant both using useDrag1D(), and the user starts\n// dragging the descendant, we don't want useDrag1D events to fire for the ancestor.\nconst $9cc09df9fd7676be$var$draggingElements = [];\nfunction $9cc09df9fd7676be$export$7bbed75feba39706(props) {\n    console.warn('useDrag1D is deprecated, please use `useMove` instead https://react-spectrum.adobe.com/react-aria/useMove.html');\n    let { containerRef: containerRef , reverse: reverse , orientation: orientation , onHover: onHover , onDrag: onDrag , onPositionChange: onPositionChange , onIncrement: onIncrement , onDecrement: onDecrement , onIncrementToMax: onIncrementToMax , onDecrementToMin: onDecrementToMin , onCollapseToggle: onCollapseToggle  } = props;\n    let getPosition = (e)=>orientation === 'horizontal' ? e.clientX : e.clientY\n    ;\n    let getNextOffset = (e)=>{\n        let containerOffset = $ab71dadb03a6fb2e$export$622cea445a1c5b7d(containerRef.current, reverse, orientation);\n        let mouseOffset = getPosition(e);\n        let nextOffset = reverse ? containerOffset - mouseOffset : mouseOffset - containerOffset;\n        return nextOffset;\n    };\n    let dragging = $12uGp$useRef(false);\n    let prevPosition = $12uGp$useRef(0);\n    // Keep track of the current handlers in a ref so that the events can access them.\n    let handlers = $12uGp$useRef({\n        onPositionChange: onPositionChange,\n        onDrag: onDrag\n    });\n    handlers.current.onDrag = onDrag;\n    handlers.current.onPositionChange = onPositionChange;\n    let onMouseDragged = (e)=>{\n        e.preventDefault();\n        let nextOffset = getNextOffset(e);\n        if (!dragging.current) {\n            dragging.current = true;\n            if (handlers.current.onDrag) handlers.current.onDrag(true);\n            if (handlers.current.onPositionChange) handlers.current.onPositionChange(nextOffset);\n        }\n        if (prevPosition.current === nextOffset) return;\n        prevPosition.current = nextOffset;\n        if (onPositionChange) onPositionChange(nextOffset);\n    };\n    let onMouseUp = (e)=>{\n        const target = e.target;\n        dragging.current = false;\n        let nextOffset = getNextOffset(e);\n        if (handlers.current.onDrag) handlers.current.onDrag(false);\n        if (handlers.current.onPositionChange) handlers.current.onPositionChange(nextOffset);\n        $9cc09df9fd7676be$var$draggingElements.splice($9cc09df9fd7676be$var$draggingElements.indexOf(target), 1);\n        window.removeEventListener('mouseup', onMouseUp, false);\n        window.removeEventListener('mousemove', onMouseDragged, false);\n    };\n    let onMouseDown = (e)=>{\n        const target = e.currentTarget;\n        // If we're already handling dragging on a descendant with useDrag1D, then\n        // we don't want to handle the drag motion on this target as well.\n        if ($9cc09df9fd7676be$var$draggingElements.some((elt)=>target.contains(elt)\n        )) return;\n        $9cc09df9fd7676be$var$draggingElements.push(target);\n        window.addEventListener('mousemove', onMouseDragged, false);\n        window.addEventListener('mouseup', onMouseUp, false);\n    };\n    let onMouseEnter = ()=>{\n        if (onHover) onHover(true);\n    };\n    let onMouseOut = ()=>{\n        if (onHover) onHover(false);\n    };\n    let onKeyDown = (e)=>{\n        switch(e.key){\n            case 'Left':\n            case 'ArrowLeft':\n                if (orientation === 'horizontal') {\n                    e.preventDefault();\n                    if (onDecrement && !reverse) onDecrement();\n                    else if (onIncrement && reverse) onIncrement();\n                }\n                break;\n            case 'Up':\n            case 'ArrowUp':\n                if (orientation === 'vertical') {\n                    e.preventDefault();\n                    if (onDecrement && !reverse) onDecrement();\n                    else if (onIncrement && reverse) onIncrement();\n                }\n                break;\n            case 'Right':\n            case 'ArrowRight':\n                if (orientation === 'horizontal') {\n                    e.preventDefault();\n                    if (onIncrement && !reverse) onIncrement();\n                    else if (onDecrement && reverse) onDecrement();\n                }\n                break;\n            case 'Down':\n            case 'ArrowDown':\n                if (orientation === 'vertical') {\n                    e.preventDefault();\n                    if (onIncrement && !reverse) onIncrement();\n                    else if (onDecrement && reverse) onDecrement();\n                }\n                break;\n            case 'Home':\n                e.preventDefault();\n                if (onDecrementToMin) onDecrementToMin();\n                break;\n            case 'End':\n                e.preventDefault();\n                if (onIncrementToMax) onIncrementToMax();\n                break;\n            case 'Enter':\n                e.preventDefault();\n                if (onCollapseToggle) onCollapseToggle();\n                break;\n        }\n    };\n    return {\n        onMouseDown: onMouseDown,\n        onMouseEnter: onMouseEnter,\n        onMouseOut: onMouseOut,\n        onKeyDown: onKeyDown\n    };\n}\n\n\nvar $03deb23ff14920c4$exports = {};\n\n$parcel$export($03deb23ff14920c4$exports, \"useGlobalListeners\", () => $03deb23ff14920c4$export$4eaf04e54aa8eed6);\n\nfunction $03deb23ff14920c4$export$4eaf04e54aa8eed6() {\n    let globalListeners = $12uGp$useRef(new Map());\n    let addGlobalListener = $12uGp$useCallback((eventTarget, type, listener, options)=>{\n        // Make sure we remove the listener after it is called with the `once` option.\n        let fn = (options === null || options === void 0 ? void 0 : options.once) ? (...args)=>{\n            globalListeners.current.delete(listener);\n            listener(...args);\n        } : listener;\n        globalListeners.current.set(listener, {\n            type: type,\n            eventTarget: eventTarget,\n            fn: fn,\n            options: options\n        });\n        eventTarget.addEventListener(type, listener, options);\n    }, []);\n    let removeGlobalListener = $12uGp$useCallback((eventTarget, type, listener, options)=>{\n        var ref;\n        let fn = ((ref = globalListeners.current.get(listener)) === null || ref === void 0 ? void 0 : ref.fn) || listener;\n        eventTarget.removeEventListener(type, fn, options);\n        globalListeners.current.delete(listener);\n    }, []);\n    let removeAllGlobalListeners = $12uGp$useCallback(()=>{\n        globalListeners.current.forEach((value, key)=>{\n            removeGlobalListener(value.eventTarget, value.type, key, value.options);\n        });\n    }, [\n        removeGlobalListener\n    ]);\n    // eslint-disable-next-line arrow-body-style\n    $12uGp$useEffect(()=>{\n        return removeAllGlobalListeners;\n    }, [\n        removeAllGlobalListeners\n    ]);\n    return {\n        addGlobalListener: addGlobalListener,\n        removeGlobalListener: removeGlobalListener,\n        removeAllGlobalListeners: removeAllGlobalListeners\n    };\n}\n\n\nvar $313b98861ee5dd6c$exports = {};\n\n$parcel$export($313b98861ee5dd6c$exports, \"useLabels\", () => $313b98861ee5dd6c$export$d6875122194c7b44);\n\nfunction $313b98861ee5dd6c$export$d6875122194c7b44(props, defaultLabel) {\n    let { id: id , 'aria-label': label , 'aria-labelledby': labelledBy  } = props;\n    // If there is both an aria-label and aria-labelledby,\n    // combine them by pointing to the element itself.\n    id = $bdb11010cef70236$export$f680877a34711e37(id);\n    if (labelledBy && label) {\n        let ids = new Set([\n            ...labelledBy.trim().split(/\\s+/),\n            id\n        ]);\n        labelledBy = [\n            ...ids\n        ].join(' ');\n    } else if (labelledBy) labelledBy = labelledBy.trim().split(/\\s+/).join(' ');\n    // If no labels are provided, use the default\n    if (!label && !labelledBy && defaultLabel) label = defaultLabel;\n    return {\n        id: id,\n        'aria-label': label,\n        'aria-labelledby': labelledBy\n    };\n}\n\n\nvar $df56164dff5785e2$exports = {};\n\n$parcel$export($df56164dff5785e2$exports, \"useObjectRef\", () => $df56164dff5785e2$export$4338b53315abf666);\n\n\nfunction $df56164dff5785e2$export$4338b53315abf666(forwardedRef) {\n    const objRef = $12uGp$useRef();\n    /**\n   * We're using `useLayoutEffect` here instead of `useEffect` because we want\n   * to make sure that the `ref` value is up to date before other places in the\n   * the execution cycle try to read it.\n   */ $f0a04ccd8dbdd83b$export$e5c5a5f917a5871c(()=>{\n        if (!forwardedRef) return;\n        if (typeof forwardedRef === 'function') forwardedRef(objRef.current);\n        else forwardedRef.current = objRef.current;\n    }, [\n        forwardedRef\n    ]);\n    return objRef;\n}\n\n\nvar $4f58c5f72bcf79f7$exports = {};\n\n$parcel$export($4f58c5f72bcf79f7$exports, \"useUpdateEffect\", () => $4f58c5f72bcf79f7$export$496315a1608d9602);\n\nfunction $4f58c5f72bcf79f7$export$496315a1608d9602(effect, dependencies) {\n    const isInitialMount = $12uGp$useRef(true);\n    $12uGp$useEffect(()=>{\n        if (isInitialMount.current) isInitialMount.current = false;\n        else effect();\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n    }, dependencies);\n}\n\n\n\nvar $9daab02d461809db$exports = {};\n\n$parcel$export($9daab02d461809db$exports, \"useResizeObserver\", () => $9daab02d461809db$export$683480f191c0e3ea);\n\nfunction $9daab02d461809db$var$hasResizeObserver() {\n    return typeof window.ResizeObserver !== 'undefined';\n}\nfunction $9daab02d461809db$export$683480f191c0e3ea(options) {\n    const { ref: ref , onResize: onResize  } = options;\n    $12uGp$useEffect(()=>{\n        let element = ref === null || ref === void 0 ? void 0 : ref.current;\n        if (!element) return;\n        if (!$9daab02d461809db$var$hasResizeObserver()) {\n            window.addEventListener('resize', onResize, false);\n            return ()=>{\n                window.removeEventListener('resize', onResize, false);\n            };\n        } else {\n            const resizeObserverInstance = new window.ResizeObserver((entries)=>{\n                if (!entries.length) return;\n                onResize();\n            });\n            resizeObserverInstance.observe(element);\n            return ()=>{\n                if (element) resizeObserverInstance.unobserve(element);\n            };\n        }\n    }, [\n        onResize,\n        ref\n    ]);\n}\n\n\nvar $e7801be82b4b2a53$exports = {};\n\n$parcel$export($e7801be82b4b2a53$exports, \"useSyncRef\", () => $e7801be82b4b2a53$export$4debdb1a3f0fa79e);\n\nfunction $e7801be82b4b2a53$export$4debdb1a3f0fa79e(context, ref) {\n    $f0a04ccd8dbdd83b$export$e5c5a5f917a5871c(()=>{\n        if (context && context.ref && ref) {\n            context.ref.current = ref.current;\n            return ()=>{\n                context.ref.current = null;\n            };\n        }\n    }, [\n        context,\n        ref\n    ]);\n}\n\n\nvar $62d8ded9296f3872$exports = {};\n\n$parcel$export($62d8ded9296f3872$exports, \"getScrollParent\", () => $62d8ded9296f3872$export$cfa2225e87938781);\nfunction $62d8ded9296f3872$export$cfa2225e87938781(node) {\n    while(node && !$62d8ded9296f3872$var$isScrollable(node))node = node.parentElement;\n    return node || document.scrollingElement || document.documentElement;\n}\nfunction $62d8ded9296f3872$var$isScrollable(node) {\n    let style = window.getComputedStyle(node);\n    return /(auto|scroll)/.test(style.overflow + style.overflowX + style.overflowY);\n}\n\n\nvar $5df64b3807dc15ee$exports = {};\n\n$parcel$export($5df64b3807dc15ee$exports, \"useViewportSize\", () => $5df64b3807dc15ee$export$d699905dd57c73ca);\n\n// @ts-ignore\nlet $5df64b3807dc15ee$var$visualViewport = typeof window !== 'undefined' && window.visualViewport;\nfunction $5df64b3807dc15ee$export$d699905dd57c73ca() {\n    let [size1, setSize] = $12uGp$useState(()=>$5df64b3807dc15ee$var$getViewportSize()\n    );\n    $12uGp$useEffect(()=>{\n        // Use visualViewport api to track available height even on iOS virtual keyboard opening\n        let onResize = ()=>{\n            setSize((size)=>{\n                let newSize = $5df64b3807dc15ee$var$getViewportSize();\n                if (newSize.width === size.width && newSize.height === size.height) return size;\n                return newSize;\n            });\n        };\n        if (!$5df64b3807dc15ee$var$visualViewport) window.addEventListener('resize', onResize);\n        else $5df64b3807dc15ee$var$visualViewport.addEventListener('resize', onResize);\n        return ()=>{\n            if (!$5df64b3807dc15ee$var$visualViewport) window.removeEventListener('resize', onResize);\n            else $5df64b3807dc15ee$var$visualViewport.removeEventListener('resize', onResize);\n        };\n    }, []);\n    return size1;\n}\nfunction $5df64b3807dc15ee$var$getViewportSize() {\n    return {\n        width: ($5df64b3807dc15ee$var$visualViewport === null || $5df64b3807dc15ee$var$visualViewport === void 0 ? void 0 : $5df64b3807dc15ee$var$visualViewport.width) || window.innerWidth,\n        height: ($5df64b3807dc15ee$var$visualViewport === null || $5df64b3807dc15ee$var$visualViewport === void 0 ? void 0 : $5df64b3807dc15ee$var$visualViewport.height) || window.innerHeight\n    };\n}\n\n\nvar $ef06256079686ba0$exports = {};\n\n$parcel$export($ef06256079686ba0$exports, \"useDescription\", () => $ef06256079686ba0$export$f8aeda7b10753fa1);\n\n\nlet $ef06256079686ba0$var$descriptionId = 0;\nconst $ef06256079686ba0$var$descriptionNodes = new Map();\nfunction $ef06256079686ba0$export$f8aeda7b10753fa1(description) {\n    let [id1, setId] = $12uGp$useState(null);\n    $f0a04ccd8dbdd83b$export$e5c5a5f917a5871c(()=>{\n        if (!description) return;\n        let desc = $ef06256079686ba0$var$descriptionNodes.get(description);\n        if (!desc) {\n            let id = `react-aria-description-${$ef06256079686ba0$var$descriptionId++}`;\n            setId(id);\n            let node = document.createElement('div');\n            node.id = id;\n            node.style.display = 'none';\n            node.textContent = description;\n            document.body.appendChild(node);\n            desc = {\n                refCount: 0,\n                element: node\n            };\n            $ef06256079686ba0$var$descriptionNodes.set(description, desc);\n        } else setId(desc.element.id);\n        desc.refCount++;\n        return ()=>{\n            if (--desc.refCount === 0) {\n                desc.element.remove();\n                $ef06256079686ba0$var$descriptionNodes.delete(description);\n            }\n        };\n    }, [\n        description\n    ]);\n    return {\n        'aria-describedby': description ? id1 : undefined\n    };\n}\n\n\nvar $c87311424ea30a05$exports = {};\n\n$parcel$export($c87311424ea30a05$exports, \"isMac\", () => $c87311424ea30a05$export$9ac100e40613ea10);\n$parcel$export($c87311424ea30a05$exports, \"isIPhone\", () => $c87311424ea30a05$export$186c6964ca17d99);\n$parcel$export($c87311424ea30a05$exports, \"isIPad\", () => $c87311424ea30a05$export$7bef049ce92e4224);\n$parcel$export($c87311424ea30a05$exports, \"isIOS\", () => $c87311424ea30a05$export$fedb369cb70207f1);\n$parcel$export($c87311424ea30a05$exports, \"isAppleDevice\", () => $c87311424ea30a05$export$e1865c3bedcd822b);\n$parcel$export($c87311424ea30a05$exports, \"isWebKit\", () => $c87311424ea30a05$export$78551043582a6a98);\n$parcel$export($c87311424ea30a05$exports, \"isChrome\", () => $c87311424ea30a05$export$6446a186d09e379e);\n$parcel$export($c87311424ea30a05$exports, \"isAndroid\", () => $c87311424ea30a05$export$a11b0059900ceec8);\n/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */ function $c87311424ea30a05$var$testUserAgent(re) {\n    var ref;\n    if (typeof window === 'undefined' || window.navigator == null) return false;\n    return ((ref = window.navigator['userAgentData']) === null || ref === void 0 ? void 0 : ref.brands.some((brand)=>re.test(brand.brand)\n    )) || re.test(window.navigator.userAgent);\n}\nfunction $c87311424ea30a05$var$testPlatform(re) {\n    return typeof window !== 'undefined' && window.navigator != null ? re.test((window.navigator['userAgentData'] || window.navigator).platform) : false;\n}\nfunction $c87311424ea30a05$export$9ac100e40613ea10() {\n    return $c87311424ea30a05$var$testPlatform(/^Mac/i);\n}\nfunction $c87311424ea30a05$export$186c6964ca17d99() {\n    return $c87311424ea30a05$var$testPlatform(/^iPhone/i);\n}\nfunction $c87311424ea30a05$export$7bef049ce92e4224() {\n    return $c87311424ea30a05$var$testPlatform(/^iPad/i) || $c87311424ea30a05$export$9ac100e40613ea10() && navigator.maxTouchPoints > 1;\n}\nfunction $c87311424ea30a05$export$fedb369cb70207f1() {\n    return $c87311424ea30a05$export$186c6964ca17d99() || $c87311424ea30a05$export$7bef049ce92e4224();\n}\nfunction $c87311424ea30a05$export$e1865c3bedcd822b() {\n    return $c87311424ea30a05$export$9ac100e40613ea10() || $c87311424ea30a05$export$fedb369cb70207f1();\n}\nfunction $c87311424ea30a05$export$78551043582a6a98() {\n    return $c87311424ea30a05$var$testUserAgent(/AppleWebKit/i) && !$c87311424ea30a05$export$6446a186d09e379e();\n}\nfunction $c87311424ea30a05$export$6446a186d09e379e() {\n    return $c87311424ea30a05$var$testUserAgent(/Chrome/i);\n}\nfunction $c87311424ea30a05$export$a11b0059900ceec8() {\n    return $c87311424ea30a05$var$testUserAgent(/Android/i);\n}\n\n\nvar $e9faafb641e167db$exports = {};\n\n$parcel$export($e9faafb641e167db$exports, \"useEvent\", () => $e9faafb641e167db$export$90fc3a17d93f704c);\n\nfunction $e9faafb641e167db$export$90fc3a17d93f704c(ref, event, handler1, options) {\n    let handlerRef = $12uGp$useRef(handler1);\n    handlerRef.current = handler1;\n    let isDisabled = handler1 == null;\n    $12uGp$useEffect(()=>{\n        if (isDisabled) return;\n        let element = ref.current;\n        let handler = (e)=>handlerRef.current.call(this, e)\n        ;\n        element.addEventListener(event, handler, options);\n        return ()=>{\n            element.removeEventListener(event, handler, options);\n        };\n    }, [\n        ref,\n        event,\n        options,\n        isDisabled\n    ]);\n}\n\n\nvar $1dbecbe27a04f9af$exports = {};\n\n$parcel$export($1dbecbe27a04f9af$exports, \"useValueEffect\", () => $1dbecbe27a04f9af$export$14d238f342723f25);\n\n\nfunction $1dbecbe27a04f9af$export$14d238f342723f25(defaultValue) {\n    let [value, setValue] = $12uGp$useState(defaultValue);\n    let valueRef = $12uGp$useRef(value);\n    let effect = $12uGp$useRef(null);\n    valueRef.current = value;\n    // Store the function in a ref so we can always access the current version\n    // which has the proper `value` in scope.\n    let nextRef = $12uGp$useRef(null);\n    nextRef.current = ()=>{\n        // Run the generator to the next yield.\n        let newValue = effect.current.next();\n        // If the generator is done, reset the effect.\n        if (newValue.done) {\n            effect.current = null;\n            return;\n        }\n        // If the value is the same as the current value,\n        // then continue to the next yield. Otherwise,\n        // set the value in state and wait for the next layout effect.\n        if (value === newValue.value) nextRef.current();\n        else setValue(newValue.value);\n    };\n    $f0a04ccd8dbdd83b$export$e5c5a5f917a5871c(()=>{\n        // If there is an effect currently running, continue to the next yield.\n        if (effect.current) nextRef.current();\n    });\n    let queue = $12uGp$useCallback((fn)=>{\n        effect.current = fn(valueRef.current);\n        nextRef.current();\n    }, [\n        effect,\n        nextRef\n    ]);\n    return [\n        value,\n        queue\n    ];\n}\n\n\nvar $2f04cbc44ee30ce0$exports = {};\n\n$parcel$export($2f04cbc44ee30ce0$exports, \"scrollIntoView\", () => $2f04cbc44ee30ce0$export$53a0910f038337bd);\nfunction $2f04cbc44ee30ce0$export$53a0910f038337bd(scrollView, element) {\n    let offsetX = $2f04cbc44ee30ce0$var$relativeOffset(scrollView, element, 'left');\n    let offsetY = $2f04cbc44ee30ce0$var$relativeOffset(scrollView, element, 'top');\n    let width = element.offsetWidth;\n    let height = element.offsetHeight;\n    let x = scrollView.scrollLeft;\n    let y = scrollView.scrollTop;\n    let maxX = x + scrollView.offsetWidth;\n    let maxY = y + scrollView.offsetHeight;\n    if (offsetX <= x) x = offsetX;\n    else if (offsetX + width > maxX) x += offsetX + width - maxX;\n    if (offsetY <= y) y = offsetY;\n    else if (offsetY + height > maxY) y += offsetY + height - maxY;\n    scrollView.scrollLeft = x;\n    scrollView.scrollTop = y;\n}\n/**\n * Computes the offset left or top from child to ancestor by accumulating\n * offsetLeft or offsetTop through intervening offsetParents.\n */ function $2f04cbc44ee30ce0$var$relativeOffset(ancestor, child, axis) {\n    const prop = axis === 'left' ? 'offsetLeft' : 'offsetTop';\n    let sum = 0;\n    while(child.offsetParent){\n        sum += child[prop];\n        if (child.offsetParent === ancestor) break;\n        else if (child.offsetParent.contains(ancestor)) {\n            // If the ancestor is not `position:relative`, then we stop at\n            // _its_ offset parent, and we subtract off _its_ offset, so that\n            // we end up with the proper offset from child to ancestor.\n            sum -= ancestor[prop];\n            break;\n        }\n        child = child.offsetParent;\n    }\n    return sum;\n}\n\n\n\n\nexport {$bdb11010cef70236$export$f680877a34711e37 as useId, $bdb11010cef70236$export$cd8c9cb68f842629 as mergeIds, $bdb11010cef70236$export$b4cc09c592e8fdb8 as useSlotId, $ff5963eb1fccf552$export$e08e3b67e392101e as chain, $3ef42575df84b30b$export$9d1611c77c2fe928 as mergeProps, $65484d02dcb7eb3e$export$457c3d6518dd4c6f as filterDOMProps, $7215afc6de606d6b$export$de79e2c695e052f3 as focusWithoutScrolling, $ab71dadb03a6fb2e$export$622cea445a1c5b7d as getOffset, $103b0e103f1b5952$re_export$clamp as clamp, $103b0e103f1b5952$re_export$snapValueToStep as snapValueToStep, $bbed8b41f857bcc0$export$24490316f764c430 as runAfterTransition, $9cc09df9fd7676be$export$7bbed75feba39706 as useDrag1D, $03deb23ff14920c4$export$4eaf04e54aa8eed6 as useGlobalListeners, $313b98861ee5dd6c$export$d6875122194c7b44 as useLabels, $df56164dff5785e2$export$4338b53315abf666 as useObjectRef, $4f58c5f72bcf79f7$export$496315a1608d9602 as useUpdateEffect, $f0a04ccd8dbdd83b$export$e5c5a5f917a5871c as useLayoutEffect, $9daab02d461809db$export$683480f191c0e3ea as useResizeObserver, $e7801be82b4b2a53$export$4debdb1a3f0fa79e as useSyncRef, $62d8ded9296f3872$export$cfa2225e87938781 as getScrollParent, $5df64b3807dc15ee$export$d699905dd57c73ca as useViewportSize, $ef06256079686ba0$export$f8aeda7b10753fa1 as useDescription, $c87311424ea30a05$export$9ac100e40613ea10 as isMac, $c87311424ea30a05$export$186c6964ca17d99 as isIPhone, $c87311424ea30a05$export$7bef049ce92e4224 as isIPad, $c87311424ea30a05$export$fedb369cb70207f1 as isIOS, $c87311424ea30a05$export$e1865c3bedcd822b as isAppleDevice, $c87311424ea30a05$export$78551043582a6a98 as isWebKit, $c87311424ea30a05$export$6446a186d09e379e as isChrome, $c87311424ea30a05$export$a11b0059900ceec8 as isAndroid, $e9faafb641e167db$export$90fc3a17d93f704c as useEvent, $1dbecbe27a04f9af$export$14d238f342723f25 as useValueEffect, $2f04cbc44ee30ce0$export$53a0910f038337bd as scrollIntoView};\n//# sourceMappingURL=module.js.map\n","import {mergeProps as $bx7SL$mergeProps, useSyncRef as $bx7SL$useSyncRef, useGlobalListeners as $bx7SL$useGlobalListeners, focusWithoutScrolling as $bx7SL$focusWithoutScrolling, isIOS as $bx7SL$isIOS, runAfterTransition as $bx7SL$runAfterTransition, isMac as $bx7SL$isMac, useEvent as $bx7SL$useEvent, useDescription as $bx7SL$useDescription} from \"@react-aria/utils\";\nimport $bx7SL$react, {useRef as $bx7SL$useRef, useContext as $bx7SL$useContext, useState as $bx7SL$useState, useMemo as $bx7SL$useMemo, useEffect as $bx7SL$useEffect, useCallback as $bx7SL$useCallback} from \"react\";\n\nfunction $parcel$export(e, n, v, s) {\n  Object.defineProperty(e, n, {get: v, set: s, enumerable: true, configurable: true});\n}\nvar $3b117e43dc0ca95d$exports = {};\n\n$parcel$export($3b117e43dc0ca95d$exports, \"Pressable\", () => $3b117e43dc0ca95d$export$27c701ed9e449e99);\n\nvar $f6c31cce2adf654f$exports = {};\n\n$parcel$export($f6c31cce2adf654f$exports, \"usePress\", () => $f6c31cce2adf654f$export$45712eceda6fad21);\n\n// Note that state only matters here for iOS. Non-iOS gets user-select: none applied to the target element\n// rather than at the document level so we just need to apply/remove user-select: none for each pressed element individually\nlet $14c0b72509d70225$var$state = 'default';\nlet $14c0b72509d70225$var$savedUserSelect = '';\nlet $14c0b72509d70225$var$modifiedElementMap = new WeakMap();\nfunction $14c0b72509d70225$export$16a4697467175487(target) {\n    if ($bx7SL$isIOS()) {\n        if ($14c0b72509d70225$var$state === 'default') {\n            $14c0b72509d70225$var$savedUserSelect = document.documentElement.style.webkitUserSelect;\n            document.documentElement.style.webkitUserSelect = 'none';\n        }\n        $14c0b72509d70225$var$state = 'disabled';\n    } else if (target) {\n        // If not iOS, store the target's original user-select and change to user-select: none\n        // Ignore state since it doesn't apply for non iOS\n        $14c0b72509d70225$var$modifiedElementMap.set(target, target.style.userSelect);\n        target.style.userSelect = 'none';\n    }\n}\nfunction $14c0b72509d70225$export$b0d6fa1ab32e3295(target) {\n    if ($bx7SL$isIOS()) {\n        // If the state is already default, there's nothing to do.\n        // If it is restoring, then there's no need to queue a second restore.\n        if ($14c0b72509d70225$var$state !== 'disabled') return;\n        $14c0b72509d70225$var$state = 'restoring';\n        // There appears to be a delay on iOS where selection still might occur\n        // after pointer up, so wait a bit before removing user-select.\n        setTimeout(()=>{\n            // Wait for any CSS transitions to complete so we don't recompute style\n            // for the whole page in the middle of the animation and cause jank.\n            $bx7SL$runAfterTransition(()=>{\n                // Avoid race conditions\n                if ($14c0b72509d70225$var$state === 'restoring') {\n                    if (document.documentElement.style.webkitUserSelect === 'none') document.documentElement.style.webkitUserSelect = $14c0b72509d70225$var$savedUserSelect || '';\n                    $14c0b72509d70225$var$savedUserSelect = '';\n                    $14c0b72509d70225$var$state = 'default';\n                }\n            });\n        }, 300);\n    } else // If not iOS, restore the target's original user-select if any\n    // Ignore state since it doesn't apply for non iOS\n    if (target && $14c0b72509d70225$var$modifiedElementMap.has(target)) {\n        let targetOldUserSelect = $14c0b72509d70225$var$modifiedElementMap.get(target);\n        if (target.style.userSelect === 'none') target.style.userSelect = targetOldUserSelect;\n        if (target.getAttribute('style') === '') target.removeAttribute('style');\n        $14c0b72509d70225$var$modifiedElementMap.delete(target);\n    }\n}\n\n\n\n\nfunction $8a9cb279dc87e130$export$60278871457622de(event) {\n    // JAWS/NVDA with Firefox.\n    if (event.mozInputSource === 0 && event.isTrusted) return true;\n    return event.detail === 0 && !event.pointerType;\n}\n\n\n\nconst $ae1eeba8b9eafd08$export$5165eccb35aaadb5 = $bx7SL$react.createContext(null);\n$ae1eeba8b9eafd08$export$5165eccb35aaadb5.displayName = 'PressResponderContext';\n\n\nfunction $f6c31cce2adf654f$var$usePressResponderContext(props) {\n    // Consume context from <PressResponder> and merge with props.\n    let context = $bx7SL$useContext($ae1eeba8b9eafd08$export$5165eccb35aaadb5);\n    if (context) {\n        let { register: register , ...contextProps } = context;\n        props = $bx7SL$mergeProps(contextProps, props);\n        register();\n    }\n    $bx7SL$useSyncRef(context, props.ref);\n    return props;\n}\nfunction $f6c31cce2adf654f$export$45712eceda6fad21(props) {\n    let { onPress: onPress1 , onPressChange: onPressChange1 , onPressStart: onPressStart1 , onPressEnd: onPressEnd1 , onPressUp: onPressUp1 , isDisabled: isDisabled1 , isPressed: isPressedProp , preventFocusOnPress: preventFocusOnPress , shouldCancelOnPointerExit: shouldCancelOnPointerExit , allowTextSelectionOnPress: allowTextSelectionOnPress , // eslint-disable-next-line @typescript-eslint/no-unused-vars\n    ref: _ , ...domProps } = $f6c31cce2adf654f$var$usePressResponderContext(props);\n    let propsRef = $bx7SL$useRef(null);\n    propsRef.current = {\n        onPress: onPress1,\n        onPressChange: onPressChange1,\n        onPressStart: onPressStart1,\n        onPressEnd: onPressEnd1,\n        onPressUp: onPressUp1,\n        isDisabled: isDisabled1,\n        shouldCancelOnPointerExit: shouldCancelOnPointerExit\n    };\n    let [isPressed, setPressed] = $bx7SL$useState(false);\n    let ref = $bx7SL$useRef({\n        isPressed: false,\n        ignoreEmulatedMouseEvents: false,\n        ignoreClickAfterPress: false,\n        didFirePressStart: false,\n        activePointerId: null,\n        target: null,\n        isOverTarget: false,\n        pointerType: null\n    });\n    let { addGlobalListener: addGlobalListener , removeAllGlobalListeners: removeAllGlobalListeners  } = $bx7SL$useGlobalListeners();\n    let pressProps1 = $bx7SL$useMemo(()=>{\n        let state = ref.current;\n        let triggerPressStart = (originalEvent, pointerType)=>{\n            let { onPressStart: onPressStart , onPressChange: onPressChange , isDisabled: isDisabled  } = propsRef.current;\n            if (isDisabled || state.didFirePressStart) return;\n            if (onPressStart) onPressStart({\n                type: 'pressstart',\n                pointerType: pointerType,\n                target: originalEvent.currentTarget,\n                shiftKey: originalEvent.shiftKey,\n                metaKey: originalEvent.metaKey,\n                ctrlKey: originalEvent.ctrlKey,\n                altKey: originalEvent.altKey\n            });\n            if (onPressChange) onPressChange(true);\n            state.didFirePressStart = true;\n            setPressed(true);\n        };\n        let triggerPressEnd = (originalEvent, pointerType, wasPressed = true)=>{\n            let { onPressEnd: onPressEnd , onPressChange: onPressChange , onPress: onPress , isDisabled: isDisabled  } = propsRef.current;\n            if (!state.didFirePressStart) return;\n            state.ignoreClickAfterPress = true;\n            state.didFirePressStart = false;\n            if (onPressEnd) onPressEnd({\n                type: 'pressend',\n                pointerType: pointerType,\n                target: originalEvent.currentTarget,\n                shiftKey: originalEvent.shiftKey,\n                metaKey: originalEvent.metaKey,\n                ctrlKey: originalEvent.ctrlKey,\n                altKey: originalEvent.altKey\n            });\n            if (onPressChange) onPressChange(false);\n            setPressed(false);\n            if (onPress && wasPressed && !isDisabled) onPress({\n                type: 'press',\n                pointerType: pointerType,\n                target: originalEvent.currentTarget,\n                shiftKey: originalEvent.shiftKey,\n                metaKey: originalEvent.metaKey,\n                ctrlKey: originalEvent.ctrlKey,\n                altKey: originalEvent.altKey\n            });\n        };\n        let triggerPressUp = (originalEvent, pointerType)=>{\n            let { onPressUp: onPressUp , isDisabled: isDisabled  } = propsRef.current;\n            if (isDisabled) return;\n            if (onPressUp) onPressUp({\n                type: 'pressup',\n                pointerType: pointerType,\n                target: originalEvent.currentTarget,\n                shiftKey: originalEvent.shiftKey,\n                metaKey: originalEvent.metaKey,\n                ctrlKey: originalEvent.ctrlKey,\n                altKey: originalEvent.altKey\n            });\n        };\n        let cancel = (e)=>{\n            if (state.isPressed) {\n                if (state.isOverTarget) triggerPressEnd($f6c31cce2adf654f$var$createEvent(state.target, e), state.pointerType, false);\n                state.isPressed = false;\n                state.isOverTarget = false;\n                state.activePointerId = null;\n                state.pointerType = null;\n                removeAllGlobalListeners();\n                if (!allowTextSelectionOnPress) $14c0b72509d70225$export$b0d6fa1ab32e3295(state.target);\n            }\n        };\n        let pressProps = {\n            onKeyDown (e) {\n                if ($f6c31cce2adf654f$var$isValidKeyboardEvent(e.nativeEvent) && e.currentTarget.contains(e.target)) {\n                    if ($f6c31cce2adf654f$var$shouldPreventDefaultKeyboard(e.target)) e.preventDefault();\n                    e.stopPropagation();\n                    // If the event is repeating, it may have started on a different element\n                    // after which focus moved to the current element. Ignore these events and\n                    // only handle the first key down event.\n                    if (!state.isPressed && !e.repeat) {\n                        state.target = e.currentTarget;\n                        state.isPressed = true;\n                        triggerPressStart(e, 'keyboard');\n                        // Focus may move before the key up event, so register the event on the document\n                        // instead of the same element where the key down event occurred.\n                        addGlobalListener(document, 'keyup', onKeyUp, false);\n                    }\n                }\n            },\n            onKeyUp (e) {\n                if ($f6c31cce2adf654f$var$isValidKeyboardEvent(e.nativeEvent) && !e.repeat && e.currentTarget.contains(e.target)) triggerPressUp($f6c31cce2adf654f$var$createEvent(state.target, e), 'keyboard');\n            },\n            onClick (e) {\n                if (e && !e.currentTarget.contains(e.target)) return;\n                if (e && e.button === 0) {\n                    e.stopPropagation();\n                    if (isDisabled1) e.preventDefault();\n                    // If triggered from a screen reader or by using element.click(),\n                    // trigger as if it were a keyboard click.\n                    if (!state.ignoreClickAfterPress && !state.ignoreEmulatedMouseEvents && (state.pointerType === 'virtual' || $8a9cb279dc87e130$export$60278871457622de(e.nativeEvent))) {\n                        // Ensure the element receives focus (VoiceOver on iOS does not do this)\n                        if (!isDisabled1 && !preventFocusOnPress) $bx7SL$focusWithoutScrolling(e.currentTarget);\n                        triggerPressStart(e, 'virtual');\n                        triggerPressUp(e, 'virtual');\n                        triggerPressEnd(e, 'virtual');\n                    }\n                    state.ignoreEmulatedMouseEvents = false;\n                    state.ignoreClickAfterPress = false;\n                }\n            }\n        };\n        let onKeyUp = (e)=>{\n            if (state.isPressed && $f6c31cce2adf654f$var$isValidKeyboardEvent(e)) {\n                if ($f6c31cce2adf654f$var$shouldPreventDefaultKeyboard(e.target)) e.preventDefault();\n                e.stopPropagation();\n                state.isPressed = false;\n                let target = e.target;\n                triggerPressEnd($f6c31cce2adf654f$var$createEvent(state.target, e), 'keyboard', state.target.contains(target));\n                removeAllGlobalListeners();\n                // If the target is a link, trigger the click method to open the URL,\n                // but defer triggering pressEnd until onClick event handler.\n                if (state.target.contains(target) && $f6c31cce2adf654f$var$isHTMLAnchorLink(state.target) || state.target.getAttribute('role') === 'link') state.target.click();\n            }\n        };\n        if (typeof PointerEvent !== 'undefined') {\n            pressProps.onPointerDown = (e)=>{\n                // Only handle left clicks, and ignore events that bubbled through portals.\n                if (e.button !== 0 || !e.currentTarget.contains(e.target)) return;\n                // iOS safari fires pointer events from VoiceOver with incorrect coordinates/target.\n                // Ignore and let the onClick handler take care of it instead.\n                // https://bugs.webkit.org/show_bug.cgi?id=222627\n                // https://bugs.webkit.org/show_bug.cgi?id=223202\n                if ($f6c31cce2adf654f$var$isVirtualPointerEvent(e.nativeEvent)) {\n                    state.pointerType = 'virtual';\n                    return;\n                }\n                // Due to browser inconsistencies, especially on mobile browsers, we prevent\n                // default on pointer down and handle focusing the pressable element ourselves.\n                if ($f6c31cce2adf654f$var$shouldPreventDefault(e.currentTarget)) e.preventDefault();\n                state.pointerType = e.pointerType;\n                e.stopPropagation();\n                if (!state.isPressed) {\n                    state.isPressed = true;\n                    state.isOverTarget = true;\n                    state.activePointerId = e.pointerId;\n                    state.target = e.currentTarget;\n                    if (!isDisabled1 && !preventFocusOnPress) $bx7SL$focusWithoutScrolling(e.currentTarget);\n                    if (!allowTextSelectionOnPress) $14c0b72509d70225$export$16a4697467175487(state.target);\n                    triggerPressStart(e, state.pointerType);\n                    addGlobalListener(document, 'pointermove', onPointerMove, false);\n                    addGlobalListener(document, 'pointerup', onPointerUp, false);\n                    addGlobalListener(document, 'pointercancel', onPointerCancel, false);\n                }\n            };\n            pressProps.onMouseDown = (e)=>{\n                if (!e.currentTarget.contains(e.target)) return;\n                if (e.button === 0) {\n                    // Chrome and Firefox on touch Windows devices require mouse down events\n                    // to be canceled in addition to pointer events, or an extra asynchronous\n                    // focus event will be fired.\n                    if ($f6c31cce2adf654f$var$shouldPreventDefault(e.currentTarget)) e.preventDefault();\n                    e.stopPropagation();\n                }\n            };\n            pressProps.onPointerUp = (e)=>{\n                // iOS fires pointerup with zero width and height, so check the pointerType recorded during pointerdown.\n                if (!e.currentTarget.contains(e.target) || state.pointerType === 'virtual') return;\n                // Only handle left clicks\n                // Safari on iOS sometimes fires pointerup events, even\n                // when the touch isn't over the target, so double check.\n                if (e.button === 0 && $f6c31cce2adf654f$var$isOverTarget(e, e.currentTarget)) triggerPressUp(e, state.pointerType || e.pointerType);\n            };\n            // Safari on iOS < 13.2 does not implement pointerenter/pointerleave events correctly.\n            // Use pointer move events instead to implement our own hit testing.\n            // See https://bugs.webkit.org/show_bug.cgi?id=199803\n            let onPointerMove = (e)=>{\n                if (e.pointerId !== state.activePointerId) return;\n                if ($f6c31cce2adf654f$var$isOverTarget(e, state.target)) {\n                    if (!state.isOverTarget) {\n                        state.isOverTarget = true;\n                        triggerPressStart($f6c31cce2adf654f$var$createEvent(state.target, e), state.pointerType);\n                    }\n                } else if (state.isOverTarget) {\n                    state.isOverTarget = false;\n                    triggerPressEnd($f6c31cce2adf654f$var$createEvent(state.target, e), state.pointerType, false);\n                    if (propsRef.current.shouldCancelOnPointerExit) cancel(e);\n                }\n            };\n            let onPointerUp = (e)=>{\n                if (e.pointerId === state.activePointerId && state.isPressed && e.button === 0) {\n                    if ($f6c31cce2adf654f$var$isOverTarget(e, state.target)) triggerPressEnd($f6c31cce2adf654f$var$createEvent(state.target, e), state.pointerType);\n                    else if (state.isOverTarget) triggerPressEnd($f6c31cce2adf654f$var$createEvent(state.target, e), state.pointerType, false);\n                    state.isPressed = false;\n                    state.isOverTarget = false;\n                    state.activePointerId = null;\n                    state.pointerType = null;\n                    removeAllGlobalListeners();\n                    if (!allowTextSelectionOnPress) $14c0b72509d70225$export$b0d6fa1ab32e3295(state.target);\n                }\n            };\n            let onPointerCancel = (e)=>{\n                cancel(e);\n            };\n            pressProps.onDragStart = (e)=>{\n                if (!e.currentTarget.contains(e.target)) return;\n                // Safari does not call onPointerCancel when a drag starts, whereas Chrome and Firefox do.\n                cancel(e);\n            };\n        } else {\n            pressProps.onMouseDown = (e)=>{\n                // Only handle left clicks\n                if (e.button !== 0 || !e.currentTarget.contains(e.target)) return;\n                // Due to browser inconsistencies, especially on mobile browsers, we prevent\n                // default on mouse down and handle focusing the pressable element ourselves.\n                if ($f6c31cce2adf654f$var$shouldPreventDefault(e.currentTarget)) e.preventDefault();\n                e.stopPropagation();\n                if (state.ignoreEmulatedMouseEvents) return;\n                state.isPressed = true;\n                state.isOverTarget = true;\n                state.target = e.currentTarget;\n                state.pointerType = $8a9cb279dc87e130$export$60278871457622de(e.nativeEvent) ? 'virtual' : 'mouse';\n                if (!isDisabled1 && !preventFocusOnPress) $bx7SL$focusWithoutScrolling(e.currentTarget);\n                triggerPressStart(e, state.pointerType);\n                addGlobalListener(document, 'mouseup', onMouseUp, false);\n            };\n            pressProps.onMouseEnter = (e)=>{\n                if (!e.currentTarget.contains(e.target)) return;\n                e.stopPropagation();\n                if (state.isPressed && !state.ignoreEmulatedMouseEvents) {\n                    state.isOverTarget = true;\n                    triggerPressStart(e, state.pointerType);\n                }\n            };\n            pressProps.onMouseLeave = (e)=>{\n                if (!e.currentTarget.contains(e.target)) return;\n                e.stopPropagation();\n                if (state.isPressed && !state.ignoreEmulatedMouseEvents) {\n                    state.isOverTarget = false;\n                    triggerPressEnd(e, state.pointerType, false);\n                    if (propsRef.current.shouldCancelOnPointerExit) cancel(e);\n                }\n            };\n            pressProps.onMouseUp = (e)=>{\n                if (!e.currentTarget.contains(e.target)) return;\n                if (!state.ignoreEmulatedMouseEvents && e.button === 0) triggerPressUp(e, state.pointerType);\n            };\n            let onMouseUp = (e)=>{\n                // Only handle left clicks\n                if (e.button !== 0) return;\n                state.isPressed = false;\n                removeAllGlobalListeners();\n                if (state.ignoreEmulatedMouseEvents) {\n                    state.ignoreEmulatedMouseEvents = false;\n                    return;\n                }\n                if ($f6c31cce2adf654f$var$isOverTarget(e, state.target)) triggerPressEnd($f6c31cce2adf654f$var$createEvent(state.target, e), state.pointerType);\n                else if (state.isOverTarget) triggerPressEnd($f6c31cce2adf654f$var$createEvent(state.target, e), state.pointerType, false);\n                state.isOverTarget = false;\n            };\n            pressProps.onTouchStart = (e)=>{\n                if (!e.currentTarget.contains(e.target)) return;\n                e.stopPropagation();\n                let touch = $f6c31cce2adf654f$var$getTouchFromEvent(e.nativeEvent);\n                if (!touch) return;\n                state.activePointerId = touch.identifier;\n                state.ignoreEmulatedMouseEvents = true;\n                state.isOverTarget = true;\n                state.isPressed = true;\n                state.target = e.currentTarget;\n                state.pointerType = 'touch';\n                // Due to browser inconsistencies, especially on mobile browsers, we prevent default\n                // on the emulated mouse event and handle focusing the pressable element ourselves.\n                if (!isDisabled1 && !preventFocusOnPress) $bx7SL$focusWithoutScrolling(e.currentTarget);\n                if (!allowTextSelectionOnPress) $14c0b72509d70225$export$16a4697467175487(state.target);\n                triggerPressStart(e, state.pointerType);\n                addGlobalListener(window, 'scroll', onScroll, true);\n            };\n            pressProps.onTouchMove = (e)=>{\n                if (!e.currentTarget.contains(e.target)) return;\n                e.stopPropagation();\n                if (!state.isPressed) return;\n                let touch = $f6c31cce2adf654f$var$getTouchById(e.nativeEvent, state.activePointerId);\n                if (touch && $f6c31cce2adf654f$var$isOverTarget(touch, e.currentTarget)) {\n                    if (!state.isOverTarget) {\n                        state.isOverTarget = true;\n                        triggerPressStart(e, state.pointerType);\n                    }\n                } else if (state.isOverTarget) {\n                    state.isOverTarget = false;\n                    triggerPressEnd(e, state.pointerType, false);\n                    if (propsRef.current.shouldCancelOnPointerExit) cancel(e);\n                }\n            };\n            pressProps.onTouchEnd = (e)=>{\n                if (!e.currentTarget.contains(e.target)) return;\n                e.stopPropagation();\n                if (!state.isPressed) return;\n                let touch = $f6c31cce2adf654f$var$getTouchById(e.nativeEvent, state.activePointerId);\n                if (touch && $f6c31cce2adf654f$var$isOverTarget(touch, e.currentTarget)) {\n                    triggerPressUp(e, state.pointerType);\n                    triggerPressEnd(e, state.pointerType);\n                } else if (state.isOverTarget) triggerPressEnd(e, state.pointerType, false);\n                state.isPressed = false;\n                state.activePointerId = null;\n                state.isOverTarget = false;\n                state.ignoreEmulatedMouseEvents = true;\n                if (!allowTextSelectionOnPress) $14c0b72509d70225$export$b0d6fa1ab32e3295(state.target);\n                removeAllGlobalListeners();\n            };\n            pressProps.onTouchCancel = (e)=>{\n                if (!e.currentTarget.contains(e.target)) return;\n                e.stopPropagation();\n                if (state.isPressed) cancel(e);\n            };\n            let onScroll = (e)=>{\n                if (state.isPressed && e.target.contains(state.target)) cancel({\n                    currentTarget: state.target,\n                    shiftKey: false,\n                    ctrlKey: false,\n                    metaKey: false,\n                    altKey: false\n                });\n            };\n            pressProps.onDragStart = (e)=>{\n                if (!e.currentTarget.contains(e.target)) return;\n                cancel(e);\n            };\n        }\n        return pressProps;\n    }, [\n        addGlobalListener,\n        isDisabled1,\n        preventFocusOnPress,\n        removeAllGlobalListeners,\n        allowTextSelectionOnPress\n    ]);\n    // Remove user-select: none in case component unmounts immediately after pressStart\n    // eslint-disable-next-line arrow-body-style\n    $bx7SL$useEffect(()=>{\n        return ()=>{\n            if (!allowTextSelectionOnPress) $14c0b72509d70225$export$b0d6fa1ab32e3295(ref.current.target);\n        };\n    }, [\n        allowTextSelectionOnPress\n    ]);\n    return {\n        isPressed: isPressedProp || isPressed,\n        pressProps: $bx7SL$mergeProps(domProps, pressProps1)\n    };\n}\nfunction $f6c31cce2adf654f$var$isHTMLAnchorLink(target) {\n    return target.tagName === 'A' && target.hasAttribute('href');\n}\nfunction $f6c31cce2adf654f$var$isValidKeyboardEvent(event) {\n    const { key: key , code: code , target: target  } = event;\n    const element = target;\n    const { tagName: tagName , isContentEditable: isContentEditable  } = element;\n    const role = element.getAttribute('role');\n    // Accessibility for keyboards. Space and Enter only.\n    // \"Spacebar\" is for IE 11\n    return (key === 'Enter' || key === ' ' || key === 'Spacebar' || code === 'Space') && tagName !== 'INPUT' && tagName !== 'TEXTAREA' && isContentEditable !== true && (!$f6c31cce2adf654f$var$isHTMLAnchorLink(element) || role === 'button' && key !== 'Enter') && // An element with role='link' should only trigger with Enter key\n    !(role === 'link' && key !== 'Enter');\n}\nfunction $f6c31cce2adf654f$var$getTouchFromEvent(event) {\n    const { targetTouches: targetTouches  } = event;\n    if (targetTouches.length > 0) return targetTouches[0];\n    return null;\n}\nfunction $f6c31cce2adf654f$var$getTouchById(event, pointerId) {\n    const changedTouches = event.changedTouches;\n    for(let i = 0; i < changedTouches.length; i++){\n        const touch = changedTouches[i];\n        if (touch.identifier === pointerId) return touch;\n    }\n    return null;\n}\nfunction $f6c31cce2adf654f$var$createEvent(target, e) {\n    return {\n        currentTarget: target,\n        shiftKey: e.shiftKey,\n        ctrlKey: e.ctrlKey,\n        metaKey: e.metaKey,\n        altKey: e.altKey\n    };\n}\nfunction $f6c31cce2adf654f$var$getPointClientRect(point) {\n    let offsetX = point.width / 2 || point.radiusX || 0;\n    let offsetY = point.height / 2 || point.radiusY || 0;\n    return {\n        top: point.clientY - offsetY,\n        right: point.clientX + offsetX,\n        bottom: point.clientY + offsetY,\n        left: point.clientX - offsetX\n    };\n}\nfunction $f6c31cce2adf654f$var$areRectanglesOverlapping(a, b) {\n    // check if they cannot overlap on x axis\n    if (a.left > b.right || b.left > a.right) return false;\n    // check if they cannot overlap on y axis\n    if (a.top > b.bottom || b.top > a.bottom) return false;\n    return true;\n}\nfunction $f6c31cce2adf654f$var$isOverTarget(point, target) {\n    let rect = target.getBoundingClientRect();\n    let pointRect = $f6c31cce2adf654f$var$getPointClientRect(point);\n    return $f6c31cce2adf654f$var$areRectanglesOverlapping(rect, pointRect);\n}\nfunction $f6c31cce2adf654f$var$shouldPreventDefault(target) {\n    // We cannot prevent default if the target is a draggable element.\n    return !target.draggable;\n}\nfunction $f6c31cce2adf654f$var$shouldPreventDefaultKeyboard(target) {\n    return !((target.tagName === 'INPUT' || target.tagName === 'BUTTON') && target.type === 'submit');\n}\nfunction $f6c31cce2adf654f$var$isVirtualPointerEvent(event) {\n    // If the pointer size is zero, then we assume it's from a screen reader.\n    // Android TalkBack double tap will sometimes return a event with width and height of 1\n    // and pointerType === 'mouse' so we need to check for a specific combination of event attributes.\n    // Cannot use \"event.pressure === 0\" as the sole check due to Safari pointer events always returning pressure === 0\n    // instead of .5, see https://bugs.webkit.org/show_bug.cgi?id=206216\n    return event.width === 0 && event.height === 0 || event.width === 1 && event.height === 1 && event.pressure === 0 && event.detail === 0;\n}\n\n\n\nconst $3b117e43dc0ca95d$export$27c701ed9e449e99 = /*#__PURE__*/ $bx7SL$react.forwardRef(({ children: children , ...props }, ref)=>{\n    let newRef = $bx7SL$useRef();\n    ref = ref !== null && ref !== void 0 ? ref : newRef;\n    let { pressProps: pressProps  } = $f6c31cce2adf654f$export$45712eceda6fad21({\n        ...props,\n        ref: ref\n    });\n    let child = $bx7SL$react.Children.only(children);\n    return(/*#__PURE__*/ $bx7SL$react.cloneElement(child, // @ts-ignore\n    {\n        ref: ref,\n        ...$bx7SL$mergeProps(child.props, pressProps)\n    }));\n});\n\n\nvar $f1ab8c75478c6f73$exports = {};\n\n$parcel$export($f1ab8c75478c6f73$exports, \"PressResponder\", () => $f1ab8c75478c6f73$export$3351871ee4b288b8);\n\n\n\nconst $f1ab8c75478c6f73$export$3351871ee4b288b8 = /*#__PURE__*/ $bx7SL$react.forwardRef(({ children: children , ...props }, ref)=>{\n    let isRegistered = $bx7SL$useRef(false);\n    let prevContext = $bx7SL$useContext($ae1eeba8b9eafd08$export$5165eccb35aaadb5);\n    let context = $bx7SL$mergeProps(prevContext || {\n    }, {\n        ...props,\n        ref: ref || (prevContext === null || prevContext === void 0 ? void 0 : prevContext.ref),\n        register () {\n            isRegistered.current = true;\n            if (prevContext) prevContext.register();\n        }\n    });\n    $bx7SL$useSyncRef(prevContext, ref);\n    $bx7SL$useEffect(()=>{\n        if (!isRegistered.current) console.warn(\"A PressResponder was rendered without a pressable child. Either call the usePress hook, or wrap your DOM node with <Pressable> component.\");\n    }, []);\n    return(/*#__PURE__*/ $bx7SL$react.createElement($ae1eeba8b9eafd08$export$5165eccb35aaadb5.Provider, {\n        value: context\n    }, children));\n});\n\n\nvar $a1ea59d68270f0dd$exports = {};\n\n$parcel$export($a1ea59d68270f0dd$exports, \"useFocus\", () => $a1ea59d68270f0dd$export$f8168d8dd8fd66e6);\nfunction $a1ea59d68270f0dd$export$f8168d8dd8fd66e6(props) {\n    if (props.isDisabled) return {\n        focusProps: {\n        }\n    };\n    let onFocus, onBlur;\n    if (props.onFocus || props.onFocusChange) onFocus = (e)=>{\n        if (e.target === e.currentTarget) {\n            if (props.onFocus) props.onFocus(e);\n            if (props.onFocusChange) props.onFocusChange(true);\n        }\n    };\n    if (props.onBlur || props.onFocusChange) onBlur = (e)=>{\n        if (e.target === e.currentTarget) {\n            if (props.onBlur) props.onBlur(e);\n            if (props.onFocusChange) props.onFocusChange(false);\n        }\n    };\n    return {\n        focusProps: {\n            onFocus: onFocus,\n            onBlur: onBlur\n        }\n    };\n}\n\n\nvar $507fabe10e71c6fb$exports = {};\n\n$parcel$export($507fabe10e71c6fb$exports, \"isFocusVisible\", () => $507fabe10e71c6fb$export$b9b3dfddab17db27);\n$parcel$export($507fabe10e71c6fb$exports, \"getInteractionModality\", () => $507fabe10e71c6fb$export$630ff653c5ada6a9);\n$parcel$export($507fabe10e71c6fb$exports, \"setInteractionModality\", () => $507fabe10e71c6fb$export$8397ddfc504fdb9a);\n$parcel$export($507fabe10e71c6fb$exports, \"useInteractionModality\", () => $507fabe10e71c6fb$export$98e20ec92f614cfe);\n$parcel$export($507fabe10e71c6fb$exports, \"useFocusVisible\", () => $507fabe10e71c6fb$export$ffd9e5021c1fb2d6);\n$parcel$export($507fabe10e71c6fb$exports, \"useFocusVisibleListener\", () => $507fabe10e71c6fb$export$ec71b4b83ac08ec3);\n\n\n\nlet $507fabe10e71c6fb$var$currentModality = null;\nlet $507fabe10e71c6fb$var$changeHandlers = new Set();\nlet $507fabe10e71c6fb$var$hasSetupGlobalListeners = false;\nlet $507fabe10e71c6fb$var$hasEventBeforeFocus = false;\nlet $507fabe10e71c6fb$var$hasBlurredWindowRecently = false;\n// Only Tab or Esc keys will make focus visible on text input elements\nconst $507fabe10e71c6fb$var$FOCUS_VISIBLE_INPUT_KEYS = {\n    Tab: true,\n    Escape: true\n};\nfunction $507fabe10e71c6fb$var$triggerChangeHandlers(modality, e) {\n    for (let handler of $507fabe10e71c6fb$var$changeHandlers)handler(modality, e);\n}\n/**\n * Helper function to determine if a KeyboardEvent is unmodified and could make keyboard focus styles visible.\n */ function $507fabe10e71c6fb$var$isValidKey(e) {\n    // Control and Shift keys trigger when navigating back to the tab with keyboard.\n    return !(e.metaKey || !$bx7SL$isMac() && e.altKey || e.ctrlKey || e.key === 'Control' || e.key === 'Shift' || e.key === 'Meta');\n}\nfunction $507fabe10e71c6fb$var$handleKeyboardEvent(e) {\n    $507fabe10e71c6fb$var$hasEventBeforeFocus = true;\n    if ($507fabe10e71c6fb$var$isValidKey(e)) {\n        $507fabe10e71c6fb$var$currentModality = 'keyboard';\n        $507fabe10e71c6fb$var$triggerChangeHandlers('keyboard', e);\n    }\n}\nfunction $507fabe10e71c6fb$var$handlePointerEvent(e) {\n    $507fabe10e71c6fb$var$currentModality = 'pointer';\n    if (e.type === 'mousedown' || e.type === 'pointerdown') {\n        $507fabe10e71c6fb$var$hasEventBeforeFocus = true;\n        $507fabe10e71c6fb$var$triggerChangeHandlers('pointer', e);\n    }\n}\nfunction $507fabe10e71c6fb$var$handleClickEvent(e) {\n    if ($8a9cb279dc87e130$export$60278871457622de(e)) {\n        $507fabe10e71c6fb$var$hasEventBeforeFocus = true;\n        $507fabe10e71c6fb$var$currentModality = 'virtual';\n    }\n}\nfunction $507fabe10e71c6fb$var$handleFocusEvent(e) {\n    // Firefox fires two extra focus events when the user first clicks into an iframe:\n    // first on the window, then on the document. We ignore these events so they don't\n    // cause keyboard focus rings to appear.\n    if (e.target === window || e.target === document) return;\n    // If a focus event occurs without a preceding keyboard or pointer event, switch to virtual modality.\n    // This occurs, for example, when navigating a form with the next/previous buttons on iOS.\n    if (!$507fabe10e71c6fb$var$hasEventBeforeFocus && !$507fabe10e71c6fb$var$hasBlurredWindowRecently) {\n        $507fabe10e71c6fb$var$currentModality = 'virtual';\n        $507fabe10e71c6fb$var$triggerChangeHandlers('virtual', e);\n    }\n    $507fabe10e71c6fb$var$hasEventBeforeFocus = false;\n    $507fabe10e71c6fb$var$hasBlurredWindowRecently = false;\n}\nfunction $507fabe10e71c6fb$var$handleWindowBlur() {\n    // When the window is blurred, reset state. This is necessary when tabbing out of the window,\n    // for example, since a subsequent focus event won't be fired.\n    $507fabe10e71c6fb$var$hasEventBeforeFocus = false;\n    $507fabe10e71c6fb$var$hasBlurredWindowRecently = true;\n}\n/**\n * Setup global event listeners to control when keyboard focus style should be visible.\n */ function $507fabe10e71c6fb$var$setupGlobalFocusEvents() {\n    if (typeof window === 'undefined' || $507fabe10e71c6fb$var$hasSetupGlobalListeners) return;\n    // Programmatic focus() calls shouldn't affect the current input modality.\n    // However, we need to detect other cases when a focus event occurs without\n    // a preceding user event (e.g. screen reader focus). Overriding the focus\n    // method on HTMLElement.prototype is a bit hacky, but works.\n    let focus = HTMLElement.prototype.focus;\n    HTMLElement.prototype.focus = function() {\n        $507fabe10e71c6fb$var$hasEventBeforeFocus = true;\n        focus.apply(this, arguments);\n    };\n    document.addEventListener('keydown', $507fabe10e71c6fb$var$handleKeyboardEvent, true);\n    document.addEventListener('keyup', $507fabe10e71c6fb$var$handleKeyboardEvent, true);\n    document.addEventListener('click', $507fabe10e71c6fb$var$handleClickEvent, true);\n    // Register focus events on the window so they are sure to happen\n    // before React's event listeners (registered on the document).\n    window.addEventListener('focus', $507fabe10e71c6fb$var$handleFocusEvent, true);\n    window.addEventListener('blur', $507fabe10e71c6fb$var$handleWindowBlur, false);\n    if (typeof PointerEvent !== 'undefined') {\n        document.addEventListener('pointerdown', $507fabe10e71c6fb$var$handlePointerEvent, true);\n        document.addEventListener('pointermove', $507fabe10e71c6fb$var$handlePointerEvent, true);\n        document.addEventListener('pointerup', $507fabe10e71c6fb$var$handlePointerEvent, true);\n    } else {\n        document.addEventListener('mousedown', $507fabe10e71c6fb$var$handlePointerEvent, true);\n        document.addEventListener('mousemove', $507fabe10e71c6fb$var$handlePointerEvent, true);\n        document.addEventListener('mouseup', $507fabe10e71c6fb$var$handlePointerEvent, true);\n    }\n    $507fabe10e71c6fb$var$hasSetupGlobalListeners = true;\n}\nif (typeof document !== 'undefined') {\n    if (document.readyState !== 'loading') $507fabe10e71c6fb$var$setupGlobalFocusEvents();\n    else document.addEventListener('DOMContentLoaded', $507fabe10e71c6fb$var$setupGlobalFocusEvents);\n}\nfunction $507fabe10e71c6fb$export$b9b3dfddab17db27() {\n    return $507fabe10e71c6fb$var$currentModality !== 'pointer';\n}\nfunction $507fabe10e71c6fb$export$630ff653c5ada6a9() {\n    return $507fabe10e71c6fb$var$currentModality;\n}\nfunction $507fabe10e71c6fb$export$8397ddfc504fdb9a(modality) {\n    $507fabe10e71c6fb$var$currentModality = modality;\n    $507fabe10e71c6fb$var$triggerChangeHandlers(modality, null);\n}\nfunction $507fabe10e71c6fb$export$98e20ec92f614cfe() {\n    $507fabe10e71c6fb$var$setupGlobalFocusEvents();\n    let [modality, setModality] = $bx7SL$useState($507fabe10e71c6fb$var$currentModality);\n    $bx7SL$useEffect(()=>{\n        let handler = ()=>{\n            setModality($507fabe10e71c6fb$var$currentModality);\n        };\n        $507fabe10e71c6fb$var$changeHandlers.add(handler);\n        return ()=>{\n            $507fabe10e71c6fb$var$changeHandlers.delete(handler);\n        };\n    }, []);\n    return modality;\n}\n/**\n * If this is attached to text input component, return if the event is a focus event (Tab/Escape keys pressed) so that\n * focus visible style can be properly set.\n */ function $507fabe10e71c6fb$var$isKeyboardFocusEvent(isTextInput, modality, e) {\n    return !(isTextInput && modality === 'keyboard' && e instanceof KeyboardEvent && !$507fabe10e71c6fb$var$FOCUS_VISIBLE_INPUT_KEYS[e.key]);\n}\nfunction $507fabe10e71c6fb$export$ffd9e5021c1fb2d6(props = {\n}) {\n    let { isTextInput: isTextInput , autoFocus: autoFocus  } = props;\n    let [isFocusVisibleState, setFocusVisible] = $bx7SL$useState(autoFocus || $507fabe10e71c6fb$export$b9b3dfddab17db27());\n    $507fabe10e71c6fb$export$ec71b4b83ac08ec3(($507fabe10e71c6fb$export$b9b3dfddab17db27)=>{\n        setFocusVisible($507fabe10e71c6fb$export$b9b3dfddab17db27);\n    }, [\n        isTextInput\n    ], {\n        isTextInput: isTextInput\n    });\n    return {\n        isFocusVisible: isFocusVisibleState\n    };\n}\nfunction $507fabe10e71c6fb$export$ec71b4b83ac08ec3(fn, deps, opts) {\n    $507fabe10e71c6fb$var$setupGlobalFocusEvents();\n    $bx7SL$useEffect(()=>{\n        let handler = (modality, e)=>{\n            if (!$507fabe10e71c6fb$var$isKeyboardFocusEvent(opts === null || opts === void 0 ? void 0 : opts.isTextInput, modality, e)) return;\n            fn($507fabe10e71c6fb$export$b9b3dfddab17db27());\n        };\n        $507fabe10e71c6fb$var$changeHandlers.add(handler);\n        return ()=>{\n            $507fabe10e71c6fb$var$changeHandlers.delete(handler);\n        };\n    }, deps);\n}\n\n\nvar $9ab94262bd0047c7$exports = {};\n\n$parcel$export($9ab94262bd0047c7$exports, \"useFocusWithin\", () => $9ab94262bd0047c7$export$420e68273165f4ec);\n\nfunction $9ab94262bd0047c7$export$420e68273165f4ec(props) {\n    let state = $bx7SL$useRef({\n        isFocusWithin: false\n    }).current;\n    if (props.isDisabled) return {\n        focusWithinProps: {\n        }\n    };\n    let onFocus = (e)=>{\n        if (!state.isFocusWithin) {\n            if (props.onFocusWithin) props.onFocusWithin(e);\n            if (props.onFocusWithinChange) props.onFocusWithinChange(true);\n            state.isFocusWithin = true;\n        }\n    };\n    let onBlur = (e)=>{\n        // We don't want to trigger onBlurWithin and then immediately onFocusWithin again\n        // when moving focus inside the element. Only trigger if the currentTarget doesn't\n        // include the relatedTarget (where focus is moving).\n        if (state.isFocusWithin && !e.currentTarget.contains(e.relatedTarget)) {\n            if (props.onBlurWithin) props.onBlurWithin(e);\n            if (props.onFocusWithinChange) props.onFocusWithinChange(false);\n            state.isFocusWithin = false;\n        }\n    };\n    return {\n        focusWithinProps: {\n            onFocus: onFocus,\n            onBlur: onBlur\n        }\n    };\n}\n\n\nvar $6179b936705e76d3$exports = {};\n\n$parcel$export($6179b936705e76d3$exports, \"useHover\", () => $6179b936705e76d3$export$ae780daf29e6d456);\n\n// iOS fires onPointerEnter twice: once with pointerType=\"touch\" and again with pointerType=\"mouse\".\n// We want to ignore these emulated events so they do not trigger hover behavior.\n// See https://bugs.webkit.org/show_bug.cgi?id=214609.\nlet $6179b936705e76d3$var$globalIgnoreEmulatedMouseEvents = false;\nlet $6179b936705e76d3$var$hoverCount = 0;\nfunction $6179b936705e76d3$var$setGlobalIgnoreEmulatedMouseEvents() {\n    $6179b936705e76d3$var$globalIgnoreEmulatedMouseEvents = true;\n    // Clear globalIgnoreEmulatedMouseEvents after a short timeout. iOS fires onPointerEnter\n    // with pointerType=\"mouse\" immediately after onPointerUp and before onFocus. On other\n    // devices that don't have this quirk, we don't want to ignore a mouse hover sometime in\n    // the distant future because a user previously touched the element.\n    setTimeout(()=>{\n        $6179b936705e76d3$var$globalIgnoreEmulatedMouseEvents = false;\n    }, 50);\n}\nfunction $6179b936705e76d3$var$handleGlobalPointerEvent(e) {\n    if (e.pointerType === 'touch') $6179b936705e76d3$var$setGlobalIgnoreEmulatedMouseEvents();\n}\nfunction $6179b936705e76d3$var$setupGlobalTouchEvents() {\n    if (typeof document === 'undefined') return;\n    if (typeof PointerEvent !== 'undefined') document.addEventListener('pointerup', $6179b936705e76d3$var$handleGlobalPointerEvent);\n    else document.addEventListener('touchend', $6179b936705e76d3$var$setGlobalIgnoreEmulatedMouseEvents);\n    $6179b936705e76d3$var$hoverCount++;\n    return ()=>{\n        $6179b936705e76d3$var$hoverCount--;\n        if ($6179b936705e76d3$var$hoverCount > 0) return;\n        if (typeof PointerEvent !== 'undefined') document.removeEventListener('pointerup', $6179b936705e76d3$var$handleGlobalPointerEvent);\n        else document.removeEventListener('touchend', $6179b936705e76d3$var$setGlobalIgnoreEmulatedMouseEvents);\n    };\n}\nfunction $6179b936705e76d3$export$ae780daf29e6d456(props) {\n    let { onHoverStart: onHoverStart , onHoverChange: onHoverChange , onHoverEnd: onHoverEnd , isDisabled: isDisabled  } = props;\n    let [isHovered, setHovered] = $bx7SL$useState(false);\n    let state = $bx7SL$useRef({\n        isHovered: false,\n        ignoreEmulatedMouseEvents: false,\n        pointerType: '',\n        target: null\n    }).current;\n    $bx7SL$useEffect($6179b936705e76d3$var$setupGlobalTouchEvents, []);\n    let { hoverProps: hoverProps1 , triggerHoverEnd: triggerHoverEnd1  } = $bx7SL$useMemo(()=>{\n        let triggerHoverStart = (event, pointerType)=>{\n            state.pointerType = pointerType;\n            if (isDisabled || pointerType === 'touch' || state.isHovered || !event.currentTarget.contains(event.target)) return;\n            state.isHovered = true;\n            let target = event.currentTarget;\n            state.target = target;\n            if (onHoverStart) onHoverStart({\n                type: 'hoverstart',\n                target: target,\n                pointerType: pointerType\n            });\n            if (onHoverChange) onHoverChange(true);\n            setHovered(true);\n        };\n        let triggerHoverEnd = (event, pointerType)=>{\n            state.pointerType = '';\n            state.target = null;\n            if (pointerType === 'touch' || !state.isHovered) return;\n            state.isHovered = false;\n            let target = event.currentTarget;\n            if (onHoverEnd) onHoverEnd({\n                type: 'hoverend',\n                target: target,\n                pointerType: pointerType\n            });\n            if (onHoverChange) onHoverChange(false);\n            setHovered(false);\n        };\n        let hoverProps = {\n        };\n        if (typeof PointerEvent !== 'undefined') {\n            hoverProps.onPointerEnter = (e)=>{\n                if ($6179b936705e76d3$var$globalIgnoreEmulatedMouseEvents && e.pointerType === 'mouse') return;\n                triggerHoverStart(e, e.pointerType);\n            };\n            hoverProps.onPointerLeave = (e)=>{\n                if (!isDisabled && e.currentTarget.contains(e.target)) triggerHoverEnd(e, e.pointerType);\n            };\n        } else {\n            hoverProps.onTouchStart = ()=>{\n                state.ignoreEmulatedMouseEvents = true;\n            };\n            hoverProps.onMouseEnter = (e)=>{\n                if (!state.ignoreEmulatedMouseEvents && !$6179b936705e76d3$var$globalIgnoreEmulatedMouseEvents) triggerHoverStart(e, 'mouse');\n                state.ignoreEmulatedMouseEvents = false;\n            };\n            hoverProps.onMouseLeave = (e)=>{\n                if (!isDisabled && e.currentTarget.contains(e.target)) triggerHoverEnd(e, 'mouse');\n            };\n        }\n        return {\n            hoverProps: hoverProps,\n            triggerHoverEnd: triggerHoverEnd\n        };\n    }, [\n        onHoverStart,\n        onHoverChange,\n        onHoverEnd,\n        isDisabled,\n        state\n    ]);\n    $bx7SL$useEffect(()=>{\n        // Call the triggerHoverEnd as soon as isDisabled changes to true\n        // Safe to call triggerHoverEnd, it will early return if we aren't currently hovering\n        if (isDisabled) triggerHoverEnd1({\n            currentTarget: state.target\n        }, state.pointerType);\n    }, [\n        isDisabled\n    ]);\n    return {\n        hoverProps: hoverProps1,\n        isHovered: isHovered\n    };\n}\n\n\nvar $e0b6e0b68ec7f50f$exports = {};\n\n$parcel$export($e0b6e0b68ec7f50f$exports, \"useInteractOutside\", () => $e0b6e0b68ec7f50f$export$872b660ac5a1ff98);\n\nfunction $e0b6e0b68ec7f50f$export$872b660ac5a1ff98(props) {\n    let { ref: ref , onInteractOutside: onInteractOutside , isDisabled: isDisabled , onInteractOutsideStart: onInteractOutsideStart  } = props;\n    let stateRef = $bx7SL$useRef({\n        isPointerDown: false,\n        ignoreEmulatedMouseEvents: false,\n        onInteractOutside: onInteractOutside,\n        onInteractOutsideStart: onInteractOutsideStart\n    });\n    let state = stateRef.current;\n    state.onInteractOutside = onInteractOutside;\n    state.onInteractOutsideStart = onInteractOutsideStart;\n    $bx7SL$useEffect(()=>{\n        if (isDisabled) return;\n        let onPointerDown = (e)=>{\n            if ($e0b6e0b68ec7f50f$var$isValidEvent(e, ref) && state.onInteractOutside) {\n                if (state.onInteractOutsideStart) state.onInteractOutsideStart(e);\n                state.isPointerDown = true;\n            }\n        };\n        // Use pointer events if available. Otherwise, fall back to mouse and touch events.\n        if (typeof PointerEvent !== 'undefined') {\n            let onPointerUp = (e)=>{\n                if (state.isPointerDown && state.onInteractOutside && $e0b6e0b68ec7f50f$var$isValidEvent(e, ref)) {\n                    state.isPointerDown = false;\n                    state.onInteractOutside(e);\n                }\n            };\n            // changing these to capture phase fixed combobox\n            document.addEventListener('pointerdown', onPointerDown, true);\n            document.addEventListener('pointerup', onPointerUp, true);\n            return ()=>{\n                document.removeEventListener('pointerdown', onPointerDown, true);\n                document.removeEventListener('pointerup', onPointerUp, true);\n            };\n        } else {\n            let onMouseUp = (e)=>{\n                if (state.ignoreEmulatedMouseEvents) state.ignoreEmulatedMouseEvents = false;\n                else if (state.isPointerDown && state.onInteractOutside && $e0b6e0b68ec7f50f$var$isValidEvent(e, ref)) {\n                    state.isPointerDown = false;\n                    state.onInteractOutside(e);\n                }\n            };\n            let onTouchEnd = (e)=>{\n                state.ignoreEmulatedMouseEvents = true;\n                if (state.onInteractOutside && state.isPointerDown && $e0b6e0b68ec7f50f$var$isValidEvent(e, ref)) {\n                    state.isPointerDown = false;\n                    state.onInteractOutside(e);\n                }\n            };\n            document.addEventListener('mousedown', onPointerDown, true);\n            document.addEventListener('mouseup', onMouseUp, true);\n            document.addEventListener('touchstart', onPointerDown, true);\n            document.addEventListener('touchend', onTouchEnd, true);\n            return ()=>{\n                document.removeEventListener('mousedown', onPointerDown, true);\n                document.removeEventListener('mouseup', onMouseUp, true);\n                document.removeEventListener('touchstart', onPointerDown, true);\n                document.removeEventListener('touchend', onTouchEnd, true);\n            };\n        }\n    }, [\n        ref,\n        state,\n        isDisabled\n    ]);\n}\nfunction $e0b6e0b68ec7f50f$var$isValidEvent(event, ref) {\n    if (event.button > 0) return false;\n    // if the event target is no longer in the document\n    if (event.target) {\n        const ownerDocument = event.target.ownerDocument;\n        if (!ownerDocument || !ownerDocument.documentElement.contains(event.target)) return false;\n    }\n    return ref.current && !ref.current.contains(event.target);\n}\n\n\nvar $46d819fcbaf35654$exports = {};\n\n$parcel$export($46d819fcbaf35654$exports, \"useKeyboard\", () => $46d819fcbaf35654$export$8f71654801c2f7cd);\nfunction $93925083ecbb358c$export$48d1ea6320830260(handler) {\n    if (!handler) return;\n    let shouldStopPropagation = true;\n    return (e)=>{\n        let event = {\n            ...e,\n            preventDefault () {\n                e.preventDefault();\n            },\n            isDefaultPrevented () {\n                return e.isDefaultPrevented();\n            },\n            stopPropagation () {\n                console.error('stopPropagation is now the default behavior for events in React Spectrum. You can use continuePropagation() to revert this behavior.');\n            },\n            continuePropagation () {\n                shouldStopPropagation = false;\n            }\n        };\n        handler(event);\n        if (shouldStopPropagation) e.stopPropagation();\n    };\n}\n\n\nfunction $46d819fcbaf35654$export$8f71654801c2f7cd(props) {\n    return {\n        keyboardProps: props.isDisabled ? {\n        } : {\n            onKeyDown: $93925083ecbb358c$export$48d1ea6320830260(props.onKeyDown),\n            onKeyUp: $93925083ecbb358c$export$48d1ea6320830260(props.onKeyUp)\n        }\n    };\n}\n\n\nvar $e8a7022cf87cba2a$exports = {};\n\n$parcel$export($e8a7022cf87cba2a$exports, \"useMove\", () => $e8a7022cf87cba2a$export$36da96379f79f245);\n\n\n\nfunction $e8a7022cf87cba2a$export$36da96379f79f245(props) {\n    let { onMoveStart: onMoveStart , onMove: onMove , onMoveEnd: onMoveEnd  } = props;\n    let state = $bx7SL$useRef({\n        didMove: false,\n        lastPosition: null,\n        id: null\n    });\n    let { addGlobalListener: addGlobalListener , removeGlobalListener: removeGlobalListener  } = $bx7SL$useGlobalListeners();\n    let moveProps1 = $bx7SL$useMemo(()=>{\n        let moveProps = {\n        };\n        let start = ()=>{\n            $14c0b72509d70225$export$16a4697467175487();\n            state.current.didMove = false;\n        };\n        let move = (originalEvent, pointerType, deltaX, deltaY)=>{\n            if (deltaX === 0 && deltaY === 0) return;\n            if (!state.current.didMove) {\n                state.current.didMove = true;\n                onMoveStart === null || onMoveStart === void 0 ? void 0 : onMoveStart({\n                    type: 'movestart',\n                    pointerType: pointerType,\n                    shiftKey: originalEvent.shiftKey,\n                    metaKey: originalEvent.metaKey,\n                    ctrlKey: originalEvent.ctrlKey,\n                    altKey: originalEvent.altKey\n                });\n            }\n            onMove({\n                type: 'move',\n                pointerType: pointerType,\n                deltaX: deltaX,\n                deltaY: deltaY,\n                shiftKey: originalEvent.shiftKey,\n                metaKey: originalEvent.metaKey,\n                ctrlKey: originalEvent.ctrlKey,\n                altKey: originalEvent.altKey\n            });\n        };\n        let end = (originalEvent, pointerType)=>{\n            $14c0b72509d70225$export$b0d6fa1ab32e3295();\n            if (state.current.didMove) onMoveEnd === null || onMoveEnd === void 0 ? void 0 : onMoveEnd({\n                type: 'moveend',\n                pointerType: pointerType,\n                shiftKey: originalEvent.shiftKey,\n                metaKey: originalEvent.metaKey,\n                ctrlKey: originalEvent.ctrlKey,\n                altKey: originalEvent.altKey\n            });\n        };\n        if (typeof PointerEvent === 'undefined') {\n            let onMouseMove = (e)=>{\n                if (e.button === 0) {\n                    move(e, 'mouse', e.pageX - state.current.lastPosition.pageX, e.pageY - state.current.lastPosition.pageY);\n                    state.current.lastPosition = {\n                        pageX: e.pageX,\n                        pageY: e.pageY\n                    };\n                }\n            };\n            let onMouseUp = (e)=>{\n                if (e.button === 0) {\n                    end(e, 'mouse');\n                    removeGlobalListener(window, 'mousemove', onMouseMove, false);\n                    removeGlobalListener(window, 'mouseup', onMouseUp, false);\n                }\n            };\n            moveProps.onMouseDown = (e)=>{\n                if (e.button === 0) {\n                    start();\n                    e.stopPropagation();\n                    e.preventDefault();\n                    state.current.lastPosition = {\n                        pageX: e.pageX,\n                        pageY: e.pageY\n                    };\n                    addGlobalListener(window, 'mousemove', onMouseMove, false);\n                    addGlobalListener(window, 'mouseup', onMouseUp, false);\n                }\n            };\n            let onTouchMove = (e)=>{\n                let touch = [\n                    ...e.changedTouches\n                ].findIndex(({ identifier: identifier  })=>identifier === state.current.id\n                );\n                if (touch >= 0) {\n                    let { pageX: pageX , pageY: pageY  } = e.changedTouches[touch];\n                    move(e, 'touch', pageX - state.current.lastPosition.pageX, pageY - state.current.lastPosition.pageY);\n                    state.current.lastPosition = {\n                        pageX: pageX,\n                        pageY: pageY\n                    };\n                }\n            };\n            let onTouchEnd = (e)=>{\n                let touch = [\n                    ...e.changedTouches\n                ].findIndex(({ identifier: identifier  })=>identifier === state.current.id\n                );\n                if (touch >= 0) {\n                    end(e, 'touch');\n                    state.current.id = null;\n                    removeGlobalListener(window, 'touchmove', onTouchMove);\n                    removeGlobalListener(window, 'touchend', onTouchEnd);\n                    removeGlobalListener(window, 'touchcancel', onTouchEnd);\n                }\n            };\n            moveProps.onTouchStart = (e)=>{\n                if (e.changedTouches.length === 0 || state.current.id != null) return;\n                let { pageX: pageX , pageY: pageY , identifier: identifier  } = e.changedTouches[0];\n                start();\n                e.stopPropagation();\n                e.preventDefault();\n                state.current.lastPosition = {\n                    pageX: pageX,\n                    pageY: pageY\n                };\n                state.current.id = identifier;\n                addGlobalListener(window, 'touchmove', onTouchMove, false);\n                addGlobalListener(window, 'touchend', onTouchEnd, false);\n                addGlobalListener(window, 'touchcancel', onTouchEnd, false);\n            };\n        } else {\n            let onPointerMove = (e)=>{\n                if (e.pointerId === state.current.id) {\n                    let pointerType = e.pointerType || 'mouse';\n                    // Problems with PointerEvent#movementX/movementY:\n                    // 1. it is always 0 on macOS Safari.\n                    // 2. On Chrome Android, it's scaled by devicePixelRatio, but not on Chrome macOS\n                    move(e, pointerType, e.pageX - state.current.lastPosition.pageX, e.pageY - state.current.lastPosition.pageY);\n                    state.current.lastPosition = {\n                        pageX: e.pageX,\n                        pageY: e.pageY\n                    };\n                }\n            };\n            let onPointerUp = (e)=>{\n                if (e.pointerId === state.current.id) {\n                    let pointerType = e.pointerType || 'mouse';\n                    end(e, pointerType);\n                    state.current.id = null;\n                    removeGlobalListener(window, 'pointermove', onPointerMove, false);\n                    removeGlobalListener(window, 'pointerup', onPointerUp, false);\n                    removeGlobalListener(window, 'pointercancel', onPointerUp, false);\n                }\n            };\n            moveProps.onPointerDown = (e)=>{\n                if (e.button === 0 && state.current.id == null) {\n                    start();\n                    e.stopPropagation();\n                    e.preventDefault();\n                    state.current.lastPosition = {\n                        pageX: e.pageX,\n                        pageY: e.pageY\n                    };\n                    state.current.id = e.pointerId;\n                    addGlobalListener(window, 'pointermove', onPointerMove, false);\n                    addGlobalListener(window, 'pointerup', onPointerUp, false);\n                    addGlobalListener(window, 'pointercancel', onPointerUp, false);\n                }\n            };\n        }\n        let triggerKeyboardMove = (e, deltaX, deltaY)=>{\n            start();\n            move(e, 'keyboard', deltaX, deltaY);\n            end(e, 'keyboard');\n        };\n        moveProps.onKeyDown = (e)=>{\n            switch(e.key){\n                case 'Left':\n                case 'ArrowLeft':\n                    e.preventDefault();\n                    e.stopPropagation();\n                    triggerKeyboardMove(e, -1, 0);\n                    break;\n                case 'Right':\n                case 'ArrowRight':\n                    e.preventDefault();\n                    e.stopPropagation();\n                    triggerKeyboardMove(e, 1, 0);\n                    break;\n                case 'Up':\n                case 'ArrowUp':\n                    e.preventDefault();\n                    e.stopPropagation();\n                    triggerKeyboardMove(e, 0, -1);\n                    break;\n                case 'Down':\n                case 'ArrowDown':\n                    e.preventDefault();\n                    e.stopPropagation();\n                    triggerKeyboardMove(e, 0, 1);\n                    break;\n            }\n        };\n        return moveProps;\n    }, [\n        state,\n        onMoveStart,\n        onMove,\n        onMoveEnd,\n        addGlobalListener,\n        removeGlobalListener\n    ]);\n    return {\n        moveProps: moveProps1\n    };\n}\n\n\n\nvar $7d0a636d7a4dcefd$exports = {};\n\n$parcel$export($7d0a636d7a4dcefd$exports, \"useScrollWheel\", () => $7d0a636d7a4dcefd$export$2123ff2b87c81ca);\n\n\nfunction $7d0a636d7a4dcefd$export$2123ff2b87c81ca(props, ref) {\n    let { onScroll: onScroll , isDisabled: isDisabled  } = props;\n    let onScrollHandler = $bx7SL$useCallback((e)=>{\n        // If the ctrlKey is pressed, this is a zoom event, do nothing.\n        if (e.ctrlKey) return;\n        // stop scrolling the page\n        e.preventDefault();\n        e.stopPropagation();\n        if (onScroll) onScroll({\n            deltaX: e.deltaX,\n            deltaY: e.deltaY\n        });\n    }, [\n        onScroll\n    ]);\n    $bx7SL$useEvent(ref, 'wheel', isDisabled ? null : onScrollHandler);\n}\n\n\nvar $8a26561d2877236e$exports = {};\n\n$parcel$export($8a26561d2877236e$exports, \"useLongPress\", () => $8a26561d2877236e$export$c24ed0104d07eab9);\n\n\n\nconst $8a26561d2877236e$var$DEFAULT_THRESHOLD = 500;\nfunction $8a26561d2877236e$export$c24ed0104d07eab9(props) {\n    let { isDisabled: isDisabled , onLongPressStart: onLongPressStart , onLongPressEnd: onLongPressEnd , onLongPress: onLongPress , threshold: threshold = $8a26561d2877236e$var$DEFAULT_THRESHOLD , accessibilityDescription: accessibilityDescription  } = props;\n    const timeRef = $bx7SL$useRef(null);\n    let { addGlobalListener: addGlobalListener , removeGlobalListener: removeGlobalListener  } = $bx7SL$useGlobalListeners();\n    let { pressProps: pressProps  } = $f6c31cce2adf654f$export$45712eceda6fad21({\n        isDisabled: isDisabled,\n        onPressStart (e1) {\n            if (e1.pointerType === 'mouse' || e1.pointerType === 'touch') {\n                if (onLongPressStart) onLongPressStart({\n                    ...e1,\n                    type: 'longpressstart'\n                });\n                timeRef.current = setTimeout(()=>{\n                    // Prevent other usePress handlers from also handling this event.\n                    e1.target.dispatchEvent(new PointerEvent('pointercancel', {\n                        bubbles: true\n                    }));\n                    if (onLongPress) onLongPress({\n                        ...e1,\n                        type: 'longpress'\n                    });\n                    timeRef.current = null;\n                }, threshold);\n                // Prevent context menu, which may be opened on long press on touch devices\n                if (e1.pointerType === 'touch') {\n                    let onContextMenu = (e)=>{\n                        e.preventDefault();\n                    };\n                    addGlobalListener(e1.target, 'contextmenu', onContextMenu, {\n                        once: true\n                    });\n                    addGlobalListener(window, 'pointerup', ()=>{\n                        // If no contextmenu event is fired quickly after pointerup, remove the handler\n                        // so future context menu events outside a long press are not prevented.\n                        setTimeout(()=>{\n                            removeGlobalListener(e1.target, 'contextmenu', onContextMenu);\n                        }, 30);\n                    }, {\n                        once: true\n                    });\n                }\n            }\n        },\n        onPressEnd (e) {\n            if (timeRef.current) clearTimeout(timeRef.current);\n            if (onLongPressEnd && (e.pointerType === 'mouse' || e.pointerType === 'touch')) onLongPressEnd({\n                ...e,\n                type: 'longpressend'\n            });\n        }\n    });\n    let descriptionProps = $bx7SL$useDescription(onLongPress && !isDisabled ? accessibilityDescription : null);\n    return {\n        longPressProps: $bx7SL$mergeProps(pressProps, descriptionProps)\n    };\n}\n\n\n\n\nexport {$3b117e43dc0ca95d$export$27c701ed9e449e99 as Pressable, $f1ab8c75478c6f73$export$3351871ee4b288b8 as PressResponder, $a1ea59d68270f0dd$export$f8168d8dd8fd66e6 as useFocus, $507fabe10e71c6fb$export$b9b3dfddab17db27 as isFocusVisible, $507fabe10e71c6fb$export$630ff653c5ada6a9 as getInteractionModality, $507fabe10e71c6fb$export$8397ddfc504fdb9a as setInteractionModality, $507fabe10e71c6fb$export$98e20ec92f614cfe as useInteractionModality, $507fabe10e71c6fb$export$ffd9e5021c1fb2d6 as useFocusVisible, $507fabe10e71c6fb$export$ec71b4b83ac08ec3 as useFocusVisibleListener, $9ab94262bd0047c7$export$420e68273165f4ec as useFocusWithin, $6179b936705e76d3$export$ae780daf29e6d456 as useHover, $e0b6e0b68ec7f50f$export$872b660ac5a1ff98 as useInteractOutside, $46d819fcbaf35654$export$8f71654801c2f7cd as useKeyboard, $e8a7022cf87cba2a$export$36da96379f79f245 as useMove, $f6c31cce2adf654f$export$45712eceda6fad21 as usePress, $7d0a636d7a4dcefd$export$2123ff2b87c81ca as useScrollWheel, $8a26561d2877236e$export$c24ed0104d07eab9 as useLongPress};\n//# sourceMappingURL=module.js.map\n","import {mergeProps as $9BxnE$mergeProps} from \"@react-aria/utils\";\nimport $9BxnE$react, {useState as $9BxnE$useState, useMemo as $9BxnE$useMemo} from \"react\";\nimport {useFocus as $9BxnE$useFocus} from \"@react-aria/interactions\";\n\nfunction $parcel$export(e, n, v, s) {\n  Object.defineProperty(e, n, {get: v, set: s, enumerable: true, configurable: true});\n}\nvar $5c3e21d68f1c4674$exports = {};\n\n$parcel$export($5c3e21d68f1c4674$exports, \"useVisuallyHidden\", () => $5c3e21d68f1c4674$export$a966af930f325cab);\n$parcel$export($5c3e21d68f1c4674$exports, \"VisuallyHidden\", () => $5c3e21d68f1c4674$export$439d29a4e110a164);\n\n\n\nconst $5c3e21d68f1c4674$var$styles = {\n    border: 0,\n    clip: 'rect(0 0 0 0)',\n    clipPath: 'inset(50%)',\n    height: 1,\n    margin: '0 -1px -1px 0',\n    overflow: 'hidden',\n    padding: 0,\n    position: 'absolute',\n    width: 1,\n    whiteSpace: 'nowrap'\n};\nfunction $5c3e21d68f1c4674$export$a966af930f325cab(props = {\n}) {\n    let { style: style , isFocusable: isFocusable  } = props;\n    let [isFocused, setFocused] = $9BxnE$useState(false);\n    let { focusProps: focusProps  } = $9BxnE$useFocus({\n        isDisabled: !isFocusable,\n        onFocusChange: setFocused\n    });\n    // If focused, don't hide the element.\n    let combinedStyles = $9BxnE$useMemo(()=>{\n        if (isFocused) return style;\n        else if (style) return {\n            ...$5c3e21d68f1c4674$var$styles,\n            ...style\n        };\n        else return $5c3e21d68f1c4674$var$styles;\n    }, [\n        isFocused\n    ]);\n    return {\n        visuallyHiddenProps: {\n            ...focusProps,\n            style: combinedStyles\n        }\n    };\n}\nfunction $5c3e21d68f1c4674$export$439d29a4e110a164(props) {\n    // eslint-disable-next-line @typescript-eslint/no-unused-vars\n    let { children: children , elementType: Element = 'div' , isFocusable: isFocusable , style: style , ...otherProps } = props;\n    let { visuallyHiddenProps: visuallyHiddenProps  } = $5c3e21d68f1c4674$export$a966af930f325cab(props);\n    return(/*#__PURE__*/ $9BxnE$react.createElement(Element, $9BxnE$mergeProps(otherProps, visuallyHiddenProps), children));\n}\n\n\n\n\nexport {$5c3e21d68f1c4674$export$a966af930f325cab as useVisuallyHidden, $5c3e21d68f1c4674$export$439d29a4e110a164 as VisuallyHidden};\n//# sourceMappingURL=module.js.map\n","export default {}","/* build: `node build.js modules=ALL exclude=gestures,accessors,erasing requirejs minifier=uglifyjs` */\n/*! Fabric.js Copyright 2008-2015, Printio (Juriy Zaytsev, Maxim Chernyak) */\n\nvar fabric = fabric || { version: '4.6.0' };\nif (typeof exports !== 'undefined') {\n  exports.fabric = fabric;\n}\n/* _AMD_START_ */\nelse if (typeof define === 'function' && define.amd) {\n  define([], function() { return fabric; });\n}\n/* _AMD_END_ */\nif (typeof document !== 'undefined' && typeof window !== 'undefined') {\n  if (document instanceof (typeof HTMLDocument !== 'undefined' ? HTMLDocument : Document)) {\n    fabric.document = document;\n  }\n  else {\n    fabric.document = document.implementation.createHTMLDocument('');\n  }\n  fabric.window = window;\n}\nelse {\n  // assume we're running under node.js when document/window are not present\n  var jsdom = require('jsdom');\n  var virtualWindow = new jsdom.JSDOM(\n    decodeURIComponent('%3C!DOCTYPE%20html%3E%3Chtml%3E%3Chead%3E%3C%2Fhead%3E%3Cbody%3E%3C%2Fbody%3E%3C%2Fhtml%3E'),\n    {\n      features: {\n        FetchExternalResources: ['img']\n      },\n      resources: 'usable'\n    }).window;\n  fabric.document = virtualWindow.document;\n  fabric.jsdomImplForWrapper = require('jsdom/lib/jsdom/living/generated/utils').implForWrapper;\n  fabric.nodeCanvas = require('jsdom/lib/jsdom/utils').Canvas;\n  fabric.window = virtualWindow;\n  DOMParser = fabric.window.DOMParser;\n}\n\n/**\n * True when in environment that supports touch events\n * @type boolean\n */\nfabric.isTouchSupported = 'ontouchstart' in fabric.window || 'ontouchstart' in fabric.document ||\n  (fabric.window && fabric.window.navigator && fabric.window.navigator.maxTouchPoints > 0);\n\n/**\n * True when in environment that's probably Node.js\n * @type boolean\n */\nfabric.isLikelyNode = typeof Buffer !== 'undefined' &&\n                      typeof window === 'undefined';\n\n/* _FROM_SVG_START_ */\n/**\n * Attributes parsed from all SVG elements\n * @type array\n */\nfabric.SHARED_ATTRIBUTES = [\n  'display',\n  'transform',\n  'fill', 'fill-opacity', 'fill-rule',\n  'opacity',\n  'stroke', 'stroke-dasharray', 'stroke-linecap', 'stroke-dashoffset',\n  'stroke-linejoin', 'stroke-miterlimit',\n  'stroke-opacity', 'stroke-width',\n  'id', 'paint-order', 'vector-effect',\n  'instantiated_by_use', 'clip-path',\n];\n/* _FROM_SVG_END_ */\n\n/**\n * Pixel per Inch as a default value set to 96. Can be changed for more realistic conversion.\n */\nfabric.DPI = 96;\nfabric.reNum = '(?:[-+]?(?:\\\\d+|\\\\d*\\\\.\\\\d+)(?:[eE][-+]?\\\\d+)?)';\nfabric.commaWsp = '(?:\\\\s+,?\\\\s*|,\\\\s*)';\nfabric.rePathCommand = /([-+]?((\\d+\\.\\d+)|((\\d+)|(\\.\\d+)))(?:[eE][-+]?\\d+)?)/ig;\nfabric.reNonWord = /[ \\n\\.,;!\\?\\-]/;\nfabric.fontPaths = { };\nfabric.iMatrix = [1, 0, 0, 1, 0, 0];\nfabric.svgNS = 'http://www.w3.org/2000/svg';\n\n/**\n * Pixel limit for cache canvases. 1Mpx , 4Mpx should be fine.\n * @since 1.7.14\n * @type Number\n * @default\n */\nfabric.perfLimitSizeTotal = 2097152;\n\n/**\n * Pixel limit for cache canvases width or height. IE fixes the maximum at 5000\n * @since 1.7.14\n * @type Number\n * @default\n */\nfabric.maxCacheSideLimit = 4096;\n\n/**\n * Lowest pixel limit for cache canvases, set at 256PX\n * @since 1.7.14\n * @type Number\n * @default\n */\nfabric.minCacheSideLimit = 256;\n\n/**\n * Cache Object for widths of chars in text rendering.\n */\nfabric.charWidthsCache = { };\n\n/**\n * if webgl is enabled and available, textureSize will determine the size\n * of the canvas backend\n * @since 2.0.0\n * @type Number\n * @default\n */\nfabric.textureSize = 2048;\n\n/**\n * When 'true', style information is not retained when copy/pasting text, making\n * pasted text use destination style.\n * Defaults to 'false'.\n * @type Boolean\n * @default\n */\nfabric.disableStyleCopyPaste = false;\n\n/**\n * Enable webgl for filtering picture is available\n * A filtering backend will be initialized, this will both take memory and\n * time since a default 2048x2048 canvas will be created for the gl context\n * @since 2.0.0\n * @type Boolean\n * @default\n */\nfabric.enableGLFiltering = true;\n\n/**\n * Device Pixel Ratio\n * @see https://developer.apple.com/library/safari/documentation/AudioVideo/Conceptual/HTML-canvas-guide/SettingUptheCanvas/SettingUptheCanvas.html\n */\nfabric.devicePixelRatio = fabric.window.devicePixelRatio ||\n                          fabric.window.webkitDevicePixelRatio ||\n                          fabric.window.mozDevicePixelRatio ||\n                          1;\n/**\n * Browser-specific constant to adjust CanvasRenderingContext2D.shadowBlur value,\n * which is unitless and not rendered equally across browsers.\n *\n * Values that work quite well (as of October 2017) are:\n * - Chrome: 1.5\n * - Edge: 1.75\n * - Firefox: 0.9\n * - Safari: 0.95\n *\n * @since 2.0.0\n * @type Number\n * @default 1\n */\nfabric.browserShadowBlurConstant = 1;\n\n/**\n * This object contains the result of arc to bezier conversion for faster retrieving if the same arc needs to be converted again.\n * It was an internal variable, is accessible since version 2.3.4\n */\nfabric.arcToSegmentsCache = { };\n\n/**\n * This object keeps the results of the boundsOfCurve calculation mapped by the joined arguments necessary to calculate it.\n * It does speed up calculation, if you parse and add always the same paths, but in case of heavy usage of freedrawing\n * you do not get any speed benefit and you get a big object in memory.\n * The object was a private variable before, while now is appended to the lib so that you have access to it and you\n * can eventually clear it.\n * It was an internal variable, is accessible since version 2.3.4\n */\nfabric.boundsOfCurveCache = { };\n\n/**\n * If disabled boundsOfCurveCache is not used. For apps that make heavy usage of pencil drawing probably disabling it is better\n * @default true\n */\nfabric.cachesBoundsOfCurve = true;\n\n/**\n * Skip performance testing of setupGLContext and force the use of putImageData that seems to be the one that works best on\n * Chrome + old hardware. if your users are experiencing empty images after filtering you may try to force this to true\n * this has to be set before instantiating the filtering backend ( before filtering the first image )\n * @type Boolean\n * @default false\n */\nfabric.forceGLPutImageData = false;\n\nfabric.initFilterBackend = function() {\n  if (fabric.enableGLFiltering && fabric.isWebglSupported && fabric.isWebglSupported(fabric.textureSize)) {\n    console.log('max texture size: ' + fabric.maxTextureSize);\n    return (new fabric.WebglFilterBackend({ tileSize: fabric.textureSize }));\n  }\n  else if (fabric.Canvas2dFilterBackend) {\n    return (new fabric.Canvas2dFilterBackend());\n  }\n};\n\n\nif (typeof document !== 'undefined' && typeof window !== 'undefined') {\n  // ensure globality even if entire library were function wrapped (as in Meteor.js packaging system)\n  window.fabric = fabric;\n}\n\n\n(function() {\n\n  /**\n   * @private\n   * @param {String} eventName\n   * @param {Function} handler\n   */\n  function _removeEventListener(eventName, handler) {\n    if (!this.__eventListeners[eventName]) {\n      return;\n    }\n    var eventListener = this.__eventListeners[eventName];\n    if (handler) {\n      eventListener[eventListener.indexOf(handler)] = false;\n    }\n    else {\n      fabric.util.array.fill(eventListener, false);\n    }\n  }\n\n  /**\n   * Observes specified event\n   * @memberOf fabric.Observable\n   * @alias on\n   * @param {String|Object} eventName Event name (eg. 'after:render') or object with key/value pairs (eg. {'after:render': handler, 'selection:cleared': handler})\n   * @param {Function} handler Function that receives a notification when an event of the specified type occurs\n   * @return {Self} thisArg\n   * @chainable\n   */\n  function on(eventName, handler) {\n    if (!this.__eventListeners) {\n      this.__eventListeners = { };\n    }\n    // one object with key/value pairs was passed\n    if (arguments.length === 1) {\n      for (var prop in eventName) {\n        this.on(prop, eventName[prop]);\n      }\n    }\n    else {\n      if (!this.__eventListeners[eventName]) {\n        this.__eventListeners[eventName] = [];\n      }\n      this.__eventListeners[eventName].push(handler);\n    }\n    return this;\n  }\n\n  function _once(eventName, handler) {\n    var _handler = function () {\n      handler.apply(this, arguments);\n      this.off(eventName, _handler);\n    }.bind(this);\n    this.on(eventName, _handler);\n  }\n\n  function once(eventName, handler) {\n    // one object with key/value pairs was passed\n    if (arguments.length === 1) {\n      for (var prop in eventName) {\n        _once.call(this, prop, eventName[prop]);\n      }\n    }\n    else {\n      _once.call(this, eventName, handler);\n    }\n    return this;\n  }\n\n  /**\n   * Stops event observing for a particular event handler. Calling this method\n   * without arguments removes all handlers for all events\n   * @memberOf fabric.Observable\n   * @alias off\n   * @param {String|Object} eventName Event name (eg. 'after:render') or object with key/value pairs (eg. {'after:render': handler, 'selection:cleared': handler})\n   * @param {Function} handler Function to be deleted from EventListeners\n   * @return {Self} thisArg\n   * @chainable\n   */\n  function off(eventName, handler) {\n    if (!this.__eventListeners) {\n      return this;\n    }\n\n    // remove all key/value pairs (event name -> event handler)\n    if (arguments.length === 0) {\n      for (eventName in this.__eventListeners) {\n        _removeEventListener.call(this, eventName);\n      }\n    }\n    // one object with key/value pairs was passed\n    else if (arguments.length === 1 && typeof arguments[0] === 'object') {\n      for (var prop in eventName) {\n        _removeEventListener.call(this, prop, eventName[prop]);\n      }\n    }\n    else {\n      _removeEventListener.call(this, eventName, handler);\n    }\n    return this;\n  }\n\n  /**\n   * Fires event with an optional options object\n   * @memberOf fabric.Observable\n   * @param {String} eventName Event name to fire\n   * @param {Object} [options] Options object\n   * @return {Self} thisArg\n   * @chainable\n   */\n  function fire(eventName, options) {\n    if (!this.__eventListeners) {\n      return this;\n    }\n\n    var listenersForEvent = this.__eventListeners[eventName];\n    if (!listenersForEvent) {\n      return this;\n    }\n\n    for (var i = 0, len = listenersForEvent.length; i < len; i++) {\n      listenersForEvent[i] && listenersForEvent[i].call(this, options || { });\n    }\n    this.__eventListeners[eventName] = listenersForEvent.filter(function(value) {\n      return value !== false;\n    });\n    return this;\n  }\n\n  /**\n   * @namespace fabric.Observable\n   * @tutorial {@link http://fabricjs.com/fabric-intro-part-2#events}\n   * @see {@link http://fabricjs.com/events|Events demo}\n   */\n  fabric.Observable = {\n    fire: fire,\n    on: on,\n    once: once,\n    off: off,\n  };\n})();\n\n\n/**\n * @namespace fabric.Collection\n */\nfabric.Collection = {\n\n  _objects: [],\n\n  /**\n   * Adds objects to collection, Canvas or Group, then renders canvas\n   * (if `renderOnAddRemove` is not `false`).\n   * in case of Group no changes to bounding box are made.\n   * Objects should be instances of (or inherit from) fabric.Object\n   * Use of this function is highly discouraged for groups.\n   * you can add a bunch of objects with the add method but then you NEED\n   * to run a addWithUpdate call for the Group class or position/bbox will be wrong.\n   * @param {...fabric.Object} object Zero or more fabric instances\n   * @return {Self} thisArg\n   * @chainable\n   */\n  add: function () {\n    this._objects.push.apply(this._objects, arguments);\n    if (this._onObjectAdded) {\n      for (var i = 0, length = arguments.length; i < length; i++) {\n        this._onObjectAdded(arguments[i]);\n      }\n    }\n    this.renderOnAddRemove && this.requestRenderAll();\n    return this;\n  },\n\n  /**\n   * Inserts an object into collection at specified index, then renders canvas (if `renderOnAddRemove` is not `false`)\n   * An object should be an instance of (or inherit from) fabric.Object\n   * Use of this function is highly discouraged for groups.\n   * you can add a bunch of objects with the insertAt method but then you NEED\n   * to run a addWithUpdate call for the Group class or position/bbox will be wrong.\n   * @param {Object} object Object to insert\n   * @param {Number} index Index to insert object at\n   * @param {Boolean} nonSplicing When `true`, no splicing (shifting) of objects occurs\n   * @return {Self} thisArg\n   * @chainable\n   */\n  insertAt: function (object, index, nonSplicing) {\n    var objects = this._objects;\n    if (nonSplicing) {\n      objects[index] = object;\n    }\n    else {\n      objects.splice(index, 0, object);\n    }\n    this._onObjectAdded && this._onObjectAdded(object);\n    this.renderOnAddRemove && this.requestRenderAll();\n    return this;\n  },\n\n  /**\n   * Removes objects from a collection, then renders canvas (if `renderOnAddRemove` is not `false`)\n   * @param {...fabric.Object} object Zero or more fabric instances\n   * @return {Self} thisArg\n   * @chainable\n   */\n  remove: function() {\n    var objects = this._objects,\n        index, somethingRemoved = false;\n\n    for (var i = 0, length = arguments.length; i < length; i++) {\n      index = objects.indexOf(arguments[i]);\n\n      // only call onObjectRemoved if an object was actually removed\n      if (index !== -1) {\n        somethingRemoved = true;\n        objects.splice(index, 1);\n        this._onObjectRemoved && this._onObjectRemoved(arguments[i]);\n      }\n    }\n\n    this.renderOnAddRemove && somethingRemoved && this.requestRenderAll();\n    return this;\n  },\n\n  /**\n   * Executes given function for each object in this group\n   * @param {Function} callback\n   *                   Callback invoked with current object as first argument,\n   *                   index - as second and an array of all objects - as third.\n   *                   Callback is invoked in a context of Global Object (e.g. `window`)\n   *                   when no `context` argument is given\n   *\n   * @param {Object} context Context (aka thisObject)\n   * @return {Self} thisArg\n   * @chainable\n   */\n  forEachObject: function(callback, context) {\n    var objects = this.getObjects();\n    for (var i = 0, len = objects.length; i < len; i++) {\n      callback.call(context, objects[i], i, objects);\n    }\n    return this;\n  },\n\n  /**\n   * Returns an array of children objects of this instance\n   * Type parameter introduced in 1.3.10\n   * since 2.3.5 this method return always a COPY of the array;\n   * @param {String} [type] When specified, only objects of this type are returned\n   * @return {Array}\n   */\n  getObjects: function(type) {\n    if (typeof type === 'undefined') {\n      return this._objects.concat();\n    }\n    return this._objects.filter(function(o) {\n      return o.type === type;\n    });\n  },\n\n  /**\n   * Returns object at specified index\n   * @param {Number} index\n   * @return {Self} thisArg\n   */\n  item: function (index) {\n    return this._objects[index];\n  },\n\n  /**\n   * Returns true if collection contains no objects\n   * @return {Boolean} true if collection is empty\n   */\n  isEmpty: function () {\n    return this._objects.length === 0;\n  },\n\n  /**\n   * Returns a size of a collection (i.e: length of an array containing its objects)\n   * @return {Number} Collection size\n   */\n  size: function() {\n    return this._objects.length;\n  },\n\n  /**\n   * Returns true if collection contains an object\n   * @param {Object} object Object to check against\n   * @param {Boolean} [deep=false] `true` to check all descendants, `false` to check only `_objects`\n   * @return {Boolean} `true` if collection contains an object\n   */\n  contains: function (object, deep) {\n    if (this._objects.indexOf(object) > -1) {\n      return true;\n    }\n    else if (deep) {\n      return this._objects.some(function (obj) {\n        return typeof obj.contains === 'function' && obj.contains(object, true);\n      });\n    }\n    return false;\n  },\n\n  /**\n   * Returns number representation of a collection complexity\n   * @return {Number} complexity\n   */\n  complexity: function () {\n    return this._objects.reduce(function (memo, current) {\n      memo += current.complexity ? current.complexity() : 0;\n      return memo;\n    }, 0);\n  }\n};\n\n\n/**\n * @namespace fabric.CommonMethods\n */\nfabric.CommonMethods = {\n\n  /**\n   * Sets object's properties from options\n   * @param {Object} [options] Options object\n   */\n  _setOptions: function(options) {\n    for (var prop in options) {\n      this.set(prop, options[prop]);\n    }\n  },\n\n  /**\n   * @private\n   * @param {Object} [filler] Options object\n   * @param {String} [property] property to set the Gradient to\n   */\n  _initGradient: function(filler, property) {\n    if (filler && filler.colorStops && !(filler instanceof fabric.Gradient)) {\n      this.set(property, new fabric.Gradient(filler));\n    }\n  },\n\n  /**\n   * @private\n   * @param {Object} [filler] Options object\n   * @param {String} [property] property to set the Pattern to\n   * @param {Function} [callback] callback to invoke after pattern load\n   */\n  _initPattern: function(filler, property, callback) {\n    if (filler && filler.source && !(filler instanceof fabric.Pattern)) {\n      this.set(property, new fabric.Pattern(filler, callback));\n    }\n    else {\n      callback && callback();\n    }\n  },\n\n  /**\n   * @private\n   */\n  _setObject: function(obj) {\n    for (var prop in obj) {\n      this._set(prop, obj[prop]);\n    }\n  },\n\n  /**\n   * Sets property to a given value. When changing position/dimension -related properties (left, top, scale, angle, etc.) `set` does not update position of object's borders/controls. If you need to update those, call `setCoords()`.\n   * @param {String|Object} key Property name or object (if object, iterate over the object properties)\n   * @param {Object|Function} value Property value (if function, the value is passed into it and its return value is used as a new one)\n   * @return {fabric.Object} thisArg\n   * @chainable\n   */\n  set: function(key, value) {\n    if (typeof key === 'object') {\n      this._setObject(key);\n    }\n    else {\n      this._set(key, value);\n    }\n    return this;\n  },\n\n  _set: function(key, value) {\n    this[key] = value;\n  },\n\n  /**\n   * Toggles specified property from `true` to `false` or from `false` to `true`\n   * @param {String} property Property to toggle\n   * @return {fabric.Object} thisArg\n   * @chainable\n   */\n  toggle: function(property) {\n    var value = this.get(property);\n    if (typeof value === 'boolean') {\n      this.set(property, !value);\n    }\n    return this;\n  },\n\n  /**\n   * Basic getter\n   * @param {String} property Property name\n   * @return {*} value of a property\n   */\n  get: function(property) {\n    return this[property];\n  }\n};\n\n\n(function(global) {\n\n  var sqrt = Math.sqrt,\n      atan2 = Math.atan2,\n      pow = Math.pow,\n      PiBy180 = Math.PI / 180,\n      PiBy2 = Math.PI / 2;\n\n  /**\n   * @namespace fabric.util\n   */\n  fabric.util = {\n\n    /**\n     * Calculate the cos of an angle, avoiding returning floats for known results\n     * @static\n     * @memberOf fabric.util\n     * @param {Number} angle the angle in radians or in degree\n     * @return {Number}\n     */\n    cos: function(angle) {\n      if (angle === 0) { return 1; }\n      if (angle < 0) {\n        // cos(a) = cos(-a)\n        angle = -angle;\n      }\n      var angleSlice = angle / PiBy2;\n      switch (angleSlice) {\n        case 1: case 3: return 0;\n        case 2: return -1;\n      }\n      return Math.cos(angle);\n    },\n\n    /**\n     * Calculate the sin of an angle, avoiding returning floats for known results\n     * @static\n     * @memberOf fabric.util\n     * @param {Number} angle the angle in radians or in degree\n     * @return {Number}\n     */\n    sin: function(angle) {\n      if (angle === 0) { return 0; }\n      var angleSlice = angle / PiBy2, sign = 1;\n      if (angle < 0) {\n        // sin(-a) = -sin(a)\n        sign = -1;\n      }\n      switch (angleSlice) {\n        case 1: return sign;\n        case 2: return 0;\n        case 3: return -sign;\n      }\n      return Math.sin(angle);\n    },\n\n    /**\n     * Removes value from an array.\n     * Presence of value (and its position in an array) is determined via `Array.prototype.indexOf`\n     * @static\n     * @memberOf fabric.util\n     * @param {Array} array\n     * @param {*} value\n     * @return {Array} original array\n     */\n    removeFromArray: function(array, value) {\n      var idx = array.indexOf(value);\n      if (idx !== -1) {\n        array.splice(idx, 1);\n      }\n      return array;\n    },\n\n    /**\n     * Returns random number between 2 specified ones.\n     * @static\n     * @memberOf fabric.util\n     * @param {Number} min lower limit\n     * @param {Number} max upper limit\n     * @return {Number} random value (between min and max)\n     */\n    getRandomInt: function(min, max) {\n      return Math.floor(Math.random() * (max - min + 1)) + min;\n    },\n\n    /**\n     * Transforms degrees to radians.\n     * @static\n     * @memberOf fabric.util\n     * @param {Number} degrees value in degrees\n     * @return {Number} value in radians\n     */\n    degreesToRadians: function(degrees) {\n      return degrees * PiBy180;\n    },\n\n    /**\n     * Transforms radians to degrees.\n     * @static\n     * @memberOf fabric.util\n     * @param {Number} radians value in radians\n     * @return {Number} value in degrees\n     */\n    radiansToDegrees: function(radians) {\n      return radians / PiBy180;\n    },\n\n    /**\n     * Rotates `point` around `origin` with `radians`\n     * @static\n     * @memberOf fabric.util\n     * @param {fabric.Point} point The point to rotate\n     * @param {fabric.Point} origin The origin of the rotation\n     * @param {Number} radians The radians of the angle for the rotation\n     * @return {fabric.Point} The new rotated point\n     */\n    rotatePoint: function(point, origin, radians) {\n      var newPoint = new fabric.Point(point.x - origin.x, point.y - origin.y),\n          v = fabric.util.rotateVector(newPoint, radians);\n      return new fabric.Point(v.x, v.y).addEquals(origin);\n    },\n\n    /**\n     * Rotates `vector` with `radians`\n     * @static\n     * @memberOf fabric.util\n     * @param {Object} vector The vector to rotate (x and y)\n     * @param {Number} radians The radians of the angle for the rotation\n     * @return {Object} The new rotated point\n     */\n    rotateVector: function(vector, radians) {\n      var sin = fabric.util.sin(radians),\n          cos = fabric.util.cos(radians),\n          rx = vector.x * cos - vector.y * sin,\n          ry = vector.x * sin + vector.y * cos;\n      return {\n        x: rx,\n        y: ry\n      };\n    },\n\n    /**\n     * Apply transform t to point p\n     * @static\n     * @memberOf fabric.util\n     * @param  {fabric.Point} p The point to transform\n     * @param  {Array} t The transform\n     * @param  {Boolean} [ignoreOffset] Indicates that the offset should not be applied\n     * @return {fabric.Point} The transformed point\n     */\n    transformPoint: function(p, t, ignoreOffset) {\n      if (ignoreOffset) {\n        return new fabric.Point(\n          t[0] * p.x + t[2] * p.y,\n          t[1] * p.x + t[3] * p.y\n        );\n      }\n      return new fabric.Point(\n        t[0] * p.x + t[2] * p.y + t[4],\n        t[1] * p.x + t[3] * p.y + t[5]\n      );\n    },\n\n    /**\n     * Returns coordinates of points's bounding rectangle (left, top, width, height)\n     * @param {Array} points 4 points array\n     * @param {Array} [transform] an array of 6 numbers representing a 2x3 transform matrix\n     * @return {Object} Object with left, top, width, height properties\n     */\n    makeBoundingBoxFromPoints: function(points, transform) {\n      if (transform) {\n        for (var i = 0; i < points.length; i++) {\n          points[i] = fabric.util.transformPoint(points[i], transform);\n        }\n      }\n      var xPoints = [points[0].x, points[1].x, points[2].x, points[3].x],\n          minX = fabric.util.array.min(xPoints),\n          maxX = fabric.util.array.max(xPoints),\n          width = maxX - minX,\n          yPoints = [points[0].y, points[1].y, points[2].y, points[3].y],\n          minY = fabric.util.array.min(yPoints),\n          maxY = fabric.util.array.max(yPoints),\n          height = maxY - minY;\n\n      return {\n        left: minX,\n        top: minY,\n        width: width,\n        height: height\n      };\n    },\n\n    /**\n     * Invert transformation t\n     * @static\n     * @memberOf fabric.util\n     * @param {Array} t The transform\n     * @return {Array} The inverted transform\n     */\n    invertTransform: function(t) {\n      var a = 1 / (t[0] * t[3] - t[1] * t[2]),\n          r = [a * t[3], -a * t[1], -a * t[2], a * t[0]],\n          o = fabric.util.transformPoint({ x: t[4], y: t[5] }, r, true);\n      r[4] = -o.x;\n      r[5] = -o.y;\n      return r;\n    },\n\n    /**\n     * A wrapper around Number#toFixed, which contrary to native method returns number, not string.\n     * @static\n     * @memberOf fabric.util\n     * @param {Number|String} number number to operate on\n     * @param {Number} fractionDigits number of fraction digits to \"leave\"\n     * @return {Number}\n     */\n    toFixed: function(number, fractionDigits) {\n      return parseFloat(Number(number).toFixed(fractionDigits));\n    },\n\n    /**\n     * Converts from attribute value to pixel value if applicable.\n     * Returns converted pixels or original value not converted.\n     * @param {Number|String} value number to operate on\n     * @param {Number} fontSize\n     * @return {Number|String}\n     */\n    parseUnit: function(value, fontSize) {\n      var unit = /\\D{0,2}$/.exec(value),\n          number = parseFloat(value);\n      if (!fontSize) {\n        fontSize = fabric.Text.DEFAULT_SVG_FONT_SIZE;\n      }\n      switch (unit[0]) {\n        case 'mm':\n          return number * fabric.DPI / 25.4;\n\n        case 'cm':\n          return number * fabric.DPI / 2.54;\n\n        case 'in':\n          return number * fabric.DPI;\n\n        case 'pt':\n          return number * fabric.DPI / 72; // or * 4 / 3\n\n        case 'pc':\n          return number * fabric.DPI / 72 * 12; // or * 16\n\n        case 'em':\n          return number * fontSize;\n\n        default:\n          return number;\n      }\n    },\n\n    /**\n     * Function which always returns `false`.\n     * @static\n     * @memberOf fabric.util\n     * @return {Boolean}\n     */\n    falseFunction: function() {\n      return false;\n    },\n\n    /**\n     * Returns klass \"Class\" object of given namespace\n     * @memberOf fabric.util\n     * @param {String} type Type of object (eg. 'circle')\n     * @param {String} namespace Namespace to get klass \"Class\" object from\n     * @return {Object} klass \"Class\"\n     */\n    getKlass: function(type, namespace) {\n      // capitalize first letter only\n      type = fabric.util.string.camelize(type.charAt(0).toUpperCase() + type.slice(1));\n      return fabric.util.resolveNamespace(namespace)[type];\n    },\n\n    /**\n     * Returns array of attributes for given svg that fabric parses\n     * @memberOf fabric.util\n     * @param {String} type Type of svg element (eg. 'circle')\n     * @return {Array} string names of supported attributes\n     */\n    getSvgAttributes: function(type) {\n      var attributes = [\n        'instantiated_by_use',\n        'style',\n        'id',\n        'class'\n      ];\n      switch (type) {\n        case 'linearGradient':\n          attributes = attributes.concat(['x1', 'y1', 'x2', 'y2', 'gradientUnits', 'gradientTransform']);\n          break;\n        case 'radialGradient':\n          attributes = attributes.concat(['gradientUnits', 'gradientTransform', 'cx', 'cy', 'r', 'fx', 'fy', 'fr']);\n          break;\n        case 'stop':\n          attributes = attributes.concat(['offset', 'stop-color', 'stop-opacity']);\n          break;\n      }\n      return attributes;\n    },\n\n    /**\n     * Returns object of given namespace\n     * @memberOf fabric.util\n     * @param {String} namespace Namespace string e.g. 'fabric.Image.filter' or 'fabric'\n     * @return {Object} Object for given namespace (default fabric)\n     */\n    resolveNamespace: function(namespace) {\n      if (!namespace) {\n        return fabric;\n      }\n\n      var parts = namespace.split('.'),\n          len = parts.length, i,\n          obj = global || fabric.window;\n\n      for (i = 0; i < len; ++i) {\n        obj = obj[parts[i]];\n      }\n\n      return obj;\n    },\n\n    /**\n     * Loads image element from given url and passes it to a callback\n     * @memberOf fabric.util\n     * @param {String} url URL representing an image\n     * @param {Function} callback Callback; invoked with loaded image\n     * @param {*} [context] Context to invoke callback in\n     * @param {Object} [crossOrigin] crossOrigin value to set image element to\n     */\n    loadImage: function(url, callback, context, crossOrigin) {\n      if (!url) {\n        callback && callback.call(context, url);\n        return;\n      }\n\n      var img = fabric.util.createImage();\n\n      /** @ignore */\n      var onLoadCallback = function () {\n        callback && callback.call(context, img, false);\n        img = img.onload = img.onerror = null;\n      };\n\n      img.onload = onLoadCallback;\n      /** @ignore */\n      img.onerror = function() {\n        fabric.log('Error loading ' + img.src);\n        callback && callback.call(context, null, true);\n        img = img.onload = img.onerror = null;\n      };\n\n      // data-urls appear to be buggy with crossOrigin\n      // https://github.com/kangax/fabric.js/commit/d0abb90f1cd5c5ef9d2a94d3fb21a22330da3e0a#commitcomment-4513767\n      // see https://code.google.com/p/chromium/issues/detail?id=315152\n      //     https://bugzilla.mozilla.org/show_bug.cgi?id=935069\n      // crossOrigin null is the same as not set.\n      if (url.indexOf('data') !== 0 &&\n        crossOrigin !== undefined &&\n        crossOrigin !== null) {\n        img.crossOrigin = crossOrigin;\n      }\n\n      // IE10 / IE11-Fix: SVG contents from data: URI\n      // will only be available if the IMG is present\n      // in the DOM (and visible)\n      if (url.substring(0,14) === 'data:image/svg') {\n        img.onload = null;\n        fabric.util.loadImageInDom(img, onLoadCallback);\n      }\n\n      img.src = url;\n    },\n\n    /**\n     * Attaches SVG image with data: URL to the dom\n     * @memberOf fabric.util\n     * @param {Object} img Image object with data:image/svg src\n     * @param {Function} callback Callback; invoked with loaded image\n     * @return {Object} DOM element (div containing the SVG image)\n     */\n    loadImageInDom: function(img, onLoadCallback) {\n      var div = fabric.document.createElement('div');\n      div.style.width = div.style.height = '1px';\n      div.style.left = div.style.top = '-100%';\n      div.style.position = 'absolute';\n      div.appendChild(img);\n      fabric.document.querySelector('body').appendChild(div);\n      /**\n       * Wrap in function to:\n       *   1. Call existing callback\n       *   2. Cleanup DOM\n       */\n      img.onload = function () {\n        onLoadCallback();\n        div.parentNode.removeChild(div);\n        div = null;\n      };\n    },\n\n    /**\n     * Creates corresponding fabric instances from their object representations\n     * @static\n     * @memberOf fabric.util\n     * @param {Array} objects Objects to enliven\n     * @param {Function} callback Callback to invoke when all objects are created\n     * @param {String} namespace Namespace to get klass \"Class\" object from\n     * @param {Function} reviver Method for further parsing of object elements,\n     * called after each fabric object created.\n     */\n    enlivenObjects: function(objects, callback, namespace, reviver) {\n      objects = objects || [];\n\n      var enlivenedObjects = [],\n          numLoadedObjects = 0,\n          numTotalObjects = objects.length;\n\n      function onLoaded() {\n        if (++numLoadedObjects === numTotalObjects) {\n          callback && callback(enlivenedObjects.filter(function(obj) {\n            // filter out undefined objects (objects that gave error)\n            return obj;\n          }));\n        }\n      }\n\n      if (!numTotalObjects) {\n        callback && callback(enlivenedObjects);\n        return;\n      }\n\n      objects.forEach(function (o, index) {\n        // if sparse array\n        if (!o || !o.type) {\n          onLoaded();\n          return;\n        }\n        var klass = fabric.util.getKlass(o.type, namespace);\n        klass.fromObject(o, function (obj, error) {\n          error || (enlivenedObjects[index] = obj);\n          reviver && reviver(o, obj, error);\n          onLoaded();\n        });\n      });\n    },\n\n    /**\n     * Create and wait for loading of patterns\n     * @static\n     * @memberOf fabric.util\n     * @param {Array} patterns Objects to enliven\n     * @param {Function} callback Callback to invoke when all objects are created\n     * called after each fabric object created.\n     */\n    enlivenPatterns: function(patterns, callback) {\n      patterns = patterns || [];\n\n      function onLoaded() {\n        if (++numLoadedPatterns === numPatterns) {\n          callback && callback(enlivenedPatterns);\n        }\n      }\n\n      var enlivenedPatterns = [],\n          numLoadedPatterns = 0,\n          numPatterns = patterns.length;\n\n      if (!numPatterns) {\n        callback && callback(enlivenedPatterns);\n        return;\n      }\n\n      patterns.forEach(function (p, index) {\n        if (p && p.source) {\n          new fabric.Pattern(p, function(pattern) {\n            enlivenedPatterns[index] = pattern;\n            onLoaded();\n          });\n        }\n        else {\n          enlivenedPatterns[index] = p;\n          onLoaded();\n        }\n      });\n    },\n\n    /**\n     * Groups SVG elements (usually those retrieved from SVG document)\n     * @static\n     * @memberOf fabric.util\n     * @param {Array} elements SVG elements to group\n     * @param {Object} [options] Options object\n     * @param {String} path Value to set sourcePath to\n     * @return {fabric.Object|fabric.Group}\n     */\n    groupSVGElements: function(elements, options, path) {\n      var object;\n      if (elements && elements.length === 1) {\n        return elements[0];\n      }\n      if (options) {\n        if (options.width && options.height) {\n          options.centerPoint = {\n            x: options.width / 2,\n            y: options.height / 2\n          };\n        }\n        else {\n          delete options.width;\n          delete options.height;\n        }\n      }\n      object = new fabric.Group(elements, options);\n      if (typeof path !== 'undefined') {\n        object.sourcePath = path;\n      }\n      return object;\n    },\n\n    /**\n     * Populates an object with properties of another object\n     * @static\n     * @memberOf fabric.util\n     * @param {Object} source Source object\n     * @param {Object} destination Destination object\n     * @return {Array} properties Properties names to include\n     */\n    populateWithProperties: function(source, destination, properties) {\n      if (properties && Object.prototype.toString.call(properties) === '[object Array]') {\n        for (var i = 0, len = properties.length; i < len; i++) {\n          if (properties[i] in source) {\n            destination[properties[i]] = source[properties[i]];\n          }\n        }\n      }\n    },\n\n    /**\n     * WARNING: THIS WAS TO SUPPORT OLD BROWSERS. deprecated.\n     * WILL BE REMOVED IN FABRIC 5.0\n     * Draws a dashed line between two points\n     *\n     * This method is used to draw dashed line around selection area.\n     * See <a href=\"http://stackoverflow.com/questions/4576724/dotted-stroke-in-canvas\">dotted stroke in canvas</a>\n     *\n     * @param {CanvasRenderingContext2D} ctx context\n     * @param {Number} x  start x coordinate\n     * @param {Number} y start y coordinate\n     * @param {Number} x2 end x coordinate\n     * @param {Number} y2 end y coordinate\n     * @param {Array} da dash array pattern\n     * @deprecated\n     */\n    drawDashedLine: function(ctx, x, y, x2, y2, da) {\n      var dx = x2 - x,\n          dy = y2 - y,\n          len = sqrt(dx * dx + dy * dy),\n          rot = atan2(dy, dx),\n          dc = da.length,\n          di = 0,\n          draw = true;\n\n      ctx.save();\n      ctx.translate(x, y);\n      ctx.moveTo(0, 0);\n      ctx.rotate(rot);\n\n      x = 0;\n      while (len > x) {\n        x += da[di++ % dc];\n        if (x > len) {\n          x = len;\n        }\n        ctx[draw ? 'lineTo' : 'moveTo'](x, 0);\n        draw = !draw;\n      }\n\n      ctx.restore();\n    },\n\n    /**\n     * Creates canvas element\n     * @static\n     * @memberOf fabric.util\n     * @return {CanvasElement} initialized canvas element\n     */\n    createCanvasElement: function() {\n      return fabric.document.createElement('canvas');\n    },\n\n    /**\n     * Creates a canvas element that is a copy of another and is also painted\n     * @param {CanvasElement} canvas to copy size and content of\n     * @static\n     * @memberOf fabric.util\n     * @return {CanvasElement} initialized canvas element\n     */\n    copyCanvasElement: function(canvas) {\n      var newCanvas = fabric.util.createCanvasElement();\n      newCanvas.width = canvas.width;\n      newCanvas.height = canvas.height;\n      newCanvas.getContext('2d').drawImage(canvas, 0, 0);\n      return newCanvas;\n    },\n\n    /**\n     * since 2.6.0 moved from canvas instance to utility.\n     * @param {CanvasElement} canvasEl to copy size and content of\n     * @param {String} format 'jpeg' or 'png', in some browsers 'webp' is ok too\n     * @param {Number} quality <= 1 and > 0\n     * @static\n     * @memberOf fabric.util\n     * @return {String} data url\n     */\n    toDataURL: function(canvasEl, format, quality) {\n      return canvasEl.toDataURL('image/' + format, quality);\n    },\n\n    /**\n     * Creates image element (works on client and node)\n     * @static\n     * @memberOf fabric.util\n     * @return {HTMLImageElement} HTML image element\n     */\n    createImage: function() {\n      return fabric.document.createElement('img');\n    },\n\n    /**\n     * Multiply matrix A by matrix B to nest transformations\n     * @static\n     * @memberOf fabric.util\n     * @param  {Array} a First transformMatrix\n     * @param  {Array} b Second transformMatrix\n     * @param  {Boolean} is2x2 flag to multiply matrices as 2x2 matrices\n     * @return {Array} The product of the two transform matrices\n     */\n    multiplyTransformMatrices: function(a, b, is2x2) {\n      // Matrix multiply a * b\n      return [\n        a[0] * b[0] + a[2] * b[1],\n        a[1] * b[0] + a[3] * b[1],\n        a[0] * b[2] + a[2] * b[3],\n        a[1] * b[2] + a[3] * b[3],\n        is2x2 ? 0 : a[0] * b[4] + a[2] * b[5] + a[4],\n        is2x2 ? 0 : a[1] * b[4] + a[3] * b[5] + a[5]\n      ];\n    },\n\n    /**\n     * Decomposes standard 2x3 matrix into transform components\n     * @static\n     * @memberOf fabric.util\n     * @param  {Array} a transformMatrix\n     * @return {Object} Components of transform\n     */\n    qrDecompose: function(a) {\n      var angle = atan2(a[1], a[0]),\n          denom = pow(a[0], 2) + pow(a[1], 2),\n          scaleX = sqrt(denom),\n          scaleY = (a[0] * a[3] - a[2] * a[1]) / scaleX,\n          skewX = atan2(a[0] * a[2] + a[1] * a [3], denom);\n      return {\n        angle: angle / PiBy180,\n        scaleX: scaleX,\n        scaleY: scaleY,\n        skewX: skewX / PiBy180,\n        skewY: 0,\n        translateX: a[4],\n        translateY: a[5]\n      };\n    },\n\n    /**\n     * Returns a transform matrix starting from an object of the same kind of\n     * the one returned from qrDecompose, useful also if you want to calculate some\n     * transformations from an object that is not enlived yet\n     * @static\n     * @memberOf fabric.util\n     * @param  {Object} options\n     * @param  {Number} [options.angle] angle in degrees\n     * @return {Number[]} transform matrix\n     */\n    calcRotateMatrix: function(options) {\n      if (!options.angle) {\n        return fabric.iMatrix.concat();\n      }\n      var theta = fabric.util.degreesToRadians(options.angle),\n          cos = fabric.util.cos(theta),\n          sin = fabric.util.sin(theta);\n      return [cos, sin, -sin, cos, 0, 0];\n    },\n\n    /**\n     * Returns a transform matrix starting from an object of the same kind of\n     * the one returned from qrDecompose, useful also if you want to calculate some\n     * transformations from an object that is not enlived yet.\n     * is called DimensionsTransformMatrix because those properties are the one that influence\n     * the size of the resulting box of the object.\n     * @static\n     * @memberOf fabric.util\n     * @param  {Object} options\n     * @param  {Number} [options.scaleX]\n     * @param  {Number} [options.scaleY]\n     * @param  {Boolean} [options.flipX]\n     * @param  {Boolean} [options.flipY]\n     * @param  {Number} [options.skewX]\n     * @param  {Number} [options.skewX]\n     * @return {Number[]} transform matrix\n     */\n    calcDimensionsMatrix: function(options) {\n      var scaleX = typeof options.scaleX === 'undefined' ? 1 : options.scaleX,\n          scaleY = typeof options.scaleY === 'undefined' ? 1 : options.scaleY,\n          scaleMatrix = [\n            options.flipX ? -scaleX : scaleX,\n            0,\n            0,\n            options.flipY ? -scaleY : scaleY,\n            0,\n            0],\n          multiply = fabric.util.multiplyTransformMatrices,\n          degreesToRadians = fabric.util.degreesToRadians;\n      if (options.skewX) {\n        scaleMatrix = multiply(\n          scaleMatrix,\n          [1, 0, Math.tan(degreesToRadians(options.skewX)), 1],\n          true);\n      }\n      if (options.skewY) {\n        scaleMatrix = multiply(\n          scaleMatrix,\n          [1, Math.tan(degreesToRadians(options.skewY)), 0, 1],\n          true);\n      }\n      return scaleMatrix;\n    },\n\n    /**\n     * Returns a transform matrix starting from an object of the same kind of\n     * the one returned from qrDecompose, useful also if you want to calculate some\n     * transformations from an object that is not enlived yet\n     * @static\n     * @memberOf fabric.util\n     * @param  {Object} options\n     * @param  {Number} [options.angle]\n     * @param  {Number} [options.scaleX]\n     * @param  {Number} [options.scaleY]\n     * @param  {Boolean} [options.flipX]\n     * @param  {Boolean} [options.flipY]\n     * @param  {Number} [options.skewX]\n     * @param  {Number} [options.skewX]\n     * @param  {Number} [options.translateX]\n     * @param  {Number} [options.translateY]\n     * @return {Number[]} transform matrix\n     */\n    composeMatrix: function(options) {\n      var matrix = [1, 0, 0, 1, options.translateX || 0, options.translateY || 0],\n          multiply = fabric.util.multiplyTransformMatrices;\n      if (options.angle) {\n        matrix = multiply(matrix, fabric.util.calcRotateMatrix(options));\n      }\n      if (options.scaleX !== 1 || options.scaleY !== 1 ||\n          options.skewX || options.skewY || options.flipX || options.flipY) {\n        matrix = multiply(matrix, fabric.util.calcDimensionsMatrix(options));\n      }\n      return matrix;\n    },\n\n    /**\n     * reset an object transform state to neutral. Top and left are not accounted for\n     * @static\n     * @memberOf fabric.util\n     * @param  {fabric.Object} target object to transform\n     */\n    resetObjectTransform: function (target) {\n      target.scaleX = 1;\n      target.scaleY = 1;\n      target.skewX = 0;\n      target.skewY = 0;\n      target.flipX = false;\n      target.flipY = false;\n      target.rotate(0);\n    },\n\n    /**\n     * Extract Object transform values\n     * @static\n     * @memberOf fabric.util\n     * @param  {fabric.Object} target object to read from\n     * @return {Object} Components of transform\n     */\n    saveObjectTransform: function (target) {\n      return {\n        scaleX: target.scaleX,\n        scaleY: target.scaleY,\n        skewX: target.skewX,\n        skewY: target.skewY,\n        angle: target.angle,\n        left: target.left,\n        flipX: target.flipX,\n        flipY: target.flipY,\n        top: target.top\n      };\n    },\n\n    /**\n     * Returns true if context has transparent pixel\n     * at specified location (taking tolerance into account)\n     * @param {CanvasRenderingContext2D} ctx context\n     * @param {Number} x x coordinate\n     * @param {Number} y y coordinate\n     * @param {Number} tolerance Tolerance\n     */\n    isTransparent: function(ctx, x, y, tolerance) {\n\n      // If tolerance is > 0 adjust start coords to take into account.\n      // If moves off Canvas fix to 0\n      if (tolerance > 0) {\n        if (x > tolerance) {\n          x -= tolerance;\n        }\n        else {\n          x = 0;\n        }\n        if (y > tolerance) {\n          y -= tolerance;\n        }\n        else {\n          y = 0;\n        }\n      }\n\n      var _isTransparent = true, i, temp,\n          imageData = ctx.getImageData(x, y, (tolerance * 2) || 1, (tolerance * 2) || 1),\n          l = imageData.data.length;\n\n      // Split image data - for tolerance > 1, pixelDataSize = 4;\n      for (i = 3; i < l; i += 4) {\n        temp = imageData.data[i];\n        _isTransparent = temp <= 0;\n        if (_isTransparent === false) {\n          break; // Stop if colour found\n        }\n      }\n\n      imageData = null;\n\n      return _isTransparent;\n    },\n\n    /**\n     * Parse preserveAspectRatio attribute from element\n     * @param {string} attribute to be parsed\n     * @return {Object} an object containing align and meetOrSlice attribute\n     */\n    parsePreserveAspectRatioAttribute: function(attribute) {\n      var meetOrSlice = 'meet', alignX = 'Mid', alignY = 'Mid',\n          aspectRatioAttrs = attribute.split(' '), align;\n\n      if (aspectRatioAttrs && aspectRatioAttrs.length) {\n        meetOrSlice = aspectRatioAttrs.pop();\n        if (meetOrSlice !== 'meet' && meetOrSlice !== 'slice') {\n          align = meetOrSlice;\n          meetOrSlice = 'meet';\n        }\n        else if (aspectRatioAttrs.length) {\n          align = aspectRatioAttrs.pop();\n        }\n      }\n      //divide align in alignX and alignY\n      alignX = align !== 'none' ? align.slice(1, 4) : 'none';\n      alignY = align !== 'none' ? align.slice(5, 8) : 'none';\n      return {\n        meetOrSlice: meetOrSlice,\n        alignX: alignX,\n        alignY: alignY\n      };\n    },\n\n    /**\n     * Clear char widths cache for the given font family or all the cache if no\n     * fontFamily is specified.\n     * Use it if you know you are loading fonts in a lazy way and you are not waiting\n     * for custom fonts to load properly when adding text objects to the canvas.\n     * If a text object is added when its own font is not loaded yet, you will get wrong\n     * measurement and so wrong bounding boxes.\n     * After the font cache is cleared, either change the textObject text content or call\n     * initDimensions() to trigger a recalculation\n     * @memberOf fabric.util\n     * @param {String} [fontFamily] font family to clear\n     */\n    clearFabricFontCache: function(fontFamily) {\n      fontFamily = (fontFamily || '').toLowerCase();\n      if (!fontFamily) {\n        fabric.charWidthsCache = { };\n      }\n      else if (fabric.charWidthsCache[fontFamily]) {\n        delete fabric.charWidthsCache[fontFamily];\n      }\n    },\n\n    /**\n     * Given current aspect ratio, determines the max width and height that can\n     * respect the total allowed area for the cache.\n     * @memberOf fabric.util\n     * @param {Number} ar aspect ratio\n     * @param {Number} maximumArea Maximum area you want to achieve\n     * @return {Object.x} Limited dimensions by X\n     * @return {Object.y} Limited dimensions by Y\n     */\n    limitDimsByArea: function(ar, maximumArea) {\n      var roughWidth = Math.sqrt(maximumArea * ar),\n          perfLimitSizeY = Math.floor(maximumArea / roughWidth);\n      return { x: Math.floor(roughWidth), y: perfLimitSizeY };\n    },\n\n    capValue: function(min, value, max) {\n      return Math.max(min, Math.min(value, max));\n    },\n\n    /**\n     * Finds the scale for the object source to fit inside the object destination,\n     * keeping aspect ratio intact.\n     * respect the total allowed area for the cache.\n     * @memberOf fabric.util\n     * @param {Object | fabric.Object} source\n     * @param {Number} source.height natural unscaled height of the object\n     * @param {Number} source.width natural unscaled width of the object\n     * @param {Object | fabric.Object} destination\n     * @param {Number} destination.height natural unscaled height of the object\n     * @param {Number} destination.width natural unscaled width of the object\n     * @return {Number} scale factor to apply to source to fit into destination\n     */\n    findScaleToFit: function(source, destination) {\n      return Math.min(destination.width / source.width, destination.height / source.height);\n    },\n\n    /**\n     * Finds the scale for the object source to cover entirely the object destination,\n     * keeping aspect ratio intact.\n     * respect the total allowed area for the cache.\n     * @memberOf fabric.util\n     * @param {Object | fabric.Object} source\n     * @param {Number} source.height natural unscaled height of the object\n     * @param {Number} source.width natural unscaled width of the object\n     * @param {Object | fabric.Object} destination\n     * @param {Number} destination.height natural unscaled height of the object\n     * @param {Number} destination.width natural unscaled width of the object\n     * @return {Number} scale factor to apply to source to cover destination\n     */\n    findScaleToCover: function(source, destination) {\n      return Math.max(destination.width / source.width, destination.height / source.height);\n    },\n\n    /**\n     * given an array of 6 number returns something like `\"matrix(...numbers)\"`\n     * @memberOf fabric.util\n     * @param {Array} transform an array with 6 numbers\n     * @return {String} transform matrix for svg\n     * @return {Object.y} Limited dimensions by Y\n     */\n    matrixToSVG: function(transform) {\n      return 'matrix(' + transform.map(function(value) {\n        return fabric.util.toFixed(value, fabric.Object.NUM_FRACTION_DIGITS);\n      }).join(' ') + ')';\n    },\n\n    /**\n     * given an object and a transform, apply the inverse transform to the object,\n     * this is equivalent to remove from that object that transformation, so that\n     * added in a space with the removed transform, the object will be the same as before.\n     * Removing from an object a transform that scale by 2 is like scaling it by 1/2.\n     * Removing from an object a transfrom that rotate by 30deg is like rotating by 30deg\n     * in the opposite direction.\n     * This util is used to add objects inside transformed groups or nested groups.\n     * @memberOf fabric.util\n     * @param {fabric.Object} object the object you want to transform\n     * @param {Array} transform the destination transform\n     */\n    removeTransformFromObject: function(object, transform) {\n      var inverted = fabric.util.invertTransform(transform),\n          finalTransform = fabric.util.multiplyTransformMatrices(inverted, object.calcOwnMatrix());\n      fabric.util.applyTransformToObject(object, finalTransform);\n    },\n\n    /**\n     * given an object and a transform, apply the transform to the object.\n     * this is equivalent to change the space where the object is drawn.\n     * Adding to an object a transform that scale by 2 is like scaling it by 2.\n     * This is used when removing an object from an active selection for example.\n     * @memberOf fabric.util\n     * @param {fabric.Object} object the object you want to transform\n     * @param {Array} transform the destination transform\n     */\n    addTransformToObject: function(object, transform) {\n      fabric.util.applyTransformToObject(\n        object,\n        fabric.util.multiplyTransformMatrices(transform, object.calcOwnMatrix())\n      );\n    },\n\n    /**\n     * discard an object transform state and apply the one from the matrix.\n     * @memberOf fabric.util\n     * @param {fabric.Object} object the object you want to transform\n     * @param {Array} transform the destination transform\n     */\n    applyTransformToObject: function(object, transform) {\n      var options = fabric.util.qrDecompose(transform),\n          center = new fabric.Point(options.translateX, options.translateY);\n      object.flipX = false;\n      object.flipY = false;\n      object.set('scaleX', options.scaleX);\n      object.set('scaleY', options.scaleY);\n      object.skewX = options.skewX;\n      object.skewY = options.skewY;\n      object.angle = options.angle;\n      object.setPositionByOrigin(center, 'center', 'center');\n    },\n\n    /**\n     * given a width and height, return the size of the bounding box\n     * that can contains the box with width/height with applied transform\n     * described in options.\n     * Use to calculate the boxes around objects for controls.\n     * @memberOf fabric.util\n     * @param {Number} width\n     * @param {Number} height\n     * @param {Object} options\n     * @param {Number} options.scaleX\n     * @param {Number} options.scaleY\n     * @param {Number} options.skewX\n     * @param {Number} options.skewY\n     * @return {Object.x} width of containing\n     * @return {Object.y} height of containing\n     */\n    sizeAfterTransform: function(width, height, options) {\n      var dimX = width / 2, dimY = height / 2,\n          points = [\n            {\n              x: -dimX,\n              y: -dimY\n            },\n            {\n              x: dimX,\n              y: -dimY\n            },\n            {\n              x: -dimX,\n              y: dimY\n            },\n            {\n              x: dimX,\n              y: dimY\n            }],\n          transformMatrix = fabric.util.calcDimensionsMatrix(options),\n          bbox = fabric.util.makeBoundingBoxFromPoints(points, transformMatrix);\n      return {\n        x: bbox.width,\n        y: bbox.height,\n      };\n    }\n  };\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function() {\n  var _join = Array.prototype.join,\n      commandLengths = {\n        m: 2,\n        l: 2,\n        h: 1,\n        v: 1,\n        c: 6,\n        s: 4,\n        q: 4,\n        t: 2,\n        a: 7\n      },\n      repeatedCommands = {\n        m: 'l',\n        M: 'L'\n      };\n  function segmentToBezier(th2, th3, cosTh, sinTh, rx, ry, cx1, cy1, mT, fromX, fromY) {\n    var costh2 = fabric.util.cos(th2),\n        sinth2 = fabric.util.sin(th2),\n        costh3 = fabric.util.cos(th3),\n        sinth3 = fabric.util.sin(th3),\n        toX = cosTh * rx * costh3 - sinTh * ry * sinth3 + cx1,\n        toY = sinTh * rx * costh3 + cosTh * ry * sinth3 + cy1,\n        cp1X = fromX + mT * ( -cosTh * rx * sinth2 - sinTh * ry * costh2),\n        cp1Y = fromY + mT * ( -sinTh * rx * sinth2 + cosTh * ry * costh2),\n        cp2X = toX + mT * ( cosTh * rx * sinth3 + sinTh * ry * costh3),\n        cp2Y = toY + mT * ( sinTh * rx * sinth3 - cosTh * ry * costh3);\n\n    return ['C',\n      cp1X, cp1Y,\n      cp2X, cp2Y,\n      toX, toY\n    ];\n  }\n\n  /* Adapted from http://dxr.mozilla.org/mozilla-central/source/content/svg/content/src/nsSVGPathDataParser.cpp\n   * by Andrea Bogazzi code is under MPL. if you don't have a copy of the license you can take it here\n   * http://mozilla.org/MPL/2.0/\n   */\n  function arcToSegments(toX, toY, rx, ry, large, sweep, rotateX) {\n    var PI = Math.PI, th = rotateX * PI / 180,\n        sinTh = fabric.util.sin(th),\n        cosTh = fabric.util.cos(th),\n        fromX = 0, fromY = 0;\n\n    rx = Math.abs(rx);\n    ry = Math.abs(ry);\n\n    var px = -cosTh * toX * 0.5 - sinTh * toY * 0.5,\n        py = -cosTh * toY * 0.5 + sinTh * toX * 0.5,\n        rx2 = rx * rx, ry2 = ry * ry, py2 = py * py, px2 = px * px,\n        pl = rx2 * ry2 - rx2 * py2 - ry2 * px2,\n        root = 0;\n\n    if (pl < 0) {\n      var s = Math.sqrt(1 - pl / (rx2 * ry2));\n      rx *= s;\n      ry *= s;\n    }\n    else {\n      root = (large === sweep ? -1.0 : 1.0) *\n              Math.sqrt( pl / (rx2 * py2 + ry2 * px2));\n    }\n\n    var cx = root * rx * py / ry,\n        cy = -root * ry * px / rx,\n        cx1 = cosTh * cx - sinTh * cy + toX * 0.5,\n        cy1 = sinTh * cx + cosTh * cy + toY * 0.5,\n        mTheta = calcVectorAngle(1, 0, (px - cx) / rx, (py - cy) / ry),\n        dtheta = calcVectorAngle((px - cx) / rx, (py - cy) / ry, (-px - cx) / rx, (-py - cy) / ry);\n\n    if (sweep === 0 && dtheta > 0) {\n      dtheta -= 2 * PI;\n    }\n    else if (sweep === 1 && dtheta < 0) {\n      dtheta += 2 * PI;\n    }\n\n    // Convert into cubic bezier segments <= 90deg\n    var segments = Math.ceil(Math.abs(dtheta / PI * 2)),\n        result = [], mDelta = dtheta / segments,\n        mT = 8 / 3 * Math.sin(mDelta / 4) * Math.sin(mDelta / 4) / Math.sin(mDelta / 2),\n        th3 = mTheta + mDelta;\n\n    for (var i = 0; i < segments; i++) {\n      result[i] = segmentToBezier(mTheta, th3, cosTh, sinTh, rx, ry, cx1, cy1, mT, fromX, fromY);\n      fromX = result[i][5];\n      fromY = result[i][6];\n      mTheta = th3;\n      th3 += mDelta;\n    }\n    return result;\n  }\n\n  /*\n   * Private\n   */\n  function calcVectorAngle(ux, uy, vx, vy) {\n    var ta = Math.atan2(uy, ux),\n        tb = Math.atan2(vy, vx);\n    if (tb >= ta) {\n      return tb - ta;\n    }\n    else {\n      return 2 * Math.PI - (ta - tb);\n    }\n  }\n\n  /**\n   * Calculate bounding box of a beziercurve\n   * @param {Number} x0 starting point\n   * @param {Number} y0\n   * @param {Number} x1 first control point\n   * @param {Number} y1\n   * @param {Number} x2 secondo control point\n   * @param {Number} y2\n   * @param {Number} x3 end of bezier\n   * @param {Number} y3\n   */\n  // taken from http://jsbin.com/ivomiq/56/edit  no credits available for that.\n  // TODO: can we normalize this with the starting points set at 0 and then translated the bbox?\n  function getBoundsOfCurve(x0, y0, x1, y1, x2, y2, x3, y3) {\n    var argsString;\n    if (fabric.cachesBoundsOfCurve) {\n      argsString = _join.call(arguments);\n      if (fabric.boundsOfCurveCache[argsString]) {\n        return fabric.boundsOfCurveCache[argsString];\n      }\n    }\n\n    var sqrt = Math.sqrt,\n        min = Math.min, max = Math.max,\n        abs = Math.abs, tvalues = [],\n        bounds = [[], []],\n        a, b, c, t, t1, t2, b2ac, sqrtb2ac;\n\n    b = 6 * x0 - 12 * x1 + 6 * x2;\n    a = -3 * x0 + 9 * x1 - 9 * x2 + 3 * x3;\n    c = 3 * x1 - 3 * x0;\n\n    for (var i = 0; i < 2; ++i) {\n      if (i > 0) {\n        b = 6 * y0 - 12 * y1 + 6 * y2;\n        a = -3 * y0 + 9 * y1 - 9 * y2 + 3 * y3;\n        c = 3 * y1 - 3 * y0;\n      }\n\n      if (abs(a) < 1e-12) {\n        if (abs(b) < 1e-12) {\n          continue;\n        }\n        t = -c / b;\n        if (0 < t && t < 1) {\n          tvalues.push(t);\n        }\n        continue;\n      }\n      b2ac = b * b - 4 * c * a;\n      if (b2ac < 0) {\n        continue;\n      }\n      sqrtb2ac = sqrt(b2ac);\n      t1 = (-b + sqrtb2ac) / (2 * a);\n      if (0 < t1 && t1 < 1) {\n        tvalues.push(t1);\n      }\n      t2 = (-b - sqrtb2ac) / (2 * a);\n      if (0 < t2 && t2 < 1) {\n        tvalues.push(t2);\n      }\n    }\n\n    var x, y, j = tvalues.length, jlen = j, mt;\n    while (j--) {\n      t = tvalues[j];\n      mt = 1 - t;\n      x = (mt * mt * mt * x0) + (3 * mt * mt * t * x1) + (3 * mt * t * t * x2) + (t * t * t * x3);\n      bounds[0][j] = x;\n\n      y = (mt * mt * mt * y0) + (3 * mt * mt * t * y1) + (3 * mt * t * t * y2) + (t * t * t * y3);\n      bounds[1][j] = y;\n    }\n\n    bounds[0][jlen] = x0;\n    bounds[1][jlen] = y0;\n    bounds[0][jlen + 1] = x3;\n    bounds[1][jlen + 1] = y3;\n    var result = [\n      {\n        x: min.apply(null, bounds[0]),\n        y: min.apply(null, bounds[1])\n      },\n      {\n        x: max.apply(null, bounds[0]),\n        y: max.apply(null, bounds[1])\n      }\n    ];\n    if (fabric.cachesBoundsOfCurve) {\n      fabric.boundsOfCurveCache[argsString] = result;\n    }\n    return result;\n  }\n\n  /**\n   * Converts arc to a bunch of bezier curves\n   * @param {Number} fx starting point x\n   * @param {Number} fy starting point y\n   * @param {Array} coords Arc command\n   */\n  function fromArcToBeziers(fx, fy, coords) {\n    var rx = coords[1],\n        ry = coords[2],\n        rot = coords[3],\n        large = coords[4],\n        sweep = coords[5],\n        tx = coords[6],\n        ty = coords[7],\n        segsNorm = arcToSegments(tx - fx, ty - fy, rx, ry, large, sweep, rot);\n\n    for (var i = 0, len = segsNorm.length; i < len; i++) {\n      segsNorm[i][1] += fx;\n      segsNorm[i][2] += fy;\n      segsNorm[i][3] += fx;\n      segsNorm[i][4] += fy;\n      segsNorm[i][5] += fx;\n      segsNorm[i][6] += fy;\n    }\n    return segsNorm;\n  };\n\n  /**\n   * This function take a parsed SVG path and make it simpler for fabricJS logic.\n   * simplification consist of: only UPPERCASE absolute commands ( relative converted to absolute )\n   * S converted in C, T converted in Q, A converted in C.\n   * @param {Array} path the array of commands of a parsed svg path for fabric.Path\n   * @return {Array} the simplified array of commands of a parsed svg path for fabric.Path\n   */\n  function makePathSimpler(path) {\n    // x and y represent the last point of the path. the previous command point.\n    // we add them to each relative command to make it an absolute comment.\n    // we also swap the v V h H with L, because are easier to transform.\n    var x = 0, y = 0, len = path.length,\n        // x1 and y1 represent the last point of the subpath. the subpath is started with\n        // m or M command. When a z or Z command is drawn, x and y need to be resetted to\n        // the last x1 and y1.\n        x1 = 0, y1 = 0, current, i, converted,\n        // previous will host the letter of the previous command, to handle S and T.\n        // controlX and controlY will host the previous reflected control point\n        destinationPath = [], previous, controlX, controlY;\n    for (i = 0; i < len; ++i) {\n      converted = false;\n      current = path[i].slice(0);\n      switch (current[0]) { // first letter\n        case 'l': // lineto, relative\n          current[0] = 'L';\n          current[1] += x;\n          current[2] += y;\n          // falls through\n        case 'L':\n          x = current[1];\n          y = current[2];\n          break;\n        case 'h': // horizontal lineto, relative\n          current[1] += x;\n          // falls through\n        case 'H':\n          current[0] = 'L';\n          current[2] = y;\n          x = current[1];\n          break;\n        case 'v': // vertical lineto, relative\n          current[1] += y;\n          // falls through\n        case 'V':\n          current[0] = 'L';\n          y = current[1];\n          current[1] = x;\n          current[2] = y;\n          break;\n        case 'm': // moveTo, relative\n          current[0] = 'M';\n          current[1] += x;\n          current[2] += y;\n          // falls through\n        case 'M':\n          x = current[1];\n          y = current[2];\n          x1 = current[1];\n          y1 = current[2];\n          break;\n        case 'c': // bezierCurveTo, relative\n          current[0] = 'C';\n          current[1] += x;\n          current[2] += y;\n          current[3] += x;\n          current[4] += y;\n          current[5] += x;\n          current[6] += y;\n          // falls through\n        case 'C':\n          controlX = current[3];\n          controlY = current[4];\n          x = current[5];\n          y = current[6];\n          break;\n        case 's': // shorthand cubic bezierCurveTo, relative\n          current[0] = 'S';\n          current[1] += x;\n          current[2] += y;\n          current[3] += x;\n          current[4] += y;\n          // falls through\n        case 'S':\n          // would be sScC but since we are swapping sSc for C, we check just that.\n          if (previous === 'C') {\n            // calculate reflection of previous control points\n            controlX = 2 * x - controlX;\n            controlY = 2 * y - controlY;\n          }\n          else {\n            // If there is no previous command or if the previous command was not a C, c, S, or s,\n            // the control point is coincident with the current point\n            controlX = x;\n            controlY = y;\n          }\n          x = current[3];\n          y = current[4];\n          current[0] = 'C';\n          current[5] = current[3];\n          current[6] = current[4];\n          current[3] = current[1];\n          current[4] = current[2];\n          current[1] = controlX;\n          current[2] = controlY;\n          // current[3] and current[4] are NOW the second control point.\n          // we keep it for the next reflection.\n          controlX = current[3];\n          controlY = current[4];\n          break;\n        case 'q': // quadraticCurveTo, relative\n          current[0] = 'Q';\n          current[1] += x;\n          current[2] += y;\n          current[3] += x;\n          current[4] += y;\n          // falls through\n        case 'Q':\n          controlX = current[1];\n          controlY = current[2];\n          x = current[3];\n          y = current[4];\n          break;\n        case 't': // shorthand quadraticCurveTo, relative\n          current[0] = 'T';\n          current[1] += x;\n          current[2] += y;\n          // falls through\n        case 'T':\n          if (previous === 'Q') {\n            // calculate reflection of previous control point\n            controlX = 2 * x - controlX;\n            controlY = 2 * y - controlY;\n          }\n          else {\n            // If there is no previous command or if the previous command was not a Q, q, T or t,\n            // assume the control point is coincident with the current point\n            controlX = x;\n            controlY = y;\n          }\n          current[0] = 'Q';\n          x = current[1];\n          y = current[2];\n          current[1] = controlX;\n          current[2] = controlY;\n          current[3] = x;\n          current[4] = y;\n          break;\n        case 'a':\n          current[0] = 'A';\n          current[6] += x;\n          current[7] += y;\n          // falls through\n        case 'A':\n          converted = true;\n          destinationPath = destinationPath.concat(fromArcToBeziers(x, y, current));\n          x = current[6];\n          y = current[7];\n          break;\n        case 'z':\n        case 'Z':\n          x = x1;\n          y = y1;\n          break;\n        default:\n      }\n      if (!converted) {\n        destinationPath.push(current);\n      }\n      previous = current[0];\n    }\n    return destinationPath;\n  };\n\n  /**\n   * Calc length from point x1,y1 to x2,y2\n   * @param {Number} x1 starting point x\n   * @param {Number} y1 starting point y\n   * @param {Number} x2 starting point x\n   * @param {Number} y2 starting point y\n   * @return {Number} length of segment\n   */\n  function calcLineLength(x1, y1, x2, y2) {\n    return Math.sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1));\n  }\n\n  // functions for the Cubic beizer\n  // taken from: https://github.com/konvajs/konva/blob/7.0.5/src/shapes/Path.ts#L350\n  function CB1(t) {\n    return t * t * t;\n  }\n  function CB2(t) {\n    return 3 * t * t * (1 - t);\n  }\n  function CB3(t) {\n    return 3 * t * (1 - t) * (1 - t);\n  }\n  function CB4(t) {\n    return (1 - t) * (1 - t) * (1 - t);\n  }\n\n  function getPointOnCubicBezierIterator(p1x, p1y, p2x, p2y, p3x, p3y, p4x, p4y) {\n    return function(pct) {\n      var c1 = CB1(pct), c2 = CB2(pct), c3 = CB3(pct), c4 = CB4(pct);\n      return {\n        x: p4x * c1 + p3x * c2 + p2x * c3 + p1x * c4,\n        y: p4y * c1 + p3y * c2 + p2y * c3 + p1y * c4\n      };\n    };\n  }\n\n  function getTangentCubicIterator(p1x, p1y, p2x, p2y, p3x, p3y, p4x, p4y) {\n    return function (pct) {\n      var invT = 1 - pct,\n          tangentX = (3 * invT * invT * (p2x - p1x)) + (6 * invT * pct * (p3x - p2x)) +\n          (3 * pct * pct * (p4x - p3x)),\n          tangentY = (3 * invT * invT * (p2y - p1y)) + (6 * invT * pct * (p3y - p2y)) +\n          (3 * pct * pct * (p4y - p3y));\n      return Math.atan2(tangentY, tangentX);\n    };\n  }\n\n  function QB1(t) {\n    return t * t;\n  }\n\n  function QB2(t) {\n    return 2 * t * (1 - t);\n  }\n\n  function QB3(t) {\n    return (1 - t) * (1 - t);\n  }\n\n  function getPointOnQuadraticBezierIterator(p1x, p1y, p2x, p2y, p3x, p3y) {\n    return function(pct) {\n      var c1 = QB1(pct), c2 = QB2(pct), c3 = QB3(pct);\n      return {\n        x: p3x * c1 + p2x * c2 + p1x * c3,\n        y: p3y * c1 + p2y * c2 + p1y * c3\n      };\n    };\n  }\n\n  function getTangentQuadraticIterator(p1x, p1y, p2x, p2y, p3x, p3y) {\n    return function (pct) {\n      var invT = 1 - pct,\n          tangentX = (2 * invT * (p2x - p1x)) + (2 * pct * (p3x - p2x)),\n          tangentY = (2 * invT * (p2y - p1y)) + (2 * pct * (p3y - p2y));\n      return Math.atan2(tangentY, tangentX);\n    };\n  }\n\n\n  // this will run over a path segment ( a cubic or quadratic segment) and approximate it\n  // with 100 segemnts. This will good enough to calculate the length of the curve\n  function pathIterator(iterator, x1, y1) {\n    var tempP = { x: x1, y: y1 }, p, tmpLen = 0, perc;\n    for (perc = 1; perc <= 100; perc += 1) {\n      p = iterator(perc / 100);\n      tmpLen += calcLineLength(tempP.x, tempP.y, p.x, p.y);\n      tempP = p;\n    }\n    return tmpLen;\n  }\n\n  /**\n   * Given a pathInfo, and a distance in pixels, find the percentage from 0 to 1\n   * that correspond to that pixels run over the path.\n   * The percentage will be then used to find the correct point on the canvas for the path.\n   * @param {Array} segInfo fabricJS collection of information on a parsed path\n   * @param {Number} distance from starting point, in pixels.\n   * @return {Object} info object with x and y ( the point on canvas ) and angle, the tangent on that point;\n   */\n  function findPercentageForDistance(segInfo, distance) {\n    var perc = 0, tmpLen = 0, iterator = segInfo.iterator, tempP = { x: segInfo.x, y: segInfo.y },\n        p, nextLen, nextStep = 0.01, angleFinder = segInfo.angleFinder, lastPerc;\n    // nextStep > 0.0001 covers 0.00015625 that 1/64th of 1/100\n    // the path\n    while (tmpLen < distance && perc <= 1 && nextStep > 0.0001) {\n      p = iterator(perc);\n      lastPerc = perc;\n      nextLen = calcLineLength(tempP.x, tempP.y, p.x, p.y);\n      // compare tmpLen each cycle with distance, decide next perc to test.\n      if ((nextLen + tmpLen) > distance) {\n        // we discard this step and we make smaller steps.\n        nextStep /= 2;\n        perc -= nextStep;\n      }\n      else {\n        tempP = p;\n        perc += nextStep;\n        tmpLen += nextLen;\n      }\n    }\n    p.angle = angleFinder(lastPerc);\n    return p;\n  }\n\n  /**\n   * Run over a parsed and simplifed path and extrac some informations.\n   * informations are length of each command and starting point\n   * @param {Array} path fabricJS parsed path commands\n   * @return {Array} path commands informations\n   */\n  function getPathSegmentsInfo(path) {\n    var totalLength = 0, len = path.length, current,\n        //x2 and y2 are the coords of segment start\n        //x1 and y1 are the coords of the current point\n        x1 = 0, y1 = 0, x2 = 0, y2 = 0, info = [], iterator, tempInfo, angleFinder;\n    for (var i = 0; i < len; i++) {\n      current = path[i];\n      tempInfo = {\n        x: x1,\n        y: y1,\n        command: current[0],\n      };\n      switch (current[0]) { //first letter\n        case 'M':\n          tempInfo.length = 0;\n          x2 = x1 = current[1];\n          y2 = y1 = current[2];\n          break;\n        case 'L':\n          tempInfo.length = calcLineLength(x1, y1, current[1], current[2]);\n          x1 = current[1];\n          y1 = current[2];\n          break;\n        case 'C':\n          iterator = getPointOnCubicBezierIterator(\n            x1,\n            y1,\n            current[1],\n            current[2],\n            current[3],\n            current[4],\n            current[5],\n            current[6]\n          );\n          angleFinder = getTangentCubicIterator(\n            x1,\n            y1,\n            current[1],\n            current[2],\n            current[3],\n            current[4],\n            current[5],\n            current[6]\n          );\n          tempInfo.iterator = iterator;\n          tempInfo.angleFinder = angleFinder;\n          tempInfo.length = pathIterator(iterator, x1, y1);\n          x1 = current[5];\n          y1 = current[6];\n          break;\n        case 'Q':\n          iterator = getPointOnQuadraticBezierIterator(\n            x1,\n            y1,\n            current[1],\n            current[2],\n            current[3],\n            current[4]\n          );\n          angleFinder = getTangentQuadraticIterator(\n            x1,\n            y1,\n            current[1],\n            current[2],\n            current[3],\n            current[4]\n          );\n          tempInfo.iterator = iterator;\n          tempInfo.angleFinder = angleFinder;\n          tempInfo.length = pathIterator(iterator, x1, y1);\n          x1 = current[3];\n          y1 = current[4];\n          break;\n        case 'Z':\n        case 'z':\n          // we add those in order to ease calculations later\n          tempInfo.destX = x2;\n          tempInfo.destY = y2;\n          tempInfo.length = calcLineLength(x1, y1, x2, y2);\n          x1 = x2;\n          y1 = y2;\n          break;\n      }\n      totalLength += tempInfo.length;\n      info.push(tempInfo);\n    }\n    info.push({ length: totalLength, x: x1, y: y1 });\n    return info;\n  }\n\n  function getPointOnPath(path, distance, infos) {\n    if (!infos) {\n      infos = getPathSegmentsInfo(path);\n    }\n    var i = 0;\n    while ((distance - infos[i].length > 0) && i < (infos.length - 2)) {\n      distance -= infos[i].length;\n      i++;\n    }\n    // var distance = infos[infos.length - 1] * perc;\n    var segInfo = infos[i], segPercent = distance / segInfo.length,\n        command = segInfo.command, segment = path[i], info;\n\n    switch (command) {\n      case 'M':\n        return { x: segInfo.x, y: segInfo.y, angle: 0 };\n      case 'Z':\n      case 'z':\n        info = new fabric.Point(segInfo.x, segInfo.y).lerp(\n          new fabric.Point(segInfo.destX, segInfo.destY),\n          segPercent\n        );\n        info.angle = Math.atan2(segInfo.destY - segInfo.y, segInfo.destX - segInfo.x);\n        return info;\n      case 'L':\n        info = new fabric.Point(segInfo.x, segInfo.y).lerp(\n          new fabric.Point(segment[1], segment[2]),\n          segPercent\n        );\n        info.angle = Math.atan2(segment[2] - segInfo.y, segment[1] - segInfo.x);\n        return info;\n      case 'C':\n        return findPercentageForDistance(segInfo, distance);\n      case 'Q':\n        return findPercentageForDistance(segInfo, distance);\n    }\n  }\n\n  /**\n   *\n   * @param {string} pathString\n   * @return {(string|number)[][]} An array of SVG path commands\n   * @example <caption>Usage</caption>\n   * parsePath('M 3 4 Q 3 5 2 1 4 0 Q 9 12 2 1 4 0') === [\n   *   ['M', 3, 4],\n   *   ['Q', 3, 5, 2, 1, 4, 0],\n   *   ['Q', 9, 12, 2, 1, 4, 0],\n   * ];\n   *\n   */\n  function parsePath(pathString) {\n    var result = [],\n        coords = [],\n        currentPath,\n        parsed,\n        re = fabric.rePathCommand,\n        rNumber = '[-+]?(?:\\\\d*\\\\.\\\\d+|\\\\d+\\\\.?)(?:[eE][-+]?\\\\d+)?\\\\s*',\n        rNumberCommaWsp = '(' + rNumber + ')' + fabric.commaWsp,\n        rFlagCommaWsp = '([01])' + fabric.commaWsp + '?',\n        rArcSeq = rNumberCommaWsp + '?' + rNumberCommaWsp + '?' + rNumberCommaWsp + rFlagCommaWsp + rFlagCommaWsp +\n          rNumberCommaWsp + '?(' + rNumber + ')',\n        regArcArgumentSequence = new RegExp(rArcSeq, 'g'),\n        match,\n        coordsStr,\n        // one of commands (m,M,l,L,q,Q,c,C,etc.) followed by non-command characters (i.e. command values)\n        path;\n    if (!pathString || !pathString.match) {\n      return result;\n    }\n    path = pathString.match(/[mzlhvcsqta][^mzlhvcsqta]*/gi);\n\n    for (var i = 0, coordsParsed, len = path.length; i < len; i++) {\n      currentPath = path[i];\n\n      coordsStr = currentPath.slice(1).trim();\n      coords.length = 0;\n\n      var command = currentPath.charAt(0);\n      coordsParsed = [command];\n\n      if (command.toLowerCase() === 'a') {\n        // arcs have special flags that apparently don't require spaces so handle special\n        for (var args; (args = regArcArgumentSequence.exec(coordsStr));) {\n          for (var j = 1; j < args.length; j++) {\n            coords.push(args[j]);\n          }\n        }\n      }\n      else {\n        while ((match = re.exec(coordsStr))) {\n          coords.push(match[0]);\n        }\n      }\n\n      for (var j = 0, jlen = coords.length; j < jlen; j++) {\n        parsed = parseFloat(coords[j]);\n        if (!isNaN(parsed)) {\n          coordsParsed.push(parsed);\n        }\n      }\n\n      var commandLength = commandLengths[command.toLowerCase()],\n          repeatedCommand = repeatedCommands[command] || command;\n\n      if (coordsParsed.length - 1 > commandLength) {\n        for (var k = 1, klen = coordsParsed.length; k < klen; k += commandLength) {\n          result.push([command].concat(coordsParsed.slice(k, k + commandLength)));\n          command = repeatedCommand;\n        }\n      }\n      else {\n        result.push(coordsParsed);\n      }\n    }\n\n    return result;\n  };\n\n  /**\n   *\n   * Converts points to a smooth SVG path\n   * @param {{ x: number,y: number }[]} points Array of points\n   * @param {number} [correction] Apply a correction to the path (usually we use `width / 1000`). If value is undefined 0 is used as the correction value.\n   * @return {(string|number)[][]} An array of SVG path commands\n   */\n  function getSmoothPathFromPoints(points, correction) {\n    var path = [], i,\n        p1 = new fabric.Point(points[0].x, points[0].y),\n        p2 = new fabric.Point(points[1].x, points[1].y),\n        len = points.length, multSignX = 1, multSignY = 0, manyPoints = len > 2;\n    correction = correction || 0;\n\n    if (manyPoints) {\n      multSignX = points[2].x < p2.x ? -1 : points[2].x === p2.x ? 0 : 1;\n      multSignY = points[2].y < p2.y ? -1 : points[2].y === p2.y ? 0 : 1;\n    }\n    path.push(['M', p1.x - multSignX * correction, p1.y - multSignY * correction]);\n    for (i = 1; i < len; i++) {\n      if (!p1.eq(p2)) {\n        var midPoint = p1.midPointFrom(p2);\n        // p1 is our bezier control point\n        // midpoint is our endpoint\n        // start point is p(i-1) value.\n        path.push(['Q', p1.x, p1.y, midPoint.x, midPoint.y]);\n      }\n      p1 = points[i];\n      if ((i + 1) < points.length) {\n        p2 = points[i + 1];\n      }\n    }\n    if (manyPoints) {\n      multSignX = p1.x > points[i - 2].x ? 1 : p1.x === points[i - 2].x ? 0 : -1;\n      multSignY = p1.y > points[i - 2].y ? 1 : p1.y === points[i - 2].y ? 0 : -1;\n    }\n    path.push(['L', p1.x + multSignX * correction, p1.y + multSignY * correction]);\n    return path;\n  }\n  /**\n   * Transform a path by transforming each segment.\n   * it has to be a simplified path or it won't work.\n   * WARNING: this depends from pathOffset for correct operation\n   * @param {Array} path fabricJS parsed and simplified path commands\n   * @param {Array} transform matrix that represent the transformation\n   * @param {Object} [pathOffset] the fabric.Path pathOffset\n   * @param {Number} pathOffset.x\n   * @param {Number} pathOffset.y\n   * @returns {Array} the transformed path\n   */\n  function transformPath(path, transform, pathOffset) {\n    if (pathOffset) {\n      transform = fabric.util.multiplyTransformMatrices(\n        transform,\n        [1, 0, 0, 1, -pathOffset.x, -pathOffset.y]\n      );\n    }\n    return path.map(function(pathSegment) {\n      var newSegment = pathSegment.slice(0), point = {};\n      for (var i = 1; i < pathSegment.length - 1; i += 2) {\n        point.x = pathSegment[i];\n        point.y = pathSegment[i + 1];\n        point = fabric.util.transformPoint(point, transform);\n        newSegment[i] = point.x;\n        newSegment[i + 1] = point.y;\n      }\n      return newSegment;\n    });\n  }\n\n  /**\n   * Calculate bounding box of a elliptic-arc\n   * @deprecated\n   * @param {Number} fx start point of arc\n   * @param {Number} fy\n   * @param {Number} rx horizontal radius\n   * @param {Number} ry vertical radius\n   * @param {Number} rot angle of horizontal axis\n   * @param {Number} large 1 or 0, whatever the arc is the big or the small on the 2 points\n   * @param {Number} sweep 1 or 0, 1 clockwise or counterclockwise direction\n   * @param {Number} tx end point of arc\n   * @param {Number} ty\n   */\n  function getBoundsOfArc(fx, fy, rx, ry, rot, large, sweep, tx, ty) {\n\n    var fromX = 0, fromY = 0, bound, bounds = [],\n        segs = arcToSegments(tx - fx, ty - fy, rx, ry, large, sweep, rot);\n\n    for (var i = 0, len = segs.length; i < len; i++) {\n      bound = getBoundsOfCurve(fromX, fromY, segs[i][1], segs[i][2], segs[i][3], segs[i][4], segs[i][5], segs[i][6]);\n      bounds.push({ x: bound[0].x + fx, y: bound[0].y + fy });\n      bounds.push({ x: bound[1].x + fx, y: bound[1].y + fy });\n      fromX = segs[i][5];\n      fromY = segs[i][6];\n    }\n    return bounds;\n  };\n\n  /**\n   * Draws arc\n   * @deprecated\n   * @param {CanvasRenderingContext2D} ctx\n   * @param {Number} fx\n   * @param {Number} fy\n   * @param {Array} coords coords of the arc, without the front 'A/a'\n   */\n  function drawArc(ctx, fx, fy, coords) {\n    coords = coords.slice(0).unshift('X'); // command A or a does not matter\n    var beziers = fromArcToBeziers(fx, fy, coords);\n    beziers.forEach(function(bezier) {\n      ctx.bezierCurveTo.apply(ctx, bezier.slice(1));\n    });\n  };\n\n  /**\n   * Join path commands to go back to svg format\n   * @param {Array} pathData fabricJS parsed path commands\n   * @return {String} joined path 'M 0 0 L 20 30'\n   */\n  fabric.util.joinPath = function(pathData) {\n    return pathData.map(function (segment) { return segment.join(' '); }).join(' ');\n  };\n  fabric.util.parsePath = parsePath;\n  fabric.util.makePathSimpler = makePathSimpler;\n  fabric.util.getSmoothPathFromPoints = getSmoothPathFromPoints;\n  fabric.util.getPathSegmentsInfo = getPathSegmentsInfo;\n  fabric.util.getBoundsOfCurve = getBoundsOfCurve;\n  fabric.util.getPointOnPath = getPointOnPath;\n  fabric.util.transformPath = transformPath;\n  /**\n   * Typo of `fromArcToBeziers` kept for not breaking the api once corrected.\n   * Will be removed in fabric 5.0\n   * @deprecated\n   */\n  fabric.util.fromArcToBeizers = fromArcToBeziers;\n  // kept because we do not want to make breaking changes.\n  // but useless and deprecated.\n  fabric.util.getBoundsOfArc = getBoundsOfArc;\n  fabric.util.drawArc = drawArc;\n})();\n\n\n(function() {\n\n  var slice = Array.prototype.slice;\n\n  /**\n   * Invokes method on all items in a given array\n   * @memberOf fabric.util.array\n   * @param {Array} array Array to iterate over\n   * @param {String} method Name of a method to invoke\n   * @return {Array}\n   */\n  function invoke(array, method) {\n    var args = slice.call(arguments, 2), result = [];\n    for (var i = 0, len = array.length; i < len; i++) {\n      result[i] = args.length ? array[i][method].apply(array[i], args) : array[i][method].call(array[i]);\n    }\n    return result;\n  }\n\n  /**\n   * Finds maximum value in array (not necessarily \"first\" one)\n   * @memberOf fabric.util.array\n   * @param {Array} array Array to iterate over\n   * @param {String} byProperty\n   * @return {*}\n   */\n  function max(array, byProperty) {\n    return find(array, byProperty, function(value1, value2) {\n      return value1 >= value2;\n    });\n  }\n\n  /**\n   * Finds minimum value in array (not necessarily \"first\" one)\n   * @memberOf fabric.util.array\n   * @param {Array} array Array to iterate over\n   * @param {String} byProperty\n   * @return {*}\n   */\n  function min(array, byProperty) {\n    return find(array, byProperty, function(value1, value2) {\n      return value1 < value2;\n    });\n  }\n\n  /**\n   * @private\n   */\n  function fill(array, value) {\n    var k = array.length;\n    while (k--) {\n      array[k] = value;\n    }\n    return array;\n  }\n\n  /**\n   * @private\n   */\n  function find(array, byProperty, condition) {\n    if (!array || array.length === 0) {\n      return;\n    }\n\n    var i = array.length - 1,\n        result = byProperty ? array[i][byProperty] : array[i];\n    if (byProperty) {\n      while (i--) {\n        if (condition(array[i][byProperty], result)) {\n          result = array[i][byProperty];\n        }\n      }\n    }\n    else {\n      while (i--) {\n        if (condition(array[i], result)) {\n          result = array[i];\n        }\n      }\n    }\n    return result;\n  }\n\n  /**\n   * @namespace fabric.util.array\n   */\n  fabric.util.array = {\n    fill: fill,\n    invoke: invoke,\n    min: min,\n    max: max\n  };\n\n})();\n\n\n(function() {\n  /**\n   * Copies all enumerable properties of one js object to another\n   * this does not and cannot compete with generic utils.\n   * Does not clone or extend fabric.Object subclasses.\n   * This is mostly for internal use and has extra handling for fabricJS objects\n   * it skips the canvas and group properties in deep cloning.\n   * @memberOf fabric.util.object\n   * @param {Object} destination Where to copy to\n   * @param {Object} source Where to copy from\n   * @param {Boolean} [deep] Whether to extend nested objects\n   * @return {Object}\n   */\n\n  function extend(destination, source, deep) {\n    // JScript DontEnum bug is not taken care of\n    // the deep clone is for internal use, is not meant to avoid\n    // javascript traps or cloning html element or self referenced objects.\n    if (deep) {\n      if (!fabric.isLikelyNode && source instanceof Element) {\n        // avoid cloning deep images, canvases,\n        destination = source;\n      }\n      else if (source instanceof Array) {\n        destination = [];\n        for (var i = 0, len = source.length; i < len; i++) {\n          destination[i] = extend({ }, source[i], deep);\n        }\n      }\n      else if (source && typeof source === 'object') {\n        for (var property in source) {\n          if (property === 'canvas' || property === 'group') {\n            // we do not want to clone this props at all.\n            // we want to keep the keys in the copy\n            destination[property] = null;\n          }\n          else if (source.hasOwnProperty(property)) {\n            destination[property] = extend({ }, source[property], deep);\n          }\n        }\n      }\n      else {\n        // this sounds odd for an extend but is ok for recursive use\n        destination = source;\n      }\n    }\n    else {\n      for (var property in source) {\n        destination[property] = source[property];\n      }\n    }\n    return destination;\n  }\n\n  /**\n   * Creates an empty object and copies all enumerable properties of another object to it\n   * This method is mostly for internal use, and not intended for duplicating shapes in canvas. \n   * @memberOf fabric.util.object\n   * @param {Object} object Object to clone\n   * @param {Boolean} [deep] Whether to clone nested objects\n   * @return {Object}\n   */\n\n  //TODO: this function return an empty object if you try to clone null\n  function clone(object, deep) {\n    return extend({ }, object, deep);\n  }\n\n  /** @namespace fabric.util.object */\n  fabric.util.object = {\n    extend: extend,\n    clone: clone\n  };\n  fabric.util.object.extend(fabric.util, fabric.Observable);\n})();\n\n\n(function() {\n\n  /**\n   * Camelizes a string\n   * @memberOf fabric.util.string\n   * @param {String} string String to camelize\n   * @return {String} Camelized version of a string\n   */\n  function camelize(string) {\n    return string.replace(/-+(.)?/g, function(match, character) {\n      return character ? character.toUpperCase() : '';\n    });\n  }\n\n  /**\n   * Capitalizes a string\n   * @memberOf fabric.util.string\n   * @param {String} string String to capitalize\n   * @param {Boolean} [firstLetterOnly] If true only first letter is capitalized\n   * and other letters stay untouched, if false first letter is capitalized\n   * and other letters are converted to lowercase.\n   * @return {String} Capitalized version of a string\n   */\n  function capitalize(string, firstLetterOnly) {\n    return string.charAt(0).toUpperCase() +\n      (firstLetterOnly ? string.slice(1) : string.slice(1).toLowerCase());\n  }\n\n  /**\n   * Escapes XML in a string\n   * @memberOf fabric.util.string\n   * @param {String} string String to escape\n   * @return {String} Escaped version of a string\n   */\n  function escapeXml(string) {\n    return string.replace(/&/g, '&amp;')\n      .replace(/\"/g, '&quot;')\n      .replace(/'/g, '&apos;')\n      .replace(/</g, '&lt;')\n      .replace(/>/g, '&gt;');\n  }\n\n  /**\n   * Divide a string in the user perceived single units\n   * @memberOf fabric.util.string\n   * @param {String} textstring String to escape\n   * @return {Array} array containing the graphemes\n   */\n  function graphemeSplit(textstring) {\n    var i = 0, chr, graphemes = [];\n    for (i = 0, chr; i < textstring.length; i++) {\n      if ((chr = getWholeChar(textstring, i)) === false) {\n        continue;\n      }\n      graphemes.push(chr);\n    }\n    return graphemes;\n  }\n\n  // taken from mdn in the charAt doc page.\n  function getWholeChar(str, i) {\n    var code = str.charCodeAt(i);\n\n    if (isNaN(code)) {\n      return ''; // Position not found\n    }\n    if (code < 0xD800 || code > 0xDFFF) {\n      return str.charAt(i);\n    }\n\n    // High surrogate (could change last hex to 0xDB7F to treat high private\n    // surrogates as single characters)\n    if (0xD800 <= code && code <= 0xDBFF) {\n      if (str.length <= (i + 1)) {\n        throw 'High surrogate without following low surrogate';\n      }\n      var next = str.charCodeAt(i + 1);\n      if (0xDC00 > next || next > 0xDFFF) {\n        throw 'High surrogate without following low surrogate';\n      }\n      return str.charAt(i) + str.charAt(i + 1);\n    }\n    // Low surrogate (0xDC00 <= code && code <= 0xDFFF)\n    if (i === 0) {\n      throw 'Low surrogate without preceding high surrogate';\n    }\n    var prev = str.charCodeAt(i - 1);\n\n    // (could change last hex to 0xDB7F to treat high private\n    // surrogates as single characters)\n    if (0xD800 > prev || prev > 0xDBFF) {\n      throw 'Low surrogate without preceding high surrogate';\n    }\n    // We can pass over low surrogates now as the second component\n    // in a pair which we have already processed\n    return false;\n  }\n\n\n  /**\n   * String utilities\n   * @namespace fabric.util.string\n   */\n  fabric.util.string = {\n    camelize: camelize,\n    capitalize: capitalize,\n    escapeXml: escapeXml,\n    graphemeSplit: graphemeSplit\n  };\n})();\n\n\n(function() {\n\n  var slice = Array.prototype.slice, emptyFunction = function() { },\n\n      IS_DONTENUM_BUGGY = (function() {\n        for (var p in { toString: 1 }) {\n          if (p === 'toString') {\n            return false;\n          }\n        }\n        return true;\n      })(),\n\n      /** @ignore */\n      addMethods = function(klass, source, parent) {\n        for (var property in source) {\n\n          if (property in klass.prototype &&\n              typeof klass.prototype[property] === 'function' &&\n              (source[property] + '').indexOf('callSuper') > -1) {\n\n            klass.prototype[property] = (function(property) {\n              return function() {\n\n                var superclass = this.constructor.superclass;\n                this.constructor.superclass = parent;\n                var returnValue = source[property].apply(this, arguments);\n                this.constructor.superclass = superclass;\n\n                if (property !== 'initialize') {\n                  return returnValue;\n                }\n              };\n            })(property);\n          }\n          else {\n            klass.prototype[property] = source[property];\n          }\n\n          if (IS_DONTENUM_BUGGY) {\n            if (source.toString !== Object.prototype.toString) {\n              klass.prototype.toString = source.toString;\n            }\n            if (source.valueOf !== Object.prototype.valueOf) {\n              klass.prototype.valueOf = source.valueOf;\n            }\n          }\n        }\n      };\n\n  function Subclass() { }\n\n  function callSuper(methodName) {\n    var parentMethod = null,\n        _this = this;\n\n    // climb prototype chain to find method not equal to callee's method\n    while (_this.constructor.superclass) {\n      var superClassMethod = _this.constructor.superclass.prototype[methodName];\n      if (_this[methodName] !== superClassMethod) {\n        parentMethod = superClassMethod;\n        break;\n      }\n      // eslint-disable-next-line\n      _this = _this.constructor.superclass.prototype;\n    }\n\n    if (!parentMethod) {\n      return console.log('tried to callSuper ' + methodName + ', method not found in prototype chain', this);\n    }\n\n    return (arguments.length > 1)\n      ? parentMethod.apply(this, slice.call(arguments, 1))\n      : parentMethod.call(this);\n  }\n\n  /**\n   * Helper for creation of \"classes\".\n   * @memberOf fabric.util\n   * @param {Function} [parent] optional \"Class\" to inherit from\n   * @param {Object} [properties] Properties shared by all instances of this class\n   *                  (be careful modifying objects defined here as this would affect all instances)\n   */\n  function createClass() {\n    var parent = null,\n        properties = slice.call(arguments, 0);\n\n    if (typeof properties[0] === 'function') {\n      parent = properties.shift();\n    }\n    function klass() {\n      this.initialize.apply(this, arguments);\n    }\n\n    klass.superclass = parent;\n    klass.subclasses = [];\n\n    if (parent) {\n      Subclass.prototype = parent.prototype;\n      klass.prototype = new Subclass();\n      parent.subclasses.push(klass);\n    }\n    for (var i = 0, length = properties.length; i < length; i++) {\n      addMethods(klass, properties[i], parent);\n    }\n    if (!klass.prototype.initialize) {\n      klass.prototype.initialize = emptyFunction;\n    }\n    klass.prototype.constructor = klass;\n    klass.prototype.callSuper = callSuper;\n    return klass;\n  }\n\n  fabric.util.createClass = createClass;\n})();\n\n\n(function () {\n  // since ie11 can use addEventListener but they do not support options, i need to check\n  var couldUseAttachEvent = !!fabric.document.createElement('div').attachEvent,\n      touchEvents = ['touchstart', 'touchmove', 'touchend'];\n  /**\n   * Adds an event listener to an element\n   * @function\n   * @memberOf fabric.util\n   * @param {HTMLElement} element\n   * @param {String} eventName\n   * @param {Function} handler\n   */\n  fabric.util.addListener = function(element, eventName, handler, options) {\n    element && element.addEventListener(eventName, handler, couldUseAttachEvent ? false : options);\n  };\n\n  /**\n   * Removes an event listener from an element\n   * @function\n   * @memberOf fabric.util\n   * @param {HTMLElement} element\n   * @param {String} eventName\n   * @param {Function} handler\n   */\n  fabric.util.removeListener = function(element, eventName, handler, options) {\n    element && element.removeEventListener(eventName, handler, couldUseAttachEvent ? false : options);\n  };\n\n  function getTouchInfo(event) {\n    var touchProp = event.changedTouches;\n    if (touchProp && touchProp[0]) {\n      return touchProp[0];\n    }\n    return event;\n  }\n\n  fabric.util.getPointer = function(event) {\n    var element = event.target,\n        scroll = fabric.util.getScrollLeftTop(element),\n        _evt = getTouchInfo(event);\n    return {\n      x: _evt.clientX + scroll.left,\n      y: _evt.clientY + scroll.top\n    };\n  };\n\n  fabric.util.isTouchEvent = function(event) {\n    return touchEvents.indexOf(event.type) > -1 || event.pointerType === 'touch';\n  };\n})();\n\n\n(function () {\n\n  /**\n   * Cross-browser wrapper for setting element's style\n   * @memberOf fabric.util\n   * @param {HTMLElement} element\n   * @param {Object} styles\n   * @return {HTMLElement} Element that was passed as a first argument\n   */\n  function setStyle(element, styles) {\n    var elementStyle = element.style;\n    if (!elementStyle) {\n      return element;\n    }\n    if (typeof styles === 'string') {\n      element.style.cssText += ';' + styles;\n      return styles.indexOf('opacity') > -1\n        ? setOpacity(element, styles.match(/opacity:\\s*(\\d?\\.?\\d*)/)[1])\n        : element;\n    }\n    for (var property in styles) {\n      if (property === 'opacity') {\n        setOpacity(element, styles[property]);\n      }\n      else {\n        var normalizedProperty = (property === 'float' || property === 'cssFloat')\n          ? (typeof elementStyle.styleFloat === 'undefined' ? 'cssFloat' : 'styleFloat')\n          : property;\n        elementStyle[normalizedProperty] = styles[property];\n      }\n    }\n    return element;\n  }\n\n  var parseEl = fabric.document.createElement('div'),\n      supportsOpacity = typeof parseEl.style.opacity === 'string',\n      supportsFilters = typeof parseEl.style.filter === 'string',\n      reOpacity = /alpha\\s*\\(\\s*opacity\\s*=\\s*([^\\)]+)\\)/,\n\n      /** @ignore */\n      setOpacity = function (element) { return element; };\n\n  if (supportsOpacity) {\n    /** @ignore */\n    setOpacity = function(element, value) {\n      element.style.opacity = value;\n      return element;\n    };\n  }\n  else if (supportsFilters) {\n    /** @ignore */\n    setOpacity = function(element, value) {\n      var es = element.style;\n      if (element.currentStyle && !element.currentStyle.hasLayout) {\n        es.zoom = 1;\n      }\n      if (reOpacity.test(es.filter)) {\n        value = value >= 0.9999 ? '' : ('alpha(opacity=' + (value * 100) + ')');\n        es.filter = es.filter.replace(reOpacity, value);\n      }\n      else {\n        es.filter += ' alpha(opacity=' + (value * 100) + ')';\n      }\n      return element;\n    };\n  }\n\n  fabric.util.setStyle = setStyle;\n\n})();\n\n\n(function() {\n\n  var _slice = Array.prototype.slice;\n\n  /**\n   * Takes id and returns an element with that id (if one exists in a document)\n   * @memberOf fabric.util\n   * @param {String|HTMLElement} id\n   * @return {HTMLElement|null}\n   */\n  function getById(id) {\n    return typeof id === 'string' ? fabric.document.getElementById(id) : id;\n  }\n\n  var sliceCanConvertNodelists,\n      /**\n       * Converts an array-like object (e.g. arguments or NodeList) to an array\n       * @memberOf fabric.util\n       * @param {Object} arrayLike\n       * @return {Array}\n       */\n      toArray = function(arrayLike) {\n        return _slice.call(arrayLike, 0);\n      };\n\n  try {\n    sliceCanConvertNodelists = toArray(fabric.document.childNodes) instanceof Array;\n  }\n  catch (err) { }\n\n  if (!sliceCanConvertNodelists) {\n    toArray = function(arrayLike) {\n      var arr = new Array(arrayLike.length), i = arrayLike.length;\n      while (i--) {\n        arr[i] = arrayLike[i];\n      }\n      return arr;\n    };\n  }\n\n  /**\n   * Creates specified element with specified attributes\n   * @memberOf fabric.util\n   * @param {String} tagName Type of an element to create\n   * @param {Object} [attributes] Attributes to set on an element\n   * @return {HTMLElement} Newly created element\n   */\n  function makeElement(tagName, attributes) {\n    var el = fabric.document.createElement(tagName);\n    for (var prop in attributes) {\n      if (prop === 'class') {\n        el.className = attributes[prop];\n      }\n      else if (prop === 'for') {\n        el.htmlFor = attributes[prop];\n      }\n      else {\n        el.setAttribute(prop, attributes[prop]);\n      }\n    }\n    return el;\n  }\n\n  /**\n   * Adds class to an element\n   * @memberOf fabric.util\n   * @param {HTMLElement} element Element to add class to\n   * @param {String} className Class to add to an element\n   */\n  function addClass(element, className) {\n    if (element && (' ' + element.className + ' ').indexOf(' ' + className + ' ') === -1) {\n      element.className += (element.className ? ' ' : '') + className;\n    }\n  }\n\n  /**\n   * Wraps element with another element\n   * @memberOf fabric.util\n   * @param {HTMLElement} element Element to wrap\n   * @param {HTMLElement|String} wrapper Element to wrap with\n   * @param {Object} [attributes] Attributes to set on a wrapper\n   * @return {HTMLElement} wrapper\n   */\n  function wrapElement(element, wrapper, attributes) {\n    if (typeof wrapper === 'string') {\n      wrapper = makeElement(wrapper, attributes);\n    }\n    if (element.parentNode) {\n      element.parentNode.replaceChild(wrapper, element);\n    }\n    wrapper.appendChild(element);\n    return wrapper;\n  }\n\n  /**\n   * Returns element scroll offsets\n   * @memberOf fabric.util\n   * @param {HTMLElement} element Element to operate on\n   * @return {Object} Object with left/top values\n   */\n  function getScrollLeftTop(element) {\n\n    var left = 0,\n        top = 0,\n        docElement = fabric.document.documentElement,\n        body = fabric.document.body || {\n          scrollLeft: 0, scrollTop: 0\n        };\n\n    // While loop checks (and then sets element to) .parentNode OR .host\n    //  to account for ShadowDOM. We still want to traverse up out of ShadowDOM,\n    //  but the .parentNode of a root ShadowDOM node will always be null, instead\n    //  it should be accessed through .host. See http://stackoverflow.com/a/24765528/4383938\n    while (element && (element.parentNode || element.host)) {\n\n      // Set element to element parent, or 'host' in case of ShadowDOM\n      element = element.parentNode || element.host;\n\n      if (element === fabric.document) {\n        left = body.scrollLeft || docElement.scrollLeft || 0;\n        top = body.scrollTop ||  docElement.scrollTop || 0;\n      }\n      else {\n        left += element.scrollLeft || 0;\n        top += element.scrollTop || 0;\n      }\n\n      if (element.nodeType === 1 && element.style.position === 'fixed') {\n        break;\n      }\n    }\n\n    return { left: left, top: top };\n  }\n\n  /**\n   * Returns offset for a given element\n   * @function\n   * @memberOf fabric.util\n   * @param {HTMLElement} element Element to get offset for\n   * @return {Object} Object with \"left\" and \"top\" properties\n   */\n  function getElementOffset(element) {\n    var docElem,\n        doc = element && element.ownerDocument,\n        box = { left: 0, top: 0 },\n        offset = { left: 0, top: 0 },\n        scrollLeftTop,\n        offsetAttributes = {\n          borderLeftWidth: 'left',\n          borderTopWidth:  'top',\n          paddingLeft:     'left',\n          paddingTop:      'top'\n        };\n\n    if (!doc) {\n      return offset;\n    }\n\n    for (var attr in offsetAttributes) {\n      offset[offsetAttributes[attr]] += parseInt(getElementStyle(element, attr), 10) || 0;\n    }\n\n    docElem = doc.documentElement;\n    if ( typeof element.getBoundingClientRect !== 'undefined' ) {\n      box = element.getBoundingClientRect();\n    }\n\n    scrollLeftTop = getScrollLeftTop(element);\n\n    return {\n      left: box.left + scrollLeftTop.left - (docElem.clientLeft || 0) + offset.left,\n      top: box.top + scrollLeftTop.top - (docElem.clientTop || 0)  + offset.top\n    };\n  }\n\n  /**\n   * Returns style attribute value of a given element\n   * @memberOf fabric.util\n   * @param {HTMLElement} element Element to get style attribute for\n   * @param {String} attr Style attribute to get for element\n   * @return {String} Style attribute value of the given element.\n   */\n  var getElementStyle;\n  if (fabric.document.defaultView && fabric.document.defaultView.getComputedStyle) {\n    getElementStyle = function(element, attr) {\n      var style = fabric.document.defaultView.getComputedStyle(element, null);\n      return style ? style[attr] : undefined;\n    };\n  }\n  else {\n    getElementStyle = function(element, attr) {\n      var value = element.style[attr];\n      if (!value && element.currentStyle) {\n        value = element.currentStyle[attr];\n      }\n      return value;\n    };\n  }\n\n  (function () {\n    var style = fabric.document.documentElement.style,\n        selectProp = 'userSelect' in style\n          ? 'userSelect'\n          : 'MozUserSelect' in style\n            ? 'MozUserSelect'\n            : 'WebkitUserSelect' in style\n              ? 'WebkitUserSelect'\n              : 'KhtmlUserSelect' in style\n                ? 'KhtmlUserSelect'\n                : '';\n\n    /**\n     * Makes element unselectable\n     * @memberOf fabric.util\n     * @param {HTMLElement} element Element to make unselectable\n     * @return {HTMLElement} Element that was passed in\n     */\n    function makeElementUnselectable(element) {\n      if (typeof element.onselectstart !== 'undefined') {\n        element.onselectstart = fabric.util.falseFunction;\n      }\n      if (selectProp) {\n        element.style[selectProp] = 'none';\n      }\n      else if (typeof element.unselectable === 'string') {\n        element.unselectable = 'on';\n      }\n      return element;\n    }\n\n    /**\n     * Makes element selectable\n     * @memberOf fabric.util\n     * @param {HTMLElement} element Element to make selectable\n     * @return {HTMLElement} Element that was passed in\n     */\n    function makeElementSelectable(element) {\n      if (typeof element.onselectstart !== 'undefined') {\n        element.onselectstart = null;\n      }\n      if (selectProp) {\n        element.style[selectProp] = '';\n      }\n      else if (typeof element.unselectable === 'string') {\n        element.unselectable = '';\n      }\n      return element;\n    }\n\n    fabric.util.makeElementUnselectable = makeElementUnselectable;\n    fabric.util.makeElementSelectable = makeElementSelectable;\n  })();\n\n  function getNodeCanvas(element) {\n    var impl = fabric.jsdomImplForWrapper(element);\n    return impl._canvas || impl._image;\n  };\n\n  function cleanUpJsdomNode(element) {\n    if (!fabric.isLikelyNode) {\n      return;\n    }\n    var impl = fabric.jsdomImplForWrapper(element);\n    if (impl) {\n      impl._image = null;\n      impl._canvas = null;\n      // unsure if necessary\n      impl._currentSrc = null;\n      impl._attributes = null;\n      impl._classList = null;\n    }\n  }\n\n  function setImageSmoothing(ctx, value) {\n    ctx.imageSmoothingEnabled = ctx.imageSmoothingEnabled || ctx.webkitImageSmoothingEnabled\n      || ctx.mozImageSmoothingEnabled || ctx.msImageSmoothingEnabled || ctx.oImageSmoothingEnabled;\n    ctx.imageSmoothingEnabled = value;\n  }\n\n  /**\n   * setImageSmoothing sets the context imageSmoothingEnabled property.\n   * Used by canvas and by ImageObject.\n   * @memberOf fabric.util\n   * @since 4.0.0\n   * @param {HTMLRenderingContext2D} ctx to set on\n   * @param {Boolean} value true or false\n   */\n  fabric.util.setImageSmoothing = setImageSmoothing;\n  fabric.util.getById = getById;\n  fabric.util.toArray = toArray;\n  fabric.util.addClass = addClass;\n  fabric.util.makeElement = makeElement;\n  fabric.util.wrapElement = wrapElement;\n  fabric.util.getScrollLeftTop = getScrollLeftTop;\n  fabric.util.getElementOffset = getElementOffset;\n  fabric.util.getNodeCanvas = getNodeCanvas;\n  fabric.util.cleanUpJsdomNode = cleanUpJsdomNode;\n\n})();\n\n\n(function() {\n\n  function addParamToUrl(url, param) {\n    return url + (/\\?/.test(url) ? '&' : '?') + param;\n  }\n\n  function emptyFn() { }\n\n  /**\n   * Cross-browser abstraction for sending XMLHttpRequest\n   * @memberOf fabric.util\n   * @param {String} url URL to send XMLHttpRequest to\n   * @param {Object} [options] Options object\n   * @param {String} [options.method=\"GET\"]\n   * @param {String} [options.parameters] parameters to append to url in GET or in body\n   * @param {String} [options.body] body to send with POST or PUT request\n   * @param {Function} options.onComplete Callback to invoke when request is completed\n   * @return {XMLHttpRequest} request\n   */\n  function request(url, options) {\n    options || (options = { });\n\n    var method = options.method ? options.method.toUpperCase() : 'GET',\n        onComplete = options.onComplete || function() { },\n        xhr = new fabric.window.XMLHttpRequest(),\n        body = options.body || options.parameters;\n\n    /** @ignore */\n    xhr.onreadystatechange = function() {\n      if (xhr.readyState === 4) {\n        onComplete(xhr);\n        xhr.onreadystatechange = emptyFn;\n      }\n    };\n\n    if (method === 'GET') {\n      body = null;\n      if (typeof options.parameters === 'string') {\n        url = addParamToUrl(url, options.parameters);\n      }\n    }\n\n    xhr.open(method, url, true);\n\n    if (method === 'POST' || method === 'PUT') {\n      xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');\n    }\n\n    xhr.send(body);\n    return xhr;\n  }\n\n  fabric.util.request = request;\n})();\n\n\n/**\n * Wrapper around `console.log` (when available)\n * @param {*} [values] Values to log\n */\nfabric.log = console.log;\n\n/**\n * Wrapper around `console.warn` (when available)\n * @param {*} [values] Values to log as a warning\n */\nfabric.warn = console.warn;\n\n\n(function() {\n\n  function noop() {\n    return false;\n  }\n\n  function defaultEasing(t, b, c, d) {\n    return -c * Math.cos(t / d * (Math.PI / 2)) + c + b;\n  }\n\n  /**\n   * Changes value from one to another within certain period of time, invoking callbacks as value is being changed.\n   * @memberOf fabric.util\n   * @param {Object} [options] Animation options\n   * @param {Function} [options.onChange] Callback; invoked on every value change\n   * @param {Function} [options.onComplete] Callback; invoked when value change is completed\n   * @param {Number} [options.startValue=0] Starting value\n   * @param {Number} [options.endValue=100] Ending value\n   * @param {Number} [options.byValue=100] Value to modify the property by\n   * @param {Function} [options.easing] Easing function\n   * @param {Number} [options.duration=500] Duration of change (in ms)\n   * @param {Function} [options.abort] Additional function with logic. If returns true, onComplete is called.\n   * @returns {Function} abort function\n   */\n  function animate(options) {\n    var cancel = false;\n    requestAnimFrame(function(timestamp) {\n      options || (options = { });\n\n      var start = timestamp || +new Date(),\n          duration = options.duration || 500,\n          finish = start + duration, time,\n          onChange = options.onChange || noop,\n          abort = options.abort || noop,\n          onComplete = options.onComplete || noop,\n          easing = options.easing || defaultEasing,\n          startValue = 'startValue' in options ? options.startValue : 0,\n          endValue = 'endValue' in options ? options.endValue : 100,\n          byValue = options.byValue || endValue - startValue;\n\n      options.onStart && options.onStart();\n\n      (function tick(ticktime) {\n        // TODO: move abort call after calculation\n        // and pass (current,valuePerc, timePerc) as arguments\n        time = ticktime || +new Date();\n        var currentTime = time > finish ? duration : (time - start),\n            timePerc = currentTime / duration,\n            current = easing(currentTime, startValue, byValue, duration),\n            valuePerc = Math.abs((current - startValue) / byValue);\n        if (cancel) {\n          return;\n        }\n        if (abort(current, valuePerc, timePerc)) {\n          // remove this in 4.0\n          // does to even make sense to abort and run onComplete?\n          onComplete(endValue, 1, 1);\n          return;\n        }\n        if (time > finish) {\n          onChange(endValue, 1, 1);\n          onComplete(endValue, 1, 1);\n          return;\n        }\n        else {\n          onChange(current, valuePerc, timePerc);\n          requestAnimFrame(tick);\n        }\n      })(start);\n    });\n    return function() {\n      cancel = true;\n    };\n  }\n\n  var _requestAnimFrame = fabric.window.requestAnimationFrame       ||\n                          fabric.window.webkitRequestAnimationFrame ||\n                          fabric.window.mozRequestAnimationFrame    ||\n                          fabric.window.oRequestAnimationFrame      ||\n                          fabric.window.msRequestAnimationFrame     ||\n                          function(callback) {\n                            return fabric.window.setTimeout(callback, 1000 / 60);\n                          };\n\n  var _cancelAnimFrame = fabric.window.cancelAnimationFrame || fabric.window.clearTimeout;\n\n  /**\n   * requestAnimationFrame polyfill based on http://paulirish.com/2011/requestanimationframe-for-smart-animating/\n   * In order to get a precise start time, `requestAnimFrame` should be called as an entry into the method\n   * @memberOf fabric.util\n   * @param {Function} callback Callback to invoke\n   * @param {DOMElement} element optional Element to associate with animation\n   */\n  function requestAnimFrame() {\n    return _requestAnimFrame.apply(fabric.window, arguments);\n  }\n\n  function cancelAnimFrame() {\n    return _cancelAnimFrame.apply(fabric.window, arguments);\n  }\n\n  fabric.util.animate = animate;\n  fabric.util.requestAnimFrame = requestAnimFrame;\n  fabric.util.cancelAnimFrame = cancelAnimFrame;\n})();\n\n\n(function() {\n  // Calculate an in-between color. Returns a \"rgba()\" string.\n  // Credit: Edwin Martin <edwin@bitstorm.org>\n  //         http://www.bitstorm.org/jquery/color-animation/jquery.animate-colors.js\n  function calculateColor(begin, end, pos) {\n    var color = 'rgba('\n        + parseInt((begin[0] + pos * (end[0] - begin[0])), 10) + ','\n        + parseInt((begin[1] + pos * (end[1] - begin[1])), 10) + ','\n        + parseInt((begin[2] + pos * (end[2] - begin[2])), 10);\n\n    color += ',' + (begin && end ? parseFloat(begin[3] + pos * (end[3] - begin[3])) : 1);\n    color += ')';\n    return color;\n  }\n\n  /**\n   * Changes the color from one to another within certain period of time, invoking callbacks as value is being changed.\n   * @memberOf fabric.util\n   * @param {String} fromColor The starting color in hex or rgb(a) format.\n   * @param {String} toColor The starting color in hex or rgb(a) format.\n   * @param {Number} [duration] Duration of change (in ms).\n   * @param {Object} [options] Animation options\n   * @param {Function} [options.onChange] Callback; invoked on every value change\n   * @param {Function} [options.onComplete] Callback; invoked when value change is completed\n   * @param {Function} [options.colorEasing] Easing function. Note that this function only take two arguments (currentTime, duration). Thus the regular animation easing functions cannot be used.\n   * @param {Function} [options.abort] Additional function with logic. If returns true, onComplete is called.\n   * @returns {Function} abort function\n   */\n  function animateColor(fromColor, toColor, duration, options) {\n    var startColor = new fabric.Color(fromColor).getSource(),\n        endColor = new fabric.Color(toColor).getSource(),\n        originalOnComplete = options.onComplete,\n        originalOnChange = options.onChange;\n    options = options || {};\n\n    return fabric.util.animate(fabric.util.object.extend(options, {\n      duration: duration || 500,\n      startValue: startColor,\n      endValue: endColor,\n      byValue: endColor,\n      easing: function (currentTime, startValue, byValue, duration) {\n        var posValue = options.colorEasing\n          ? options.colorEasing(currentTime, duration)\n          : 1 - Math.cos(currentTime / duration * (Math.PI / 2));\n        return calculateColor(startValue, byValue, posValue);\n      },\n      // has to take in account for color restoring;\n      onComplete: function(current, valuePerc, timePerc) {\n        if (originalOnComplete) {\n          return originalOnComplete(\n            calculateColor(endColor, endColor, 0),\n            valuePerc,\n            timePerc\n          );\n        }\n      },\n      onChange: function(current, valuePerc, timePerc) {\n        if (originalOnChange) {\n          if (Array.isArray(current)) {\n            return originalOnChange(\n              calculateColor(current, current, 0),\n              valuePerc,\n              timePerc\n            );\n          }\n          originalOnChange(current, valuePerc, timePerc);\n        }\n      }\n    }));\n  }\n\n  fabric.util.animateColor = animateColor;\n\n})();\n\n\n(function() {\n\n  function normalize(a, c, p, s) {\n    if (a < Math.abs(c)) {\n      a = c;\n      s = p / 4;\n    }\n    else {\n      //handle the 0/0 case:\n      if (c === 0 && a === 0) {\n        s = p / (2 * Math.PI) * Math.asin(1);\n      }\n      else {\n        s = p / (2 * Math.PI) * Math.asin(c / a);\n      }\n    }\n    return { a: a, c: c, p: p, s: s };\n  }\n\n  function elastic(opts, t, d) {\n    return opts.a *\n      Math.pow(2, 10 * (t -= 1)) *\n      Math.sin( (t * d - opts.s) * (2 * Math.PI) / opts.p );\n  }\n\n  /**\n   * Cubic easing out\n   * @memberOf fabric.util.ease\n   */\n  function easeOutCubic(t, b, c, d) {\n    return c * ((t = t / d - 1) * t * t + 1) + b;\n  }\n\n  /**\n   * Cubic easing in and out\n   * @memberOf fabric.util.ease\n   */\n  function easeInOutCubic(t, b, c, d) {\n    t /= d / 2;\n    if (t < 1) {\n      return c / 2 * t * t * t + b;\n    }\n    return c / 2 * ((t -= 2) * t * t + 2) + b;\n  }\n\n  /**\n   * Quartic easing in\n   * @memberOf fabric.util.ease\n   */\n  function easeInQuart(t, b, c, d) {\n    return c * (t /= d) * t * t * t + b;\n  }\n\n  /**\n   * Quartic easing out\n   * @memberOf fabric.util.ease\n   */\n  function easeOutQuart(t, b, c, d) {\n    return -c * ((t = t / d - 1) * t * t * t - 1) + b;\n  }\n\n  /**\n   * Quartic easing in and out\n   * @memberOf fabric.util.ease\n   */\n  function easeInOutQuart(t, b, c, d) {\n    t /= d / 2;\n    if (t < 1) {\n      return c / 2 * t * t * t * t + b;\n    }\n    return -c / 2 * ((t -= 2) * t * t * t - 2) + b;\n  }\n\n  /**\n   * Quintic easing in\n   * @memberOf fabric.util.ease\n   */\n  function easeInQuint(t, b, c, d) {\n    return c * (t /= d) * t * t * t * t + b;\n  }\n\n  /**\n   * Quintic easing out\n   * @memberOf fabric.util.ease\n   */\n  function easeOutQuint(t, b, c, d) {\n    return c * ((t = t / d - 1) * t * t * t * t + 1) + b;\n  }\n\n  /**\n   * Quintic easing in and out\n   * @memberOf fabric.util.ease\n   */\n  function easeInOutQuint(t, b, c, d) {\n    t /= d / 2;\n    if (t < 1) {\n      return c / 2 * t * t * t * t * t + b;\n    }\n    return c / 2 * ((t -= 2) * t * t * t * t + 2) + b;\n  }\n\n  /**\n   * Sinusoidal easing in\n   * @memberOf fabric.util.ease\n   */\n  function easeInSine(t, b, c, d) {\n    return -c * Math.cos(t / d * (Math.PI / 2)) + c + b;\n  }\n\n  /**\n   * Sinusoidal easing out\n   * @memberOf fabric.util.ease\n   */\n  function easeOutSine(t, b, c, d) {\n    return c * Math.sin(t / d * (Math.PI / 2)) + b;\n  }\n\n  /**\n   * Sinusoidal easing in and out\n   * @memberOf fabric.util.ease\n   */\n  function easeInOutSine(t, b, c, d) {\n    return -c / 2 * (Math.cos(Math.PI * t / d) - 1) + b;\n  }\n\n  /**\n   * Exponential easing in\n   * @memberOf fabric.util.ease\n   */\n  function easeInExpo(t, b, c, d) {\n    return (t === 0) ? b : c * Math.pow(2, 10 * (t / d - 1)) + b;\n  }\n\n  /**\n   * Exponential easing out\n   * @memberOf fabric.util.ease\n   */\n  function easeOutExpo(t, b, c, d) {\n    return (t === d) ? b + c : c * (-Math.pow(2, -10 * t / d) + 1) + b;\n  }\n\n  /**\n   * Exponential easing in and out\n   * @memberOf fabric.util.ease\n   */\n  function easeInOutExpo(t, b, c, d) {\n    if (t === 0) {\n      return b;\n    }\n    if (t === d) {\n      return b + c;\n    }\n    t /= d / 2;\n    if (t < 1) {\n      return c / 2 * Math.pow(2, 10 * (t - 1)) + b;\n    }\n    return c / 2 * (-Math.pow(2, -10 * --t) + 2) + b;\n  }\n\n  /**\n   * Circular easing in\n   * @memberOf fabric.util.ease\n   */\n  function easeInCirc(t, b, c, d) {\n    return -c * (Math.sqrt(1 - (t /= d) * t) - 1) + b;\n  }\n\n  /**\n   * Circular easing out\n   * @memberOf fabric.util.ease\n   */\n  function easeOutCirc(t, b, c, d) {\n    return c * Math.sqrt(1 - (t = t / d - 1) * t) + b;\n  }\n\n  /**\n   * Circular easing in and out\n   * @memberOf fabric.util.ease\n   */\n  function easeInOutCirc(t, b, c, d) {\n    t /= d / 2;\n    if (t < 1) {\n      return -c / 2 * (Math.sqrt(1 - t * t) - 1) + b;\n    }\n    return c / 2 * (Math.sqrt(1 - (t -= 2) * t) + 1) + b;\n  }\n\n  /**\n   * Elastic easing in\n   * @memberOf fabric.util.ease\n   */\n  function easeInElastic(t, b, c, d) {\n    var s = 1.70158, p = 0, a = c;\n    if (t === 0) {\n      return b;\n    }\n    t /= d;\n    if (t === 1) {\n      return b + c;\n    }\n    if (!p) {\n      p = d * 0.3;\n    }\n    var opts = normalize(a, c, p, s);\n    return -elastic(opts, t, d) + b;\n  }\n\n  /**\n   * Elastic easing out\n   * @memberOf fabric.util.ease\n   */\n  function easeOutElastic(t, b, c, d) {\n    var s = 1.70158, p = 0, a = c;\n    if (t === 0) {\n      return b;\n    }\n    t /= d;\n    if (t === 1) {\n      return b + c;\n    }\n    if (!p) {\n      p = d * 0.3;\n    }\n    var opts = normalize(a, c, p, s);\n    return opts.a * Math.pow(2, -10 * t) * Math.sin((t * d - opts.s) * (2 * Math.PI) / opts.p ) + opts.c + b;\n  }\n\n  /**\n   * Elastic easing in and out\n   * @memberOf fabric.util.ease\n   */\n  function easeInOutElastic(t, b, c, d) {\n    var s = 1.70158, p = 0, a = c;\n    if (t === 0) {\n      return b;\n    }\n    t /= d / 2;\n    if (t === 2) {\n      return b + c;\n    }\n    if (!p) {\n      p = d * (0.3 * 1.5);\n    }\n    var opts = normalize(a, c, p, s);\n    if (t < 1) {\n      return -0.5 * elastic(opts, t, d) + b;\n    }\n    return opts.a * Math.pow(2, -10 * (t -= 1)) *\n      Math.sin((t * d - opts.s) * (2 * Math.PI) / opts.p ) * 0.5 + opts.c + b;\n  }\n\n  /**\n   * Backwards easing in\n   * @memberOf fabric.util.ease\n   */\n  function easeInBack(t, b, c, d, s) {\n    if (s === undefined) {\n      s = 1.70158;\n    }\n    return c * (t /= d) * t * ((s + 1) * t - s) + b;\n  }\n\n  /**\n   * Backwards easing out\n   * @memberOf fabric.util.ease\n   */\n  function easeOutBack(t, b, c, d, s) {\n    if (s === undefined) {\n      s = 1.70158;\n    }\n    return c * ((t = t / d - 1) * t * ((s + 1) * t + s) + 1) + b;\n  }\n\n  /**\n   * Backwards easing in and out\n   * @memberOf fabric.util.ease\n   */\n  function easeInOutBack(t, b, c, d, s) {\n    if (s === undefined) {\n      s = 1.70158;\n    }\n    t /= d / 2;\n    if (t < 1) {\n      return c / 2 * (t * t * (((s *= (1.525)) + 1) * t - s)) + b;\n    }\n    return c / 2 * ((t -= 2) * t * (((s *= (1.525)) + 1) * t + s) + 2) + b;\n  }\n\n  /**\n   * Bouncing easing in\n   * @memberOf fabric.util.ease\n   */\n  function easeInBounce(t, b, c, d) {\n    return c - easeOutBounce (d - t, 0, c, d) + b;\n  }\n\n  /**\n   * Bouncing easing out\n   * @memberOf fabric.util.ease\n   */\n  function easeOutBounce(t, b, c, d) {\n    if ((t /= d) < (1 / 2.75)) {\n      return c * (7.5625 * t * t) + b;\n    }\n    else if (t < (2 / 2.75)) {\n      return c * (7.5625 * (t -= (1.5 / 2.75)) * t + 0.75) + b;\n    }\n    else if (t < (2.5 / 2.75)) {\n      return c * (7.5625 * (t -= (2.25 / 2.75)) * t + 0.9375) + b;\n    }\n    else {\n      return c * (7.5625 * (t -= (2.625 / 2.75)) * t + 0.984375) + b;\n    }\n  }\n\n  /**\n   * Bouncing easing in and out\n   * @memberOf fabric.util.ease\n   */\n  function easeInOutBounce(t, b, c, d) {\n    if (t < d / 2) {\n      return easeInBounce (t * 2, 0, c, d) * 0.5 + b;\n    }\n    return easeOutBounce(t * 2 - d, 0, c, d) * 0.5 + c * 0.5 + b;\n  }\n\n  /**\n   * Easing functions\n   * See <a href=\"http://gizma.com/easing/\">Easing Equations by Robert Penner</a>\n   * @namespace fabric.util.ease\n   */\n  fabric.util.ease = {\n\n    /**\n     * Quadratic easing in\n     * @memberOf fabric.util.ease\n     */\n    easeInQuad: function(t, b, c, d) {\n      return c * (t /= d) * t + b;\n    },\n\n    /**\n     * Quadratic easing out\n     * @memberOf fabric.util.ease\n     */\n    easeOutQuad: function(t, b, c, d) {\n      return -c * (t /= d) * (t - 2) + b;\n    },\n\n    /**\n     * Quadratic easing in and out\n     * @memberOf fabric.util.ease\n     */\n    easeInOutQuad: function(t, b, c, d) {\n      t /= (d / 2);\n      if (t < 1) {\n        return c / 2 * t * t + b;\n      }\n      return -c / 2 * ((--t) * (t - 2) - 1) + b;\n    },\n\n    /**\n     * Cubic easing in\n     * @memberOf fabric.util.ease\n     */\n    easeInCubic: function(t, b, c, d) {\n      return c * (t /= d) * t * t + b;\n    },\n\n    easeOutCubic: easeOutCubic,\n    easeInOutCubic: easeInOutCubic,\n    easeInQuart: easeInQuart,\n    easeOutQuart: easeOutQuart,\n    easeInOutQuart: easeInOutQuart,\n    easeInQuint: easeInQuint,\n    easeOutQuint: easeOutQuint,\n    easeInOutQuint: easeInOutQuint,\n    easeInSine: easeInSine,\n    easeOutSine: easeOutSine,\n    easeInOutSine: easeInOutSine,\n    easeInExpo: easeInExpo,\n    easeOutExpo: easeOutExpo,\n    easeInOutExpo: easeInOutExpo,\n    easeInCirc: easeInCirc,\n    easeOutCirc: easeOutCirc,\n    easeInOutCirc: easeInOutCirc,\n    easeInElastic: easeInElastic,\n    easeOutElastic: easeOutElastic,\n    easeInOutElastic: easeInOutElastic,\n    easeInBack: easeInBack,\n    easeOutBack: easeOutBack,\n    easeInOutBack: easeInOutBack,\n    easeInBounce: easeInBounce,\n    easeOutBounce: easeOutBounce,\n    easeInOutBounce: easeInOutBounce\n  };\n\n})();\n\n\n(function(global) {\n\n  'use strict';\n\n  /**\n   * @name fabric\n   * @namespace\n   */\n\n  var fabric = global.fabric || (global.fabric = { }),\n      extend = fabric.util.object.extend,\n      clone = fabric.util.object.clone,\n      toFixed = fabric.util.toFixed,\n      parseUnit = fabric.util.parseUnit,\n      multiplyTransformMatrices = fabric.util.multiplyTransformMatrices,\n\n      svgValidTagNames = ['path', 'circle', 'polygon', 'polyline', 'ellipse', 'rect', 'line',\n        'image', 'text'],\n      svgViewBoxElements = ['symbol', 'image', 'marker', 'pattern', 'view', 'svg'],\n      svgInvalidAncestors = ['pattern', 'defs', 'symbol', 'metadata', 'clipPath', 'mask', 'desc'],\n      svgValidParents = ['symbol', 'g', 'a', 'svg', 'clipPath', 'defs'],\n\n      attributesMap = {\n        cx:                   'left',\n        x:                    'left',\n        r:                    'radius',\n        cy:                   'top',\n        y:                    'top',\n        display:              'visible',\n        visibility:           'visible',\n        transform:            'transformMatrix',\n        'fill-opacity':       'fillOpacity',\n        'fill-rule':          'fillRule',\n        'font-family':        'fontFamily',\n        'font-size':          'fontSize',\n        'font-style':         'fontStyle',\n        'font-weight':        'fontWeight',\n        'letter-spacing':     'charSpacing',\n        'paint-order':        'paintFirst',\n        'stroke-dasharray':   'strokeDashArray',\n        'stroke-dashoffset':  'strokeDashOffset',\n        'stroke-linecap':     'strokeLineCap',\n        'stroke-linejoin':    'strokeLineJoin',\n        'stroke-miterlimit':  'strokeMiterLimit',\n        'stroke-opacity':     'strokeOpacity',\n        'stroke-width':       'strokeWidth',\n        'text-decoration':    'textDecoration',\n        'text-anchor':        'textAnchor',\n        opacity:              'opacity',\n        'clip-path':          'clipPath',\n        'clip-rule':          'clipRule',\n        'vector-effect':      'strokeUniform',\n        'image-rendering':    'imageSmoothing',\n      },\n\n      colorAttributes = {\n        stroke: 'strokeOpacity',\n        fill:   'fillOpacity'\n      },\n\n      fSize = 'font-size', cPath = 'clip-path';\n\n  fabric.svgValidTagNamesRegEx = getSvgRegex(svgValidTagNames);\n  fabric.svgViewBoxElementsRegEx = getSvgRegex(svgViewBoxElements);\n  fabric.svgInvalidAncestorsRegEx = getSvgRegex(svgInvalidAncestors);\n  fabric.svgValidParentsRegEx = getSvgRegex(svgValidParents);\n\n  fabric.cssRules = { };\n  fabric.gradientDefs = { };\n  fabric.clipPaths = { };\n\n  function normalizeAttr(attr) {\n    // transform attribute names\n    if (attr in attributesMap) {\n      return attributesMap[attr];\n    }\n    return attr;\n  }\n\n  function normalizeValue(attr, value, parentAttributes, fontSize) {\n    var isArray = Object.prototype.toString.call(value) === '[object Array]',\n        parsed;\n\n    if ((attr === 'fill' || attr === 'stroke') && value === 'none') {\n      value = '';\n    }\n    else if (attr === 'strokeUniform') {\n      return (value === 'non-scaling-stroke');\n    }\n    else if (attr === 'strokeDashArray') {\n      if (value === 'none') {\n        value = null;\n      }\n      else {\n        value = value.replace(/,/g, ' ').split(/\\s+/).map(parseFloat);\n      }\n    }\n    else if (attr === 'transformMatrix') {\n      if (parentAttributes && parentAttributes.transformMatrix) {\n        value = multiplyTransformMatrices(\n          parentAttributes.transformMatrix, fabric.parseTransformAttribute(value));\n      }\n      else {\n        value = fabric.parseTransformAttribute(value);\n      }\n    }\n    else if (attr === 'visible') {\n      value = value !== 'none' && value !== 'hidden';\n      // display=none on parent element always takes precedence over child element\n      if (parentAttributes && parentAttributes.visible === false) {\n        value = false;\n      }\n    }\n    else if (attr === 'opacity') {\n      value = parseFloat(value);\n      if (parentAttributes && typeof parentAttributes.opacity !== 'undefined') {\n        value *= parentAttributes.opacity;\n      }\n    }\n    else if (attr === 'textAnchor' /* text-anchor */) {\n      value = value === 'start' ? 'left' : value === 'end' ? 'right' : 'center';\n    }\n    else if (attr === 'charSpacing') {\n      // parseUnit returns px and we convert it to em\n      parsed = parseUnit(value, fontSize) / fontSize * 1000;\n    }\n    else if (attr === 'paintFirst') {\n      var fillIndex = value.indexOf('fill');\n      var strokeIndex = value.indexOf('stroke');\n      var value = 'fill';\n      if (fillIndex > -1 && strokeIndex > -1 && strokeIndex < fillIndex) {\n        value = 'stroke';\n      }\n      else if (fillIndex === -1 && strokeIndex > -1) {\n        value = 'stroke';\n      }\n    }\n    else if (attr === 'href' || attr === 'xlink:href' || attr === 'font') {\n      return value;\n    }\n    else if (attr === 'imageSmoothing') {\n      return (value === 'optimizeQuality');\n    }\n    else {\n      parsed = isArray ? value.map(parseUnit) : parseUnit(value, fontSize);\n    }\n\n    return (!isArray && isNaN(parsed) ? value : parsed);\n  }\n\n  /**\n    * @private\n    */\n  function getSvgRegex(arr) {\n    return new RegExp('^(' + arr.join('|') + ')\\\\b', 'i');\n  }\n\n  /**\n   * @private\n   * @param {Object} attributes Array of attributes to parse\n   */\n  function _setStrokeFillOpacity(attributes) {\n    for (var attr in colorAttributes) {\n\n      if (typeof attributes[colorAttributes[attr]] === 'undefined' || attributes[attr] === '') {\n        continue;\n      }\n\n      if (typeof attributes[attr] === 'undefined') {\n        if (!fabric.Object.prototype[attr]) {\n          continue;\n        }\n        attributes[attr] = fabric.Object.prototype[attr];\n      }\n\n      if (attributes[attr].indexOf('url(') === 0) {\n        continue;\n      }\n\n      var color = new fabric.Color(attributes[attr]);\n      attributes[attr] = color.setAlpha(toFixed(color.getAlpha() * attributes[colorAttributes[attr]], 2)).toRgba();\n    }\n    return attributes;\n  }\n\n  /**\n   * @private\n   */\n  function _getMultipleNodes(doc, nodeNames) {\n    var nodeName, nodeArray = [], nodeList, i, len;\n    for (i = 0, len = nodeNames.length; i < len; i++) {\n      nodeName = nodeNames[i];\n      nodeList = doc.getElementsByTagName(nodeName);\n      nodeArray = nodeArray.concat(Array.prototype.slice.call(nodeList));\n    }\n    return nodeArray;\n  }\n\n  /**\n   * Parses \"transform\" attribute, returning an array of values\n   * @static\n   * @function\n   * @memberOf fabric\n   * @param {String} attributeValue String containing attribute value\n   * @return {Array} Array of 6 elements representing transformation matrix\n   */\n  fabric.parseTransformAttribute = (function() {\n    function rotateMatrix(matrix, args) {\n      var cos = fabric.util.cos(args[0]), sin = fabric.util.sin(args[0]),\n          x = 0, y = 0;\n      if (args.length === 3) {\n        x = args[1];\n        y = args[2];\n      }\n\n      matrix[0] = cos;\n      matrix[1] = sin;\n      matrix[2] = -sin;\n      matrix[3] = cos;\n      matrix[4] = x - (cos * x - sin * y);\n      matrix[5] = y - (sin * x + cos * y);\n    }\n\n    function scaleMatrix(matrix, args) {\n      var multiplierX = args[0],\n          multiplierY = (args.length === 2) ? args[1] : args[0];\n\n      matrix[0] = multiplierX;\n      matrix[3] = multiplierY;\n    }\n\n    function skewMatrix(matrix, args, pos) {\n      matrix[pos] = Math.tan(fabric.util.degreesToRadians(args[0]));\n    }\n\n    function translateMatrix(matrix, args) {\n      matrix[4] = args[0];\n      if (args.length === 2) {\n        matrix[5] = args[1];\n      }\n    }\n\n    // identity matrix\n    var iMatrix = fabric.iMatrix,\n\n        // == begin transform regexp\n        number = fabric.reNum,\n\n        commaWsp = fabric.commaWsp,\n\n        skewX = '(?:(skewX)\\\\s*\\\\(\\\\s*(' + number + ')\\\\s*\\\\))',\n\n        skewY = '(?:(skewY)\\\\s*\\\\(\\\\s*(' + number + ')\\\\s*\\\\))',\n\n        rotate = '(?:(rotate)\\\\s*\\\\(\\\\s*(' + number + ')(?:' +\n                    commaWsp + '(' + number + ')' +\n                    commaWsp + '(' + number + '))?\\\\s*\\\\))',\n\n        scale = '(?:(scale)\\\\s*\\\\(\\\\s*(' + number + ')(?:' +\n                    commaWsp + '(' + number + '))?\\\\s*\\\\))',\n\n        translate = '(?:(translate)\\\\s*\\\\(\\\\s*(' + number + ')(?:' +\n                    commaWsp + '(' + number + '))?\\\\s*\\\\))',\n\n        matrix = '(?:(matrix)\\\\s*\\\\(\\\\s*' +\n                  '(' + number + ')' + commaWsp +\n                  '(' + number + ')' + commaWsp +\n                  '(' + number + ')' + commaWsp +\n                  '(' + number + ')' + commaWsp +\n                  '(' + number + ')' + commaWsp +\n                  '(' + number + ')' +\n                  '\\\\s*\\\\))',\n\n        transform = '(?:' +\n                    matrix + '|' +\n                    translate + '|' +\n                    scale + '|' +\n                    rotate + '|' +\n                    skewX + '|' +\n                    skewY +\n                    ')',\n\n        transforms = '(?:' + transform + '(?:' + commaWsp + '*' + transform + ')*' + ')',\n\n        transformList = '^\\\\s*(?:' + transforms + '?)\\\\s*$',\n\n        // http://www.w3.org/TR/SVG/coords.html#TransformAttribute\n        reTransformList = new RegExp(transformList),\n        // == end transform regexp\n\n        reTransform = new RegExp(transform, 'g');\n\n    return function(attributeValue) {\n\n      // start with identity matrix\n      var matrix = iMatrix.concat(),\n          matrices = [];\n\n      // return if no argument was given or\n      // an argument does not match transform attribute regexp\n      if (!attributeValue || (attributeValue && !reTransformList.test(attributeValue))) {\n        return matrix;\n      }\n\n      attributeValue.replace(reTransform, function(match) {\n\n        var m = new RegExp(transform).exec(match).filter(function (match) {\n              // match !== '' && match != null\n              return (!!match);\n            }),\n            operation = m[1],\n            args = m.slice(2).map(parseFloat);\n\n        switch (operation) {\n          case 'translate':\n            translateMatrix(matrix, args);\n            break;\n          case 'rotate':\n            args[0] = fabric.util.degreesToRadians(args[0]);\n            rotateMatrix(matrix, args);\n            break;\n          case 'scale':\n            scaleMatrix(matrix, args);\n            break;\n          case 'skewX':\n            skewMatrix(matrix, args, 2);\n            break;\n          case 'skewY':\n            skewMatrix(matrix, args, 1);\n            break;\n          case 'matrix':\n            matrix = args;\n            break;\n        }\n\n        // snapshot current matrix into matrices array\n        matrices.push(matrix.concat());\n        // reset\n        matrix = iMatrix.concat();\n      });\n\n      var combinedMatrix = matrices[0];\n      while (matrices.length > 1) {\n        matrices.shift();\n        combinedMatrix = fabric.util.multiplyTransformMatrices(combinedMatrix, matrices[0]);\n      }\n      return combinedMatrix;\n    };\n  })();\n\n  /**\n   * @private\n   */\n  function parseStyleString(style, oStyle) {\n    var attr, value;\n    style.replace(/;\\s*$/, '').split(';').forEach(function (chunk) {\n      var pair = chunk.split(':');\n\n      attr = pair[0].trim().toLowerCase();\n      value =  pair[1].trim();\n\n      oStyle[attr] = value;\n    });\n  }\n\n  /**\n   * @private\n   */\n  function parseStyleObject(style, oStyle) {\n    var attr, value;\n    for (var prop in style) {\n      if (typeof style[prop] === 'undefined') {\n        continue;\n      }\n\n      attr = prop.toLowerCase();\n      value = style[prop];\n\n      oStyle[attr] = value;\n    }\n  }\n\n  /**\n   * @private\n   */\n  function getGlobalStylesForElement(element, svgUid) {\n    var styles = { };\n    for (var rule in fabric.cssRules[svgUid]) {\n      if (elementMatchesRule(element, rule.split(' '))) {\n        for (var property in fabric.cssRules[svgUid][rule]) {\n          styles[property] = fabric.cssRules[svgUid][rule][property];\n        }\n      }\n    }\n    return styles;\n  }\n\n  /**\n   * @private\n   */\n  function elementMatchesRule(element, selectors) {\n    var firstMatching, parentMatching = true;\n    //start from rightmost selector.\n    firstMatching = selectorMatches(element, selectors.pop());\n    if (firstMatching && selectors.length) {\n      parentMatching = doesSomeParentMatch(element, selectors);\n    }\n    return firstMatching && parentMatching && (selectors.length === 0);\n  }\n\n  function doesSomeParentMatch(element, selectors) {\n    var selector, parentMatching = true;\n    while (element.parentNode && element.parentNode.nodeType === 1 && selectors.length) {\n      if (parentMatching) {\n        selector = selectors.pop();\n      }\n      element = element.parentNode;\n      parentMatching = selectorMatches(element, selector);\n    }\n    return selectors.length === 0;\n  }\n\n  /**\n   * @private\n   */\n  function selectorMatches(element, selector) {\n    var nodeName = element.nodeName,\n        classNames = element.getAttribute('class'),\n        id = element.getAttribute('id'), matcher, i;\n    // i check if a selector matches slicing away part from it.\n    // if i get empty string i should match\n    matcher = new RegExp('^' + nodeName, 'i');\n    selector = selector.replace(matcher, '');\n    if (id && selector.length) {\n      matcher = new RegExp('#' + id + '(?![a-zA-Z\\\\-]+)', 'i');\n      selector = selector.replace(matcher, '');\n    }\n    if (classNames && selector.length) {\n      classNames = classNames.split(' ');\n      for (i = classNames.length; i--;) {\n        matcher = new RegExp('\\\\.' + classNames[i] + '(?![a-zA-Z\\\\-]+)', 'i');\n        selector = selector.replace(matcher, '');\n      }\n    }\n    return selector.length === 0;\n  }\n\n  /**\n   * @private\n   * to support IE8 missing getElementById on SVGdocument and on node xmlDOM\n   */\n  function elementById(doc, id) {\n    var el;\n    doc.getElementById && (el = doc.getElementById(id));\n    if (el) {\n      return el;\n    }\n    var node, i, len, nodelist = doc.getElementsByTagName('*');\n    for (i = 0, len = nodelist.length; i < len; i++) {\n      node = nodelist[i];\n      if (id === node.getAttribute('id')) {\n        return node;\n      }\n    }\n  }\n\n  /**\n   * @private\n   */\n  function parseUseDirectives(doc) {\n    var nodelist = _getMultipleNodes(doc, ['use', 'svg:use']), i = 0;\n    while (nodelist.length && i < nodelist.length) {\n      var el = nodelist[i],\n          xlinkAttribute = el.getAttribute('xlink:href') || el.getAttribute('href');\n\n      if (xlinkAttribute === null) {\n        return;\n      }\n\n      var xlink = xlinkAttribute.substr(1),\n          x = el.getAttribute('x') || 0,\n          y = el.getAttribute('y') || 0,\n          el2 = elementById(doc, xlink).cloneNode(true),\n          currentTrans = (el2.getAttribute('transform') || '') + ' translate(' + x + ', ' + y + ')',\n          parentNode,\n          oldLength = nodelist.length, attr,\n          j,\n          attrs,\n          len,\n          namespace = fabric.svgNS;\n\n      applyViewboxTransform(el2);\n      if (/^svg$/i.test(el2.nodeName)) {\n        var el3 = el2.ownerDocument.createElementNS(namespace, 'g');\n        for (j = 0, attrs = el2.attributes, len = attrs.length; j < len; j++) {\n          attr = attrs.item(j);\n          el3.setAttributeNS(namespace, attr.nodeName, attr.nodeValue);\n        }\n        // el2.firstChild != null\n        while (el2.firstChild) {\n          el3.appendChild(el2.firstChild);\n        }\n        el2 = el3;\n      }\n\n      for (j = 0, attrs = el.attributes, len = attrs.length; j < len; j++) {\n        attr = attrs.item(j);\n        if (attr.nodeName === 'x' || attr.nodeName === 'y' ||\n          attr.nodeName === 'xlink:href' || attr.nodeName === 'href') {\n          continue;\n        }\n\n        if (attr.nodeName === 'transform') {\n          currentTrans = attr.nodeValue + ' ' + currentTrans;\n        }\n        else {\n          el2.setAttribute(attr.nodeName, attr.nodeValue);\n        }\n      }\n\n      el2.setAttribute('transform', currentTrans);\n      el2.setAttribute('instantiated_by_use', '1');\n      el2.removeAttribute('id');\n      parentNode = el.parentNode;\n      parentNode.replaceChild(el2, el);\n      // some browsers do not shorten nodelist after replaceChild (IE8)\n      if (nodelist.length === oldLength) {\n        i++;\n      }\n    }\n  }\n\n  // http://www.w3.org/TR/SVG/coords.html#ViewBoxAttribute\n  // matches, e.g.: +14.56e-12, etc.\n  var reViewBoxAttrValue = new RegExp(\n    '^' +\n    '\\\\s*(' + fabric.reNum + '+)\\\\s*,?' +\n    '\\\\s*(' + fabric.reNum + '+)\\\\s*,?' +\n    '\\\\s*(' + fabric.reNum + '+)\\\\s*,?' +\n    '\\\\s*(' + fabric.reNum + '+)\\\\s*' +\n    '$'\n  );\n\n  /**\n   * Add a <g> element that envelop all child elements and makes the viewbox transformMatrix descend on all elements\n   */\n  function applyViewboxTransform(element) {\n    if (!fabric.svgViewBoxElementsRegEx.test(element.nodeName)) {\n      return {};\n    }\n    var viewBoxAttr = element.getAttribute('viewBox'),\n        scaleX = 1,\n        scaleY = 1,\n        minX = 0,\n        minY = 0,\n        viewBoxWidth, viewBoxHeight, matrix, el,\n        widthAttr = element.getAttribute('width'),\n        heightAttr = element.getAttribute('height'),\n        x = element.getAttribute('x') || 0,\n        y = element.getAttribute('y') || 0,\n        preserveAspectRatio = element.getAttribute('preserveAspectRatio') || '',\n        missingViewBox = (!viewBoxAttr || !(viewBoxAttr = viewBoxAttr.match(reViewBoxAttrValue))),\n        missingDimAttr = (!widthAttr || !heightAttr || widthAttr === '100%' || heightAttr === '100%'),\n        toBeParsed = missingViewBox && missingDimAttr,\n        parsedDim = { }, translateMatrix = '', widthDiff = 0, heightDiff = 0;\n\n    parsedDim.width = 0;\n    parsedDim.height = 0;\n    parsedDim.toBeParsed = toBeParsed;\n\n    if (missingViewBox) {\n      if (((x || y) && element.parentNode && element.parentNode.nodeName !== '#document')) {\n        translateMatrix = ' translate(' + parseUnit(x) + ' ' + parseUnit(y) + ') ';\n        matrix = (element.getAttribute('transform') || '') + translateMatrix;\n        element.setAttribute('transform', matrix);\n        element.removeAttribute('x');\n        element.removeAttribute('y');\n      }\n    }\n\n    if (toBeParsed) {\n      return parsedDim;\n    }\n\n    if (missingViewBox) {\n      parsedDim.width = parseUnit(widthAttr);\n      parsedDim.height = parseUnit(heightAttr);\n      // set a transform for elements that have x y and are inner(only) SVGs\n      return parsedDim;\n    }\n    minX = -parseFloat(viewBoxAttr[1]);\n    minY = -parseFloat(viewBoxAttr[2]);\n    viewBoxWidth = parseFloat(viewBoxAttr[3]);\n    viewBoxHeight = parseFloat(viewBoxAttr[4]);\n    parsedDim.minX = minX;\n    parsedDim.minY = minY;\n    parsedDim.viewBoxWidth = viewBoxWidth;\n    parsedDim.viewBoxHeight = viewBoxHeight;\n    if (!missingDimAttr) {\n      parsedDim.width = parseUnit(widthAttr);\n      parsedDim.height = parseUnit(heightAttr);\n      scaleX = parsedDim.width / viewBoxWidth;\n      scaleY = parsedDim.height / viewBoxHeight;\n    }\n    else {\n      parsedDim.width = viewBoxWidth;\n      parsedDim.height = viewBoxHeight;\n    }\n\n    // default is to preserve aspect ratio\n    preserveAspectRatio = fabric.util.parsePreserveAspectRatioAttribute(preserveAspectRatio);\n    if (preserveAspectRatio.alignX !== 'none') {\n      //translate all container for the effect of Mid, Min, Max\n      if (preserveAspectRatio.meetOrSlice === 'meet') {\n        scaleY = scaleX = (scaleX > scaleY ? scaleY : scaleX);\n        // calculate additional translation to move the viewbox\n      }\n      if (preserveAspectRatio.meetOrSlice === 'slice') {\n        scaleY = scaleX = (scaleX > scaleY ? scaleX : scaleY);\n        // calculate additional translation to move the viewbox\n      }\n      widthDiff = parsedDim.width - viewBoxWidth * scaleX;\n      heightDiff = parsedDim.height - viewBoxHeight * scaleX;\n      if (preserveAspectRatio.alignX === 'Mid') {\n        widthDiff /= 2;\n      }\n      if (preserveAspectRatio.alignY === 'Mid') {\n        heightDiff /= 2;\n      }\n      if (preserveAspectRatio.alignX === 'Min') {\n        widthDiff = 0;\n      }\n      if (preserveAspectRatio.alignY === 'Min') {\n        heightDiff = 0;\n      }\n    }\n\n    if (scaleX === 1 && scaleY === 1 && minX === 0 && minY === 0 && x === 0 && y === 0) {\n      return parsedDim;\n    }\n    if ((x || y) && element.parentNode.nodeName !== '#document') {\n      translateMatrix = ' translate(' + parseUnit(x) + ' ' + parseUnit(y) + ') ';\n    }\n\n    matrix = translateMatrix + ' matrix(' + scaleX +\n                  ' 0' +\n                  ' 0 ' +\n                  scaleY + ' ' +\n                  (minX * scaleX + widthDiff) + ' ' +\n                  (minY * scaleY + heightDiff) + ') ';\n    // seems unused.\n    // parsedDim.viewboxTransform = fabric.parseTransformAttribute(matrix);\n    if (element.nodeName === 'svg') {\n      el = element.ownerDocument.createElementNS(fabric.svgNS, 'g');\n      // element.firstChild != null\n      while (element.firstChild) {\n        el.appendChild(element.firstChild);\n      }\n      element.appendChild(el);\n    }\n    else {\n      el = element;\n      el.removeAttribute('x');\n      el.removeAttribute('y');\n      matrix = el.getAttribute('transform') + matrix;\n    }\n    el.setAttribute('transform', matrix);\n    return parsedDim;\n  }\n\n  function hasAncestorWithNodeName(element, nodeName) {\n    while (element && (element = element.parentNode)) {\n      if (element.nodeName && nodeName.test(element.nodeName.replace('svg:', ''))\n        && !element.getAttribute('instantiated_by_use')) {\n        return true;\n      }\n    }\n    return false;\n  }\n\n  /**\n   * Parses an SVG document, converts it to an array of corresponding fabric.* instances and passes them to a callback\n   * @static\n   * @function\n   * @memberOf fabric\n   * @param {SVGDocument} doc SVG document to parse\n   * @param {Function} callback Callback to call when parsing is finished;\n   * It's being passed an array of elements (parsed from a document).\n   * @param {Function} [reviver] Method for further parsing of SVG elements, called after each fabric object created.\n   * @param {Object} [parsingOptions] options for parsing document\n   * @param {String} [parsingOptions.crossOrigin] crossOrigin settings\n   */\n  fabric.parseSVGDocument = function(doc, callback, reviver, parsingOptions) {\n    if (!doc) {\n      return;\n    }\n\n    parseUseDirectives(doc);\n\n    var svgUid =  fabric.Object.__uid++, i, len,\n        options = applyViewboxTransform(doc),\n        descendants = fabric.util.toArray(doc.getElementsByTagName('*'));\n    options.crossOrigin = parsingOptions && parsingOptions.crossOrigin;\n    options.svgUid = svgUid;\n\n    if (descendants.length === 0 && fabric.isLikelyNode) {\n      // we're likely in node, where \"o3-xml\" library fails to gEBTN(\"*\")\n      // https://github.com/ajaxorg/node-o3-xml/issues/21\n      descendants = doc.selectNodes('//*[name(.)!=\"svg\"]');\n      var arr = [];\n      for (i = 0, len = descendants.length; i < len; i++) {\n        arr[i] = descendants[i];\n      }\n      descendants = arr;\n    }\n\n    var elements = descendants.filter(function(el) {\n      applyViewboxTransform(el);\n      return fabric.svgValidTagNamesRegEx.test(el.nodeName.replace('svg:', '')) &&\n            !hasAncestorWithNodeName(el, fabric.svgInvalidAncestorsRegEx); // http://www.w3.org/TR/SVG/struct.html#DefsElement\n    });\n    if (!elements || (elements && !elements.length)) {\n      callback && callback([], {});\n      return;\n    }\n    var clipPaths = { };\n    descendants.filter(function(el) {\n      return el.nodeName.replace('svg:', '') === 'clipPath';\n    }).forEach(function(el) {\n      var id = el.getAttribute('id');\n      clipPaths[id] = fabric.util.toArray(el.getElementsByTagName('*')).filter(function(el) {\n        return fabric.svgValidTagNamesRegEx.test(el.nodeName.replace('svg:', ''));\n      });\n    });\n    fabric.gradientDefs[svgUid] = fabric.getGradientDefs(doc);\n    fabric.cssRules[svgUid] = fabric.getCSSRules(doc);\n    fabric.clipPaths[svgUid] = clipPaths;\n    // Precedence of rules:   style > class > attribute\n    fabric.parseElements(elements, function(instances, elements) {\n      if (callback) {\n        callback(instances, options, elements, descendants);\n        delete fabric.gradientDefs[svgUid];\n        delete fabric.cssRules[svgUid];\n        delete fabric.clipPaths[svgUid];\n      }\n    }, clone(options), reviver, parsingOptions);\n  };\n\n  function recursivelyParseGradientsXlink(doc, gradient) {\n    var gradientsAttrs = ['gradientTransform', 'x1', 'x2', 'y1', 'y2', 'gradientUnits', 'cx', 'cy', 'r', 'fx', 'fy'],\n        xlinkAttr = 'xlink:href',\n        xLink = gradient.getAttribute(xlinkAttr).substr(1),\n        referencedGradient = elementById(doc, xLink);\n    if (referencedGradient && referencedGradient.getAttribute(xlinkAttr)) {\n      recursivelyParseGradientsXlink(doc, referencedGradient);\n    }\n    gradientsAttrs.forEach(function(attr) {\n      if (referencedGradient && !gradient.hasAttribute(attr) && referencedGradient.hasAttribute(attr)) {\n        gradient.setAttribute(attr, referencedGradient.getAttribute(attr));\n      }\n    });\n    if (!gradient.children.length) {\n      var referenceClone = referencedGradient.cloneNode(true);\n      while (referenceClone.firstChild) {\n        gradient.appendChild(referenceClone.firstChild);\n      }\n    }\n    gradient.removeAttribute(xlinkAttr);\n  }\n\n  var reFontDeclaration = new RegExp(\n    '(normal|italic)?\\\\s*(normal|small-caps)?\\\\s*' +\n    '(normal|bold|bolder|lighter|100|200|300|400|500|600|700|800|900)?\\\\s*(' +\n      fabric.reNum +\n    '(?:px|cm|mm|em|pt|pc|in)*)(?:\\\\/(normal|' + fabric.reNum + '))?\\\\s+(.*)');\n\n  extend(fabric, {\n    /**\n     * Parses a short font declaration, building adding its properties to a style object\n     * @static\n     * @function\n     * @memberOf fabric\n     * @param {String} value font declaration\n     * @param {Object} oStyle definition\n     */\n    parseFontDeclaration: function(value, oStyle) {\n      var match = value.match(reFontDeclaration);\n\n      if (!match) {\n        return;\n      }\n      var fontStyle = match[1],\n          // font variant is not used\n          // fontVariant = match[2],\n          fontWeight = match[3],\n          fontSize = match[4],\n          lineHeight = match[5],\n          fontFamily = match[6];\n\n      if (fontStyle) {\n        oStyle.fontStyle = fontStyle;\n      }\n      if (fontWeight) {\n        oStyle.fontWeight = isNaN(parseFloat(fontWeight)) ? fontWeight : parseFloat(fontWeight);\n      }\n      if (fontSize) {\n        oStyle.fontSize = parseUnit(fontSize);\n      }\n      if (fontFamily) {\n        oStyle.fontFamily = fontFamily;\n      }\n      if (lineHeight) {\n        oStyle.lineHeight = lineHeight === 'normal' ? 1 : lineHeight;\n      }\n    },\n\n    /**\n     * Parses an SVG document, returning all of the gradient declarations found in it\n     * @static\n     * @function\n     * @memberOf fabric\n     * @param {SVGDocument} doc SVG document to parse\n     * @return {Object} Gradient definitions; key corresponds to element id, value -- to gradient definition element\n     */\n    getGradientDefs: function(doc) {\n      var tagArray = [\n            'linearGradient',\n            'radialGradient',\n            'svg:linearGradient',\n            'svg:radialGradient'],\n          elList = _getMultipleNodes(doc, tagArray),\n          el, j = 0, gradientDefs = { };\n      j = elList.length;\n      while (j--) {\n        el = elList[j];\n        if (el.getAttribute('xlink:href')) {\n          recursivelyParseGradientsXlink(doc, el);\n        }\n        gradientDefs[el.getAttribute('id')] = el;\n      }\n      return gradientDefs;\n    },\n\n    /**\n     * Returns an object of attributes' name/value, given element and an array of attribute names;\n     * Parses parent \"g\" nodes recursively upwards.\n     * @static\n     * @memberOf fabric\n     * @param {DOMElement} element Element to parse\n     * @param {Array} attributes Array of attributes to parse\n     * @return {Object} object containing parsed attributes' names/values\n     */\n    parseAttributes: function(element, attributes, svgUid) {\n\n      if (!element) {\n        return;\n      }\n\n      var value,\n          parentAttributes = { },\n          fontSize, parentFontSize;\n\n      if (typeof svgUid === 'undefined') {\n        svgUid = element.getAttribute('svgUid');\n      }\n      // if there's a parent container (`g` or `a` or `symbol` node), parse its attributes recursively upwards\n      if (element.parentNode && fabric.svgValidParentsRegEx.test(element.parentNode.nodeName)) {\n        parentAttributes = fabric.parseAttributes(element.parentNode, attributes, svgUid);\n      }\n\n      var ownAttributes = attributes.reduce(function(memo, attr) {\n        value = element.getAttribute(attr);\n        if (value) { // eslint-disable-line\n          memo[attr] = value;\n        }\n        return memo;\n      }, { });\n      // add values parsed from style, which take precedence over attributes\n      // (see: http://www.w3.org/TR/SVG/styling.html#UsingPresentationAttributes)\n      var cssAttrs = extend(\n        getGlobalStylesForElement(element, svgUid),\n        fabric.parseStyleAttribute(element)\n      );\n      ownAttributes = extend(\n        ownAttributes,\n        cssAttrs\n      );\n      if (cssAttrs[cPath]) {\n        element.setAttribute(cPath, cssAttrs[cPath]);\n      }\n      fontSize = parentFontSize = parentAttributes.fontSize || fabric.Text.DEFAULT_SVG_FONT_SIZE;\n      if (ownAttributes[fSize]) {\n        // looks like the minimum should be 9px when dealing with ems. this is what looks like in browsers.\n        ownAttributes[fSize] = fontSize = parseUnit(ownAttributes[fSize], parentFontSize);\n      }\n\n      var normalizedAttr, normalizedValue, normalizedStyle = {};\n      for (var attr in ownAttributes) {\n        normalizedAttr = normalizeAttr(attr);\n        normalizedValue = normalizeValue(normalizedAttr, ownAttributes[attr], parentAttributes, fontSize);\n        normalizedStyle[normalizedAttr] = normalizedValue;\n      }\n      if (normalizedStyle && normalizedStyle.font) {\n        fabric.parseFontDeclaration(normalizedStyle.font, normalizedStyle);\n      }\n      var mergedAttrs = extend(parentAttributes, normalizedStyle);\n      return fabric.svgValidParentsRegEx.test(element.nodeName) ? mergedAttrs : _setStrokeFillOpacity(mergedAttrs);\n    },\n\n    /**\n     * Transforms an array of svg elements to corresponding fabric.* instances\n     * @static\n     * @memberOf fabric\n     * @param {Array} elements Array of elements to parse\n     * @param {Function} callback Being passed an array of fabric instances (transformed from SVG elements)\n     * @param {Object} [options] Options object\n     * @param {Function} [reviver] Method for further parsing of SVG elements, called after each fabric object created.\n     */\n    parseElements: function(elements, callback, options, reviver, parsingOptions) {\n      new fabric.ElementsParser(elements, callback, options, reviver, parsingOptions).parse();\n    },\n\n    /**\n     * Parses \"style\" attribute, retuning an object with values\n     * @static\n     * @memberOf fabric\n     * @param {SVGElement} element Element to parse\n     * @return {Object} Objects with values parsed from style attribute of an element\n     */\n    parseStyleAttribute: function(element) {\n      var oStyle = { },\n          style = element.getAttribute('style');\n\n      if (!style) {\n        return oStyle;\n      }\n\n      if (typeof style === 'string') {\n        parseStyleString(style, oStyle);\n      }\n      else {\n        parseStyleObject(style, oStyle);\n      }\n\n      return oStyle;\n    },\n\n    /**\n     * Parses \"points\" attribute, returning an array of values\n     * @static\n     * @memberOf fabric\n     * @param {String} points points attribute string\n     * @return {Array} array of points\n     */\n    parsePointsAttribute: function(points) {\n\n      // points attribute is required and must not be empty\n      if (!points) {\n        return null;\n      }\n\n      // replace commas with whitespace and remove bookending whitespace\n      points = points.replace(/,/g, ' ').trim();\n\n      points = points.split(/\\s+/);\n      var parsedPoints = [], i, len;\n\n      for (i = 0, len = points.length; i < len; i += 2) {\n        parsedPoints.push({\n          x: parseFloat(points[i]),\n          y: parseFloat(points[i + 1])\n        });\n      }\n\n      // odd number of points is an error\n      // if (parsedPoints.length % 2 !== 0) {\n      //   return null;\n      // }\n\n      return parsedPoints;\n    },\n\n    /**\n     * Returns CSS rules for a given SVG document\n     * @static\n     * @function\n     * @memberOf fabric\n     * @param {SVGDocument} doc SVG document to parse\n     * @return {Object} CSS rules of this document\n     */\n    getCSSRules: function(doc) {\n      var styles = doc.getElementsByTagName('style'), i, len,\n          allRules = { }, rules;\n\n      // very crude parsing of style contents\n      for (i = 0, len = styles.length; i < len; i++) {\n        var styleContents = styles[i].textContent;\n\n        // remove comments\n        styleContents = styleContents.replace(/\\/\\*[\\s\\S]*?\\*\\//g, '');\n        if (styleContents.trim() === '') {\n          continue;\n        }\n        rules = styleContents.match(/[^{]*\\{[\\s\\S]*?\\}/g);\n        rules = rules.map(function(rule) { return rule.trim(); });\n        // eslint-disable-next-line no-loop-func\n        rules.forEach(function(rule) {\n\n          var match = rule.match(/([\\s\\S]*?)\\s*\\{([^}]*)\\}/),\n              ruleObj = { }, declaration = match[2].trim(),\n              propertyValuePairs = declaration.replace(/;$/, '').split(/\\s*;\\s*/);\n\n          for (i = 0, len = propertyValuePairs.length; i < len; i++) {\n            var pair = propertyValuePairs[i].split(/\\s*:\\s*/),\n                property = pair[0],\n                value = pair[1];\n            ruleObj[property] = value;\n          }\n          rule = match[1];\n          rule.split(',').forEach(function(_rule) {\n            _rule = _rule.replace(/^svg/i, '').trim();\n            if (_rule === '') {\n              return;\n            }\n            if (allRules[_rule]) {\n              fabric.util.object.extend(allRules[_rule], ruleObj);\n            }\n            else {\n              allRules[_rule] = fabric.util.object.clone(ruleObj);\n            }\n          });\n        });\n      }\n      return allRules;\n    },\n\n    /**\n     * Takes url corresponding to an SVG document, and parses it into a set of fabric objects.\n     * Note that SVG is fetched via XMLHttpRequest, so it needs to conform to SOP (Same Origin Policy)\n     * @memberOf fabric\n     * @param {String} url\n     * @param {Function} callback\n     * @param {Function} [reviver] Method for further parsing of SVG elements, called after each fabric object created.\n     * @param {Object} [options] Object containing options for parsing\n     * @param {String} [options.crossOrigin] crossOrigin crossOrigin setting to use for external resources\n     */\n    loadSVGFromURL: function(url, callback, reviver, options) {\n\n      url = url.replace(/^\\n\\s*/, '').trim();\n      new fabric.util.request(url, {\n        method: 'get',\n        onComplete: onComplete\n      });\n\n      function onComplete(r) {\n\n        var xml = r.responseXML;\n        if (!xml || !xml.documentElement) {\n          callback && callback(null);\n          return false;\n        }\n\n        fabric.parseSVGDocument(xml.documentElement, function (results, _options, elements, allElements) {\n          callback && callback(results, _options, elements, allElements);\n        }, reviver, options);\n      }\n    },\n\n    /**\n     * Takes string corresponding to an SVG document, and parses it into a set of fabric objects\n     * @memberOf fabric\n     * @param {String} string\n     * @param {Function} callback\n     * @param {Function} [reviver] Method for further parsing of SVG elements, called after each fabric object created.\n     * @param {Object} [options] Object containing options for parsing\n     * @param {String} [options.crossOrigin] crossOrigin crossOrigin setting to use for external resources\n     */\n    loadSVGFromString: function(string, callback, reviver, options) {\n      var parser = new fabric.window.DOMParser(),\n          doc = parser.parseFromString(string.trim(), 'text/xml');\n      fabric.parseSVGDocument(doc.documentElement, function (results, _options, elements, allElements) {\n        callback(results, _options, elements, allElements);\n      }, reviver, options);\n    }\n  });\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\nfabric.ElementsParser = function(elements, callback, options, reviver, parsingOptions, doc) {\n  this.elements = elements;\n  this.callback = callback;\n  this.options = options;\n  this.reviver = reviver;\n  this.svgUid = (options && options.svgUid) || 0;\n  this.parsingOptions = parsingOptions;\n  this.regexUrl = /^url\\(['\"]?#([^'\"]+)['\"]?\\)/g;\n  this.doc = doc;\n};\n\n(function(proto) {\n  proto.parse = function() {\n    this.instances = new Array(this.elements.length);\n    this.numElements = this.elements.length;\n    this.createObjects();\n  };\n\n  proto.createObjects = function() {\n    var _this = this;\n    this.elements.forEach(function(element, i) {\n      element.setAttribute('svgUid', _this.svgUid);\n      _this.createObject(element, i);\n    });\n  };\n\n  proto.findTag = function(el) {\n    return fabric[fabric.util.string.capitalize(el.tagName.replace('svg:', ''))];\n  };\n\n  proto.createObject = function(el, index) {\n    var klass = this.findTag(el);\n    if (klass && klass.fromElement) {\n      try {\n        klass.fromElement(el, this.createCallback(index, el), this.options);\n      }\n      catch (err) {\n        fabric.log(err);\n      }\n    }\n    else {\n      this.checkIfDone();\n    }\n  };\n\n  proto.createCallback = function(index, el) {\n    var _this = this;\n    return function(obj) {\n      var _options;\n      _this.resolveGradient(obj, el, 'fill');\n      _this.resolveGradient(obj, el, 'stroke');\n      if (obj instanceof fabric.Image && obj._originalElement) {\n        _options = obj.parsePreserveAspectRatioAttribute(el);\n      }\n      obj._removeTransformMatrix(_options);\n      _this.resolveClipPath(obj, el);\n      _this.reviver && _this.reviver(el, obj);\n      _this.instances[index] = obj;\n      _this.checkIfDone();\n    };\n  };\n\n  proto.extractPropertyDefinition = function(obj, property, storage) {\n    var value = obj[property], regex = this.regexUrl;\n    if (!regex.test(value)) {\n      return;\n    }\n    regex.lastIndex = 0;\n    var id = regex.exec(value)[1];\n    regex.lastIndex = 0;\n    return fabric[storage][this.svgUid][id];\n  };\n\n  proto.resolveGradient = function(obj, el, property) {\n    var gradientDef = this.extractPropertyDefinition(obj, property, 'gradientDefs');\n    if (gradientDef) {\n      var opacityAttr = el.getAttribute(property + '-opacity');\n      var gradient = fabric.Gradient.fromElement(gradientDef, obj, opacityAttr, this.options);\n      obj.set(property, gradient);\n    }\n  };\n\n  proto.createClipPathCallback = function(obj, container) {\n    return function(_newObj) {\n      _newObj._removeTransformMatrix();\n      _newObj.fillRule = _newObj.clipRule;\n      container.push(_newObj);\n    };\n  };\n\n  proto.resolveClipPath = function(obj, usingElement) {\n    var clipPath = this.extractPropertyDefinition(obj, 'clipPath', 'clipPaths'),\n        element, klass, objTransformInv, container, gTransform, options;\n    if (clipPath) {\n      container = [];\n      objTransformInv = fabric.util.invertTransform(obj.calcTransformMatrix());\n      // move the clipPath tag as sibling to the real element that is using it\n      var clipPathTag = clipPath[0].parentNode;\n      var clipPathOwner = usingElement;\n      while (clipPathOwner.parentNode && clipPathOwner.getAttribute('clip-path') !== obj.clipPath) {\n        clipPathOwner = clipPathOwner.parentNode;\n      }\n      clipPathOwner.parentNode.appendChild(clipPathTag);\n      for (var i = 0; i < clipPath.length; i++) {\n        element = clipPath[i];\n        klass = this.findTag(element);\n        klass.fromElement(\n          element,\n          this.createClipPathCallback(obj, container),\n          this.options\n        );\n      }\n      if (container.length === 1) {\n        clipPath = container[0];\n      }\n      else {\n        clipPath = new fabric.Group(container);\n      }\n      gTransform = fabric.util.multiplyTransformMatrices(\n        objTransformInv,\n        clipPath.calcTransformMatrix()\n      );\n      if (clipPath.clipPath) {\n        this.resolveClipPath(clipPath, clipPathOwner);\n      }\n      var options = fabric.util.qrDecompose(gTransform);\n      clipPath.flipX = false;\n      clipPath.flipY = false;\n      clipPath.set('scaleX', options.scaleX);\n      clipPath.set('scaleY', options.scaleY);\n      clipPath.angle = options.angle;\n      clipPath.skewX = options.skewX;\n      clipPath.skewY = 0;\n      clipPath.setPositionByOrigin({ x: options.translateX, y: options.translateY }, 'center', 'center');\n      obj.clipPath = clipPath;\n    }\n    else {\n      // if clip-path does not resolve to any element, delete the property.\n      delete obj.clipPath;\n    }\n  };\n\n  proto.checkIfDone = function() {\n    if (--this.numElements === 0) {\n      this.instances = this.instances.filter(function(el) {\n        // eslint-disable-next-line no-eq-null, eqeqeq\n        return el != null;\n      });\n      this.callback(this.instances, this.elements);\n    }\n  };\n})(fabric.ElementsParser.prototype);\n\n\n(function(global) {\n\n  'use strict';\n\n  /* Adaptation of work of Kevin Lindsey (kevin@kevlindev.com) */\n\n  var fabric = global.fabric || (global.fabric = { });\n\n  if (fabric.Point) {\n    fabric.warn('fabric.Point is already defined');\n    return;\n  }\n\n  fabric.Point = Point;\n\n  /**\n   * Point class\n   * @class fabric.Point\n   * @memberOf fabric\n   * @constructor\n   * @param {Number} x\n   * @param {Number} y\n   * @return {fabric.Point} thisArg\n   */\n  function Point(x, y) {\n    this.x = x;\n    this.y = y;\n  }\n\n  Point.prototype = /** @lends fabric.Point.prototype */ {\n\n    type: 'point',\n\n    constructor: Point,\n\n    /**\n     * Adds another point to this one and returns another one\n     * @param {fabric.Point} that\n     * @return {fabric.Point} new Point instance with added values\n     */\n    add: function (that) {\n      return new Point(this.x + that.x, this.y + that.y);\n    },\n\n    /**\n     * Adds another point to this one\n     * @param {fabric.Point} that\n     * @return {fabric.Point} thisArg\n     * @chainable\n     */\n    addEquals: function (that) {\n      this.x += that.x;\n      this.y += that.y;\n      return this;\n    },\n\n    /**\n     * Adds value to this point and returns a new one\n     * @param {Number} scalar\n     * @return {fabric.Point} new Point with added value\n     */\n    scalarAdd: function (scalar) {\n      return new Point(this.x + scalar, this.y + scalar);\n    },\n\n    /**\n     * Adds value to this point\n     * @param {Number} scalar\n     * @return {fabric.Point} thisArg\n     * @chainable\n     */\n    scalarAddEquals: function (scalar) {\n      this.x += scalar;\n      this.y += scalar;\n      return this;\n    },\n\n    /**\n     * Subtracts another point from this point and returns a new one\n     * @param {fabric.Point} that\n     * @return {fabric.Point} new Point object with subtracted values\n     */\n    subtract: function (that) {\n      return new Point(this.x - that.x, this.y - that.y);\n    },\n\n    /**\n     * Subtracts another point from this point\n     * @param {fabric.Point} that\n     * @return {fabric.Point} thisArg\n     * @chainable\n     */\n    subtractEquals: function (that) {\n      this.x -= that.x;\n      this.y -= that.y;\n      return this;\n    },\n\n    /**\n     * Subtracts value from this point and returns a new one\n     * @param {Number} scalar\n     * @return {fabric.Point}\n     */\n    scalarSubtract: function (scalar) {\n      return new Point(this.x - scalar, this.y - scalar);\n    },\n\n    /**\n     * Subtracts value from this point\n     * @param {Number} scalar\n     * @return {fabric.Point} thisArg\n     * @chainable\n     */\n    scalarSubtractEquals: function (scalar) {\n      this.x -= scalar;\n      this.y -= scalar;\n      return this;\n    },\n\n    /**\n     * Multiplies this point by a value and returns a new one\n     * TODO: rename in scalarMultiply in 2.0\n     * @param {Number} scalar\n     * @return {fabric.Point}\n     */\n    multiply: function (scalar) {\n      return new Point(this.x * scalar, this.y * scalar);\n    },\n\n    /**\n     * Multiplies this point by a value\n     * TODO: rename in scalarMultiplyEquals in 2.0\n     * @param {Number} scalar\n     * @return {fabric.Point} thisArg\n     * @chainable\n     */\n    multiplyEquals: function (scalar) {\n      this.x *= scalar;\n      this.y *= scalar;\n      return this;\n    },\n\n    /**\n     * Divides this point by a value and returns a new one\n     * TODO: rename in scalarDivide in 2.0\n     * @param {Number} scalar\n     * @return {fabric.Point}\n     */\n    divide: function (scalar) {\n      return new Point(this.x / scalar, this.y / scalar);\n    },\n\n    /**\n     * Divides this point by a value\n     * TODO: rename in scalarDivideEquals in 2.0\n     * @param {Number} scalar\n     * @return {fabric.Point} thisArg\n     * @chainable\n     */\n    divideEquals: function (scalar) {\n      this.x /= scalar;\n      this.y /= scalar;\n      return this;\n    },\n\n    /**\n     * Returns true if this point is equal to another one\n     * @param {fabric.Point} that\n     * @return {Boolean}\n     */\n    eq: function (that) {\n      return (this.x === that.x && this.y === that.y);\n    },\n\n    /**\n     * Returns true if this point is less than another one\n     * @param {fabric.Point} that\n     * @return {Boolean}\n     */\n    lt: function (that) {\n      return (this.x < that.x && this.y < that.y);\n    },\n\n    /**\n     * Returns true if this point is less than or equal to another one\n     * @param {fabric.Point} that\n     * @return {Boolean}\n     */\n    lte: function (that) {\n      return (this.x <= that.x && this.y <= that.y);\n    },\n\n    /**\n\n     * Returns true if this point is greater another one\n     * @param {fabric.Point} that\n     * @return {Boolean}\n     */\n    gt: function (that) {\n      return (this.x > that.x && this.y > that.y);\n    },\n\n    /**\n     * Returns true if this point is greater than or equal to another one\n     * @param {fabric.Point} that\n     * @return {Boolean}\n     */\n    gte: function (that) {\n      return (this.x >= that.x && this.y >= that.y);\n    },\n\n    /**\n     * Returns new point which is the result of linear interpolation with this one and another one\n     * @param {fabric.Point} that\n     * @param {Number} t , position of interpolation, between 0 and 1 default 0.5\n     * @return {fabric.Point}\n     */\n    lerp: function (that, t) {\n      if (typeof t === 'undefined') {\n        t = 0.5;\n      }\n      t = Math.max(Math.min(1, t), 0);\n      return new Point(this.x + (that.x - this.x) * t, this.y + (that.y - this.y) * t);\n    },\n\n    /**\n     * Returns distance from this point and another one\n     * @param {fabric.Point} that\n     * @return {Number}\n     */\n    distanceFrom: function (that) {\n      var dx = this.x - that.x,\n          dy = this.y - that.y;\n      return Math.sqrt(dx * dx + dy * dy);\n    },\n\n    /**\n     * Returns the point between this point and another one\n     * @param {fabric.Point} that\n     * @return {fabric.Point}\n     */\n    midPointFrom: function (that) {\n      return this.lerp(that);\n    },\n\n    /**\n     * Returns a new point which is the min of this and another one\n     * @param {fabric.Point} that\n     * @return {fabric.Point}\n     */\n    min: function (that) {\n      return new Point(Math.min(this.x, that.x), Math.min(this.y, that.y));\n    },\n\n    /**\n     * Returns a new point which is the max of this and another one\n     * @param {fabric.Point} that\n     * @return {fabric.Point}\n     */\n    max: function (that) {\n      return new Point(Math.max(this.x, that.x), Math.max(this.y, that.y));\n    },\n\n    /**\n     * Returns string representation of this point\n     * @return {String}\n     */\n    toString: function () {\n      return this.x + ',' + this.y;\n    },\n\n    /**\n     * Sets x/y of this point\n     * @param {Number} x\n     * @param {Number} y\n     * @chainable\n     */\n    setXY: function (x, y) {\n      this.x = x;\n      this.y = y;\n      return this;\n    },\n\n    /**\n     * Sets x of this point\n     * @param {Number} x\n     * @chainable\n     */\n    setX: function (x) {\n      this.x = x;\n      return this;\n    },\n\n    /**\n     * Sets y of this point\n     * @param {Number} y\n     * @chainable\n     */\n    setY: function (y) {\n      this.y = y;\n      return this;\n    },\n\n    /**\n     * Sets x/y of this point from another point\n     * @param {fabric.Point} that\n     * @chainable\n     */\n    setFromPoint: function (that) {\n      this.x = that.x;\n      this.y = that.y;\n      return this;\n    },\n\n    /**\n     * Swaps x/y of this point and another point\n     * @param {fabric.Point} that\n     */\n    swap: function (that) {\n      var x = this.x,\n          y = this.y;\n      this.x = that.x;\n      this.y = that.y;\n      that.x = x;\n      that.y = y;\n    },\n\n    /**\n     * return a cloned instance of the point\n     * @return {fabric.Point}\n     */\n    clone: function () {\n      return new Point(this.x, this.y);\n    }\n  };\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n  'use strict';\n\n  /* Adaptation of work of Kevin Lindsey (kevin@kevlindev.com) */\n  var fabric = global.fabric || (global.fabric = { });\n\n  if (fabric.Intersection) {\n    fabric.warn('fabric.Intersection is already defined');\n    return;\n  }\n\n  /**\n   * Intersection class\n   * @class fabric.Intersection\n   * @memberOf fabric\n   * @constructor\n   */\n  function Intersection(status) {\n    this.status = status;\n    this.points = [];\n  }\n\n  fabric.Intersection = Intersection;\n\n  fabric.Intersection.prototype = /** @lends fabric.Intersection.prototype */ {\n\n    constructor: Intersection,\n\n    /**\n     * Appends a point to intersection\n     * @param {fabric.Point} point\n     * @return {fabric.Intersection} thisArg\n     * @chainable\n     */\n    appendPoint: function (point) {\n      this.points.push(point);\n      return this;\n    },\n\n    /**\n     * Appends points to intersection\n     * @param {Array} points\n     * @return {fabric.Intersection} thisArg\n     * @chainable\n     */\n    appendPoints: function (points) {\n      this.points = this.points.concat(points);\n      return this;\n    }\n  };\n\n  /**\n   * Checks if one line intersects another\n   * TODO: rename in intersectSegmentSegment\n   * @static\n   * @param {fabric.Point} a1\n   * @param {fabric.Point} a2\n   * @param {fabric.Point} b1\n   * @param {fabric.Point} b2\n   * @return {fabric.Intersection}\n   */\n  fabric.Intersection.intersectLineLine = function (a1, a2, b1, b2) {\n    var result,\n        uaT = (b2.x - b1.x) * (a1.y - b1.y) - (b2.y - b1.y) * (a1.x - b1.x),\n        ubT = (a2.x - a1.x) * (a1.y - b1.y) - (a2.y - a1.y) * (a1.x - b1.x),\n        uB = (b2.y - b1.y) * (a2.x - a1.x) - (b2.x - b1.x) * (a2.y - a1.y);\n    if (uB !== 0) {\n      var ua = uaT / uB,\n          ub = ubT / uB;\n      if (0 <= ua && ua <= 1 && 0 <= ub && ub <= 1) {\n        result = new Intersection('Intersection');\n        result.appendPoint(new fabric.Point(a1.x + ua * (a2.x - a1.x), a1.y + ua * (a2.y - a1.y)));\n      }\n      else {\n        result = new Intersection();\n      }\n    }\n    else {\n      if (uaT === 0 || ubT === 0) {\n        result = new Intersection('Coincident');\n      }\n      else {\n        result = new Intersection('Parallel');\n      }\n    }\n    return result;\n  };\n\n  /**\n   * Checks if line intersects polygon\n   * TODO: rename in intersectSegmentPolygon\n   * fix detection of coincident\n   * @static\n   * @param {fabric.Point} a1\n   * @param {fabric.Point} a2\n   * @param {Array} points\n   * @return {fabric.Intersection}\n   */\n  fabric.Intersection.intersectLinePolygon = function(a1, a2, points) {\n    var result = new Intersection(),\n        length = points.length,\n        b1, b2, inter, i;\n\n    for (i = 0; i < length; i++) {\n      b1 = points[i];\n      b2 = points[(i + 1) % length];\n      inter = Intersection.intersectLineLine(a1, a2, b1, b2);\n\n      result.appendPoints(inter.points);\n    }\n    if (result.points.length > 0) {\n      result.status = 'Intersection';\n    }\n    return result;\n  };\n\n  /**\n   * Checks if polygon intersects another polygon\n   * @static\n   * @param {Array} points1\n   * @param {Array} points2\n   * @return {fabric.Intersection}\n   */\n  fabric.Intersection.intersectPolygonPolygon = function (points1, points2) {\n    var result = new Intersection(),\n        length = points1.length, i;\n\n    for (i = 0; i < length; i++) {\n      var a1 = points1[i],\n          a2 = points1[(i + 1) % length],\n          inter = Intersection.intersectLinePolygon(a1, a2, points2);\n\n      result.appendPoints(inter.points);\n    }\n    if (result.points.length > 0) {\n      result.status = 'Intersection';\n    }\n    return result;\n  };\n\n  /**\n   * Checks if polygon intersects rectangle\n   * @static\n   * @param {Array} points\n   * @param {fabric.Point} r1\n   * @param {fabric.Point} r2\n   * @return {fabric.Intersection}\n   */\n  fabric.Intersection.intersectPolygonRectangle = function (points, r1, r2) {\n    var min = r1.min(r2),\n        max = r1.max(r2),\n        topRight = new fabric.Point(max.x, min.y),\n        bottomLeft = new fabric.Point(min.x, max.y),\n        inter1 = Intersection.intersectLinePolygon(min, topRight, points),\n        inter2 = Intersection.intersectLinePolygon(topRight, max, points),\n        inter3 = Intersection.intersectLinePolygon(max, bottomLeft, points),\n        inter4 = Intersection.intersectLinePolygon(bottomLeft, min, points),\n        result = new Intersection();\n\n    result.appendPoints(inter1.points);\n    result.appendPoints(inter2.points);\n    result.appendPoints(inter3.points);\n    result.appendPoints(inter4.points);\n\n    if (result.points.length > 0) {\n      result.status = 'Intersection';\n    }\n    return result;\n  };\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n  'use strict';\n\n  var fabric = global.fabric || (global.fabric = { });\n\n  if (fabric.Color) {\n    fabric.warn('fabric.Color is already defined.');\n    return;\n  }\n\n  /**\n   * Color class\n   * The purpose of {@link fabric.Color} is to abstract and encapsulate common color operations;\n   * {@link fabric.Color} is a constructor and creates instances of {@link fabric.Color} objects.\n   *\n   * @class fabric.Color\n   * @param {String} color optional in hex or rgb(a) or hsl format or from known color list\n   * @return {fabric.Color} thisArg\n   * @tutorial {@link http://fabricjs.com/fabric-intro-part-2/#colors}\n   */\n  function Color(color) {\n    if (!color) {\n      this.setSource([0, 0, 0, 1]);\n    }\n    else {\n      this._tryParsingColor(color);\n    }\n  }\n\n  fabric.Color = Color;\n\n  fabric.Color.prototype = /** @lends fabric.Color.prototype */ {\n\n    /**\n     * @private\n     * @param {String|Array} color Color value to parse\n     */\n    _tryParsingColor: function(color) {\n      var source;\n\n      if (color in Color.colorNameMap) {\n        color = Color.colorNameMap[color];\n      }\n\n      if (color === 'transparent') {\n        source = [255, 255, 255, 0];\n      }\n\n      if (!source) {\n        source = Color.sourceFromHex(color);\n      }\n      if (!source) {\n        source = Color.sourceFromRgb(color);\n      }\n      if (!source) {\n        source = Color.sourceFromHsl(color);\n      }\n      if (!source) {\n        //if color is not recognize let's make black as canvas does\n        source = [0, 0, 0, 1];\n      }\n      if (source) {\n        this.setSource(source);\n      }\n    },\n\n    /**\n     * Adapted from <a href=\"https://rawgithub.com/mjijackson/mjijackson.github.com/master/2008/02/rgb-to-hsl-and-rgb-to-hsv-color-model-conversion-algorithms-in-javascript.html\">https://github.com/mjijackson</a>\n     * @private\n     * @param {Number} r Red color value\n     * @param {Number} g Green color value\n     * @param {Number} b Blue color value\n     * @return {Array} Hsl color\n     */\n    _rgbToHsl: function(r, g, b) {\n      r /= 255; g /= 255; b /= 255;\n\n      var h, s, l,\n          max = fabric.util.array.max([r, g, b]),\n          min = fabric.util.array.min([r, g, b]);\n\n      l = (max + min) / 2;\n\n      if (max === min) {\n        h = s = 0; // achromatic\n      }\n      else {\n        var d = max - min;\n        s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n        switch (max) {\n          case r:\n            h = (g - b) / d + (g < b ? 6 : 0);\n            break;\n          case g:\n            h = (b - r) / d + 2;\n            break;\n          case b:\n            h = (r - g) / d + 4;\n            break;\n        }\n        h /= 6;\n      }\n\n      return [\n        Math.round(h * 360),\n        Math.round(s * 100),\n        Math.round(l * 100)\n      ];\n    },\n\n    /**\n     * Returns source of this color (where source is an array representation; ex: [200, 200, 100, 1])\n     * @return {Array}\n     */\n    getSource: function() {\n      return this._source;\n    },\n\n    /**\n     * Sets source of this color (where source is an array representation; ex: [200, 200, 100, 1])\n     * @param {Array} source\n     */\n    setSource: function(source) {\n      this._source = source;\n    },\n\n    /**\n     * Returns color representation in RGB format\n     * @return {String} ex: rgb(0-255,0-255,0-255)\n     */\n    toRgb: function() {\n      var source = this.getSource();\n      return 'rgb(' + source[0] + ',' + source[1] + ',' + source[2] + ')';\n    },\n\n    /**\n     * Returns color representation in RGBA format\n     * @return {String} ex: rgba(0-255,0-255,0-255,0-1)\n     */\n    toRgba: function() {\n      var source = this.getSource();\n      return 'rgba(' + source[0] + ',' + source[1] + ',' + source[2] + ',' + source[3] + ')';\n    },\n\n    /**\n     * Returns color representation in HSL format\n     * @return {String} ex: hsl(0-360,0%-100%,0%-100%)\n     */\n    toHsl: function() {\n      var source = this.getSource(),\n          hsl = this._rgbToHsl(source[0], source[1], source[2]);\n\n      return 'hsl(' + hsl[0] + ',' + hsl[1] + '%,' + hsl[2] + '%)';\n    },\n\n    /**\n     * Returns color representation in HSLA format\n     * @return {String} ex: hsla(0-360,0%-100%,0%-100%,0-1)\n     */\n    toHsla: function() {\n      var source = this.getSource(),\n          hsl = this._rgbToHsl(source[0], source[1], source[2]);\n\n      return 'hsla(' + hsl[0] + ',' + hsl[1] + '%,' + hsl[2] + '%,' + source[3] + ')';\n    },\n\n    /**\n     * Returns color representation in HEX format\n     * @return {String} ex: FF5555\n     */\n    toHex: function() {\n      var source = this.getSource(), r, g, b;\n\n      r = source[0].toString(16);\n      r = (r.length === 1) ? ('0' + r) : r;\n\n      g = source[1].toString(16);\n      g = (g.length === 1) ? ('0' + g) : g;\n\n      b = source[2].toString(16);\n      b = (b.length === 1) ? ('0' + b) : b;\n\n      return r.toUpperCase() + g.toUpperCase() + b.toUpperCase();\n    },\n\n    /**\n     * Returns color representation in HEXA format\n     * @return {String} ex: FF5555CC\n     */\n    toHexa: function() {\n      var source = this.getSource(), a;\n\n      a = Math.round(source[3] * 255);\n      a = a.toString(16);\n      a = (a.length === 1) ? ('0' + a) : a;\n\n      return this.toHex() + a.toUpperCase();\n    },\n\n    /**\n     * Gets value of alpha channel for this color\n     * @return {Number} 0-1\n     */\n    getAlpha: function() {\n      return this.getSource()[3];\n    },\n\n    /**\n     * Sets value of alpha channel for this color\n     * @param {Number} alpha Alpha value 0-1\n     * @return {fabric.Color} thisArg\n     */\n    setAlpha: function(alpha) {\n      var source = this.getSource();\n      source[3] = alpha;\n      this.setSource(source);\n      return this;\n    },\n\n    /**\n     * Transforms color to its grayscale representation\n     * @return {fabric.Color} thisArg\n     */\n    toGrayscale: function() {\n      var source = this.getSource(),\n          average = parseInt((source[0] * 0.3 + source[1] * 0.59 + source[2] * 0.11).toFixed(0), 10),\n          currentAlpha = source[3];\n      this.setSource([average, average, average, currentAlpha]);\n      return this;\n    },\n\n    /**\n     * Transforms color to its black and white representation\n     * @param {Number} threshold\n     * @return {fabric.Color} thisArg\n     */\n    toBlackWhite: function(threshold) {\n      var source = this.getSource(),\n          average = (source[0] * 0.3 + source[1] * 0.59 + source[2] * 0.11).toFixed(0),\n          currentAlpha = source[3];\n\n      threshold = threshold || 127;\n\n      average = (Number(average) < Number(threshold)) ? 0 : 255;\n      this.setSource([average, average, average, currentAlpha]);\n      return this;\n    },\n\n    /**\n     * Overlays color with another color\n     * @param {String|fabric.Color} otherColor\n     * @return {fabric.Color} thisArg\n     */\n    overlayWith: function(otherColor) {\n      if (!(otherColor instanceof Color)) {\n        otherColor = new Color(otherColor);\n      }\n\n      var result = [],\n          alpha = this.getAlpha(),\n          otherAlpha = 0.5,\n          source = this.getSource(),\n          otherSource = otherColor.getSource(), i;\n\n      for (i = 0; i < 3; i++) {\n        result.push(Math.round((source[i] * (1 - otherAlpha)) + (otherSource[i] * otherAlpha)));\n      }\n\n      result[3] = alpha;\n      this.setSource(result);\n      return this;\n    }\n  };\n\n  /**\n   * Regex matching color in RGB or RGBA formats (ex: rgb(0, 0, 0), rgba(255, 100, 10, 0.5), rgba( 255 , 100 , 10 , 0.5 ), rgb(1,1,1), rgba(100%, 60%, 10%, 0.5))\n   * @static\n   * @field\n   * @memberOf fabric.Color\n   */\n  // eslint-disable-next-line max-len\n  fabric.Color.reRGBa = /^rgba?\\(\\s*(\\d{1,3}(?:\\.\\d+)?\\%?)\\s*,\\s*(\\d{1,3}(?:\\.\\d+)?\\%?)\\s*,\\s*(\\d{1,3}(?:\\.\\d+)?\\%?)\\s*(?:\\s*,\\s*((?:\\d*\\.?\\d+)?)\\s*)?\\)$/i;\n\n  /**\n   * Regex matching color in HSL or HSLA formats (ex: hsl(200, 80%, 10%), hsla(300, 50%, 80%, 0.5), hsla( 300 , 50% , 80% , 0.5 ))\n   * @static\n   * @field\n   * @memberOf fabric.Color\n   */\n  fabric.Color.reHSLa = /^hsla?\\(\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3}\\%)\\s*,\\s*(\\d{1,3}\\%)\\s*(?:\\s*,\\s*(\\d+(?:\\.\\d+)?)\\s*)?\\)$/i;\n\n  /**\n   * Regex matching color in HEX format (ex: #FF5544CC, #FF5555, 010155, aff)\n   * @static\n   * @field\n   * @memberOf fabric.Color\n   */\n  fabric.Color.reHex = /^#?([0-9a-f]{8}|[0-9a-f]{6}|[0-9a-f]{4}|[0-9a-f]{3})$/i;\n\n  /**\n   * Map of the 148 color names with HEX code\n   * @static\n   * @field\n   * @memberOf fabric.Color\n   * @see: https://www.w3.org/TR/css3-color/#svg-color\n   */\n  fabric.Color.colorNameMap = {\n    aliceblue:            '#F0F8FF',\n    antiquewhite:         '#FAEBD7',\n    aqua:                 '#00FFFF',\n    aquamarine:           '#7FFFD4',\n    azure:                '#F0FFFF',\n    beige:                '#F5F5DC',\n    bisque:               '#FFE4C4',\n    black:                '#000000',\n    blanchedalmond:       '#FFEBCD',\n    blue:                 '#0000FF',\n    blueviolet:           '#8A2BE2',\n    brown:                '#A52A2A',\n    burlywood:            '#DEB887',\n    cadetblue:            '#5F9EA0',\n    chartreuse:           '#7FFF00',\n    chocolate:            '#D2691E',\n    coral:                '#FF7F50',\n    cornflowerblue:       '#6495ED',\n    cornsilk:             '#FFF8DC',\n    crimson:              '#DC143C',\n    cyan:                 '#00FFFF',\n    darkblue:             '#00008B',\n    darkcyan:             '#008B8B',\n    darkgoldenrod:        '#B8860B',\n    darkgray:             '#A9A9A9',\n    darkgrey:             '#A9A9A9',\n    darkgreen:            '#006400',\n    darkkhaki:            '#BDB76B',\n    darkmagenta:          '#8B008B',\n    darkolivegreen:       '#556B2F',\n    darkorange:           '#FF8C00',\n    darkorchid:           '#9932CC',\n    darkred:              '#8B0000',\n    darksalmon:           '#E9967A',\n    darkseagreen:         '#8FBC8F',\n    darkslateblue:        '#483D8B',\n    darkslategray:        '#2F4F4F',\n    darkslategrey:        '#2F4F4F',\n    darkturquoise:        '#00CED1',\n    darkviolet:           '#9400D3',\n    deeppink:             '#FF1493',\n    deepskyblue:          '#00BFFF',\n    dimgray:              '#696969',\n    dimgrey:              '#696969',\n    dodgerblue:           '#1E90FF',\n    firebrick:            '#B22222',\n    floralwhite:          '#FFFAF0',\n    forestgreen:          '#228B22',\n    fuchsia:              '#FF00FF',\n    gainsboro:            '#DCDCDC',\n    ghostwhite:           '#F8F8FF',\n    gold:                 '#FFD700',\n    goldenrod:            '#DAA520',\n    gray:                 '#808080',\n    grey:                 '#808080',\n    green:                '#008000',\n    greenyellow:          '#ADFF2F',\n    honeydew:             '#F0FFF0',\n    hotpink:              '#FF69B4',\n    indianred:            '#CD5C5C',\n    indigo:               '#4B0082',\n    ivory:                '#FFFFF0',\n    khaki:                '#F0E68C',\n    lavender:             '#E6E6FA',\n    lavenderblush:        '#FFF0F5',\n    lawngreen:            '#7CFC00',\n    lemonchiffon:         '#FFFACD',\n    lightblue:            '#ADD8E6',\n    lightcoral:           '#F08080',\n    lightcyan:            '#E0FFFF',\n    lightgoldenrodyellow: '#FAFAD2',\n    lightgray:            '#D3D3D3',\n    lightgrey:            '#D3D3D3',\n    lightgreen:           '#90EE90',\n    lightpink:            '#FFB6C1',\n    lightsalmon:          '#FFA07A',\n    lightseagreen:        '#20B2AA',\n    lightskyblue:         '#87CEFA',\n    lightslategray:       '#778899',\n    lightslategrey:       '#778899',\n    lightsteelblue:       '#B0C4DE',\n    lightyellow:          '#FFFFE0',\n    lime:                 '#00FF00',\n    limegreen:            '#32CD32',\n    linen:                '#FAF0E6',\n    magenta:              '#FF00FF',\n    maroon:               '#800000',\n    mediumaquamarine:     '#66CDAA',\n    mediumblue:           '#0000CD',\n    mediumorchid:         '#BA55D3',\n    mediumpurple:         '#9370DB',\n    mediumseagreen:       '#3CB371',\n    mediumslateblue:      '#7B68EE',\n    mediumspringgreen:    '#00FA9A',\n    mediumturquoise:      '#48D1CC',\n    mediumvioletred:      '#C71585',\n    midnightblue:         '#191970',\n    mintcream:            '#F5FFFA',\n    mistyrose:            '#FFE4E1',\n    moccasin:             '#FFE4B5',\n    navajowhite:          '#FFDEAD',\n    navy:                 '#000080',\n    oldlace:              '#FDF5E6',\n    olive:                '#808000',\n    olivedrab:            '#6B8E23',\n    orange:               '#FFA500',\n    orangered:            '#FF4500',\n    orchid:               '#DA70D6',\n    palegoldenrod:        '#EEE8AA',\n    palegreen:            '#98FB98',\n    paleturquoise:        '#AFEEEE',\n    palevioletred:        '#DB7093',\n    papayawhip:           '#FFEFD5',\n    peachpuff:            '#FFDAB9',\n    peru:                 '#CD853F',\n    pink:                 '#FFC0CB',\n    plum:                 '#DDA0DD',\n    powderblue:           '#B0E0E6',\n    purple:               '#800080',\n    rebeccapurple:        '#663399',\n    red:                  '#FF0000',\n    rosybrown:            '#BC8F8F',\n    royalblue:            '#4169E1',\n    saddlebrown:          '#8B4513',\n    salmon:               '#FA8072',\n    sandybrown:           '#F4A460',\n    seagreen:             '#2E8B57',\n    seashell:             '#FFF5EE',\n    sienna:               '#A0522D',\n    silver:               '#C0C0C0',\n    skyblue:              '#87CEEB',\n    slateblue:            '#6A5ACD',\n    slategray:            '#708090',\n    slategrey:            '#708090',\n    snow:                 '#FFFAFA',\n    springgreen:          '#00FF7F',\n    steelblue:            '#4682B4',\n    tan:                  '#D2B48C',\n    teal:                 '#008080',\n    thistle:              '#D8BFD8',\n    tomato:               '#FF6347',\n    turquoise:            '#40E0D0',\n    violet:               '#EE82EE',\n    wheat:                '#F5DEB3',\n    white:                '#FFFFFF',\n    whitesmoke:           '#F5F5F5',\n    yellow:               '#FFFF00',\n    yellowgreen:          '#9ACD32'\n  };\n\n  /**\n   * @private\n   * @param {Number} p\n   * @param {Number} q\n   * @param {Number} t\n   * @return {Number}\n   */\n  function hue2rgb(p, q, t) {\n    if (t < 0) {\n      t += 1;\n    }\n    if (t > 1) {\n      t -= 1;\n    }\n    if (t < 1 / 6) {\n      return p + (q - p) * 6 * t;\n    }\n    if (t < 1 / 2) {\n      return q;\n    }\n    if (t < 2 / 3) {\n      return p + (q - p) * (2 / 3 - t) * 6;\n    }\n    return p;\n  }\n\n  /**\n   * Returns new color object, when given a color in RGB format\n   * @memberOf fabric.Color\n   * @param {String} color Color value ex: rgb(0-255,0-255,0-255)\n   * @return {fabric.Color}\n   */\n  fabric.Color.fromRgb = function(color) {\n    return Color.fromSource(Color.sourceFromRgb(color));\n  };\n\n  /**\n   * Returns array representation (ex: [100, 100, 200, 1]) of a color that's in RGB or RGBA format\n   * @memberOf fabric.Color\n   * @param {String} color Color value ex: rgb(0-255,0-255,0-255), rgb(0%-100%,0%-100%,0%-100%)\n   * @return {Array} source\n   */\n  fabric.Color.sourceFromRgb = function(color) {\n    var match = color.match(Color.reRGBa);\n    if (match) {\n      var r = parseInt(match[1], 10) / (/%$/.test(match[1]) ? 100 : 1) * (/%$/.test(match[1]) ? 255 : 1),\n          g = parseInt(match[2], 10) / (/%$/.test(match[2]) ? 100 : 1) * (/%$/.test(match[2]) ? 255 : 1),\n          b = parseInt(match[3], 10) / (/%$/.test(match[3]) ? 100 : 1) * (/%$/.test(match[3]) ? 255 : 1);\n\n      return [\n        parseInt(r, 10),\n        parseInt(g, 10),\n        parseInt(b, 10),\n        match[4] ? parseFloat(match[4]) : 1\n      ];\n    }\n  };\n\n  /**\n   * Returns new color object, when given a color in RGBA format\n   * @static\n   * @function\n   * @memberOf fabric.Color\n   * @param {String} color\n   * @return {fabric.Color}\n   */\n  fabric.Color.fromRgba = Color.fromRgb;\n\n  /**\n   * Returns new color object, when given a color in HSL format\n   * @param {String} color Color value ex: hsl(0-260,0%-100%,0%-100%)\n   * @memberOf fabric.Color\n   * @return {fabric.Color}\n   */\n  fabric.Color.fromHsl = function(color) {\n    return Color.fromSource(Color.sourceFromHsl(color));\n  };\n\n  /**\n   * Returns array representation (ex: [100, 100, 200, 1]) of a color that's in HSL or HSLA format.\n   * Adapted from <a href=\"https://rawgithub.com/mjijackson/mjijackson.github.com/master/2008/02/rgb-to-hsl-and-rgb-to-hsv-color-model-conversion-algorithms-in-javascript.html\">https://github.com/mjijackson</a>\n   * @memberOf fabric.Color\n   * @param {String} color Color value ex: hsl(0-360,0%-100%,0%-100%) or hsla(0-360,0%-100%,0%-100%, 0-1)\n   * @return {Array} source\n   * @see http://http://www.w3.org/TR/css3-color/#hsl-color\n   */\n  fabric.Color.sourceFromHsl = function(color) {\n    var match = color.match(Color.reHSLa);\n    if (!match) {\n      return;\n    }\n\n    var h = (((parseFloat(match[1]) % 360) + 360) % 360) / 360,\n        s = parseFloat(match[2]) / (/%$/.test(match[2]) ? 100 : 1),\n        l = parseFloat(match[3]) / (/%$/.test(match[3]) ? 100 : 1),\n        r, g, b;\n\n    if (s === 0) {\n      r = g = b = l;\n    }\n    else {\n      var q = l <= 0.5 ? l * (s + 1) : l + s - l * s,\n          p = l * 2 - q;\n\n      r = hue2rgb(p, q, h + 1 / 3);\n      g = hue2rgb(p, q, h);\n      b = hue2rgb(p, q, h - 1 / 3);\n    }\n\n    return [\n      Math.round(r * 255),\n      Math.round(g * 255),\n      Math.round(b * 255),\n      match[4] ? parseFloat(match[4]) : 1\n    ];\n  };\n\n  /**\n   * Returns new color object, when given a color in HSLA format\n   * @static\n   * @function\n   * @memberOf fabric.Color\n   * @param {String} color\n   * @return {fabric.Color}\n   */\n  fabric.Color.fromHsla = Color.fromHsl;\n\n  /**\n   * Returns new color object, when given a color in HEX format\n   * @static\n   * @memberOf fabric.Color\n   * @param {String} color Color value ex: FF5555\n   * @return {fabric.Color}\n   */\n  fabric.Color.fromHex = function(color) {\n    return Color.fromSource(Color.sourceFromHex(color));\n  };\n\n  /**\n   * Returns array representation (ex: [100, 100, 200, 1]) of a color that's in HEX format\n   * @static\n   * @memberOf fabric.Color\n   * @param {String} color ex: FF5555 or FF5544CC (RGBa)\n   * @return {Array} source\n   */\n  fabric.Color.sourceFromHex = function(color) {\n    if (color.match(Color.reHex)) {\n      var value = color.slice(color.indexOf('#') + 1),\n          isShortNotation = (value.length === 3 || value.length === 4),\n          isRGBa = (value.length === 8 || value.length === 4),\n          r = isShortNotation ? (value.charAt(0) + value.charAt(0)) : value.substring(0, 2),\n          g = isShortNotation ? (value.charAt(1) + value.charAt(1)) : value.substring(2, 4),\n          b = isShortNotation ? (value.charAt(2) + value.charAt(2)) : value.substring(4, 6),\n          a = isRGBa ? (isShortNotation ? (value.charAt(3) + value.charAt(3)) : value.substring(6, 8)) : 'FF';\n\n      return [\n        parseInt(r, 16),\n        parseInt(g, 16),\n        parseInt(b, 16),\n        parseFloat((parseInt(a, 16) / 255).toFixed(2))\n      ];\n    }\n  };\n\n  /**\n   * Returns new color object, when given color in array representation (ex: [200, 100, 100, 0.5])\n   * @static\n   * @memberOf fabric.Color\n   * @param {Array} source\n   * @return {fabric.Color}\n   */\n  fabric.Color.fromSource = function(source) {\n    var oColor = new Color();\n    oColor.setSource(source);\n    return oColor;\n  };\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n  'use strict';\n\n  var fabric = global.fabric || (global.fabric = { }),\n      scaleMap = ['e', 'se', 's', 'sw', 'w', 'nw', 'n', 'ne', 'e'],\n      skewMap = ['ns', 'nesw', 'ew', 'nwse'],\n      controls = {},\n      LEFT = 'left', TOP = 'top', RIGHT = 'right', BOTTOM = 'bottom', CENTER = 'center',\n      opposite = {\n        top: BOTTOM,\n        bottom: TOP,\n        left: RIGHT,\n        right: LEFT,\n        center: CENTER,\n      }, radiansToDegrees = fabric.util.radiansToDegrees,\n      sign = (Math.sign || function(x) { return ((x > 0) - (x < 0)) || +x; });\n\n  /**\n   * Combine control position and object angle to find the control direction compared\n   * to the object center.\n   * @param {fabric.Object} fabricObject the fabric object for which we are rendering controls\n   * @param {fabric.Control} control the control class\n   * @return {Number} 0 - 7 a quadrant number\n   */\n  function findCornerQuadrant(fabricObject, control) {\n    var cornerAngle = fabricObject.angle + radiansToDegrees(Math.atan2(control.y, control.x)) + 360;\n    return Math.round((cornerAngle % 360) / 45);\n  }\n\n  function fireEvent(eventName, options) {\n    var target = options.transform.target,\n        canvas = target.canvas,\n        canvasOptions = fabric.util.object.clone(options);\n    canvasOptions.target = target;\n    canvas && canvas.fire('object:' + eventName, canvasOptions);\n    target.fire(eventName, options);\n  }\n\n  /**\n   * Inspect event and fabricObject properties to understand if the scaling action\n   * @param {Event} eventData from the user action\n   * @param {fabric.Object} fabricObject the fabric object about to scale\n   * @return {Boolean} true if scale is proportional\n   */\n  function scaleIsProportional(eventData, fabricObject) {\n    var canvas = fabricObject.canvas, uniScaleKey = canvas.uniScaleKey,\n        uniformIsToggled = eventData[uniScaleKey];\n    return (canvas.uniformScaling && !uniformIsToggled) ||\n    (!canvas.uniformScaling && uniformIsToggled);\n  }\n\n  /**\n   * Checks if transform is centered\n   * @param {Object} transform transform data\n   * @return {Boolean} true if transform is centered\n   */\n  function isTransformCentered(transform) {\n    return transform.originX === CENTER && transform.originY === CENTER;\n  }\n\n  /**\n   * Inspect fabricObject to understand if the current scaling action is allowed\n   * @param {fabric.Object} fabricObject the fabric object about to scale\n   * @param {String} by 'x' or 'y' or ''\n   * @param {Boolean} scaleProportionally true if we are trying to scale proportionally\n   * @return {Boolean} true if scaling is not allowed at current conditions\n   */\n  function scalingIsForbidden(fabricObject, by, scaleProportionally) {\n    var lockX = fabricObject.lockScalingX, lockY = fabricObject.lockScalingY;\n    if (lockX && lockY) {\n      return true;\n    }\n    if (!by && (lockX || lockY) && scaleProportionally) {\n      return true;\n    }\n    if (lockX && by === 'x') {\n      return true;\n    }\n    if (lockY && by === 'y') {\n      return true;\n    }\n    return false;\n  }\n\n  /**\n   * return the correct cursor style for the scale action\n   * @param {Event} eventData the javascript event that is causing the scale\n   * @param {fabric.Control} control the control that is interested in the action\n   * @param {fabric.Object} fabricObject the fabric object that is interested in the action\n   * @return {String} a valid css string for the cursor\n   */\n  function scaleCursorStyleHandler(eventData, control, fabricObject) {\n    var notAllowed = 'not-allowed',\n        scaleProportionally = scaleIsProportional(eventData, fabricObject),\n        by = '';\n    if (control.x !== 0 && control.y === 0) {\n      by = 'x';\n    }\n    else if (control.x === 0 && control.y !== 0) {\n      by = 'y';\n    }\n    if (scalingIsForbidden(fabricObject, by, scaleProportionally)) {\n      return notAllowed;\n    }\n    var n = findCornerQuadrant(fabricObject, control);\n    return scaleMap[n] + '-resize';\n  }\n\n  /**\n   * return the correct cursor style for the skew action\n   * @param {Event} eventData the javascript event that is causing the scale\n   * @param {fabric.Control} control the control that is interested in the action\n   * @param {fabric.Object} fabricObject the fabric object that is interested in the action\n   * @return {String} a valid css string for the cursor\n   */\n  function skewCursorStyleHandler(eventData, control, fabricObject) {\n    var notAllowed = 'not-allowed';\n    if (control.x !== 0 && fabricObject.lockSkewingY) {\n      return notAllowed;\n    }\n    if (control.y !== 0 && fabricObject.lockSkewingX) {\n      return notAllowed;\n    }\n    var n = findCornerQuadrant(fabricObject, control) % 4;\n    return skewMap[n] + '-resize';\n  }\n\n  /**\n   * Combine skew and scale style handlers to cover fabric standard use case\n   * @param {Event} eventData the javascript event that is causing the scale\n   * @param {fabric.Control} control the control that is interested in the action\n   * @param {fabric.Object} fabricObject the fabric object that is interested in the action\n   * @return {String} a valid css string for the cursor\n   */\n  function scaleSkewCursorStyleHandler(eventData, control, fabricObject) {\n    if (eventData[fabricObject.canvas.altActionKey]) {\n      return controls.skewCursorStyleHandler(eventData, control, fabricObject);\n    }\n    return controls.scaleCursorStyleHandler(eventData, control, fabricObject);\n  }\n\n  /**\n   * Inspect event, control and fabricObject to return the correct action name\n   * @param {Event} eventData the javascript event that is causing the scale\n   * @param {fabric.Control} control the control that is interested in the action\n   * @param {fabric.Object} fabricObject the fabric object that is interested in the action\n   * @return {String} an action name\n   */\n  function scaleOrSkewActionName(eventData, control, fabricObject) {\n    var isAlternative = eventData[fabricObject.canvas.altActionKey];\n    if (control.x === 0) {\n      // then is scaleY or skewX\n      return isAlternative ? 'skewX' : 'scaleY';\n    }\n    if (control.y === 0) {\n      // then is scaleY or skewX\n      return isAlternative ? 'skewY' : 'scaleX';\n    }\n  }\n\n  /**\n   * Find the correct style for the control that is used for rotation.\n   * this function is very simple and it just take care of not-allowed or standard cursor\n   * @param {Event} eventData the javascript event that is causing the scale\n   * @param {fabric.Control} control the control that is interested in the action\n   * @param {fabric.Object} fabricObject the fabric object that is interested in the action\n   * @return {String} a valid css string for the cursor\n   */\n  function rotationStyleHandler(eventData, control, fabricObject) {\n    if (fabricObject.lockRotation) {\n      return 'not-allowed';\n    }\n    return control.cursorStyle;\n  }\n\n  function commonEventInfo(eventData, transform, x, y) {\n    return {\n      e: eventData,\n      transform: transform,\n      pointer: {\n        x: x,\n        y: y,\n      }\n    };\n  }\n\n  /**\n   * Wrap an action handler with saving/restoring object position on the transform.\n   * this is the code that permits to objects to keep their position while transforming.\n   * @param {Function} actionHandler the function to wrap\n   * @return {Function} a function with an action handler signature\n   */\n  function wrapWithFixedAnchor(actionHandler) {\n    return function(eventData, transform, x, y) {\n      var target = transform.target, centerPoint = target.getCenterPoint(),\n          constraint = target.translateToOriginPoint(centerPoint, transform.originX, transform.originY),\n          actionPerformed = actionHandler(eventData, transform, x, y);\n      target.setPositionByOrigin(constraint, transform.originX, transform.originY);\n      return actionPerformed;\n    };\n  }\n\n  /**\n   * Wrap an action handler with firing an event if the action is performed\n   * @param {Function} actionHandler the function to wrap\n   * @return {Function} a function with an action handler signature\n   */\n  function wrapWithFireEvent(eventName, actionHandler) {\n    return function(eventData, transform, x, y) {\n      var actionPerformed = actionHandler(eventData, transform, x, y);\n      if (actionPerformed) {\n        fireEvent(eventName, commonEventInfo(eventData, transform, x, y));\n      }\n      return actionPerformed;\n    };\n  }\n\n  /**\n   * Transforms a point described by x and y in a distance from the top left corner of the object\n   * bounding box.\n   * @param {Object} transform\n   * @param {String} originX\n   * @param {String} originY\n   * @param {number} x\n   * @param {number} y\n   * @return {Fabric.Point} the normalized point\n   */\n  function getLocalPoint(transform, originX, originY, x, y) {\n    var target = transform.target,\n        control = target.controls[transform.corner],\n        zoom = target.canvas.getZoom(),\n        padding = target.padding / zoom,\n        localPoint = target.toLocalPoint(new fabric.Point(x, y), originX, originY);\n    if (localPoint.x >= padding) {\n      localPoint.x -= padding;\n    }\n    if (localPoint.x <= -padding) {\n      localPoint.x += padding;\n    }\n    if (localPoint.y >= padding) {\n      localPoint.y -= padding;\n    }\n    if (localPoint.y <= padding) {\n      localPoint.y += padding;\n    }\n    localPoint.x -= control.offsetX;\n    localPoint.y -= control.offsetY;\n    return localPoint;\n  }\n\n  /**\n   * Detect if the fabric object is flipped on one side.\n   * @param {fabric.Object} target\n   * @return {Boolean} true if one flip, but not two.\n   */\n  function targetHasOneFlip(target) {\n    return target.flipX !== target.flipY;\n  }\n\n  /**\n   * Utility function to compensate the scale factor when skew is applied on both axes\n   * @private\n   */\n  function compensateScaleForSkew(target, oppositeSkew, scaleToCompensate, axis, reference) {\n    if (target[oppositeSkew] !== 0) {\n      var newDim = target._getTransformedDimensions()[axis];\n      var newValue = reference / newDim * target[scaleToCompensate];\n      target.set(scaleToCompensate, newValue);\n    }\n  }\n\n  /**\n   * Action handler for skewing on the X axis\n   * @private\n   */\n  function skewObjectX(eventData, transform, x, y) {\n    var target = transform.target,\n        // find how big the object would be, if there was no skewX. takes in account scaling\n        dimNoSkew = target._getTransformedDimensions(0, target.skewY),\n        localPoint = getLocalPoint(transform, transform.originX, transform.originY, x, y),\n        // the mouse is in the center of the object, and we want it to stay there.\n        // so the object will grow twice as much as the mouse.\n        // this makes the skew growth to localPoint * 2 - dimNoSkew.\n        totalSkewSize = Math.abs(localPoint.x * 2) - dimNoSkew.x,\n        currentSkew = target.skewX, newSkew;\n    if (totalSkewSize < 2) {\n      // let's make it easy to go back to position 0.\n      newSkew = 0;\n    }\n    else {\n      newSkew = radiansToDegrees(\n        Math.atan2((totalSkewSize / target.scaleX), (dimNoSkew.y / target.scaleY))\n      );\n      // now we have to find the sign of the skew.\n      // it mostly depend on the origin of transformation.\n      if (transform.originX === LEFT && transform.originY === BOTTOM) {\n        newSkew = -newSkew;\n      }\n      if (transform.originX === RIGHT && transform.originY === TOP) {\n        newSkew = -newSkew;\n      }\n      if (targetHasOneFlip(target)) {\n        newSkew = -newSkew;\n      }\n    }\n    var hasSkewed = currentSkew !== newSkew;\n    if (hasSkewed) {\n      var dimBeforeSkewing = target._getTransformedDimensions().y;\n      target.set('skewX', newSkew);\n      compensateScaleForSkew(target, 'skewY', 'scaleY', 'y', dimBeforeSkewing);\n    }\n    return hasSkewed;\n  }\n\n  /**\n   * Action handler for skewing on the Y axis\n   * @private\n   */\n  function skewObjectY(eventData, transform, x, y) {\n    var target = transform.target,\n        // find how big the object would be, if there was no skewX. takes in account scaling\n        dimNoSkew = target._getTransformedDimensions(target.skewX, 0),\n        localPoint = getLocalPoint(transform, transform.originX, transform.originY, x, y),\n        // the mouse is in the center of the object, and we want it to stay there.\n        // so the object will grow twice as much as the mouse.\n        // this makes the skew growth to localPoint * 2 - dimNoSkew.\n        totalSkewSize = Math.abs(localPoint.y * 2) - dimNoSkew.y,\n        currentSkew = target.skewY, newSkew;\n    if (totalSkewSize < 2) {\n      // let's make it easy to go back to position 0.\n      newSkew = 0;\n    }\n    else {\n      newSkew = radiansToDegrees(\n        Math.atan2((totalSkewSize / target.scaleY), (dimNoSkew.x / target.scaleX))\n      );\n      // now we have to find the sign of the skew.\n      // it mostly depend on the origin of transformation.\n      if (transform.originX === LEFT && transform.originY === BOTTOM) {\n        newSkew = -newSkew;\n      }\n      if (transform.originX === RIGHT && transform.originY === TOP) {\n        newSkew = -newSkew;\n      }\n      if (targetHasOneFlip(target)) {\n        newSkew = -newSkew;\n      }\n    }\n    var hasSkewed = currentSkew !== newSkew;\n    if (hasSkewed) {\n      var dimBeforeSkewing = target._getTransformedDimensions().x;\n      target.set('skewY', newSkew);\n      compensateScaleForSkew(target, 'skewX', 'scaleX', 'x', dimBeforeSkewing);\n    }\n    return hasSkewed;\n  }\n\n  /**\n   * Wrapped Action handler for skewing on the Y axis, takes care of the\n   * skew direction and determine the correct transform origin for the anchor point\n   * @param {Event} eventData javascript event that is doing the transform\n   * @param {Object} transform javascript object containing a series of information around the current transform\n   * @param {number} x current mouse x position, canvas normalized\n   * @param {number} y current mouse y position, canvas normalized\n   * @return {Boolean} true if some change happened\n   */\n  function skewHandlerX(eventData, transform, x, y) {\n    // step1 figure out and change transform origin.\n    // if skewX > 0 and originY bottom we anchor on right\n    // if skewX > 0 and originY top we anchor on left\n    // if skewX < 0 and originY bottom we anchor on left\n    // if skewX < 0 and originY top we anchor on right\n    // if skewX is 0, we look for mouse position to understand where are we going.\n    var target = transform.target, currentSkew = target.skewX, originX, originY = transform.originY;\n    if (target.lockSkewingX) {\n      return false;\n    }\n    if (currentSkew === 0) {\n      var localPointFromCenter = getLocalPoint(transform, CENTER, CENTER, x, y);\n      if (localPointFromCenter.x > 0) {\n        // we are pulling right, anchor left;\n        originX = LEFT;\n      }\n      else {\n        // we are pulling right, anchor right\n        originX = RIGHT;\n      }\n    }\n    else {\n      if (currentSkew > 0) {\n        originX = originY === TOP ? LEFT : RIGHT;\n      }\n      if (currentSkew < 0) {\n        originX = originY === TOP ? RIGHT : LEFT;\n      }\n      // is the object flipped on one side only? swap the origin.\n      if (targetHasOneFlip(target)) {\n        originX = originX === LEFT ? RIGHT : LEFT;\n      }\n    }\n\n    // once we have the origin, we find the anchor point\n    transform.originX = originX;\n    var finalHandler = wrapWithFireEvent('skewing', wrapWithFixedAnchor(skewObjectX));\n    return finalHandler(eventData, transform, x, y);\n  }\n\n  /**\n   * Wrapped Action handler for skewing on the Y axis, takes care of the\n   * skew direction and determine the correct transform origin for the anchor point\n   * @param {Event} eventData javascript event that is doing the transform\n   * @param {Object} transform javascript object containing a series of information around the current transform\n   * @param {number} x current mouse x position, canvas normalized\n   * @param {number} y current mouse y position, canvas normalized\n   * @return {Boolean} true if some change happened\n   */\n  function skewHandlerY(eventData, transform, x, y) {\n    // step1 figure out and change transform origin.\n    // if skewY > 0 and originX left we anchor on top\n    // if skewY > 0 and originX right we anchor on bottom\n    // if skewY < 0 and originX left we anchor on bottom\n    // if skewY < 0 and originX right we anchor on top\n    // if skewY is 0, we look for mouse position to understand where are we going.\n    var target = transform.target, currentSkew = target.skewY, originY, originX = transform.originX;\n    if (target.lockSkewingY) {\n      return false;\n    }\n    if (currentSkew === 0) {\n      var localPointFromCenter = getLocalPoint(transform, CENTER, CENTER, x, y);\n      if (localPointFromCenter.y > 0) {\n        // we are pulling down, anchor up;\n        originY = TOP;\n      }\n      else {\n        // we are pulling up, anchor down\n        originY = BOTTOM;\n      }\n    }\n    else {\n      if (currentSkew > 0) {\n        originY = originX === LEFT ? TOP : BOTTOM;\n      }\n      if (currentSkew < 0) {\n        originY = originX === LEFT ? BOTTOM : TOP;\n      }\n      // is the object flipped on one side only? swap the origin.\n      if (targetHasOneFlip(target)) {\n        originY = originY === TOP ? BOTTOM : TOP;\n      }\n    }\n\n    // once we have the origin, we find the anchor point\n    transform.originY = originY;\n    var finalHandler = wrapWithFireEvent('skewing', wrapWithFixedAnchor(skewObjectY));\n    return finalHandler(eventData, transform, x, y);\n  }\n\n  /**\n   * Action handler for rotation and snapping, without anchor point.\n   * Needs to be wrapped with `wrapWithFixedAnchor` to be effective\n   * @param {Event} eventData javascript event that is doing the transform\n   * @param {Object} transform javascript object containing a series of information around the current transform\n   * @param {number} x current mouse x position, canvas normalized\n   * @param {number} y current mouse y position, canvas normalized\n   * @return {Boolean} true if some change happened\n   * @private\n   */\n  function rotationWithSnapping(eventData, transform, x, y) {\n    var t = transform,\n        target = t.target,\n        pivotPoint = target.translateToOriginPoint(target.getCenterPoint(), t.originX, t.originY);\n\n    if (target.lockRotation) {\n      return false;\n    }\n\n    var lastAngle = Math.atan2(t.ey - pivotPoint.y, t.ex - pivotPoint.x),\n        curAngle = Math.atan2(y - pivotPoint.y, x - pivotPoint.x),\n        angle = radiansToDegrees(curAngle - lastAngle + t.theta),\n        hasRotated = true;\n\n    if (target.snapAngle > 0) {\n      var snapAngle  = target.snapAngle,\n          snapThreshold  = target.snapThreshold || snapAngle,\n          rightAngleLocked = Math.ceil(angle / snapAngle) * snapAngle,\n          leftAngleLocked = Math.floor(angle / snapAngle) * snapAngle;\n\n      if (Math.abs(angle - leftAngleLocked) < snapThreshold) {\n        angle = leftAngleLocked;\n      }\n      else if (Math.abs(angle - rightAngleLocked) < snapThreshold) {\n        angle = rightAngleLocked;\n      }\n    }\n\n    // normalize angle to positive value\n    if (angle < 0) {\n      angle = 360 + angle;\n    }\n    angle %= 360;\n\n    hasRotated = target.angle !== angle;\n    target.angle = angle;\n    return hasRotated;\n  }\n\n  /**\n   * Basic scaling logic, reused with different constrain for scaling X,Y, freely or equally.\n   * Needs to be wrapped with `wrapWithFixedAnchor` to be effective\n   * @param {Event} eventData javascript event that is doing the transform\n   * @param {Object} transform javascript object containing a series of information around the current transform\n   * @param {number} x current mouse x position, canvas normalized\n   * @param {number} y current mouse y position, canvas normalized\n   * @param {Object} options additional information for scaling\n   * @param {String} options.by 'x', 'y', 'equally' or '' to indicate type of scaling\n   * @return {Boolean} true if some change happened\n   * @private\n   */\n  function scaleObject(eventData, transform, x, y, options) {\n    options = options || {};\n    var target = transform.target,\n        lockScalingX = target.lockScalingX, lockScalingY = target.lockScalingY,\n        by = options.by, newPoint, scaleX, scaleY, dim,\n        scaleProportionally = scaleIsProportional(eventData, target),\n        forbidScaling = scalingIsForbidden(target, by, scaleProportionally),\n        signX, signY, gestureScale = transform.gestureScale;\n\n    if (forbidScaling) {\n      return false;\n    }\n    if (gestureScale) {\n      scaleX = transform.scaleX * gestureScale;\n      scaleY = transform.scaleY * gestureScale;\n    }\n    else {\n      newPoint = getLocalPoint(transform, transform.originX, transform.originY, x, y);\n      // use of sign: We use sign to detect change of direction of an action. sign usually change when\n      // we cross the origin point with the mouse. So a scale flip for example. There is an issue when scaling\n      // by center and scaling using one middle control ( default: mr, mt, ml, mb), the mouse movement can easily\n      // cross many time the origin point and flip the object. so we need a way to filter out the noise.\n      // This ternary here should be ok to filter out X scaling when we want Y only and vice versa.\n      signX = by !== 'y' ? sign(newPoint.x) : 1;\n      signY = by !== 'x' ? sign(newPoint.y) : 1;\n      if (!transform.signX) {\n        transform.signX = signX;\n      }\n      if (!transform.signY) {\n        transform.signY = signY;\n      }\n\n      if (target.lockScalingFlip &&\n        (transform.signX !== signX || transform.signY !== signY)\n      ) {\n        return false;\n      }\n\n      dim = target._getTransformedDimensions();\n      // missing detection of flip and logic to switch the origin\n      if (scaleProportionally && !by) {\n        // uniform scaling\n        var distance = Math.abs(newPoint.x) + Math.abs(newPoint.y),\n            original = transform.original,\n            originalDistance = Math.abs(dim.x * original.scaleX / target.scaleX) +\n              Math.abs(dim.y * original.scaleY / target.scaleY),\n            scale = distance / originalDistance;\n        scaleX = original.scaleX * scale;\n        scaleY = original.scaleY * scale;\n      }\n      else {\n        scaleX = Math.abs(newPoint.x * target.scaleX / dim.x);\n        scaleY = Math.abs(newPoint.y * target.scaleY / dim.y);\n      }\n      // if we are scaling by center, we need to double the scale\n      if (isTransformCentered(transform)) {\n        scaleX *= 2;\n        scaleY *= 2;\n      }\n      if (transform.signX !== signX && by !== 'y') {\n        transform.originX = opposite[transform.originX];\n        scaleX *= -1;\n        transform.signX = signX;\n      }\n      if (transform.signY !== signY && by !== 'x') {\n        transform.originY = opposite[transform.originY];\n        scaleY *= -1;\n        transform.signY = signY;\n      }\n    }\n    // minScale is taken are in the setter.\n    var oldScaleX = target.scaleX, oldScaleY = target.scaleY;\n    if (!by) {\n      !lockScalingX && target.set('scaleX', scaleX);\n      !lockScalingY && target.set('scaleY', scaleY);\n    }\n    else {\n      // forbidden cases already handled on top here.\n      by === 'x' && target.set('scaleX', scaleX);\n      by === 'y' && target.set('scaleY', scaleY);\n    }\n    return oldScaleX !== target.scaleX || oldScaleY !== target.scaleY;\n  }\n\n  /**\n   * Generic scaling logic, to scale from corners either equally or freely.\n   * Needs to be wrapped with `wrapWithFixedAnchor` to be effective\n   * @param {Event} eventData javascript event that is doing the transform\n   * @param {Object} transform javascript object containing a series of information around the current transform\n   * @param {number} x current mouse x position, canvas normalized\n   * @param {number} y current mouse y position, canvas normalized\n   * @return {Boolean} true if some change happened\n   */\n  function scaleObjectFromCorner(eventData, transform, x, y) {\n    return scaleObject(eventData, transform, x, y);\n  }\n\n  /**\n   * Scaling logic for the X axis.\n   * Needs to be wrapped with `wrapWithFixedAnchor` to be effective\n   * @param {Event} eventData javascript event that is doing the transform\n   * @param {Object} transform javascript object containing a series of information around the current transform\n   * @param {number} x current mouse x position, canvas normalized\n   * @param {number} y current mouse y position, canvas normalized\n   * @return {Boolean} true if some change happened\n   */\n  function scaleObjectX(eventData, transform, x, y) {\n    return scaleObject(eventData, transform, x, y , { by: 'x' });\n  }\n\n  /**\n   * Scaling logic for the Y axis.\n   * Needs to be wrapped with `wrapWithFixedAnchor` to be effective\n   * @param {Event} eventData javascript event that is doing the transform\n   * @param {Object} transform javascript object containing a series of information around the current transform\n   * @param {number} x current mouse x position, canvas normalized\n   * @param {number} y current mouse y position, canvas normalized\n   * @return {Boolean} true if some change happened\n   */\n  function scaleObjectY(eventData, transform, x, y) {\n    return scaleObject(eventData, transform, x, y , { by: 'y' });\n  }\n\n  /**\n   * Composed action handler to either scale Y or skew X\n   * Needs to be wrapped with `wrapWithFixedAnchor` to be effective\n   * @param {Event} eventData javascript event that is doing the transform\n   * @param {Object} transform javascript object containing a series of information around the current transform\n   * @param {number} x current mouse x position, canvas normalized\n   * @param {number} y current mouse y position, canvas normalized\n   * @return {Boolean} true if some change happened\n   */\n  function scalingYOrSkewingX(eventData, transform, x, y) {\n    // ok some safety needed here.\n    if (eventData[transform.target.canvas.altActionKey]) {\n      return controls.skewHandlerX(eventData, transform, x, y);\n    }\n    return controls.scalingY(eventData, transform, x, y);\n  }\n\n  /**\n   * Composed action handler to either scale X or skew Y\n   * Needs to be wrapped with `wrapWithFixedAnchor` to be effective\n   * @param {Event} eventData javascript event that is doing the transform\n   * @param {Object} transform javascript object containing a series of information around the current transform\n   * @param {number} x current mouse x position, canvas normalized\n   * @param {number} y current mouse y position, canvas normalized\n   * @return {Boolean} true if some change happened\n   */\n  function scalingXOrSkewingY(eventData, transform, x, y) {\n    // ok some safety needed here.\n    if (eventData[transform.target.canvas.altActionKey]) {\n      return controls.skewHandlerY(eventData, transform, x, y);\n    }\n    return controls.scalingX(eventData, transform, x, y);\n  }\n\n  /**\n   * Action handler to change textbox width\n   * Needs to be wrapped with `wrapWithFixedAnchor` to be effective\n   * @param {Event} eventData javascript event that is doing the transform\n   * @param {Object} transform javascript object containing a series of information around the current transform\n   * @param {number} x current mouse x position, canvas normalized\n   * @param {number} y current mouse y position, canvas normalized\n   * @return {Boolean} true if some change happened\n   */\n  function changeWidth(eventData, transform, x, y) {\n    var target = transform.target, localPoint = getLocalPoint(transform, transform.originX, transform.originY, x, y),\n        strokePadding = target.strokeWidth / (target.strokeUniform ? target.scaleX : 1),\n        multiplier = isTransformCentered(transform) ? 2 : 1,\n        oldWidth = target.width,\n        newWidth = Math.abs(localPoint.x * multiplier / target.scaleX) - strokePadding;\n    target.set('width', Math.max(newWidth, 0));\n    return oldWidth !== newWidth;\n  }\n\n  /**\n   * Action handler\n   * @private\n   * @param {Event} eventData javascript event that is doing the transform\n   * @param {Object} transform javascript object containing a series of information around the current transform\n   * @param {number} x current mouse x position, canvas normalized\n   * @param {number} y current mouse y position, canvas normalized\n   * @return {Boolean} true if the translation occurred\n   */\n  function dragHandler(eventData, transform, x, y) {\n    var target = transform.target,\n        newLeft = x - transform.offsetX,\n        newTop = y - transform.offsetY,\n        moveX = !target.get('lockMovementX') && target.left !== newLeft,\n        moveY = !target.get('lockMovementY') && target.top !== newTop;\n    moveX && target.set('left', newLeft);\n    moveY && target.set('top', newTop);\n    if (moveX || moveY) {\n      fireEvent('moving', commonEventInfo(eventData, transform, x, y));\n    }\n    return moveX || moveY;\n  }\n\n  controls.scaleCursorStyleHandler = scaleCursorStyleHandler;\n  controls.skewCursorStyleHandler = skewCursorStyleHandler;\n  controls.scaleSkewCursorStyleHandler = scaleSkewCursorStyleHandler;\n  controls.rotationWithSnapping = wrapWithFireEvent('rotating', wrapWithFixedAnchor(rotationWithSnapping));\n  controls.scalingEqually = wrapWithFireEvent('scaling', wrapWithFixedAnchor( scaleObjectFromCorner));\n  controls.scalingX = wrapWithFireEvent('scaling', wrapWithFixedAnchor(scaleObjectX));\n  controls.scalingY = wrapWithFireEvent('scaling', wrapWithFixedAnchor(scaleObjectY));\n  controls.scalingYOrSkewingX = scalingYOrSkewingX;\n  controls.scalingXOrSkewingY = scalingXOrSkewingY;\n  controls.changeWidth = wrapWithFireEvent('resizing', wrapWithFixedAnchor(changeWidth));\n  controls.skewHandlerX = skewHandlerX;\n  controls.skewHandlerY = skewHandlerY;\n  controls.dragHandler = dragHandler;\n  controls.scaleOrSkewActionName = scaleOrSkewActionName;\n  controls.rotationStyleHandler = rotationStyleHandler;\n  controls.fireEvent = fireEvent;\n  controls.wrapWithFixedAnchor = wrapWithFixedAnchor;\n  controls.wrapWithFireEvent = wrapWithFireEvent;\n  controls.getLocalPoint = getLocalPoint;\n  fabric.controlsUtils = controls;\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n  'use strict';\n\n  var fabric = global.fabric || (global.fabric = { }),\n      degreesToRadians = fabric.util.degreesToRadians,\n      controls = fabric.controlsUtils;\n\n  /**\n   * Render a round control, as per fabric features.\n   * This function is written to respect object properties like transparentCorners, cornerSize\n   * cornerColor, cornerStrokeColor\n   * plus the addition of offsetY and offsetX.\n   * @param {CanvasRenderingContext2D} ctx context to render on\n   * @param {Number} left x coordinate where the control center should be\n   * @param {Number} top y coordinate where the control center should be\n   * @param {Object} styleOverride override for fabric.Object controls style\n   * @param {fabric.Object} fabricObject the fabric object for which we are rendering controls\n   */\n  function renderCircleControl (ctx, left, top, styleOverride, fabricObject) {\n    styleOverride = styleOverride || {};\n    var xSize = this.sizeX || styleOverride.cornerSize || fabricObject.cornerSize,\n        ySize = this.sizeY || styleOverride.cornerSize || fabricObject.cornerSize,\n        transparentCorners = typeof styleOverride.transparentCorners !== 'undefined' ?\n          styleOverride.transparentCorners : fabricObject.transparentCorners,\n        methodName = transparentCorners ? 'stroke' : 'fill',\n        stroke = !transparentCorners && (styleOverride.cornerStrokeColor || fabricObject.cornerStrokeColor),\n        myLeft = left,\n        myTop = top, size;\n    ctx.save();\n    ctx.fillStyle = styleOverride.cornerColor || fabricObject.cornerColor;\n    ctx.strokeStyle = styleOverride.cornerStrokeColor || fabricObject.cornerStrokeColor;\n    // as soon as fabric react v5, remove ie11, use proper ellipse code.\n    if (xSize > ySize) {\n      size = xSize;\n      ctx.scale(1.0, ySize / xSize);\n      myTop = top * xSize / ySize;\n    }\n    else if (ySize > xSize) {\n      size = ySize;\n      ctx.scale(xSize / ySize, 1.0);\n      myLeft = left * ySize / xSize;\n    }\n    else {\n      size = xSize;\n    }\n    // this is still wrong\n    ctx.lineWidth = 1;\n    ctx.beginPath();\n    ctx.arc(myLeft, myTop, size / 2, 0, 2 * Math.PI, false);\n    ctx[methodName]();\n    if (stroke) {\n      ctx.stroke();\n    }\n    ctx.restore();\n  }\n\n  /**\n   * Render a square control, as per fabric features.\n   * This function is written to respect object properties like transparentCorners, cornerSize\n   * cornerColor, cornerStrokeColor\n   * plus the addition of offsetY and offsetX.\n   * @param {CanvasRenderingContext2D} ctx context to render on\n   * @param {Number} left x coordinate where the control center should be\n   * @param {Number} top y coordinate where the control center should be\n   * @param {Object} styleOverride override for fabric.Object controls style\n   * @param {fabric.Object} fabricObject the fabric object for which we are rendering controls\n   */\n  function renderSquareControl(ctx, left, top, styleOverride, fabricObject) {\n    styleOverride = styleOverride || {};\n    var xSize = this.sizeX || styleOverride.cornerSize || fabricObject.cornerSize,\n        ySize = this.sizeY || styleOverride.cornerSize || fabricObject.cornerSize,\n        transparentCorners = typeof styleOverride.transparentCorners !== 'undefined' ?\n          styleOverride.transparentCorners : fabricObject.transparentCorners,\n        methodName = transparentCorners ? 'stroke' : 'fill',\n        stroke = !transparentCorners && (\n          styleOverride.cornerStrokeColor || fabricObject.cornerStrokeColor\n        ), xSizeBy2 = xSize / 2, ySizeBy2 = ySize / 2;\n    ctx.save();\n    ctx.fillStyle = styleOverride.cornerColor || fabricObject.cornerColor;\n    ctx.strokeStyle = styleOverride.cornerStrokeColor || fabricObject.cornerStrokeColor;\n    // this is still wrong\n    ctx.lineWidth = 1;\n    ctx.translate(left, top);\n    ctx.rotate(degreesToRadians(fabricObject.angle));\n    // this does not work, and fixed with ( && ) does not make sense.\n    // to have real transparent corners we need the controls on upperCanvas\n    // transparentCorners || ctx.clearRect(-xSizeBy2, -ySizeBy2, xSize, ySize);\n    ctx[methodName + 'Rect'](-xSizeBy2, -ySizeBy2, xSize, ySize);\n    if (stroke) {\n      ctx.strokeRect(-xSizeBy2, -ySizeBy2, xSize, ySize);\n    }\n    ctx.restore();\n  }\n\n  controls.renderCircleControl = renderCircleControl;\n  controls.renderSquareControl = renderSquareControl;\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n  'use strict';\n\n  var fabric = global.fabric || (global.fabric = { });\n\n  function Control(options) {\n    for (var i in options) {\n      this[i] = options[i];\n    }\n  }\n\n  fabric.Control = Control;\n\n  fabric.Control.prototype = /** @lends fabric.Control.prototype */ {\n\n    /**\n     * keep track of control visibility.\n     * mainly for backward compatibility.\n     * if you do not want to see a control, you can remove it\n     * from the controlset.\n     * @type {Boolean}\n     * @default true\n     */\n    visible: true,\n\n    /**\n     * Name of the action that the control will likely execute.\n     * This is optional. FabricJS uses to identify what the user is doing for some\n     * extra optimizations. If you are writing a custom control and you want to know\n     * somewhere else in the code what is going on, you can use this string here.\n     * you can also provide a custom getActionName if your control run multiple actions\n     * depending on some external state.\n     * default to scale since is the most common, used on 4 corners by default\n     * @type {String}\n     * @default 'scale'\n     */\n    actionName: 'scale',\n\n    /**\n     * Drawing angle of the control.\n     * NOT used for now, but name marked as needed for internal logic\n     * example: to reuse the same drawing function for different rotated controls\n     * @type {Number}\n     * @default 0\n     */\n    angle: 0,\n\n    /**\n     * Relative position of the control. X\n     * 0,0 is the center of the Object, while -0.5 (left) or 0.5 (right) are the extremities\n     * of the bounding box.\n     * @type {Number}\n     * @default 0\n     */\n    x: 0,\n\n    /**\n     * Relative position of the control. Y\n     * 0,0 is the center of the Object, while -0.5 (top) or 0.5 (bottom) are the extremities\n     * of the bounding box.\n     * @type {Number}\n     * @default 0\n     */\n    y: 0,\n\n    /**\n     * Horizontal offset of the control from the defined position. In pixels\n     * Positive offset moves the control to the right, negative to the left.\n     * It used when you want to have position of control that does not scale with\n     * the bounding box. Example: rotation control is placed at x:0, y: 0.5 on\n     * the boundindbox, with an offset of 30 pixels vertically. Those 30 pixels will\n     * stay 30 pixels no matter how the object is big. Another example is having 2\n     * controls in the corner, that stay in the same position when the object scale.\n     * of the bounding box.\n     * @type {Number}\n     * @default 0\n     */\n    offsetX: 0,\n\n    /**\n     * Vertical offset of the control from the defined position. In pixels\n     * Positive offset moves the control to the bottom, negative to the top.\n     * @type {Number}\n     * @default 0\n     */\n    offsetY: 0,\n\n    /**\n     * Sets the length of the control. If null, defaults to object's cornerSize.\n     * Expects both sizeX and sizeY to be set when set.\n     * @type {?Number}\n     * @default null\n     */\n    sizeX: null,\n\n    /**\n     * Sets the height of the control. If null, defaults to object's cornerSize.\n     * Expects both sizeX and sizeY to be set when set.\n     * @type {?Number}\n     * @default null\n     */\n    sizeY: null,\n\n    /**\n     * Sets the length of the touch area of the control. If null, defaults to object's touchCornerSize.\n     * Expects both touchSizeX and touchSizeY to be set when set.\n     * @type {?Number}\n     * @default null\n     */\n    touchSizeX: null,\n\n    /**\n     * Sets the height of the touch area of the control. If null, defaults to object's touchCornerSize.\n     * Expects both touchSizeX and touchSizeY to be set when set.\n     * @type {?Number}\n     * @default null\n     */\n    touchSizeY: null,\n\n    /**\n     * Css cursor style to display when the control is hovered.\n     * if the method `cursorStyleHandler` is provided, this property is ignored.\n     * @type {String}\n     * @default 'crosshair'\n     */\n    cursorStyle: 'crosshair',\n\n    /**\n     * If controls has an offsetY or offsetX, draw a line that connects\n     * the control to the bounding box\n     * @type {Boolean}\n     * @default false\n     */\n    withConnection: false,\n\n    /**\n     * The control actionHandler, provide one to handle action ( control being moved )\n     * @param {Event} eventData the native mouse event\n     * @param {Object} transformData properties of the current transform\n     * @param {Number} x x position of the cursor\n     * @param {Number} y y position of the cursor\n     * @return {Boolean} true if the action/event modified the object\n     */\n    actionHandler: function(/* eventData, transformData, x, y */) { },\n\n    /**\n     * The control handler for mouse down, provide one to handle mouse down on control\n     * @param {Event} eventData the native mouse event\n     * @param {Object} transformData properties of the current transform\n     * @param {Number} x x position of the cursor\n     * @param {Number} y y position of the cursor\n     * @return {Boolean} true if the action/event modified the object\n     */\n    mouseDownHandler: function(/* eventData, transformData, x, y */) { },\n\n    /**\n     * The control mouseUpHandler, provide one to handle an effect on mouse up.\n     * @param {Event} eventData the native mouse event\n     * @param {Object} transformData properties of the current transform\n     * @param {Number} x x position of the cursor\n     * @param {Number} y y position of the cursor\n     * @return {Boolean} true if the action/event modified the object\n     */\n    mouseUpHandler: function(/* eventData, transformData, x, y */) { },\n\n    /**\n     * Returns control actionHandler\n     * @param {Event} eventData the native mouse event\n     * @param {fabric.Object} fabricObject on which the control is displayed\n     * @param {fabric.Control} control control for which the action handler is being asked\n     * @return {Function} the action handler\n     */\n    getActionHandler: function(/* eventData, fabricObject, control */) {\n      return this.actionHandler;\n    },\n\n    /**\n     * Returns control mouseDown handler\n     * @param {Event} eventData the native mouse event\n     * @param {fabric.Object} fabricObject on which the control is displayed\n     * @param {fabric.Control} control control for which the action handler is being asked\n     * @return {Function} the action handler\n     */\n    getMouseDownHandler: function(/* eventData, fabricObject, control */) {\n      return this.mouseDownHandler;\n    },\n\n    /**\n     * Returns control mouseUp handler\n     * @param {Event} eventData the native mouse event\n     * @param {fabric.Object} fabricObject on which the control is displayed\n     * @param {fabric.Control} control control for which the action handler is being asked\n     * @return {Function} the action handler\n     */\n    getMouseUpHandler: function(/* eventData, fabricObject, control */) {\n      return this.mouseUpHandler;\n    },\n\n    /**\n     * Returns control cursorStyle for css using cursorStyle. If you need a more elaborate\n     * function you can pass one in the constructor\n     * the cursorStyle property\n     * @param {Event} eventData the native mouse event\n     * @param {fabric.Control} control the current control ( likely this)\n     * @param {fabric.Object} object on which the control is displayed\n     * @return {String}\n     */\n    cursorStyleHandler: function(eventData, control /* fabricObject */) {\n      return control.cursorStyle;\n    },\n\n    /**\n     * Returns the action name. The basic implementation just return the actionName property.\n     * @param {Event} eventData the native mouse event\n     * @param {fabric.Control} control the current control ( likely this)\n     * @param {fabric.Object} object on which the control is displayed\n     * @return {String}\n     */\n    getActionName: function(eventData, control /* fabricObject */) {\n      return control.actionName;\n    },\n\n    /**\n     * Returns controls visibility\n     * @param {fabric.Object} object on which the control is displayed\n     * @param {String} controlKey key where the control is memorized on the\n     * @return {Boolean}\n     */\n    getVisibility: function(fabricObject, controlKey) {\n      var objectVisibility = fabricObject._controlsVisibility;\n      if (objectVisibility && typeof objectVisibility[controlKey] !== 'undefined') {\n        return objectVisibility[controlKey];\n      }\n      return this.visible;\n    },\n\n    /**\n     * Sets controls visibility\n     * @param {Boolean} visibility for the object\n     * @return {Void}\n     */\n    setVisibility: function(visibility /* name, fabricObject */) {\n      this.visible = visibility;\n    },\n\n\n    positionHandler: function(dim, finalMatrix /*, fabricObject, currentControl */) {\n      var point = fabric.util.transformPoint({\n        x: this.x * dim.x + this.offsetX,\n        y: this.y * dim.y + this.offsetY }, finalMatrix);\n      return point;\n    },\n\n    /**\n     * Returns the coords for this control based on object values.\n     * @param {Number} objectAngle angle from the fabric object holding the control\n     * @param {Number} objectCornerSize cornerSize from the fabric object holding the control (or touchCornerSize if\n     *   isTouch is true)\n     * @param {Number} centerX x coordinate where the control center should be\n     * @param {Number} centerY y coordinate where the control center should be\n     * @param {boolean} isTouch true if touch corner, false if normal corner\n     */\n    calcCornerCoords: function(objectAngle, objectCornerSize, centerX, centerY, isTouch) {\n      var cosHalfOffset,\n          sinHalfOffset,\n          cosHalfOffsetComp,\n          sinHalfOffsetComp,\n          xSize = (isTouch) ? this.touchSizeX : this.sizeX,\n          ySize = (isTouch) ? this.touchSizeY : this.sizeY;\n      if (xSize && ySize && xSize !== ySize) {\n        // handle rectangular corners\n        var controlTriangleAngle = Math.atan2(ySize, xSize);\n        var cornerHypotenuse = Math.sqrt(xSize * xSize + ySize * ySize) / 2;\n        var newTheta = controlTriangleAngle - fabric.util.degreesToRadians(objectAngle);\n        var newThetaComp = Math.PI / 2 - controlTriangleAngle - fabric.util.degreesToRadians(objectAngle);\n        cosHalfOffset = cornerHypotenuse * fabric.util.cos(newTheta);\n        sinHalfOffset = cornerHypotenuse * fabric.util.sin(newTheta);\n        // use complementary angle for two corners\n        cosHalfOffsetComp = cornerHypotenuse * fabric.util.cos(newThetaComp);\n        sinHalfOffsetComp = cornerHypotenuse * fabric.util.sin(newThetaComp);\n      }\n      else {\n        // handle square corners\n        // use default object corner size unless size is defined\n        var cornerSize = (xSize && ySize) ? xSize : objectCornerSize;\n        /* 0.7071067812 stands for sqrt(2)/2 */\n        cornerHypotenuse = cornerSize * 0.7071067812;\n        // complementary angles are equal since they're both 45 degrees\n        var newTheta = fabric.util.degreesToRadians(45 - objectAngle);\n        cosHalfOffset = cosHalfOffsetComp = cornerHypotenuse * fabric.util.cos(newTheta);\n        sinHalfOffset = sinHalfOffsetComp = cornerHypotenuse * fabric.util.sin(newTheta);\n      }\n\n      return {\n        tl: {\n          x: centerX - sinHalfOffsetComp,\n          y: centerY - cosHalfOffsetComp,\n        },\n        tr: {\n          x: centerX + cosHalfOffset,\n          y: centerY - sinHalfOffset,\n        },\n        bl: {\n          x: centerX - cosHalfOffset,\n          y: centerY + sinHalfOffset,\n        },\n        br: {\n          x: centerX + sinHalfOffsetComp,\n          y: centerY + cosHalfOffsetComp,\n        },\n      };\n    },\n\n    /**\n    * Render function for the control.\n    * When this function runs the context is unscaled. unrotate. Just retina scaled.\n    * all the functions will have to translate to the point left,top before starting Drawing\n    * if they want to draw a control where the position is detected.\n    * left and top are the result of the positionHandler function\n    * @param {RenderingContext2D} ctx the context where the control will be drawn\n    * @param {Number} left position of the canvas where we are about to render the control.\n    * @param {Number} top position of the canvas where we are about to render the control.\n    * @param {Object} styleOverride\n    * @param {fabric.Object} fabricObject the object where the control is about to be rendered\n    */\n    render: function(ctx, left, top, styleOverride, fabricObject) {\n      styleOverride = styleOverride || {};\n      switch (styleOverride.cornerStyle || fabricObject.cornerStyle) {\n        case 'circle':\n          fabric.controlsUtils.renderCircleControl.call(this, ctx, left, top, styleOverride, fabricObject);\n          break;\n        default:\n          fabric.controlsUtils.renderSquareControl.call(this, ctx, left, top, styleOverride, fabricObject);\n      }\n    },\n  };\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function() {\n\n  /* _FROM_SVG_START_ */\n  function getColorStop(el, multiplier) {\n    var style = el.getAttribute('style'),\n        offset = el.getAttribute('offset') || 0,\n        color, colorAlpha, opacity, i;\n\n    // convert percents to absolute values\n    offset = parseFloat(offset) / (/%$/.test(offset) ? 100 : 1);\n    offset = offset < 0 ? 0 : offset > 1 ? 1 : offset;\n    if (style) {\n      var keyValuePairs = style.split(/\\s*;\\s*/);\n\n      if (keyValuePairs[keyValuePairs.length - 1] === '') {\n        keyValuePairs.pop();\n      }\n\n      for (i = keyValuePairs.length; i--; ) {\n\n        var split = keyValuePairs[i].split(/\\s*:\\s*/),\n            key = split[0].trim(),\n            value = split[1].trim();\n\n        if (key === 'stop-color') {\n          color = value;\n        }\n        else if (key === 'stop-opacity') {\n          opacity = value;\n        }\n      }\n    }\n\n    if (!color) {\n      color = el.getAttribute('stop-color') || 'rgb(0,0,0)';\n    }\n    if (!opacity) {\n      opacity = el.getAttribute('stop-opacity');\n    }\n\n    color = new fabric.Color(color);\n    colorAlpha = color.getAlpha();\n    opacity = isNaN(parseFloat(opacity)) ? 1 : parseFloat(opacity);\n    opacity *= colorAlpha * multiplier;\n\n    return {\n      offset: offset,\n      color: color.toRgb(),\n      opacity: opacity\n    };\n  }\n\n  function getLinearCoords(el) {\n    return {\n      x1: el.getAttribute('x1') || 0,\n      y1: el.getAttribute('y1') || 0,\n      x2: el.getAttribute('x2') || '100%',\n      y2: el.getAttribute('y2') || 0\n    };\n  }\n\n  function getRadialCoords(el) {\n    return {\n      x1: el.getAttribute('fx') || el.getAttribute('cx') || '50%',\n      y1: el.getAttribute('fy') || el.getAttribute('cy') || '50%',\n      r1: 0,\n      x2: el.getAttribute('cx') || '50%',\n      y2: el.getAttribute('cy') || '50%',\n      r2: el.getAttribute('r') || '50%'\n    };\n  }\n  /* _FROM_SVG_END_ */\n\n  var clone = fabric.util.object.clone;\n\n  /**\n   * Gradient class\n   * @class fabric.Gradient\n   * @tutorial {@link http://fabricjs.com/fabric-intro-part-2#gradients}\n   * @see {@link fabric.Gradient#initialize} for constructor definition\n   */\n  fabric.Gradient = fabric.util.createClass(/** @lends fabric.Gradient.prototype */ {\n\n    /**\n     * Horizontal offset for aligning gradients coming from SVG when outside pathgroups\n     * @type Number\n     * @default 0\n     */\n    offsetX: 0,\n\n    /**\n     * Vertical offset for aligning gradients coming from SVG when outside pathgroups\n     * @type Number\n     * @default 0\n     */\n    offsetY: 0,\n\n    /**\n     * A transform matrix to apply to the gradient before painting.\n     * Imported from svg gradients, is not applied with the current transform in the center.\n     * Before this transform is applied, the origin point is at the top left corner of the object\n     * plus the addition of offsetY and offsetX.\n     * @type Number[]\n     * @default null\n     */\n    gradientTransform: null,\n\n    /**\n     * coordinates units for coords.\n     * If `pixels`, the number of coords are in the same unit of width / height.\n     * If set as `percentage` the coords are still a number, but 1 means 100% of width\n     * for the X and 100% of the height for the y. It can be bigger than 1 and negative.\n     * allowed values pixels or percentage.\n     * @type String\n     * @default 'pixels'\n     */\n    gradientUnits: 'pixels',\n\n    /**\n     * Gradient type linear or radial\n     * @type String\n     * @default 'pixels'\n     */\n    type: 'linear',\n\n    /**\n     * Constructor\n     * @param {Object} options Options object with type, coords, gradientUnits and colorStops\n     * @param {Object} [options.type] gradient type linear or radial\n     * @param {Object} [options.gradientUnits] gradient units\n     * @param {Object} [options.offsetX] SVG import compatibility\n     * @param {Object} [options.offsetY] SVG import compatibility\n     * @param {Object[]} options.colorStops contains the colorstops.\n     * @param {Object} options.coords contains the coords of the gradient\n     * @param {Number} [options.coords.x1] X coordiante of the first point for linear or of the focal point for radial\n     * @param {Number} [options.coords.y1] Y coordiante of the first point for linear or of the focal point for radial\n     * @param {Number} [options.coords.x2] X coordiante of the second point for linear or of the center point for radial\n     * @param {Number} [options.coords.y2] Y coordiante of the second point for linear or of the center point for radial\n     * @param {Number} [options.coords.r1] only for radial gradient, radius of the inner circle\n     * @param {Number} [options.coords.r2] only for radial gradient, radius of the external circle\n     * @return {fabric.Gradient} thisArg\n     */\n    initialize: function(options) {\n      options || (options = { });\n      options.coords || (options.coords = { });\n\n      var coords, _this = this;\n\n      // sets everything, then coords and colorstops get sets again\n      Object.keys(options).forEach(function(option) {\n        _this[option] = options[option];\n      });\n\n      if (this.id) {\n        this.id += '_' + fabric.Object.__uid++;\n      }\n      else {\n        this.id = fabric.Object.__uid++;\n      }\n\n      coords = {\n        x1: options.coords.x1 || 0,\n        y1: options.coords.y1 || 0,\n        x2: options.coords.x2 || 0,\n        y2: options.coords.y2 || 0\n      };\n\n      if (this.type === 'radial') {\n        coords.r1 = options.coords.r1 || 0;\n        coords.r2 = options.coords.r2 || 0;\n      }\n\n      this.coords = coords;\n      this.colorStops = options.colorStops.slice();\n    },\n\n    /**\n     * Adds another colorStop\n     * @param {Object} colorStop Object with offset and color\n     * @return {fabric.Gradient} thisArg\n     */\n    addColorStop: function(colorStops) {\n      for (var position in colorStops) {\n        var color = new fabric.Color(colorStops[position]);\n        this.colorStops.push({\n          offset: parseFloat(position),\n          color: color.toRgb(),\n          opacity: color.getAlpha()\n        });\n      }\n      return this;\n    },\n\n    /**\n     * Returns object representation of a gradient\n     * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n     * @return {Object}\n     */\n    toObject: function(propertiesToInclude) {\n      var object = {\n        type: this.type,\n        coords: this.coords,\n        colorStops: this.colorStops,\n        offsetX: this.offsetX,\n        offsetY: this.offsetY,\n        gradientUnits: this.gradientUnits,\n        gradientTransform: this.gradientTransform ? this.gradientTransform.concat() : this.gradientTransform\n      };\n      fabric.util.populateWithProperties(this, object, propertiesToInclude);\n\n      return object;\n    },\n\n    /* _TO_SVG_START_ */\n    /**\n     * Returns SVG representation of an gradient\n     * @param {Object} object Object to create a gradient for\n     * @return {String} SVG representation of an gradient (linear/radial)\n     */\n    toSVG: function(object, options) {\n      var coords = clone(this.coords, true), i, len, options = options || {},\n          markup, commonAttributes, colorStops = clone(this.colorStops, true),\n          needsSwap = coords.r1 > coords.r2,\n          transform = this.gradientTransform ? this.gradientTransform.concat() : fabric.iMatrix.concat(),\n          offsetX = -this.offsetX, offsetY = -this.offsetY,\n          withViewport = !!options.additionalTransform,\n          gradientUnits = this.gradientUnits === 'pixels' ? 'userSpaceOnUse' : 'objectBoundingBox';\n      // colorStops must be sorted ascending\n      colorStops.sort(function(a, b) {\n        return a.offset - b.offset;\n      });\n\n      if (gradientUnits === 'objectBoundingBox') {\n        offsetX /= object.width;\n        offsetY /= object.height;\n      }\n      else {\n        offsetX += object.width / 2;\n        offsetY += object.height / 2;\n      }\n      if (object.type === 'path' && this.gradientUnits !== 'percentage') {\n        offsetX -= object.pathOffset.x;\n        offsetY -= object.pathOffset.y;\n      }\n\n\n      transform[4] -= offsetX;\n      transform[5] -= offsetY;\n\n      commonAttributes = 'id=\"SVGID_' + this.id +\n                     '\" gradientUnits=\"' + gradientUnits + '\"';\n      commonAttributes += ' gradientTransform=\"' + (withViewport ?\n        options.additionalTransform + ' ' : '') + fabric.util.matrixToSVG(transform) + '\" ';\n\n      if (this.type === 'linear') {\n        markup = [\n          '<linearGradient ',\n          commonAttributes,\n          ' x1=\"', coords.x1,\n          '\" y1=\"', coords.y1,\n          '\" x2=\"', coords.x2,\n          '\" y2=\"', coords.y2,\n          '\">\\n'\n        ];\n      }\n      else if (this.type === 'radial') {\n        // svg radial gradient has just 1 radius. the biggest.\n        markup = [\n          '<radialGradient ',\n          commonAttributes,\n          ' cx=\"', needsSwap ? coords.x1 : coords.x2,\n          '\" cy=\"', needsSwap ? coords.y1 : coords.y2,\n          '\" r=\"', needsSwap ? coords.r1 : coords.r2,\n          '\" fx=\"', needsSwap ? coords.x2 : coords.x1,\n          '\" fy=\"', needsSwap ? coords.y2 : coords.y1,\n          '\">\\n'\n        ];\n      }\n\n      if (this.type === 'radial') {\n        if (needsSwap) {\n          // svg goes from internal to external radius. if radius are inverted, swap color stops.\n          colorStops = colorStops.concat();\n          colorStops.reverse();\n          for (i = 0, len = colorStops.length; i < len; i++) {\n            colorStops[i].offset = 1 - colorStops[i].offset;\n          }\n        }\n        var minRadius = Math.min(coords.r1, coords.r2);\n        if (minRadius > 0) {\n          // i have to shift all colorStops and add new one in 0.\n          var maxRadius = Math.max(coords.r1, coords.r2),\n              percentageShift = minRadius / maxRadius;\n          for (i = 0, len = colorStops.length; i < len; i++) {\n            colorStops[i].offset += percentageShift * (1 - colorStops[i].offset);\n          }\n        }\n      }\n\n      for (i = 0, len = colorStops.length; i < len; i++) {\n        var colorStop = colorStops[i];\n        markup.push(\n          '<stop ',\n          'offset=\"', (colorStop.offset * 100) + '%',\n          '\" style=\"stop-color:', colorStop.color,\n          (typeof colorStop.opacity !== 'undefined' ? ';stop-opacity: ' + colorStop.opacity : ';'),\n          '\"/>\\n'\n        );\n      }\n\n      markup.push((this.type === 'linear' ? '</linearGradient>\\n' : '</radialGradient>\\n'));\n\n      return markup.join('');\n    },\n    /* _TO_SVG_END_ */\n\n    /**\n     * Returns an instance of CanvasGradient\n     * @param {CanvasRenderingContext2D} ctx Context to render on\n     * @return {CanvasGradient}\n     */\n    toLive: function(ctx) {\n      var gradient, coords = fabric.util.object.clone(this.coords), i, len;\n\n      if (!this.type) {\n        return;\n      }\n\n      if (this.type === 'linear') {\n        gradient = ctx.createLinearGradient(\n          coords.x1, coords.y1, coords.x2, coords.y2);\n      }\n      else if (this.type === 'radial') {\n        gradient = ctx.createRadialGradient(\n          coords.x1, coords.y1, coords.r1, coords.x2, coords.y2, coords.r2);\n      }\n\n      for (i = 0, len = this.colorStops.length; i < len; i++) {\n        var color = this.colorStops[i].color,\n            opacity = this.colorStops[i].opacity,\n            offset = this.colorStops[i].offset;\n\n        if (typeof opacity !== 'undefined') {\n          color = new fabric.Color(color).setAlpha(opacity).toRgba();\n        }\n        gradient.addColorStop(offset, color);\n      }\n\n      return gradient;\n    }\n  });\n\n  fabric.util.object.extend(fabric.Gradient, {\n\n    /* _FROM_SVG_START_ */\n    /**\n     * Returns {@link fabric.Gradient} instance from an SVG element\n     * @static\n     * @memberOf fabric.Gradient\n     * @param {SVGGradientElement} el SVG gradient element\n     * @param {fabric.Object} instance\n     * @param {String} opacityAttr A fill-opacity or stroke-opacity attribute to multiply to each stop's opacity.\n     * @param {Object} svgOptions an object containing the size of the SVG in order to parse correctly gradients\n     * that uses gradientUnits as 'userSpaceOnUse' and percentages.\n     * @param {Object.number} viewBoxWidth width part of the viewBox attribute on svg\n     * @param {Object.number} viewBoxHeight height part of the viewBox attribute on svg\n     * @param {Object.number} width width part of the svg tag if viewBox is not specified\n     * @param {Object.number} height height part of the svg tag if viewBox is not specified\n     * @return {fabric.Gradient} Gradient instance\n     * @see http://www.w3.org/TR/SVG/pservers.html#LinearGradientElement\n     * @see http://www.w3.org/TR/SVG/pservers.html#RadialGradientElement\n     */\n    fromElement: function(el, instance, opacityAttr, svgOptions) {\n      /**\n       *  @example:\n       *\n       *  <linearGradient id=\"linearGrad1\">\n       *    <stop offset=\"0%\" stop-color=\"white\"/>\n       *    <stop offset=\"100%\" stop-color=\"black\"/>\n       *  </linearGradient>\n       *\n       *  OR\n       *\n       *  <linearGradient id=\"linearGrad2\">\n       *    <stop offset=\"0\" style=\"stop-color:rgb(255,255,255)\"/>\n       *    <stop offset=\"1\" style=\"stop-color:rgb(0,0,0)\"/>\n       *  </linearGradient>\n       *\n       *  OR\n       *\n       *  <radialGradient id=\"radialGrad1\">\n       *    <stop offset=\"0%\" stop-color=\"white\" stop-opacity=\"1\" />\n       *    <stop offset=\"50%\" stop-color=\"black\" stop-opacity=\"0.5\" />\n       *    <stop offset=\"100%\" stop-color=\"white\" stop-opacity=\"1\" />\n       *  </radialGradient>\n       *\n       *  OR\n       *\n       *  <radialGradient id=\"radialGrad2\">\n       *    <stop offset=\"0\" stop-color=\"rgb(255,255,255)\" />\n       *    <stop offset=\"0.5\" stop-color=\"rgb(0,0,0)\" />\n       *    <stop offset=\"1\" stop-color=\"rgb(255,255,255)\" />\n       *  </radialGradient>\n       *\n       */\n\n      var multiplier = parseFloat(opacityAttr) / (/%$/.test(opacityAttr) ? 100 : 1);\n      multiplier = multiplier < 0 ? 0 : multiplier > 1 ? 1 : multiplier;\n      if (isNaN(multiplier)) {\n        multiplier = 1;\n      }\n\n      var colorStopEls = el.getElementsByTagName('stop'),\n          type,\n          gradientUnits = el.getAttribute('gradientUnits') === 'userSpaceOnUse' ?\n            'pixels' : 'percentage',\n          gradientTransform = el.getAttribute('gradientTransform') || '',\n          colorStops = [],\n          coords, i, offsetX = 0, offsetY = 0,\n          transformMatrix;\n      if (el.nodeName === 'linearGradient' || el.nodeName === 'LINEARGRADIENT') {\n        type = 'linear';\n        coords = getLinearCoords(el);\n      }\n      else {\n        type = 'radial';\n        coords = getRadialCoords(el);\n      }\n\n      for (i = colorStopEls.length; i--; ) {\n        colorStops.push(getColorStop(colorStopEls[i], multiplier));\n      }\n\n      transformMatrix = fabric.parseTransformAttribute(gradientTransform);\n\n      __convertPercentUnitsToValues(instance, coords, svgOptions, gradientUnits);\n\n      if (gradientUnits === 'pixels') {\n        offsetX = -instance.left;\n        offsetY = -instance.top;\n      }\n\n      var gradient = new fabric.Gradient({\n        id: el.getAttribute('id'),\n        type: type,\n        coords: coords,\n        colorStops: colorStops,\n        gradientUnits: gradientUnits,\n        gradientTransform: transformMatrix,\n        offsetX: offsetX,\n        offsetY: offsetY,\n      });\n\n      return gradient;\n    }\n    /* _FROM_SVG_END_ */\n  });\n\n  /**\n   * @private\n   */\n  function __convertPercentUnitsToValues(instance, options, svgOptions, gradientUnits) {\n    var propValue, finalValue;\n    Object.keys(options).forEach(function(prop) {\n      propValue = options[prop];\n      if (propValue === 'Infinity') {\n        finalValue = 1;\n      }\n      else if (propValue === '-Infinity') {\n        finalValue = 0;\n      }\n      else {\n        finalValue = parseFloat(options[prop], 10);\n        if (typeof propValue === 'string' && /^(\\d+\\.\\d+)%|(\\d+)%$/.test(propValue)) {\n          finalValue *= 0.01;\n          if (gradientUnits === 'pixels') {\n            // then we need to fix those percentages here in svg parsing\n            if (prop === 'x1' || prop === 'x2' || prop === 'r2') {\n              finalValue *= svgOptions.viewBoxWidth || svgOptions.width;\n            }\n            if (prop === 'y1' || prop === 'y2') {\n              finalValue *= svgOptions.viewBoxHeight || svgOptions.height;\n            }\n          }\n        }\n      }\n      options[prop] = finalValue;\n    });\n  }\n})();\n\n\n(function() {\n\n  'use strict';\n\n  var toFixed = fabric.util.toFixed;\n\n  /**\n   * Pattern class\n   * @class fabric.Pattern\n   * @see {@link http://fabricjs.com/patterns|Pattern demo}\n   * @see {@link http://fabricjs.com/dynamic-patterns|DynamicPattern demo}\n   * @see {@link fabric.Pattern#initialize} for constructor definition\n   */\n\n\n  fabric.Pattern = fabric.util.createClass(/** @lends fabric.Pattern.prototype */ {\n\n    /**\n     * Repeat property of a pattern (one of repeat, repeat-x, repeat-y or no-repeat)\n     * @type String\n     * @default\n     */\n    repeat: 'repeat',\n\n    /**\n     * Pattern horizontal offset from object's left/top corner\n     * @type Number\n     * @default\n     */\n    offsetX: 0,\n\n    /**\n     * Pattern vertical offset from object's left/top corner\n     * @type Number\n     * @default\n     */\n    offsetY: 0,\n\n    /**\n     * crossOrigin value (one of \"\", \"anonymous\", \"use-credentials\")\n     * @see https://developer.mozilla.org/en-US/docs/HTML/CORS_settings_attributes\n     * @type String\n     * @default\n     */\n    crossOrigin: '',\n\n    /**\n     * transform matrix to change the pattern, imported from svgs.\n     * @type Array\n     * @default\n     */\n    patternTransform: null,\n\n    /**\n     * Constructor\n     * @param {Object} [options] Options object\n     * @param {Function} [callback] function to invoke after callback init.\n     * @return {fabric.Pattern} thisArg\n     */\n    initialize: function(options, callback) {\n      options || (options = { });\n\n      this.id = fabric.Object.__uid++;\n      this.setOptions(options);\n      if (!options.source || (options.source && typeof options.source !== 'string')) {\n        callback && callback(this);\n        return;\n      }\n      else {\n        // img src string\n        var _this = this;\n        this.source = fabric.util.createImage();\n        fabric.util.loadImage(options.source, function(img, isError) {\n          _this.source = img;\n          callback && callback(_this, isError);\n        }, null, this.crossOrigin);\n      }\n    },\n\n    /**\n     * Returns object representation of a pattern\n     * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n     * @return {Object} Object representation of a pattern instance\n     */\n    toObject: function(propertiesToInclude) {\n      var NUM_FRACTION_DIGITS = fabric.Object.NUM_FRACTION_DIGITS,\n          source, object;\n\n      // <img> element\n      if (typeof this.source.src === 'string') {\n        source = this.source.src;\n      }\n      // <canvas> element\n      else if (typeof this.source === 'object' && this.source.toDataURL) {\n        source = this.source.toDataURL();\n      }\n\n      object = {\n        type: 'pattern',\n        source: source,\n        repeat: this.repeat,\n        crossOrigin: this.crossOrigin,\n        offsetX: toFixed(this.offsetX, NUM_FRACTION_DIGITS),\n        offsetY: toFixed(this.offsetY, NUM_FRACTION_DIGITS),\n        patternTransform: this.patternTransform ? this.patternTransform.concat() : null\n      };\n      fabric.util.populateWithProperties(this, object, propertiesToInclude);\n\n      return object;\n    },\n\n    /* _TO_SVG_START_ */\n    /**\n     * Returns SVG representation of a pattern\n     * @param {fabric.Object} object\n     * @return {String} SVG representation of a pattern\n     */\n    toSVG: function(object) {\n      var patternSource = typeof this.source === 'function' ? this.source() : this.source,\n          patternWidth = patternSource.width / object.width,\n          patternHeight = patternSource.height / object.height,\n          patternOffsetX = this.offsetX / object.width,\n          patternOffsetY = this.offsetY / object.height,\n          patternImgSrc = '';\n      if (this.repeat === 'repeat-x' || this.repeat === 'no-repeat') {\n        patternHeight = 1;\n        if (patternOffsetY) {\n          patternHeight += Math.abs(patternOffsetY);\n        }\n      }\n      if (this.repeat === 'repeat-y' || this.repeat === 'no-repeat') {\n        patternWidth = 1;\n        if (patternOffsetX) {\n          patternWidth += Math.abs(patternOffsetX);\n        }\n\n      }\n      if (patternSource.src) {\n        patternImgSrc = patternSource.src;\n      }\n      else if (patternSource.toDataURL) {\n        patternImgSrc = patternSource.toDataURL();\n      }\n\n      return '<pattern id=\"SVGID_' + this.id +\n                    '\" x=\"' + patternOffsetX +\n                    '\" y=\"' + patternOffsetY +\n                    '\" width=\"' + patternWidth +\n                    '\" height=\"' + patternHeight + '\">\\n' +\n               '<image x=\"0\" y=\"0\"' +\n                      ' width=\"' + patternSource.width +\n                      '\" height=\"' + patternSource.height +\n                      '\" xlink:href=\"' + patternImgSrc +\n               '\"></image>\\n' +\n             '</pattern>\\n';\n    },\n    /* _TO_SVG_END_ */\n\n    setOptions: function(options) {\n      for (var prop in options) {\n        this[prop] = options[prop];\n      }\n    },\n\n    /**\n     * Returns an instance of CanvasPattern\n     * @param {CanvasRenderingContext2D} ctx Context to create pattern\n     * @return {CanvasPattern}\n     */\n    toLive: function(ctx) {\n      var source = this.source;\n      // if the image failed to load, return, and allow rest to continue loading\n      if (!source) {\n        return '';\n      }\n\n      // if an image\n      if (typeof source.src !== 'undefined') {\n        if (!source.complete) {\n          return '';\n        }\n        if (source.naturalWidth === 0 || source.naturalHeight === 0) {\n          return '';\n        }\n      }\n      return ctx.createPattern(source, this.repeat);\n    }\n  });\n})();\n\n\n(function(global) {\n\n  'use strict';\n\n  var fabric = global.fabric || (global.fabric = { }),\n      toFixed = fabric.util.toFixed;\n\n  if (fabric.Shadow) {\n    fabric.warn('fabric.Shadow is already defined.');\n    return;\n  }\n\n  /**\n   * Shadow class\n   * @class fabric.Shadow\n   * @see {@link http://fabricjs.com/shadows|Shadow demo}\n   * @see {@link fabric.Shadow#initialize} for constructor definition\n   */\n  fabric.Shadow = fabric.util.createClass(/** @lends fabric.Shadow.prototype */ {\n\n    /**\n     * Shadow color\n     * @type String\n     * @default\n     */\n    color: 'rgb(0,0,0)',\n\n    /**\n     * Shadow blur\n     * @type Number\n     */\n    blur: 0,\n\n    /**\n     * Shadow horizontal offset\n     * @type Number\n     * @default\n     */\n    offsetX: 0,\n\n    /**\n     * Shadow vertical offset\n     * @type Number\n     * @default\n     */\n    offsetY: 0,\n\n    /**\n     * Whether the shadow should affect stroke operations\n     * @type Boolean\n     * @default\n     */\n    affectStroke: false,\n\n    /**\n     * Indicates whether toObject should include default values\n     * @type Boolean\n     * @default\n     */\n    includeDefaultValues: true,\n\n    /**\n     * When `false`, the shadow will scale with the object.\n     * When `true`, the shadow's offsetX, offsetY, and blur will not be affected by the object's scale.\n     * default to false\n     * @type Boolean\n     * @default\n     */\n    nonScaling: false,\n\n    /**\n     * Constructor\n     * @param {Object|String} [options] Options object with any of color, blur, offsetX, offsetY properties or string (e.g. \"rgba(0,0,0,0.2) 2px 2px 10px\")\n     * @return {fabric.Shadow} thisArg\n     */\n    initialize: function(options) {\n\n      if (typeof options === 'string') {\n        options = this._parseShadow(options);\n      }\n\n      for (var prop in options) {\n        this[prop] = options[prop];\n      }\n\n      this.id = fabric.Object.__uid++;\n    },\n\n    /**\n     * @private\n     * @param {String} shadow Shadow value to parse\n     * @return {Object} Shadow object with color, offsetX, offsetY and blur\n     */\n    _parseShadow: function(shadow) {\n      var shadowStr = shadow.trim(),\n          offsetsAndBlur = fabric.Shadow.reOffsetsAndBlur.exec(shadowStr) || [],\n          color = shadowStr.replace(fabric.Shadow.reOffsetsAndBlur, '') || 'rgb(0,0,0)';\n\n      return {\n        color: color.trim(),\n        offsetX: parseFloat(offsetsAndBlur[1], 10) || 0,\n        offsetY: parseFloat(offsetsAndBlur[2], 10) || 0,\n        blur: parseFloat(offsetsAndBlur[3], 10) || 0\n      };\n    },\n\n    /**\n     * Returns a string representation of an instance\n     * @see http://www.w3.org/TR/css-text-decor-3/#text-shadow\n     * @return {String} Returns CSS3 text-shadow declaration\n     */\n    toString: function() {\n      return [this.offsetX, this.offsetY, this.blur, this.color].join('px ');\n    },\n\n    /* _TO_SVG_START_ */\n    /**\n     * Returns SVG representation of a shadow\n     * @param {fabric.Object} object\n     * @return {String} SVG representation of a shadow\n     */\n    toSVG: function(object) {\n      var fBoxX = 40, fBoxY = 40, NUM_FRACTION_DIGITS = fabric.Object.NUM_FRACTION_DIGITS,\n          offset = fabric.util.rotateVector(\n            { x: this.offsetX, y: this.offsetY },\n            fabric.util.degreesToRadians(-object.angle)),\n          BLUR_BOX = 20, color = new fabric.Color(this.color);\n\n      if (object.width && object.height) {\n        //http://www.w3.org/TR/SVG/filters.html#FilterEffectsRegion\n        // we add some extra space to filter box to contain the blur ( 20 )\n        fBoxX = toFixed((Math.abs(offset.x) + this.blur) / object.width, NUM_FRACTION_DIGITS) * 100 + BLUR_BOX;\n        fBoxY = toFixed((Math.abs(offset.y) + this.blur) / object.height, NUM_FRACTION_DIGITS) * 100 + BLUR_BOX;\n      }\n      if (object.flipX) {\n        offset.x *= -1;\n      }\n      if (object.flipY) {\n        offset.y *= -1;\n      }\n\n      return (\n        '<filter id=\"SVGID_' + this.id + '\" y=\"-' + fBoxY + '%\" height=\"' + (100 + 2 * fBoxY) + '%\" ' +\n          'x=\"-' + fBoxX + '%\" width=\"' + (100 + 2 * fBoxX) + '%\" ' + '>\\n' +\n          '\\t<feGaussianBlur in=\"SourceAlpha\" stdDeviation=\"' +\n            toFixed(this.blur ? this.blur / 2 : 0, NUM_FRACTION_DIGITS) + '\"></feGaussianBlur>\\n' +\n          '\\t<feOffset dx=\"' + toFixed(offset.x, NUM_FRACTION_DIGITS) +\n          '\" dy=\"' + toFixed(offset.y, NUM_FRACTION_DIGITS) + '\" result=\"oBlur\" ></feOffset>\\n' +\n          '\\t<feFlood flood-color=\"' + color.toRgb() + '\" flood-opacity=\"' + color.getAlpha() + '\"/>\\n' +\n          '\\t<feComposite in2=\"oBlur\" operator=\"in\" />\\n' +\n          '\\t<feMerge>\\n' +\n            '\\t\\t<feMergeNode></feMergeNode>\\n' +\n            '\\t\\t<feMergeNode in=\"SourceGraphic\"></feMergeNode>\\n' +\n          '\\t</feMerge>\\n' +\n        '</filter>\\n');\n    },\n    /* _TO_SVG_END_ */\n\n    /**\n     * Returns object representation of a shadow\n     * @return {Object} Object representation of a shadow instance\n     */\n    toObject: function() {\n      if (this.includeDefaultValues) {\n        return {\n          color: this.color,\n          blur: this.blur,\n          offsetX: this.offsetX,\n          offsetY: this.offsetY,\n          affectStroke: this.affectStroke,\n          nonScaling: this.nonScaling\n        };\n      }\n      var obj = { }, proto = fabric.Shadow.prototype;\n\n      ['color', 'blur', 'offsetX', 'offsetY', 'affectStroke', 'nonScaling'].forEach(function(prop) {\n        if (this[prop] !== proto[prop]) {\n          obj[prop] = this[prop];\n        }\n      }, this);\n\n      return obj;\n    }\n  });\n\n  /**\n   * Regex matching shadow offsetX, offsetY and blur (ex: \"2px 2px 10px rgba(0,0,0,0.2)\", \"rgb(0,255,0) 2px 2px\")\n   * @static\n   * @field\n   * @memberOf fabric.Shadow\n   */\n  // eslint-disable-next-line max-len\n  fabric.Shadow.reOffsetsAndBlur = /(?:\\s|^)(-?\\d+(?:\\.\\d*)?(?:px)?(?:\\s?|$))?(-?\\d+(?:\\.\\d*)?(?:px)?(?:\\s?|$))?(\\d+(?:\\.\\d*)?(?:px)?)?(?:\\s?|$)(?:$|\\s)/;\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function () {\n\n  'use strict';\n\n  if (fabric.StaticCanvas) {\n    fabric.warn('fabric.StaticCanvas is already defined.');\n    return;\n  }\n\n  // aliases for faster resolution\n  var extend = fabric.util.object.extend,\n      getElementOffset = fabric.util.getElementOffset,\n      removeFromArray = fabric.util.removeFromArray,\n      toFixed = fabric.util.toFixed,\n      transformPoint = fabric.util.transformPoint,\n      invertTransform = fabric.util.invertTransform,\n      getNodeCanvas = fabric.util.getNodeCanvas,\n      createCanvasElement = fabric.util.createCanvasElement,\n\n      CANVAS_INIT_ERROR = new Error('Could not initialize `canvas` element');\n\n  /**\n   * Static canvas class\n   * @class fabric.StaticCanvas\n   * @mixes fabric.Collection\n   * @mixes fabric.Observable\n   * @see {@link http://fabricjs.com/static_canvas|StaticCanvas demo}\n   * @see {@link fabric.StaticCanvas#initialize} for constructor definition\n   * @fires before:render\n   * @fires after:render\n   * @fires canvas:cleared\n   * @fires object:added\n   * @fires object:removed\n   */\n  fabric.StaticCanvas = fabric.util.createClass(fabric.CommonMethods, /** @lends fabric.StaticCanvas.prototype */ {\n\n    /**\n     * Constructor\n     * @param {HTMLElement | String} el &lt;canvas> element to initialize instance on\n     * @param {Object} [options] Options object\n     * @return {Object} thisArg\n     */\n    initialize: function(el, options) {\n      options || (options = { });\n      this.renderAndResetBound = this.renderAndReset.bind(this);\n      this.requestRenderAllBound = this.requestRenderAll.bind(this);\n      this._initStatic(el, options);\n    },\n\n    /**\n     * Background color of canvas instance.\n     * Should be set via {@link fabric.StaticCanvas#setBackgroundColor}.\n     * @type {(String|fabric.Pattern)}\n     * @default\n     */\n    backgroundColor: '',\n\n    /**\n     * Background image of canvas instance.\n     * since 2.4.0 image caching is active, please when putting an image as background, add to the\n     * canvas property a reference to the canvas it is on. Otherwise the image cannot detect the zoom\n     * vale. As an alternative you can disable image objectCaching\n     * @type fabric.Image\n     * @default\n     */\n    backgroundImage: null,\n\n    /**\n     * Overlay color of canvas instance.\n     * Should be set via {@link fabric.StaticCanvas#setOverlayColor}\n     * @since 1.3.9\n     * @type {(String|fabric.Pattern)}\n     * @default\n     */\n    overlayColor: '',\n\n    /**\n     * Overlay image of canvas instance.\n     * since 2.4.0 image caching is active, please when putting an image as overlay, add to the\n     * canvas property a reference to the canvas it is on. Otherwise the image cannot detect the zoom\n     * vale. As an alternative you can disable image objectCaching\n     * @type fabric.Image\n     * @default\n     */\n    overlayImage: null,\n\n    /**\n     * Indicates whether toObject/toDatalessObject should include default values\n     * if set to false, takes precedence over the object value.\n     * @type Boolean\n     * @default\n     */\n    includeDefaultValues: true,\n\n    /**\n     * Indicates whether objects' state should be saved\n     * @type Boolean\n     * @default\n     */\n    stateful: false,\n\n    /**\n     * Indicates whether {@link fabric.Collection.add}, {@link fabric.Collection.insertAt} and {@link fabric.Collection.remove},\n     * {@link fabric.StaticCanvas.moveTo}, {@link fabric.StaticCanvas.clear} and many more, should also re-render canvas.\n     * Disabling this option will not give a performance boost when adding/removing a lot of objects to/from canvas at once\n     * since the renders are quequed and executed one per frame.\n     * Disabling is suggested anyway and managing the renders of the app manually is not a big effort ( canvas.requestRenderAll() )\n     * Left default to true to do not break documentation and old app, fiddles.\n     * @type Boolean\n     * @default\n     */\n    renderOnAddRemove: true,\n\n    /**\n     * Indicates whether object controls (borders/controls) are rendered above overlay image\n     * @type Boolean\n     * @default\n     */\n    controlsAboveOverlay: false,\n\n    /**\n     * Indicates whether the browser can be scrolled when using a touchscreen and dragging on the canvas\n     * @type Boolean\n     * @default\n     */\n    allowTouchScrolling: false,\n\n    /**\n     * Indicates whether this canvas will use image smoothing, this is on by default in browsers\n     * @type Boolean\n     * @default\n     */\n    imageSmoothingEnabled: true,\n\n    /**\n     * The transformation (in the format of Canvas transform) which focuses the viewport\n     * @type Array\n     * @default\n     */\n    viewportTransform: fabric.iMatrix.concat(),\n\n    /**\n     * if set to false background image is not affected by viewport transform\n     * @since 1.6.3\n     * @type Boolean\n     * @default\n     */\n    backgroundVpt: true,\n\n    /**\n     * if set to false overlya image is not affected by viewport transform\n     * @since 1.6.3\n     * @type Boolean\n     * @default\n     */\n    overlayVpt: true,\n\n    /**\n     * When true, canvas is scaled by devicePixelRatio for better rendering on retina screens\n     * @type Boolean\n     * @default\n     */\n    enableRetinaScaling: true,\n\n    /**\n     * Describe canvas element extension over design\n     * properties are tl,tr,bl,br.\n     * if canvas is not zoomed/panned those points are the four corner of canvas\n     * if canvas is viewportTransformed you those points indicate the extension\n     * of canvas element in plain untrasformed coordinates\n     * The coordinates get updated with @method calcViewportBoundaries.\n     * @memberOf fabric.StaticCanvas.prototype\n     */\n    vptCoords: { },\n\n    /**\n     * Based on vptCoords and object.aCoords, skip rendering of objects that\n     * are not included in current viewport.\n     * May greatly help in applications with crowded canvas and use of zoom/pan\n     * If One of the corner of the bounding box of the object is on the canvas\n     * the objects get rendered.\n     * @memberOf fabric.StaticCanvas.prototype\n     * @type Boolean\n     * @default\n     */\n    skipOffscreen: true,\n\n    /**\n     * a fabricObject that, without stroke define a clipping area with their shape. filled in black\n     * the clipPath object gets used when the canvas has rendered, and the context is placed in the\n     * top left corner of the canvas.\n     * clipPath will clip away controls, if you do not want this to happen use controlsAboveOverlay = true\n     * @type fabric.Object\n     */\n    clipPath: undefined,\n\n    /**\n     * @private\n     * @param {HTMLElement | String} el &lt;canvas> element to initialize instance on\n     * @param {Object} [options] Options object\n     */\n    _initStatic: function(el, options) {\n      var cb = this.requestRenderAllBound;\n      this._objects = [];\n      this._createLowerCanvas(el);\n      this._initOptions(options);\n      // only initialize retina scaling once\n      if (!this.interactive) {\n        this._initRetinaScaling();\n      }\n\n      if (options.overlayImage) {\n        this.setOverlayImage(options.overlayImage, cb);\n      }\n      if (options.backgroundImage) {\n        this.setBackgroundImage(options.backgroundImage, cb);\n      }\n      if (options.backgroundColor) {\n        this.setBackgroundColor(options.backgroundColor, cb);\n      }\n      if (options.overlayColor) {\n        this.setOverlayColor(options.overlayColor, cb);\n      }\n      this.calcOffset();\n    },\n\n    /**\n     * @private\n     */\n    _isRetinaScaling: function() {\n      return (fabric.devicePixelRatio !== 1 && this.enableRetinaScaling);\n    },\n\n    /**\n     * @private\n     * @return {Number} retinaScaling if applied, otherwise 1;\n     */\n    getRetinaScaling: function() {\n      return this._isRetinaScaling() ? fabric.devicePixelRatio : 1;\n    },\n\n    /**\n     * @private\n     */\n    _initRetinaScaling: function() {\n      if (!this._isRetinaScaling()) {\n        return;\n      }\n      var scaleRatio = fabric.devicePixelRatio;\n      this.__initRetinaScaling(scaleRatio, this.lowerCanvasEl, this.contextContainer);\n      if (this.upperCanvasEl) {\n        this.__initRetinaScaling(scaleRatio, this.upperCanvasEl, this.contextTop);\n      }\n    },\n\n    __initRetinaScaling: function(scaleRatio, canvas, context) {\n      canvas.setAttribute('width', this.width * scaleRatio);\n      canvas.setAttribute('height', this.height * scaleRatio);\n      context.scale(scaleRatio, scaleRatio);\n    },\n\n\n    /**\n     * Calculates canvas element offset relative to the document\n     * This method is also attached as \"resize\" event handler of window\n     * @return {fabric.Canvas} instance\n     * @chainable\n     */\n    calcOffset: function () {\n      this._offset = getElementOffset(this.lowerCanvasEl);\n      return this;\n    },\n\n    /**\n     * Sets {@link fabric.StaticCanvas#overlayImage|overlay image} for this canvas\n     * @param {(fabric.Image|String)} image fabric.Image instance or URL of an image to set overlay to\n     * @param {Function} callback callback to invoke when image is loaded and set as an overlay\n     * @param {Object} [options] Optional options to set for the {@link fabric.Image|overlay image}.\n     * @return {fabric.Canvas} thisArg\n     * @chainable\n     * @see {@link http://jsfiddle.net/fabricjs/MnzHT/|jsFiddle demo}\n     * @example <caption>Normal overlayImage with left/top = 0</caption>\n     * canvas.setOverlayImage('http://fabricjs.com/assets/jail_cell_bars.png', canvas.renderAll.bind(canvas), {\n     *   // Needed to position overlayImage at 0/0\n     *   originX: 'left',\n     *   originY: 'top'\n     * });\n     * @example <caption>overlayImage with different properties</caption>\n     * canvas.setOverlayImage('http://fabricjs.com/assets/jail_cell_bars.png', canvas.renderAll.bind(canvas), {\n     *   opacity: 0.5,\n     *   angle: 45,\n     *   left: 400,\n     *   top: 400,\n     *   originX: 'left',\n     *   originY: 'top'\n     * });\n     * @example <caption>Stretched overlayImage #1 - width/height correspond to canvas width/height</caption>\n     * fabric.Image.fromURL('http://fabricjs.com/assets/jail_cell_bars.png', function(img, isError) {\n     *    img.set({width: canvas.width, height: canvas.height, originX: 'left', originY: 'top'});\n     *    canvas.setOverlayImage(img, canvas.renderAll.bind(canvas));\n     * });\n     * @example <caption>Stretched overlayImage #2 - width/height correspond to canvas width/height</caption>\n     * canvas.setOverlayImage('http://fabricjs.com/assets/jail_cell_bars.png', canvas.renderAll.bind(canvas), {\n     *   width: canvas.width,\n     *   height: canvas.height,\n     *   // Needed to position overlayImage at 0/0\n     *   originX: 'left',\n     *   originY: 'top'\n     * });\n     * @example <caption>overlayImage loaded from cross-origin</caption>\n     * canvas.setOverlayImage('http://fabricjs.com/assets/jail_cell_bars.png', canvas.renderAll.bind(canvas), {\n     *   opacity: 0.5,\n     *   angle: 45,\n     *   left: 400,\n     *   top: 400,\n     *   originX: 'left',\n     *   originY: 'top',\n     *   crossOrigin: 'anonymous'\n     * });\n     */\n    setOverlayImage: function (image, callback, options) {\n      return this.__setBgOverlayImage('overlayImage', image, callback, options);\n    },\n\n    /**\n     * Sets {@link fabric.StaticCanvas#backgroundImage|background image} for this canvas\n     * @param {(fabric.Image|String)} image fabric.Image instance or URL of an image to set background to\n     * @param {Function} callback Callback to invoke when image is loaded and set as background\n     * @param {Object} [options] Optional options to set for the {@link fabric.Image|background image}.\n     * @return {fabric.Canvas} thisArg\n     * @chainable\n     * @see {@link http://jsfiddle.net/djnr8o7a/28/|jsFiddle demo}\n     * @example <caption>Normal backgroundImage with left/top = 0</caption>\n     * canvas.setBackgroundImage('http://fabricjs.com/assets/honey_im_subtle.png', canvas.renderAll.bind(canvas), {\n     *   // Needed to position backgroundImage at 0/0\n     *   originX: 'left',\n     *   originY: 'top'\n     * });\n     * @example <caption>backgroundImage with different properties</caption>\n     * canvas.setBackgroundImage('http://fabricjs.com/assets/honey_im_subtle.png', canvas.renderAll.bind(canvas), {\n     *   opacity: 0.5,\n     *   angle: 45,\n     *   left: 400,\n     *   top: 400,\n     *   originX: 'left',\n     *   originY: 'top'\n     * });\n     * @example <caption>Stretched backgroundImage #1 - width/height correspond to canvas width/height</caption>\n     * fabric.Image.fromURL('http://fabricjs.com/assets/honey_im_subtle.png', function(img, isError) {\n     *    img.set({width: canvas.width, height: canvas.height, originX: 'left', originY: 'top'});\n     *    canvas.setBackgroundImage(img, canvas.renderAll.bind(canvas));\n     * });\n     * @example <caption>Stretched backgroundImage #2 - width/height correspond to canvas width/height</caption>\n     * canvas.setBackgroundImage('http://fabricjs.com/assets/honey_im_subtle.png', canvas.renderAll.bind(canvas), {\n     *   width: canvas.width,\n     *   height: canvas.height,\n     *   // Needed to position backgroundImage at 0/0\n     *   originX: 'left',\n     *   originY: 'top'\n     * });\n     * @example <caption>backgroundImage loaded from cross-origin</caption>\n     * canvas.setBackgroundImage('http://fabricjs.com/assets/honey_im_subtle.png', canvas.renderAll.bind(canvas), {\n     *   opacity: 0.5,\n     *   angle: 45,\n     *   left: 400,\n     *   top: 400,\n     *   originX: 'left',\n     *   originY: 'top',\n     *   crossOrigin: 'anonymous'\n     * });\n     */\n    // TODO: fix stretched examples\n    setBackgroundImage: function (image, callback, options) {\n      return this.__setBgOverlayImage('backgroundImage', image, callback, options);\n    },\n\n    /**\n     * Sets {@link fabric.StaticCanvas#overlayColor|foreground color} for this canvas\n     * @param {(String|fabric.Pattern)} overlayColor Color or pattern to set foreground color to\n     * @param {Function} callback Callback to invoke when foreground color is set\n     * @return {fabric.Canvas} thisArg\n     * @chainable\n     * @see {@link http://jsfiddle.net/fabricjs/pB55h/|jsFiddle demo}\n     * @example <caption>Normal overlayColor - color value</caption>\n     * canvas.setOverlayColor('rgba(255, 73, 64, 0.6)', canvas.renderAll.bind(canvas));\n     * @example <caption>fabric.Pattern used as overlayColor</caption>\n     * canvas.setOverlayColor({\n     *   source: 'http://fabricjs.com/assets/escheresque_ste.png'\n     * }, canvas.renderAll.bind(canvas));\n     * @example <caption>fabric.Pattern used as overlayColor with repeat and offset</caption>\n     * canvas.setOverlayColor({\n     *   source: 'http://fabricjs.com/assets/escheresque_ste.png',\n     *   repeat: 'repeat',\n     *   offsetX: 200,\n     *   offsetY: 100\n     * }, canvas.renderAll.bind(canvas));\n     */\n    setOverlayColor: function(overlayColor, callback) {\n      return this.__setBgOverlayColor('overlayColor', overlayColor, callback);\n    },\n\n    /**\n     * Sets {@link fabric.StaticCanvas#backgroundColor|background color} for this canvas\n     * @param {(String|fabric.Pattern)} backgroundColor Color or pattern to set background color to\n     * @param {Function} callback Callback to invoke when background color is set\n     * @return {fabric.Canvas} thisArg\n     * @chainable\n     * @see {@link http://jsfiddle.net/fabricjs/hXzvk/|jsFiddle demo}\n     * @example <caption>Normal backgroundColor - color value</caption>\n     * canvas.setBackgroundColor('rgba(255, 73, 64, 0.6)', canvas.renderAll.bind(canvas));\n     * @example <caption>fabric.Pattern used as backgroundColor</caption>\n     * canvas.setBackgroundColor({\n     *   source: 'http://fabricjs.com/assets/escheresque_ste.png'\n     * }, canvas.renderAll.bind(canvas));\n     * @example <caption>fabric.Pattern used as backgroundColor with repeat and offset</caption>\n     * canvas.setBackgroundColor({\n     *   source: 'http://fabricjs.com/assets/escheresque_ste.png',\n     *   repeat: 'repeat',\n     *   offsetX: 200,\n     *   offsetY: 100\n     * }, canvas.renderAll.bind(canvas));\n     */\n    setBackgroundColor: function(backgroundColor, callback) {\n      return this.__setBgOverlayColor('backgroundColor', backgroundColor, callback);\n    },\n\n    /**\n     * @private\n     * @param {String} property Property to set ({@link fabric.StaticCanvas#backgroundImage|backgroundImage}\n     * or {@link fabric.StaticCanvas#overlayImage|overlayImage})\n     * @param {(fabric.Image|String|null)} image fabric.Image instance, URL of an image or null to set background or overlay to\n     * @param {Function} callback Callback to invoke when image is loaded and set as background or overlay. The first argument is the created image, the second argument is a flag indicating whether an error occurred or not.\n     * @param {Object} [options] Optional options to set for the {@link fabric.Image|image}.\n     */\n    __setBgOverlayImage: function(property, image, callback, options) {\n      if (typeof image === 'string') {\n        fabric.util.loadImage(image, function(img, isError) {\n          if (img) {\n            var instance = new fabric.Image(img, options);\n            this[property] = instance;\n            instance.canvas = this;\n          }\n          callback && callback(img, isError);\n        }, this, options && options.crossOrigin);\n      }\n      else {\n        options && image.setOptions(options);\n        this[property] = image;\n        image && (image.canvas = this);\n        callback && callback(image, false);\n      }\n\n      return this;\n    },\n\n    /**\n     * @private\n     * @param {String} property Property to set ({@link fabric.StaticCanvas#backgroundColor|backgroundColor}\n     * or {@link fabric.StaticCanvas#overlayColor|overlayColor})\n     * @param {(Object|String|null)} color Object with pattern information, color value or null\n     * @param {Function} [callback] Callback is invoked when color is set\n     */\n    __setBgOverlayColor: function(property, color, callback) {\n      this[property] = color;\n      this._initGradient(color, property);\n      this._initPattern(color, property, callback);\n      return this;\n    },\n\n    /**\n     * @private\n     */\n    _createCanvasElement: function() {\n      var element = createCanvasElement();\n      if (!element) {\n        throw CANVAS_INIT_ERROR;\n      }\n      if (!element.style) {\n        element.style = { };\n      }\n      if (typeof element.getContext === 'undefined') {\n        throw CANVAS_INIT_ERROR;\n      }\n      return element;\n    },\n\n    /**\n     * @private\n     * @param {Object} [options] Options object\n     */\n    _initOptions: function (options) {\n      var lowerCanvasEl = this.lowerCanvasEl;\n      this._setOptions(options);\n\n      this.width = this.width || parseInt(lowerCanvasEl.width, 10) || 0;\n      this.height = this.height || parseInt(lowerCanvasEl.height, 10) || 0;\n\n      if (!this.lowerCanvasEl.style) {\n        return;\n      }\n\n      lowerCanvasEl.width = this.width;\n      lowerCanvasEl.height = this.height;\n\n      lowerCanvasEl.style.width = this.width + 'px';\n      lowerCanvasEl.style.height = this.height + 'px';\n\n      this.viewportTransform = this.viewportTransform.slice();\n    },\n\n    /**\n     * Creates a bottom canvas\n     * @private\n     * @param {HTMLElement} [canvasEl]\n     */\n    _createLowerCanvas: function (canvasEl) {\n      // canvasEl === 'HTMLCanvasElement' does not work on jsdom/node\n      if (canvasEl && canvasEl.getContext) {\n        this.lowerCanvasEl = canvasEl;\n      }\n      else {\n        this.lowerCanvasEl = fabric.util.getById(canvasEl) || this._createCanvasElement();\n      }\n\n      fabric.util.addClass(this.lowerCanvasEl, 'lower-canvas');\n      this._originalCanvasStyle = this.lowerCanvasEl.style;\n      if (this.interactive) {\n        this._applyCanvasStyle(this.lowerCanvasEl);\n      }\n\n      this.contextContainer = this.lowerCanvasEl.getContext('2d');\n    },\n\n    /**\n     * Returns canvas width (in px)\n     * @return {Number}\n     */\n    getWidth: function () {\n      return this.width;\n    },\n\n    /**\n     * Returns canvas height (in px)\n     * @return {Number}\n     */\n    getHeight: function () {\n      return this.height;\n    },\n\n    /**\n     * Sets width of this canvas instance\n     * @param {Number|String} value                         Value to set width to\n     * @param {Object}        [options]                     Options object\n     * @param {Boolean}       [options.backstoreOnly=false] Set the given dimensions only as canvas backstore dimensions\n     * @param {Boolean}       [options.cssOnly=false]       Set the given dimensions only as css dimensions\n     * @return {fabric.Canvas} instance\n     * @chainable true\n     */\n    setWidth: function (value, options) {\n      return this.setDimensions({ width: value }, options);\n    },\n\n    /**\n     * Sets height of this canvas instance\n     * @param {Number|String} value                         Value to set height to\n     * @param {Object}        [options]                     Options object\n     * @param {Boolean}       [options.backstoreOnly=false] Set the given dimensions only as canvas backstore dimensions\n     * @param {Boolean}       [options.cssOnly=false]       Set the given dimensions only as css dimensions\n     * @return {fabric.Canvas} instance\n     * @chainable true\n     */\n    setHeight: function (value, options) {\n      return this.setDimensions({ height: value }, options);\n    },\n\n    /**\n     * Sets dimensions (width, height) of this canvas instance. when options.cssOnly flag active you should also supply the unit of measure (px/%/em)\n     * @param {Object}        dimensions                    Object with width/height properties\n     * @param {Number|String} [dimensions.width]            Width of canvas element\n     * @param {Number|String} [dimensions.height]           Height of canvas element\n     * @param {Object}        [options]                     Options object\n     * @param {Boolean}       [options.backstoreOnly=false] Set the given dimensions only as canvas backstore dimensions\n     * @param {Boolean}       [options.cssOnly=false]       Set the given dimensions only as css dimensions\n     * @return {fabric.Canvas} thisArg\n     * @chainable\n     */\n    setDimensions: function (dimensions, options) {\n      var cssValue;\n\n      options = options || {};\n\n      for (var prop in dimensions) {\n        cssValue = dimensions[prop];\n\n        if (!options.cssOnly) {\n          this._setBackstoreDimension(prop, dimensions[prop]);\n          cssValue += 'px';\n          this.hasLostContext = true;\n        }\n\n        if (!options.backstoreOnly) {\n          this._setCssDimension(prop, cssValue);\n        }\n      }\n      if (this._isCurrentlyDrawing) {\n        this.freeDrawingBrush && this.freeDrawingBrush._setBrushStyles();\n      }\n      this._initRetinaScaling();\n      this.calcOffset();\n\n      if (!options.cssOnly) {\n        this.requestRenderAll();\n      }\n\n      return this;\n    },\n\n    /**\n     * Helper for setting width/height\n     * @private\n     * @param {String} prop property (width|height)\n     * @param {Number} value value to set property to\n     * @return {fabric.Canvas} instance\n     * @chainable true\n     */\n    _setBackstoreDimension: function (prop, value) {\n      this.lowerCanvasEl[prop] = value;\n\n      if (this.upperCanvasEl) {\n        this.upperCanvasEl[prop] = value;\n      }\n\n      if (this.cacheCanvasEl) {\n        this.cacheCanvasEl[prop] = value;\n      }\n\n      this[prop] = value;\n\n      return this;\n    },\n\n    /**\n     * Helper for setting css width/height\n     * @private\n     * @param {String} prop property (width|height)\n     * @param {String} value value to set property to\n     * @return {fabric.Canvas} instance\n     * @chainable true\n     */\n    _setCssDimension: function (prop, value) {\n      this.lowerCanvasEl.style[prop] = value;\n\n      if (this.upperCanvasEl) {\n        this.upperCanvasEl.style[prop] = value;\n      }\n\n      if (this.wrapperEl) {\n        this.wrapperEl.style[prop] = value;\n      }\n\n      return this;\n    },\n\n    /**\n     * Returns canvas zoom level\n     * @return {Number}\n     */\n    getZoom: function () {\n      return this.viewportTransform[0];\n    },\n\n    /**\n     * Sets viewport transform of this canvas instance\n     * @param {Array} vpt the transform in the form of context.transform\n     * @return {fabric.Canvas} instance\n     * @chainable true\n     */\n    setViewportTransform: function (vpt) {\n      var activeObject = this._activeObject,\n          backgroundObject = this.backgroundImage,\n          overlayObject = this.overlayImage,\n          object, i, len;\n      this.viewportTransform = vpt;\n      for (i = 0, len = this._objects.length; i < len; i++) {\n        object = this._objects[i];\n        object.group || object.setCoords(true);\n      }\n      if (activeObject) {\n        activeObject.setCoords();\n      }\n      if (backgroundObject) {\n        backgroundObject.setCoords(true);\n      }\n      if (overlayObject) {\n        overlayObject.setCoords(true);\n      }\n      this.calcViewportBoundaries();\n      this.renderOnAddRemove && this.requestRenderAll();\n      return this;\n    },\n\n    /**\n     * Sets zoom level of this canvas instance, the zoom centered around point\n     * meaning that following zoom to point with the same point will have the visual\n     * effect of the zoom originating from that point. The point won't move.\n     * It has nothing to do with canvas center or visual center of the viewport.\n     * @param {fabric.Point} point to zoom with respect to\n     * @param {Number} value to set zoom to, less than 1 zooms out\n     * @return {fabric.Canvas} instance\n     * @chainable true\n     */\n    zoomToPoint: function (point, value) {\n      // TODO: just change the scale, preserve other transformations\n      var before = point, vpt = this.viewportTransform.slice(0);\n      point = transformPoint(point, invertTransform(this.viewportTransform));\n      vpt[0] = value;\n      vpt[3] = value;\n      var after = transformPoint(point, vpt);\n      vpt[4] += before.x - after.x;\n      vpt[5] += before.y - after.y;\n      return this.setViewportTransform(vpt);\n    },\n\n    /**\n     * Sets zoom level of this canvas instance\n     * @param {Number} value to set zoom to, less than 1 zooms out\n     * @return {fabric.Canvas} instance\n     * @chainable true\n     */\n    setZoom: function (value) {\n      this.zoomToPoint(new fabric.Point(0, 0), value);\n      return this;\n    },\n\n    /**\n     * Pan viewport so as to place point at top left corner of canvas\n     * @param {fabric.Point} point to move to\n     * @return {fabric.Canvas} instance\n     * @chainable true\n     */\n    absolutePan: function (point) {\n      var vpt = this.viewportTransform.slice(0);\n      vpt[4] = -point.x;\n      vpt[5] = -point.y;\n      return this.setViewportTransform(vpt);\n    },\n\n    /**\n     * Pans viewpoint relatively\n     * @param {fabric.Point} point (position vector) to move by\n     * @return {fabric.Canvas} instance\n     * @chainable true\n     */\n    relativePan: function (point) {\n      return this.absolutePan(new fabric.Point(\n        -point.x - this.viewportTransform[4],\n        -point.y - this.viewportTransform[5]\n      ));\n    },\n\n    /**\n     * Returns &lt;canvas> element corresponding to this instance\n     * @return {HTMLCanvasElement}\n     */\n    getElement: function () {\n      return this.lowerCanvasEl;\n    },\n\n    /**\n     * @private\n     * @param {fabric.Object} obj Object that was added\n     */\n    _onObjectAdded: function(obj) {\n      this.stateful && obj.setupState();\n      obj._set('canvas', this);\n      obj.setCoords();\n      this.fire('object:added', { target: obj });\n      obj.fire('added');\n    },\n\n    /**\n     * @private\n     * @param {fabric.Object} obj Object that was removed\n     */\n    _onObjectRemoved: function(obj) {\n      this.fire('object:removed', { target: obj });\n      obj.fire('removed');\n      delete obj.canvas;\n    },\n\n    /**\n     * Clears specified context of canvas element\n     * @param {CanvasRenderingContext2D} ctx Context to clear\n     * @return {fabric.Canvas} thisArg\n     * @chainable\n     */\n    clearContext: function(ctx) {\n      ctx.clearRect(0, 0, this.width, this.height);\n      return this;\n    },\n\n    /**\n     * Returns context of canvas where objects are drawn\n     * @return {CanvasRenderingContext2D}\n     */\n    getContext: function () {\n      return this.contextContainer;\n    },\n\n    /**\n     * Clears all contexts (background, main, top) of an instance\n     * @return {fabric.Canvas} thisArg\n     * @chainable\n     */\n    clear: function () {\n      this.remove.apply(this, this.getObjects());\n      this.backgroundImage = null;\n      this.overlayImage = null;\n      this.backgroundColor = '';\n      this.overlayColor = '';\n      if (this._hasITextHandlers) {\n        this.off('mouse:up', this._mouseUpITextHandler);\n        this._iTextInstances = null;\n        this._hasITextHandlers = false;\n      }\n      this.clearContext(this.contextContainer);\n      this.fire('canvas:cleared');\n      this.renderOnAddRemove && this.requestRenderAll();\n      return this;\n    },\n\n    /**\n     * Renders the canvas\n     * @return {fabric.Canvas} instance\n     * @chainable\n     */\n    renderAll: function () {\n      var canvasToDrawOn = this.contextContainer;\n      this.renderCanvas(canvasToDrawOn, this._objects);\n      return this;\n    },\n\n    /**\n     * Function created to be instance bound at initialization\n     * used in requestAnimationFrame rendering\n     * Let the fabricJS call it. If you call it manually you could have more\n     * animationFrame stacking on to of each other\n     * for an imperative rendering, use canvas.renderAll\n     * @private\n     * @return {fabric.Canvas} instance\n     * @chainable\n     */\n    renderAndReset: function() {\n      this.isRendering = 0;\n      this.renderAll();\n    },\n\n    /**\n     * Append a renderAll request to next animation frame.\n     * unless one is already in progress, in that case nothing is done\n     * a boolean flag will avoid appending more.\n     * @return {fabric.Canvas} instance\n     * @chainable\n     */\n    requestRenderAll: function () {\n      if (!this.isRendering) {\n        this.isRendering = fabric.util.requestAnimFrame(this.renderAndResetBound);\n      }\n      return this;\n    },\n\n    /**\n     * Calculate the position of the 4 corner of canvas with current viewportTransform.\n     * helps to determinate when an object is in the current rendering viewport using\n     * object absolute coordinates ( aCoords )\n     * @return {Object} points.tl\n     * @chainable\n     */\n    calcViewportBoundaries: function() {\n      var points = { }, width = this.width, height = this.height,\n          iVpt = invertTransform(this.viewportTransform);\n      points.tl = transformPoint({ x: 0, y: 0 }, iVpt);\n      points.br = transformPoint({ x: width, y: height }, iVpt);\n      points.tr = new fabric.Point(points.br.x, points.tl.y);\n      points.bl = new fabric.Point(points.tl.x, points.br.y);\n      this.vptCoords = points;\n      return points;\n    },\n\n    cancelRequestedRender: function() {\n      if (this.isRendering) {\n        fabric.util.cancelAnimFrame(this.isRendering);\n        this.isRendering = 0;\n      }\n    },\n\n    /**\n     * Renders background, objects, overlay and controls.\n     * @param {CanvasRenderingContext2D} ctx\n     * @param {Array} objects to render\n     * @return {fabric.Canvas} instance\n     * @chainable\n     */\n    renderCanvas: function(ctx, objects) {\n      var v = this.viewportTransform, path = this.clipPath;\n      this.cancelRequestedRender();\n      this.calcViewportBoundaries();\n      this.clearContext(ctx);\n      fabric.util.setImageSmoothing(ctx, this.imageSmoothingEnabled);\n      this.fire('before:render', { ctx: ctx, });\n      this._renderBackground(ctx);\n\n      ctx.save();\n      //apply viewport transform once for all rendering process\n      ctx.transform(v[0], v[1], v[2], v[3], v[4], v[5]);\n      this._renderObjects(ctx, objects);\n      ctx.restore();\n      if (!this.controlsAboveOverlay && this.interactive) {\n        this.drawControls(ctx);\n      }\n      if (path) {\n        path.canvas = this;\n        // needed to setup a couple of variables\n        path.shouldCache();\n        path._transformDone = true;\n        path.renderCache({ forClipping: true });\n        this.drawClipPathOnCanvas(ctx);\n      }\n      this._renderOverlay(ctx);\n      if (this.controlsAboveOverlay && this.interactive) {\n        this.drawControls(ctx);\n      }\n      this.fire('after:render', { ctx: ctx, });\n    },\n\n    /**\n     * Paint the cached clipPath on the lowerCanvasEl\n     * @param {CanvasRenderingContext2D} ctx Context to render on\n     */\n    drawClipPathOnCanvas: function(ctx) {\n      var v = this.viewportTransform, path = this.clipPath;\n      ctx.save();\n      ctx.transform(v[0], v[1], v[2], v[3], v[4], v[5]);\n      // DEBUG: uncomment this line, comment the following\n      // ctx.globalAlpha = 0.4;\n      ctx.globalCompositeOperation = 'destination-in';\n      path.transform(ctx);\n      ctx.scale(1 / path.zoomX, 1 / path.zoomY);\n      ctx.drawImage(path._cacheCanvas, -path.cacheTranslationX, -path.cacheTranslationY);\n      ctx.restore();\n    },\n\n    /**\n     * @private\n     * @param {CanvasRenderingContext2D} ctx Context to render on\n     * @param {Array} objects to render\n     */\n    _renderObjects: function(ctx, objects) {\n      var i, len;\n      for (i = 0, len = objects.length; i < len; ++i) {\n        objects[i] && objects[i].render(ctx);\n      }\n    },\n\n    /**\n     * @private\n     * @param {CanvasRenderingContext2D} ctx Context to render on\n     * @param {string} property 'background' or 'overlay'\n     */\n    _renderBackgroundOrOverlay: function(ctx, property) {\n      var fill = this[property + 'Color'], object = this[property + 'Image'],\n          v = this.viewportTransform, needsVpt = this[property + 'Vpt'];\n      if (!fill && !object) {\n        return;\n      }\n      if (fill) {\n        ctx.save();\n        ctx.beginPath();\n        ctx.moveTo(0, 0);\n        ctx.lineTo(this.width, 0);\n        ctx.lineTo(this.width, this.height);\n        ctx.lineTo(0, this.height);\n        ctx.closePath();\n        ctx.fillStyle = fill.toLive\n          ? fill.toLive(ctx, this)\n          : fill;\n        if (needsVpt) {\n          ctx.transform(v[0], v[1], v[2], v[3], v[4], v[5]);\n        }\n        ctx.transform(1, 0, 0, 1, fill.offsetX || 0, fill.offsetY || 0);\n        var m = fill.gradientTransform || fill.patternTransform;\n        m && ctx.transform(m[0], m[1], m[2], m[3], m[4], m[5]);\n        ctx.fill();\n        ctx.restore();\n      }\n      if (object) {\n        ctx.save();\n        if (needsVpt) {\n          ctx.transform(v[0], v[1], v[2], v[3], v[4], v[5]);\n        }\n        object.render(ctx);\n        ctx.restore();\n      }\n    },\n\n    /**\n     * @private\n     * @param {CanvasRenderingContext2D} ctx Context to render on\n     */\n    _renderBackground: function(ctx) {\n      this._renderBackgroundOrOverlay(ctx, 'background');\n    },\n\n    /**\n     * @private\n     * @param {CanvasRenderingContext2D} ctx Context to render on\n     */\n    _renderOverlay: function(ctx) {\n      this._renderBackgroundOrOverlay(ctx, 'overlay');\n    },\n\n    /**\n     * Returns coordinates of a center of canvas.\n     * Returned value is an object with top and left properties\n     * @return {Object} object with \"top\" and \"left\" number values\n     */\n    getCenter: function () {\n      return {\n        top: this.height / 2,\n        left: this.width / 2\n      };\n    },\n\n    /**\n     * Centers object horizontally in the canvas\n     * @param {fabric.Object} object Object to center horizontally\n     * @return {fabric.Canvas} thisArg\n     */\n    centerObjectH: function (object) {\n      return this._centerObject(object, new fabric.Point(this.getCenter().left, object.getCenterPoint().y));\n    },\n\n    /**\n     * Centers object vertically in the canvas\n     * @param {fabric.Object} object Object to center vertically\n     * @return {fabric.Canvas} thisArg\n     * @chainable\n     */\n    centerObjectV: function (object) {\n      return this._centerObject(object, new fabric.Point(object.getCenterPoint().x, this.getCenter().top));\n    },\n\n    /**\n     * Centers object vertically and horizontally in the canvas\n     * @param {fabric.Object} object Object to center vertically and horizontally\n     * @return {fabric.Canvas} thisArg\n     * @chainable\n     */\n    centerObject: function(object) {\n      var center = this.getCenter();\n\n      return this._centerObject(object, new fabric.Point(center.left, center.top));\n    },\n\n    /**\n     * Centers object vertically and horizontally in the viewport\n     * @param {fabric.Object} object Object to center vertically and horizontally\n     * @return {fabric.Canvas} thisArg\n     * @chainable\n     */\n    viewportCenterObject: function(object) {\n      var vpCenter = this.getVpCenter();\n\n      return this._centerObject(object, vpCenter);\n    },\n\n    /**\n     * Centers object horizontally in the viewport, object.top is unchanged\n     * @param {fabric.Object} object Object to center vertically and horizontally\n     * @return {fabric.Canvas} thisArg\n     * @chainable\n     */\n    viewportCenterObjectH: function(object) {\n      var vpCenter = this.getVpCenter();\n      this._centerObject(object, new fabric.Point(vpCenter.x, object.getCenterPoint().y));\n      return this;\n    },\n\n    /**\n     * Centers object Vertically in the viewport, object.top is unchanged\n     * @param {fabric.Object} object Object to center vertically and horizontally\n     * @return {fabric.Canvas} thisArg\n     * @chainable\n     */\n    viewportCenterObjectV: function(object) {\n      var vpCenter = this.getVpCenter();\n\n      return this._centerObject(object, new fabric.Point(object.getCenterPoint().x, vpCenter.y));\n    },\n\n    /**\n     * Calculate the point in canvas that correspond to the center of actual viewport.\n     * @return {fabric.Point} vpCenter, viewport center\n     * @chainable\n     */\n    getVpCenter: function() {\n      var center = this.getCenter(),\n          iVpt = invertTransform(this.viewportTransform);\n      return transformPoint({ x: center.left, y: center.top }, iVpt);\n    },\n\n    /**\n     * @private\n     * @param {fabric.Object} object Object to center\n     * @param {fabric.Point} center Center point\n     * @return {fabric.Canvas} thisArg\n     * @chainable\n     */\n    _centerObject: function(object, center) {\n      object.setPositionByOrigin(center, 'center', 'center');\n      object.setCoords();\n      this.renderOnAddRemove && this.requestRenderAll();\n      return this;\n    },\n\n    /**\n     * Returns dataless JSON representation of canvas\n     * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n     * @return {String} json string\n     */\n    toDatalessJSON: function (propertiesToInclude) {\n      return this.toDatalessObject(propertiesToInclude);\n    },\n\n    /**\n     * Returns object representation of canvas\n     * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n     * @return {Object} object representation of an instance\n     */\n    toObject: function (propertiesToInclude) {\n      return this._toObjectMethod('toObject', propertiesToInclude);\n    },\n\n    /**\n     * Returns dataless object representation of canvas\n     * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n     * @return {Object} object representation of an instance\n     */\n    toDatalessObject: function (propertiesToInclude) {\n      return this._toObjectMethod('toDatalessObject', propertiesToInclude);\n    },\n\n    /**\n     * @private\n     */\n    _toObjectMethod: function (methodName, propertiesToInclude) {\n\n      var clipPath = this.clipPath, data = {\n        version: fabric.version,\n        objects: this._toObjects(methodName, propertiesToInclude),\n      };\n      if (clipPath && !clipPath.excludeFromExport) {\n        data.clipPath = this._toObject(this.clipPath, methodName, propertiesToInclude);\n      }\n      extend(data, this.__serializeBgOverlay(methodName, propertiesToInclude));\n\n      fabric.util.populateWithProperties(this, data, propertiesToInclude);\n\n      return data;\n    },\n\n    /**\n     * @private\n     */\n    _toObjects: function(methodName, propertiesToInclude) {\n      return this._objects.filter(function(object) {\n        return !object.excludeFromExport;\n      }).map(function(instance) {\n        return this._toObject(instance, methodName, propertiesToInclude);\n      }, this);\n    },\n\n    /**\n     * @private\n     */\n    _toObject: function(instance, methodName, propertiesToInclude) {\n      var originalValue;\n\n      if (!this.includeDefaultValues) {\n        originalValue = instance.includeDefaultValues;\n        instance.includeDefaultValues = false;\n      }\n\n      var object = instance[methodName](propertiesToInclude);\n      if (!this.includeDefaultValues) {\n        instance.includeDefaultValues = originalValue;\n      }\n      return object;\n    },\n\n    /**\n     * @private\n     */\n    __serializeBgOverlay: function(methodName, propertiesToInclude) {\n      var data = {}, bgImage = this.backgroundImage, overlayImage = this.overlayImage,\n          bgColor = this.backgroundColor, overlayColor = this.overlayColor;\n\n      if (bgColor && bgColor.toObject) {\n        if (!bgColor.excludeFromExport) {\n          data.background = bgColor.toObject(propertiesToInclude);\n        }\n      }\n      else if (bgColor) {\n        data.background = bgColor;\n      }\n\n      if (overlayColor && overlayColor.toObject) {\n        if (!overlayColor.excludeFromExport) {\n          data.overlay = overlayColor.toObject(propertiesToInclude);\n        }\n      }\n      else if (overlayColor) {\n        data.overlay = overlayColor;\n      }\n\n      if (bgImage && !bgImage.excludeFromExport) {\n        data.backgroundImage = this._toObject(bgImage, methodName, propertiesToInclude);\n      }\n      if (overlayImage && !overlayImage.excludeFromExport) {\n        data.overlayImage = this._toObject(overlayImage, methodName, propertiesToInclude);\n      }\n\n      return data;\n    },\n\n    /* _TO_SVG_START_ */\n    /**\n     * When true, getSvgTransform() will apply the StaticCanvas.viewportTransform to the SVG transformation. When true,\n     * a zoomed canvas will then produce zoomed SVG output.\n     * @type Boolean\n     * @default\n     */\n    svgViewportTransformation: true,\n\n    /**\n     * Returns SVG representation of canvas\n     * @function\n     * @param {Object} [options] Options object for SVG output\n     * @param {Boolean} [options.suppressPreamble=false] If true xml tag is not included\n     * @param {Object} [options.viewBox] SVG viewbox object\n     * @param {Number} [options.viewBox.x] x-coordinate of viewbox\n     * @param {Number} [options.viewBox.y] y-coordinate of viewbox\n     * @param {Number} [options.viewBox.width] Width of viewbox\n     * @param {Number} [options.viewBox.height] Height of viewbox\n     * @param {String} [options.encoding=UTF-8] Encoding of SVG output\n     * @param {String} [options.width] desired width of svg with or without units\n     * @param {String} [options.height] desired height of svg with or without units\n     * @param {Function} [reviver] Method for further parsing of svg elements, called after each fabric object converted into svg representation.\n     * @return {String} SVG string\n     * @tutorial {@link http://fabricjs.com/fabric-intro-part-3#serialization}\n     * @see {@link http://jsfiddle.net/fabricjs/jQ3ZZ/|jsFiddle demo}\n     * @example <caption>Normal SVG output</caption>\n     * var svg = canvas.toSVG();\n     * @example <caption>SVG output without preamble (without &lt;?xml ../>)</caption>\n     * var svg = canvas.toSVG({suppressPreamble: true});\n     * @example <caption>SVG output with viewBox attribute</caption>\n     * var svg = canvas.toSVG({\n     *   viewBox: {\n     *     x: 100,\n     *     y: 100,\n     *     width: 200,\n     *     height: 300\n     *   }\n     * });\n     * @example <caption>SVG output with different encoding (default: UTF-8)</caption>\n     * var svg = canvas.toSVG({encoding: 'ISO-8859-1'});\n     * @example <caption>Modify SVG output with reviver function</caption>\n     * var svg = canvas.toSVG(null, function(svg) {\n     *   return svg.replace('stroke-dasharray: ; stroke-linecap: butt; stroke-linejoin: miter; stroke-miterlimit: 10; ', '');\n     * });\n     */\n    toSVG: function(options, reviver) {\n      options || (options = { });\n      options.reviver = reviver;\n      var markup = [];\n\n      this._setSVGPreamble(markup, options);\n      this._setSVGHeader(markup, options);\n      if (this.clipPath) {\n        markup.push('<g clip-path=\"url(#' + this.clipPath.clipPathId + ')\" >\\n');\n      }\n      this._setSVGBgOverlayColor(markup, 'background');\n      this._setSVGBgOverlayImage(markup, 'backgroundImage', reviver);\n      this._setSVGObjects(markup, reviver);\n      if (this.clipPath) {\n        markup.push('</g>\\n');\n      }\n      this._setSVGBgOverlayColor(markup, 'overlay');\n      this._setSVGBgOverlayImage(markup, 'overlayImage', reviver);\n\n      markup.push('</svg>');\n\n      return markup.join('');\n    },\n\n    /**\n     * @private\n     */\n    _setSVGPreamble: function(markup, options) {\n      if (options.suppressPreamble) {\n        return;\n      }\n      markup.push(\n        '<?xml version=\"1.0\" encoding=\"', (options.encoding || 'UTF-8'), '\" standalone=\"no\" ?>\\n',\n        '<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\" ',\n        '\"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\\n'\n      );\n    },\n\n    /**\n     * @private\n     */\n    _setSVGHeader: function(markup, options) {\n      var width = options.width || this.width,\n          height = options.height || this.height,\n          vpt, viewBox = 'viewBox=\"0 0 ' + this.width + ' ' + this.height + '\" ',\n          NUM_FRACTION_DIGITS = fabric.Object.NUM_FRACTION_DIGITS;\n\n      if (options.viewBox) {\n        viewBox = 'viewBox=\"' +\n                options.viewBox.x + ' ' +\n                options.viewBox.y + ' ' +\n                options.viewBox.width + ' ' +\n                options.viewBox.height + '\" ';\n      }\n      else {\n        if (this.svgViewportTransformation) {\n          vpt = this.viewportTransform;\n          viewBox = 'viewBox=\"' +\n                  toFixed(-vpt[4] / vpt[0], NUM_FRACTION_DIGITS) + ' ' +\n                  toFixed(-vpt[5] / vpt[3], NUM_FRACTION_DIGITS) + ' ' +\n                  toFixed(this.width / vpt[0], NUM_FRACTION_DIGITS) + ' ' +\n                  toFixed(this.height / vpt[3], NUM_FRACTION_DIGITS) + '\" ';\n        }\n      }\n\n      markup.push(\n        '<svg ',\n        'xmlns=\"http://www.w3.org/2000/svg\" ',\n        'xmlns:xlink=\"http://www.w3.org/1999/xlink\" ',\n        'version=\"1.1\" ',\n        'width=\"', width, '\" ',\n        'height=\"', height, '\" ',\n        viewBox,\n        'xml:space=\"preserve\">\\n',\n        '<desc>Created with Fabric.js ', fabric.version, '</desc>\\n',\n        '<defs>\\n',\n        this.createSVGFontFacesMarkup(),\n        this.createSVGRefElementsMarkup(),\n        this.createSVGClipPathMarkup(options),\n        '</defs>\\n'\n      );\n    },\n\n    createSVGClipPathMarkup: function(options) {\n      var clipPath = this.clipPath;\n      if (clipPath) {\n        clipPath.clipPathId = 'CLIPPATH_' + fabric.Object.__uid++;\n        return  '<clipPath id=\"' + clipPath.clipPathId + '\" >\\n' +\n          this.clipPath.toClipPathSVG(options.reviver) +\n          '</clipPath>\\n';\n      }\n      return '';\n    },\n\n    /**\n     * Creates markup containing SVG referenced elements like patterns, gradients etc.\n     * @return {String}\n     */\n    createSVGRefElementsMarkup: function() {\n      var _this = this,\n          markup = ['background', 'overlay'].map(function(prop) {\n            var fill = _this[prop + 'Color'];\n            if (fill && fill.toLive) {\n              var shouldTransform = _this[prop + 'Vpt'], vpt = _this.viewportTransform,\n                  object = {\n                    width: _this.width / (shouldTransform ? vpt[0] : 1),\n                    height: _this.height / (shouldTransform ? vpt[3] : 1)\n                  };\n              return fill.toSVG(\n                object,\n                { additionalTransform: shouldTransform ? fabric.util.matrixToSVG(vpt) : '' }\n              );\n            }\n          });\n      return markup.join('');\n    },\n\n    /**\n     * Creates markup containing SVG font faces,\n     * font URLs for font faces must be collected by developers\n     * and are not extracted from the DOM by fabricjs\n     * @param {Array} objects Array of fabric objects\n     * @return {String}\n     */\n    createSVGFontFacesMarkup: function() {\n      var markup = '', fontList = { }, obj, fontFamily,\n          style, row, rowIndex, _char, charIndex, i, len,\n          fontPaths = fabric.fontPaths, objects = [];\n\n      this._objects.forEach(function add(object) {\n        objects.push(object);\n        if (object._objects) {\n          object._objects.forEach(add);\n        }\n      });\n\n      for (i = 0, len = objects.length; i < len; i++) {\n        obj = objects[i];\n        fontFamily = obj.fontFamily;\n        if (obj.type.indexOf('text') === -1 || fontList[fontFamily] || !fontPaths[fontFamily]) {\n          continue;\n        }\n        fontList[fontFamily] = true;\n        if (!obj.styles) {\n          continue;\n        }\n        style = obj.styles;\n        for (rowIndex in style) {\n          row = style[rowIndex];\n          for (charIndex in row) {\n            _char = row[charIndex];\n            fontFamily = _char.fontFamily;\n            if (!fontList[fontFamily] && fontPaths[fontFamily]) {\n              fontList[fontFamily] = true;\n            }\n          }\n        }\n      }\n\n      for (var j in fontList) {\n        markup += [\n          '\\t\\t@font-face {\\n',\n          '\\t\\t\\tfont-family: \\'', j, '\\';\\n',\n          '\\t\\t\\tsrc: url(\\'', fontPaths[j], '\\');\\n',\n          '\\t\\t}\\n'\n        ].join('');\n      }\n\n      if (markup) {\n        markup = [\n          '\\t<style type=\"text/css\">',\n          '<![CDATA[\\n',\n          markup,\n          ']]>',\n          '</style>\\n'\n        ].join('');\n      }\n\n      return markup;\n    },\n\n    /**\n     * @private\n     */\n    _setSVGObjects: function(markup, reviver) {\n      var instance, i, len, objects = this._objects;\n      for (i = 0, len = objects.length; i < len; i++) {\n        instance = objects[i];\n        if (instance.excludeFromExport) {\n          continue;\n        }\n        this._setSVGObject(markup, instance, reviver);\n      }\n    },\n\n    /**\n     * @private\n     */\n    _setSVGObject: function(markup, instance, reviver) {\n      markup.push(instance.toSVG(reviver));\n    },\n\n    /**\n     * @private\n     */\n    _setSVGBgOverlayImage: function(markup, property, reviver) {\n      if (this[property] && !this[property].excludeFromExport && this[property].toSVG) {\n        markup.push(this[property].toSVG(reviver));\n      }\n    },\n\n    /**\n     * @private\n     */\n    _setSVGBgOverlayColor: function(markup, property) {\n      var filler = this[property + 'Color'], vpt = this.viewportTransform, finalWidth = this.width,\n          finalHeight = this.height;\n      if (!filler) {\n        return;\n      }\n      if (filler.toLive) {\n        var repeat = filler.repeat, iVpt = fabric.util.invertTransform(vpt), shouldInvert = this[property + 'Vpt'],\n            additionalTransform = shouldInvert ? fabric.util.matrixToSVG(iVpt) : '';\n        markup.push(\n          '<rect transform=\"' + additionalTransform + ' translate(', finalWidth / 2, ',', finalHeight / 2, ')\"',\n          ' x=\"', filler.offsetX - finalWidth / 2,\n          '\" y=\"', filler.offsetY - finalHeight / 2, '\" ',\n          'width=\"',\n          (repeat === 'repeat-y' || repeat === 'no-repeat'\n            ? filler.source.width\n            : finalWidth ),\n          '\" height=\"',\n          (repeat === 'repeat-x' || repeat === 'no-repeat'\n            ? filler.source.height\n            : finalHeight),\n          '\" fill=\"url(#SVGID_' + filler.id + ')\"',\n          '></rect>\\n'\n        );\n      }\n      else {\n        markup.push(\n          '<rect x=\"0\" y=\"0\" width=\"100%\" height=\"100%\" ',\n          'fill=\"', filler, '\"',\n          '></rect>\\n'\n        );\n      }\n    },\n    /* _TO_SVG_END_ */\n\n    /**\n     * Moves an object or the objects of a multiple selection\n     * to the bottom of the stack of drawn objects\n     * @param {fabric.Object} object Object to send to back\n     * @return {fabric.Canvas} thisArg\n     * @chainable\n     */\n    sendToBack: function (object) {\n      if (!object) {\n        return this;\n      }\n      var activeSelection = this._activeObject,\n          i, obj, objs;\n      if (object === activeSelection && object.type === 'activeSelection') {\n        objs = activeSelection._objects;\n        for (i = objs.length; i--;) {\n          obj = objs[i];\n          removeFromArray(this._objects, obj);\n          this._objects.unshift(obj);\n        }\n      }\n      else {\n        removeFromArray(this._objects, object);\n        this._objects.unshift(object);\n      }\n      this.renderOnAddRemove && this.requestRenderAll();\n      return this;\n    },\n\n    /**\n     * Moves an object or the objects of a multiple selection\n     * to the top of the stack of drawn objects\n     * @param {fabric.Object} object Object to send\n     * @return {fabric.Canvas} thisArg\n     * @chainable\n     */\n    bringToFront: function (object) {\n      if (!object) {\n        return this;\n      }\n      var activeSelection = this._activeObject,\n          i, obj, objs;\n      if (object === activeSelection && object.type === 'activeSelection') {\n        objs = activeSelection._objects;\n        for (i = 0; i < objs.length; i++) {\n          obj = objs[i];\n          removeFromArray(this._objects, obj);\n          this._objects.push(obj);\n        }\n      }\n      else {\n        removeFromArray(this._objects, object);\n        this._objects.push(object);\n      }\n      this.renderOnAddRemove && this.requestRenderAll();\n      return this;\n    },\n\n    /**\n     * Moves an object or a selection down in stack of drawn objects\n     * An optional parameter, intersecting allows to move the object in behind\n     * the first intersecting object. Where intersection is calculated with\n     * bounding box. If no intersection is found, there will not be change in the\n     * stack.\n     * @param {fabric.Object} object Object to send\n     * @param {Boolean} [intersecting] If `true`, send object behind next lower intersecting object\n     * @return {fabric.Canvas} thisArg\n     * @chainable\n     */\n    sendBackwards: function (object, intersecting) {\n      if (!object) {\n        return this;\n      }\n      var activeSelection = this._activeObject,\n          i, obj, idx, newIdx, objs, objsMoved = 0;\n\n      if (object === activeSelection && object.type === 'activeSelection') {\n        objs = activeSelection._objects;\n        for (i = 0; i < objs.length; i++) {\n          obj = objs[i];\n          idx = this._objects.indexOf(obj);\n          if (idx > 0 + objsMoved) {\n            newIdx = idx - 1;\n            removeFromArray(this._objects, obj);\n            this._objects.splice(newIdx, 0, obj);\n          }\n          objsMoved++;\n        }\n      }\n      else {\n        idx = this._objects.indexOf(object);\n        if (idx !== 0) {\n          // if object is not on the bottom of stack\n          newIdx = this._findNewLowerIndex(object, idx, intersecting);\n          removeFromArray(this._objects, object);\n          this._objects.splice(newIdx, 0, object);\n        }\n      }\n      this.renderOnAddRemove && this.requestRenderAll();\n      return this;\n    },\n\n    /**\n     * @private\n     */\n    _findNewLowerIndex: function(object, idx, intersecting) {\n      var newIdx, i;\n\n      if (intersecting) {\n        newIdx = idx;\n\n        // traverse down the stack looking for the nearest intersecting object\n        for (i = idx - 1; i >= 0; --i) {\n\n          var isIntersecting = object.intersectsWithObject(this._objects[i]) ||\n                               object.isContainedWithinObject(this._objects[i]) ||\n                               this._objects[i].isContainedWithinObject(object);\n\n          if (isIntersecting) {\n            newIdx = i;\n            break;\n          }\n        }\n      }\n      else {\n        newIdx = idx - 1;\n      }\n\n      return newIdx;\n    },\n\n    /**\n     * Moves an object or a selection up in stack of drawn objects\n     * An optional parameter, intersecting allows to move the object in front\n     * of the first intersecting object. Where intersection is calculated with\n     * bounding box. If no intersection is found, there will not be change in the\n     * stack.\n     * @param {fabric.Object} object Object to send\n     * @param {Boolean} [intersecting] If `true`, send object in front of next upper intersecting object\n     * @return {fabric.Canvas} thisArg\n     * @chainable\n     */\n    bringForward: function (object, intersecting) {\n      if (!object) {\n        return this;\n      }\n      var activeSelection = this._activeObject,\n          i, obj, idx, newIdx, objs, objsMoved = 0;\n\n      if (object === activeSelection && object.type === 'activeSelection') {\n        objs = activeSelection._objects;\n        for (i = objs.length; i--;) {\n          obj = objs[i];\n          idx = this._objects.indexOf(obj);\n          if (idx < this._objects.length - 1 - objsMoved) {\n            newIdx = idx + 1;\n            removeFromArray(this._objects, obj);\n            this._objects.splice(newIdx, 0, obj);\n          }\n          objsMoved++;\n        }\n      }\n      else {\n        idx = this._objects.indexOf(object);\n        if (idx !== this._objects.length - 1) {\n          // if object is not on top of stack (last item in an array)\n          newIdx = this._findNewUpperIndex(object, idx, intersecting);\n          removeFromArray(this._objects, object);\n          this._objects.splice(newIdx, 0, object);\n        }\n      }\n      this.renderOnAddRemove && this.requestRenderAll();\n      return this;\n    },\n\n    /**\n     * @private\n     */\n    _findNewUpperIndex: function(object, idx, intersecting) {\n      var newIdx, i, len;\n\n      if (intersecting) {\n        newIdx = idx;\n\n        // traverse up the stack looking for the nearest intersecting object\n        for (i = idx + 1, len = this._objects.length; i < len; ++i) {\n\n          var isIntersecting = object.intersectsWithObject(this._objects[i]) ||\n                               object.isContainedWithinObject(this._objects[i]) ||\n                               this._objects[i].isContainedWithinObject(object);\n\n          if (isIntersecting) {\n            newIdx = i;\n            break;\n          }\n        }\n      }\n      else {\n        newIdx = idx + 1;\n      }\n\n      return newIdx;\n    },\n\n    /**\n     * Moves an object to specified level in stack of drawn objects\n     * @param {fabric.Object} object Object to send\n     * @param {Number} index Position to move to\n     * @return {fabric.Canvas} thisArg\n     * @chainable\n     */\n    moveTo: function (object, index) {\n      removeFromArray(this._objects, object);\n      this._objects.splice(index, 0, object);\n      return this.renderOnAddRemove && this.requestRenderAll();\n    },\n\n    /**\n     * Clears a canvas element and dispose objects\n     * @return {fabric.Canvas} thisArg\n     * @chainable\n     */\n    dispose: function () {\n      // cancel eventually ongoing renders\n      if (this.isRendering) {\n        fabric.util.cancelAnimFrame(this.isRendering);\n        this.isRendering = 0;\n      }\n      this.forEachObject(function(object) {\n        object.dispose && object.dispose();\n      });\n      this._objects = [];\n      if (this.backgroundImage && this.backgroundImage.dispose) {\n        this.backgroundImage.dispose();\n      }\n      this.backgroundImage = null;\n      if (this.overlayImage && this.overlayImage.dispose) {\n        this.overlayImage.dispose();\n      }\n      this.overlayImage = null;\n      this._iTextInstances = null;\n      this.contextContainer = null;\n      // restore canvas style\n      this.lowerCanvasEl.classList.remove('lower-canvas');\n      this.lowerCanvasEl.style = this._originalCanvasStyle;\n      delete this._originalCanvasStyle;\n      // restore canvas size to original size in case retina scaling was applied\n      this.lowerCanvasEl.setAttribute('width', this.width);\n      this.lowerCanvasEl.setAttribute('height', this.height);\n      fabric.util.cleanUpJsdomNode(this.lowerCanvasEl);\n      this.lowerCanvasEl = undefined;\n      return this;\n    },\n\n    /**\n     * Returns a string representation of an instance\n     * @return {String} string representation of an instance\n     */\n    toString: function () {\n      return '#<fabric.Canvas (' + this.complexity() + '): ' +\n               '{ objects: ' + this._objects.length + ' }>';\n    }\n  });\n\n  extend(fabric.StaticCanvas.prototype, fabric.Observable);\n  extend(fabric.StaticCanvas.prototype, fabric.Collection);\n  extend(fabric.StaticCanvas.prototype, fabric.DataURLExporter);\n\n  extend(fabric.StaticCanvas, /** @lends fabric.StaticCanvas */ {\n\n    /**\n     * @static\n     * @type String\n     * @default\n     */\n    EMPTY_JSON: '{\"objects\": [], \"background\": \"white\"}',\n\n    /**\n     * Provides a way to check support of some of the canvas methods\n     * (either those of HTMLCanvasElement itself, or rendering context)\n     *\n     * @param {String} methodName Method to check support for;\n     *                            Could be one of \"setLineDash\"\n     * @return {Boolean | null} `true` if method is supported (or at least exists),\n     *                          `null` if canvas element or context can not be initialized\n     */\n    supports: function (methodName) {\n      var el = createCanvasElement();\n\n      if (!el || !el.getContext) {\n        return null;\n      }\n\n      var ctx = el.getContext('2d');\n      if (!ctx) {\n        return null;\n      }\n\n      switch (methodName) {\n\n        case 'setLineDash':\n          return typeof ctx.setLineDash !== 'undefined';\n\n        default:\n          return null;\n      }\n    }\n  });\n\n  /**\n   * Returns Object representation of canvas\n   * this alias is provided because if you call JSON.stringify on an instance,\n   * the toJSON object will be invoked if it exists.\n   * Having a toJSON method means you can do JSON.stringify(myCanvas)\n   * @function\n   * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n   * @return {Object} JSON compatible object\n   * @tutorial {@link http://fabricjs.com/fabric-intro-part-3#serialization}\n   * @see {@link http://jsfiddle.net/fabricjs/pec86/|jsFiddle demo}\n   * @example <caption>JSON without additional properties</caption>\n   * var json = canvas.toJSON();\n   * @example <caption>JSON with additional properties included</caption>\n   * var json = canvas.toJSON(['lockMovementX', 'lockMovementY', 'lockRotation', 'lockScalingX', 'lockScalingY']);\n   * @example <caption>JSON without default values</caption>\n   * canvas.includeDefaultValues = false;\n   * var json = canvas.toJSON();\n   */\n  fabric.StaticCanvas.prototype.toJSON = fabric.StaticCanvas.prototype.toObject;\n\n  if (fabric.isLikelyNode) {\n    fabric.StaticCanvas.prototype.createPNGStream = function() {\n      var impl = getNodeCanvas(this.lowerCanvasEl);\n      return impl && impl.createPNGStream();\n    };\n    fabric.StaticCanvas.prototype.createJPEGStream = function(opts) {\n      var impl = getNodeCanvas(this.lowerCanvasEl);\n      return impl && impl.createJPEGStream(opts);\n    };\n  }\n})();\n\n\n/**\n * BaseBrush class\n * @class fabric.BaseBrush\n * @see {@link http://fabricjs.com/freedrawing|Freedrawing demo}\n */\nfabric.BaseBrush = fabric.util.createClass(/** @lends fabric.BaseBrush.prototype */ {\n\n  /**\n   * Color of a brush\n   * @type String\n   * @default\n   */\n  color: 'rgb(0, 0, 0)',\n\n  /**\n   * Width of a brush, has to be a Number, no string literals\n   * @type Number\n   * @default\n   */\n  width: 1,\n\n  /**\n   * Shadow object representing shadow of this shape.\n   * <b>Backwards incompatibility note:</b> This property replaces \"shadowColor\" (String), \"shadowOffsetX\" (Number),\n   * \"shadowOffsetY\" (Number) and \"shadowBlur\" (Number) since v1.2.12\n   * @type fabric.Shadow\n   * @default\n   */\n  shadow: null,\n\n  /**\n   * Line endings style of a brush (one of \"butt\", \"round\", \"square\")\n   * @type String\n   * @default\n   */\n  strokeLineCap: 'round',\n\n  /**\n   * Corner style of a brush (one of \"bevel\", \"round\", \"miter\")\n   * @type String\n   * @default\n   */\n  strokeLineJoin: 'round',\n\n  /**\n   * Maximum miter length (used for strokeLineJoin = \"miter\") of a brush's\n   * @type Number\n   * @default\n   */\n  strokeMiterLimit:         10,\n\n  /**\n   * Stroke Dash Array.\n   * @type Array\n   * @default\n   */\n  strokeDashArray: null,\n\n  /**\n   * When `true`, the free drawing is limited to the whiteboard size. Default to false.\n   * @type Boolean\n   * @default false\n  */\n\n  limitedToCanvasSize: false,\n\n\n  /**\n   * Sets brush styles\n   * @private\n   */\n  _setBrushStyles: function() {\n    var ctx = this.canvas.contextTop;\n    ctx.strokeStyle = this.color;\n    ctx.lineWidth = this.width;\n    ctx.lineCap = this.strokeLineCap;\n    ctx.miterLimit = this.strokeMiterLimit;\n    ctx.lineJoin = this.strokeLineJoin;\n    ctx.setLineDash(this.strokeDashArray || []);\n  },\n\n  /**\n   * Sets the transformation on given context\n   * @param {RenderingContext2d} ctx context to render on\n   * @private\n   */\n  _saveAndTransform: function(ctx) {\n    var v = this.canvas.viewportTransform;\n    ctx.save();\n    ctx.transform(v[0], v[1], v[2], v[3], v[4], v[5]);\n  },\n\n  /**\n   * Sets brush shadow styles\n   * @private\n   */\n  _setShadow: function() {\n    if (!this.shadow) {\n      return;\n    }\n\n    var canvas = this.canvas,\n        shadow = this.shadow,\n        ctx = canvas.contextTop,\n        zoom = canvas.getZoom();\n    if (canvas && canvas._isRetinaScaling()) {\n      zoom *= fabric.devicePixelRatio;\n    }\n\n    ctx.shadowColor = shadow.color;\n    ctx.shadowBlur = shadow.blur * zoom;\n    ctx.shadowOffsetX = shadow.offsetX * zoom;\n    ctx.shadowOffsetY = shadow.offsetY * zoom;\n  },\n\n  needsFullRender: function() {\n    var color = new fabric.Color(this.color);\n    return color.getAlpha() < 1 || !!this.shadow;\n  },\n\n  /**\n   * Removes brush shadow styles\n   * @private\n   */\n  _resetShadow: function() {\n    var ctx = this.canvas.contextTop;\n\n    ctx.shadowColor = '';\n    ctx.shadowBlur = ctx.shadowOffsetX = ctx.shadowOffsetY = 0;\n  },\n\n  /**\n   * Check is pointer is outside canvas boundaries\n   * @param {Object} pointer\n   * @private\n  */\n  _isOutSideCanvas: function(pointer) {\n    return pointer.x < 0 || pointer.x > this.canvas.getWidth() || pointer.y < 0 || pointer.y > this.canvas.getHeight();\n  }\n});\n\n\n(function() {\n  /**\n   * PencilBrush class\n   * @class fabric.PencilBrush\n   * @extends fabric.BaseBrush\n   */\n  fabric.PencilBrush = fabric.util.createClass(fabric.BaseBrush, /** @lends fabric.PencilBrush.prototype */ {\n\n    /**\n     * Discard points that are less than `decimate` pixel distant from each other\n     * @type Number\n     * @default 0.4\n     */\n    decimate: 0.4,\n\n    /**\n     * Constructor\n     * @param {fabric.Canvas} canvas\n     * @return {fabric.PencilBrush} Instance of a pencil brush\n     */\n    initialize: function(canvas) {\n      this.canvas = canvas;\n      this._points = [];\n    },\n\n    /**\n     * Invoked inside on mouse down and mouse move\n     * @param {Object} pointer\n     */\n    _drawSegment: function (ctx, p1, p2) {\n      var midPoint = p1.midPointFrom(p2);\n      ctx.quadraticCurveTo(p1.x, p1.y, midPoint.x, midPoint.y);\n      return midPoint;\n    },\n\n    /**\n     * Invoked on mouse down\n     * @param {Object} pointer\n     */\n    onMouseDown: function(pointer, options) {\n      if (!this.canvas._isMainEvent(options.e)) {\n        return;\n      }\n      this._prepareForDrawing(pointer);\n      // capture coordinates immediately\n      // this allows to draw dots (when movement never occurs)\n      this._captureDrawingPath(pointer);\n      this._render();\n    },\n\n    /**\n     * Invoked on mouse move\n     * @param {Object} pointer\n     */\n    onMouseMove: function(pointer, options) {\n      if (!this.canvas._isMainEvent(options.e)) {\n        return;\n      }\n      if (this.limitedToCanvasSize === true && this._isOutSideCanvas(pointer)) {\n        return;\n      }\n      if (this._captureDrawingPath(pointer) && this._points.length > 1) {\n        if (this.needsFullRender()) {\n          // redraw curve\n          // clear top canvas\n          this.canvas.clearContext(this.canvas.contextTop);\n          this._render();\n        }\n        else {\n          var points = this._points, length = points.length, ctx = this.canvas.contextTop;\n          // draw the curve update\n          this._saveAndTransform(ctx);\n          if (this.oldEnd) {\n            ctx.beginPath();\n            ctx.moveTo(this.oldEnd.x, this.oldEnd.y);\n          }\n          this.oldEnd = this._drawSegment(ctx, points[length - 2], points[length - 1], true);\n          ctx.stroke();\n          ctx.restore();\n        }\n      }\n    },\n\n    /**\n     * Invoked on mouse up\n     */\n    onMouseUp: function(options) {\n      if (!this.canvas._isMainEvent(options.e)) {\n        return true;\n      }\n      this.oldEnd = undefined;\n      this._finalizeAndAddPath();\n      return false;\n    },\n\n    /**\n     * @private\n     * @param {Object} pointer Actual mouse position related to the canvas.\n     */\n    _prepareForDrawing: function(pointer) {\n\n      var p = new fabric.Point(pointer.x, pointer.y);\n\n      this._reset();\n      this._addPoint(p);\n      this.canvas.contextTop.moveTo(p.x, p.y);\n    },\n\n    /**\n     * @private\n     * @param {fabric.Point} point Point to be added to points array\n     */\n    _addPoint: function(point) {\n      if (this._points.length > 1 && point.eq(this._points[this._points.length - 1])) {\n        return false;\n      }\n      this._points.push(point);\n      return true;\n    },\n\n    /**\n     * Clear points array and set contextTop canvas style.\n     * @private\n     */\n    _reset: function() {\n      this._points = [];\n      this._setBrushStyles();\n      this._setShadow();\n    },\n\n    /**\n     * @private\n     * @param {Object} pointer Actual mouse position related to the canvas.\n     */\n    _captureDrawingPath: function(pointer) {\n      var pointerPoint = new fabric.Point(pointer.x, pointer.y);\n      return this._addPoint(pointerPoint);\n    },\n\n    /**\n     * Draw a smooth path on the topCanvas using quadraticCurveTo\n     * @private\n     */\n    _render: function() {\n      var ctx  = this.canvas.contextTop, i, len,\n          p1 = this._points[0],\n          p2 = this._points[1];\n\n      this._saveAndTransform(ctx);\n      ctx.beginPath();\n      //if we only have 2 points in the path and they are the same\n      //it means that the user only clicked the canvas without moving the mouse\n      //then we should be drawing a dot. A path isn't drawn between two identical dots\n      //that's why we set them apart a bit\n      if (this._points.length === 2 && p1.x === p2.x && p1.y === p2.y) {\n        var width = this.width / 1000;\n        p1 = new fabric.Point(p1.x, p1.y);\n        p2 = new fabric.Point(p2.x, p2.y);\n        p1.x -= width;\n        p2.x += width;\n      }\n      ctx.moveTo(p1.x, p1.y);\n\n      for (i = 1, len = this._points.length; i < len; i++) {\n        // we pick the point between pi + 1 & pi + 2 as the\n        // end point and p1 as our control point.\n        this._drawSegment(ctx, p1, p2);\n        p1 = this._points[i];\n        p2 = this._points[i + 1];\n      }\n      // Draw last line as a straight line while\n      // we wait for the next point to be able to calculate\n      // the bezier control point\n      ctx.lineTo(p1.x, p1.y);\n      ctx.stroke();\n      ctx.restore();\n    },\n\n    /**\n     * Converts points to SVG path\n     * @param {Array} points Array of points\n     * @return {(string|number)[][]} SVG path commands\n     */\n    convertPointsToSVGPath: function (points) {\n      var correction = this.width / 1000;\n      return fabric.util.getSmoothPathFromPoints(points, correction);\n    },\n\n    /**\n     * @private\n     * @param {(string|number)[][]} pathData SVG path commands\n     * @returns {boolean}\n     */\n    _isEmptySVGPath: function (pathData) {\n      var pathString = fabric.util.joinPath(pathData);\n      return pathString === 'M 0 0 Q 0 0 0 0 L 0 0';\n    },\n\n    /**\n     * Creates fabric.Path object to add on canvas\n     * @param {(string|number)[][]} pathData Path data\n     * @return {fabric.Path} Path to add on canvas\n     */\n    createPath: function(pathData) {\n      var path = new fabric.Path(pathData, {\n        fill: null,\n        stroke: this.color,\n        strokeWidth: this.width,\n        strokeLineCap: this.strokeLineCap,\n        strokeMiterLimit: this.strokeMiterLimit,\n        strokeLineJoin: this.strokeLineJoin,\n        strokeDashArray: this.strokeDashArray,\n      });\n      if (this.shadow) {\n        this.shadow.affectStroke = true;\n        path.shadow = new fabric.Shadow(this.shadow);\n      }\n\n      return path;\n    },\n\n    /**\n     * Decimate points array with the decimate value\n     */\n    decimatePoints: function(points, distance) {\n      if (points.length <= 2) {\n        return points;\n      }\n      var zoom = this.canvas.getZoom(), adjustedDistance = Math.pow(distance / zoom, 2),\n          i, l = points.length - 1, lastPoint = points[0], newPoints = [lastPoint],\n          cDistance;\n      for (i = 1; i < l - 1; i++) {\n        cDistance = Math.pow(lastPoint.x - points[i].x, 2) + Math.pow(lastPoint.y - points[i].y, 2);\n        if (cDistance >= adjustedDistance) {\n          lastPoint = points[i];\n          newPoints.push(lastPoint);\n        }\n      }\n      /**\n       * Add the last point from the original line to the end of the array.\n       * This ensures decimate doesn't delete the last point on the line, and ensures the line is > 1 point.\n       */\n      newPoints.push(points[l]);\n      return newPoints;\n    },\n\n    /**\n     * On mouseup after drawing the path on contextTop canvas\n     * we use the points captured to create an new fabric path object\n     * and add it to the fabric canvas.\n     */\n    _finalizeAndAddPath: function() {\n      var ctx = this.canvas.contextTop;\n      ctx.closePath();\n      if (this.decimate) {\n        this._points = this.decimatePoints(this._points, this.decimate);\n      }\n      var pathData = this.convertPointsToSVGPath(this._points);\n      if (this._isEmptySVGPath(pathData)) {\n        // do not create 0 width/height paths, as they are\n        // rendered inconsistently across browsers\n        // Firefox 4, for example, renders a dot,\n        // whereas Chrome 10 renders nothing\n        this.canvas.requestRenderAll();\n        return;\n      }\n\n      var path = this.createPath(pathData);\n      this.canvas.clearContext(this.canvas.contextTop);\n      this.canvas.fire('before:path:created', { path: path });\n      this.canvas.add(path);\n      this.canvas.requestRenderAll();\n      path.setCoords();\n      this._resetShadow();\n\n\n      // fire event 'path' created\n      this.canvas.fire('path:created', { path: path });\n    }\n  });\n})();\n\n\n/**\n * CircleBrush class\n * @class fabric.CircleBrush\n */\nfabric.CircleBrush = fabric.util.createClass(fabric.BaseBrush, /** @lends fabric.CircleBrush.prototype */ {\n\n  /**\n   * Width of a brush\n   * @type Number\n   * @default\n   */\n  width: 10,\n\n  /**\n   * Constructor\n   * @param {fabric.Canvas} canvas\n   * @return {fabric.CircleBrush} Instance of a circle brush\n   */\n  initialize: function(canvas) {\n    this.canvas = canvas;\n    this.points = [];\n  },\n\n  /**\n   * Invoked inside on mouse down and mouse move\n   * @param {Object} pointer\n   */\n  drawDot: function(pointer) {\n    var point = this.addPoint(pointer),\n        ctx = this.canvas.contextTop;\n    this._saveAndTransform(ctx);\n    this.dot(ctx, point);\n    ctx.restore();\n  },\n\n  dot: function(ctx, point) {\n    ctx.fillStyle = point.fill;\n    ctx.beginPath();\n    ctx.arc(point.x, point.y, point.radius, 0, Math.PI * 2, false);\n    ctx.closePath();\n    ctx.fill();\n  },\n\n  /**\n   * Invoked on mouse down\n   */\n  onMouseDown: function(pointer) {\n    this.points.length = 0;\n    this.canvas.clearContext(this.canvas.contextTop);\n    this._setShadow();\n    this.drawDot(pointer);\n  },\n\n  /**\n   * Render the full state of the brush\n   * @private\n   */\n  _render: function() {\n    var ctx  = this.canvas.contextTop, i, len,\n        points = this.points;\n    this._saveAndTransform(ctx);\n    for (i = 0, len = points.length; i < len; i++) {\n      this.dot(ctx, points[i]);\n    }\n    ctx.restore();\n  },\n\n  /**\n   * Invoked on mouse move\n   * @param {Object} pointer\n   */\n  onMouseMove: function(pointer) {\n    if (this.limitedToCanvasSize === true && this._isOutSideCanvas(pointer)) {\n      return;\n    }\n    if (this.needsFullRender()) {\n      this.canvas.clearContext(this.canvas.contextTop);\n      this.addPoint(pointer);\n      this._render();\n    }\n    else {\n      this.drawDot(pointer);\n    }\n  },\n\n  /**\n   * Invoked on mouse up\n   */\n  onMouseUp: function() {\n    var originalRenderOnAddRemove = this.canvas.renderOnAddRemove, i, len;\n    this.canvas.renderOnAddRemove = false;\n\n    var circles = [];\n\n    for (i = 0, len = this.points.length; i < len; i++) {\n      var point = this.points[i],\n          circle = new fabric.Circle({\n            radius: point.radius,\n            left: point.x,\n            top: point.y,\n            originX: 'center',\n            originY: 'center',\n            fill: point.fill\n          });\n\n      this.shadow && (circle.shadow = new fabric.Shadow(this.shadow));\n\n      circles.push(circle);\n    }\n    var group = new fabric.Group(circles);\n    group.canvas = this.canvas;\n\n    this.canvas.fire('before:path:created', { path: group });\n    this.canvas.add(group);\n    this.canvas.fire('path:created', { path: group });\n\n    this.canvas.clearContext(this.canvas.contextTop);\n    this._resetShadow();\n    this.canvas.renderOnAddRemove = originalRenderOnAddRemove;\n    this.canvas.requestRenderAll();\n  },\n\n  /**\n   * @param {Object} pointer\n   * @return {fabric.Point} Just added pointer point\n   */\n  addPoint: function(pointer) {\n    var pointerPoint = new fabric.Point(pointer.x, pointer.y),\n\n        circleRadius = fabric.util.getRandomInt(\n          Math.max(0, this.width - 20), this.width + 20) / 2,\n\n        circleColor = new fabric.Color(this.color)\n          .setAlpha(fabric.util.getRandomInt(0, 100) / 100)\n          .toRgba();\n\n    pointerPoint.radius = circleRadius;\n    pointerPoint.fill = circleColor;\n\n    this.points.push(pointerPoint);\n\n    return pointerPoint;\n  }\n});\n\n\n/**\n * SprayBrush class\n * @class fabric.SprayBrush\n */\nfabric.SprayBrush = fabric.util.createClass( fabric.BaseBrush, /** @lends fabric.SprayBrush.prototype */ {\n\n  /**\n   * Width of a spray\n   * @type Number\n   * @default\n   */\n  width:              10,\n\n  /**\n   * Density of a spray (number of dots per chunk)\n   * @type Number\n   * @default\n   */\n  density:            20,\n\n  /**\n   * Width of spray dots\n   * @type Number\n   * @default\n   */\n  dotWidth:           1,\n\n  /**\n   * Width variance of spray dots\n   * @type Number\n   * @default\n   */\n  dotWidthVariance:   1,\n\n  /**\n   * Whether opacity of a dot should be random\n   * @type Boolean\n   * @default\n   */\n  randomOpacity:        false,\n\n  /**\n   * Whether overlapping dots (rectangles) should be removed (for performance reasons)\n   * @type Boolean\n   * @default\n   */\n  optimizeOverlapping:  true,\n\n  /**\n   * Constructor\n   * @param {fabric.Canvas} canvas\n   * @return {fabric.SprayBrush} Instance of a spray brush\n   */\n  initialize: function(canvas) {\n    this.canvas = canvas;\n    this.sprayChunks = [];\n  },\n\n  /**\n   * Invoked on mouse down\n   * @param {Object} pointer\n   */\n  onMouseDown: function(pointer) {\n    this.sprayChunks.length = 0;\n    this.canvas.clearContext(this.canvas.contextTop);\n    this._setShadow();\n\n    this.addSprayChunk(pointer);\n    this.render(this.sprayChunkPoints);\n  },\n\n  /**\n   * Invoked on mouse move\n   * @param {Object} pointer\n   */\n  onMouseMove: function(pointer) {\n    if (this.limitedToCanvasSize === true && this._isOutSideCanvas(pointer)) {\n      return;\n    }\n    this.addSprayChunk(pointer);\n    this.render(this.sprayChunkPoints);\n  },\n\n  /**\n   * Invoked on mouse up\n   */\n  onMouseUp: function() {\n    var originalRenderOnAddRemove = this.canvas.renderOnAddRemove;\n    this.canvas.renderOnAddRemove = false;\n\n    var rects = [];\n\n    for (var i = 0, ilen = this.sprayChunks.length; i < ilen; i++) {\n      var sprayChunk = this.sprayChunks[i];\n\n      for (var j = 0, jlen = sprayChunk.length; j < jlen; j++) {\n\n        var rect = new fabric.Rect({\n          width: sprayChunk[j].width,\n          height: sprayChunk[j].width,\n          left: sprayChunk[j].x + 1,\n          top: sprayChunk[j].y + 1,\n          originX: 'center',\n          originY: 'center',\n          fill: this.color\n        });\n        rects.push(rect);\n      }\n    }\n\n    if (this.optimizeOverlapping) {\n      rects = this._getOptimizedRects(rects);\n    }\n\n    var group = new fabric.Group(rects);\n    this.shadow && group.set('shadow', new fabric.Shadow(this.shadow));\n    this.canvas.fire('before:path:created', { path: group });\n    this.canvas.add(group);\n    this.canvas.fire('path:created', { path: group });\n\n    this.canvas.clearContext(this.canvas.contextTop);\n    this._resetShadow();\n    this.canvas.renderOnAddRemove = originalRenderOnAddRemove;\n    this.canvas.requestRenderAll();\n  },\n\n  /**\n   * @private\n   * @param {Array} rects\n   */\n  _getOptimizedRects: function(rects) {\n\n    // avoid creating duplicate rects at the same coordinates\n    var uniqueRects = { }, key, i, len;\n\n    for (i = 0, len = rects.length; i < len; i++) {\n      key = rects[i].left + '' + rects[i].top;\n      if (!uniqueRects[key]) {\n        uniqueRects[key] = rects[i];\n      }\n    }\n    var uniqueRectsArray = [];\n    for (key in uniqueRects) {\n      uniqueRectsArray.push(uniqueRects[key]);\n    }\n\n    return uniqueRectsArray;\n  },\n\n  /**\n   * Render new chunk of spray brush\n   */\n  render: function(sprayChunk) {\n    var ctx = this.canvas.contextTop, i, len;\n    ctx.fillStyle = this.color;\n\n    this._saveAndTransform(ctx);\n\n    for (i = 0, len = sprayChunk.length; i < len; i++) {\n      var point = sprayChunk[i];\n      if (typeof point.opacity !== 'undefined') {\n        ctx.globalAlpha = point.opacity;\n      }\n      ctx.fillRect(point.x, point.y, point.width, point.width);\n    }\n    ctx.restore();\n  },\n\n  /**\n   * Render all spray chunks\n   */\n  _render: function() {\n    var ctx = this.canvas.contextTop, i, ilen;\n    ctx.fillStyle = this.color;\n\n    this._saveAndTransform(ctx);\n\n    for (i = 0, ilen = this.sprayChunks.length; i < ilen; i++) {\n      this.render(this.sprayChunks[i]);\n    }\n    ctx.restore();\n  },\n\n  /**\n   * @param {Object} pointer\n   */\n  addSprayChunk: function(pointer) {\n    this.sprayChunkPoints = [];\n\n    var x, y, width, radius = this.width / 2, i;\n\n    for (i = 0; i < this.density; i++) {\n\n      x = fabric.util.getRandomInt(pointer.x - radius, pointer.x + radius);\n      y = fabric.util.getRandomInt(pointer.y - radius, pointer.y + radius);\n\n      if (this.dotWidthVariance) {\n        width = fabric.util.getRandomInt(\n          // bottom clamp width to 1\n          Math.max(1, this.dotWidth - this.dotWidthVariance),\n          this.dotWidth + this.dotWidthVariance);\n      }\n      else {\n        width = this.dotWidth;\n      }\n\n      var point = new fabric.Point(x, y);\n      point.width = width;\n\n      if (this.randomOpacity) {\n        point.opacity = fabric.util.getRandomInt(0, 100) / 100;\n      }\n\n      this.sprayChunkPoints.push(point);\n    }\n\n    this.sprayChunks.push(this.sprayChunkPoints);\n  }\n});\n\n\n/**\n * PatternBrush class\n * @class fabric.PatternBrush\n * @extends fabric.BaseBrush\n */\nfabric.PatternBrush = fabric.util.createClass(fabric.PencilBrush, /** @lends fabric.PatternBrush.prototype */ {\n\n  getPatternSrc: function() {\n\n    var dotWidth = 20,\n        dotDistance = 5,\n        patternCanvas = fabric.util.createCanvasElement(),\n        patternCtx = patternCanvas.getContext('2d');\n\n    patternCanvas.width = patternCanvas.height = dotWidth + dotDistance;\n\n    patternCtx.fillStyle = this.color;\n    patternCtx.beginPath();\n    patternCtx.arc(dotWidth / 2, dotWidth / 2, dotWidth / 2, 0, Math.PI * 2, false);\n    patternCtx.closePath();\n    patternCtx.fill();\n\n    return patternCanvas;\n  },\n\n  getPatternSrcFunction: function() {\n    return String(this.getPatternSrc).replace('this.color', '\"' + this.color + '\"');\n  },\n\n  /**\n   * Creates \"pattern\" instance property\n   */\n  getPattern: function() {\n    return this.canvas.contextTop.createPattern(this.source || this.getPatternSrc(), 'repeat');\n  },\n\n  /**\n   * Sets brush styles\n   */\n  _setBrushStyles: function() {\n    this.callSuper('_setBrushStyles');\n    this.canvas.contextTop.strokeStyle = this.getPattern();\n  },\n\n  /**\n   * Creates path\n   */\n  createPath: function(pathData) {\n    var path = this.callSuper('createPath', pathData),\n        topLeft = path._getLeftTopCoords().scalarAdd(path.strokeWidth / 2);\n\n    path.stroke = new fabric.Pattern({\n      source: this.source || this.getPatternSrcFunction(),\n      offsetX: -topLeft.x,\n      offsetY: -topLeft.y\n    });\n    return path;\n  }\n});\n\n\n(function() {\n\n  var getPointer = fabric.util.getPointer,\n      degreesToRadians = fabric.util.degreesToRadians,\n      isTouchEvent = fabric.util.isTouchEvent;\n\n  /**\n   * Canvas class\n   * @class fabric.Canvas\n   * @extends fabric.StaticCanvas\n   * @tutorial {@link http://fabricjs.com/fabric-intro-part-1#canvas}\n   * @see {@link fabric.Canvas#initialize} for constructor definition\n   *\n   * @fires object:modified at the end of a transform or any change when statefull is true\n   * @fires object:rotating while an object is being rotated from the control\n   * @fires object:scaling while an object is being scaled by controls\n   * @fires object:moving while an object is being dragged\n   * @fires object:skewing while an object is being skewed from the controls\n   *\n   * @fires before:transform before a transform is is started\n   * @fires before:selection:cleared\n   * @fires selection:cleared\n   * @fires selection:updated\n   * @fires selection:created\n   *\n   * @fires path:created after a drawing operation ends and the path is added\n   * @fires mouse:down\n   * @fires mouse:move\n   * @fires mouse:up\n   * @fires mouse:down:before  on mouse down, before the inner fabric logic runs\n   * @fires mouse:move:before on mouse move, before the inner fabric logic runs\n   * @fires mouse:up:before on mouse up, before the inner fabric logic runs\n   * @fires mouse:over\n   * @fires mouse:out\n   * @fires mouse:dblclick whenever a native dbl click event fires on the canvas.\n   *\n   * @fires dragover\n   * @fires dragenter\n   * @fires dragleave\n   * @fires drop\n   * @fires after:render at the end of the render process, receives the context in the callback\n   * @fires before:render at start the render process, receives the context in the callback\n   *\n   * the following events are deprecated:\n   * @fires object:rotated at the end of a rotation transform\n   * @fires object:scaled at the end of a scale transform\n   * @fires object:moved at the end of translation transform\n   * @fires object:skewed at the end of a skew transform\n   */\n  fabric.Canvas = fabric.util.createClass(fabric.StaticCanvas, /** @lends fabric.Canvas.prototype */ {\n\n    /**\n     * Constructor\n     * @param {HTMLElement | String} el &lt;canvas> element to initialize instance on\n     * @param {Object} [options] Options object\n     * @return {Object} thisArg\n     */\n    initialize: function(el, options) {\n      options || (options = { });\n      this.renderAndResetBound = this.renderAndReset.bind(this);\n      this.requestRenderAllBound = this.requestRenderAll.bind(this);\n      this._initStatic(el, options);\n      this._initInteractive();\n      this._createCacheCanvas();\n    },\n\n    /**\n     * When true, objects can be transformed by one side (unproportionally)\n     * when dragged on the corners that normally would not do that.\n     * @type Boolean\n     * @default\n     * @since fabric 4.0 // changed name and default value\n     */\n    uniformScaling:      true,\n\n    /**\n     * Indicates which key switches uniform scaling.\n     * values: 'altKey', 'shiftKey', 'ctrlKey'.\n     * If `null` or 'none' or any other string that is not a modifier key\n     * feature is disabled.\n     * totally wrong named. this sounds like `uniform scaling`\n     * if Canvas.uniformScaling is true, pressing this will set it to false\n     * and viceversa.\n     * @since 1.6.2\n     * @type String\n     * @default\n     */\n    uniScaleKey:           'shiftKey',\n\n    /**\n     * When true, objects use center point as the origin of scale transformation.\n     * <b>Backwards incompatibility note:</b> This property replaces \"centerTransform\" (Boolean).\n     * @since 1.3.4\n     * @type Boolean\n     * @default\n     */\n    centeredScaling:        false,\n\n    /**\n     * When true, objects use center point as the origin of rotate transformation.\n     * <b>Backwards incompatibility note:</b> This property replaces \"centerTransform\" (Boolean).\n     * @since 1.3.4\n     * @type Boolean\n     * @default\n     */\n    centeredRotation:       false,\n\n    /**\n     * Indicates which key enable centered Transform\n     * values: 'altKey', 'shiftKey', 'ctrlKey'.\n     * If `null` or 'none' or any other string that is not a modifier key\n     * feature is disabled feature disabled.\n     * @since 1.6.2\n     * @type String\n     * @default\n     */\n    centeredKey:           'altKey',\n\n    /**\n     * Indicates which key enable alternate action on corner\n     * values: 'altKey', 'shiftKey', 'ctrlKey'.\n     * If `null` or 'none' or any other string that is not a modifier key\n     * feature is disabled feature disabled.\n     * @since 1.6.2\n     * @type String\n     * @default\n     */\n    altActionKey:           'shiftKey',\n\n    /**\n     * Indicates that canvas is interactive. This property should not be changed.\n     * @type Boolean\n     * @default\n     */\n    interactive:            true,\n\n    /**\n     * Indicates whether group selection should be enabled\n     * @type Boolean\n     * @default\n     */\n    selection:              true,\n\n    /**\n     * Indicates which key or keys enable multiple click selection\n     * Pass value as a string or array of strings\n     * values: 'altKey', 'shiftKey', 'ctrlKey'.\n     * If `null` or empty or containing any other string that is not a modifier key\n     * feature is disabled.\n     * @since 1.6.2\n     * @type String|Array\n     * @default\n     */\n    selectionKey:           'shiftKey',\n\n    /**\n     * Indicates which key enable alternative selection\n     * in case of target overlapping with active object\n     * values: 'altKey', 'shiftKey', 'ctrlKey'.\n     * For a series of reason that come from the general expectations on how\n     * things should work, this feature works only for preserveObjectStacking true.\n     * If `null` or 'none' or any other string that is not a modifier key\n     * feature is disabled.\n     * @since 1.6.5\n     * @type null|String\n     * @default\n     */\n    altSelectionKey:           null,\n\n    /**\n     * Color of selection\n     * @type String\n     * @default\n     */\n    selectionColor:         'rgba(100, 100, 255, 0.3)', // blue\n\n    /**\n     * Default dash array pattern\n     * If not empty the selection border is dashed\n     * @type Array\n     */\n    selectionDashArray:     [],\n\n    /**\n     * Color of the border of selection (usually slightly darker than color of selection itself)\n     * @type String\n     * @default\n     */\n    selectionBorderColor:   'rgba(255, 255, 255, 0.3)',\n\n    /**\n     * Width of a line used in object/group selection\n     * @type Number\n     * @default\n     */\n    selectionLineWidth:     1,\n\n    /**\n     * Select only shapes that are fully contained in the dragged selection rectangle.\n     * @type Boolean\n     * @default\n     */\n    selectionFullyContained: false,\n\n    /**\n     * Default cursor value used when hovering over an object on canvas\n     * @type String\n     * @default\n     */\n    hoverCursor:            'move',\n\n    /**\n     * Default cursor value used when moving an object on canvas\n     * @type String\n     * @default\n     */\n    moveCursor:             'move',\n\n    /**\n     * Default cursor value used for the entire canvas\n     * @type String\n     * @default\n     */\n    defaultCursor:          'default',\n\n    /**\n     * Cursor value used during free drawing\n     * @type String\n     * @default\n     */\n    freeDrawingCursor:      'crosshair',\n\n    /**\n     * Cursor value used for rotation point\n     * @type String\n     * @default\n     */\n    rotationCursor:         'crosshair',\n\n    /**\n     * Cursor value used for disabled elements ( corners with disabled action )\n     * @type String\n     * @since 2.0.0\n     * @default\n     */\n    notAllowedCursor:         'not-allowed',\n\n    /**\n     * Default element class that's given to wrapper (div) element of canvas\n     * @type String\n     * @default\n     */\n    containerClass:         'canvas-container',\n\n    /**\n     * When true, object detection happens on per-pixel basis rather than on per-bounding-box\n     * @type Boolean\n     * @default\n     */\n    perPixelTargetFind:     false,\n\n    /**\n     * Number of pixels around target pixel to tolerate (consider active) during object detection\n     * @type Number\n     * @default\n     */\n    targetFindTolerance:    0,\n\n    /**\n     * When true, target detection is skipped. Target detection will return always undefined.\n     * click selection won't work anymore, events will fire with no targets.\n     * if something is selected before setting it to true, it will be deselected at the first click.\n     * area selection will still work. check the `selection` property too.\n     * if you deactivate both, you should look into staticCanvas.\n     * @type Boolean\n     * @default\n     */\n    skipTargetFind:         false,\n\n    /**\n     * When true, mouse events on canvas (mousedown/mousemove/mouseup) result in free drawing.\n     * After mousedown, mousemove creates a shape,\n     * and then mouseup finalizes it and adds an instance of `fabric.Path` onto canvas.\n     * @tutorial {@link http://fabricjs.com/fabric-intro-part-4#free_drawing}\n     * @type Boolean\n     * @default\n     */\n    isDrawingMode:          false,\n\n    /**\n     * Indicates whether objects should remain in current stack position when selected.\n     * When false objects are brought to top and rendered as part of the selection group\n     * @type Boolean\n     * @default\n     */\n    preserveObjectStacking: false,\n\n    /**\n     * Indicates the angle that an object will lock to while rotating.\n     * @type Number\n     * @since 1.6.7\n     * @default\n     */\n    snapAngle: 0,\n\n    /**\n     * Indicates the distance from the snapAngle the rotation will lock to the snapAngle.\n     * When `null`, the snapThreshold will default to the snapAngle.\n     * @type null|Number\n     * @since 1.6.7\n     * @default\n     */\n    snapThreshold: null,\n\n    /**\n     * Indicates if the right click on canvas can output the context menu or not\n     * @type Boolean\n     * @since 1.6.5\n     * @default\n     */\n    stopContextMenu: false,\n\n    /**\n     * Indicates if the canvas can fire right click events\n     * @type Boolean\n     * @since 1.6.5\n     * @default\n     */\n    fireRightClick: false,\n\n    /**\n     * Indicates if the canvas can fire middle click events\n     * @type Boolean\n     * @since 1.7.8\n     * @default\n     */\n    fireMiddleClick: false,\n\n    /**\n     * Keep track of the subTargets for Mouse Events\n     * @type fabric.Object[]\n     */\n    targets: [],\n\n    /**\n     * Keep track of the hovered target\n     * @type fabric.Object\n     * @private\n     */\n    _hoveredTarget: null,\n\n    /**\n     * hold the list of nested targets hovered\n     * @type fabric.Object[]\n     * @private\n     */\n    _hoveredTargets: [],\n\n    /**\n     * @private\n     */\n    _initInteractive: function() {\n      this._currentTransform = null;\n      this._groupSelector = null;\n      this._initWrapperElement();\n      this._createUpperCanvas();\n      this._initEventListeners();\n\n      this._initRetinaScaling();\n\n      this.freeDrawingBrush = fabric.PencilBrush && new fabric.PencilBrush(this);\n\n      this.calcOffset();\n    },\n\n    /**\n     * Divides objects in two groups, one to render immediately\n     * and one to render as activeGroup.\n     * @return {Array} objects to render immediately and pushes the other in the activeGroup.\n     */\n    _chooseObjectsToRender: function() {\n      var activeObjects = this.getActiveObjects(),\n          object, objsToRender, activeGroupObjects;\n\n      if (activeObjects.length > 0 && !this.preserveObjectStacking) {\n        objsToRender = [];\n        activeGroupObjects = [];\n        for (var i = 0, length = this._objects.length; i < length; i++) {\n          object = this._objects[i];\n          if (activeObjects.indexOf(object) === -1 ) {\n            objsToRender.push(object);\n          }\n          else {\n            activeGroupObjects.push(object);\n          }\n        }\n        if (activeObjects.length > 1) {\n          this._activeObject._objects = activeGroupObjects;\n        }\n        objsToRender.push.apply(objsToRender, activeGroupObjects);\n      }\n      else {\n        objsToRender = this._objects;\n      }\n      return objsToRender;\n    },\n\n    /**\n     * Renders both the top canvas and the secondary container canvas.\n     * @return {fabric.Canvas} instance\n     * @chainable\n     */\n    renderAll: function () {\n      if (this.contextTopDirty && !this._groupSelector && !this.isDrawingMode) {\n        this.clearContext(this.contextTop);\n        this.contextTopDirty = false;\n      }\n      if (this.hasLostContext) {\n        this.renderTopLayer(this.contextTop);\n      }\n      var canvasToDrawOn = this.contextContainer;\n      this.renderCanvas(canvasToDrawOn, this._chooseObjectsToRender());\n      return this;\n    },\n\n    renderTopLayer: function(ctx) {\n      ctx.save();\n      if (this.isDrawingMode && this._isCurrentlyDrawing) {\n        this.freeDrawingBrush && this.freeDrawingBrush._render();\n        this.contextTopDirty = true;\n      }\n      // we render the top context - last object\n      if (this.selection && this._groupSelector) {\n        this._drawSelection(ctx);\n        this.contextTopDirty = true;\n      }\n      ctx.restore();\n    },\n\n    /**\n     * Method to render only the top canvas.\n     * Also used to render the group selection box.\n     * @return {fabric.Canvas} thisArg\n     * @chainable\n     */\n    renderTop: function () {\n      var ctx = this.contextTop;\n      this.clearContext(ctx);\n      this.renderTopLayer(ctx);\n      this.fire('after:render');\n      return this;\n    },\n\n    /**\n     * @private\n     */\n    _normalizePointer: function (object, pointer) {\n      var m = object.calcTransformMatrix(),\n          invertedM = fabric.util.invertTransform(m),\n          vptPointer = this.restorePointerVpt(pointer);\n      return fabric.util.transformPoint(vptPointer, invertedM);\n    },\n\n    /**\n     * Returns true if object is transparent at a certain location\n     * @param {fabric.Object} target Object to check\n     * @param {Number} x Left coordinate\n     * @param {Number} y Top coordinate\n     * @return {Boolean}\n     */\n    isTargetTransparent: function (target, x, y) {\n      // in case the target is the activeObject, we cannot execute this optimization\n      // because we need to draw controls too.\n      if (target.shouldCache() && target._cacheCanvas && target !== this._activeObject) {\n        var normalizedPointer = this._normalizePointer(target, {x: x, y: y}),\n            targetRelativeX = Math.max(target.cacheTranslationX + (normalizedPointer.x * target.zoomX), 0),\n            targetRelativeY = Math.max(target.cacheTranslationY + (normalizedPointer.y * target.zoomY), 0);\n\n        var isTransparent = fabric.util.isTransparent(\n          target._cacheContext, Math.round(targetRelativeX), Math.round(targetRelativeY), this.targetFindTolerance);\n\n        return isTransparent;\n      }\n\n      var ctx = this.contextCache,\n          originalColor = target.selectionBackgroundColor, v = this.viewportTransform;\n\n      target.selectionBackgroundColor = '';\n\n      this.clearContext(ctx);\n\n      ctx.save();\n      ctx.transform(v[0], v[1], v[2], v[3], v[4], v[5]);\n      target.render(ctx);\n      ctx.restore();\n\n      target.selectionBackgroundColor = originalColor;\n\n      var isTransparent = fabric.util.isTransparent(\n        ctx, x, y, this.targetFindTolerance);\n\n      return isTransparent;\n    },\n\n    /**\n     * takes an event and determines if selection key has been pressed\n     * @private\n     * @param {Event} e Event object\n     */\n    _isSelectionKeyPressed: function(e) {\n      var selectionKeyPressed = false;\n\n      if (Object.prototype.toString.call(this.selectionKey) === '[object Array]') {\n        selectionKeyPressed = !!this.selectionKey.find(function(key) { return e[key] === true; });\n      }\n      else {\n        selectionKeyPressed = e[this.selectionKey];\n      }\n\n      return selectionKeyPressed;\n    },\n\n    /**\n     * @private\n     * @param {Event} e Event object\n     * @param {fabric.Object} target\n     */\n    _shouldClearSelection: function (e, target) {\n      var activeObjects = this.getActiveObjects(),\n          activeObject = this._activeObject;\n\n      return (\n        !target\n        ||\n        (target &&\n          activeObject &&\n          activeObjects.length > 1 &&\n          activeObjects.indexOf(target) === -1 &&\n          activeObject !== target &&\n          !this._isSelectionKeyPressed(e))\n        ||\n        (target && !target.evented)\n        ||\n        (target &&\n          !target.selectable &&\n          activeObject &&\n          activeObject !== target)\n      );\n    },\n\n    /**\n     * centeredScaling from object can't override centeredScaling from canvas.\n     * this should be fixed, since object setting should take precedence over canvas.\n     * also this should be something that will be migrated in the control properties.\n     * as ability to define the origin of the transformation that the control provide.\n     * @private\n     * @param {fabric.Object} target\n     * @param {String} action\n     * @param {Boolean} altKey\n     */\n    _shouldCenterTransform: function (target, action, altKey) {\n      if (!target) {\n        return;\n      }\n\n      var centerTransform;\n\n      if (action === 'scale' || action === 'scaleX' || action === 'scaleY' || action === 'resizing') {\n        centerTransform = this.centeredScaling || target.centeredScaling;\n      }\n      else if (action === 'rotate') {\n        centerTransform = this.centeredRotation || target.centeredRotation;\n      }\n\n      return centerTransform ? !altKey : altKey;\n    },\n\n    /**\n     * should disappear before release 4.0\n     * @private\n     */\n    _getOriginFromCorner: function(target, corner) {\n      var origin = {\n        x: target.originX,\n        y: target.originY\n      };\n\n      if (corner === 'ml' || corner === 'tl' || corner === 'bl') {\n        origin.x = 'right';\n      }\n      else if (corner === 'mr' || corner === 'tr' || corner === 'br') {\n        origin.x = 'left';\n      }\n\n      if (corner === 'tl' || corner === 'mt' || corner === 'tr') {\n        origin.y = 'bottom';\n      }\n      else if (corner === 'bl' || corner === 'mb' || corner === 'br') {\n        origin.y = 'top';\n      }\n      return origin;\n    },\n\n    /**\n     * @private\n     * @param {Boolean} alreadySelected true if target is already selected\n     * @param {String} corner a string representing the corner ml, mr, tl ...\n     * @param {Event} e Event object\n     * @param {fabric.Object} [target] inserted back to help overriding. Unused\n     */\n    _getActionFromCorner: function(alreadySelected, corner, e, target) {\n      if (!corner || !alreadySelected) {\n        return 'drag';\n      }\n      var control = target.controls[corner];\n      return control.getActionName(e, control, target);\n    },\n\n    /**\n     * @private\n     * @param {Event} e Event object\n     * @param {fabric.Object} target\n     */\n    _setupCurrentTransform: function (e, target, alreadySelected) {\n      if (!target) {\n        return;\n      }\n\n      var pointer = this.getPointer(e), corner = target.__corner,\n          control = target.controls[corner],\n          actionHandler = (alreadySelected && corner) ?\n            control.getActionHandler(e, target, control) : fabric.controlsUtils.dragHandler,\n          action = this._getActionFromCorner(alreadySelected, corner, e, target),\n          origin = this._getOriginFromCorner(target, corner),\n          altKey = e[this.centeredKey],\n          transform = {\n            target: target,\n            action: action,\n            actionHandler: actionHandler,\n            corner: corner,\n            scaleX: target.scaleX,\n            scaleY: target.scaleY,\n            skewX: target.skewX,\n            skewY: target.skewY,\n            // used by transation\n            offsetX: pointer.x - target.left,\n            offsetY: pointer.y - target.top,\n            originX: origin.x,\n            originY: origin.y,\n            ex: pointer.x,\n            ey: pointer.y,\n            lastX: pointer.x,\n            lastY: pointer.y,\n            // unsure they are useful anymore.\n            // left: target.left,\n            // top: target.top,\n            theta: degreesToRadians(target.angle),\n            // end of unsure\n            width: target.width * target.scaleX,\n            shiftKey: e.shiftKey,\n            altKey: altKey,\n            original: fabric.util.saveObjectTransform(target),\n          };\n\n      if (this._shouldCenterTransform(target, action, altKey)) {\n        transform.originX = 'center';\n        transform.originY = 'center';\n      }\n      transform.original.originX = origin.x;\n      transform.original.originY = origin.y;\n      this._currentTransform = transform;\n      this._beforeTransform(e);\n    },\n\n    /**\n     * Set the cursor type of the canvas element\n     * @param {String} value Cursor type of the canvas element.\n     * @see http://www.w3.org/TR/css3-ui/#cursor\n     */\n    setCursor: function (value) {\n      this.upperCanvasEl.style.cursor = value;\n    },\n\n    /**\n     * @private\n     * @param {CanvasRenderingContext2D} ctx to draw the selection on\n     */\n    _drawSelection: function (ctx) {\n      var selector = this._groupSelector,\n          viewportStart = new fabric.Point(selector.ex, selector.ey),\n          start = fabric.util.transformPoint(viewportStart, this.viewportTransform),\n          viewportExtent = new fabric.Point(selector.ex + selector.left, selector.ey + selector.top),\n          extent = fabric.util.transformPoint(viewportExtent, this.viewportTransform),\n          minX = Math.min(start.x, extent.x),\n          minY = Math.min(start.y, extent.y),\n          maxX = Math.max(start.x, extent.x),\n          maxY = Math.max(start.y, extent.y),\n          strokeOffset = this.selectionLineWidth / 2;\n\n      if (this.selectionColor) {\n        ctx.fillStyle = this.selectionColor;\n        ctx.fillRect(minX, minY, maxX - minX, maxY - minY);\n      }\n\n      if (!this.selectionLineWidth || !this.selectionBorderColor) {\n        return;\n      }\n      ctx.lineWidth = this.selectionLineWidth;\n      ctx.strokeStyle = this.selectionBorderColor;\n\n      minX += strokeOffset;\n      minY += strokeOffset;\n      maxX -= strokeOffset;\n      maxY -= strokeOffset;\n      // selection border\n      fabric.Object.prototype._setLineDash.call(this, ctx, this.selectionDashArray);\n      ctx.strokeRect(minX, minY, maxX - minX, maxY - minY);\n    },\n\n    /**\n     * Method that determines what object we are clicking on\n     * the skipGroup parameter is for internal use, is needed for shift+click action\n     * 11/09/2018 TODO: would be cool if findTarget could discern between being a full target\n     * or the outside part of the corner.\n     * @param {Event} e mouse event\n     * @param {Boolean} skipGroup when true, activeGroup is skipped and only objects are traversed through\n     * @return {fabric.Object} the target found\n     */\n    findTarget: function (e, skipGroup) {\n      if (this.skipTargetFind) {\n        return;\n      }\n\n      var ignoreZoom = true,\n          pointer = this.getPointer(e, ignoreZoom),\n          activeObject = this._activeObject,\n          aObjects = this.getActiveObjects(),\n          activeTarget, activeTargetSubs,\n          isTouch = isTouchEvent(e),\n          shouldLookForActive = (aObjects.length > 1 && !skipGroup) || aObjects.length === 1;\n\n      // first check current group (if one exists)\n      // active group does not check sub targets like normal groups.\n      // if active group just exits.\n      this.targets = [];\n\n      // if we hit the corner of an activeObject, let's return that.\n      if (shouldLookForActive && activeObject._findTargetCorner(pointer, isTouch)) {\n        return activeObject;\n      }\n      if (aObjects.length > 1 && !skipGroup && activeObject === this._searchPossibleTargets([activeObject], pointer)) {\n        return activeObject;\n      }\n      if (aObjects.length === 1 &&\n        activeObject === this._searchPossibleTargets([activeObject], pointer)) {\n        if (!this.preserveObjectStacking) {\n          return activeObject;\n        }\n        else {\n          activeTarget = activeObject;\n          activeTargetSubs = this.targets;\n          this.targets = [];\n        }\n      }\n      var target = this._searchPossibleTargets(this._objects, pointer);\n      if (e[this.altSelectionKey] && target && activeTarget && target !== activeTarget) {\n        target = activeTarget;\n        this.targets = activeTargetSubs;\n      }\n      return target;\n    },\n\n    /**\n     * Checks point is inside the object.\n     * @param {Object} [pointer] x,y object of point coordinates we want to check.\n     * @param {fabric.Object} obj Object to test against\n     * @param {Object} [globalPointer] x,y object of point coordinates relative to canvas used to search per pixel target.\n     * @return {Boolean} true if point is contained within an area of given object\n     * @private\n     */\n    _checkTarget: function(pointer, obj, globalPointer) {\n      if (obj &&\n          obj.visible &&\n          obj.evented &&\n          // http://www.geog.ubc.ca/courses/klink/gis.notes/ncgia/u32.html\n          // http://idav.ucdavis.edu/~okreylos/TAship/Spring2000/PointInPolygon.html\n          obj.containsPoint(pointer)\n      ) {\n        if ((this.perPixelTargetFind || obj.perPixelTargetFind) && !obj.isEditing) {\n          var isTransparent = this.isTargetTransparent(obj, globalPointer.x, globalPointer.y);\n          if (!isTransparent) {\n            return true;\n          }\n        }\n        else {\n          return true;\n        }\n      }\n    },\n\n    /**\n     * Function used to search inside objects an object that contains pointer in bounding box or that contains pointerOnCanvas when painted\n     * @param {Array} [objects] objects array to look into\n     * @param {Object} [pointer] x,y object of point coordinates we want to check.\n     * @return {fabric.Object} object that contains pointer\n     * @private\n     */\n    _searchPossibleTargets: function(objects, pointer) {\n      // Cache all targets where their bounding box contains point.\n      var target, i = objects.length, subTarget;\n      // Do not check for currently grouped objects, since we check the parent group itself.\n      // until we call this function specifically to search inside the activeGroup\n      while (i--) {\n        var objToCheck = objects[i];\n        var pointerToUse = objToCheck.group ?\n          this._normalizePointer(objToCheck.group, pointer) : pointer;\n        if (this._checkTarget(pointerToUse, objToCheck, pointer)) {\n          target = objects[i];\n          if (target.subTargetCheck && target instanceof fabric.Group) {\n            subTarget = this._searchPossibleTargets(target._objects, pointer);\n            subTarget && this.targets.push(subTarget);\n          }\n          break;\n        }\n      }\n      return target;\n    },\n\n    /**\n     * Returns pointer coordinates without the effect of the viewport\n     * @param {Object} pointer with \"x\" and \"y\" number values\n     * @return {Object} object with \"x\" and \"y\" number values\n     */\n    restorePointerVpt: function(pointer) {\n      return fabric.util.transformPoint(\n        pointer,\n        fabric.util.invertTransform(this.viewportTransform)\n      );\n    },\n\n    /**\n     * Returns pointer coordinates relative to canvas.\n     * Can return coordinates with or without viewportTransform.\n     * ignoreZoom false gives back coordinates that represent\n     * the point clicked on canvas element.\n     * ignoreZoom true gives back coordinates after being processed\n     * by the viewportTransform ( sort of coordinates of what is displayed\n     * on the canvas where you are clicking.\n     * ignoreZoom true = HTMLElement coordinates relative to top,left\n     * ignoreZoom false, default = fabric space coordinates, the same used for shape position\n     * To interact with your shapes top and left you want to use ignoreZoom true\n     * most of the time, while ignoreZoom false will give you coordinates\n     * compatible with the object.oCoords system.\n     * of the time.\n     * @param {Event} e\n     * @param {Boolean} ignoreZoom\n     * @return {Object} object with \"x\" and \"y\" number values\n     */\n    getPointer: function (e, ignoreZoom) {\n      // return cached values if we are in the event processing chain\n      if (this._absolutePointer && !ignoreZoom) {\n        return this._absolutePointer;\n      }\n      if (this._pointer && ignoreZoom) {\n        return this._pointer;\n      }\n\n      var pointer = getPointer(e),\n          upperCanvasEl = this.upperCanvasEl,\n          bounds = upperCanvasEl.getBoundingClientRect(),\n          boundsWidth = bounds.width || 0,\n          boundsHeight = bounds.height || 0,\n          cssScale;\n\n      if (!boundsWidth || !boundsHeight ) {\n        if ('top' in bounds && 'bottom' in bounds) {\n          boundsHeight = Math.abs( bounds.top - bounds.bottom );\n        }\n        if ('right' in bounds && 'left' in bounds) {\n          boundsWidth = Math.abs( bounds.right - bounds.left );\n        }\n      }\n\n      this.calcOffset();\n      pointer.x = pointer.x - this._offset.left;\n      pointer.y = pointer.y - this._offset.top;\n      if (!ignoreZoom) {\n        pointer = this.restorePointerVpt(pointer);\n      }\n\n      var retinaScaling = this.getRetinaScaling();\n      if (retinaScaling !== 1) {\n        pointer.x /= retinaScaling;\n        pointer.y /= retinaScaling;\n      }\n\n      if (boundsWidth === 0 || boundsHeight === 0) {\n        // If bounds are not available (i.e. not visible), do not apply scale.\n        cssScale = { width: 1, height: 1 };\n      }\n      else {\n        cssScale = {\n          width: upperCanvasEl.width / boundsWidth,\n          height: upperCanvasEl.height / boundsHeight\n        };\n      }\n\n      return {\n        x: pointer.x * cssScale.width,\n        y: pointer.y * cssScale.height\n      };\n    },\n\n    /**\n     * @private\n     * @throws {CANVAS_INIT_ERROR} If canvas can not be initialized\n     */\n    _createUpperCanvas: function () {\n      var lowerCanvasClass = this.lowerCanvasEl.className.replace(/\\s*lower-canvas\\s*/, ''),\n          lowerCanvasEl = this.lowerCanvasEl, upperCanvasEl = this.upperCanvasEl;\n\n      // there is no need to create a new upperCanvas element if we have already one.\n      if (upperCanvasEl) {\n        upperCanvasEl.className = '';\n      }\n      else {\n        upperCanvasEl = this._createCanvasElement();\n        this.upperCanvasEl = upperCanvasEl;\n      }\n      fabric.util.addClass(upperCanvasEl, 'upper-canvas ' + lowerCanvasClass);\n\n      this.wrapperEl.appendChild(upperCanvasEl);\n\n      this._copyCanvasStyle(lowerCanvasEl, upperCanvasEl);\n      this._applyCanvasStyle(upperCanvasEl);\n      this.contextTop = upperCanvasEl.getContext('2d');\n    },\n\n    /**\n     * @private\n     */\n    _createCacheCanvas: function () {\n      this.cacheCanvasEl = this._createCanvasElement();\n      this.cacheCanvasEl.setAttribute('width', this.width);\n      this.cacheCanvasEl.setAttribute('height', this.height);\n      this.contextCache = this.cacheCanvasEl.getContext('2d');\n    },\n\n    /**\n     * @private\n     */\n    _initWrapperElement: function () {\n      this.wrapperEl = fabric.util.wrapElement(this.lowerCanvasEl, 'div', {\n        'class': this.containerClass\n      });\n      fabric.util.setStyle(this.wrapperEl, {\n        width: this.width + 'px',\n        height: this.height + 'px',\n        position: 'relative'\n      });\n      fabric.util.makeElementUnselectable(this.wrapperEl);\n    },\n\n    /**\n     * @private\n     * @param {HTMLElement} element canvas element to apply styles on\n     */\n    _applyCanvasStyle: function (element) {\n      var width = this.width || element.width,\n          height = this.height || element.height;\n\n      fabric.util.setStyle(element, {\n        position: 'absolute',\n        width: width + 'px',\n        height: height + 'px',\n        left: 0,\n        top: 0,\n        'touch-action': this.allowTouchScrolling ? 'manipulation' : 'none',\n        '-ms-touch-action': this.allowTouchScrolling ? 'manipulation' : 'none'\n      });\n      element.width = width;\n      element.height = height;\n      fabric.util.makeElementUnselectable(element);\n    },\n\n    /**\n     * Copy the entire inline style from one element (fromEl) to another (toEl)\n     * @private\n     * @param {Element} fromEl Element style is copied from\n     * @param {Element} toEl Element copied style is applied to\n     */\n    _copyCanvasStyle: function (fromEl, toEl) {\n      toEl.style.cssText = fromEl.style.cssText;\n    },\n\n    /**\n     * Returns context of canvas where object selection is drawn\n     * @return {CanvasRenderingContext2D}\n     */\n    getSelectionContext: function() {\n      return this.contextTop;\n    },\n\n    /**\n     * Returns &lt;canvas> element on which object selection is drawn\n     * @return {HTMLCanvasElement}\n     */\n    getSelectionElement: function () {\n      return this.upperCanvasEl;\n    },\n\n    /**\n     * Returns currently active object\n     * @return {fabric.Object} active object\n     */\n    getActiveObject: function () {\n      return this._activeObject;\n    },\n\n    /**\n     * Returns an array with the current selected objects\n     * @return {fabric.Object} active object\n     */\n    getActiveObjects: function () {\n      var active = this._activeObject;\n      if (active) {\n        if (active.type === 'activeSelection' && active._objects) {\n          return active._objects.slice(0);\n        }\n        else {\n          return [active];\n        }\n      }\n      return [];\n    },\n\n    /**\n     * @private\n     * @param {fabric.Object} obj Object that was removed\n     */\n    _onObjectRemoved: function(obj) {\n      // removing active object should fire \"selection:cleared\" events\n      if (obj === this._activeObject) {\n        this.fire('before:selection:cleared', { target: obj });\n        this._discardActiveObject();\n        this.fire('selection:cleared', { target: obj });\n        obj.fire('deselected');\n      }\n      if (obj === this._hoveredTarget){\n        this._hoveredTarget = null;\n        this._hoveredTargets = [];\n      }\n      this.callSuper('_onObjectRemoved', obj);\n    },\n\n    /**\n     * @private\n     * Compares the old activeObject with the current one and fires correct events\n     * @param {fabric.Object} obj old activeObject\n     */\n    _fireSelectionEvents: function(oldObjects, e) {\n      var somethingChanged = false, objects = this.getActiveObjects(),\n          added = [], removed = [];\n      oldObjects.forEach(function(oldObject) {\n        if (objects.indexOf(oldObject) === -1) {\n          somethingChanged = true;\n          oldObject.fire('deselected', {\n            e: e,\n            target: oldObject\n          });\n          removed.push(oldObject);\n        }\n      });\n      objects.forEach(function(object) {\n        if (oldObjects.indexOf(object) === -1) {\n          somethingChanged = true;\n          object.fire('selected', {\n            e: e,\n            target: object\n          });\n          added.push(object);\n        }\n      });\n      if (oldObjects.length > 0 && objects.length > 0) {\n        somethingChanged && this.fire('selection:updated', {\n          e: e,\n          selected: added,\n          deselected: removed,\n          // added for backward compatibility\n          // deprecated\n          updated: added[0] || removed[0],\n          target: this._activeObject,\n        });\n      }\n      else if (objects.length > 0) {\n        this.fire('selection:created', {\n          e: e,\n          selected: added,\n          target: this._activeObject,\n        });\n      }\n      else if (oldObjects.length > 0) {\n        this.fire('selection:cleared', {\n          e: e,\n          deselected: removed,\n        });\n      }\n    },\n\n    /**\n     * Sets given object as the only active object on canvas\n     * @param {fabric.Object} object Object to set as an active one\n     * @param {Event} [e] Event (passed along when firing \"object:selected\")\n     * @return {fabric.Canvas} thisArg\n     * @chainable\n     */\n    setActiveObject: function (object, e) {\n      var currentActives = this.getActiveObjects();\n      this._setActiveObject(object, e);\n      this._fireSelectionEvents(currentActives, e);\n      return this;\n    },\n\n    /**\n     * This is a private method for now.\n     * This is supposed to be equivalent to setActiveObject but without firing\n     * any event. There is commitment to have this stay this way.\n     * This is the functional part of setActiveObject.\n     * @private\n     * @param {Object} object to set as active\n     * @param {Event} [e] Event (passed along when firing \"object:selected\")\n     * @return {Boolean} true if the selection happened\n     */\n    _setActiveObject: function(object, e) {\n      if (this._activeObject === object) {\n        return false;\n      }\n      if (!this._discardActiveObject(e, object)) {\n        return false;\n      }\n      if (object.onSelect({ e: e })) {\n        return false;\n      }\n      this._activeObject = object;\n      return true;\n    },\n\n    /**\n     * This is a private method for now.\n     * This is supposed to be equivalent to discardActiveObject but without firing\n     * any events. There is commitment to have this stay this way.\n     * This is the functional part of discardActiveObject.\n     * @param {Event} [e] Event (passed along when firing \"object:deselected\")\n     * @param {Object} object to set as active\n     * @return {Boolean} true if the selection happened\n     * @private\n     */\n    _discardActiveObject: function(e, object) {\n      var obj = this._activeObject;\n      if (obj) {\n        // onDeselect return TRUE to cancel selection;\n        if (obj.onDeselect({ e: e, object: object })) {\n          return false;\n        }\n        this._activeObject = null;\n      }\n      return true;\n    },\n\n    /**\n     * Discards currently active object and fire events. If the function is called by fabric\n     * as a consequence of a mouse event, the event is passed as a parameter and\n     * sent to the fire function for the custom events. When used as a method the\n     * e param does not have any application.\n     * @param {event} e\n     * @return {fabric.Canvas} thisArg\n     * @chainable\n     */\n    discardActiveObject: function (e) {\n      var currentActives = this.getActiveObjects(), activeObject = this.getActiveObject();\n      if (currentActives.length) {\n        this.fire('before:selection:cleared', { target: activeObject, e: e });\n      }\n      this._discardActiveObject(e);\n      this._fireSelectionEvents(currentActives, e);\n      return this;\n    },\n\n    /**\n     * Clears a canvas element and removes all event listeners\n     * @return {fabric.Canvas} thisArg\n     * @chainable\n     */\n    dispose: function () {\n      var wrapper = this.wrapperEl;\n      this.removeListeners();\n      wrapper.removeChild(this.upperCanvasEl);\n      wrapper.removeChild(this.lowerCanvasEl);\n      this.contextCache = null;\n      this.contextTop = null;\n      ['upperCanvasEl', 'cacheCanvasEl'].forEach((function(element) {\n        fabric.util.cleanUpJsdomNode(this[element]);\n        this[element] = undefined;\n      }).bind(this));\n      if (wrapper.parentNode) {\n        wrapper.parentNode.replaceChild(this.lowerCanvasEl, this.wrapperEl);\n      }\n      delete this.wrapperEl;\n      fabric.StaticCanvas.prototype.dispose.call(this);\n      return this;\n    },\n\n    /**\n     * Clears all contexts (background, main, top) of an instance\n     * @return {fabric.Canvas} thisArg\n     * @chainable\n     */\n    clear: function () {\n      // this.discardActiveGroup();\n      this.discardActiveObject();\n      this.clearContext(this.contextTop);\n      return this.callSuper('clear');\n    },\n\n    /**\n     * Draws objects' controls (borders/controls)\n     * @param {CanvasRenderingContext2D} ctx Context to render controls on\n     */\n    drawControls: function(ctx) {\n      var activeObject = this._activeObject;\n\n      if (activeObject) {\n        activeObject._renderControls(ctx);\n      }\n    },\n\n    /**\n     * @private\n     */\n    _toObject: function(instance, methodName, propertiesToInclude) {\n      //If the object is part of the current selection group, it should\n      //be transformed appropriately\n      //i.e. it should be serialised as it would appear if the selection group\n      //were to be destroyed.\n      var originalProperties = this._realizeGroupTransformOnObject(instance),\n          object = this.callSuper('_toObject', instance, methodName, propertiesToInclude);\n      //Undo the damage we did by changing all of its properties\n      this._unwindGroupTransformOnObject(instance, originalProperties);\n      return object;\n    },\n\n    /**\n     * Realises an object's group transformation on it\n     * @private\n     * @param {fabric.Object} [instance] the object to transform (gets mutated)\n     * @returns the original values of instance which were changed\n     */\n    _realizeGroupTransformOnObject: function(instance) {\n      if (instance.group && instance.group.type === 'activeSelection' && this._activeObject === instance.group) {\n        var layoutProps = ['angle', 'flipX', 'flipY', 'left', 'scaleX', 'scaleY', 'skewX', 'skewY', 'top'];\n        //Copy all the positionally relevant properties across now\n        var originalValues = {};\n        layoutProps.forEach(function(prop) {\n          originalValues[prop] = instance[prop];\n        });\n        fabric.util.addTransformToObject(instance, this._activeObject.calcOwnMatrix());\n        return originalValues;\n      }\n      else {\n        return null;\n      }\n    },\n\n    /**\n     * Restores the changed properties of instance\n     * @private\n     * @param {fabric.Object} [instance] the object to un-transform (gets mutated)\n     * @param {Object} [originalValues] the original values of instance, as returned by _realizeGroupTransformOnObject\n     */\n    _unwindGroupTransformOnObject: function(instance, originalValues) {\n      if (originalValues) {\n        instance.set(originalValues);\n      }\n    },\n\n    /**\n     * @private\n     */\n    _setSVGObject: function(markup, instance, reviver) {\n      //If the object is in a selection group, simulate what would happen to that\n      //object when the group is deselected\n      var originalProperties = this._realizeGroupTransformOnObject(instance);\n      this.callSuper('_setSVGObject', markup, instance, reviver);\n      this._unwindGroupTransformOnObject(instance, originalProperties);\n    },\n\n    setViewportTransform: function (vpt) {\n      if (this.renderOnAddRemove && this._activeObject && this._activeObject.isEditing) {\n        this._activeObject.clearContextTop();\n      }\n      fabric.StaticCanvas.prototype.setViewportTransform.call(this, vpt);\n    }\n  });\n\n  // copying static properties manually to work around Opera's bug,\n  // where \"prototype\" property is enumerable and overrides existing prototype\n  for (var prop in fabric.StaticCanvas) {\n    if (prop !== 'prototype') {\n      fabric.Canvas[prop] = fabric.StaticCanvas[prop];\n    }\n  }\n})();\n\n\n(function() {\n\n  var addListener = fabric.util.addListener,\n      removeListener = fabric.util.removeListener,\n      RIGHT_CLICK = 3, MIDDLE_CLICK = 2, LEFT_CLICK = 1,\n      addEventOptions = { passive: false };\n\n  function checkClick(e, value) {\n    return e.button && (e.button === value - 1);\n  }\n\n  fabric.util.object.extend(fabric.Canvas.prototype, /** @lends fabric.Canvas.prototype */ {\n\n    /**\n     * Contains the id of the touch event that owns the fabric transform\n     * @type Number\n     * @private\n     */\n    mainTouchId: null,\n\n    /**\n     * Adds mouse listeners to canvas\n     * @private\n     */\n    _initEventListeners: function () {\n      // in case we initialized the class twice. This should not happen normally\n      // but in some kind of applications where the canvas element may be changed\n      // this is a workaround to having double listeners.\n      this.removeListeners();\n      this._bindEvents();\n      this.addOrRemove(addListener, 'add');\n    },\n\n    /**\n     * return an event prefix pointer or mouse.\n     * @private\n     */\n    _getEventPrefix: function () {\n      return this.enablePointerEvents ? 'pointer' : 'mouse';\n    },\n\n    addOrRemove: function(functor, eventjsFunctor) {\n      var canvasElement = this.upperCanvasEl,\n          eventTypePrefix = this._getEventPrefix();\n      functor(fabric.window, 'resize', this._onResize);\n      functor(canvasElement, eventTypePrefix + 'down', this._onMouseDown);\n      functor(canvasElement, eventTypePrefix + 'move', this._onMouseMove, addEventOptions);\n      functor(canvasElement, eventTypePrefix + 'out', this._onMouseOut);\n      functor(canvasElement, eventTypePrefix + 'enter', this._onMouseEnter);\n      functor(canvasElement, 'wheel', this._onMouseWheel);\n      functor(canvasElement, 'contextmenu', this._onContextMenu);\n      functor(canvasElement, 'dblclick', this._onDoubleClick);\n      functor(canvasElement, 'dragover', this._onDragOver);\n      functor(canvasElement, 'dragenter', this._onDragEnter);\n      functor(canvasElement, 'dragleave', this._onDragLeave);\n      functor(canvasElement, 'drop', this._onDrop);\n      if (!this.enablePointerEvents) {\n        functor(canvasElement, 'touchstart', this._onTouchStart, addEventOptions);\n      }\n      if (typeof eventjs !== 'undefined' && eventjsFunctor in eventjs) {\n        eventjs[eventjsFunctor](canvasElement, 'gesture', this._onGesture);\n        eventjs[eventjsFunctor](canvasElement, 'drag', this._onDrag);\n        eventjs[eventjsFunctor](canvasElement, 'orientation', this._onOrientationChange);\n        eventjs[eventjsFunctor](canvasElement, 'shake', this._onShake);\n        eventjs[eventjsFunctor](canvasElement, 'longpress', this._onLongPress);\n      }\n    },\n\n    /**\n     * Removes all event listeners\n     */\n    removeListeners: function() {\n      this.addOrRemove(removeListener, 'remove');\n      // if you dispose on a mouseDown, before mouse up, you need to clean document to...\n      var eventTypePrefix = this._getEventPrefix();\n      removeListener(fabric.document, eventTypePrefix + 'up', this._onMouseUp);\n      removeListener(fabric.document, 'touchend', this._onTouchEnd, addEventOptions);\n      removeListener(fabric.document, eventTypePrefix + 'move', this._onMouseMove, addEventOptions);\n      removeListener(fabric.document, 'touchmove', this._onMouseMove, addEventOptions);\n    },\n\n    /**\n     * @private\n     */\n    _bindEvents: function() {\n      if (this.eventsBound) {\n        // for any reason we pass here twice we do not want to bind events twice.\n        return;\n      }\n      this._onMouseDown = this._onMouseDown.bind(this);\n      this._onTouchStart = this._onTouchStart.bind(this);\n      this._onMouseMove = this._onMouseMove.bind(this);\n      this._onMouseUp = this._onMouseUp.bind(this);\n      this._onTouchEnd = this._onTouchEnd.bind(this);\n      this._onResize = this._onResize.bind(this);\n      this._onGesture = this._onGesture.bind(this);\n      this._onDrag = this._onDrag.bind(this);\n      this._onShake = this._onShake.bind(this);\n      this._onLongPress = this._onLongPress.bind(this);\n      this._onOrientationChange = this._onOrientationChange.bind(this);\n      this._onMouseWheel = this._onMouseWheel.bind(this);\n      this._onMouseOut = this._onMouseOut.bind(this);\n      this._onMouseEnter = this._onMouseEnter.bind(this);\n      this._onContextMenu = this._onContextMenu.bind(this);\n      this._onDoubleClick = this._onDoubleClick.bind(this);\n      this._onDragOver = this._onDragOver.bind(this);\n      this._onDragEnter = this._simpleEventHandler.bind(this, 'dragenter');\n      this._onDragLeave = this._simpleEventHandler.bind(this, 'dragleave');\n      this._onDrop = this._simpleEventHandler.bind(this, 'drop');\n      this.eventsBound = true;\n    },\n\n    /**\n     * @private\n     * @param {Event} [e] Event object fired on Event.js gesture\n     * @param {Event} [self] Inner Event object\n     */\n    _onGesture: function(e, self) {\n      this.__onTransformGesture && this.__onTransformGesture(e, self);\n    },\n\n    /**\n     * @private\n     * @param {Event} [e] Event object fired on Event.js drag\n     * @param {Event} [self] Inner Event object\n     */\n    _onDrag: function(e, self) {\n      this.__onDrag && this.__onDrag(e, self);\n    },\n\n    /**\n     * @private\n     * @param {Event} [e] Event object fired on wheel event\n     */\n    _onMouseWheel: function(e) {\n      this.__onMouseWheel(e);\n    },\n\n    /**\n     * @private\n     * @param {Event} e Event object fired on mousedown\n     */\n    _onMouseOut: function(e) {\n      var target = this._hoveredTarget;\n      this.fire('mouse:out', { target: target, e: e });\n      this._hoveredTarget = null;\n      target && target.fire('mouseout', { e: e });\n\n      var _this = this;\n      this._hoveredTargets.forEach(function(_target){\n        _this.fire('mouse:out', { target: target, e: e });\n        _target && target.fire('mouseout', { e: e });\n      });\n      this._hoveredTargets = [];\n\n      if (this._iTextInstances) {\n        this._iTextInstances.forEach(function(obj) {\n          if (obj.isEditing) {\n            obj.hiddenTextarea.focus();\n          }\n        });\n      }\n    },\n\n    /**\n     * @private\n     * @param {Event} e Event object fired on mouseenter\n     */\n    _onMouseEnter: function(e) {\n      // This find target and consequent 'mouse:over' is used to\n      // clear old instances on hovered target.\n      // calling findTarget has the side effect of killing target.__corner.\n      // as a short term fix we are not firing this if we are currently transforming.\n      // as a long term fix we need to separate the action of finding a target with the\n      // side effects we added to it.\n      if (!this._currentTransform && !this.findTarget(e)) {\n        this.fire('mouse:over', { target: null, e: e });\n        this._hoveredTarget = null;\n        this._hoveredTargets = [];\n      }\n    },\n\n    /**\n     * @private\n     * @param {Event} [e] Event object fired on Event.js orientation change\n     * @param {Event} [self] Inner Event object\n     */\n    _onOrientationChange: function(e, self) {\n      this.__onOrientationChange && this.__onOrientationChange(e, self);\n    },\n\n    /**\n     * @private\n     * @param {Event} [e] Event object fired on Event.js shake\n     * @param {Event} [self] Inner Event object\n     */\n    _onShake: function(e, self) {\n      this.__onShake && this.__onShake(e, self);\n    },\n\n    /**\n     * @private\n     * @param {Event} [e] Event object fired on Event.js shake\n     * @param {Event} [self] Inner Event object\n     */\n    _onLongPress: function(e, self) {\n      this.__onLongPress && this.__onLongPress(e, self);\n    },\n\n    /**\n     * prevent default to allow drop event to be fired\n     * @private\n     * @param {Event} [e] Event object fired on Event.js shake\n     */\n    _onDragOver: function(e) {\n      e.preventDefault();\n      var target = this._simpleEventHandler('dragover', e);\n      this._fireEnterLeaveEvents(target, e);\n    },\n\n    /**\n     * @private\n     * @param {Event} e Event object fired on mousedown\n     */\n    _onContextMenu: function (e) {\n      if (this.stopContextMenu) {\n        e.stopPropagation();\n        e.preventDefault();\n      }\n      return false;\n    },\n\n    /**\n     * @private\n     * @param {Event} e Event object fired on mousedown\n     */\n    _onDoubleClick: function (e) {\n      this._cacheTransformEventData(e);\n      this._handleEvent(e, 'dblclick');\n      this._resetTransformEventData(e);\n    },\n\n    /**\n     * Return a the id of an event.\n     * returns either the pointerId or the identifier or 0 for the mouse event\n     * @private\n     * @param {Event} evt Event object\n     */\n    getPointerId: function(evt) {\n      var changedTouches = evt.changedTouches;\n\n      if (changedTouches) {\n        return changedTouches[0] && changedTouches[0].identifier;\n      }\n\n      if (this.enablePointerEvents) {\n        return evt.pointerId;\n      }\n\n      return -1;\n    },\n\n    /**\n     * Determines if an event has the id of the event that is considered main\n     * @private\n     * @param {evt} event Event object\n     */\n    _isMainEvent: function(evt) {\n      if (evt.isPrimary === true) {\n        return true;\n      }\n      if (evt.isPrimary === false) {\n        return false;\n      }\n      if (evt.type === 'touchend' && evt.touches.length === 0) {\n        return true;\n      }\n      if (evt.changedTouches) {\n        return evt.changedTouches[0].identifier === this.mainTouchId;\n      }\n      return true;\n    },\n\n    /**\n     * @private\n     * @param {Event} e Event object fired on mousedown\n     */\n    _onTouchStart: function(e) {\n      e.preventDefault();\n      if (this.mainTouchId === null) {\n        this.mainTouchId = this.getPointerId(e);\n      }\n      this.__onMouseDown(e);\n      this._resetTransformEventData();\n      var canvasElement = this.upperCanvasEl,\n          eventTypePrefix = this._getEventPrefix();\n      addListener(fabric.document, 'touchend', this._onTouchEnd, addEventOptions);\n      addListener(fabric.document, 'touchmove', this._onMouseMove, addEventOptions);\n      // Unbind mousedown to prevent double triggers from touch devices\n      removeListener(canvasElement, eventTypePrefix + 'down', this._onMouseDown);\n    },\n\n    /**\n     * @private\n     * @param {Event} e Event object fired on mousedown\n     */\n    _onMouseDown: function (e) {\n      this.__onMouseDown(e);\n      this._resetTransformEventData();\n      var canvasElement = this.upperCanvasEl,\n          eventTypePrefix = this._getEventPrefix();\n      removeListener(canvasElement, eventTypePrefix + 'move', this._onMouseMove, addEventOptions);\n      addListener(fabric.document, eventTypePrefix + 'up', this._onMouseUp);\n      addListener(fabric.document, eventTypePrefix + 'move', this._onMouseMove, addEventOptions);\n    },\n\n    /**\n     * @private\n     * @param {Event} e Event object fired on mousedown\n     */\n    _onTouchEnd: function(e) {\n      if (e.touches.length > 0) {\n        // if there are still touches stop here\n        return;\n      }\n      this.__onMouseUp(e);\n      this._resetTransformEventData();\n      this.mainTouchId = null;\n      var eventTypePrefix = this._getEventPrefix();\n      removeListener(fabric.document, 'touchend', this._onTouchEnd, addEventOptions);\n      removeListener(fabric.document, 'touchmove', this._onMouseMove, addEventOptions);\n      var _this = this;\n      if (this._willAddMouseDown) {\n        clearTimeout(this._willAddMouseDown);\n      }\n      this._willAddMouseDown = setTimeout(function() {\n        // Wait 400ms before rebinding mousedown to prevent double triggers\n        // from touch devices\n        addListener(_this.upperCanvasEl, eventTypePrefix + 'down', _this._onMouseDown);\n        _this._willAddMouseDown = 0;\n      }, 400);\n    },\n\n    /**\n     * @private\n     * @param {Event} e Event object fired on mouseup\n     */\n    _onMouseUp: function (e) {\n      this.__onMouseUp(e);\n      this._resetTransformEventData();\n      var canvasElement = this.upperCanvasEl,\n          eventTypePrefix = this._getEventPrefix();\n      if (this._isMainEvent(e)) {\n        removeListener(fabric.document, eventTypePrefix + 'up', this._onMouseUp);\n        removeListener(fabric.document, eventTypePrefix + 'move', this._onMouseMove, addEventOptions);\n        addListener(canvasElement, eventTypePrefix + 'move', this._onMouseMove, addEventOptions);\n      }\n    },\n\n    /**\n     * @private\n     * @param {Event} e Event object fired on mousemove\n     */\n    _onMouseMove: function (e) {\n      !this.allowTouchScrolling && e.preventDefault && e.preventDefault();\n      this.__onMouseMove(e);\n    },\n\n    /**\n     * @private\n     */\n    _onResize: function () {\n      this.calcOffset();\n    },\n\n    /**\n     * Decides whether the canvas should be redrawn in mouseup and mousedown events.\n     * @private\n     * @param {Object} target\n     */\n    _shouldRender: function(target) {\n      var activeObject = this._activeObject;\n\n      if (\n        !!activeObject !== !!target ||\n        (activeObject && target && (activeObject !== target))\n      ) {\n        // this covers: switch of target, from target to no target, selection of target\n        // multiSelection with key and mouse\n        return true;\n      }\n      else if (activeObject && activeObject.isEditing) {\n        // if we mouse up/down over a editing textbox a cursor change,\n        // there is no need to re render\n        return false;\n      }\n      return false;\n    },\n\n    /**\n     * Method that defines the actions when mouse is released on canvas.\n     * The method resets the currentTransform parameters, store the image corner\n     * position in the image object and render the canvas on top.\n     * @private\n     * @param {Event} e Event object fired on mouseup\n     */\n    __onMouseUp: function (e) {\n      var target, transform = this._currentTransform,\n          groupSelector = this._groupSelector, shouldRender = false,\n          isClick = (!groupSelector || (groupSelector.left === 0 && groupSelector.top === 0));\n      this._cacheTransformEventData(e);\n      target = this._target;\n      this._handleEvent(e, 'up:before');\n      // if right/middle click just fire events and return\n      // target undefined will make the _handleEvent search the target\n      if (checkClick(e, RIGHT_CLICK)) {\n        if (this.fireRightClick) {\n          this._handleEvent(e, 'up', RIGHT_CLICK, isClick);\n        }\n        return;\n      }\n\n      if (checkClick(e, MIDDLE_CLICK)) {\n        if (this.fireMiddleClick) {\n          this._handleEvent(e, 'up', MIDDLE_CLICK, isClick);\n        }\n        this._resetTransformEventData();\n        return;\n      }\n\n      if (this.isDrawingMode && this._isCurrentlyDrawing) {\n        this._onMouseUpInDrawingMode(e);\n        return;\n      }\n\n      if (!this._isMainEvent(e)) {\n        return;\n      }\n      if (transform) {\n        this._finalizeCurrentTransform(e);\n        shouldRender = transform.actionPerformed;\n      }\n      if (!isClick) {\n        var targetWasActive = target === this._activeObject;\n        this._maybeGroupObjects(e);\n        if (!shouldRender) {\n          shouldRender = (\n            this._shouldRender(target) ||\n            (!targetWasActive && target === this._activeObject)\n          );\n        }\n      }\n      if (target) {\n        if (target.selectable && target !== this._activeObject && target.activeOn === 'up') {\n          this.setActiveObject(target, e);\n          shouldRender = true;\n        }\n        else {\n          var corner = target._findTargetCorner(\n            this.getPointer(e, true),\n            fabric.util.isTouchEvent(e)\n          );\n          var control = target.controls[corner],\n              mouseUpHandler = control && control.getMouseUpHandler(e, target, control);\n          if (mouseUpHandler) {\n            var pointer = this.getPointer(e);\n            mouseUpHandler(e, transform, pointer.x, pointer.y);\n          }\n        }\n        target.isMoving = false;\n      }\n      this._setCursorFromEvent(e, target);\n      this._handleEvent(e, 'up', LEFT_CLICK, isClick);\n      this._groupSelector = null;\n      this._currentTransform = null;\n      // reset the target information about which corner is selected\n      target && (target.__corner = 0);\n      if (shouldRender) {\n        this.requestRenderAll();\n      }\n      else if (!isClick) {\n        this.renderTop();\n      }\n    },\n\n    /**\n     * @private\n     * Handle event firing for target and subtargets\n     * @param {Event} e event from mouse\n     * @param {String} eventType event to fire (up, down or move)\n     * @return {Fabric.Object} target return the the target found, for internal reasons.\n     */\n    _simpleEventHandler: function(eventType, e) {\n      var target = this.findTarget(e),\n          targets = this.targets,\n          options = {\n            e: e,\n            target: target,\n            subTargets: targets,\n          };\n      this.fire(eventType, options);\n      target && target.fire(eventType, options);\n      if (!targets) {\n        return target;\n      }\n      for (var i = 0; i < targets.length; i++) {\n        targets[i].fire(eventType, options);\n      }\n      return target;\n    },\n\n    /**\n     * @private\n     * Handle event firing for target and subtargets\n     * @param {Event} e event from mouse\n     * @param {String} eventType event to fire (up, down or move)\n     * @param {fabric.Object} targetObj receiving event\n     * @param {Number} [button] button used in the event 1 = left, 2 = middle, 3 = right\n     * @param {Boolean} isClick for left button only, indicates that the mouse up happened without move.\n     */\n    _handleEvent: function(e, eventType, button, isClick) {\n      var target = this._target,\n          targets = this.targets || [],\n          options = {\n            e: e,\n            target: target,\n            subTargets: targets,\n            button: button || LEFT_CLICK,\n            isClick: isClick || false,\n            pointer: this._pointer,\n            absolutePointer: this._absolutePointer,\n            transform: this._currentTransform\n          };\n      if (eventType === 'up') {\n        options.currentTarget = this.findTarget(e);\n        options.currentSubTargets = this.targets;\n      }\n      this.fire('mouse:' + eventType, options);\n      target && target.fire('mouse' + eventType, options);\n      for (var i = 0; i < targets.length; i++) {\n        targets[i].fire('mouse' + eventType, options);\n      }\n    },\n\n    /**\n     * @private\n     * @param {Event} e send the mouse event that generate the finalize down, so it can be used in the event\n     */\n    _finalizeCurrentTransform: function(e) {\n\n      var transform = this._currentTransform,\n          target = transform.target,\n          eventName,\n          options = {\n            e: e,\n            target: target,\n            transform: transform,\n            action: transform.action,\n          };\n\n      if (target._scaling) {\n        target._scaling = false;\n      }\n\n      target.setCoords();\n\n      if (transform.actionPerformed || (this.stateful && target.hasStateChanged())) {\n        if (transform.actionPerformed) {\n          // this is not friendly to the new control api.\n          // is deprecated.\n          eventName = this._addEventOptions(options, transform);\n          this._fire(eventName, options);\n        }\n        this._fire('modified', options);\n      }\n    },\n\n    /**\n     * Mutate option object in order to add by property and give back the event name.\n     * @private\n     * @deprecated since 4.2.0\n     * @param {Object} options to mutate\n     * @param {Object} transform to inspect action from\n     */\n    _addEventOptions: function(options, transform) {\n      // we can probably add more details at low cost\n      // scale change, rotation changes, translation changes\n      var eventName, by;\n      switch (transform.action) {\n        case 'scaleX':\n          eventName = 'scaled';\n          by = 'x';\n          break;\n        case 'scaleY':\n          eventName = 'scaled';\n          by = 'y';\n          break;\n        case 'skewX':\n          eventName = 'skewed';\n          by = 'x';\n          break;\n        case 'skewY':\n          eventName = 'skewed';\n          by = 'y';\n          break;\n        case 'scale':\n          eventName = 'scaled';\n          by = 'equally';\n          break;\n        case 'rotate':\n          eventName = 'rotated';\n          break;\n        case 'drag':\n          eventName = 'moved';\n          break;\n      }\n      options.by = by;\n      return eventName;\n    },\n\n    /**\n     * @private\n     * @param {Event} e Event object fired on mousedown\n     */\n    _onMouseDownInDrawingMode: function(e) {\n      this._isCurrentlyDrawing = true;\n      if (this.getActiveObject()) {\n        this.discardActiveObject(e).requestRenderAll();\n      }\n      var pointer = this.getPointer(e);\n      this.freeDrawingBrush.onMouseDown(pointer, { e: e, pointer: pointer });\n      this._handleEvent(e, 'down');\n    },\n\n    /**\n     * @private\n     * @param {Event} e Event object fired on mousemove\n     */\n    _onMouseMoveInDrawingMode: function(e) {\n      if (this._isCurrentlyDrawing) {\n        var pointer = this.getPointer(e);\n        this.freeDrawingBrush.onMouseMove(pointer, { e: e, pointer: pointer });\n      }\n      this.setCursor(this.freeDrawingCursor);\n      this._handleEvent(e, 'move');\n    },\n\n    /**\n     * @private\n     * @param {Event} e Event object fired on mouseup\n     */\n    _onMouseUpInDrawingMode: function(e) {\n      var pointer = this.getPointer(e);\n      this._isCurrentlyDrawing = this.freeDrawingBrush.onMouseUp({ e: e, pointer: pointer });\n      this._handleEvent(e, 'up');\n    },\n\n    /**\n     * Method that defines the actions when mouse is clicked on canvas.\n     * The method inits the currentTransform parameters and renders all the\n     * canvas so the current image can be placed on the top canvas and the rest\n     * in on the container one.\n     * @private\n     * @param {Event} e Event object fired on mousedown\n     */\n    __onMouseDown: function (e) {\n      this._cacheTransformEventData(e);\n      this._handleEvent(e, 'down:before');\n      var target = this._target;\n      // if right click just fire events\n      if (checkClick(e, RIGHT_CLICK)) {\n        if (this.fireRightClick) {\n          this._handleEvent(e, 'down', RIGHT_CLICK);\n        }\n        return;\n      }\n\n      if (checkClick(e, MIDDLE_CLICK)) {\n        if (this.fireMiddleClick) {\n          this._handleEvent(e, 'down', MIDDLE_CLICK);\n        }\n        return;\n      }\n\n      if (this.isDrawingMode) {\n        this._onMouseDownInDrawingMode(e);\n        return;\n      }\n\n      if (!this._isMainEvent(e)) {\n        return;\n      }\n\n      // ignore if some object is being transformed at this moment\n      if (this._currentTransform) {\n        return;\n      }\n\n      var pointer = this._pointer;\n      // save pointer for check in __onMouseUp event\n      this._previousPointer = pointer;\n      var shouldRender = this._shouldRender(target),\n          shouldGroup = this._shouldGroup(e, target);\n      if (this._shouldClearSelection(e, target)) {\n        this.discardActiveObject(e);\n      }\n      else if (shouldGroup) {\n        this._handleGrouping(e, target);\n        target = this._activeObject;\n      }\n\n      if (this.selection && (!target ||\n        (!target.selectable && !target.isEditing && target !== this._activeObject))) {\n        this._groupSelector = {\n          ex: this._absolutePointer.x,\n          ey: this._absolutePointer.y,\n          top: 0,\n          left: 0\n        };\n      }\n\n      if (target) {\n        var alreadySelected = target === this._activeObject;\n        if (target.selectable && target.activeOn === 'down') {\n          this.setActiveObject(target, e);\n        }\n        var corner = target._findTargetCorner(\n          this.getPointer(e, true),\n          fabric.util.isTouchEvent(e)\n        );\n        target.__corner = corner;\n        if (target === this._activeObject && (corner || !shouldGroup)) {\n          this._setupCurrentTransform(e, target, alreadySelected);\n          var control = target.controls[corner],\n              pointer = this.getPointer(e),\n              mouseDownHandler = control && control.getMouseDownHandler(e, target, control);\n          if (mouseDownHandler) {\n            mouseDownHandler(e, this._currentTransform, pointer.x, pointer.y);\n          }\n        }\n      }\n      this._handleEvent(e, 'down');\n      // we must renderAll so that we update the visuals\n      (shouldRender || shouldGroup) && this.requestRenderAll();\n    },\n\n    /**\n     * reset cache form common information needed during event processing\n     * @private\n     */\n    _resetTransformEventData: function() {\n      this._target = null;\n      this._pointer = null;\n      this._absolutePointer = null;\n    },\n\n    /**\n     * Cache common information needed during event processing\n     * @private\n     * @param {Event} e Event object fired on event\n     */\n    _cacheTransformEventData: function(e) {\n      // reset in order to avoid stale caching\n      this._resetTransformEventData();\n      this._pointer = this.getPointer(e, true);\n      this._absolutePointer = this.restorePointerVpt(this._pointer);\n      this._target = this._currentTransform ? this._currentTransform.target : this.findTarget(e) || null;\n    },\n\n    /**\n     * @private\n     */\n    _beforeTransform: function(e) {\n      var t = this._currentTransform;\n      this.stateful && t.target.saveState();\n      this.fire('before:transform', {\n        e: e,\n        transform: t,\n      });\n    },\n\n    /**\n     * Method that defines the actions when mouse is hovering the canvas.\n     * The currentTransform parameter will define whether the user is rotating/scaling/translating\n     * an image or neither of them (only hovering). A group selection is also possible and would cancel\n     * all any other type of action.\n     * In case of an image transformation only the top canvas will be rendered.\n     * @private\n     * @param {Event} e Event object fired on mousemove\n     */\n    __onMouseMove: function (e) {\n      this._handleEvent(e, 'move:before');\n      this._cacheTransformEventData(e);\n      var target, pointer;\n\n      if (this.isDrawingMode) {\n        this._onMouseMoveInDrawingMode(e);\n        return;\n      }\n\n      if (!this._isMainEvent(e)) {\n        return;\n      }\n\n      var groupSelector = this._groupSelector;\n\n      // We initially clicked in an empty area, so we draw a box for multiple selection\n      if (groupSelector) {\n        pointer = this._absolutePointer;\n\n        groupSelector.left = pointer.x - groupSelector.ex;\n        groupSelector.top = pointer.y - groupSelector.ey;\n\n        this.renderTop();\n      }\n      else if (!this._currentTransform) {\n        target = this.findTarget(e) || null;\n        this._setCursorFromEvent(e, target);\n        this._fireOverOutEvents(target, e);\n      }\n      else {\n        this._transformObject(e);\n      }\n      this._handleEvent(e, 'move');\n      this._resetTransformEventData();\n    },\n\n    /**\n     * Manage the mouseout, mouseover events for the fabric object on the canvas\n     * @param {Fabric.Object} target the target where the target from the mousemove event\n     * @param {Event} e Event object fired on mousemove\n     * @private\n     */\n    _fireOverOutEvents: function(target, e) {\n      var _hoveredTarget = this._hoveredTarget,\n          _hoveredTargets = this._hoveredTargets, targets = this.targets,\n          length = Math.max(_hoveredTargets.length, targets.length);\n\n      this.fireSyntheticInOutEvents(target, e, {\n        oldTarget: _hoveredTarget,\n        evtOut: 'mouseout',\n        canvasEvtOut: 'mouse:out',\n        evtIn: 'mouseover',\n        canvasEvtIn: 'mouse:over',\n      });\n      for (var i = 0; i < length; i++){\n        this.fireSyntheticInOutEvents(targets[i], e, {\n          oldTarget: _hoveredTargets[i],\n          evtOut: 'mouseout',\n          evtIn: 'mouseover',\n        });\n      }\n      this._hoveredTarget = target;\n      this._hoveredTargets = this.targets.concat();\n    },\n\n    /**\n     * Manage the dragEnter, dragLeave events for the fabric objects on the canvas\n     * @param {Fabric.Object} target the target where the target from the onDrag event\n     * @param {Event} e Event object fired on ondrag\n     * @private\n     */\n    _fireEnterLeaveEvents: function(target, e) {\n      var _draggedoverTarget = this._draggedoverTarget,\n          _hoveredTargets = this._hoveredTargets, targets = this.targets,\n          length = Math.max(_hoveredTargets.length, targets.length);\n\n      this.fireSyntheticInOutEvents(target, e, {\n        oldTarget: _draggedoverTarget,\n        evtOut: 'dragleave',\n        evtIn: 'dragenter',\n      });\n      for (var i = 0; i < length; i++) {\n        this.fireSyntheticInOutEvents(targets[i], e, {\n          oldTarget: _hoveredTargets[i],\n          evtOut: 'dragleave',\n          evtIn: 'dragenter',\n        });\n      }\n      this._draggedoverTarget = target;\n    },\n\n    /**\n     * Manage the synthetic in/out events for the fabric objects on the canvas\n     * @param {Fabric.Object} target the target where the target from the supported events\n     * @param {Event} e Event object fired\n     * @param {Object} config configuration for the function to work\n     * @param {String} config.targetName property on the canvas where the old target is stored\n     * @param {String} [config.canvasEvtOut] name of the event to fire at canvas level for out\n     * @param {String} config.evtOut name of the event to fire for out\n     * @param {String} [config.canvasEvtIn] name of the event to fire at canvas level for in\n     * @param {String} config.evtIn name of the event to fire for in\n     * @private\n     */\n    fireSyntheticInOutEvents: function(target, e, config) {\n      var inOpt, outOpt, oldTarget = config.oldTarget, outFires, inFires,\n          targetChanged = oldTarget !== target, canvasEvtIn = config.canvasEvtIn, canvasEvtOut = config.canvasEvtOut;\n      if (targetChanged) {\n        inOpt = { e: e, target: target, previousTarget: oldTarget };\n        outOpt = { e: e, target: oldTarget, nextTarget: target };\n      }\n      inFires = target && targetChanged;\n      outFires = oldTarget && targetChanged;\n      if (outFires) {\n        canvasEvtOut && this.fire(canvasEvtOut, outOpt);\n        oldTarget.fire(config.evtOut, outOpt);\n      }\n      if (inFires) {\n        canvasEvtIn && this.fire(canvasEvtIn, inOpt);\n        target.fire(config.evtIn, inOpt);\n      }\n    },\n\n    /**\n     * Method that defines actions when an Event Mouse Wheel\n     * @param {Event} e Event object fired on mouseup\n     */\n    __onMouseWheel: function(e) {\n      this._cacheTransformEventData(e);\n      this._handleEvent(e, 'wheel');\n      this._resetTransformEventData();\n    },\n\n    /**\n     * @private\n     * @param {Event} e Event fired on mousemove\n     */\n    _transformObject: function(e) {\n      var pointer = this.getPointer(e),\n          transform = this._currentTransform;\n\n      transform.reset = false;\n      transform.shiftKey = e.shiftKey;\n      transform.altKey = e[this.centeredKey];\n\n      this._performTransformAction(e, transform, pointer);\n      transform.actionPerformed && this.requestRenderAll();\n    },\n\n    /**\n     * @private\n     */\n    _performTransformAction: function(e, transform, pointer) {\n      var x = pointer.x,\n          y = pointer.y,\n          action = transform.action,\n          actionPerformed = false,\n          actionHandler = transform.actionHandler;\n          // this object could be created from the function in the control handlers\n\n\n      if (actionHandler) {\n        actionPerformed = actionHandler(e, transform, x, y);\n      }\n      if (action === 'drag' && actionPerformed) {\n        transform.target.isMoving = true;\n        this.setCursor(transform.target.moveCursor || this.moveCursor);\n      }\n      transform.actionPerformed = transform.actionPerformed || actionPerformed;\n    },\n\n    /**\n     * @private\n     */\n    _fire: fabric.controlsUtils.fireEvent,\n\n    /**\n     * Sets the cursor depending on where the canvas is being hovered.\n     * Note: very buggy in Opera\n     * @param {Event} e Event object\n     * @param {Object} target Object that the mouse is hovering, if so.\n     */\n    _setCursorFromEvent: function (e, target) {\n      if (!target) {\n        this.setCursor(this.defaultCursor);\n        return false;\n      }\n      var hoverCursor = target.hoverCursor || this.hoverCursor,\n          activeSelection = this._activeObject && this._activeObject.type === 'activeSelection' ?\n            this._activeObject : null,\n          // only show proper corner when group selection is not active\n          corner = (!activeSelection || !activeSelection.contains(target))\n          // here we call findTargetCorner always with undefined for the touch parameter.\n          // we assume that if you are using a cursor you do not need to interact with\n          // the bigger touch area.\n                    && target._findTargetCorner(this.getPointer(e, true));\n\n      if (!corner) {\n        if (target.subTargetCheck){\n          // hoverCursor should come from top-most subTarget,\n          // so we walk the array backwards\n          this.targets.concat().reverse().map(function(_target){\n            hoverCursor = _target.hoverCursor || hoverCursor;\n          });\n        }\n        this.setCursor(hoverCursor);\n      }\n      else {\n        this.setCursor(this.getCornerCursor(corner, target, e));\n      }\n    },\n\n    /**\n     * @private\n     */\n    getCornerCursor: function(corner, target, e) {\n      var control = target.controls[corner];\n      return control.cursorStyleHandler(e, control, target);\n    }\n  });\n})();\n\n\n(function() {\n\n  var min = Math.min,\n      max = Math.max;\n\n  fabric.util.object.extend(fabric.Canvas.prototype, /** @lends fabric.Canvas.prototype */ {\n\n    /**\n     * @private\n     * @param {Event} e Event object\n     * @param {fabric.Object} target\n     * @return {Boolean}\n     */\n    _shouldGroup: function(e, target) {\n      var activeObject = this._activeObject;\n      return activeObject && this._isSelectionKeyPressed(e) && target && target.selectable && this.selection &&\n            (activeObject !== target || activeObject.type === 'activeSelection') && !target.onSelect({ e: e });\n    },\n\n    /**\n     * @private\n     * @param {Event} e Event object\n     * @param {fabric.Object} target\n     */\n    _handleGrouping: function (e, target) {\n      var activeObject = this._activeObject;\n      // avoid multi select when shift click on a corner\n      if (activeObject.__corner) {\n        return;\n      }\n      if (target === activeObject) {\n        // if it's a group, find target again, using activeGroup objects\n        target = this.findTarget(e, true);\n        // if even object is not found or we are on activeObjectCorner, bail out\n        if (!target || !target.selectable) {\n          return;\n        }\n      }\n      if (activeObject && activeObject.type === 'activeSelection') {\n        this._updateActiveSelection(target, e);\n      }\n      else {\n        this._createActiveSelection(target, e);\n      }\n    },\n\n    /**\n     * @private\n     */\n    _updateActiveSelection: function(target, e) {\n      var activeSelection = this._activeObject,\n          currentActiveObjects = activeSelection._objects.slice(0);\n      if (activeSelection.contains(target)) {\n        activeSelection.removeWithUpdate(target);\n        this._hoveredTarget = target;\n        this._hoveredTargets = this.targets.concat();\n        if (activeSelection.size() === 1) {\n          // activate last remaining object\n          this._setActiveObject(activeSelection.item(0), e);\n        }\n      }\n      else {\n        activeSelection.addWithUpdate(target);\n        this._hoveredTarget = activeSelection;\n        this._hoveredTargets = this.targets.concat();\n      }\n      this._fireSelectionEvents(currentActiveObjects, e);\n    },\n\n    /**\n     * @private\n     */\n    _createActiveSelection: function(target, e) {\n      var currentActives = this.getActiveObjects(), group = this._createGroup(target);\n      this._hoveredTarget = group;\n      // ISSUE 4115: should we consider subTargets here?\n      // this._hoveredTargets = [];\n      // this._hoveredTargets = this.targets.concat();\n      this._setActiveObject(group, e);\n      this._fireSelectionEvents(currentActives, e);\n    },\n\n    /**\n     * @private\n     * @param {Object} target\n     */\n    _createGroup: function(target) {\n      var objects = this._objects,\n          isActiveLower = objects.indexOf(this._activeObject) < objects.indexOf(target),\n          groupObjects = isActiveLower\n            ? [this._activeObject, target]\n            : [target, this._activeObject];\n      this._activeObject.isEditing && this._activeObject.exitEditing();\n      return new fabric.ActiveSelection(groupObjects, {\n        canvas: this\n      });\n    },\n\n    /**\n     * @private\n     * @param {Event} e mouse event\n     */\n    _groupSelectedObjects: function (e) {\n\n      var group = this._collectObjects(e),\n          aGroup;\n\n      // do not create group for 1 element only\n      if (group.length === 1) {\n        this.setActiveObject(group[0], e);\n      }\n      else if (group.length > 1) {\n        aGroup = new fabric.ActiveSelection(group.reverse(), {\n          canvas: this\n        });\n        this.setActiveObject(aGroup, e);\n      }\n    },\n\n    /**\n     * @private\n     */\n    _collectObjects: function(e) {\n      var group = [],\n          currentObject,\n          x1 = this._groupSelector.ex,\n          y1 = this._groupSelector.ey,\n          x2 = x1 + this._groupSelector.left,\n          y2 = y1 + this._groupSelector.top,\n          selectionX1Y1 = new fabric.Point(min(x1, x2), min(y1, y2)),\n          selectionX2Y2 = new fabric.Point(max(x1, x2), max(y1, y2)),\n          allowIntersect = !this.selectionFullyContained,\n          isClick = x1 === x2 && y1 === y2;\n      // we iterate reverse order to collect top first in case of click.\n      for (var i = this._objects.length; i--; ) {\n        currentObject = this._objects[i];\n\n        if (!currentObject || !currentObject.selectable || !currentObject.visible) {\n          continue;\n        }\n\n        if ((allowIntersect && currentObject.intersectsWithRect(selectionX1Y1, selectionX2Y2, true)) ||\n            currentObject.isContainedWithinRect(selectionX1Y1, selectionX2Y2, true) ||\n            (allowIntersect && currentObject.containsPoint(selectionX1Y1, null, true)) ||\n            (allowIntersect && currentObject.containsPoint(selectionX2Y2, null, true))\n        ) {\n          group.push(currentObject);\n          // only add one object if it's a click\n          if (isClick) {\n            break;\n          }\n        }\n      }\n\n      if (group.length > 1) {\n        group = group.filter(function(object) {\n          return !object.onSelect({ e: e });\n        });\n      }\n\n      return group;\n    },\n\n    /**\n     * @private\n     */\n    _maybeGroupObjects: function(e) {\n      if (this.selection && this._groupSelector) {\n        this._groupSelectedObjects(e);\n      }\n      this.setCursor(this.defaultCursor);\n      // clear selection and current transformation\n      this._groupSelector = null;\n    }\n  });\n\n})();\n\n\n(function () {\n  fabric.util.object.extend(fabric.StaticCanvas.prototype, /** @lends fabric.StaticCanvas.prototype */ {\n\n    /**\n     * Exports canvas element to a dataurl image. Note that when multiplier is used, cropping is scaled appropriately\n     * @param {Object} [options] Options object\n     * @param {String} [options.format=png] The format of the output image. Either \"jpeg\" or \"png\"\n     * @param {Number} [options.quality=1] Quality level (0..1). Only used for jpeg.\n     * @param {Number} [options.multiplier=1] Multiplier to scale by, to have consistent\n     * @param {Number} [options.left] Cropping left offset. Introduced in v1.2.14\n     * @param {Number} [options.top] Cropping top offset. Introduced in v1.2.14\n     * @param {Number} [options.width] Cropping width. Introduced in v1.2.14\n     * @param {Number} [options.height] Cropping height. Introduced in v1.2.14\n     * @param {Boolean} [options.enableRetinaScaling] Enable retina scaling for clone image. Introduce in 2.0.0\n     * @return {String} Returns a data: URL containing a representation of the object in the format specified by options.format\n     * @see {@link http://jsfiddle.net/fabricjs/NfZVb/|jsFiddle demo}\n     * @example <caption>Generate jpeg dataURL with lower quality</caption>\n     * var dataURL = canvas.toDataURL({\n     *   format: 'jpeg',\n     *   quality: 0.8\n     * });\n     * @example <caption>Generate cropped png dataURL (clipping of canvas)</caption>\n     * var dataURL = canvas.toDataURL({\n     *   format: 'png',\n     *   left: 100,\n     *   top: 100,\n     *   width: 200,\n     *   height: 200\n     * });\n     * @example <caption>Generate double scaled png dataURL</caption>\n     * var dataURL = canvas.toDataURL({\n     *   format: 'png',\n     *   multiplier: 2\n     * });\n     */\n    toDataURL: function (options) {\n      options || (options = { });\n\n      var format = options.format || 'png',\n          quality = options.quality || 1,\n          multiplier = (options.multiplier || 1) * (options.enableRetinaScaling ? this.getRetinaScaling() : 1),\n          canvasEl = this.toCanvasElement(multiplier, options);\n      return fabric.util.toDataURL(canvasEl, format, quality);\n    },\n\n    /**\n     * Create a new HTMLCanvas element painted with the current canvas content.\n     * No need to resize the actual one or repaint it.\n     * Will transfer object ownership to a new canvas, paint it, and set everything back.\n     * This is an intermediary step used to get to a dataUrl but also it is useful to\n     * create quick image copies of a canvas without passing for the dataUrl string\n     * @param {Number} [multiplier] a zoom factor.\n     * @param {Object} [cropping] Cropping informations\n     * @param {Number} [cropping.left] Cropping left offset.\n     * @param {Number} [cropping.top] Cropping top offset.\n     * @param {Number} [cropping.width] Cropping width.\n     * @param {Number} [cropping.height] Cropping height.\n     */\n    toCanvasElement: function(multiplier, cropping) {\n      multiplier = multiplier || 1;\n      cropping = cropping || { };\n      var scaledWidth = (cropping.width || this.width) * multiplier,\n          scaledHeight = (cropping.height || this.height) * multiplier,\n          zoom = this.getZoom(),\n          originalWidth = this.width,\n          originalHeight = this.height,\n          newZoom = zoom * multiplier,\n          vp = this.viewportTransform,\n          translateX = (vp[4] - (cropping.left || 0)) * multiplier,\n          translateY = (vp[5] - (cropping.top || 0)) * multiplier,\n          originalInteractive = this.interactive,\n          newVp = [newZoom, 0, 0, newZoom, translateX, translateY],\n          originalRetina = this.enableRetinaScaling,\n          canvasEl = fabric.util.createCanvasElement(),\n          originalContextTop = this.contextTop;\n      canvasEl.width = scaledWidth;\n      canvasEl.height = scaledHeight;\n      this.contextTop = null;\n      this.enableRetinaScaling = false;\n      this.interactive = false;\n      this.viewportTransform = newVp;\n      this.width = scaledWidth;\n      this.height = scaledHeight;\n      this.calcViewportBoundaries();\n      this.renderCanvas(canvasEl.getContext('2d'), this._objects);\n      this.viewportTransform = vp;\n      this.width = originalWidth;\n      this.height = originalHeight;\n      this.calcViewportBoundaries();\n      this.interactive = originalInteractive;\n      this.enableRetinaScaling = originalRetina;\n      this.contextTop = originalContextTop;\n      return canvasEl;\n    },\n  });\n\n})();\n\n\nfabric.util.object.extend(fabric.StaticCanvas.prototype, /** @lends fabric.StaticCanvas.prototype */ {\n  /**\n   * Populates canvas with data from the specified JSON.\n   * JSON format must conform to the one of {@link fabric.Canvas#toJSON}\n   * @param {String|Object} json JSON string or object\n   * @param {Function} callback Callback, invoked when json is parsed\n   *                            and corresponding objects (e.g: {@link fabric.Image})\n   *                            are initialized\n   * @param {Function} [reviver] Method for further parsing of JSON elements, called after each fabric object created.\n   * @return {fabric.Canvas} instance\n   * @chainable\n   * @tutorial {@link http://fabricjs.com/fabric-intro-part-3#deserialization}\n   * @see {@link http://jsfiddle.net/fabricjs/fmgXt/|jsFiddle demo}\n   * @example <caption>loadFromJSON</caption>\n   * canvas.loadFromJSON(json, canvas.renderAll.bind(canvas));\n   * @example <caption>loadFromJSON with reviver</caption>\n   * canvas.loadFromJSON(json, canvas.renderAll.bind(canvas), function(o, object) {\n   *   // `o` = json object\n   *   // `object` = fabric.Object instance\n   *   // ... do some stuff ...\n   * });\n   */\n  loadFromJSON: function (json, callback, reviver) {\n    if (!json) {\n      return;\n    }\n\n    // serialize if it wasn't already\n    var serialized = (typeof json === 'string')\n      ? JSON.parse(json)\n      : fabric.util.object.clone(json);\n\n    var _this = this,\n        clipPath = serialized.clipPath,\n        renderOnAddRemove = this.renderOnAddRemove;\n\n    this.renderOnAddRemove = false;\n\n    delete serialized.clipPath;\n\n    this._enlivenObjects(serialized.objects, function (enlivenedObjects) {\n      _this.clear();\n      _this._setBgOverlay(serialized, function () {\n        if (clipPath) {\n          _this._enlivenObjects([clipPath], function (enlivenedCanvasClip) {\n            _this.clipPath = enlivenedCanvasClip[0];\n            _this.__setupCanvas.call(_this, serialized, enlivenedObjects, renderOnAddRemove, callback);\n          });\n        }\n        else {\n          _this.__setupCanvas.call(_this, serialized, enlivenedObjects, renderOnAddRemove, callback);\n        }\n      });\n    }, reviver);\n    return this;\n  },\n\n  /**\n   * @private\n   * @param {Object} serialized Object with background and overlay information\n   * @param {Array} restored canvas objects\n   * @param {Function} cached renderOnAddRemove callback\n   * @param {Function} callback Invoked after all background and overlay images/patterns loaded\n   */\n  __setupCanvas: function(serialized, enlivenedObjects, renderOnAddRemove, callback) {\n    var _this = this;\n    enlivenedObjects.forEach(function(obj, index) {\n      // we splice the array just in case some custom classes restored from JSON\n      // will add more object to canvas at canvas init.\n      _this.insertAt(obj, index);\n    });\n    this.renderOnAddRemove = renderOnAddRemove;\n    // remove parts i cannot set as options\n    delete serialized.objects;\n    delete serialized.backgroundImage;\n    delete serialized.overlayImage;\n    delete serialized.background;\n    delete serialized.overlay;\n    // this._initOptions does too many things to just\n    // call it. Normally loading an Object from JSON\n    // create the Object instance. Here the Canvas is\n    // already an instance and we are just loading things over it\n    this._setOptions(serialized);\n    this.renderAll();\n    callback && callback();\n  },\n\n  /**\n   * @private\n   * @param {Object} serialized Object with background and overlay information\n   * @param {Function} callback Invoked after all background and overlay images/patterns loaded\n   */\n  _setBgOverlay: function(serialized, callback) {\n    var loaded = {\n      backgroundColor: false,\n      overlayColor: false,\n      backgroundImage: false,\n      overlayImage: false\n    };\n\n    if (!serialized.backgroundImage && !serialized.overlayImage && !serialized.background && !serialized.overlay) {\n      callback && callback();\n      return;\n    }\n\n    var cbIfLoaded = function () {\n      if (loaded.backgroundImage && loaded.overlayImage && loaded.backgroundColor && loaded.overlayColor) {\n        callback && callback();\n      }\n    };\n\n    this.__setBgOverlay('backgroundImage', serialized.backgroundImage, loaded, cbIfLoaded);\n    this.__setBgOverlay('overlayImage', serialized.overlayImage, loaded, cbIfLoaded);\n    this.__setBgOverlay('backgroundColor', serialized.background, loaded, cbIfLoaded);\n    this.__setBgOverlay('overlayColor', serialized.overlay, loaded, cbIfLoaded);\n  },\n\n  /**\n   * @private\n   * @param {String} property Property to set (backgroundImage, overlayImage, backgroundColor, overlayColor)\n   * @param {(Object|String)} value Value to set\n   * @param {Object} loaded Set loaded property to true if property is set\n   * @param {Object} callback Callback function to invoke after property is set\n   */\n  __setBgOverlay: function(property, value, loaded, callback) {\n    var _this = this;\n\n    if (!value) {\n      loaded[property] = true;\n      callback && callback();\n      return;\n    }\n\n    if (property === 'backgroundImage' || property === 'overlayImage') {\n      fabric.util.enlivenObjects([value], function(enlivedObject){\n        _this[property] = enlivedObject[0];\n        loaded[property] = true;\n        callback && callback();\n      });\n    }\n    else {\n      this['set' + fabric.util.string.capitalize(property, true)](value, function() {\n        loaded[property] = true;\n        callback && callback();\n      });\n    }\n  },\n\n  /**\n   * @private\n   * @param {Array} objects\n   * @param {Function} callback\n   * @param {Function} [reviver]\n   */\n  _enlivenObjects: function (objects, callback, reviver) {\n    if (!objects || objects.length === 0) {\n      callback && callback([]);\n      return;\n    }\n\n    fabric.util.enlivenObjects(objects, function(enlivenedObjects) {\n      callback && callback(enlivenedObjects);\n    }, null, reviver);\n  },\n\n  /**\n   * @private\n   * @param {String} format\n   * @param {Function} callback\n   */\n  _toDataURL: function (format, callback) {\n    this.clone(function (clone) {\n      callback(clone.toDataURL(format));\n    });\n  },\n\n  /**\n   * @private\n   * @param {String} format\n   * @param {Number} multiplier\n   * @param {Function} callback\n   */\n  _toDataURLWithMultiplier: function (format, multiplier, callback) {\n    this.clone(function (clone) {\n      callback(clone.toDataURLWithMultiplier(format, multiplier));\n    });\n  },\n\n  /**\n   * Clones canvas instance\n   * @param {Object} [callback] Receives cloned instance as a first argument\n   * @param {Array} [properties] Array of properties to include in the cloned canvas and children\n   */\n  clone: function (callback, properties) {\n    var data = JSON.stringify(this.toJSON(properties));\n    this.cloneWithoutData(function(clone) {\n      clone.loadFromJSON(data, function() {\n        callback && callback(clone);\n      });\n    });\n  },\n\n  /**\n   * Clones canvas instance without cloning existing data.\n   * This essentially copies canvas dimensions, clipping properties, etc.\n   * but leaves data empty (so that you can populate it with your own)\n   * @param {Object} [callback] Receives cloned instance as a first argument\n   */\n  cloneWithoutData: function(callback) {\n    var el = fabric.util.createCanvasElement();\n\n    el.width = this.width;\n    el.height = this.height;\n\n    var clone = new fabric.Canvas(el);\n    if (this.backgroundImage) {\n      clone.setBackgroundImage(this.backgroundImage.src, function() {\n        clone.renderAll();\n        callback && callback(clone);\n      });\n      clone.backgroundImageOpacity = this.backgroundImageOpacity;\n      clone.backgroundImageStretch = this.backgroundImageStretch;\n    }\n    else {\n      callback && callback(clone);\n    }\n  }\n});\n\n\n(function(global) {\n\n  'use strict';\n\n  var fabric = global.fabric || (global.fabric = { }),\n      extend = fabric.util.object.extend,\n      clone = fabric.util.object.clone,\n      toFixed = fabric.util.toFixed,\n      capitalize = fabric.util.string.capitalize,\n      degreesToRadians = fabric.util.degreesToRadians,\n      objectCaching = !fabric.isLikelyNode,\n      ALIASING_LIMIT = 2;\n\n  if (fabric.Object) {\n    return;\n  }\n\n  /**\n   * Root object class from which all 2d shape classes inherit from\n   * @class fabric.Object\n   * @tutorial {@link http://fabricjs.com/fabric-intro-part-1#objects}\n   * @see {@link fabric.Object#initialize} for constructor definition\n   *\n   * @fires added\n   * @fires removed\n   *\n   * @fires selected\n   * @fires deselected\n   * @fires modified\n   * @fires modified\n   * @fires moved\n   * @fires scaled\n   * @fires rotated\n   * @fires skewed\n   *\n   * @fires rotating\n   * @fires scaling\n   * @fires moving\n   * @fires skewing\n   *\n   * @fires mousedown\n   * @fires mouseup\n   * @fires mouseover\n   * @fires mouseout\n   * @fires mousewheel\n   * @fires mousedblclick\n   *\n   * @fires dragover\n   * @fires dragenter\n   * @fires dragleave\n   * @fires drop\n   */\n  fabric.Object = fabric.util.createClass(fabric.CommonMethods, /** @lends fabric.Object.prototype */ {\n\n    /**\n     * Type of an object (rect, circle, path, etc.).\n     * Note that this property is meant to be read-only and not meant to be modified.\n     * If you modify, certain parts of Fabric (such as JSON loading) won't work correctly.\n     * @type String\n     * @default\n     */\n    type:                     'object',\n\n    /**\n     * Horizontal origin of transformation of an object (one of \"left\", \"right\", \"center\")\n     * See http://jsfiddle.net/1ow02gea/244/ on how originX/originY affect objects in groups\n     * @type String\n     * @default\n     */\n    originX:                  'left',\n\n    /**\n     * Vertical origin of transformation of an object (one of \"top\", \"bottom\", \"center\")\n     * See http://jsfiddle.net/1ow02gea/244/ on how originX/originY affect objects in groups\n     * @type String\n     * @default\n     */\n    originY:                  'top',\n\n    /**\n     * Top position of an object. Note that by default it's relative to object top. You can change this by setting originY={top/center/bottom}\n     * @type Number\n     * @default\n     */\n    top:                      0,\n\n    /**\n     * Left position of an object. Note that by default it's relative to object left. You can change this by setting originX={left/center/right}\n     * @type Number\n     * @default\n     */\n    left:                     0,\n\n    /**\n     * Object width\n     * @type Number\n     * @default\n     */\n    width:                    0,\n\n    /**\n     * Object height\n     * @type Number\n     * @default\n     */\n    height:                   0,\n\n    /**\n     * Object scale factor (horizontal)\n     * @type Number\n     * @default\n     */\n    scaleX:                   1,\n\n    /**\n     * Object scale factor (vertical)\n     * @type Number\n     * @default\n     */\n    scaleY:                   1,\n\n    /**\n     * When true, an object is rendered as flipped horizontally\n     * @type Boolean\n     * @default\n     */\n    flipX:                    false,\n\n    /**\n     * When true, an object is rendered as flipped vertically\n     * @type Boolean\n     * @default\n     */\n    flipY:                    false,\n\n    /**\n     * Opacity of an object\n     * @type Number\n     * @default\n     */\n    opacity:                  1,\n\n    /**\n     * Angle of rotation of an object (in degrees)\n     * @type Number\n     * @default\n     */\n    angle:                    0,\n\n    /**\n     * Angle of skew on x axes of an object (in degrees)\n     * @type Number\n     * @default\n     */\n    skewX:                    0,\n\n    /**\n     * Angle of skew on y axes of an object (in degrees)\n     * @type Number\n     * @default\n     */\n    skewY:                    0,\n\n    /**\n     * Size of object's controlling corners (in pixels)\n     * @type Number\n     * @default\n     */\n    cornerSize:               13,\n\n    /**\n     * Size of object's controlling corners when touch interaction is detected\n     * @type Number\n     * @default\n     */\n    touchCornerSize:               24,\n\n    /**\n     * When true, object's controlling corners are rendered as transparent inside (i.e. stroke instead of fill)\n     * @type Boolean\n     * @default\n     */\n    transparentCorners:       true,\n\n    /**\n     * Default cursor value used when hovering over this object on canvas\n     * @type String\n     * @default\n     */\n    hoverCursor:              null,\n\n    /**\n     * Default cursor value used when moving this object on canvas\n     * @type String\n     * @default\n     */\n    moveCursor:               null,\n\n    /**\n     * Padding between object and its controlling borders (in pixels)\n     * @type Number\n     * @default\n     */\n    padding:                  0,\n\n    /**\n     * Color of controlling borders of an object (when it's active)\n     * @type String\n     * @default\n     */\n    borderColor:              'rgb(178,204,255)',\n\n    /**\n     * Array specifying dash pattern of an object's borders (hasBorder must be true)\n     * @since 1.6.2\n     * @type Array\n     */\n    borderDashArray:          null,\n\n    /**\n     * Color of controlling corners of an object (when it's active)\n     * @type String\n     * @default\n     */\n    cornerColor:              'rgb(178,204,255)',\n\n    /**\n     * Color of controlling corners of an object (when it's active and transparentCorners false)\n     * @since 1.6.2\n     * @type String\n     * @default\n     */\n    cornerStrokeColor:        null,\n\n    /**\n     * Specify style of control, 'rect' or 'circle'\n     * @since 1.6.2\n     * @type String\n     */\n    cornerStyle:          'rect',\n\n    /**\n     * Array specifying dash pattern of an object's control (hasBorder must be true)\n     * @since 1.6.2\n     * @type Array\n     */\n    cornerDashArray:          null,\n\n    /**\n     * When true, this object will use center point as the origin of transformation\n     * when being scaled via the controls.\n     * <b>Backwards incompatibility note:</b> This property replaces \"centerTransform\" (Boolean).\n     * @since 1.3.4\n     * @type Boolean\n     * @default\n     */\n    centeredScaling:          false,\n\n    /**\n     * When true, this object will use center point as the origin of transformation\n     * when being rotated via the controls.\n     * <b>Backwards incompatibility note:</b> This property replaces \"centerTransform\" (Boolean).\n     * @since 1.3.4\n     * @type Boolean\n     * @default\n     */\n    centeredRotation:         true,\n\n    /**\n     * Color of object's fill\n     * takes css colors https://www.w3.org/TR/css-color-3/\n     * @type String\n     * @default\n     */\n    fill:                     'rgb(0,0,0)',\n\n    /**\n     * Fill rule used to fill an object\n     * accepted values are nonzero, evenodd\n     * <b>Backwards incompatibility note:</b> This property was used for setting globalCompositeOperation until v1.4.12 (use `fabric.Object#globalCompositeOperation` instead)\n     * @type String\n     * @default\n     */\n    fillRule:                 'nonzero',\n\n    /**\n     * Composite rule used for canvas globalCompositeOperation\n     * @type String\n     * @default\n     */\n    globalCompositeOperation: 'source-over',\n\n    /**\n     * Background color of an object.\n     * takes css colors https://www.w3.org/TR/css-color-3/\n     * @type String\n     * @default\n     */\n    backgroundColor:          '',\n\n    /**\n     * Selection Background color of an object. colored layer behind the object when it is active.\n     * does not mix good with globalCompositeOperation methods.\n     * @type String\n     * @default\n     */\n    selectionBackgroundColor:          '',\n\n    /**\n     * When defined, an object is rendered via stroke and this property specifies its color\n     * takes css colors https://www.w3.org/TR/css-color-3/\n     * @type String\n     * @default\n     */\n    stroke:                   null,\n\n    /**\n     * Width of a stroke used to render this object\n     * @type Number\n     * @default\n     */\n    strokeWidth:              1,\n\n    /**\n     * Array specifying dash pattern of an object's stroke (stroke must be defined)\n     * @type Array\n     */\n    strokeDashArray:          null,\n\n    /**\n     * Line offset of an object's stroke\n     * @type Number\n     * @default\n     */\n    strokeDashOffset: 0,\n\n    /**\n     * Line endings style of an object's stroke (one of \"butt\", \"round\", \"square\")\n     * @type String\n     * @default\n     */\n    strokeLineCap:            'butt',\n\n    /**\n     * Corner style of an object's stroke (one of \"bevel\", \"round\", \"miter\")\n     * @type String\n     * @default\n     */\n    strokeLineJoin:           'miter',\n\n    /**\n     * Maximum miter length (used for strokeLineJoin = \"miter\") of an object's stroke\n     * @type Number\n     * @default\n     */\n    strokeMiterLimit:         4,\n\n    /**\n     * Shadow object representing shadow of this shape\n     * @type fabric.Shadow\n     * @default\n     */\n    shadow:                   null,\n\n    /**\n     * Opacity of object's controlling borders when object is active and moving\n     * @type Number\n     * @default\n     */\n    borderOpacityWhenMoving:  0.4,\n\n    /**\n     * Scale factor of object's controlling borders\n     * bigger number will make a thicker border\n     * border is 1, so this is basically a border thickness\n     * since there is no way to change the border itself.\n     * @type Number\n     * @default\n     */\n    borderScaleFactor:        1,\n\n    /**\n     * Minimum allowed scale value of an object\n     * @type Number\n     * @default\n     */\n    minScaleLimit:            0,\n\n    /**\n     * When set to `false`, an object can not be selected for modification (using either point-click-based or group-based selection).\n     * But events still fire on it.\n     * @type Boolean\n     * @default\n     */\n    selectable:               true,\n\n    /**\n     * When set to `false`, an object can not be a target of events. All events propagate through it. Introduced in v1.3.4\n     * @type Boolean\n     * @default\n     */\n    evented:                  true,\n\n    /**\n     * When set to `false`, an object is not rendered on canvas\n     * @type Boolean\n     * @default\n     */\n    visible:                  true,\n\n    /**\n     * When set to `false`, object's controls are not displayed and can not be used to manipulate object\n     * @type Boolean\n     * @default\n     */\n    hasControls:              true,\n\n    /**\n     * When set to `false`, object's controlling borders are not rendered\n     * @type Boolean\n     * @default\n     */\n    hasBorders:               true,\n\n    /**\n     * When set to `true`, objects are \"found\" on canvas on per-pixel basis rather than according to bounding box\n     * @type Boolean\n     * @default\n     */\n    perPixelTargetFind:       false,\n\n    /**\n     * When `false`, default object's values are not included in its serialization\n     * @type Boolean\n     * @default\n     */\n    includeDefaultValues:     true,\n\n    /**\n     * When `true`, object horizontal movement is locked\n     * @type Boolean\n     * @default\n     */\n    lockMovementX:            false,\n\n    /**\n     * When `true`, object vertical movement is locked\n     * @type Boolean\n     * @default\n     */\n    lockMovementY:            false,\n\n    /**\n     * When `true`, object rotation is locked\n     * @type Boolean\n     * @default\n     */\n    lockRotation:             false,\n\n    /**\n     * When `true`, object horizontal scaling is locked\n     * @type Boolean\n     * @default\n     */\n    lockScalingX:             false,\n\n    /**\n     * When `true`, object vertical scaling is locked\n     * @type Boolean\n     * @default\n     */\n    lockScalingY:             false,\n\n    /**\n     * When `true`, object horizontal skewing is locked\n     * @type Boolean\n     * @default\n     */\n    lockSkewingX:             false,\n\n    /**\n     * When `true`, object vertical skewing is locked\n     * @type Boolean\n     * @default\n     */\n    lockSkewingY:             false,\n\n    /**\n     * When `true`, object cannot be flipped by scaling into negative values\n     * @type Boolean\n     * @default\n     */\n    lockScalingFlip:          false,\n\n    /**\n     * When `true`, object is not exported in OBJECT/JSON\n     * @since 1.6.3\n     * @type Boolean\n     * @default\n     */\n    excludeFromExport:        false,\n\n    /**\n     * When `true`, object is cached on an additional canvas.\n     * When `false`, object is not cached unless necessary ( clipPath )\n     * default to true\n     * @since 1.7.0\n     * @type Boolean\n     * @default true\n     */\n    objectCaching:            objectCaching,\n\n    /**\n     * When `true`, object properties are checked for cache invalidation. In some particular\n     * situation you may want this to be disabled ( spray brush, very big, groups)\n     * or if your application does not allow you to modify properties for groups child you want\n     * to disable it for groups.\n     * default to false\n     * since 1.7.0\n     * @type Boolean\n     * @default false\n     */\n    statefullCache:            false,\n\n    /**\n     * When `true`, cache does not get updated during scaling. The picture will get blocky if scaled\n     * too much and will be redrawn with correct details at the end of scaling.\n     * this setting is performance and application dependant.\n     * default to true\n     * since 1.7.0\n     * @type Boolean\n     * @default true\n     */\n    noScaleCache:              true,\n\n    /**\n     * When `false`, the stoke width will scale with the object.\n     * When `true`, the stroke will always match the exact pixel size entered for stroke width.\n     * default to false\n     * @since 2.6.0\n     * @type Boolean\n     * @default false\n     * @type Boolean\n     * @default false\n     */\n    strokeUniform:              false,\n\n    /**\n     * When set to `true`, object's cache will be rerendered next render call.\n     * since 1.7.0\n     * @type Boolean\n     * @default true\n     */\n    dirty:                true,\n\n    /**\n     * keeps the value of the last hovered corner during mouse move.\n     * 0 is no corner, or 'mt', 'ml', 'mtr' etc..\n     * It should be private, but there is no harm in using it as\n     * a read-only property.\n     * @type number|string|any\n     * @default 0\n     */\n    __corner: 0,\n\n    /**\n     * Determines if the fill or the stroke is drawn first (one of \"fill\" or \"stroke\")\n     * @type String\n     * @default\n     */\n    paintFirst:           'fill',\n\n    /**\n     * When 'down', object is set to active on mousedown/touchstart\n     * When 'up', object is set to active on mouseup/touchend\n     * Experimental. Let's see if this breaks anything before supporting officially\n     * @private\n     * since 4.4.0\n     * @type String\n     * @default 'down'\n     */\n    activeOn:           'down',\n\n    /**\n     * List of properties to consider when checking if state\n     * of an object is changed (fabric.Object#hasStateChanged)\n     * as well as for history (undo/redo) purposes\n     * @type Array\n     */\n    stateProperties: (\n      'top left width height scaleX scaleY flipX flipY originX originY transformMatrix ' +\n      'stroke strokeWidth strokeDashArray strokeLineCap strokeDashOffset strokeLineJoin strokeMiterLimit ' +\n      'angle opacity fill globalCompositeOperation shadow visible backgroundColor ' +\n      'skewX skewY fillRule paintFirst clipPath strokeUniform'\n    ).split(' '),\n\n    /**\n     * List of properties to consider when checking if cache needs refresh\n     * Those properties are checked by statefullCache ON ( or lazy mode if we want ) or from single\n     * calls to Object.set(key, value). If the key is in this list, the object is marked as dirty\n     * and refreshed at the next render\n     * @type Array\n     */\n    cacheProperties: (\n      'fill stroke strokeWidth strokeDashArray width height paintFirst strokeUniform' +\n      ' strokeLineCap strokeDashOffset strokeLineJoin strokeMiterLimit backgroundColor clipPath'\n    ).split(' '),\n\n    /**\n     * List of properties to consider for animating colors.\n     * @type Array\n     */\n    colorProperties: (\n      'fill stroke backgroundColor'\n    ).split(' '),\n\n    /**\n     * a fabricObject that, without stroke define a clipping area with their shape. filled in black\n     * the clipPath object gets used when the object has rendered, and the context is placed in the center\n     * of the object cacheCanvas.\n     * If you want 0,0 of a clipPath to align with an object center, use clipPath.originX/Y to 'center'\n     * @type fabric.Object\n     */\n    clipPath: undefined,\n\n    /**\n     * Meaningful ONLY when the object is used as clipPath.\n     * if true, the clipPath will make the object clip to the outside of the clipPath\n     * since 2.4.0\n     * @type boolean\n     * @default false\n     */\n    inverted: false,\n\n    /**\n     * Meaningful ONLY when the object is used as clipPath.\n     * if true, the clipPath will have its top and left relative to canvas, and will\n     * not be influenced by the object transform. This will make the clipPath relative\n     * to the canvas, but clipping just a particular object.\n     * WARNING this is beta, this feature may change or be renamed.\n     * since 2.4.0\n     * @type boolean\n     * @default false\n     */\n    absolutePositioned: false,\n\n    /**\n     * Constructor\n     * @param {Object} [options] Options object\n     */\n    initialize: function(options) {\n      if (options) {\n        this.setOptions(options);\n      }\n    },\n\n    /**\n     * Create a the canvas used to keep the cached copy of the object\n     * @private\n     */\n    _createCacheCanvas: function() {\n      this._cacheProperties = {};\n      this._cacheCanvas = fabric.util.createCanvasElement();\n      this._cacheContext = this._cacheCanvas.getContext('2d');\n      this._updateCacheCanvas();\n      // if canvas gets created, is empty, so dirty.\n      this.dirty = true;\n    },\n\n    /**\n     * Limit the cache dimensions so that X * Y do not cross fabric.perfLimitSizeTotal\n     * and each side do not cross fabric.cacheSideLimit\n     * those numbers are configurable so that you can get as much detail as you want\n     * making bargain with performances.\n     * @param {Object} dims\n     * @param {Object} dims.width width of canvas\n     * @param {Object} dims.height height of canvas\n     * @param {Object} dims.zoomX zoomX zoom value to unscale the canvas before drawing cache\n     * @param {Object} dims.zoomY zoomY zoom value to unscale the canvas before drawing cache\n     * @return {Object}.width width of canvas\n     * @return {Object}.height height of canvas\n     * @return {Object}.zoomX zoomX zoom value to unscale the canvas before drawing cache\n     * @return {Object}.zoomY zoomY zoom value to unscale the canvas before drawing cache\n     */\n    _limitCacheSize: function(dims) {\n      var perfLimitSizeTotal = fabric.perfLimitSizeTotal,\n          width = dims.width, height = dims.height,\n          max = fabric.maxCacheSideLimit, min = fabric.minCacheSideLimit;\n      if (width <= max && height <= max && width * height <= perfLimitSizeTotal) {\n        if (width < min) {\n          dims.width = min;\n        }\n        if (height < min) {\n          dims.height = min;\n        }\n        return dims;\n      }\n      var ar = width / height, limitedDims = fabric.util.limitDimsByArea(ar, perfLimitSizeTotal),\n          capValue = fabric.util.capValue,\n          x = capValue(min, limitedDims.x, max),\n          y = capValue(min, limitedDims.y, max);\n      if (width > x) {\n        dims.zoomX /= width / x;\n        dims.width = x;\n        dims.capped = true;\n      }\n      if (height > y) {\n        dims.zoomY /= height / y;\n        dims.height = y;\n        dims.capped = true;\n      }\n      return dims;\n    },\n\n    /**\n     * Return the dimension and the zoom level needed to create a cache canvas\n     * big enough to host the object to be cached.\n     * @private\n     * @return {Object}.x width of object to be cached\n     * @return {Object}.y height of object to be cached\n     * @return {Object}.width width of canvas\n     * @return {Object}.height height of canvas\n     * @return {Object}.zoomX zoomX zoom value to unscale the canvas before drawing cache\n     * @return {Object}.zoomY zoomY zoom value to unscale the canvas before drawing cache\n     */\n    _getCacheCanvasDimensions: function() {\n      var objectScale = this.getTotalObjectScaling(),\n          // caculate dimensions without skewing\n          dim = this._getTransformedDimensions(0, 0),\n          neededX = dim.x * objectScale.scaleX / this.scaleX,\n          neededY = dim.y * objectScale.scaleY / this.scaleY;\n      return {\n        // for sure this ALIASING_LIMIT is slightly creating problem\n        // in situation in which the cache canvas gets an upper limit\n        // also objectScale contains already scaleX and scaleY\n        width: neededX + ALIASING_LIMIT,\n        height: neededY + ALIASING_LIMIT,\n        zoomX: objectScale.scaleX,\n        zoomY: objectScale.scaleY,\n        x: neededX,\n        y: neededY\n      };\n    },\n\n    /**\n     * Update width and height of the canvas for cache\n     * returns true or false if canvas needed resize.\n     * @private\n     * @return {Boolean} true if the canvas has been resized\n     */\n    _updateCacheCanvas: function() {\n      var targetCanvas = this.canvas;\n      if (this.noScaleCache && targetCanvas && targetCanvas._currentTransform) {\n        var target = targetCanvas._currentTransform.target,\n            action = targetCanvas._currentTransform.action;\n        if (this === target && action.slice && action.slice(0, 5) === 'scale') {\n          return false;\n        }\n      }\n      var canvas = this._cacheCanvas,\n          dims = this._limitCacheSize(this._getCacheCanvasDimensions()),\n          minCacheSize = fabric.minCacheSideLimit,\n          width = dims.width, height = dims.height, drawingWidth, drawingHeight,\n          zoomX = dims.zoomX, zoomY = dims.zoomY,\n          dimensionsChanged = width !== this.cacheWidth || height !== this.cacheHeight,\n          zoomChanged = this.zoomX !== zoomX || this.zoomY !== zoomY,\n          shouldRedraw = dimensionsChanged || zoomChanged,\n          additionalWidth = 0, additionalHeight = 0, shouldResizeCanvas = false;\n      if (dimensionsChanged) {\n        var canvasWidth = this._cacheCanvas.width,\n            canvasHeight = this._cacheCanvas.height,\n            sizeGrowing = width > canvasWidth || height > canvasHeight,\n            sizeShrinking = (width < canvasWidth * 0.9 || height < canvasHeight * 0.9) &&\n              canvasWidth > minCacheSize && canvasHeight > minCacheSize;\n        shouldResizeCanvas = sizeGrowing || sizeShrinking;\n        if (sizeGrowing && !dims.capped && (width > minCacheSize || height > minCacheSize)) {\n          additionalWidth = width * 0.1;\n          additionalHeight = height * 0.1;\n        }\n      }\n      if (this instanceof fabric.Text && this.path) {\n        shouldRedraw = true;\n        shouldResizeCanvas = true;\n        additionalWidth += this.getHeightOfLine(0) * this.zoomX;\n        additionalHeight += this.getHeightOfLine(0) * this.zoomY;\n      }\n      if (shouldRedraw) {\n        if (shouldResizeCanvas) {\n          canvas.width = Math.ceil(width + additionalWidth);\n          canvas.height = Math.ceil(height + additionalHeight);\n        }\n        else {\n          this._cacheContext.setTransform(1, 0, 0, 1, 0, 0);\n          this._cacheContext.clearRect(0, 0, canvas.width, canvas.height);\n        }\n        drawingWidth = dims.x / 2;\n        drawingHeight = dims.y / 2;\n        this.cacheTranslationX = Math.round(canvas.width / 2 - drawingWidth) + drawingWidth;\n        this.cacheTranslationY = Math.round(canvas.height / 2 - drawingHeight) + drawingHeight;\n        this.cacheWidth = width;\n        this.cacheHeight = height;\n        this._cacheContext.translate(this.cacheTranslationX, this.cacheTranslationY);\n        this._cacheContext.scale(zoomX, zoomY);\n        this.zoomX = zoomX;\n        this.zoomY = zoomY;\n        return true;\n      }\n      return false;\n    },\n\n    /**\n     * Sets object's properties from options\n     * @param {Object} [options] Options object\n     */\n    setOptions: function(options) {\n      this._setOptions(options);\n      this._initGradient(options.fill, 'fill');\n      this._initGradient(options.stroke, 'stroke');\n      this._initPattern(options.fill, 'fill');\n      this._initPattern(options.stroke, 'stroke');\n    },\n\n    /**\n     * Transforms context when rendering an object\n     * @param {CanvasRenderingContext2D} ctx Context\n     */\n    transform: function(ctx) {\n      var needFullTransform = (this.group && !this.group._transformDone) ||\n         (this.group && this.canvas && ctx === this.canvas.contextTop);\n      var m = this.calcTransformMatrix(!needFullTransform);\n      ctx.transform(m[0], m[1], m[2], m[3], m[4], m[5]);\n    },\n\n    /**\n     * Returns an object representation of an instance\n     * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n     * @return {Object} Object representation of an instance\n     */\n    toObject: function(propertiesToInclude) {\n      var NUM_FRACTION_DIGITS = fabric.Object.NUM_FRACTION_DIGITS,\n\n          object = {\n            type:                     this.type,\n            version:                  fabric.version,\n            originX:                  this.originX,\n            originY:                  this.originY,\n            left:                     toFixed(this.left, NUM_FRACTION_DIGITS),\n            top:                      toFixed(this.top, NUM_FRACTION_DIGITS),\n            width:                    toFixed(this.width, NUM_FRACTION_DIGITS),\n            height:                   toFixed(this.height, NUM_FRACTION_DIGITS),\n            fill:                     (this.fill && this.fill.toObject) ? this.fill.toObject() : this.fill,\n            stroke:                   (this.stroke && this.stroke.toObject) ? this.stroke.toObject() : this.stroke,\n            strokeWidth:              toFixed(this.strokeWidth, NUM_FRACTION_DIGITS),\n            strokeDashArray:          this.strokeDashArray ? this.strokeDashArray.concat() : this.strokeDashArray,\n            strokeLineCap:            this.strokeLineCap,\n            strokeDashOffset:         this.strokeDashOffset,\n            strokeLineJoin:           this.strokeLineJoin,\n            strokeUniform:            this.strokeUniform,\n            strokeMiterLimit:         toFixed(this.strokeMiterLimit, NUM_FRACTION_DIGITS),\n            scaleX:                   toFixed(this.scaleX, NUM_FRACTION_DIGITS),\n            scaleY:                   toFixed(this.scaleY, NUM_FRACTION_DIGITS),\n            angle:                    toFixed(this.angle, NUM_FRACTION_DIGITS),\n            flipX:                    this.flipX,\n            flipY:                    this.flipY,\n            opacity:                  toFixed(this.opacity, NUM_FRACTION_DIGITS),\n            shadow:                   (this.shadow && this.shadow.toObject) ? this.shadow.toObject() : this.shadow,\n            visible:                  this.visible,\n            backgroundColor:          this.backgroundColor,\n            fillRule:                 this.fillRule,\n            paintFirst:               this.paintFirst,\n            globalCompositeOperation: this.globalCompositeOperation,\n            skewX:                    toFixed(this.skewX, NUM_FRACTION_DIGITS),\n            skewY:                    toFixed(this.skewY, NUM_FRACTION_DIGITS),\n          };\n\n      if (this.clipPath && !this.clipPath.excludeFromExport) {\n        object.clipPath = this.clipPath.toObject(propertiesToInclude);\n        object.clipPath.inverted = this.clipPath.inverted;\n        object.clipPath.absolutePositioned = this.clipPath.absolutePositioned;\n      }\n\n      fabric.util.populateWithProperties(this, object, propertiesToInclude);\n      if (!this.includeDefaultValues) {\n        object = this._removeDefaultValues(object);\n      }\n\n      return object;\n    },\n\n    /**\n     * Returns (dataless) object representation of an instance\n     * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n     * @return {Object} Object representation of an instance\n     */\n    toDatalessObject: function(propertiesToInclude) {\n      // will be overwritten by subclasses\n      return this.toObject(propertiesToInclude);\n    },\n\n    /**\n     * @private\n     * @param {Object} object\n     */\n    _removeDefaultValues: function(object) {\n      var prototype = fabric.util.getKlass(object.type).prototype,\n          stateProperties = prototype.stateProperties;\n      stateProperties.forEach(function(prop) {\n        if (prop === 'left' || prop === 'top') {\n          return;\n        }\n        if (object[prop] === prototype[prop]) {\n          delete object[prop];\n        }\n        var isArray = Object.prototype.toString.call(object[prop]) === '[object Array]' &&\n                      Object.prototype.toString.call(prototype[prop]) === '[object Array]';\n\n        // basically a check for [] === []\n        if (isArray && object[prop].length === 0 && prototype[prop].length === 0) {\n          delete object[prop];\n        }\n      });\n\n      return object;\n    },\n\n    /**\n     * Returns a string representation of an instance\n     * @return {String}\n     */\n    toString: function() {\n      return '#<fabric.' + capitalize(this.type) + '>';\n    },\n\n    /**\n     * Return the object scale factor counting also the group scaling\n     * @return {Object} object with scaleX and scaleY properties\n     */\n    getObjectScaling: function() {\n      // if the object is a top level one, on the canvas, we go for simple aritmetic\n      // otherwise the complex method with angles will return approximations and decimals\n      // and will likely kill the cache when not needed\n      // https://github.com/fabricjs/fabric.js/issues/7157\n      if (!this.group) {\n        return {\n          scaleX: this.scaleX,\n          scaleY: this.scaleY,\n        };\n      }\n      // if we are inside a group total zoom calculation is complex, we defer to generic matrices\n      var options = fabric.util.qrDecompose(this.calcTransformMatrix());\n      return { scaleX: Math.abs(options.scaleX), scaleY: Math.abs(options.scaleY) };\n    },\n\n    /**\n     * Return the object scale factor counting also the group scaling, zoom and retina\n     * @return {Object} object with scaleX and scaleY properties\n     */\n    getTotalObjectScaling: function() {\n      var scale = this.getObjectScaling(), scaleX = scale.scaleX, scaleY = scale.scaleY;\n      if (this.canvas) {\n        var zoom = this.canvas.getZoom();\n        var retina = this.canvas.getRetinaScaling();\n        scaleX *= zoom * retina;\n        scaleY *= zoom * retina;\n      }\n      return { scaleX: scaleX, scaleY: scaleY };\n    },\n\n    /**\n     * Return the object opacity counting also the group property\n     * @return {Number}\n     */\n    getObjectOpacity: function() {\n      var opacity = this.opacity;\n      if (this.group) {\n        opacity *= this.group.getObjectOpacity();\n      }\n      return opacity;\n    },\n\n    /**\n     * @private\n     * @param {String} key\n     * @param {*} value\n     * @return {fabric.Object} thisArg\n     */\n    _set: function(key, value) {\n      var shouldConstrainValue = (key === 'scaleX' || key === 'scaleY'),\n          isChanged = this[key] !== value, groupNeedsUpdate = false;\n\n      if (shouldConstrainValue) {\n        value = this._constrainScale(value);\n      }\n      if (key === 'scaleX' && value < 0) {\n        this.flipX = !this.flipX;\n        value *= -1;\n      }\n      else if (key === 'scaleY' && value < 0) {\n        this.flipY = !this.flipY;\n        value *= -1;\n      }\n      else if (key === 'shadow' && value && !(value instanceof fabric.Shadow)) {\n        value = new fabric.Shadow(value);\n      }\n      else if (key === 'dirty' && this.group) {\n        this.group.set('dirty', value);\n      }\n\n      this[key] = value;\n\n      if (isChanged) {\n        groupNeedsUpdate = this.group && this.group.isOnACache();\n        if (this.cacheProperties.indexOf(key) > -1) {\n          this.dirty = true;\n          groupNeedsUpdate && this.group.set('dirty', true);\n        }\n        else if (groupNeedsUpdate && this.stateProperties.indexOf(key) > -1) {\n          this.group.set('dirty', true);\n        }\n      }\n      return this;\n    },\n\n    /**\n     * This callback function is called by the parent group of an object every\n     * time a non-delegated property changes on the group. It is passed the key\n     * and value as parameters. Not adding in this function's signature to avoid\n     * Travis build error about unused variables.\n     */\n    setOnGroup: function() {\n      // implemented by sub-classes, as needed.\n    },\n\n    /**\n     * Retrieves viewportTransform from Object's canvas if possible\n     * @method getViewportTransform\n     * @memberOf fabric.Object.prototype\n     * @return {Array}\n     */\n    getViewportTransform: function() {\n      if (this.canvas && this.canvas.viewportTransform) {\n        return this.canvas.viewportTransform;\n      }\n      return fabric.iMatrix.concat();\n    },\n\n    /*\n     * @private\n     * return if the object would be visible in rendering\n     * @memberOf fabric.Object.prototype\n     * @return {Boolean}\n     */\n    isNotVisible: function() {\n      return this.opacity === 0 ||\n        (!this.width && !this.height && this.strokeWidth === 0) ||\n        !this.visible;\n    },\n\n    /**\n     * Renders an object on a specified context\n     * @param {CanvasRenderingContext2D} ctx Context to render on\n     */\n    render: function(ctx) {\n      // do not render if width/height are zeros or object is not visible\n      if (this.isNotVisible()) {\n        return;\n      }\n      if (this.canvas && this.canvas.skipOffscreen && !this.group && !this.isOnScreen()) {\n        return;\n      }\n      ctx.save();\n      this._setupCompositeOperation(ctx);\n      this.drawSelectionBackground(ctx);\n      this.transform(ctx);\n      this._setOpacity(ctx);\n      this._setShadow(ctx, this);\n      if (this.shouldCache()) {\n        this.renderCache();\n        this.drawCacheOnCanvas(ctx);\n      }\n      else {\n        this._removeCacheCanvas();\n        this.dirty = false;\n        this.drawObject(ctx);\n        if (this.objectCaching && this.statefullCache) {\n          this.saveState({ propertySet: 'cacheProperties' });\n        }\n      }\n      ctx.restore();\n    },\n\n    renderCache: function(options) {\n      options = options || {};\n      if (!this._cacheCanvas) {\n        this._createCacheCanvas();\n      }\n      if (this.isCacheDirty()) {\n        this.statefullCache && this.saveState({ propertySet: 'cacheProperties' });\n        this.drawObject(this._cacheContext, options.forClipping);\n        this.dirty = false;\n      }\n    },\n\n    /**\n     * Remove cacheCanvas and its dimensions from the objects\n     */\n    _removeCacheCanvas: function() {\n      this._cacheCanvas = null;\n      this.cacheWidth = 0;\n      this.cacheHeight = 0;\n    },\n\n    /**\n     * return true if the object will draw a stroke\n     * Does not consider text styles. This is just a shortcut used at rendering time\n     * We want it to be an approximation and be fast.\n     * wrote to avoid extra caching, it has to return true when stroke happens,\n     * can guess when it will not happen at 100% chance, does not matter if it misses\n     * some use case where the stroke is invisible.\n     * @since 3.0.0\n     * @returns Boolean\n     */\n    hasStroke: function() {\n      return this.stroke && this.stroke !== 'transparent' && this.strokeWidth !== 0;\n    },\n\n    /**\n     * return true if the object will draw a fill\n     * Does not consider text styles. This is just a shortcut used at rendering time\n     * We want it to be an approximation and be fast.\n     * wrote to avoid extra caching, it has to return true when fill happens,\n     * can guess when it will not happen at 100% chance, does not matter if it misses\n     * some use case where the fill is invisible.\n     * @since 3.0.0\n     * @returns Boolean\n     */\n    hasFill: function() {\n      return this.fill && this.fill !== 'transparent';\n    },\n\n    /**\n     * When set to `true`, force the object to have its own cache, even if it is inside a group\n     * it may be needed when your object behave in a particular way on the cache and always needs\n     * its own isolated canvas to render correctly.\n     * Created to be overridden\n     * since 1.7.12\n     * @returns Boolean\n     */\n    needsItsOwnCache: function() {\n      if (this.paintFirst === 'stroke' &&\n        this.hasFill() && this.hasStroke() && typeof this.shadow === 'object') {\n        return true;\n      }\n      if (this.clipPath) {\n        return true;\n      }\n      return false;\n    },\n\n    /**\n     * Decide if the object should cache or not. Create its own cache level\n     * objectCaching is a global flag, wins over everything\n     * needsItsOwnCache should be used when the object drawing method requires\n     * a cache step. None of the fabric classes requires it.\n     * Generally you do not cache objects in groups because the group outside is cached.\n     * Read as: cache if is needed, or if the feature is enabled but we are not already caching.\n     * @return {Boolean}\n     */\n    shouldCache: function() {\n      this.ownCaching = this.needsItsOwnCache() || (\n        this.objectCaching &&\n        (!this.group || !this.group.isOnACache())\n      );\n      return this.ownCaching;\n    },\n\n    /**\n     * Check if this object or a child object will cast a shadow\n     * used by Group.shouldCache to know if child has a shadow recursively\n     * @return {Boolean}\n     */\n    willDrawShadow: function() {\n      return !!this.shadow && (this.shadow.offsetX !== 0 || this.shadow.offsetY !== 0);\n    },\n\n    /**\n     * Execute the drawing operation for an object clipPath\n     * @param {CanvasRenderingContext2D} ctx Context to render on\n     */\n    drawClipPathOnCache: function(ctx) {\n      var path = this.clipPath;\n      ctx.save();\n      // DEBUG: uncomment this line, comment the following\n      // ctx.globalAlpha = 0.4\n      if (path.inverted) {\n        ctx.globalCompositeOperation = 'destination-out';\n      }\n      else {\n        ctx.globalCompositeOperation = 'destination-in';\n      }\n      //ctx.scale(1 / 2, 1 / 2);\n      if (path.absolutePositioned) {\n        var m = fabric.util.invertTransform(this.calcTransformMatrix());\n        ctx.transform(m[0], m[1], m[2], m[3], m[4], m[5]);\n      }\n      path.transform(ctx);\n      ctx.scale(1 / path.zoomX, 1 / path.zoomY);\n      ctx.drawImage(path._cacheCanvas, -path.cacheTranslationX, -path.cacheTranslationY);\n      ctx.restore();\n    },\n\n    /**\n     * Execute the drawing operation for an object on a specified context\n     * @param {CanvasRenderingContext2D} ctx Context to render on\n     */\n    drawObject: function(ctx, forClipping) {\n      var originalFill = this.fill, originalStroke = this.stroke;\n      if (forClipping) {\n        this.fill = 'black';\n        this.stroke = '';\n        this._setClippingProperties(ctx);\n      }\n      else {\n        this._renderBackground(ctx);\n      }\n      this._render(ctx);\n      this._drawClipPath(ctx);\n      this.fill = originalFill;\n      this.stroke = originalStroke;\n    },\n\n    _drawClipPath: function(ctx) {\n      var path = this.clipPath;\n      if (!path) { return; }\n      // needed to setup a couple of variables\n      // path canvas gets overridden with this one.\n      // TODO find a better solution?\n      path.canvas = this.canvas;\n      path.shouldCache();\n      path._transformDone = true;\n      path.renderCache({ forClipping: true });\n      this.drawClipPathOnCache(ctx);\n    },\n\n    /**\n     * Paint the cached copy of the object on the target context.\n     * @param {CanvasRenderingContext2D} ctx Context to render on\n     */\n    drawCacheOnCanvas: function(ctx) {\n      ctx.scale(1 / this.zoomX, 1 / this.zoomY);\n      ctx.drawImage(this._cacheCanvas, -this.cacheTranslationX, -this.cacheTranslationY);\n    },\n\n    /**\n     * Check if cache is dirty\n     * @param {Boolean} skipCanvas skip canvas checks because this object is painted\n     * on parent canvas.\n     */\n    isCacheDirty: function(skipCanvas) {\n      if (this.isNotVisible()) {\n        return false;\n      }\n      if (this._cacheCanvas && !skipCanvas && this._updateCacheCanvas()) {\n        // in this case the context is already cleared.\n        return true;\n      }\n      else {\n        if (this.dirty ||\n          (this.clipPath && this.clipPath.absolutePositioned) ||\n          (this.statefullCache && this.hasStateChanged('cacheProperties'))\n        ) {\n          if (this._cacheCanvas && !skipCanvas) {\n            var width = this.cacheWidth / this.zoomX;\n            var height = this.cacheHeight / this.zoomY;\n            this._cacheContext.clearRect(-width / 2, -height / 2, width, height);\n          }\n          return true;\n        }\n      }\n      return false;\n    },\n\n    /**\n     * Draws a background for the object big as its untransformed dimensions\n     * @private\n     * @param {CanvasRenderingContext2D} ctx Context to render on\n     */\n    _renderBackground: function(ctx) {\n      if (!this.backgroundColor) {\n        return;\n      }\n      var dim = this._getNonTransformedDimensions();\n      ctx.fillStyle = this.backgroundColor;\n\n      ctx.fillRect(\n        -dim.x / 2,\n        -dim.y / 2,\n        dim.x,\n        dim.y\n      );\n      // if there is background color no other shadows\n      // should be casted\n      this._removeShadow(ctx);\n    },\n\n    /**\n     * @private\n     * @param {CanvasRenderingContext2D} ctx Context to render on\n     */\n    _setOpacity: function(ctx) {\n      if (this.group && !this.group._transformDone) {\n        ctx.globalAlpha = this.getObjectOpacity();\n      }\n      else {\n        ctx.globalAlpha *= this.opacity;\n      }\n    },\n\n    _setStrokeStyles: function(ctx, decl) {\n      var stroke = decl.stroke;\n      if (stroke) {\n        ctx.lineWidth = decl.strokeWidth;\n        ctx.lineCap = decl.strokeLineCap;\n        ctx.lineDashOffset = decl.strokeDashOffset;\n        ctx.lineJoin = decl.strokeLineJoin;\n        ctx.miterLimit = decl.strokeMiterLimit;\n        if (stroke.toLive) {\n          if (stroke.gradientUnits === 'percentage' || stroke.gradientTransform || stroke.patternTransform) {\n            // need to transform gradient in a pattern.\n            // this is a slow process. If you are hitting this codepath, and the object\n            // is not using caching, you should consider switching it on.\n            // we need a canvas as big as the current object caching canvas.\n            this._applyPatternForTransformedGradient(ctx, stroke);\n          }\n          else {\n            // is a simple gradient or pattern\n            ctx.strokeStyle = stroke.toLive(ctx, this);\n            this._applyPatternGradientTransform(ctx, stroke);\n          }\n        }\n        else {\n          // is a color\n          ctx.strokeStyle = decl.stroke;\n        }\n      }\n    },\n\n    _setFillStyles: function(ctx, decl) {\n      var fill = decl.fill;\n      if (fill) {\n        if (fill.toLive) {\n          ctx.fillStyle = fill.toLive(ctx, this);\n          this._applyPatternGradientTransform(ctx, decl.fill);\n        }\n        else {\n          ctx.fillStyle = fill;\n        }\n      }\n    },\n\n    _setClippingProperties: function(ctx) {\n      ctx.globalAlpha = 1;\n      ctx.strokeStyle = 'transparent';\n      ctx.fillStyle = '#000000';\n    },\n\n    /**\n     * @private\n     * Sets line dash\n     * @param {CanvasRenderingContext2D} ctx Context to set the dash line on\n     * @param {Array} dashArray array representing dashes\n     */\n    _setLineDash: function(ctx, dashArray) {\n      if (!dashArray || dashArray.length === 0) {\n        return;\n      }\n      // Spec requires the concatenation of two copies the dash list when the number of elements is odd\n      if (1 & dashArray.length) {\n        dashArray.push.apply(dashArray, dashArray);\n      }\n      ctx.setLineDash(dashArray);\n    },\n\n    /**\n     * Renders controls and borders for the object\n     * @param {CanvasRenderingContext2D} ctx Context to render on\n     * @param {Object} [styleOverride] properties to override the object style\n     */\n    _renderControls: function(ctx, styleOverride) {\n      var vpt = this.getViewportTransform(),\n          matrix = this.calcTransformMatrix(),\n          options, drawBorders, drawControls;\n      styleOverride = styleOverride || { };\n      drawBorders = typeof styleOverride.hasBorders !== 'undefined' ? styleOverride.hasBorders : this.hasBorders;\n      drawControls = typeof styleOverride.hasControls !== 'undefined' ? styleOverride.hasControls : this.hasControls;\n      matrix = fabric.util.multiplyTransformMatrices(vpt, matrix);\n      options = fabric.util.qrDecompose(matrix);\n      ctx.save();\n      ctx.translate(options.translateX, options.translateY);\n      ctx.lineWidth = 1 * this.borderScaleFactor;\n      if (!this.group) {\n        ctx.globalAlpha = this.isMoving ? this.borderOpacityWhenMoving : 1;\n      }\n      ctx.rotate(degreesToRadians(options.angle));\n      if (styleOverride.forActiveSelection || this.group) {\n        drawBorders && this.drawBordersInGroup(ctx, options, styleOverride);\n      }\n      else {\n        drawBorders && this.drawBorders(ctx, styleOverride);\n      }\n      drawControls && this.drawControls(ctx, styleOverride);\n      ctx.restore();\n    },\n\n    /**\n     * @private\n     * @param {CanvasRenderingContext2D} ctx Context to render on\n     */\n    _setShadow: function(ctx) {\n      if (!this.shadow) {\n        return;\n      }\n\n      var shadow = this.shadow, canvas = this.canvas, scaling,\n          multX = (canvas && canvas.viewportTransform[0]) || 1,\n          multY = (canvas && canvas.viewportTransform[3]) || 1;\n      if (shadow.nonScaling) {\n        scaling = { scaleX: 1, scaleY: 1 };\n      }\n      else {\n        scaling = this.getObjectScaling();\n      }\n      if (canvas && canvas._isRetinaScaling()) {\n        multX *= fabric.devicePixelRatio;\n        multY *= fabric.devicePixelRatio;\n      }\n      ctx.shadowColor = shadow.color;\n      ctx.shadowBlur = shadow.blur * fabric.browserShadowBlurConstant *\n        (multX + multY) * (scaling.scaleX + scaling.scaleY) / 4;\n      ctx.shadowOffsetX = shadow.offsetX * multX * scaling.scaleX;\n      ctx.shadowOffsetY = shadow.offsetY * multY * scaling.scaleY;\n    },\n\n    /**\n     * @private\n     * @param {CanvasRenderingContext2D} ctx Context to render on\n     */\n    _removeShadow: function(ctx) {\n      if (!this.shadow) {\n        return;\n      }\n\n      ctx.shadowColor = '';\n      ctx.shadowBlur = ctx.shadowOffsetX = ctx.shadowOffsetY = 0;\n    },\n\n    /**\n     * @private\n     * @param {CanvasRenderingContext2D} ctx Context to render on\n     * @param {Object} filler fabric.Pattern or fabric.Gradient\n     * @return {Object} offset.offsetX offset for text rendering\n     * @return {Object} offset.offsetY offset for text rendering\n     */\n    _applyPatternGradientTransform: function(ctx, filler) {\n      if (!filler || !filler.toLive) {\n        return { offsetX: 0, offsetY: 0 };\n      }\n      var t = filler.gradientTransform || filler.patternTransform;\n      var offsetX = -this.width / 2 + filler.offsetX || 0,\n          offsetY = -this.height / 2 + filler.offsetY || 0;\n\n      if (filler.gradientUnits === 'percentage') {\n        ctx.transform(this.width, 0, 0, this.height, offsetX, offsetY);\n      }\n      else {\n        ctx.transform(1, 0, 0, 1, offsetX, offsetY);\n      }\n      if (t) {\n        ctx.transform(t[0], t[1], t[2], t[3], t[4], t[5]);\n      }\n      return { offsetX: offsetX, offsetY: offsetY };\n    },\n\n    /**\n     * @private\n     * @param {CanvasRenderingContext2D} ctx Context to render on\n     */\n    _renderPaintInOrder: function(ctx) {\n      if (this.paintFirst === 'stroke') {\n        this._renderStroke(ctx);\n        this._renderFill(ctx);\n      }\n      else {\n        this._renderFill(ctx);\n        this._renderStroke(ctx);\n      }\n    },\n\n    /**\n     * @private\n     * function that actually render something on the context.\n     * empty here to allow Obects to work on tests to benchmark fabric functionalites\n     * not related to rendering\n     * @param {CanvasRenderingContext2D} ctx Context to render on\n     */\n    _render: function(/* ctx */) {\n\n    },\n\n    /**\n     * @private\n     * @param {CanvasRenderingContext2D} ctx Context to render on\n     */\n    _renderFill: function(ctx) {\n      if (!this.fill) {\n        return;\n      }\n\n      ctx.save();\n      this._setFillStyles(ctx, this);\n      if (this.fillRule === 'evenodd') {\n        ctx.fill('evenodd');\n      }\n      else {\n        ctx.fill();\n      }\n      ctx.restore();\n    },\n\n    /**\n     * @private\n     * @param {CanvasRenderingContext2D} ctx Context to render on\n     */\n    _renderStroke: function(ctx) {\n      if (!this.stroke || this.strokeWidth === 0) {\n        return;\n      }\n\n      if (this.shadow && !this.shadow.affectStroke) {\n        this._removeShadow(ctx);\n      }\n\n      ctx.save();\n      if (this.strokeUniform && this.group) {\n        var scaling = this.getObjectScaling();\n        ctx.scale(1 / scaling.scaleX, 1 / scaling.scaleY);\n      }\n      else if (this.strokeUniform) {\n        ctx.scale(1 / this.scaleX, 1 / this.scaleY);\n      }\n      this._setLineDash(ctx, this.strokeDashArray);\n      this._setStrokeStyles(ctx, this);\n      ctx.stroke();\n      ctx.restore();\n    },\n\n    /**\n     * This function try to patch the missing gradientTransform on canvas gradients.\n     * transforming a context to transform the gradient, is going to transform the stroke too.\n     * we want to transform the gradient but not the stroke operation, so we create\n     * a transformed gradient on a pattern and then we use the pattern instead of the gradient.\n     * this method has drwabacks: is slow, is in low resolution, needs a patch for when the size\n     * is limited.\n     * @private\n     * @param {CanvasRenderingContext2D} ctx Context to render on\n     * @param {fabric.Gradient} filler a fabric gradient instance\n     */\n    _applyPatternForTransformedGradient: function(ctx, filler) {\n      var dims = this._limitCacheSize(this._getCacheCanvasDimensions()),\n          pCanvas = fabric.util.createCanvasElement(), pCtx, retinaScaling = this.canvas.getRetinaScaling(),\n          width = dims.x / this.scaleX / retinaScaling, height = dims.y / this.scaleY / retinaScaling;\n      pCanvas.width = width;\n      pCanvas.height = height;\n      pCtx = pCanvas.getContext('2d');\n      pCtx.beginPath(); pCtx.moveTo(0, 0); pCtx.lineTo(width, 0); pCtx.lineTo(width, height);\n      pCtx.lineTo(0, height); pCtx.closePath();\n      pCtx.translate(width / 2, height / 2);\n      pCtx.scale(\n        dims.zoomX / this.scaleX / retinaScaling,\n        dims.zoomY / this.scaleY / retinaScaling\n      );\n      this._applyPatternGradientTransform(pCtx, filler);\n      pCtx.fillStyle = filler.toLive(ctx);\n      pCtx.fill();\n      ctx.translate(-this.width / 2 - this.strokeWidth / 2, -this.height / 2 - this.strokeWidth / 2);\n      ctx.scale(\n        retinaScaling * this.scaleX / dims.zoomX,\n        retinaScaling * this.scaleY / dims.zoomY\n      );\n      ctx.strokeStyle = pCtx.createPattern(pCanvas, 'no-repeat');\n    },\n\n    /**\n     * This function is an helper for svg import. it returns the center of the object in the svg\n     * untransformed coordinates\n     * @private\n     * @return {Object} center point from element coordinates\n     */\n    _findCenterFromElement: function() {\n      return { x: this.left + this.width / 2, y: this.top + this.height / 2 };\n    },\n\n    /**\n     * This function is an helper for svg import. it decompose the transformMatrix\n     * and assign properties to object.\n     * untransformed coordinates\n     * @private\n     * @chainable\n     */\n    _assignTransformMatrixProps: function() {\n      if (this.transformMatrix) {\n        var options = fabric.util.qrDecompose(this.transformMatrix);\n        this.flipX = false;\n        this.flipY = false;\n        this.set('scaleX', options.scaleX);\n        this.set('scaleY', options.scaleY);\n        this.angle = options.angle;\n        this.skewX = options.skewX;\n        this.skewY = 0;\n      }\n    },\n\n    /**\n     * This function is an helper for svg import. it removes the transform matrix\n     * and set to object properties that fabricjs can handle\n     * @private\n     * @param {Object} preserveAspectRatioOptions\n     * @return {thisArg}\n     */\n    _removeTransformMatrix: function(preserveAspectRatioOptions) {\n      var center = this._findCenterFromElement();\n      if (this.transformMatrix) {\n        this._assignTransformMatrixProps();\n        center = fabric.util.transformPoint(center, this.transformMatrix);\n      }\n      this.transformMatrix = null;\n      if (preserveAspectRatioOptions) {\n        this.scaleX *= preserveAspectRatioOptions.scaleX;\n        this.scaleY *= preserveAspectRatioOptions.scaleY;\n        this.cropX = preserveAspectRatioOptions.cropX;\n        this.cropY = preserveAspectRatioOptions.cropY;\n        center.x += preserveAspectRatioOptions.offsetLeft;\n        center.y += preserveAspectRatioOptions.offsetTop;\n        this.width = preserveAspectRatioOptions.width;\n        this.height = preserveAspectRatioOptions.height;\n      }\n      this.setPositionByOrigin(center, 'center', 'center');\n    },\n\n    /**\n     * Clones an instance, using a callback method will work for every object.\n     * @param {Function} callback Callback is invoked with a clone as a first argument\n     * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n     */\n    clone: function(callback, propertiesToInclude) {\n      var objectForm = this.toObject(propertiesToInclude);\n      if (this.constructor.fromObject) {\n        this.constructor.fromObject(objectForm, callback);\n      }\n      else {\n        fabric.Object._fromObject('Object', objectForm, callback);\n      }\n    },\n\n    /**\n     * Creates an instance of fabric.Image out of an object\n     * makes use of toCanvasElement.\n     * Once this method was based on toDataUrl and loadImage, so it also had a quality\n     * and format option. toCanvasElement is faster and produce no loss of quality.\n     * If you need to get a real Jpeg or Png from an object, using toDataURL is the right way to do it.\n     * toCanvasElement and then toBlob from the obtained canvas is also a good option.\n     * This method is sync now, but still support the callback because we did not want to break.\n     * When fabricJS 5.0 will be planned, this will probably be changed to not have a callback.\n     * @param {Function} callback callback, invoked with an instance as a first argument\n     * @param {Object} [options] for clone as image, passed to toDataURL\n     * @param {Number} [options.multiplier=1] Multiplier to scale by\n     * @param {Number} [options.left] Cropping left offset. Introduced in v1.2.14\n     * @param {Number} [options.top] Cropping top offset. Introduced in v1.2.14\n     * @param {Number} [options.width] Cropping width. Introduced in v1.2.14\n     * @param {Number} [options.height] Cropping height. Introduced in v1.2.14\n     * @param {Boolean} [options.enableRetinaScaling] Enable retina scaling for clone image. Introduce in 1.6.4\n     * @param {Boolean} [options.withoutTransform] Remove current object transform ( no scale , no angle, no flip, no skew ). Introduced in 2.3.4\n     * @param {Boolean} [options.withoutShadow] Remove current object shadow. Introduced in 2.4.2\n     * @return {fabric.Object} thisArg\n     */\n    cloneAsImage: function(callback, options) {\n      var canvasEl = this.toCanvasElement(options);\n      if (callback) {\n        callback(new fabric.Image(canvasEl));\n      }\n      return this;\n    },\n\n    /**\n     * Converts an object into a HTMLCanvas element\n     * @param {Object} options Options object\n     * @param {Number} [options.multiplier=1] Multiplier to scale by\n     * @param {Number} [options.left] Cropping left offset. Introduced in v1.2.14\n     * @param {Number} [options.top] Cropping top offset. Introduced in v1.2.14\n     * @param {Number} [options.width] Cropping width. Introduced in v1.2.14\n     * @param {Number} [options.height] Cropping height. Introduced in v1.2.14\n     * @param {Boolean} [options.enableRetinaScaling] Enable retina scaling for clone image. Introduce in 1.6.4\n     * @param {Boolean} [options.withoutTransform] Remove current object transform ( no scale , no angle, no flip, no skew ). Introduced in 2.3.4\n     * @param {Boolean} [options.withoutShadow] Remove current object shadow. Introduced in 2.4.2\n     * @return {HTMLCanvasElement} Returns DOM element <canvas> with the fabric.Object\n     */\n    toCanvasElement: function(options) {\n      options || (options = { });\n\n      var utils = fabric.util, origParams = utils.saveObjectTransform(this),\n          originalGroup = this.group,\n          originalShadow = this.shadow, abs = Math.abs,\n          multiplier = (options.multiplier || 1) * (options.enableRetinaScaling ? fabric.devicePixelRatio : 1);\n      delete this.group;\n      if (options.withoutTransform) {\n        utils.resetObjectTransform(this);\n      }\n      if (options.withoutShadow) {\n        this.shadow = null;\n      }\n\n      var el = fabric.util.createCanvasElement(),\n          // skip canvas zoom and calculate with setCoords now.\n          boundingRect = this.getBoundingRect(true, true),\n          shadow = this.shadow, scaling,\n          shadowOffset = { x: 0, y: 0 }, shadowBlur,\n          width, height;\n\n      if (shadow) {\n        shadowBlur = shadow.blur;\n        if (shadow.nonScaling) {\n          scaling = { scaleX: 1, scaleY: 1 };\n        }\n        else {\n          scaling = this.getObjectScaling();\n        }\n        // consider non scaling shadow.\n        shadowOffset.x = 2 * Math.round(abs(shadow.offsetX) + shadowBlur) * (abs(scaling.scaleX));\n        shadowOffset.y = 2 * Math.round(abs(shadow.offsetY) + shadowBlur) * (abs(scaling.scaleY));\n      }\n      width = boundingRect.width + shadowOffset.x;\n      height = boundingRect.height + shadowOffset.y;\n      // if the current width/height is not an integer\n      // we need to make it so.\n      el.width = Math.ceil(width);\n      el.height = Math.ceil(height);\n      var canvas = new fabric.StaticCanvas(el, {\n        enableRetinaScaling: false,\n        renderOnAddRemove: false,\n        skipOffscreen: false,\n      });\n      if (options.format === 'jpeg') {\n        canvas.backgroundColor = '#fff';\n      }\n      this.setPositionByOrigin(new fabric.Point(canvas.width / 2, canvas.height / 2), 'center', 'center');\n\n      var originalCanvas = this.canvas;\n      canvas.add(this);\n      var canvasEl = canvas.toCanvasElement(multiplier || 1, options);\n      this.shadow = originalShadow;\n      this.set('canvas', originalCanvas);\n      if (originalGroup) {\n        this.group = originalGroup;\n      }\n      this.set(origParams).setCoords();\n      // canvas.dispose will call image.dispose that will nullify the elements\n      // since this canvas is a simple element for the process, we remove references\n      // to objects in this way in order to avoid object trashing.\n      canvas._objects = [];\n      canvas.dispose();\n      canvas = null;\n\n      return canvasEl;\n    },\n\n    /**\n     * Converts an object into a data-url-like string\n     * @param {Object} options Options object\n     * @param {String} [options.format=png] The format of the output image. Either \"jpeg\" or \"png\"\n     * @param {Number} [options.quality=1] Quality level (0..1). Only used for jpeg.\n     * @param {Number} [options.multiplier=1] Multiplier to scale by\n     * @param {Number} [options.left] Cropping left offset. Introduced in v1.2.14\n     * @param {Number} [options.top] Cropping top offset. Introduced in v1.2.14\n     * @param {Number} [options.width] Cropping width. Introduced in v1.2.14\n     * @param {Number} [options.height] Cropping height. Introduced in v1.2.14\n     * @param {Boolean} [options.enableRetinaScaling] Enable retina scaling for clone image. Introduce in 1.6.4\n     * @param {Boolean} [options.withoutTransform] Remove current object transform ( no scale , no angle, no flip, no skew ). Introduced in 2.3.4\n     * @param {Boolean} [options.withoutShadow] Remove current object shadow. Introduced in 2.4.2\n     * @return {String} Returns a data: URL containing a representation of the object in the format specified by options.format\n     */\n    toDataURL: function(options) {\n      options || (options = { });\n      return fabric.util.toDataURL(this.toCanvasElement(options), options.format || 'png', options.quality || 1);\n    },\n\n    /**\n     * Returns true if specified type is identical to the type of an instance\n     * @param {String} type Type to check against\n     * @return {Boolean}\n     */\n    isType: function(type) {\n      return this.type === type;\n    },\n\n    /**\n     * Returns complexity of an instance\n     * @return {Number} complexity of this instance (is 1 unless subclassed)\n     */\n    complexity: function() {\n      return 1;\n    },\n\n    /**\n     * Returns a JSON representation of an instance\n     * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n     * @return {Object} JSON\n     */\n    toJSON: function(propertiesToInclude) {\n      // delegate, not alias\n      return this.toObject(propertiesToInclude);\n    },\n\n    /**\n     * Sets \"angle\" of an instance with centered rotation\n     * @param {Number} angle Angle value (in degrees)\n     * @return {fabric.Object} thisArg\n     * @chainable\n     */\n    rotate: function(angle) {\n      var shouldCenterOrigin = (this.originX !== 'center' || this.originY !== 'center') && this.centeredRotation;\n\n      if (shouldCenterOrigin) {\n        this._setOriginToCenter();\n      }\n\n      this.set('angle', angle);\n\n      if (shouldCenterOrigin) {\n        this._resetOrigin();\n      }\n\n      return this;\n    },\n\n    /**\n     * Centers object horizontally on canvas to which it was added last.\n     * You might need to call `setCoords` on an object after centering, to update controls area.\n     * @return {fabric.Object} thisArg\n     * @chainable\n     */\n    centerH: function () {\n      this.canvas && this.canvas.centerObjectH(this);\n      return this;\n    },\n\n    /**\n     * Centers object horizontally on current viewport of canvas to which it was added last.\n     * You might need to call `setCoords` on an object after centering, to update controls area.\n     * @return {fabric.Object} thisArg\n     * @chainable\n     */\n    viewportCenterH: function () {\n      this.canvas && this.canvas.viewportCenterObjectH(this);\n      return this;\n    },\n\n    /**\n     * Centers object vertically on canvas to which it was added last.\n     * You might need to call `setCoords` on an object after centering, to update controls area.\n     * @return {fabric.Object} thisArg\n     * @chainable\n     */\n    centerV: function () {\n      this.canvas && this.canvas.centerObjectV(this);\n      return this;\n    },\n\n    /**\n     * Centers object vertically on current viewport of canvas to which it was added last.\n     * You might need to call `setCoords` on an object after centering, to update controls area.\n     * @return {fabric.Object} thisArg\n     * @chainable\n     */\n    viewportCenterV: function () {\n      this.canvas && this.canvas.viewportCenterObjectV(this);\n      return this;\n    },\n\n    /**\n     * Centers object vertically and horizontally on canvas to which is was added last\n     * You might need to call `setCoords` on an object after centering, to update controls area.\n     * @return {fabric.Object} thisArg\n     * @chainable\n     */\n    center: function () {\n      this.canvas && this.canvas.centerObject(this);\n      return this;\n    },\n\n    /**\n     * Centers object on current viewport of canvas to which it was added last.\n     * You might need to call `setCoords` on an object after centering, to update controls area.\n     * @return {fabric.Object} thisArg\n     * @chainable\n     */\n    viewportCenter: function () {\n      this.canvas && this.canvas.viewportCenterObject(this);\n      return this;\n    },\n\n    /**\n     * Returns coordinates of a pointer relative to an object\n     * @param {Event} e Event to operate upon\n     * @param {Object} [pointer] Pointer to operate upon (instead of event)\n     * @return {Object} Coordinates of a pointer (x, y)\n     */\n    getLocalPointer: function(e, pointer) {\n      pointer = pointer || this.canvas.getPointer(e);\n      var pClicked = new fabric.Point(pointer.x, pointer.y),\n          objectLeftTop = this._getLeftTopCoords();\n      if (this.angle) {\n        pClicked = fabric.util.rotatePoint(\n          pClicked, objectLeftTop, degreesToRadians(-this.angle));\n      }\n      return {\n        x: pClicked.x - objectLeftTop.x,\n        y: pClicked.y - objectLeftTop.y\n      };\n    },\n\n    /**\n     * Sets canvas globalCompositeOperation for specific object\n     * custom composition operation for the particular object can be specified using globalCompositeOperation property\n     * @param {CanvasRenderingContext2D} ctx Rendering canvas context\n     */\n    _setupCompositeOperation: function (ctx) {\n      if (this.globalCompositeOperation) {\n        ctx.globalCompositeOperation = this.globalCompositeOperation;\n      }\n    }\n  });\n\n  fabric.util.createAccessors && fabric.util.createAccessors(fabric.Object);\n\n  extend(fabric.Object.prototype, fabric.Observable);\n\n  /**\n   * Defines the number of fraction digits to use when serializing object values.\n   * You can use it to increase/decrease precision of such values like left, top, scaleX, scaleY, etc.\n   * @static\n   * @memberOf fabric.Object\n   * @constant\n   * @type Number\n   */\n  fabric.Object.NUM_FRACTION_DIGITS = 2;\n\n  fabric.Object._fromObject = function(className, object, callback, extraParam) {\n    var klass = fabric[className];\n    object = clone(object, true);\n    fabric.util.enlivenPatterns([object.fill, object.stroke], function(patterns) {\n      if (typeof patterns[0] !== 'undefined') {\n        object.fill = patterns[0];\n      }\n      if (typeof patterns[1] !== 'undefined') {\n        object.stroke = patterns[1];\n      }\n      fabric.util.enlivenObjects([object.clipPath], function(enlivedProps) {\n        object.clipPath = enlivedProps[0];\n        var instance = extraParam ? new klass(object[extraParam], object) : new klass(object);\n        callback && callback(instance);\n      });\n    });\n  };\n\n  /**\n   * Unique id used internally when creating SVG elements\n   * @static\n   * @memberOf fabric.Object\n   * @type Number\n   */\n  fabric.Object.__uid = 0;\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function() {\n\n  var degreesToRadians = fabric.util.degreesToRadians,\n      originXOffset = {\n        left: -0.5,\n        center: 0,\n        right: 0.5\n      },\n      originYOffset = {\n        top: -0.5,\n        center: 0,\n        bottom: 0.5\n      };\n\n  fabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prototype */ {\n\n    /**\n     * Translates the coordinates from a set of origin to another (based on the object's dimensions)\n     * @param {fabric.Point} point The point which corresponds to the originX and originY params\n     * @param {String} fromOriginX Horizontal origin: 'left', 'center' or 'right'\n     * @param {String} fromOriginY Vertical origin: 'top', 'center' or 'bottom'\n     * @param {String} toOriginX Horizontal origin: 'left', 'center' or 'right'\n     * @param {String} toOriginY Vertical origin: 'top', 'center' or 'bottom'\n     * @return {fabric.Point}\n     */\n    translateToGivenOrigin: function(point, fromOriginX, fromOriginY, toOriginX, toOriginY) {\n      var x = point.x,\n          y = point.y,\n          offsetX, offsetY, dim;\n\n      if (typeof fromOriginX === 'string') {\n        fromOriginX = originXOffset[fromOriginX];\n      }\n      else {\n        fromOriginX -= 0.5;\n      }\n\n      if (typeof toOriginX === 'string') {\n        toOriginX = originXOffset[toOriginX];\n      }\n      else {\n        toOriginX -= 0.5;\n      }\n\n      offsetX = toOriginX - fromOriginX;\n\n      if (typeof fromOriginY === 'string') {\n        fromOriginY = originYOffset[fromOriginY];\n      }\n      else {\n        fromOriginY -= 0.5;\n      }\n\n      if (typeof toOriginY === 'string') {\n        toOriginY = originYOffset[toOriginY];\n      }\n      else {\n        toOriginY -= 0.5;\n      }\n\n      offsetY = toOriginY - fromOriginY;\n\n      if (offsetX || offsetY) {\n        dim = this._getTransformedDimensions();\n        x = point.x + offsetX * dim.x;\n        y = point.y + offsetY * dim.y;\n      }\n\n      return new fabric.Point(x, y);\n    },\n\n    /**\n     * Translates the coordinates from origin to center coordinates (based on the object's dimensions)\n     * @param {fabric.Point} point The point which corresponds to the originX and originY params\n     * @param {String} originX Horizontal origin: 'left', 'center' or 'right'\n     * @param {String} originY Vertical origin: 'top', 'center' or 'bottom'\n     * @return {fabric.Point}\n     */\n    translateToCenterPoint: function(point, originX, originY) {\n      var p = this.translateToGivenOrigin(point, originX, originY, 'center', 'center');\n      if (this.angle) {\n        return fabric.util.rotatePoint(p, point, degreesToRadians(this.angle));\n      }\n      return p;\n    },\n\n    /**\n     * Translates the coordinates from center to origin coordinates (based on the object's dimensions)\n     * @param {fabric.Point} center The point which corresponds to center of the object\n     * @param {String} originX Horizontal origin: 'left', 'center' or 'right'\n     * @param {String} originY Vertical origin: 'top', 'center' or 'bottom'\n     * @return {fabric.Point}\n     */\n    translateToOriginPoint: function(center, originX, originY) {\n      var p = this.translateToGivenOrigin(center, 'center', 'center', originX, originY);\n      if (this.angle) {\n        return fabric.util.rotatePoint(p, center, degreesToRadians(this.angle));\n      }\n      return p;\n    },\n\n    /**\n     * Returns the real center coordinates of the object\n     * @return {fabric.Point}\n     */\n    getCenterPoint: function() {\n      var leftTop = new fabric.Point(this.left, this.top);\n      return this.translateToCenterPoint(leftTop, this.originX, this.originY);\n    },\n\n    /**\n     * Returns the coordinates of the object based on center coordinates\n     * @param {fabric.Point} point The point which corresponds to the originX and originY params\n     * @return {fabric.Point}\n     */\n    // getOriginPoint: function(center) {\n    //   return this.translateToOriginPoint(center, this.originX, this.originY);\n    // },\n\n    /**\n     * Returns the coordinates of the object as if it has a different origin\n     * @param {String} originX Horizontal origin: 'left', 'center' or 'right'\n     * @param {String} originY Vertical origin: 'top', 'center' or 'bottom'\n     * @return {fabric.Point}\n     */\n    getPointByOrigin: function(originX, originY) {\n      var center = this.getCenterPoint();\n      return this.translateToOriginPoint(center, originX, originY);\n    },\n\n    /**\n     * Returns the point in local coordinates\n     * @param {fabric.Point} point The point relative to the global coordinate system\n     * @param {String} originX Horizontal origin: 'left', 'center' or 'right'\n     * @param {String} originY Vertical origin: 'top', 'center' or 'bottom'\n     * @return {fabric.Point}\n     */\n    toLocalPoint: function(point, originX, originY) {\n      var center = this.getCenterPoint(),\n          p, p2;\n\n      if (typeof originX !== 'undefined' && typeof originY !== 'undefined' ) {\n        p = this.translateToGivenOrigin(center, 'center', 'center', originX, originY);\n      }\n      else {\n        p = new fabric.Point(this.left, this.top);\n      }\n\n      p2 = new fabric.Point(point.x, point.y);\n      if (this.angle) {\n        p2 = fabric.util.rotatePoint(p2, center, -degreesToRadians(this.angle));\n      }\n      return p2.subtractEquals(p);\n    },\n\n    /**\n     * Returns the point in global coordinates\n     * @param {fabric.Point} The point relative to the local coordinate system\n     * @return {fabric.Point}\n     */\n    // toGlobalPoint: function(point) {\n    //   return fabric.util.rotatePoint(point, this.getCenterPoint(), degreesToRadians(this.angle)).addEquals(new fabric.Point(this.left, this.top));\n    // },\n\n    /**\n     * Sets the position of the object taking into consideration the object's origin\n     * @param {fabric.Point} pos The new position of the object\n     * @param {String} originX Horizontal origin: 'left', 'center' or 'right'\n     * @param {String} originY Vertical origin: 'top', 'center' or 'bottom'\n     * @return {void}\n     */\n    setPositionByOrigin: function(pos, originX, originY) {\n      var center = this.translateToCenterPoint(pos, originX, originY),\n          position = this.translateToOriginPoint(center, this.originX, this.originY);\n      this.set('left', position.x);\n      this.set('top', position.y);\n    },\n\n    /**\n     * @param {String} to One of 'left', 'center', 'right'\n     */\n    adjustPosition: function(to) {\n      var angle = degreesToRadians(this.angle),\n          hypotFull = this.getScaledWidth(),\n          xFull = fabric.util.cos(angle) * hypotFull,\n          yFull = fabric.util.sin(angle) * hypotFull,\n          offsetFrom, offsetTo;\n\n      //TODO: this function does not consider mixed situation like top, center.\n      if (typeof this.originX === 'string') {\n        offsetFrom = originXOffset[this.originX];\n      }\n      else {\n        offsetFrom = this.originX - 0.5;\n      }\n      if (typeof to === 'string') {\n        offsetTo = originXOffset[to];\n      }\n      else {\n        offsetTo = to - 0.5;\n      }\n      this.left += xFull * (offsetTo - offsetFrom);\n      this.top += yFull * (offsetTo - offsetFrom);\n      this.setCoords();\n      this.originX = to;\n    },\n\n    /**\n     * Sets the origin/position of the object to it's center point\n     * @private\n     * @return {void}\n     */\n    _setOriginToCenter: function() {\n      this._originalOriginX = this.originX;\n      this._originalOriginY = this.originY;\n\n      var center = this.getCenterPoint();\n\n      this.originX = 'center';\n      this.originY = 'center';\n\n      this.left = center.x;\n      this.top = center.y;\n    },\n\n    /**\n     * Resets the origin/position of the object to it's original origin\n     * @private\n     * @return {void}\n     */\n    _resetOrigin: function() {\n      var originPoint = this.translateToOriginPoint(\n        this.getCenterPoint(),\n        this._originalOriginX,\n        this._originalOriginY);\n\n      this.originX = this._originalOriginX;\n      this.originY = this._originalOriginY;\n\n      this.left = originPoint.x;\n      this.top = originPoint.y;\n\n      this._originalOriginX = null;\n      this._originalOriginY = null;\n    },\n\n    /**\n     * @private\n     */\n    _getLeftTopCoords: function() {\n      return this.translateToOriginPoint(this.getCenterPoint(), 'left', 'top');\n    },\n  });\n\n})();\n\n\n(function() {\n\n  function arrayFromCoords(coords) {\n    return [\n      new fabric.Point(coords.tl.x, coords.tl.y),\n      new fabric.Point(coords.tr.x, coords.tr.y),\n      new fabric.Point(coords.br.x, coords.br.y),\n      new fabric.Point(coords.bl.x, coords.bl.y)\n    ];\n  }\n\n  var util = fabric.util,\n      degreesToRadians = util.degreesToRadians,\n      multiplyMatrices = util.multiplyTransformMatrices,\n      transformPoint = util.transformPoint;\n\n  util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prototype */ {\n\n    /**\n     * Describe object's corner position in canvas element coordinates.\n     * properties are depending on control keys and padding the main controls.\n     * each property is an object with x, y and corner.\n     * The `corner` property contains in a similar manner the 4 points of the\n     * interactive area of the corner.\n     * The coordinates depends from the controls positionHandler and are used\n     * to draw and locate controls\n     * @memberOf fabric.Object.prototype\n     */\n    oCoords: null,\n\n    /**\n     * Describe object's corner position in canvas object absolute coordinates\n     * properties are tl,tr,bl,br and describe the four main corner.\n     * each property is an object with x, y, instance of Fabric.Point.\n     * The coordinates depends from this properties: width, height, scaleX, scaleY\n     * skewX, skewY, angle, strokeWidth, top, left.\n     * Those coordinates are useful to understand where an object is. They get updated\n     * with oCoords but they do not need to be updated when zoom or panning change.\n     * The coordinates get updated with @method setCoords.\n     * You can calculate them without updating with @method calcACoords();\n     * @memberOf fabric.Object.prototype\n     */\n    aCoords: null,\n\n    /**\n     * Describe object's corner position in canvas element coordinates.\n     * includes padding. Used of object detection.\n     * set and refreshed with setCoords and calcCoords.\n     * @memberOf fabric.Object.prototype\n     */\n    lineCoords: null,\n\n    /**\n     * storage for object transform matrix\n     */\n    ownMatrixCache: null,\n\n    /**\n     * storage for object full transform matrix\n     */\n    matrixCache: null,\n\n    /**\n     * custom controls interface\n     * controls are added by default_controls.js\n     */\n    controls: { },\n\n    /**\n     * return correct set of coordinates for intersection\n     * this will return either aCoords or lineCoords.\n     * @param {Boolean} absolute will return aCoords if true or lineCoords\n     * @return {Object} {tl, tr, br, bl} points\n     */\n    _getCoords: function(absolute, calculate) {\n      if (calculate) {\n        return (absolute ? this.calcACoords() : this.calcLineCoords());\n      }\n      if (!this.aCoords || !this.lineCoords) {\n        this.setCoords(true);\n      }\n      return (absolute ? this.aCoords : this.lineCoords);\n    },\n\n    /**\n     * return correct set of coordinates for intersection\n     * this will return either aCoords or lineCoords.\n     * The coords are returned in an array.\n     * @return {Array} [tl, tr, br, bl] of points\n     */\n    getCoords: function(absolute, calculate) {\n      return arrayFromCoords(this._getCoords(absolute, calculate));\n    },\n\n    /**\n     * Checks if object intersects with an area formed by 2 points\n     * @param {Object} pointTL top-left point of area\n     * @param {Object} pointBR bottom-right point of area\n     * @param {Boolean} [absolute] use coordinates without viewportTransform\n     * @param {Boolean} [calculate] use coordinates of current position instead of .oCoords\n     * @return {Boolean} true if object intersects with an area formed by 2 points\n     */\n    intersectsWithRect: function(pointTL, pointBR, absolute, calculate) {\n      var coords = this.getCoords(absolute, calculate),\n          intersection = fabric.Intersection.intersectPolygonRectangle(\n            coords,\n            pointTL,\n            pointBR\n          );\n      return intersection.status === 'Intersection';\n    },\n\n    /**\n     * Checks if object intersects with another object\n     * @param {Object} other Object to test\n     * @param {Boolean} [absolute] use coordinates without viewportTransform\n     * @param {Boolean} [calculate] use coordinates of current position instead of .oCoords\n     * @return {Boolean} true if object intersects with another object\n     */\n    intersectsWithObject: function(other, absolute, calculate) {\n      var intersection = fabric.Intersection.intersectPolygonPolygon(\n        this.getCoords(absolute, calculate),\n        other.getCoords(absolute, calculate)\n      );\n\n      return intersection.status === 'Intersection'\n        || other.isContainedWithinObject(this, absolute, calculate)\n        || this.isContainedWithinObject(other, absolute, calculate);\n    },\n\n    /**\n     * Checks if object is fully contained within area of another object\n     * @param {Object} other Object to test\n     * @param {Boolean} [absolute] use coordinates without viewportTransform\n     * @param {Boolean} [calculate] use coordinates of current position instead of .oCoords\n     * @return {Boolean} true if object is fully contained within area of another object\n     */\n    isContainedWithinObject: function(other, absolute, calculate) {\n      var points = this.getCoords(absolute, calculate),\n          otherCoords = absolute ? other.aCoords : other.lineCoords,\n          i = 0, lines = other._getImageLines(otherCoords);\n      for (; i < 4; i++) {\n        if (!other.containsPoint(points[i], lines)) {\n          return false;\n        }\n      }\n      return true;\n    },\n\n    /**\n     * Checks if object is fully contained within area formed by 2 points\n     * @param {Object} pointTL top-left point of area\n     * @param {Object} pointBR bottom-right point of area\n     * @param {Boolean} [absolute] use coordinates without viewportTransform\n     * @param {Boolean} [calculate] use coordinates of current position instead of .oCoords\n     * @return {Boolean} true if object is fully contained within area formed by 2 points\n     */\n    isContainedWithinRect: function(pointTL, pointBR, absolute, calculate) {\n      var boundingRect = this.getBoundingRect(absolute, calculate);\n\n      return (\n        boundingRect.left >= pointTL.x &&\n        boundingRect.left + boundingRect.width <= pointBR.x &&\n        boundingRect.top >= pointTL.y &&\n        boundingRect.top + boundingRect.height <= pointBR.y\n      );\n    },\n\n    /**\n     * Checks if point is inside the object\n     * @param {fabric.Point} point Point to check against\n     * @param {Object} [lines] object returned from @method _getImageLines\n     * @param {Boolean} [absolute] use coordinates without viewportTransform\n     * @param {Boolean} [calculate] use coordinates of current position instead of .oCoords\n     * @return {Boolean} true if point is inside the object\n     */\n    containsPoint: function(point, lines, absolute, calculate) {\n      var coords = this._getCoords(absolute, calculate),\n          lines = lines || this._getImageLines(coords),\n          xPoints = this._findCrossPoints(point, lines);\n      // if xPoints is odd then point is inside the object\n      return (xPoints !== 0 && xPoints % 2 === 1);\n    },\n\n    /**\n     * Checks if object is contained within the canvas with current viewportTransform\n     * the check is done stopping at first point that appears on screen\n     * @param {Boolean} [calculate] use coordinates of current position instead of .aCoords\n     * @return {Boolean} true if object is fully or partially contained within canvas\n     */\n    isOnScreen: function(calculate) {\n      if (!this.canvas) {\n        return false;\n      }\n      var pointTL = this.canvas.vptCoords.tl, pointBR = this.canvas.vptCoords.br;\n      var points = this.getCoords(true, calculate);\n      // if some point is on screen, the object is on screen.\n      if (points.some(function(point) {\n        return point.x <= pointBR.x && point.x >= pointTL.x &&\n        point.y <= pointBR.y && point.y >= pointTL.y;\n      })) {\n        return true;\n      }\n      // no points on screen, check intersection with absolute coordinates\n      if (this.intersectsWithRect(pointTL, pointBR, true, calculate)) {\n        return true;\n      }\n      return this._containsCenterOfCanvas(pointTL, pointBR, calculate);\n    },\n\n    /**\n     * Checks if the object contains the midpoint between canvas extremities\n     * Does not make sense outside the context of isOnScreen and isPartiallyOnScreen\n     * @private\n     * @param {Fabric.Point} pointTL Top Left point\n     * @param {Fabric.Point} pointBR Top Right point\n     * @param {Boolean} calculate use coordinates of current position instead of .oCoords\n     * @return {Boolean} true if the object contains the point\n     */\n    _containsCenterOfCanvas: function(pointTL, pointBR, calculate) {\n      // worst case scenario the object is so big that contains the screen\n      var centerPoint = { x: (pointTL.x + pointBR.x) / 2, y: (pointTL.y + pointBR.y) / 2 };\n      if (this.containsPoint(centerPoint, null, true, calculate)) {\n        return true;\n      }\n      return false;\n    },\n\n    /**\n     * Checks if object is partially contained within the canvas with current viewportTransform\n     * @param {Boolean} [calculate] use coordinates of current position instead of .oCoords\n     * @return {Boolean} true if object is partially contained within canvas\n     */\n    isPartiallyOnScreen: function(calculate) {\n      if (!this.canvas) {\n        return false;\n      }\n      var pointTL = this.canvas.vptCoords.tl, pointBR = this.canvas.vptCoords.br;\n      if (this.intersectsWithRect(pointTL, pointBR, true, calculate)) {\n        return true;\n      }\n      var allPointsAreOutside = this.getCoords(true, calculate).every(function(point) {\n        return (point.x >= pointBR.x || point.x <= pointTL.x) &&\n        (point.y >= pointBR.y || point.y <= pointTL.y);\n      });\n      return allPointsAreOutside && this._containsCenterOfCanvas(pointTL, pointBR, calculate);\n    },\n\n    /**\n     * Method that returns an object with the object edges in it, given the coordinates of the corners\n     * @private\n     * @param {Object} oCoords Coordinates of the object corners\n     */\n    _getImageLines: function(oCoords) {\n\n      var lines = {\n        topline: {\n          o: oCoords.tl,\n          d: oCoords.tr\n        },\n        rightline: {\n          o: oCoords.tr,\n          d: oCoords.br\n        },\n        bottomline: {\n          o: oCoords.br,\n          d: oCoords.bl\n        },\n        leftline: {\n          o: oCoords.bl,\n          d: oCoords.tl\n        }\n      };\n\n      // // debugging\n      // if (this.canvas.contextTop) {\n      //   this.canvas.contextTop.fillRect(lines.bottomline.d.x, lines.bottomline.d.y, 2, 2);\n      //   this.canvas.contextTop.fillRect(lines.bottomline.o.x, lines.bottomline.o.y, 2, 2);\n      //\n      //   this.canvas.contextTop.fillRect(lines.leftline.d.x, lines.leftline.d.y, 2, 2);\n      //   this.canvas.contextTop.fillRect(lines.leftline.o.x, lines.leftline.o.y, 2, 2);\n      //\n      //   this.canvas.contextTop.fillRect(lines.topline.d.x, lines.topline.d.y, 2, 2);\n      //   this.canvas.contextTop.fillRect(lines.topline.o.x, lines.topline.o.y, 2, 2);\n      //\n      //   this.canvas.contextTop.fillRect(lines.rightline.d.x, lines.rightline.d.y, 2, 2);\n      //   this.canvas.contextTop.fillRect(lines.rightline.o.x, lines.rightline.o.y, 2, 2);\n      // }\n\n      return lines;\n    },\n\n    /**\n     * Helper method to determine how many cross points are between the 4 object edges\n     * and the horizontal line determined by a point on canvas\n     * @private\n     * @param {fabric.Point} point Point to check\n     * @param {Object} lines Coordinates of the object being evaluated\n     */\n    // remove yi, not used but left code here just in case.\n    _findCrossPoints: function(point, lines) {\n      var b1, b2, a1, a2, xi, // yi,\n          xcount = 0,\n          iLine;\n\n      for (var lineKey in lines) {\n        iLine = lines[lineKey];\n        // optimisation 1: line below point. no cross\n        if ((iLine.o.y < point.y) && (iLine.d.y < point.y)) {\n          continue;\n        }\n        // optimisation 2: line above point. no cross\n        if ((iLine.o.y >= point.y) && (iLine.d.y >= point.y)) {\n          continue;\n        }\n        // optimisation 3: vertical line case\n        if ((iLine.o.x === iLine.d.x) && (iLine.o.x >= point.x)) {\n          xi = iLine.o.x;\n          // yi = point.y;\n        }\n        // calculate the intersection point\n        else {\n          b1 = 0;\n          b2 = (iLine.d.y - iLine.o.y) / (iLine.d.x - iLine.o.x);\n          a1 = point.y - b1 * point.x;\n          a2 = iLine.o.y - b2 * iLine.o.x;\n\n          xi = -(a1 - a2) / (b1 - b2);\n          // yi = a1 + b1 * xi;\n        }\n        // dont count xi < point.x cases\n        if (xi >= point.x) {\n          xcount += 1;\n        }\n        // optimisation 4: specific for square images\n        if (xcount === 2) {\n          break;\n        }\n      }\n      return xcount;\n    },\n\n    /**\n     * Returns coordinates of object's bounding rectangle (left, top, width, height)\n     * the box is intended as aligned to axis of canvas.\n     * @param {Boolean} [absolute] use coordinates without viewportTransform\n     * @param {Boolean} [calculate] use coordinates of current position instead of .oCoords / .aCoords\n     * @return {Object} Object with left, top, width, height properties\n     */\n    getBoundingRect: function(absolute, calculate) {\n      var coords = this.getCoords(absolute, calculate);\n      return util.makeBoundingBoxFromPoints(coords);\n    },\n\n    /**\n     * Returns width of an object's bounding box counting transformations\n     * before 2.0 it was named getWidth();\n     * @return {Number} width value\n     */\n    getScaledWidth: function() {\n      return this._getTransformedDimensions().x;\n    },\n\n    /**\n     * Returns height of an object bounding box counting transformations\n     * before 2.0 it was named getHeight();\n     * @return {Number} height value\n     */\n    getScaledHeight: function() {\n      return this._getTransformedDimensions().y;\n    },\n\n    /**\n     * Makes sure the scale is valid and modifies it if necessary\n     * @private\n     * @param {Number} value\n     * @return {Number}\n     */\n    _constrainScale: function(value) {\n      if (Math.abs(value) < this.minScaleLimit) {\n        if (value < 0) {\n          return -this.minScaleLimit;\n        }\n        else {\n          return this.minScaleLimit;\n        }\n      }\n      else if (value === 0) {\n        return 0.0001;\n      }\n      return value;\n    },\n\n    /**\n     * Scales an object (equally by x and y)\n     * @param {Number} value Scale factor\n     * @return {fabric.Object} thisArg\n     * @chainable\n     */\n    scale: function(value) {\n      this._set('scaleX', value);\n      this._set('scaleY', value);\n      return this.setCoords();\n    },\n\n    /**\n     * Scales an object to a given width, with respect to bounding box (scaling by x/y equally)\n     * @param {Number} value New width value\n     * @param {Boolean} absolute ignore viewport\n     * @return {fabric.Object} thisArg\n     * @chainable\n     */\n    scaleToWidth: function(value, absolute) {\n      // adjust to bounding rect factor so that rotated shapes would fit as well\n      var boundingRectFactor = this.getBoundingRect(absolute).width / this.getScaledWidth();\n      return this.scale(value / this.width / boundingRectFactor);\n    },\n\n    /**\n     * Scales an object to a given height, with respect to bounding box (scaling by x/y equally)\n     * @param {Number} value New height value\n     * @param {Boolean} absolute ignore viewport\n     * @return {fabric.Object} thisArg\n     * @chainable\n     */\n    scaleToHeight: function(value, absolute) {\n      // adjust to bounding rect factor so that rotated shapes would fit as well\n      var boundingRectFactor = this.getBoundingRect(absolute).height / this.getScaledHeight();\n      return this.scale(value / this.height / boundingRectFactor);\n    },\n\n    /**\n     * Calculates and returns the .coords of an object.\n     * unused by the library, only for the end dev.\n     * @return {Object} Object with tl, tr, br, bl ....\n     * @chainable\n     * @deprecated\n     */\n    calcCoords: function(absolute) {\n      // this is a compatibility function to avoid removing calcCoords now.\n      if (absolute) {\n        return this.calcACoords();\n      }\n      return this.calcOCoords();\n    },\n\n    calcLineCoords: function() {\n      var vpt = this.getViewportTransform(),\n          padding = this.padding, angle = degreesToRadians(this.angle),\n          cos = util.cos(angle), sin = util.sin(angle),\n          cosP = cos * padding, sinP = sin * padding, cosPSinP = cosP + sinP,\n          cosPMinusSinP = cosP - sinP, aCoords = this.calcACoords();\n\n      var lineCoords = {\n        tl: transformPoint(aCoords.tl, vpt),\n        tr: transformPoint(aCoords.tr, vpt),\n        bl: transformPoint(aCoords.bl, vpt),\n        br: transformPoint(aCoords.br, vpt),\n      };\n\n      if (padding) {\n        lineCoords.tl.x -= cosPMinusSinP;\n        lineCoords.tl.y -= cosPSinP;\n        lineCoords.tr.x += cosPSinP;\n        lineCoords.tr.y -= cosPMinusSinP;\n        lineCoords.bl.x -= cosPSinP;\n        lineCoords.bl.y += cosPMinusSinP;\n        lineCoords.br.x += cosPMinusSinP;\n        lineCoords.br.y += cosPSinP;\n      }\n\n      return lineCoords;\n    },\n\n    calcOCoords: function() {\n      var rotateMatrix = this._calcRotateMatrix(),\n          translateMatrix = this._calcTranslateMatrix(),\n          vpt = this.getViewportTransform(),\n          startMatrix = multiplyMatrices(vpt, translateMatrix),\n          finalMatrix = multiplyMatrices(startMatrix, rotateMatrix),\n          finalMatrix = multiplyMatrices(finalMatrix, [1 / vpt[0], 0, 0, 1 / vpt[3], 0, 0]),\n          dim = this._calculateCurrentDimensions(),\n          coords = {};\n      this.forEachControl(function(control, key, fabricObject) {\n        coords[key] = control.positionHandler(dim, finalMatrix, fabricObject);\n      });\n\n      // debug code\n      // var canvas = this.canvas;\n      // setTimeout(function() {\n      //   canvas.contextTop.clearRect(0, 0, 700, 700);\n      //   canvas.contextTop.fillStyle = 'green';\n      //   Object.keys(coords).forEach(function(key) {\n      //     var control = coords[key];\n      //     canvas.contextTop.fillRect(control.x, control.y, 3, 3);\n      //   });\n      // }, 50);\n      return coords;\n    },\n\n    calcACoords: function() {\n      var rotateMatrix = this._calcRotateMatrix(),\n          translateMatrix = this._calcTranslateMatrix(),\n          finalMatrix = multiplyMatrices(translateMatrix, rotateMatrix),\n          dim = this._getTransformedDimensions(),\n          w = dim.x / 2, h = dim.y / 2;\n      return {\n        // corners\n        tl: transformPoint({ x: -w, y: -h }, finalMatrix),\n        tr: transformPoint({ x: w, y: -h }, finalMatrix),\n        bl: transformPoint({ x: -w, y: h }, finalMatrix),\n        br: transformPoint({ x: w, y: h }, finalMatrix)\n      };\n    },\n\n    /**\n     * Sets corner and controls position coordinates based on current angle, width and height, left and top.\n     * oCoords are used to find the corners\n     * aCoords are used to quickly find an object on the canvas\n     * lineCoords are used to quickly find object during pointer events.\n     * See {@link https://github.com/kangax/fabric.js/wiki/When-to-call-setCoords|When-to-call-setCoords}\n     * @param {Boolean} [skipCorners] skip calculation of oCoords.\n     * @return {fabric.Object} thisArg\n     * @chainable\n     */\n    setCoords: function(skipCorners) {\n      this.aCoords = this.calcACoords();\n      // in case we are in a group, for how the inner group target check works,\n      // lineCoords are exactly aCoords. Since the vpt gets absorbed by the normalized pointer.\n      this.lineCoords = this.group ? this.aCoords : this.calcLineCoords();\n      if (skipCorners) {\n        return this;\n      }\n      // set coordinates of the draggable boxes in the corners used to scale/rotate the image\n      this.oCoords = this.calcOCoords();\n      this._setCornerCoords && this._setCornerCoords();\n      return this;\n    },\n\n    /**\n     * calculate rotation matrix of an object\n     * @return {Array} rotation matrix for the object\n     */\n    _calcRotateMatrix: function() {\n      return util.calcRotateMatrix(this);\n    },\n\n    /**\n     * calculate the translation matrix for an object transform\n     * @return {Array} rotation matrix for the object\n     */\n    _calcTranslateMatrix: function() {\n      var center = this.getCenterPoint();\n      return [1, 0, 0, 1, center.x, center.y];\n    },\n\n    transformMatrixKey: function(skipGroup) {\n      var sep = '_', prefix = '';\n      if (!skipGroup && this.group) {\n        prefix = this.group.transformMatrixKey(skipGroup) + sep;\n      };\n      return prefix + this.top + sep + this.left + sep + this.scaleX + sep + this.scaleY +\n        sep + this.skewX + sep + this.skewY + sep + this.angle + sep + this.originX + sep + this.originY +\n        sep + this.width + sep + this.height + sep + this.strokeWidth + this.flipX + this.flipY;\n    },\n\n    /**\n     * calculate transform matrix that represents the current transformations from the\n     * object's properties.\n     * @param {Boolean} [skipGroup] return transform matrix for object not counting parent transformations\n     * There are some situation in which this is useful to avoid the fake rotation.\n     * @return {Array} transform matrix for the object\n     */\n    calcTransformMatrix: function(skipGroup) {\n      var matrix = this.calcOwnMatrix();\n      if (skipGroup || !this.group) {\n        return matrix;\n      }\n      var key = this.transformMatrixKey(skipGroup), cache = this.matrixCache || (this.matrixCache = {});\n      if (cache.key === key) {\n        return cache.value;\n      }\n      if (this.group) {\n        matrix = multiplyMatrices(this.group.calcTransformMatrix(false), matrix);\n      }\n      cache.key = key;\n      cache.value = matrix;\n      return matrix;\n    },\n\n    /**\n     * calculate transform matrix that represents the current transformations from the\n     * object's properties, this matrix does not include the group transformation\n     * @return {Array} transform matrix for the object\n     */\n    calcOwnMatrix: function() {\n      var key = this.transformMatrixKey(true), cache = this.ownMatrixCache || (this.ownMatrixCache = {});\n      if (cache.key === key) {\n        return cache.value;\n      }\n      var tMatrix = this._calcTranslateMatrix(),\n          options = {\n            angle: this.angle,\n            translateX: tMatrix[4],\n            translateY: tMatrix[5],\n            scaleX: this.scaleX,\n            scaleY: this.scaleY,\n            skewX: this.skewX,\n            skewY: this.skewY,\n            flipX: this.flipX,\n            flipY: this.flipY,\n          };\n      cache.key = key;\n      cache.value = util.composeMatrix(options);\n      return cache.value;\n    },\n\n    /*\n     * Calculate object dimensions from its properties\n     * @private\n     * @deprecated since 3.4.0, please use fabric.util._calcDimensionsTransformMatrix\n     * not including or including flipX, flipY to emulate the flipping boolean\n     * @return {Object} .x width dimension\n     * @return {Object} .y height dimension\n     */\n    _calcDimensionsTransformMatrix: function(skewX, skewY, flipping) {\n      return util.calcDimensionsMatrix({\n        skewX: skewX,\n        skewY: skewY,\n        scaleX: this.scaleX * (flipping && this.flipX ? -1 : 1),\n        scaleY: this.scaleY * (flipping && this.flipY ? -1 : 1)\n      });\n    },\n\n    /*\n     * Calculate object dimensions from its properties\n     * @private\n     * @return {Object} .x width dimension\n     * @return {Object} .y height dimension\n     */\n    _getNonTransformedDimensions: function() {\n      var strokeWidth = this.strokeWidth,\n          w = this.width + strokeWidth,\n          h = this.height + strokeWidth;\n      return { x: w, y: h };\n    },\n\n    /*\n     * Calculate object bounding box dimensions from its properties scale, skew.\n     * @param {Number} skewX, a value to override current skewX\n     * @param {Number} skewY, a value to override current skewY\n     * @private\n     * @return {Object} .x width dimension\n     * @return {Object} .y height dimension\n     */\n    _getTransformedDimensions: function(skewX, skewY) {\n      if (typeof skewX === 'undefined') {\n        skewX = this.skewX;\n      }\n      if (typeof skewY === 'undefined') {\n        skewY = this.skewY;\n      }\n      var dimensions, dimX, dimY,\n          noSkew = skewX === 0 && skewY === 0;\n\n      if (this.strokeUniform) {\n        dimX = this.width;\n        dimY = this.height;\n      }\n      else {\n        dimensions = this._getNonTransformedDimensions();\n        dimX = dimensions.x;\n        dimY = dimensions.y;\n      }\n      if (noSkew) {\n        return this._finalizeDimensions(dimX * this.scaleX, dimY * this.scaleY);\n      }\n      var bbox = util.sizeAfterTransform(dimX, dimY, {\n        scaleX: this.scaleX,\n        scaleY: this.scaleY,\n        skewX: skewX,\n        skewY: skewY,\n      });\n      return this._finalizeDimensions(bbox.x, bbox.y);\n    },\n\n    /*\n     * Calculate object bounding box dimensions from its properties scale, skew.\n     * @param Number width width of the bbox\n     * @param Number height height of the bbox\n     * @private\n     * @return {Object} .x finalized width dimension\n     * @return {Object} .y finalized height dimension\n     */\n    _finalizeDimensions: function(width, height) {\n      return this.strokeUniform ?\n        { x: width + this.strokeWidth, y: height + this.strokeWidth }\n        :\n        { x: width, y: height };\n    },\n\n    /*\n     * Calculate object dimensions for controls box, including padding and canvas zoom.\n     * and active selection\n     * private\n     */\n    _calculateCurrentDimensions: function()  {\n      var vpt = this.getViewportTransform(),\n          dim = this._getTransformedDimensions(),\n          p = transformPoint(dim, vpt, true);\n      return p.scalarAdd(2 * this.padding);\n    },\n  });\n})();\n\n\nfabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prototype */ {\n\n  /**\n   * Moves an object to the bottom of the stack of drawn objects\n   * @return {fabric.Object} thisArg\n   * @chainable\n   */\n  sendToBack: function() {\n    if (this.group) {\n      fabric.StaticCanvas.prototype.sendToBack.call(this.group, this);\n    }\n    else if (this.canvas) {\n      this.canvas.sendToBack(this);\n    }\n    return this;\n  },\n\n  /**\n   * Moves an object to the top of the stack of drawn objects\n   * @return {fabric.Object} thisArg\n   * @chainable\n   */\n  bringToFront: function() {\n    if (this.group) {\n      fabric.StaticCanvas.prototype.bringToFront.call(this.group, this);\n    }\n    else if (this.canvas) {\n      this.canvas.bringToFront(this);\n    }\n    return this;\n  },\n\n  /**\n   * Moves an object down in stack of drawn objects\n   * @param {Boolean} [intersecting] If `true`, send object behind next lower intersecting object\n   * @return {fabric.Object} thisArg\n   * @chainable\n   */\n  sendBackwards: function(intersecting) {\n    if (this.group) {\n      fabric.StaticCanvas.prototype.sendBackwards.call(this.group, this, intersecting);\n    }\n    else if (this.canvas) {\n      this.canvas.sendBackwards(this, intersecting);\n    }\n    return this;\n  },\n\n  /**\n   * Moves an object up in stack of drawn objects\n   * @param {Boolean} [intersecting] If `true`, send object in front of next upper intersecting object\n   * @return {fabric.Object} thisArg\n   * @chainable\n   */\n  bringForward: function(intersecting) {\n    if (this.group) {\n      fabric.StaticCanvas.prototype.bringForward.call(this.group, this, intersecting);\n    }\n    else if (this.canvas) {\n      this.canvas.bringForward(this, intersecting);\n    }\n    return this;\n  },\n\n  /**\n   * Moves an object to specified level in stack of drawn objects\n   * @param {Number} index New position of object\n   * @return {fabric.Object} thisArg\n   * @chainable\n   */\n  moveTo: function(index) {\n    if (this.group && this.group.type !== 'activeSelection') {\n      fabric.StaticCanvas.prototype.moveTo.call(this.group, this, index);\n    }\n    else if (this.canvas) {\n      this.canvas.moveTo(this, index);\n    }\n    return this;\n  }\n});\n\n\n/* _TO_SVG_START_ */\n(function() {\n  function getSvgColorString(prop, value) {\n    if (!value) {\n      return prop + ': none; ';\n    }\n    else if (value.toLive) {\n      return prop + ': url(#SVGID_' + value.id + '); ';\n    }\n    else {\n      var color = new fabric.Color(value),\n          str = prop + ': ' + color.toRgb() + '; ',\n          opacity = color.getAlpha();\n      if (opacity !== 1) {\n        //change the color in rgb + opacity\n        str += prop + '-opacity: ' + opacity.toString() + '; ';\n      }\n      return str;\n    }\n  }\n\n  var toFixed = fabric.util.toFixed;\n\n  fabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prototype */ {\n    /**\n     * Returns styles-string for svg-export\n     * @param {Boolean} skipShadow a boolean to skip shadow filter output\n     * @return {String}\n     */\n    getSvgStyles: function(skipShadow) {\n\n      var fillRule = this.fillRule ? this.fillRule : 'nonzero',\n          strokeWidth = this.strokeWidth ? this.strokeWidth : '0',\n          strokeDashArray = this.strokeDashArray ? this.strokeDashArray.join(' ') : 'none',\n          strokeDashOffset = this.strokeDashOffset ? this.strokeDashOffset : '0',\n          strokeLineCap = this.strokeLineCap ? this.strokeLineCap : 'butt',\n          strokeLineJoin = this.strokeLineJoin ? this.strokeLineJoin : 'miter',\n          strokeMiterLimit = this.strokeMiterLimit ? this.strokeMiterLimit : '4',\n          opacity = typeof this.opacity !== 'undefined' ? this.opacity : '1',\n          visibility = this.visible ? '' : ' visibility: hidden;',\n          filter = skipShadow ? '' : this.getSvgFilter(),\n          fill = getSvgColorString('fill', this.fill),\n          stroke = getSvgColorString('stroke', this.stroke);\n\n      return [\n        stroke,\n        'stroke-width: ', strokeWidth, '; ',\n        'stroke-dasharray: ', strokeDashArray, '; ',\n        'stroke-linecap: ', strokeLineCap, '; ',\n        'stroke-dashoffset: ', strokeDashOffset, '; ',\n        'stroke-linejoin: ', strokeLineJoin, '; ',\n        'stroke-miterlimit: ', strokeMiterLimit, '; ',\n        fill,\n        'fill-rule: ', fillRule, '; ',\n        'opacity: ', opacity, ';',\n        filter,\n        visibility\n      ].join('');\n    },\n\n    /**\n     * Returns styles-string for svg-export\n     * @param {Object} style the object from which to retrieve style properties\n     * @param {Boolean} useWhiteSpace a boolean to include an additional attribute in the style.\n     * @return {String}\n     */\n    getSvgSpanStyles: function(style, useWhiteSpace) {\n      var term = '; ';\n      var fontFamily = style.fontFamily ?\n        'font-family: ' + (((style.fontFamily.indexOf('\\'') === -1 && style.fontFamily.indexOf('\"') === -1) ?\n          '\\'' + style.fontFamily  + '\\'' : style.fontFamily)) + term : '';\n      var strokeWidth = style.strokeWidth ? 'stroke-width: ' + style.strokeWidth + term : '',\n          fontFamily = fontFamily,\n          fontSize = style.fontSize ? 'font-size: ' + style.fontSize + 'px' + term : '',\n          fontStyle = style.fontStyle ? 'font-style: ' + style.fontStyle + term : '',\n          fontWeight = style.fontWeight ? 'font-weight: ' + style.fontWeight + term : '',\n          fill = style.fill ? getSvgColorString('fill', style.fill) : '',\n          stroke = style.stroke ? getSvgColorString('stroke', style.stroke) : '',\n          textDecoration = this.getSvgTextDecoration(style),\n          deltaY = style.deltaY ? 'baseline-shift: ' + (-style.deltaY) + '; ' : '';\n      if (textDecoration) {\n        textDecoration = 'text-decoration: ' + textDecoration + term;\n      }\n\n      return [\n        stroke,\n        strokeWidth,\n        fontFamily,\n        fontSize,\n        fontStyle,\n        fontWeight,\n        textDecoration,\n        fill,\n        deltaY,\n        useWhiteSpace ? 'white-space: pre; ' : ''\n      ].join('');\n    },\n\n    /**\n     * Returns text-decoration property for svg-export\n     * @param {Object} style the object from which to retrieve style properties\n     * @return {String}\n     */\n    getSvgTextDecoration: function(style) {\n      return ['overline', 'underline', 'line-through'].filter(function(decoration) {\n        return style[decoration.replace('-', '')];\n      }).join(' ');\n    },\n\n    /**\n     * Returns filter for svg shadow\n     * @return {String}\n     */\n    getSvgFilter: function() {\n      return this.shadow ? 'filter: url(#SVGID_' + this.shadow.id + ');' : '';\n    },\n\n    /**\n     * Returns id attribute for svg output\n     * @return {String}\n     */\n    getSvgCommons: function() {\n      return [\n        this.id ? 'id=\"' + this.id + '\" ' : '',\n        this.clipPath ? 'clip-path=\"url(#' + this.clipPath.clipPathId + ')\" ' : '',\n      ].join('');\n    },\n\n    /**\n     * Returns transform-string for svg-export\n     * @param {Boolean} use the full transform or the single object one.\n     * @return {String}\n     */\n    getSvgTransform: function(full, additionalTransform) {\n      var transform = full ? this.calcTransformMatrix() : this.calcOwnMatrix(),\n          svgTransform = 'transform=\"' + fabric.util.matrixToSVG(transform);\n      return svgTransform +\n        (additionalTransform || '') + '\" ';\n    },\n\n    _setSVGBg: function(textBgRects) {\n      if (this.backgroundColor) {\n        var NUM_FRACTION_DIGITS = fabric.Object.NUM_FRACTION_DIGITS;\n        textBgRects.push(\n          '\\t\\t<rect ',\n          this._getFillAttributes(this.backgroundColor),\n          ' x=\"',\n          toFixed(-this.width / 2, NUM_FRACTION_DIGITS),\n          '\" y=\"',\n          toFixed(-this.height / 2, NUM_FRACTION_DIGITS),\n          '\" width=\"',\n          toFixed(this.width, NUM_FRACTION_DIGITS),\n          '\" height=\"',\n          toFixed(this.height, NUM_FRACTION_DIGITS),\n          '\"></rect>\\n');\n      }\n    },\n\n    /**\n     * Returns svg representation of an instance\n     * @param {Function} [reviver] Method for further parsing of svg representation.\n     * @return {String} svg representation of an instance\n     */\n    toSVG: function(reviver) {\n      return this._createBaseSVGMarkup(this._toSVG(reviver), { reviver: reviver });\n    },\n\n    /**\n     * Returns svg clipPath representation of an instance\n     * @param {Function} [reviver] Method for further parsing of svg representation.\n     * @return {String} svg representation of an instance\n     */\n    toClipPathSVG: function(reviver) {\n      return '\\t' + this._createBaseClipPathSVGMarkup(this._toSVG(reviver), { reviver: reviver });\n    },\n\n    /**\n     * @private\n     */\n    _createBaseClipPathSVGMarkup: function(objectMarkup, options) {\n      options = options || {};\n      var reviver = options.reviver,\n          additionalTransform = options.additionalTransform || '',\n          commonPieces = [\n            this.getSvgTransform(true, additionalTransform),\n            this.getSvgCommons(),\n          ].join(''),\n          // insert commons in the markup, style and svgCommons\n          index = objectMarkup.indexOf('COMMON_PARTS');\n      objectMarkup[index] = commonPieces;\n      return reviver ? reviver(objectMarkup.join('')) : objectMarkup.join('');\n    },\n\n    /**\n     * @private\n     */\n    _createBaseSVGMarkup: function(objectMarkup, options) {\n      options = options || {};\n      var noStyle = options.noStyle,\n          reviver = options.reviver,\n          styleInfo = noStyle ? '' : 'style=\"' + this.getSvgStyles() + '\" ',\n          shadowInfo = options.withShadow ? 'style=\"' + this.getSvgFilter() + '\" ' : '',\n          clipPath = this.clipPath,\n          vectorEffect = this.strokeUniform ? 'vector-effect=\"non-scaling-stroke\" ' : '',\n          absoluteClipPath = clipPath && clipPath.absolutePositioned,\n          stroke = this.stroke, fill = this.fill, shadow = this.shadow,\n          commonPieces, markup = [], clipPathMarkup,\n          // insert commons in the markup, style and svgCommons\n          index = objectMarkup.indexOf('COMMON_PARTS'),\n          additionalTransform = options.additionalTransform;\n      if (clipPath) {\n        clipPath.clipPathId = 'CLIPPATH_' + fabric.Object.__uid++;\n        clipPathMarkup = '<clipPath id=\"' + clipPath.clipPathId + '\" >\\n' +\n          clipPath.toClipPathSVG(reviver) +\n          '</clipPath>\\n';\n      }\n      if (absoluteClipPath) {\n        markup.push(\n          '<g ', shadowInfo, this.getSvgCommons(), ' >\\n'\n        );\n      }\n      markup.push(\n        '<g ',\n        this.getSvgTransform(false),\n        !absoluteClipPath ? shadowInfo + this.getSvgCommons() : '',\n        ' >\\n'\n      );\n      commonPieces = [\n        styleInfo,\n        vectorEffect,\n        noStyle ? '' : this.addPaintOrder(), ' ',\n        additionalTransform ? 'transform=\"' + additionalTransform + '\" ' : '',\n      ].join('');\n      objectMarkup[index] = commonPieces;\n      if (fill && fill.toLive) {\n        markup.push(fill.toSVG(this));\n      }\n      if (stroke && stroke.toLive) {\n        markup.push(stroke.toSVG(this));\n      }\n      if (shadow) {\n        markup.push(shadow.toSVG(this));\n      }\n      if (clipPath) {\n        markup.push(clipPathMarkup);\n      }\n      markup.push(objectMarkup.join(''));\n      markup.push('</g>\\n');\n      absoluteClipPath && markup.push('</g>\\n');\n      return reviver ? reviver(markup.join('')) : markup.join('');\n    },\n\n    addPaintOrder: function() {\n      return this.paintFirst !== 'fill' ? ' paint-order=\"' + this.paintFirst + '\" ' : '';\n    }\n  });\n})();\n/* _TO_SVG_END_ */\n\n\n(function() {\n\n  var extend = fabric.util.object.extend,\n      originalSet = 'stateProperties';\n\n  /*\n    Depends on `stateProperties`\n  */\n  function saveProps(origin, destination, props) {\n    var tmpObj = { }, deep = true;\n    props.forEach(function(prop) {\n      tmpObj[prop] = origin[prop];\n    });\n\n    extend(origin[destination], tmpObj, deep);\n  }\n\n  function _isEqual(origValue, currentValue, firstPass) {\n    if (origValue === currentValue) {\n      // if the objects are identical, return\n      return true;\n    }\n    else if (Array.isArray(origValue)) {\n      if (!Array.isArray(currentValue) || origValue.length !== currentValue.length) {\n        return false;\n      }\n      for (var i = 0, len = origValue.length; i < len; i++) {\n        if (!_isEqual(origValue[i], currentValue[i])) {\n          return false;\n        }\n      }\n      return true;\n    }\n    else if (origValue && typeof origValue === 'object') {\n      var keys = Object.keys(origValue), key;\n      if (!currentValue ||\n          typeof currentValue !== 'object' ||\n          (!firstPass && keys.length !== Object.keys(currentValue).length)\n      ) {\n        return false;\n      }\n      for (var i = 0, len = keys.length; i < len; i++) {\n        key = keys[i];\n        // since clipPath is in the statefull cache list and the clipPath objects\n        // would be iterated as an object, this would lead to possible infinite recursion\n        // we do not want to compare those.\n        if (key === 'canvas' || key === 'group') {\n          continue;\n        }\n        if (!_isEqual(origValue[key], currentValue[key])) {\n          return false;\n        }\n      }\n      return true;\n    }\n  }\n\n\n  fabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prototype */ {\n\n    /**\n     * Returns true if object state (one of its state properties) was changed\n     * @param {String} [propertySet] optional name for the set of property we want to save\n     * @return {Boolean} true if instance' state has changed since `{@link fabric.Object#saveState}` was called\n     */\n    hasStateChanged: function(propertySet) {\n      propertySet = propertySet || originalSet;\n      var dashedPropertySet = '_' + propertySet;\n      if (Object.keys(this[dashedPropertySet]).length < this[propertySet].length) {\n        return true;\n      }\n      return !_isEqual(this[dashedPropertySet], this, true);\n    },\n\n    /**\n     * Saves state of an object\n     * @param {Object} [options] Object with additional `stateProperties` array to include when saving state\n     * @return {fabric.Object} thisArg\n     */\n    saveState: function(options) {\n      var propertySet = options && options.propertySet || originalSet,\n          destination = '_' + propertySet;\n      if (!this[destination]) {\n        return this.setupState(options);\n      }\n      saveProps(this, destination, this[propertySet]);\n      if (options && options.stateProperties) {\n        saveProps(this, destination, options.stateProperties);\n      }\n      return this;\n    },\n\n    /**\n     * Setups state of an object\n     * @param {Object} [options] Object with additional `stateProperties` array to include when saving state\n     * @return {fabric.Object} thisArg\n     */\n    setupState: function(options) {\n      options = options || { };\n      var propertySet = options.propertySet || originalSet;\n      options.propertySet = propertySet;\n      this['_' + propertySet] = { };\n      this.saveState(options);\n      return this;\n    }\n  });\n})();\n\n\n(function() {\n\n  var degreesToRadians = fabric.util.degreesToRadians;\n\n  fabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prototype */ {\n    /**\n     * Determines which corner has been clicked\n     * @private\n     * @param {Object} pointer The pointer indicating the mouse position\n     * @return {String|Boolean} corner code (tl, tr, bl, br, etc.), or false if nothing is found\n     */\n    _findTargetCorner: function(pointer, forTouch) {\n      // objects in group, anykind, are not self modificable,\n      // must not return an hovered corner.\n      if (!this.hasControls || this.group || (!this.canvas || this.canvas._activeObject !== this)) {\n        return false;\n      }\n\n      var ex = pointer.x,\n          ey = pointer.y,\n          xPoints,\n          lines, keys = Object.keys(this.oCoords),\n          j = keys.length - 1, i;\n      this.__corner = 0;\n\n      // cycle in reverse order so we pick first the one on top\n      for (; j >= 0; j--) {\n        i = keys[j];\n        if (!this.isControlVisible(i)) {\n          continue;\n        }\n\n        lines = this._getImageLines(forTouch ? this.oCoords[i].touchCorner : this.oCoords[i].corner);\n        // // debugging\n        //\n        // this.canvas.contextTop.fillRect(lines.bottomline.d.x, lines.bottomline.d.y, 2, 2);\n        // this.canvas.contextTop.fillRect(lines.bottomline.o.x, lines.bottomline.o.y, 2, 2);\n        //\n        // this.canvas.contextTop.fillRect(lines.leftline.d.x, lines.leftline.d.y, 2, 2);\n        // this.canvas.contextTop.fillRect(lines.leftline.o.x, lines.leftline.o.y, 2, 2);\n        //\n        // this.canvas.contextTop.fillRect(lines.topline.d.x, lines.topline.d.y, 2, 2);\n        // this.canvas.contextTop.fillRect(lines.topline.o.x, lines.topline.o.y, 2, 2);\n        //\n        // this.canvas.contextTop.fillRect(lines.rightline.d.x, lines.rightline.d.y, 2, 2);\n        // this.canvas.contextTop.fillRect(lines.rightline.o.x, lines.rightline.o.y, 2, 2);\n\n        xPoints = this._findCrossPoints({ x: ex, y: ey }, lines);\n        if (xPoints !== 0 && xPoints % 2 === 1) {\n          this.__corner = i;\n          return i;\n        }\n      }\n      return false;\n    },\n\n    /**\n     * Calls a function for each control. The function gets called,\n     * with the control, the object that is calling the iterator and the control's key\n     * @param {Function} fn function to iterate over the controls over\n     */\n    forEachControl: function(fn) {\n      for (var i in this.controls) {\n        fn(this.controls[i], i, this);\n      };\n    },\n\n    /**\n     * Sets the coordinates of the draggable boxes in the corners of\n     * the image used to scale/rotate it.\n     * note: if we would switch to ROUND corner area, all of this would disappear.\n     * everything would resolve to a single point and a pythagorean theorem for the distance\n     * @private\n     */\n    _setCornerCoords: function() {\n      var coords = this.oCoords;\n\n      for (var control in coords) {\n        var controlObject = this.controls[control];\n        coords[control].corner = controlObject.calcCornerCoords(\n          this.angle, this.cornerSize, coords[control].x, coords[control].y, false);\n        coords[control].touchCorner = controlObject.calcCornerCoords(\n          this.angle, this.touchCornerSize, coords[control].x, coords[control].y, true);\n      }\n    },\n\n    /**\n     * Draws a colored layer behind the object, inside its selection borders.\n     * Requires public options: padding, selectionBackgroundColor\n     * this function is called when the context is transformed\n     * has checks to be skipped when the object is on a staticCanvas\n     * @param {CanvasRenderingContext2D} ctx Context to draw on\n     * @return {fabric.Object} thisArg\n     * @chainable\n     */\n    drawSelectionBackground: function(ctx) {\n      if (!this.selectionBackgroundColor ||\n        (this.canvas && !this.canvas.interactive) ||\n        (this.canvas && this.canvas._activeObject !== this)\n      ) {\n        return this;\n      }\n      ctx.save();\n      var center = this.getCenterPoint(), wh = this._calculateCurrentDimensions(),\n          vpt = this.canvas.viewportTransform;\n      ctx.translate(center.x, center.y);\n      ctx.scale(1 / vpt[0], 1 / vpt[3]);\n      ctx.rotate(degreesToRadians(this.angle));\n      ctx.fillStyle = this.selectionBackgroundColor;\n      ctx.fillRect(-wh.x / 2, -wh.y / 2, wh.x, wh.y);\n      ctx.restore();\n      return this;\n    },\n\n    /**\n     * Draws borders of an object's bounding box.\n     * Requires public properties: width, height\n     * Requires public options: padding, borderColor\n     * @param {CanvasRenderingContext2D} ctx Context to draw on\n     * @param {Object} styleOverride object to override the object style\n     * @return {fabric.Object} thisArg\n     * @chainable\n     */\n    drawBorders: function(ctx, styleOverride) {\n      styleOverride = styleOverride || {};\n      var wh = this._calculateCurrentDimensions(),\n          strokeWidth = this.borderScaleFactor,\n          width = wh.x + strokeWidth,\n          height = wh.y + strokeWidth,\n          hasControls = typeof styleOverride.hasControls !== 'undefined' ?\n            styleOverride.hasControls : this.hasControls,\n          shouldStroke = false;\n\n      ctx.save();\n      ctx.strokeStyle = styleOverride.borderColor || this.borderColor;\n      this._setLineDash(ctx, styleOverride.borderDashArray || this.borderDashArray);\n\n      ctx.strokeRect(\n        -width / 2,\n        -height / 2,\n        width,\n        height\n      );\n\n      if (hasControls) {\n        ctx.beginPath();\n        this.forEachControl(function(control, key, fabricObject) {\n          // in this moment, the ctx is centered on the object.\n          // width and height of the above function are the size of the bbox.\n          if (control.withConnection && control.getVisibility(fabricObject, key)) {\n            // reset movement for each control\n            shouldStroke = true;\n            ctx.moveTo(control.x * width, control.y * height);\n            ctx.lineTo(\n              control.x * width + control.offsetX,\n              control.y * height + control.offsetY\n            );\n          }\n        });\n        if (shouldStroke) {\n          ctx.stroke();\n        }\n      }\n      ctx.restore();\n      return this;\n    },\n\n    /**\n     * Draws borders of an object's bounding box when it is inside a group.\n     * Requires public properties: width, height\n     * Requires public options: padding, borderColor\n     * @param {CanvasRenderingContext2D} ctx Context to draw on\n     * @param {object} options object representing current object parameters\n     * @param {Object} styleOverride object to override the object style\n     * @return {fabric.Object} thisArg\n     * @chainable\n     */\n    drawBordersInGroup: function(ctx, options, styleOverride) {\n      styleOverride = styleOverride || {};\n      var bbox = fabric.util.sizeAfterTransform(this.width, this.height, options),\n          strokeWidth = this.strokeWidth,\n          strokeUniform = this.strokeUniform,\n          borderScaleFactor = this.borderScaleFactor,\n          width =\n            bbox.x + strokeWidth * (strokeUniform ? this.canvas.getZoom() : options.scaleX) + borderScaleFactor,\n          height =\n            bbox.y + strokeWidth * (strokeUniform ? this.canvas.getZoom() : options.scaleY) + borderScaleFactor;\n      ctx.save();\n      this._setLineDash(ctx, styleOverride.borderDashArray || this.borderDashArray);\n      ctx.strokeStyle = styleOverride.borderColor || this.borderColor;\n      ctx.strokeRect(\n        -width / 2,\n        -height / 2,\n        width,\n        height\n      );\n\n      ctx.restore();\n      return this;\n    },\n\n    /**\n     * Draws corners of an object's bounding box.\n     * Requires public properties: width, height\n     * Requires public options: cornerSize, padding\n     * @param {CanvasRenderingContext2D} ctx Context to draw on\n     * @param {Object} styleOverride object to override the object style\n     * @return {fabric.Object} thisArg\n     * @chainable\n     */\n    drawControls: function(ctx, styleOverride) {\n      styleOverride = styleOverride || {};\n      ctx.save();\n      var retinaScaling = this.canvas.getRetinaScaling(), matrix, p;\n      ctx.setTransform(retinaScaling, 0, 0, retinaScaling, 0, 0);\n      ctx.strokeStyle = ctx.fillStyle = styleOverride.cornerColor || this.cornerColor;\n      if (!this.transparentCorners) {\n        ctx.strokeStyle = styleOverride.cornerStrokeColor || this.cornerStrokeColor;\n      }\n      this._setLineDash(ctx, styleOverride.cornerDashArray || this.cornerDashArray);\n      this.setCoords();\n      if (this.group) {\n        // fabricJS does not really support drawing controls inside groups,\n        // this piece of code here helps having at least the control in places.\n        // If an application needs to show some objects as selected because of some UI state\n        // can still call Object._renderControls() on any object they desire, independently of groups.\n        // using no padding, circular controls and hiding the rotating cursor is higly suggested,\n        matrix = this.group.calcTransformMatrix();\n      }\n      this.forEachControl(function(control, key, fabricObject) {\n        p = fabricObject.oCoords[key];\n        if (control.getVisibility(fabricObject, key)) {\n          if (matrix) {\n            p = fabric.util.transformPoint(p, matrix);\n          }\n          control.render(ctx, p.x, p.y, styleOverride, fabricObject);\n        }\n      });\n      ctx.restore();\n\n      return this;\n    },\n\n    /**\n     * Returns true if the specified control is visible, false otherwise.\n     * @param {String} controlKey The key of the control. Possible values are 'tl', 'tr', 'br', 'bl', 'ml', 'mt', 'mr', 'mb', 'mtr'.\n     * @returns {Boolean} true if the specified control is visible, false otherwise\n     */\n    isControlVisible: function(controlKey) {\n      return this.controls[controlKey] && this.controls[controlKey].getVisibility(this, controlKey);\n    },\n\n    /**\n     * Sets the visibility of the specified control.\n     * @param {String} controlKey The key of the control. Possible values are 'tl', 'tr', 'br', 'bl', 'ml', 'mt', 'mr', 'mb', 'mtr'.\n     * @param {Boolean} visible true to set the specified control visible, false otherwise\n     * @return {fabric.Object} thisArg\n     * @chainable\n     */\n    setControlVisible: function(controlKey, visible) {\n      if (!this._controlsVisibility) {\n        this._controlsVisibility = {};\n      }\n      this._controlsVisibility[controlKey] = visible;\n      return this;\n    },\n\n    /**\n     * Sets the visibility state of object controls.\n     * @param {Object} [options] Options object\n     * @param {Boolean} [options.bl] true to enable the bottom-left control, false to disable it\n     * @param {Boolean} [options.br] true to enable the bottom-right control, false to disable it\n     * @param {Boolean} [options.mb] true to enable the middle-bottom control, false to disable it\n     * @param {Boolean} [options.ml] true to enable the middle-left control, false to disable it\n     * @param {Boolean} [options.mr] true to enable the middle-right control, false to disable it\n     * @param {Boolean} [options.mt] true to enable the middle-top control, false to disable it\n     * @param {Boolean} [options.tl] true to enable the top-left control, false to disable it\n     * @param {Boolean} [options.tr] true to enable the top-right control, false to disable it\n     * @param {Boolean} [options.mtr] true to enable the middle-top-rotate control, false to disable it\n     * @return {fabric.Object} thisArg\n     * @chainable\n     */\n    setControlsVisibility: function(options) {\n      options || (options = { });\n\n      for (var p in options) {\n        this.setControlVisible(p, options[p]);\n      }\n      return this;\n    },\n\n\n    /**\n     * This callback function is called every time _discardActiveObject or _setActiveObject\n     * try to to deselect this object. If the function returns true, the process is cancelled\n     * @param {Object} [options] options sent from the upper functions\n     * @param {Event} [options.e] event if the process is generated by an event\n     */\n    onDeselect: function() {\n      // implemented by sub-classes, as needed.\n    },\n\n\n    /**\n     * This callback function is called every time _discardActiveObject or _setActiveObject\n     * try to to select this object. If the function returns true, the process is cancelled\n     * @param {Object} [options] options sent from the upper functions\n     * @param {Event} [options.e] event if the process is generated by an event\n     */\n    onSelect: function() {\n      // implemented by sub-classes, as needed.\n    }\n  });\n})();\n\n\nfabric.util.object.extend(fabric.StaticCanvas.prototype, /** @lends fabric.StaticCanvas.prototype */ {\n\n  /**\n   * Animation duration (in ms) for fx* methods\n   * @type Number\n   * @default\n   */\n  FX_DURATION: 500,\n\n  /**\n   * Centers object horizontally with animation.\n   * @param {fabric.Object} object Object to center\n   * @param {Object} [callbacks] Callbacks object with optional \"onComplete\" and/or \"onChange\" properties\n   * @param {Function} [callbacks.onComplete] Invoked on completion\n   * @param {Function} [callbacks.onChange] Invoked on every step of animation\n   * @return {fabric.Canvas} thisArg\n   * @chainable\n   */\n  fxCenterObjectH: function (object, callbacks) {\n    callbacks = callbacks || { };\n\n    var empty = function() { },\n        onComplete = callbacks.onComplete || empty,\n        onChange = callbacks.onChange || empty,\n        _this = this;\n\n    fabric.util.animate({\n      startValue: object.left,\n      endValue: this.getCenter().left,\n      duration: this.FX_DURATION,\n      onChange: function(value) {\n        object.set('left', value);\n        _this.requestRenderAll();\n        onChange();\n      },\n      onComplete: function() {\n        object.setCoords();\n        onComplete();\n      }\n    });\n\n    return this;\n  },\n\n  /**\n   * Centers object vertically with animation.\n   * @param {fabric.Object} object Object to center\n   * @param {Object} [callbacks] Callbacks object with optional \"onComplete\" and/or \"onChange\" properties\n   * @param {Function} [callbacks.onComplete] Invoked on completion\n   * @param {Function} [callbacks.onChange] Invoked on every step of animation\n   * @return {fabric.Canvas} thisArg\n   * @chainable\n   */\n  fxCenterObjectV: function (object, callbacks) {\n    callbacks = callbacks || { };\n\n    var empty = function() { },\n        onComplete = callbacks.onComplete || empty,\n        onChange = callbacks.onChange || empty,\n        _this = this;\n\n    fabric.util.animate({\n      startValue: object.top,\n      endValue: this.getCenter().top,\n      duration: this.FX_DURATION,\n      onChange: function(value) {\n        object.set('top', value);\n        _this.requestRenderAll();\n        onChange();\n      },\n      onComplete: function() {\n        object.setCoords();\n        onComplete();\n      }\n    });\n\n    return this;\n  },\n\n  /**\n   * Same as `fabric.Canvas#remove` but animated\n   * @param {fabric.Object} object Object to remove\n   * @param {Object} [callbacks] Callbacks object with optional \"onComplete\" and/or \"onChange\" properties\n   * @param {Function} [callbacks.onComplete] Invoked on completion\n   * @param {Function} [callbacks.onChange] Invoked on every step of animation\n   * @return {fabric.Canvas} thisArg\n   * @chainable\n   */\n  fxRemove: function (object, callbacks) {\n    callbacks = callbacks || { };\n\n    var empty = function() { },\n        onComplete = callbacks.onComplete || empty,\n        onChange = callbacks.onChange || empty,\n        _this = this;\n\n    fabric.util.animate({\n      startValue: object.opacity,\n      endValue: 0,\n      duration: this.FX_DURATION,\n      onChange: function(value) {\n        object.set('opacity', value);\n        _this.requestRenderAll();\n        onChange();\n      },\n      onComplete: function () {\n        _this.remove(object);\n        onComplete();\n      }\n    });\n\n    return this;\n  }\n});\n\nfabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prototype */ {\n  /**\n   * Animates object's properties\n   * @param {String|Object} property Property to animate (if string) or properties to animate (if object)\n   * @param {Number|Object} value Value to animate property to (if string was given first) or options object\n   * @return {fabric.Object} thisArg\n   * @tutorial {@link http://fabricjs.com/fabric-intro-part-2#animation}\n   * @chainable\n   *\n   * As object — multiple properties\n   *\n   * object.animate({ left: ..., top: ... });\n   * object.animate({ left: ..., top: ... }, { duration: ... });\n   *\n   * As string — one property\n   *\n   * object.animate('left', ...);\n   * object.animate('left', { duration: ... });\n   *\n   */\n  animate: function() {\n    if (arguments[0] && typeof arguments[0] === 'object') {\n      var propsToAnimate = [], prop, skipCallbacks;\n      for (prop in arguments[0]) {\n        propsToAnimate.push(prop);\n      }\n      for (var i = 0, len = propsToAnimate.length; i < len; i++) {\n        prop = propsToAnimate[i];\n        skipCallbacks = i !== len - 1;\n        this._animate(prop, arguments[0][prop], arguments[1], skipCallbacks);\n      }\n    }\n    else {\n      this._animate.apply(this, arguments);\n    }\n    return this;\n  },\n\n  /**\n   * @private\n   * @param {String} property Property to animate\n   * @param {String} to Value to animate to\n   * @param {Object} [options] Options object\n   * @param {Boolean} [skipCallbacks] When true, callbacks like onchange and oncomplete are not invoked\n   */\n  _animate: function(property, to, options, skipCallbacks) {\n    var _this = this, propPair;\n\n    to = to.toString();\n\n    if (!options) {\n      options = { };\n    }\n    else {\n      options = fabric.util.object.clone(options);\n    }\n\n    if (~property.indexOf('.')) {\n      propPair = property.split('.');\n    }\n\n    var propIsColor =\n      _this.colorProperties.indexOf(property) > -1 ||\n      (propPair && _this.colorProperties.indexOf(propPair[1]) > -1);\n\n    var currentValue = propPair\n      ? this.get(propPair[0])[propPair[1]]\n      : this.get(property);\n\n    if (!('from' in options)) {\n      options.from = currentValue;\n    }\n\n    if (!propIsColor) {\n      if (~to.indexOf('=')) {\n        to = currentValue + parseFloat(to.replace('=', ''));\n      }\n      else {\n        to = parseFloat(to);\n      }\n    }\n\n    var _options = {\n      startValue: options.from,\n      endValue: to,\n      byValue: options.by,\n      easing: options.easing,\n      duration: options.duration,\n      abort: options.abort && function(value, valueProgress, timeProgress) {\n        return options.abort.call(_this, value, valueProgress, timeProgress);\n      },\n      onChange: function (value, valueProgress, timeProgress) {\n        if (propPair) {\n          _this[propPair[0]][propPair[1]] = value;\n        }\n        else {\n          _this.set(property, value);\n        }\n        if (skipCallbacks) {\n          return;\n        }\n        options.onChange && options.onChange(value, valueProgress, timeProgress);\n      },\n      onComplete: function (value, valueProgress, timeProgress) {\n        if (skipCallbacks) {\n          return;\n        }\n\n        _this.setCoords();\n        options.onComplete && options.onComplete(value, valueProgress, timeProgress);\n      }\n    };\n\n    if (propIsColor) {\n      return fabric.util.animateColor(_options.startValue, _options.endValue, _options.duration, _options);\n    }\n    else {\n      return fabric.util.animate(_options);\n    }\n  }\n});\n\n\n(function(global) {\n\n  'use strict';\n\n  var fabric = global.fabric || (global.fabric = { }),\n      extend = fabric.util.object.extend,\n      clone = fabric.util.object.clone,\n      coordProps = { x1: 1, x2: 1, y1: 1, y2: 1 };\n\n  if (fabric.Line) {\n    fabric.warn('fabric.Line is already defined');\n    return;\n  }\n\n  /**\n   * Line class\n   * @class fabric.Line\n   * @extends fabric.Object\n   * @see {@link fabric.Line#initialize} for constructor definition\n   */\n  fabric.Line = fabric.util.createClass(fabric.Object, /** @lends fabric.Line.prototype */ {\n\n    /**\n     * Type of an object\n     * @type String\n     * @default\n     */\n    type: 'line',\n\n    /**\n     * x value or first line edge\n     * @type Number\n     * @default\n     */\n    x1: 0,\n\n    /**\n     * y value or first line edge\n     * @type Number\n     * @default\n     */\n    y1: 0,\n\n    /**\n     * x value or second line edge\n     * @type Number\n     * @default\n     */\n    x2: 0,\n\n    /**\n     * y value or second line edge\n     * @type Number\n     * @default\n     */\n    y2: 0,\n\n    cacheProperties: fabric.Object.prototype.cacheProperties.concat('x1', 'x2', 'y1', 'y2'),\n\n    /**\n     * Constructor\n     * @param {Array} [points] Array of points\n     * @param {Object} [options] Options object\n     * @return {fabric.Line} thisArg\n     */\n    initialize: function(points, options) {\n      if (!points) {\n        points = [0, 0, 0, 0];\n      }\n\n      this.callSuper('initialize', options);\n\n      this.set('x1', points[0]);\n      this.set('y1', points[1]);\n      this.set('x2', points[2]);\n      this.set('y2', points[3]);\n\n      this._setWidthHeight(options);\n    },\n\n    /**\n     * @private\n     * @param {Object} [options] Options\n     */\n    _setWidthHeight: function(options) {\n      options || (options = { });\n\n      this.width = Math.abs(this.x2 - this.x1);\n      this.height = Math.abs(this.y2 - this.y1);\n\n      this.left = 'left' in options\n        ? options.left\n        : this._getLeftToOriginX();\n\n      this.top = 'top' in options\n        ? options.top\n        : this._getTopToOriginY();\n    },\n\n    /**\n     * @private\n     * @param {String} key\n     * @param {*} value\n     */\n    _set: function(key, value) {\n      this.callSuper('_set', key, value);\n      if (typeof coordProps[key] !== 'undefined') {\n        this._setWidthHeight();\n      }\n      return this;\n    },\n\n    /**\n     * @private\n     * @return {Number} leftToOriginX Distance from left edge of canvas to originX of Line.\n     */\n    _getLeftToOriginX: makeEdgeToOriginGetter(\n      { // property names\n        origin: 'originX',\n        axis1: 'x1',\n        axis2: 'x2',\n        dimension: 'width'\n      },\n      { // possible values of origin\n        nearest: 'left',\n        center: 'center',\n        farthest: 'right'\n      }\n    ),\n\n    /**\n     * @private\n     * @return {Number} topToOriginY Distance from top edge of canvas to originY of Line.\n     */\n    _getTopToOriginY: makeEdgeToOriginGetter(\n      { // property names\n        origin: 'originY',\n        axis1: 'y1',\n        axis2: 'y2',\n        dimension: 'height'\n      },\n      { // possible values of origin\n        nearest: 'top',\n        center: 'center',\n        farthest: 'bottom'\n      }\n    ),\n\n    /**\n     * @private\n     * @param {CanvasRenderingContext2D} ctx Context to render on\n     */\n    _render: function(ctx) {\n      ctx.beginPath();\n\n\n      var p = this.calcLinePoints();\n      ctx.moveTo(p.x1, p.y1);\n      ctx.lineTo(p.x2, p.y2);\n\n      ctx.lineWidth = this.strokeWidth;\n\n      // TODO: test this\n      // make sure setting \"fill\" changes color of a line\n      // (by copying fillStyle to strokeStyle, since line is stroked, not filled)\n      var origStrokeStyle = ctx.strokeStyle;\n      ctx.strokeStyle = this.stroke || ctx.fillStyle;\n      this.stroke && this._renderStroke(ctx);\n      ctx.strokeStyle = origStrokeStyle;\n    },\n\n    /**\n     * This function is an helper for svg import. it returns the center of the object in the svg\n     * untransformed coordinates\n     * @private\n     * @return {Object} center point from element coordinates\n     */\n    _findCenterFromElement: function() {\n      return {\n        x: (this.x1 + this.x2) / 2,\n        y: (this.y1 + this.y2) / 2,\n      };\n    },\n\n    /**\n     * Returns object representation of an instance\n     * @method toObject\n     * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n     * @return {Object} object representation of an instance\n     */\n    toObject: function(propertiesToInclude) {\n      return extend(this.callSuper('toObject', propertiesToInclude), this.calcLinePoints());\n    },\n\n    /*\n     * Calculate object dimensions from its properties\n     * @private\n     */\n    _getNonTransformedDimensions: function() {\n      var dim = this.callSuper('_getNonTransformedDimensions');\n      if (this.strokeLineCap === 'butt') {\n        if (this.width === 0) {\n          dim.y -= this.strokeWidth;\n        }\n        if (this.height === 0) {\n          dim.x -= this.strokeWidth;\n        }\n      }\n      return dim;\n    },\n\n    /**\n     * Recalculates line points given width and height\n     * @private\n     */\n    calcLinePoints: function() {\n      var xMult = this.x1 <= this.x2 ? -1 : 1,\n          yMult = this.y1 <= this.y2 ? -1 : 1,\n          x1 = (xMult * this.width * 0.5),\n          y1 = (yMult * this.height * 0.5),\n          x2 = (xMult * this.width * -0.5),\n          y2 = (yMult * this.height * -0.5);\n\n      return {\n        x1: x1,\n        x2: x2,\n        y1: y1,\n        y2: y2\n      };\n    },\n\n    /* _TO_SVG_START_ */\n    /**\n     * Returns svg representation of an instance\n     * @return {Array} an array of strings with the specific svg representation\n     * of the instance\n     */\n    _toSVG: function() {\n      var p = this.calcLinePoints();\n      return [\n        '<line ', 'COMMON_PARTS',\n        'x1=\"', p.x1,\n        '\" y1=\"', p.y1,\n        '\" x2=\"', p.x2,\n        '\" y2=\"', p.y2,\n        '\" />\\n'\n      ];\n    },\n    /* _TO_SVG_END_ */\n  });\n\n  /* _FROM_SVG_START_ */\n  /**\n   * List of attribute names to account for when parsing SVG element (used by {@link fabric.Line.fromElement})\n   * @static\n   * @memberOf fabric.Line\n   * @see http://www.w3.org/TR/SVG/shapes.html#LineElement\n   */\n  fabric.Line.ATTRIBUTE_NAMES = fabric.SHARED_ATTRIBUTES.concat('x1 y1 x2 y2'.split(' '));\n\n  /**\n   * Returns fabric.Line instance from an SVG element\n   * @static\n   * @memberOf fabric.Line\n   * @param {SVGElement} element Element to parse\n   * @param {Object} [options] Options object\n   * @param {Function} [callback] callback function invoked after parsing\n   */\n  fabric.Line.fromElement = function(element, callback, options) {\n    options = options || { };\n    var parsedAttributes = fabric.parseAttributes(element, fabric.Line.ATTRIBUTE_NAMES),\n        points = [\n          parsedAttributes.x1 || 0,\n          parsedAttributes.y1 || 0,\n          parsedAttributes.x2 || 0,\n          parsedAttributes.y2 || 0\n        ];\n    callback(new fabric.Line(points, extend(parsedAttributes, options)));\n  };\n  /* _FROM_SVG_END_ */\n\n  /**\n   * Returns fabric.Line instance from an object representation\n   * @static\n   * @memberOf fabric.Line\n   * @param {Object} object Object to create an instance from\n   * @param {function} [callback] invoked with new instance as first argument\n   */\n  fabric.Line.fromObject = function(object, callback) {\n    function _callback(instance) {\n      delete instance.points;\n      callback && callback(instance);\n    };\n    var options = clone(object, true);\n    options.points = [object.x1, object.y1, object.x2, object.y2];\n    fabric.Object._fromObject('Line', options, _callback, 'points');\n  };\n\n  /**\n   * Produces a function that calculates distance from canvas edge to Line origin.\n   */\n  function makeEdgeToOriginGetter(propertyNames, originValues) {\n    var origin = propertyNames.origin,\n        axis1 = propertyNames.axis1,\n        axis2 = propertyNames.axis2,\n        dimension = propertyNames.dimension,\n        nearest = originValues.nearest,\n        center = originValues.center,\n        farthest = originValues.farthest;\n\n    return function() {\n      switch (this.get(origin)) {\n        case nearest:\n          return Math.min(this.get(axis1), this.get(axis2));\n        case center:\n          return Math.min(this.get(axis1), this.get(axis2)) + (0.5 * this.get(dimension));\n        case farthest:\n          return Math.max(this.get(axis1), this.get(axis2));\n      }\n    };\n\n  }\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n  'use strict';\n\n  var fabric = global.fabric || (global.fabric = { }),\n      pi = Math.PI;\n\n  if (fabric.Circle) {\n    fabric.warn('fabric.Circle is already defined.');\n    return;\n  }\n\n  /**\n   * Circle class\n   * @class fabric.Circle\n   * @extends fabric.Object\n   * @see {@link fabric.Circle#initialize} for constructor definition\n   */\n  fabric.Circle = fabric.util.createClass(fabric.Object, /** @lends fabric.Circle.prototype */ {\n\n    /**\n     * Type of an object\n     * @type String\n     * @default\n     */\n    type: 'circle',\n\n    /**\n     * Radius of this circle\n     * @type Number\n     * @default\n     */\n    radius: 0,\n\n    /**\n     * Start angle of the circle, moving clockwise\n     * deprecated type, this should be in degree, this was an oversight.\n     * probably will change to degrees in next major version\n     * @type Number\n     * @default 0\n     */\n    startAngle: 0,\n\n    /**\n     * End angle of the circle\n     * deprecated type, this should be in degree, this was an oversight.\n     * probably will change to degrees in next major version\n     * @type Number\n     * @default 2Pi\n     */\n    endAngle: pi * 2,\n\n    cacheProperties: fabric.Object.prototype.cacheProperties.concat('radius', 'startAngle', 'endAngle'),\n\n    /**\n     * @private\n     * @param {String} key\n     * @param {*} value\n     * @return {fabric.Circle} thisArg\n     */\n    _set: function(key, value) {\n      this.callSuper('_set', key, value);\n\n      if (key === 'radius') {\n        this.setRadius(value);\n      }\n\n      return this;\n    },\n\n    /**\n     * Returns object representation of an instance\n     * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n     * @return {Object} object representation of an instance\n     */\n    toObject: function(propertiesToInclude) {\n      return this.callSuper('toObject', ['radius', 'startAngle', 'endAngle'].concat(propertiesToInclude));\n    },\n\n    /* _TO_SVG_START_ */\n\n    /**\n     * Returns svg representation of an instance\n     * @return {Array} an array of strings with the specific svg representation\n     * of the instance\n     */\n    _toSVG: function() {\n      var svgString, x = 0, y = 0,\n          angle = (this.endAngle - this.startAngle) % ( 2 * pi);\n\n      if (angle === 0) {\n        svgString = [\n          '<circle ', 'COMMON_PARTS',\n          'cx=\"' + x + '\" cy=\"' + y + '\" ',\n          'r=\"', this.radius,\n          '\" />\\n'\n        ];\n      }\n      else {\n        var startX = fabric.util.cos(this.startAngle) * this.radius,\n            startY = fabric.util.sin(this.startAngle) * this.radius,\n            endX = fabric.util.cos(this.endAngle) * this.radius,\n            endY = fabric.util.sin(this.endAngle) * this.radius,\n            largeFlag = angle > pi ? '1' : '0';\n        svgString = [\n          '<path d=\"M ' + startX + ' ' + startY,\n          ' A ' + this.radius + ' ' + this.radius,\n          ' 0 ', +largeFlag + ' 1', ' ' + endX + ' ' + endY,\n          '\" ', 'COMMON_PARTS', ' />\\n'\n        ];\n      }\n      return svgString;\n    },\n    /* _TO_SVG_END_ */\n\n    /**\n     * @private\n     * @param {CanvasRenderingContext2D} ctx context to render on\n     */\n    _render: function(ctx) {\n      ctx.beginPath();\n      ctx.arc(\n        0,\n        0,\n        this.radius,\n        this.startAngle,\n        this.endAngle, false);\n      this._renderPaintInOrder(ctx);\n    },\n\n    /**\n     * Returns horizontal radius of an object (according to how an object is scaled)\n     * @return {Number}\n     */\n    getRadiusX: function() {\n      return this.get('radius') * this.get('scaleX');\n    },\n\n    /**\n     * Returns vertical radius of an object (according to how an object is scaled)\n     * @return {Number}\n     */\n    getRadiusY: function() {\n      return this.get('radius') * this.get('scaleY');\n    },\n\n    /**\n     * Sets radius of an object (and updates width accordingly)\n     * @return {fabric.Circle} thisArg\n     */\n    setRadius: function(value) {\n      this.radius = value;\n      return this.set('width', value * 2).set('height', value * 2);\n    },\n  });\n\n  /* _FROM_SVG_START_ */\n  /**\n   * List of attribute names to account for when parsing SVG element (used by {@link fabric.Circle.fromElement})\n   * @static\n   * @memberOf fabric.Circle\n   * @see: http://www.w3.org/TR/SVG/shapes.html#CircleElement\n   */\n  fabric.Circle.ATTRIBUTE_NAMES = fabric.SHARED_ATTRIBUTES.concat('cx cy r'.split(' '));\n\n  /**\n   * Returns {@link fabric.Circle} instance from an SVG element\n   * @static\n   * @memberOf fabric.Circle\n   * @param {SVGElement} element Element to parse\n   * @param {Function} [callback] Options callback invoked after parsing is finished\n   * @param {Object} [options] Options object\n   * @throws {Error} If value of `r` attribute is missing or invalid\n   */\n  fabric.Circle.fromElement = function(element, callback) {\n    var parsedAttributes = fabric.parseAttributes(element, fabric.Circle.ATTRIBUTE_NAMES);\n\n    if (!isValidRadius(parsedAttributes)) {\n      throw new Error('value of `r` attribute is required and can not be negative');\n    }\n\n    parsedAttributes.left = (parsedAttributes.left || 0) - parsedAttributes.radius;\n    parsedAttributes.top = (parsedAttributes.top || 0) - parsedAttributes.radius;\n    callback(new fabric.Circle(parsedAttributes));\n  };\n\n  /**\n   * @private\n   */\n  function isValidRadius(attributes) {\n    return (('radius' in attributes) && (attributes.radius >= 0));\n  }\n  /* _FROM_SVG_END_ */\n\n  /**\n   * Returns {@link fabric.Circle} instance from an object representation\n   * @static\n   * @memberOf fabric.Circle\n   * @param {Object} object Object to create an instance from\n   * @param {function} [callback] invoked with new instance as first argument\n   * @return {void}\n   */\n  fabric.Circle.fromObject = function(object, callback) {\n    fabric.Object._fromObject('Circle', object, callback);\n  };\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n  'use strict';\n\n  var fabric = global.fabric || (global.fabric = { });\n\n  if (fabric.Triangle) {\n    fabric.warn('fabric.Triangle is already defined');\n    return;\n  }\n\n  /**\n   * Triangle class\n   * @class fabric.Triangle\n   * @extends fabric.Object\n   * @return {fabric.Triangle} thisArg\n   * @see {@link fabric.Triangle#initialize} for constructor definition\n   */\n  fabric.Triangle = fabric.util.createClass(fabric.Object, /** @lends fabric.Triangle.prototype */ {\n\n    /**\n     * Type of an object\n     * @type String\n     * @default\n     */\n    type: 'triangle',\n\n    /**\n     * Width is set to 100 to compensate the old initialize code that was setting it to 100\n     * @type Number\n     * @default\n     */\n    width: 100,\n\n    /**\n     * Height is set to 100 to compensate the old initialize code that was setting it to 100\n     * @type Number\n     * @default\n     */\n    height: 100,\n\n    /**\n     * @private\n     * @param {CanvasRenderingContext2D} ctx Context to render on\n     */\n    _render: function(ctx) {\n      var widthBy2 = this.width / 2,\n          heightBy2 = this.height / 2;\n\n      ctx.beginPath();\n      ctx.moveTo(-widthBy2, heightBy2);\n      ctx.lineTo(0, -heightBy2);\n      ctx.lineTo(widthBy2, heightBy2);\n      ctx.closePath();\n\n      this._renderPaintInOrder(ctx);\n    },\n\n    /* _TO_SVG_START_ */\n    /**\n     * Returns svg representation of an instance\n     * @return {Array} an array of strings with the specific svg representation\n     * of the instance\n     */\n    _toSVG: function() {\n      var widthBy2 = this.width / 2,\n          heightBy2 = this.height / 2,\n          points = [\n            -widthBy2 + ' ' + heightBy2,\n            '0 ' + -heightBy2,\n            widthBy2 + ' ' + heightBy2\n          ].join(',');\n      return [\n        '<polygon ', 'COMMON_PARTS',\n        'points=\"', points,\n        '\" />'\n      ];\n    },\n    /* _TO_SVG_END_ */\n  });\n\n  /**\n   * Returns {@link fabric.Triangle} instance from an object representation\n   * @static\n   * @memberOf fabric.Triangle\n   * @param {Object} object Object to create an instance from\n   * @param {function} [callback] invoked with new instance as first argument\n   */\n  fabric.Triangle.fromObject = function(object, callback) {\n    return fabric.Object._fromObject('Triangle', object, callback);\n  };\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n  'use strict';\n\n  var fabric = global.fabric || (global.fabric = { }),\n      piBy2   = Math.PI * 2;\n\n  if (fabric.Ellipse) {\n    fabric.warn('fabric.Ellipse is already defined.');\n    return;\n  }\n\n  /**\n   * Ellipse class\n   * @class fabric.Ellipse\n   * @extends fabric.Object\n   * @return {fabric.Ellipse} thisArg\n   * @see {@link fabric.Ellipse#initialize} for constructor definition\n   */\n  fabric.Ellipse = fabric.util.createClass(fabric.Object, /** @lends fabric.Ellipse.prototype */ {\n\n    /**\n     * Type of an object\n     * @type String\n     * @default\n     */\n    type: 'ellipse',\n\n    /**\n     * Horizontal radius\n     * @type Number\n     * @default\n     */\n    rx:   0,\n\n    /**\n     * Vertical radius\n     * @type Number\n     * @default\n     */\n    ry:   0,\n\n    cacheProperties: fabric.Object.prototype.cacheProperties.concat('rx', 'ry'),\n\n    /**\n     * Constructor\n     * @param {Object} [options] Options object\n     * @return {fabric.Ellipse} thisArg\n     */\n    initialize: function(options) {\n      this.callSuper('initialize', options);\n      this.set('rx', options && options.rx || 0);\n      this.set('ry', options && options.ry || 0);\n    },\n\n    /**\n     * @private\n     * @param {String} key\n     * @param {*} value\n     * @return {fabric.Ellipse} thisArg\n     */\n    _set: function(key, value) {\n      this.callSuper('_set', key, value);\n      switch (key) {\n\n        case 'rx':\n          this.rx = value;\n          this.set('width', value * 2);\n          break;\n\n        case 'ry':\n          this.ry = value;\n          this.set('height', value * 2);\n          break;\n\n      }\n      return this;\n    },\n\n    /**\n     * Returns horizontal radius of an object (according to how an object is scaled)\n     * @return {Number}\n     */\n    getRx: function() {\n      return this.get('rx') * this.get('scaleX');\n    },\n\n    /**\n     * Returns Vertical radius of an object (according to how an object is scaled)\n     * @return {Number}\n     */\n    getRy: function() {\n      return this.get('ry') * this.get('scaleY');\n    },\n\n    /**\n     * Returns object representation of an instance\n     * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n     * @return {Object} object representation of an instance\n     */\n    toObject: function(propertiesToInclude) {\n      return this.callSuper('toObject', ['rx', 'ry'].concat(propertiesToInclude));\n    },\n\n    /* _TO_SVG_START_ */\n    /**\n     * Returns svg representation of an instance\n     * @return {Array} an array of strings with the specific svg representation\n     * of the instance\n     */\n    _toSVG: function() {\n      return [\n        '<ellipse ', 'COMMON_PARTS',\n        'cx=\"0\" cy=\"0\" ',\n        'rx=\"', this.rx,\n        '\" ry=\"', this.ry,\n        '\" />\\n'\n      ];\n    },\n    /* _TO_SVG_END_ */\n\n    /**\n     * @private\n     * @param {CanvasRenderingContext2D} ctx context to render on\n     */\n    _render: function(ctx) {\n      ctx.beginPath();\n      ctx.save();\n      ctx.transform(1, 0, 0, this.ry / this.rx, 0, 0);\n      ctx.arc(\n        0,\n        0,\n        this.rx,\n        0,\n        piBy2,\n        false);\n      ctx.restore();\n      this._renderPaintInOrder(ctx);\n    },\n  });\n\n  /* _FROM_SVG_START_ */\n  /**\n   * List of attribute names to account for when parsing SVG element (used by {@link fabric.Ellipse.fromElement})\n   * @static\n   * @memberOf fabric.Ellipse\n   * @see http://www.w3.org/TR/SVG/shapes.html#EllipseElement\n   */\n  fabric.Ellipse.ATTRIBUTE_NAMES = fabric.SHARED_ATTRIBUTES.concat('cx cy rx ry'.split(' '));\n\n  /**\n   * Returns {@link fabric.Ellipse} instance from an SVG element\n   * @static\n   * @memberOf fabric.Ellipse\n   * @param {SVGElement} element Element to parse\n   * @param {Function} [callback] Options callback invoked after parsing is finished\n   * @return {fabric.Ellipse}\n   */\n  fabric.Ellipse.fromElement = function(element, callback) {\n\n    var parsedAttributes = fabric.parseAttributes(element, fabric.Ellipse.ATTRIBUTE_NAMES);\n\n    parsedAttributes.left = (parsedAttributes.left || 0) - parsedAttributes.rx;\n    parsedAttributes.top = (parsedAttributes.top || 0) - parsedAttributes.ry;\n    callback(new fabric.Ellipse(parsedAttributes));\n  };\n  /* _FROM_SVG_END_ */\n\n  /**\n   * Returns {@link fabric.Ellipse} instance from an object representation\n   * @static\n   * @memberOf fabric.Ellipse\n   * @param {Object} object Object to create an instance from\n   * @param {function} [callback] invoked with new instance as first argument\n   * @return {void}\n   */\n  fabric.Ellipse.fromObject = function(object, callback) {\n    fabric.Object._fromObject('Ellipse', object, callback);\n  };\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n  'use strict';\n\n  var fabric = global.fabric || (global.fabric = { }),\n      extend = fabric.util.object.extend;\n\n  if (fabric.Rect) {\n    fabric.warn('fabric.Rect is already defined');\n    return;\n  }\n\n  /**\n   * Rectangle class\n   * @class fabric.Rect\n   * @extends fabric.Object\n   * @return {fabric.Rect} thisArg\n   * @see {@link fabric.Rect#initialize} for constructor definition\n   */\n  fabric.Rect = fabric.util.createClass(fabric.Object, /** @lends fabric.Rect.prototype */ {\n\n    /**\n     * List of properties to consider when checking if state of an object is changed ({@link fabric.Object#hasStateChanged})\n     * as well as for history (undo/redo) purposes\n     * @type Array\n     */\n    stateProperties: fabric.Object.prototype.stateProperties.concat('rx', 'ry'),\n\n    /**\n     * Type of an object\n     * @type String\n     * @default\n     */\n    type: 'rect',\n\n    /**\n     * Horizontal border radius\n     * @type Number\n     * @default\n     */\n    rx:   0,\n\n    /**\n     * Vertical border radius\n     * @type Number\n     * @default\n     */\n    ry:   0,\n\n    cacheProperties: fabric.Object.prototype.cacheProperties.concat('rx', 'ry'),\n\n    /**\n     * Constructor\n     * @param {Object} [options] Options object\n     * @return {Object} thisArg\n     */\n    initialize: function(options) {\n      this.callSuper('initialize', options);\n      this._initRxRy();\n    },\n\n    /**\n     * Initializes rx/ry attributes\n     * @private\n     */\n    _initRxRy: function() {\n      if (this.rx && !this.ry) {\n        this.ry = this.rx;\n      }\n      else if (this.ry && !this.rx) {\n        this.rx = this.ry;\n      }\n    },\n\n    /**\n     * @private\n     * @param {CanvasRenderingContext2D} ctx Context to render on\n     */\n    _render: function(ctx) {\n\n      // 1x1 case (used in spray brush) optimization was removed because\n      // with caching and higher zoom level this makes more damage than help\n\n      var rx = this.rx ? Math.min(this.rx, this.width / 2) : 0,\n          ry = this.ry ? Math.min(this.ry, this.height / 2) : 0,\n          w = this.width,\n          h = this.height,\n          x = -this.width / 2,\n          y = -this.height / 2,\n          isRounded = rx !== 0 || ry !== 0,\n          /* \"magic number\" for bezier approximations of arcs (http://itc.ktu.lt/itc354/Riskus354.pdf) */\n          k = 1 - 0.5522847498;\n      ctx.beginPath();\n\n      ctx.moveTo(x + rx, y);\n\n      ctx.lineTo(x + w - rx, y);\n      isRounded && ctx.bezierCurveTo(x + w - k * rx, y, x + w, y + k * ry, x + w, y + ry);\n\n      ctx.lineTo(x + w, y + h - ry);\n      isRounded && ctx.bezierCurveTo(x + w, y + h - k * ry, x + w - k * rx, y + h, x + w - rx, y + h);\n\n      ctx.lineTo(x + rx, y + h);\n      isRounded && ctx.bezierCurveTo(x + k * rx, y + h, x, y + h - k * ry, x, y + h - ry);\n\n      ctx.lineTo(x, y + ry);\n      isRounded && ctx.bezierCurveTo(x, y + k * ry, x + k * rx, y, x + rx, y);\n\n      ctx.closePath();\n\n      this._renderPaintInOrder(ctx);\n    },\n\n    /**\n     * Returns object representation of an instance\n     * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n     * @return {Object} object representation of an instance\n     */\n    toObject: function(propertiesToInclude) {\n      return this.callSuper('toObject', ['rx', 'ry'].concat(propertiesToInclude));\n    },\n\n    /* _TO_SVG_START_ */\n    /**\n     * Returns svg representation of an instance\n     * @return {Array} an array of strings with the specific svg representation\n     * of the instance\n     */\n    _toSVG: function() {\n      var x = -this.width / 2, y = -this.height / 2;\n      return [\n        '<rect ', 'COMMON_PARTS',\n        'x=\"', x, '\" y=\"', y,\n        '\" rx=\"', this.rx, '\" ry=\"', this.ry,\n        '\" width=\"', this.width, '\" height=\"', this.height,\n        '\" />\\n'\n      ];\n    },\n    /* _TO_SVG_END_ */\n  });\n\n  /* _FROM_SVG_START_ */\n  /**\n   * List of attribute names to account for when parsing SVG element (used by `fabric.Rect.fromElement`)\n   * @static\n   * @memberOf fabric.Rect\n   * @see: http://www.w3.org/TR/SVG/shapes.html#RectElement\n   */\n  fabric.Rect.ATTRIBUTE_NAMES = fabric.SHARED_ATTRIBUTES.concat('x y rx ry width height'.split(' '));\n\n  /**\n   * Returns {@link fabric.Rect} instance from an SVG element\n   * @static\n   * @memberOf fabric.Rect\n   * @param {SVGElement} element Element to parse\n   * @param {Function} callback callback function invoked after parsing\n   * @param {Object} [options] Options object\n   */\n  fabric.Rect.fromElement = function(element, callback, options) {\n    if (!element) {\n      return callback(null);\n    }\n    options = options || { };\n\n    var parsedAttributes = fabric.parseAttributes(element, fabric.Rect.ATTRIBUTE_NAMES);\n    parsedAttributes.left = parsedAttributes.left || 0;\n    parsedAttributes.top  = parsedAttributes.top  || 0;\n    parsedAttributes.height  = parsedAttributes.height || 0;\n    parsedAttributes.width  = parsedAttributes.width || 0;\n    var rect = new fabric.Rect(extend((options ? fabric.util.object.clone(options) : { }), parsedAttributes));\n    rect.visible = rect.visible && rect.width > 0 && rect.height > 0;\n    callback(rect);\n  };\n  /* _FROM_SVG_END_ */\n\n  /**\n   * Returns {@link fabric.Rect} instance from an object representation\n   * @static\n   * @memberOf fabric.Rect\n   * @param {Object} object Object to create an instance from\n   * @param {Function} [callback] Callback to invoke when an fabric.Rect instance is created\n   */\n  fabric.Rect.fromObject = function(object, callback) {\n    return fabric.Object._fromObject('Rect', object, callback);\n  };\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n  'use strict';\n\n  var fabric = global.fabric || (global.fabric = { }),\n      extend = fabric.util.object.extend,\n      min = fabric.util.array.min,\n      max = fabric.util.array.max,\n      toFixed = fabric.util.toFixed;\n\n  if (fabric.Polyline) {\n    fabric.warn('fabric.Polyline is already defined');\n    return;\n  }\n\n  /**\n   * Polyline class\n   * @class fabric.Polyline\n   * @extends fabric.Object\n   * @see {@link fabric.Polyline#initialize} for constructor definition\n   */\n  fabric.Polyline = fabric.util.createClass(fabric.Object, /** @lends fabric.Polyline.prototype */ {\n\n    /**\n     * Type of an object\n     * @type String\n     * @default\n     */\n    type: 'polyline',\n\n    /**\n     * Points array\n     * @type Array\n     * @default\n     */\n    points: null,\n\n    cacheProperties: fabric.Object.prototype.cacheProperties.concat('points'),\n\n    /**\n     * Constructor\n     * @param {Array} points Array of points (where each point is an object with x and y)\n     * @param {Object} [options] Options object\n     * @return {fabric.Polyline} thisArg\n     * @example\n     * var poly = new fabric.Polyline([\n     *     { x: 10, y: 10 },\n     *     { x: 50, y: 30 },\n     *     { x: 40, y: 70 },\n     *     { x: 60, y: 50 },\n     *     { x: 100, y: 150 },\n     *     { x: 40, y: 100 }\n     *   ], {\n     *   stroke: 'red',\n     *   left: 100,\n     *   top: 100\n     * });\n     */\n    initialize: function(points, options) {\n      options = options || {};\n      this.points = points || [];\n      this.callSuper('initialize', options);\n      this._setPositionDimensions(options);\n    },\n\n    _setPositionDimensions: function(options) {\n      var calcDim = this._calcDimensions(options), correctLeftTop;\n      this.width = calcDim.width;\n      this.height = calcDim.height;\n      if (!options.fromSVG) {\n        correctLeftTop = this.translateToGivenOrigin(\n          { x: calcDim.left - this.strokeWidth / 2, y: calcDim.top - this.strokeWidth / 2 },\n          'left',\n          'top',\n          this.originX,\n          this.originY\n        );\n      }\n      if (typeof options.left === 'undefined') {\n        this.left = options.fromSVG ? calcDim.left : correctLeftTop.x;\n      }\n      if (typeof options.top === 'undefined') {\n        this.top = options.fromSVG ? calcDim.top : correctLeftTop.y;\n      }\n      this.pathOffset = {\n        x: calcDim.left + this.width / 2,\n        y: calcDim.top + this.height / 2\n      };\n    },\n\n    /**\n     * Calculate the polygon min and max point from points array,\n     * returning an object with left, top, width, height to measure the\n     * polygon size\n     * @return {Object} object.left X coordinate of the polygon leftmost point\n     * @return {Object} object.top Y coordinate of the polygon topmost point\n     * @return {Object} object.width distance between X coordinates of the polygon leftmost and rightmost point\n     * @return {Object} object.height distance between Y coordinates of the polygon topmost and bottommost point\n     * @private\n     */\n    _calcDimensions: function() {\n\n      var points = this.points,\n          minX = min(points, 'x') || 0,\n          minY = min(points, 'y') || 0,\n          maxX = max(points, 'x') || 0,\n          maxY = max(points, 'y') || 0,\n          width = (maxX - minX),\n          height = (maxY - minY);\n\n      return {\n        left: minX,\n        top: minY,\n        width: width,\n        height: height\n      };\n    },\n\n    /**\n     * Returns object representation of an instance\n     * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n     * @return {Object} Object representation of an instance\n     */\n    toObject: function(propertiesToInclude) {\n      return extend(this.callSuper('toObject', propertiesToInclude), {\n        points: this.points.concat()\n      });\n    },\n\n    /* _TO_SVG_START_ */\n    /**\n     * Returns svg representation of an instance\n     * @return {Array} an array of strings with the specific svg representation\n     * of the instance\n     */\n    _toSVG: function() {\n      var points = [], diffX = this.pathOffset.x, diffY = this.pathOffset.y,\n          NUM_FRACTION_DIGITS = fabric.Object.NUM_FRACTION_DIGITS;\n\n      for (var i = 0, len = this.points.length; i < len; i++) {\n        points.push(\n          toFixed(this.points[i].x - diffX, NUM_FRACTION_DIGITS), ',',\n          toFixed(this.points[i].y - diffY, NUM_FRACTION_DIGITS), ' '\n        );\n      }\n      return [\n        '<' + this.type + ' ', 'COMMON_PARTS',\n        'points=\"', points.join(''),\n        '\" />\\n'\n      ];\n    },\n    /* _TO_SVG_END_ */\n\n\n    /**\n     * @private\n     * @param {CanvasRenderingContext2D} ctx Context to render on\n     */\n    commonRender: function(ctx) {\n      var point, len = this.points.length,\n          x = this.pathOffset.x,\n          y = this.pathOffset.y;\n\n      if (!len || isNaN(this.points[len - 1].y)) {\n        // do not draw if no points or odd points\n        // NaN comes from parseFloat of a empty string in parser\n        return false;\n      }\n      ctx.beginPath();\n      ctx.moveTo(this.points[0].x - x, this.points[0].y - y);\n      for (var i = 0; i < len; i++) {\n        point = this.points[i];\n        ctx.lineTo(point.x - x, point.y - y);\n      }\n      return true;\n    },\n\n    /**\n     * @private\n     * @param {CanvasRenderingContext2D} ctx Context to render on\n     */\n    _render: function(ctx) {\n      if (!this.commonRender(ctx)) {\n        return;\n      }\n      this._renderPaintInOrder(ctx);\n    },\n\n    /**\n     * Returns complexity of an instance\n     * @return {Number} complexity of this instance\n     */\n    complexity: function() {\n      return this.get('points').length;\n    }\n  });\n\n  /* _FROM_SVG_START_ */\n  /**\n   * List of attribute names to account for when parsing SVG element (used by {@link fabric.Polyline.fromElement})\n   * @static\n   * @memberOf fabric.Polyline\n   * @see: http://www.w3.org/TR/SVG/shapes.html#PolylineElement\n   */\n  fabric.Polyline.ATTRIBUTE_NAMES = fabric.SHARED_ATTRIBUTES.concat();\n\n  /**\n   * Returns fabric.Polyline instance from an SVG element\n   * @static\n   * @memberOf fabric.Polyline\n   * @param {SVGElement} element Element to parser\n   * @param {Function} callback callback function invoked after parsing\n   * @param {Object} [options] Options object\n   */\n  fabric.Polyline.fromElementGenerator = function(_class) {\n    return function(element, callback, options) {\n      if (!element) {\n        return callback(null);\n      }\n      options || (options = { });\n\n      var points = fabric.parsePointsAttribute(element.getAttribute('points')),\n          parsedAttributes = fabric.parseAttributes(element, fabric[_class].ATTRIBUTE_NAMES);\n      parsedAttributes.fromSVG = true;\n      callback(new fabric[_class](points, extend(parsedAttributes, options)));\n    };\n  };\n\n  fabric.Polyline.fromElement = fabric.Polyline.fromElementGenerator('Polyline');\n\n  /* _FROM_SVG_END_ */\n\n  /**\n   * Returns fabric.Polyline instance from an object representation\n   * @static\n   * @memberOf fabric.Polyline\n   * @param {Object} object Object to create an instance from\n   * @param {Function} [callback] Callback to invoke when an fabric.Path instance is created\n   */\n  fabric.Polyline.fromObject = function(object, callback) {\n    return fabric.Object._fromObject('Polyline', object, callback, 'points');\n  };\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n  'use strict';\n\n  var fabric = global.fabric || (global.fabric = { });\n\n  if (fabric.Polygon) {\n    fabric.warn('fabric.Polygon is already defined');\n    return;\n  }\n\n  /**\n   * Polygon class\n   * @class fabric.Polygon\n   * @extends fabric.Polyline\n   * @see {@link fabric.Polygon#initialize} for constructor definition\n   */\n  fabric.Polygon = fabric.util.createClass(fabric.Polyline, /** @lends fabric.Polygon.prototype */ {\n\n    /**\n     * Type of an object\n     * @type String\n     * @default\n     */\n    type: 'polygon',\n\n    /**\n     * @private\n     * @param {CanvasRenderingContext2D} ctx Context to render on\n     */\n    _render: function(ctx) {\n      if (!this.commonRender(ctx)) {\n        return;\n      }\n      ctx.closePath();\n      this._renderPaintInOrder(ctx);\n    },\n\n  });\n\n  /* _FROM_SVG_START_ */\n  /**\n   * List of attribute names to account for when parsing SVG element (used by `fabric.Polygon.fromElement`)\n   * @static\n   * @memberOf fabric.Polygon\n   * @see: http://www.w3.org/TR/SVG/shapes.html#PolygonElement\n   */\n  fabric.Polygon.ATTRIBUTE_NAMES = fabric.SHARED_ATTRIBUTES.concat();\n\n  /**\n   * Returns {@link fabric.Polygon} instance from an SVG element\n   * @static\n   * @memberOf fabric.Polygon\n   * @param {SVGElement} element Element to parse\n   * @param {Function} callback callback function invoked after parsing\n   * @param {Object} [options] Options object\n   */\n  fabric.Polygon.fromElement = fabric.Polyline.fromElementGenerator('Polygon');\n  /* _FROM_SVG_END_ */\n\n  /**\n   * Returns fabric.Polygon instance from an object representation\n   * @static\n   * @memberOf fabric.Polygon\n   * @param {Object} object Object to create an instance from\n   * @param {Function} [callback] Callback to invoke when an fabric.Path instance is created\n   * @return {void}\n   */\n  fabric.Polygon.fromObject = function(object, callback) {\n    fabric.Object._fromObject('Polygon', object, callback, 'points');\n  };\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n  'use strict';\n\n  var fabric = global.fabric || (global.fabric = { }),\n      min = fabric.util.array.min,\n      max = fabric.util.array.max,\n      extend = fabric.util.object.extend,\n      _toString = Object.prototype.toString,\n      toFixed = fabric.util.toFixed;\n\n  if (fabric.Path) {\n    fabric.warn('fabric.Path is already defined');\n    return;\n  }\n\n  /**\n   * Path class\n   * @class fabric.Path\n   * @extends fabric.Object\n   * @tutorial {@link http://fabricjs.com/fabric-intro-part-1#path_and_pathgroup}\n   * @see {@link fabric.Path#initialize} for constructor definition\n   */\n  fabric.Path = fabric.util.createClass(fabric.Object, /** @lends fabric.Path.prototype */ {\n\n    /**\n     * Type of an object\n     * @type String\n     * @default\n     */\n    type: 'path',\n\n    /**\n     * Array of path points\n     * @type Array\n     * @default\n     */\n    path: null,\n\n    cacheProperties: fabric.Object.prototype.cacheProperties.concat('path', 'fillRule'),\n\n    stateProperties: fabric.Object.prototype.stateProperties.concat('path'),\n\n    /**\n     * Constructor\n     * @param {Array|String} path Path data (sequence of coordinates and corresponding \"command\" tokens)\n     * @param {Object} [options] Options object\n     * @return {fabric.Path} thisArg\n     */\n    initialize: function(path, options) {\n      options = options || { };\n      this.callSuper('initialize', options);\n      if (!path) {\n        path = [];\n      }\n\n      var fromArray = _toString.call(path) === '[object Array]';\n\n      this.path = fabric.util.makePathSimpler(\n        fromArray ? path : fabric.util.parsePath(path)\n      );\n\n      if (!this.path) {\n        return;\n      }\n      fabric.Polyline.prototype._setPositionDimensions.call(this, options);\n    },\n\n    /**\n     * @private\n     * @param {CanvasRenderingContext2D} ctx context to render path on\n     */\n    _renderPathCommands: function(ctx) {\n      var current, // current instruction\n          subpathStartX = 0,\n          subpathStartY = 0,\n          x = 0, // current x\n          y = 0, // current y\n          controlX = 0, // current control point x\n          controlY = 0, // current control point y\n          l = -this.pathOffset.x,\n          t = -this.pathOffset.y;\n\n      ctx.beginPath();\n\n      for (var i = 0, len = this.path.length; i < len; ++i) {\n\n        current = this.path[i];\n\n        switch (current[0]) { // first letter\n\n          case 'L': // lineto, absolute\n            x = current[1];\n            y = current[2];\n            ctx.lineTo(x + l, y + t);\n            break;\n\n          case 'M': // moveTo, absolute\n            x = current[1];\n            y = current[2];\n            subpathStartX = x;\n            subpathStartY = y;\n            ctx.moveTo(x + l, y + t);\n            break;\n\n          case 'C': // bezierCurveTo, absolute\n            x = current[5];\n            y = current[6];\n            controlX = current[3];\n            controlY = current[4];\n            ctx.bezierCurveTo(\n              current[1] + l,\n              current[2] + t,\n              controlX + l,\n              controlY + t,\n              x + l,\n              y + t\n            );\n            break;\n\n          case 'Q': // quadraticCurveTo, absolute\n            ctx.quadraticCurveTo(\n              current[1] + l,\n              current[2] + t,\n              current[3] + l,\n              current[4] + t\n            );\n            x = current[3];\n            y = current[4];\n            controlX = current[1];\n            controlY = current[2];\n            break;\n\n          case 'z':\n          case 'Z':\n            x = subpathStartX;\n            y = subpathStartY;\n            ctx.closePath();\n            break;\n        }\n      }\n    },\n\n    /**\n     * @private\n     * @param {CanvasRenderingContext2D} ctx context to render path on\n     */\n    _render: function(ctx) {\n      this._renderPathCommands(ctx);\n      this._renderPaintInOrder(ctx);\n    },\n\n    /**\n     * Returns string representation of an instance\n     * @return {String} string representation of an instance\n     */\n    toString: function() {\n      return '#<fabric.Path (' + this.complexity() +\n        '): { \"top\": ' + this.top + ', \"left\": ' + this.left + ' }>';\n    },\n\n    /**\n     * Returns object representation of an instance\n     * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n     * @return {Object} object representation of an instance\n     */\n    toObject: function(propertiesToInclude) {\n      return extend(this.callSuper('toObject', propertiesToInclude), {\n        path: this.path.map(function(item) { return item.slice(); }),\n      });\n    },\n\n    /**\n     * Returns dataless object representation of an instance\n     * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n     * @return {Object} object representation of an instance\n     */\n    toDatalessObject: function(propertiesToInclude) {\n      var o = this.toObject(['sourcePath'].concat(propertiesToInclude));\n      if (o.sourcePath) {\n        delete o.path;\n      }\n      return o;\n    },\n\n    /* _TO_SVG_START_ */\n    /**\n     * Returns svg representation of an instance\n     * @return {Array} an array of strings with the specific svg representation\n     * of the instance\n     */\n    _toSVG: function() {\n      var path = fabric.util.joinPath(this.path);\n      return [\n        '<path ', 'COMMON_PARTS',\n        'd=\"', path,\n        '\" stroke-linecap=\"round\" ',\n        '/>\\n'\n      ];\n    },\n\n    _getOffsetTransform: function() {\n      var digits = fabric.Object.NUM_FRACTION_DIGITS;\n      return ' translate(' + toFixed(-this.pathOffset.x, digits) + ', ' +\n          toFixed(-this.pathOffset.y, digits) + ')';\n    },\n\n    /**\n     * Returns svg clipPath representation of an instance\n     * @param {Function} [reviver] Method for further parsing of svg representation.\n     * @return {String} svg representation of an instance\n     */\n    toClipPathSVG: function(reviver) {\n      var additionalTransform = this._getOffsetTransform();\n      return '\\t' + this._createBaseClipPathSVGMarkup(\n        this._toSVG(), { reviver: reviver, additionalTransform: additionalTransform }\n      );\n    },\n\n    /**\n     * Returns svg representation of an instance\n     * @param {Function} [reviver] Method for further parsing of svg representation.\n     * @return {String} svg representation of an instance\n     */\n    toSVG: function(reviver) {\n      var additionalTransform = this._getOffsetTransform();\n      return this._createBaseSVGMarkup(this._toSVG(), { reviver: reviver, additionalTransform: additionalTransform  });\n    },\n    /* _TO_SVG_END_ */\n\n    /**\n     * Returns number representation of an instance complexity\n     * @return {Number} complexity of this instance\n     */\n    complexity: function() {\n      return this.path.length;\n    },\n\n    /**\n     * @private\n     */\n    _calcDimensions: function() {\n\n      var aX = [],\n          aY = [],\n          current, // current instruction\n          subpathStartX = 0,\n          subpathStartY = 0,\n          x = 0, // current x\n          y = 0, // current y\n          bounds;\n\n      for (var i = 0, len = this.path.length; i < len; ++i) {\n\n        current = this.path[i];\n\n        switch (current[0]) { // first letter\n\n          case 'L': // lineto, absolute\n            x = current[1];\n            y = current[2];\n            bounds = [];\n            break;\n\n          case 'M': // moveTo, absolute\n            x = current[1];\n            y = current[2];\n            subpathStartX = x;\n            subpathStartY = y;\n            bounds = [];\n            break;\n\n          case 'C': // bezierCurveTo, absolute\n            bounds = fabric.util.getBoundsOfCurve(x, y,\n              current[1],\n              current[2],\n              current[3],\n              current[4],\n              current[5],\n              current[6]\n            );\n            x = current[5];\n            y = current[6];\n            break;\n\n          case 'Q': // quadraticCurveTo, absolute\n            bounds = fabric.util.getBoundsOfCurve(x, y,\n              current[1],\n              current[2],\n              current[1],\n              current[2],\n              current[3],\n              current[4]\n            );\n            x = current[3];\n            y = current[4];\n            break;\n\n          case 'z':\n          case 'Z':\n            x = subpathStartX;\n            y = subpathStartY;\n            break;\n        }\n        bounds.forEach(function (point) {\n          aX.push(point.x);\n          aY.push(point.y);\n        });\n        aX.push(x);\n        aY.push(y);\n      }\n\n      var minX = min(aX) || 0,\n          minY = min(aY) || 0,\n          maxX = max(aX) || 0,\n          maxY = max(aY) || 0,\n          deltaX = maxX - minX,\n          deltaY = maxY - minY;\n\n      return {\n        left: minX,\n        top: minY,\n        width: deltaX,\n        height: deltaY\n      };\n    }\n  });\n\n  /**\n   * Creates an instance of fabric.Path from an object\n   * @static\n   * @memberOf fabric.Path\n   * @param {Object} object\n   * @param {Function} [callback] Callback to invoke when an fabric.Path instance is created\n   */\n  fabric.Path.fromObject = function(object, callback) {\n    if (typeof object.sourcePath === 'string') {\n      var pathUrl = object.sourcePath;\n      fabric.loadSVGFromURL(pathUrl, function (elements) {\n        var path = elements[0];\n        path.setOptions(object);\n        callback && callback(path);\n      });\n    }\n    else {\n      fabric.Object._fromObject('Path', object, callback, 'path');\n    }\n  };\n\n  /* _FROM_SVG_START_ */\n  /**\n   * List of attribute names to account for when parsing SVG element (used by `fabric.Path.fromElement`)\n   * @static\n   * @memberOf fabric.Path\n   * @see http://www.w3.org/TR/SVG/paths.html#PathElement\n   */\n  fabric.Path.ATTRIBUTE_NAMES = fabric.SHARED_ATTRIBUTES.concat(['d']);\n\n  /**\n   * Creates an instance of fabric.Path from an SVG <path> element\n   * @static\n   * @memberOf fabric.Path\n   * @param {SVGElement} element to parse\n   * @param {Function} callback Callback to invoke when an fabric.Path instance is created\n   * @param {Object} [options] Options object\n   * @param {Function} [callback] Options callback invoked after parsing is finished\n   */\n  fabric.Path.fromElement = function(element, callback, options) {\n    var parsedAttributes = fabric.parseAttributes(element, fabric.Path.ATTRIBUTE_NAMES);\n    parsedAttributes.fromSVG = true;\n    callback(new fabric.Path(parsedAttributes.d, extend(parsedAttributes, options)));\n  };\n  /* _FROM_SVG_END_ */\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n  'use strict';\n\n  var fabric = global.fabric || (global.fabric = { }),\n      min = fabric.util.array.min,\n      max = fabric.util.array.max;\n\n  if (fabric.Group) {\n    return;\n  }\n\n  /**\n   * Group class\n   * @class fabric.Group\n   * @extends fabric.Object\n   * @mixes fabric.Collection\n   * @tutorial {@link http://fabricjs.com/fabric-intro-part-3#groups}\n   * @see {@link fabric.Group#initialize} for constructor definition\n   */\n  fabric.Group = fabric.util.createClass(fabric.Object, fabric.Collection, /** @lends fabric.Group.prototype */ {\n\n    /**\n     * Type of an object\n     * @type String\n     * @default\n     */\n    type: 'group',\n\n    /**\n     * Width of stroke\n     * @type Number\n     * @default\n     */\n    strokeWidth: 0,\n\n    /**\n     * Indicates if click, mouseover, mouseout events & hoverCursor should also check for subtargets\n     * @type Boolean\n     * @default\n     */\n    subTargetCheck: false,\n\n    /**\n     * Groups are container, do not render anything on theyr own, ence no cache properties\n     * @type Array\n     * @default\n     */\n    cacheProperties: [],\n\n    /**\n     * setOnGroup is a method used for TextBox that is no more used since 2.0.0 The behavior is still\n     * available setting this boolean to true.\n     * @type Boolean\n     * @since 2.0.0\n     * @default\n     */\n    useSetOnGroup: false,\n\n    /**\n     * Constructor\n     * @param {Object} objects Group objects\n     * @param {Object} [options] Options object\n     * @param {Boolean} [isAlreadyGrouped] if true, objects have been grouped already.\n     * @return {Object} thisArg\n     */\n    initialize: function(objects, options, isAlreadyGrouped) {\n      options = options || {};\n      this._objects = [];\n      // if objects enclosed in a group have been grouped already,\n      // we cannot change properties of objects.\n      // Thus we need to set options to group without objects,\n      isAlreadyGrouped && this.callSuper('initialize', options);\n      this._objects = objects || [];\n      for (var i = this._objects.length; i--; ) {\n        this._objects[i].group = this;\n      }\n\n      if (!isAlreadyGrouped) {\n        var center = options && options.centerPoint;\n        // we want to set origins before calculating the bounding box.\n        // so that the topleft can be set with that in mind.\n        // if specific top and left are passed, are overwritten later\n        // with the callSuper('initialize', options)\n        if (options.originX !== undefined) {\n          this.originX = options.originX;\n        }\n        if (options.originY !== undefined) {\n          this.originY = options.originY;\n        }\n        // if coming from svg i do not want to calc bounds.\n        // i assume width and height are passed along options\n        center || this._calcBounds();\n        this._updateObjectsCoords(center);\n        delete options.centerPoint;\n        this.callSuper('initialize', options);\n      }\n      else {\n        this._updateObjectsACoords();\n      }\n\n      this.setCoords();\n    },\n\n    /**\n     * @private\n     */\n    _updateObjectsACoords: function() {\n      var skipControls = true;\n      for (var i = this._objects.length; i--; ){\n        this._objects[i].setCoords(skipControls);\n      }\n    },\n\n    /**\n     * @private\n     * @param {Boolean} [skipCoordsChange] if true, coordinates of objects enclosed in a group do not change\n     */\n    _updateObjectsCoords: function(center) {\n      var center = center || this.getCenterPoint();\n      for (var i = this._objects.length; i--; ){\n        this._updateObjectCoords(this._objects[i], center);\n      }\n    },\n\n    /**\n     * @private\n     * @param {Object} object\n     * @param {fabric.Point} center, current center of group.\n     */\n    _updateObjectCoords: function(object, center) {\n      var objectLeft = object.left,\n          objectTop = object.top,\n          skipControls = true;\n\n      object.set({\n        left: objectLeft - center.x,\n        top: objectTop - center.y\n      });\n      object.group = this;\n      object.setCoords(skipControls);\n    },\n\n    /**\n     * Returns string represenation of a group\n     * @return {String}\n     */\n    toString: function() {\n      return '#<fabric.Group: (' + this.complexity() + ')>';\n    },\n\n    /**\n     * Adds an object to a group; Then recalculates group's dimension, position.\n     * @param {Object} object\n     * @return {fabric.Group} thisArg\n     * @chainable\n     */\n    addWithUpdate: function(object) {\n      var nested = !!this.group;\n      this._restoreObjectsState();\n      fabric.util.resetObjectTransform(this);\n      if (object) {\n        if (nested) {\n          // if this group is inside another group, we need to pre transform the object\n          fabric.util.removeTransformFromObject(object, this.group.calcTransformMatrix());\n        }\n        this._objects.push(object);\n        object.group = this;\n        object._set('canvas', this.canvas);\n      }\n      this._calcBounds();\n      this._updateObjectsCoords();\n      this.dirty = true;\n      if (nested) {\n        this.group.addWithUpdate();\n      }\n      else {\n        this.setCoords();\n      }\n      return this;\n    },\n\n    /**\n     * Removes an object from a group; Then recalculates group's dimension, position.\n     * @param {Object} object\n     * @return {fabric.Group} thisArg\n     * @chainable\n     */\n    removeWithUpdate: function(object) {\n      this._restoreObjectsState();\n      fabric.util.resetObjectTransform(this);\n\n      this.remove(object);\n      this._calcBounds();\n      this._updateObjectsCoords();\n      this.setCoords();\n      this.dirty = true;\n      return this;\n    },\n\n    /**\n     * @private\n     */\n    _onObjectAdded: function(object) {\n      this.dirty = true;\n      object.group = this;\n      object._set('canvas', this.canvas);\n    },\n\n    /**\n     * @private\n     */\n    _onObjectRemoved: function(object) {\n      this.dirty = true;\n      delete object.group;\n    },\n\n    /**\n     * @private\n     */\n    _set: function(key, value) {\n      var i = this._objects.length;\n      if (this.useSetOnGroup) {\n        while (i--) {\n          this._objects[i].setOnGroup(key, value);\n        }\n      }\n      if (key === 'canvas') {\n        while (i--) {\n          this._objects[i]._set(key, value);\n        }\n      }\n      fabric.Object.prototype._set.call(this, key, value);\n    },\n\n    /**\n     * Returns object representation of an instance\n     * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n     * @return {Object} object representation of an instance\n     */\n    toObject: function(propertiesToInclude) {\n      var _includeDefaultValues = this.includeDefaultValues;\n      var objsToObject = this._objects\n        .filter(function (obj) {\n          return !obj.excludeFromExport;\n        })\n        .map(function (obj) {\n          var originalDefaults = obj.includeDefaultValues;\n          obj.includeDefaultValues = _includeDefaultValues;\n          var _obj = obj.toObject(propertiesToInclude);\n          obj.includeDefaultValues = originalDefaults;\n          return _obj;\n        });\n      var obj = fabric.Object.prototype.toObject.call(this, propertiesToInclude);\n      obj.objects = objsToObject;\n      return obj;\n    },\n\n    /**\n     * Returns object representation of an instance, in dataless mode.\n     * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n     * @return {Object} object representation of an instance\n     */\n    toDatalessObject: function(propertiesToInclude) {\n      var objsToObject, sourcePath = this.sourcePath;\n      if (sourcePath) {\n        objsToObject = sourcePath;\n      }\n      else {\n        var _includeDefaultValues = this.includeDefaultValues;\n        objsToObject = this._objects.map(function(obj) {\n          var originalDefaults = obj.includeDefaultValues;\n          obj.includeDefaultValues = _includeDefaultValues;\n          var _obj = obj.toDatalessObject(propertiesToInclude);\n          obj.includeDefaultValues = originalDefaults;\n          return _obj;\n        });\n      }\n      var obj = fabric.Object.prototype.toDatalessObject.call(this, propertiesToInclude);\n      obj.objects = objsToObject;\n      return obj;\n    },\n\n    /**\n     * Renders instance on a given context\n     * @param {CanvasRenderingContext2D} ctx context to render instance on\n     */\n    render: function(ctx) {\n      this._transformDone = true;\n      this.callSuper('render', ctx);\n      this._transformDone = false;\n    },\n\n    /**\n     * Decide if the object should cache or not. Create its own cache level\n     * needsItsOwnCache should be used when the object drawing method requires\n     * a cache step. None of the fabric classes requires it.\n     * Generally you do not cache objects in groups because the group is already cached.\n     * @return {Boolean}\n     */\n    shouldCache: function() {\n      var ownCache = fabric.Object.prototype.shouldCache.call(this);\n      if (ownCache) {\n        for (var i = 0, len = this._objects.length; i < len; i++) {\n          if (this._objects[i].willDrawShadow()) {\n            this.ownCaching = false;\n            return false;\n          }\n        }\n      }\n      return ownCache;\n    },\n\n    /**\n     * Check if this object or a child object will cast a shadow\n     * @return {Boolean}\n     */\n    willDrawShadow: function() {\n      if (fabric.Object.prototype.willDrawShadow.call(this)) {\n        return true;\n      }\n      for (var i = 0, len = this._objects.length; i < len; i++) {\n        if (this._objects[i].willDrawShadow()) {\n          return true;\n        }\n      }\n      return false;\n    },\n\n    /**\n     * Check if this group or its parent group are caching, recursively up\n     * @return {Boolean}\n     */\n    isOnACache: function() {\n      return this.ownCaching || (this.group && this.group.isOnACache());\n    },\n\n    /**\n     * Execute the drawing operation for an object on a specified context\n     * @param {CanvasRenderingContext2D} ctx Context to render on\n     */\n    drawObject: function(ctx) {\n      for (var i = 0, len = this._objects.length; i < len; i++) {\n        this._objects[i].render(ctx);\n      }\n      this._drawClipPath(ctx);\n    },\n\n    /**\n     * Check if cache is dirty\n     */\n    isCacheDirty: function(skipCanvas) {\n      if (this.callSuper('isCacheDirty', skipCanvas)) {\n        return true;\n      }\n      if (!this.statefullCache) {\n        return false;\n      }\n      for (var i = 0, len = this._objects.length; i < len; i++) {\n        if (this._objects[i].isCacheDirty(true)) {\n          if (this._cacheCanvas) {\n            // if this group has not a cache canvas there is nothing to clean\n            var x = this.cacheWidth / this.zoomX, y = this.cacheHeight / this.zoomY;\n            this._cacheContext.clearRect(-x / 2, -y / 2, x, y);\n          }\n          return true;\n        }\n      }\n      return false;\n    },\n\n    /**\n     * Restores original state of each of group objects (original state is that which was before group was created).\n     * if the nested boolean is true, the original state will be restored just for the\n     * first group and not for all the group chain\n     * @private\n     * @param {Boolean} nested tell the function to restore object state up to the parent group and not more\n     * @return {fabric.Group} thisArg\n     * @chainable\n     */\n    _restoreObjectsState: function() {\n      var groupMatrix = this.calcOwnMatrix();\n      this._objects.forEach(function(object) {\n        // instead of using _this = this;\n        fabric.util.addTransformToObject(object, groupMatrix);\n        delete object.group;\n        object.setCoords();\n      });\n      return this;\n    },\n\n    /**\n     * Realises the transform from this group onto the supplied object\n     * i.e. it tells you what would happen if the supplied object was in\n     * the group, and then the group was destroyed. It mutates the supplied\n     * object.\n     * Warning: this method is not useful anymore, it has been kept to no break the api.\n     * is not used in the fabricJS codebase\n     * this method will be reduced to using the utility.\n     * @private\n     * @deprecated\n     * @param {fabric.Object} object\n     * @param {Array} parentMatrix parent transformation\n     * @return {fabric.Object} transformedObject\n     */\n    realizeTransform: function(object, parentMatrix) {\n      fabric.util.addTransformToObject(object, parentMatrix);\n      return object;\n    },\n\n    /**\n     * Destroys a group (restoring state of its objects)\n     * @return {fabric.Group} thisArg\n     * @chainable\n     */\n    destroy: function() {\n      // when group is destroyed objects needs to get a repaint to be eventually\n      // displayed on canvas.\n      this._objects.forEach(function(object) {\n        object.set('dirty', true);\n      });\n      return this._restoreObjectsState();\n    },\n\n    /**\n     * make a group an active selection, remove the group from canvas\n     * the group has to be on canvas for this to work.\n     * @return {fabric.ActiveSelection} thisArg\n     * @chainable\n     */\n    toActiveSelection: function() {\n      if (!this.canvas) {\n        return;\n      }\n      var objects = this._objects, canvas = this.canvas;\n      this._objects = [];\n      var options = this.toObject();\n      delete options.objects;\n      var activeSelection = new fabric.ActiveSelection([]);\n      activeSelection.set(options);\n      activeSelection.type = 'activeSelection';\n      canvas.remove(this);\n      objects.forEach(function(object) {\n        object.group = activeSelection;\n        object.dirty = true;\n        canvas.add(object);\n      });\n      activeSelection.canvas = canvas;\n      activeSelection._objects = objects;\n      canvas._activeObject = activeSelection;\n      activeSelection.setCoords();\n      return activeSelection;\n    },\n\n    /**\n     * Destroys a group (restoring state of its objects)\n     * @return {fabric.Group} thisArg\n     * @chainable\n     */\n    ungroupOnCanvas: function() {\n      return this._restoreObjectsState();\n    },\n\n    /**\n     * Sets coordinates of all objects inside group\n     * @return {fabric.Group} thisArg\n     * @chainable\n     */\n    setObjectsCoords: function() {\n      var skipControls = true;\n      this.forEachObject(function(object) {\n        object.setCoords(skipControls);\n      });\n      return this;\n    },\n\n    /**\n     * @private\n     */\n    _calcBounds: function(onlyWidthHeight) {\n      var aX = [],\n          aY = [],\n          o, prop, coords,\n          props = ['tr', 'br', 'bl', 'tl'],\n          i = 0, iLen = this._objects.length,\n          j, jLen = props.length;\n\n      for ( ; i < iLen; ++i) {\n        o = this._objects[i];\n        coords = o.calcACoords();\n        for (j = 0; j < jLen; j++) {\n          prop = props[j];\n          aX.push(coords[prop].x);\n          aY.push(coords[prop].y);\n        }\n        o.aCoords = coords;\n      }\n\n      this._getBounds(aX, aY, onlyWidthHeight);\n    },\n\n    /**\n     * @private\n     */\n    _getBounds: function(aX, aY, onlyWidthHeight) {\n      var minXY = new fabric.Point(min(aX), min(aY)),\n          maxXY = new fabric.Point(max(aX), max(aY)),\n          top = minXY.y || 0, left = minXY.x || 0,\n          width = (maxXY.x - minXY.x) || 0,\n          height = (maxXY.y - minXY.y) || 0;\n      this.width = width;\n      this.height = height;\n      if (!onlyWidthHeight) {\n        // the bounding box always finds the topleft most corner.\n        // whatever is the group origin, we set up here the left/top position.\n        this.setPositionByOrigin({ x: left, y: top }, 'left', 'top');\n      }\n    },\n\n    /* _TO_SVG_START_ */\n    /**\n     * Returns svg representation of an instance\n     * @param {Function} [reviver] Method for further parsing of svg representation.\n     * @return {String} svg representation of an instance\n     */\n    _toSVG: function(reviver) {\n      var svgString = ['<g ', 'COMMON_PARTS', ' >\\n'];\n\n      for (var i = 0, len = this._objects.length; i < len; i++) {\n        svgString.push('\\t\\t', this._objects[i].toSVG(reviver));\n      }\n      svgString.push('</g>\\n');\n      return svgString;\n    },\n\n    /**\n     * Returns styles-string for svg-export, specific version for group\n     * @return {String}\n     */\n    getSvgStyles: function() {\n      var opacity = typeof this.opacity !== 'undefined' && this.opacity !== 1 ?\n            'opacity: ' + this.opacity + ';' : '',\n          visibility = this.visible ? '' : ' visibility: hidden;';\n      return [\n        opacity,\n        this.getSvgFilter(),\n        visibility\n      ].join('');\n    },\n\n    /**\n     * Returns svg clipPath representation of an instance\n     * @param {Function} [reviver] Method for further parsing of svg representation.\n     * @return {String} svg representation of an instance\n     */\n    toClipPathSVG: function(reviver) {\n      var svgString = [];\n\n      for (var i = 0, len = this._objects.length; i < len; i++) {\n        svgString.push('\\t', this._objects[i].toClipPathSVG(reviver));\n      }\n\n      return this._createBaseClipPathSVGMarkup(svgString, { reviver: reviver });\n    },\n    /* _TO_SVG_END_ */\n  });\n\n  /**\n   * Returns {@link fabric.Group} instance from an object representation\n   * @static\n   * @memberOf fabric.Group\n   * @param {Object} object Object to create a group from\n   * @param {Function} [callback] Callback to invoke when an group instance is created\n   */\n  fabric.Group.fromObject = function(object, callback) {\n    var objects = object.objects,\n        options = fabric.util.object.clone(object, true);\n    delete options.objects;\n    if (typeof objects === 'string') {\n      // it has to be an url or something went wrong.\n      fabric.loadSVGFromURL(objects, function (elements) {\n        var group = fabric.util.groupSVGElements(elements, object, objects);\n        group.set(options);\n        callback && callback(group);\n      });\n      return;\n    }\n    fabric.util.enlivenObjects(objects, function(enlivenedObjects) {\n      fabric.util.enlivenObjects([object.clipPath], function(enlivedClipPath) {\n        var options = fabric.util.object.clone(object, true);\n        options.clipPath = enlivedClipPath[0];\n        delete options.objects;\n        callback && callback(new fabric.Group(enlivenedObjects, options, true));\n      });\n    });\n  };\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n  'use strict';\n\n  var fabric = global.fabric || (global.fabric = { });\n\n  if (fabric.ActiveSelection) {\n    return;\n  }\n\n  /**\n   * Group class\n   * @class fabric.ActiveSelection\n   * @extends fabric.Group\n   * @tutorial {@link http://fabricjs.com/fabric-intro-part-3#groups}\n   * @see {@link fabric.ActiveSelection#initialize} for constructor definition\n   */\n  fabric.ActiveSelection = fabric.util.createClass(fabric.Group, /** @lends fabric.ActiveSelection.prototype */ {\n\n    /**\n     * Type of an object\n     * @type String\n     * @default\n     */\n    type: 'activeSelection',\n\n    /**\n     * Constructor\n     * @param {Object} objects ActiveSelection objects\n     * @param {Object} [options] Options object\n     * @return {Object} thisArg\n     */\n    initialize: function(objects, options) {\n      options = options || {};\n      this._objects = objects || [];\n      for (var i = this._objects.length; i--; ) {\n        this._objects[i].group = this;\n      }\n\n      if (options.originX) {\n        this.originX = options.originX;\n      }\n      if (options.originY) {\n        this.originY = options.originY;\n      }\n      this._calcBounds();\n      this._updateObjectsCoords();\n      fabric.Object.prototype.initialize.call(this, options);\n      this.setCoords();\n    },\n\n    /**\n     * Change te activeSelection to a normal group,\n     * High level function that automatically adds it to canvas as\n     * active object. no events fired.\n     * @since 2.0.0\n     * @return {fabric.Group}\n     */\n    toGroup: function() {\n      var objects = this._objects.concat();\n      this._objects = [];\n      var options = fabric.Object.prototype.toObject.call(this);\n      var newGroup = new fabric.Group([]);\n      delete options.type;\n      newGroup.set(options);\n      objects.forEach(function(object) {\n        object.canvas.remove(object);\n        object.group = newGroup;\n      });\n      newGroup._objects = objects;\n      if (!this.canvas) {\n        return newGroup;\n      }\n      var canvas = this.canvas;\n      canvas.add(newGroup);\n      canvas._activeObject = newGroup;\n      newGroup.setCoords();\n      return newGroup;\n    },\n\n    /**\n     * If returns true, deselection is cancelled.\n     * @since 2.0.0\n     * @return {Boolean} [cancel]\n     */\n    onDeselect: function() {\n      this.destroy();\n      return false;\n    },\n\n    /**\n     * Returns string representation of a group\n     * @return {String}\n     */\n    toString: function() {\n      return '#<fabric.ActiveSelection: (' + this.complexity() + ')>';\n    },\n\n    /**\n     * Decide if the object should cache or not. Create its own cache level\n     * objectCaching is a global flag, wins over everything\n     * needsItsOwnCache should be used when the object drawing method requires\n     * a cache step. None of the fabric classes requires it.\n     * Generally you do not cache objects in groups because the group outside is cached.\n     * @return {Boolean}\n     */\n    shouldCache: function() {\n      return false;\n    },\n\n    /**\n     * Check if this group or its parent group are caching, recursively up\n     * @return {Boolean}\n     */\n    isOnACache: function() {\n      return false;\n    },\n\n    /**\n     * Renders controls and borders for the object\n     * @param {CanvasRenderingContext2D} ctx Context to render on\n     * @param {Object} [styleOverride] properties to override the object style\n     * @param {Object} [childrenOverride] properties to override the children overrides\n     */\n    _renderControls: function(ctx, styleOverride, childrenOverride) {\n      ctx.save();\n      ctx.globalAlpha = this.isMoving ? this.borderOpacityWhenMoving : 1;\n      this.callSuper('_renderControls', ctx, styleOverride);\n      childrenOverride = childrenOverride || { };\n      if (typeof childrenOverride.hasControls === 'undefined') {\n        childrenOverride.hasControls = false;\n      }\n      childrenOverride.forActiveSelection = true;\n      for (var i = 0, len = this._objects.length; i < len; i++) {\n        this._objects[i]._renderControls(ctx, childrenOverride);\n      }\n      ctx.restore();\n    },\n  });\n\n  /**\n   * Returns {@link fabric.ActiveSelection} instance from an object representation\n   * @static\n   * @memberOf fabric.ActiveSelection\n   * @param {Object} object Object to create a group from\n   * @param {Function} [callback] Callback to invoke when an ActiveSelection instance is created\n   */\n  fabric.ActiveSelection.fromObject = function(object, callback) {\n    fabric.util.enlivenObjects(object.objects, function(enlivenedObjects) {\n      delete object.objects;\n      callback && callback(new fabric.ActiveSelection(enlivenedObjects, object, true));\n    });\n  };\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n  'use strict';\n\n  var extend = fabric.util.object.extend;\n\n  if (!global.fabric) {\n    global.fabric = { };\n  }\n\n  if (global.fabric.Image) {\n    fabric.warn('fabric.Image is already defined.');\n    return;\n  }\n\n  /**\n   * Image class\n   * @class fabric.Image\n   * @extends fabric.Object\n   * @tutorial {@link http://fabricjs.com/fabric-intro-part-1#images}\n   * @see {@link fabric.Image#initialize} for constructor definition\n   */\n  fabric.Image = fabric.util.createClass(fabric.Object, /** @lends fabric.Image.prototype */ {\n\n    /**\n     * Type of an object\n     * @type String\n     * @default\n     */\n    type: 'image',\n\n    /**\n     * Width of a stroke.\n     * For image quality a stroke multiple of 2 gives better results.\n     * @type Number\n     * @default\n     */\n    strokeWidth: 0,\n\n    /**\n     * When calling {@link fabric.Image.getSrc}, return value from element src with `element.getAttribute('src')`.\n     * This allows for relative urls as image src.\n     * @since 2.7.0\n     * @type Boolean\n     * @default\n     */\n    srcFromAttribute: false,\n\n    /**\n     * private\n     * contains last value of scaleX to detect\n     * if the Image got resized after the last Render\n     * @type Number\n     */\n    _lastScaleX: 1,\n\n    /**\n     * private\n     * contains last value of scaleY to detect\n     * if the Image got resized after the last Render\n     * @type Number\n     */\n    _lastScaleY: 1,\n\n    /**\n     * private\n     * contains last value of scaling applied by the apply filter chain\n     * @type Number\n     */\n    _filterScalingX: 1,\n\n    /**\n     * private\n     * contains last value of scaling applied by the apply filter chain\n     * @type Number\n     */\n    _filterScalingY: 1,\n\n    /**\n     * minimum scale factor under which any resizeFilter is triggered to resize the image\n     * 0 will disable the automatic resize. 1 will trigger automatically always.\n     * number bigger than 1 are not implemented yet.\n     * @type Number\n     */\n    minimumScaleTrigger: 0.5,\n\n    /**\n     * List of properties to consider when checking if\n     * state of an object is changed ({@link fabric.Object#hasStateChanged})\n     * as well as for history (undo/redo) purposes\n     * @type Array\n     */\n    stateProperties: fabric.Object.prototype.stateProperties.concat('cropX', 'cropY'),\n\n    /**\n     * List of properties to consider when checking if cache needs refresh\n     * Those properties are checked by statefullCache ON ( or lazy mode if we want ) or from single\n     * calls to Object.set(key, value). If the key is in this list, the object is marked as dirty\n     * and refreshed at the next render\n     * @type Array\n     */\n    cacheProperties: fabric.Object.prototype.cacheProperties.concat('cropX', 'cropY'),\n\n    /**\n     * key used to retrieve the texture representing this image\n     * @since 2.0.0\n     * @type String\n     * @default\n     */\n    cacheKey: '',\n\n    /**\n     * Image crop in pixels from original image size.\n     * @since 2.0.0\n     * @type Number\n     * @default\n     */\n    cropX: 0,\n\n    /**\n     * Image crop in pixels from original image size.\n     * @since 2.0.0\n     * @type Number\n     * @default\n     */\n    cropY: 0,\n\n    /**\n     * Indicates whether this canvas will use image smoothing when painting this image.\n     * Also influence if the cacheCanvas for this image uses imageSmoothing\n     * @since 4.0.0-beta.11\n     * @type Boolean\n     * @default\n     */\n    imageSmoothing: true,\n\n    /**\n     * Constructor\n     * Image can be initialized with any canvas drawable or a string.\n     * The string should be a url and will be loaded as an image.\n     * Canvas and Image element work out of the box, while videos require extra code to work.\n     * Please check video element events for seeking.\n     * @param {HTMLImageElement | HTMLCanvasElement | HTMLVideoElement | String} element Image element\n     * @param {Object} [options] Options object\n     * @param {function} [callback] callback function to call after eventual filters applied.\n     * @return {fabric.Image} thisArg\n     */\n    initialize: function(element, options) {\n      options || (options = { });\n      this.filters = [];\n      this.cacheKey = 'texture' + fabric.Object.__uid++;\n      this.callSuper('initialize', options);\n      this._initElement(element, options);\n    },\n\n    /**\n     * Returns image element which this instance if based on\n     * @return {HTMLImageElement} Image element\n     */\n    getElement: function() {\n      return this._element || {};\n    },\n\n    /**\n     * Sets image element for this instance to a specified one.\n     * If filters defined they are applied to new image.\n     * You might need to call `canvas.renderAll` and `object.setCoords` after replacing, to render new image and update controls area.\n     * @param {HTMLImageElement} element\n     * @param {Object} [options] Options object\n     * @return {fabric.Image} thisArg\n     * @chainable\n     */\n    setElement: function(element, options) {\n      this.removeTexture(this.cacheKey);\n      this.removeTexture(this.cacheKey + '_filtered');\n      this._element = element;\n      this._originalElement = element;\n      this._initConfig(options);\n      if (this.filters.length !== 0) {\n        this.applyFilters();\n      }\n      // resizeFilters work on the already filtered copy.\n      // we need to apply resizeFilters AFTER normal filters.\n      // applyResizeFilters is run more often than normal filters\n      // and is triggered by user interactions rather than dev code\n      if (this.resizeFilter) {\n        this.applyResizeFilters();\n      }\n      return this;\n    },\n\n    /**\n     * Delete a single texture if in webgl mode\n     */\n    removeTexture: function(key) {\n      var backend = fabric.filterBackend;\n      if (backend && backend.evictCachesForKey) {\n        backend.evictCachesForKey(key);\n      }\n    },\n\n    /**\n     * Delete textures, reference to elements and eventually JSDOM cleanup\n     */\n    dispose: function() {\n      this.removeTexture(this.cacheKey);\n      this.removeTexture(this.cacheKey + '_filtered');\n      this._cacheContext = undefined;\n      ['_originalElement', '_element', '_filteredEl', '_cacheCanvas'].forEach((function(element) {\n        fabric.util.cleanUpJsdomNode(this[element]);\n        this[element] = undefined;\n      }).bind(this));\n    },\n\n    /**\n     * Get the crossOrigin value (of the corresponding image element)\n     */\n    getCrossOrigin: function() {\n      return this._originalElement && (this._originalElement.crossOrigin || null);\n    },\n\n    /**\n     * Returns original size of an image\n     * @return {Object} Object with \"width\" and \"height\" properties\n     */\n    getOriginalSize: function() {\n      var element = this.getElement();\n      return {\n        width: element.naturalWidth || element.width,\n        height: element.naturalHeight || element.height\n      };\n    },\n\n    /**\n     * @private\n     * @param {CanvasRenderingContext2D} ctx Context to render on\n     */\n    _stroke: function(ctx) {\n      if (!this.stroke || this.strokeWidth === 0) {\n        return;\n      }\n      var w = this.width / 2, h = this.height / 2;\n      ctx.beginPath();\n      ctx.moveTo(-w, -h);\n      ctx.lineTo(w, -h);\n      ctx.lineTo(w, h);\n      ctx.lineTo(-w, h);\n      ctx.lineTo(-w, -h);\n      ctx.closePath();\n    },\n\n    /**\n     * Returns object representation of an instance\n     * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n     * @return {Object} Object representation of an instance\n     */\n    toObject: function(propertiesToInclude) {\n      var filters = [];\n\n      this.filters.forEach(function(filterObj) {\n        if (filterObj) {\n          filters.push(filterObj.toObject());\n        }\n      });\n      var object = extend(\n        this.callSuper(\n          'toObject',\n          ['cropX', 'cropY'].concat(propertiesToInclude)\n        ), {\n          src: this.getSrc(),\n          crossOrigin: this.getCrossOrigin(),\n          filters: filters,\n        });\n      if (this.resizeFilter) {\n        object.resizeFilter = this.resizeFilter.toObject();\n      }\n      return object;\n    },\n\n    /**\n     * Returns true if an image has crop applied, inspecting values of cropX,cropY,width,height.\n     * @return {Boolean}\n     */\n    hasCrop: function() {\n      return this.cropX || this.cropY || this.width < this._element.width || this.height < this._element.height;\n    },\n\n    /* _TO_SVG_START_ */\n    /**\n     * Returns svg representation of an instance\n     * @return {Array} an array of strings with the specific svg representation\n     * of the instance\n     */\n    _toSVG: function() {\n      var svgString = [], imageMarkup = [], strokeSvg, element = this._element,\n          x = -this.width / 2, y = -this.height / 2, clipPath = '', imageRendering = '';\n      if (!element) {\n        return [];\n      }\n      if (this.hasCrop()) {\n        var clipPathId = fabric.Object.__uid++;\n        svgString.push(\n          '<clipPath id=\"imageCrop_' + clipPathId + '\">\\n',\n          '\\t<rect x=\"' + x + '\" y=\"' + y + '\" width=\"' + this.width + '\" height=\"' + this.height + '\" />\\n',\n          '</clipPath>\\n'\n        );\n        clipPath = ' clip-path=\"url(#imageCrop_' + clipPathId + ')\" ';\n      }\n      if (!this.imageSmoothing) {\n        imageRendering = '\" image-rendering=\"optimizeSpeed';\n      }\n      imageMarkup.push('\\t<image ', 'COMMON_PARTS', 'xlink:href=\"', this.getSvgSrc(true),\n        '\" x=\"', x - this.cropX, '\" y=\"', y - this.cropY,\n        // we're essentially moving origin of transformation from top/left corner to the center of the shape\n        // by wrapping it in container <g> element with actual transformation, then offsetting object to the top/left\n        // so that object's center aligns with container's left/top\n        '\" width=\"', element.width || element.naturalWidth,\n        '\" height=\"', element.height || element.height,\n        imageRendering,\n        '\"', clipPath,\n        '></image>\\n');\n\n      if (this.stroke || this.strokeDashArray) {\n        var origFill = this.fill;\n        this.fill = null;\n        strokeSvg = [\n          '\\t<rect ',\n          'x=\"', x, '\" y=\"', y,\n          '\" width=\"', this.width, '\" height=\"', this.height,\n          '\" style=\"', this.getSvgStyles(),\n          '\"/>\\n'\n        ];\n        this.fill = origFill;\n      }\n      if (this.paintFirst !== 'fill') {\n        svgString = svgString.concat(strokeSvg, imageMarkup);\n      }\n      else {\n        svgString = svgString.concat(imageMarkup, strokeSvg);\n      }\n      return svgString;\n    },\n    /* _TO_SVG_END_ */\n\n    /**\n     * Returns source of an image\n     * @param {Boolean} filtered indicates if the src is needed for svg\n     * @return {String} Source of an image\n     */\n    getSrc: function(filtered) {\n      var element = filtered ? this._element : this._originalElement;\n      if (element) {\n        if (element.toDataURL) {\n          return element.toDataURL();\n        }\n\n        if (this.srcFromAttribute) {\n          return element.getAttribute('src');\n        }\n        else {\n          return element.src;\n        }\n      }\n      else {\n        return this.src || '';\n      }\n    },\n\n    /**\n     * Sets source of an image\n     * @param {String} src Source string (URL)\n     * @param {Function} [callback] Callback is invoked when image has been loaded (and all filters have been applied)\n     * @param {Object} [options] Options object\n     * @param {String} [options.crossOrigin] crossOrigin value (one of \"\", \"anonymous\", \"use-credentials\")\n     * @see https://developer.mozilla.org/en-US/docs/HTML/CORS_settings_attributes\n     * @return {fabric.Image} thisArg\n     * @chainable\n     */\n    setSrc: function(src, callback, options) {\n      fabric.util.loadImage(src, function(img, isError) {\n        this.setElement(img, options);\n        this._setWidthHeight();\n        callback && callback(this, isError);\n      }, this, options && options.crossOrigin);\n      return this;\n    },\n\n    /**\n     * Returns string representation of an instance\n     * @return {String} String representation of an instance\n     */\n    toString: function() {\n      return '#<fabric.Image: { src: \"' + this.getSrc() + '\" }>';\n    },\n\n    applyResizeFilters: function() {\n      var filter = this.resizeFilter,\n          minimumScale = this.minimumScaleTrigger,\n          objectScale = this.getTotalObjectScaling(),\n          scaleX = objectScale.scaleX,\n          scaleY = objectScale.scaleY,\n          elementToFilter = this._filteredEl || this._originalElement;\n      if (this.group) {\n        this.set('dirty', true);\n      }\n      if (!filter || (scaleX > minimumScale && scaleY > minimumScale)) {\n        this._element = elementToFilter;\n        this._filterScalingX = 1;\n        this._filterScalingY = 1;\n        this._lastScaleX = scaleX;\n        this._lastScaleY = scaleY;\n        return;\n      }\n      if (!fabric.filterBackend) {\n        fabric.filterBackend = fabric.initFilterBackend();\n      }\n      var canvasEl = fabric.util.createCanvasElement(),\n          cacheKey = this._filteredEl ? (this.cacheKey + '_filtered') : this.cacheKey,\n          sourceWidth = elementToFilter.width, sourceHeight = elementToFilter.height;\n      canvasEl.width = sourceWidth;\n      canvasEl.height = sourceHeight;\n      this._element = canvasEl;\n      this._lastScaleX = filter.scaleX = scaleX;\n      this._lastScaleY = filter.scaleY = scaleY;\n      fabric.filterBackend.applyFilters(\n        [filter], elementToFilter, sourceWidth, sourceHeight, this._element, cacheKey);\n      this._filterScalingX = canvasEl.width / this._originalElement.width;\n      this._filterScalingY = canvasEl.height / this._originalElement.height;\n    },\n\n    /**\n     * Applies filters assigned to this image (from \"filters\" array) or from filter param\n     * @method applyFilters\n     * @param {Array} filters to be applied\n     * @param {Boolean} forResizing specify if the filter operation is a resize operation\n     * @return {thisArg} return the fabric.Image object\n     * @chainable\n     */\n    applyFilters: function(filters) {\n\n      filters = filters || this.filters || [];\n      filters = filters.filter(function(filter) { return filter && !filter.isNeutralState(); });\n      this.set('dirty', true);\n\n      // needs to clear out or WEBGL will not resize correctly\n      this.removeTexture(this.cacheKey + '_filtered');\n\n      if (filters.length === 0) {\n        this._element = this._originalElement;\n        this._filteredEl = null;\n        this._filterScalingX = 1;\n        this._filterScalingY = 1;\n        return this;\n      }\n\n      var imgElement = this._originalElement,\n          sourceWidth = imgElement.naturalWidth || imgElement.width,\n          sourceHeight = imgElement.naturalHeight || imgElement.height;\n\n      if (this._element === this._originalElement) {\n        // if the element is the same we need to create a new element\n        var canvasEl = fabric.util.createCanvasElement();\n        canvasEl.width = sourceWidth;\n        canvasEl.height = sourceHeight;\n        this._element = canvasEl;\n        this._filteredEl = canvasEl;\n      }\n      else {\n        // clear the existing element to get new filter data\n        // also dereference the eventual resized _element\n        this._element = this._filteredEl;\n        this._filteredEl.getContext('2d').clearRect(0, 0, sourceWidth, sourceHeight);\n        // we also need to resize again at next renderAll, so remove saved _lastScaleX/Y\n        this._lastScaleX = 1;\n        this._lastScaleY = 1;\n      }\n      if (!fabric.filterBackend) {\n        fabric.filterBackend = fabric.initFilterBackend();\n      }\n      fabric.filterBackend.applyFilters(\n        filters, this._originalElement, sourceWidth, sourceHeight, this._element, this.cacheKey);\n      if (this._originalElement.width !== this._element.width ||\n        this._originalElement.height !== this._element.height) {\n        this._filterScalingX = this._element.width / this._originalElement.width;\n        this._filterScalingY = this._element.height / this._originalElement.height;\n      }\n      return this;\n    },\n\n    /**\n     * @private\n     * @param {CanvasRenderingContext2D} ctx Context to render on\n     */\n    _render: function(ctx) {\n      fabric.util.setImageSmoothing(ctx, this.imageSmoothing);\n      if (this.isMoving !== true && this.resizeFilter && this._needsResize()) {\n        this.applyResizeFilters();\n      }\n      this._stroke(ctx);\n      this._renderPaintInOrder(ctx);\n    },\n\n    /**\n     * Paint the cached copy of the object on the target context.\n     * it will set the imageSmoothing for the draw operation\n     * @param {CanvasRenderingContext2D} ctx Context to render on\n     */\n    drawCacheOnCanvas: function(ctx) {\n      fabric.util.setImageSmoothing(ctx, this.imageSmoothing);\n      fabric.Object.prototype.drawCacheOnCanvas.call(this, ctx);\n    },\n\n    /**\n     * Decide if the object should cache or not. Create its own cache level\n     * needsItsOwnCache should be used when the object drawing method requires\n     * a cache step. None of the fabric classes requires it.\n     * Generally you do not cache objects in groups because the group outside is cached.\n     * This is the special image version where we would like to avoid caching where possible.\n     * Essentially images do not benefit from caching. They may require caching, and in that\n     * case we do it. Also caching an image usually ends in a loss of details.\n     * A full performance audit should be done.\n     * @return {Boolean}\n     */\n    shouldCache: function() {\n      return this.needsItsOwnCache();\n    },\n\n    _renderFill: function(ctx) {\n      var elementToDraw = this._element;\n      if (!elementToDraw) {\n        return;\n      }\n      var scaleX = this._filterScalingX, scaleY = this._filterScalingY,\n          w = this.width, h = this.height, min = Math.min, max = Math.max,\n          // crop values cannot be lesser than 0.\n          cropX = max(this.cropX, 0), cropY = max(this.cropY, 0),\n          elWidth = elementToDraw.naturalWidth || elementToDraw.width,\n          elHeight = elementToDraw.naturalHeight || elementToDraw.height,\n          sX = cropX * scaleX,\n          sY = cropY * scaleY,\n          // the width height cannot exceed element width/height, starting from the crop offset.\n          sW = min(w * scaleX, elWidth - sX),\n          sH = min(h * scaleY, elHeight - sY),\n          x = -w / 2, y = -h / 2,\n          maxDestW = min(w, elWidth / scaleX - cropX),\n          maxDestH = min(h, elHeight / scaleY - cropY);\n\n      elementToDraw && ctx.drawImage(elementToDraw, sX, sY, sW, sH, x, y, maxDestW, maxDestH);\n    },\n\n    /**\n     * needed to check if image needs resize\n     * @private\n     */\n    _needsResize: function() {\n      var scale = this.getTotalObjectScaling();\n      return (scale.scaleX !== this._lastScaleX || scale.scaleY !== this._lastScaleY);\n    },\n\n    /**\n     * @private\n     */\n    _resetWidthHeight: function() {\n      this.set(this.getOriginalSize());\n    },\n\n    /**\n     * The Image class's initialization method. This method is automatically\n     * called by the constructor.\n     * @private\n     * @param {HTMLImageElement|String} element The element representing the image\n     * @param {Object} [options] Options object\n     */\n    _initElement: function(element, options) {\n      this.setElement(fabric.util.getById(element), options);\n      fabric.util.addClass(this.getElement(), fabric.Image.CSS_CANVAS);\n    },\n\n    /**\n     * @private\n     * @param {Object} [options] Options object\n     */\n    _initConfig: function(options) {\n      options || (options = { });\n      this.setOptions(options);\n      this._setWidthHeight(options);\n    },\n\n    /**\n     * @private\n     * @param {Array} filters to be initialized\n     * @param {Function} callback Callback to invoke when all fabric.Image.filters instances are created\n     */\n    _initFilters: function(filters, callback) {\n      if (filters && filters.length) {\n        fabric.util.enlivenObjects(filters, function(enlivenedObjects) {\n          callback && callback(enlivenedObjects);\n        }, 'fabric.Image.filters');\n      }\n      else {\n        callback && callback();\n      }\n    },\n\n    /**\n     * @private\n     * Set the width and the height of the image object, using the element or the\n     * options.\n     * @param {Object} [options] Object with width/height properties\n     */\n    _setWidthHeight: function(options) {\n      options || (options = { });\n      var el = this.getElement();\n      this.width = options.width || el.naturalWidth || el.width || 0;\n      this.height = options.height || el.naturalHeight || el.height || 0;\n    },\n\n    /**\n     * Calculate offset for center and scale factor for the image in order to respect\n     * the preserveAspectRatio attribute\n     * @private\n     * @return {Object}\n     */\n    parsePreserveAspectRatioAttribute: function() {\n      var pAR = fabric.util.parsePreserveAspectRatioAttribute(this.preserveAspectRatio || ''),\n          rWidth = this._element.width, rHeight = this._element.height,\n          scaleX = 1, scaleY = 1, offsetLeft = 0, offsetTop = 0, cropX = 0, cropY = 0,\n          offset, pWidth = this.width, pHeight = this.height, parsedAttributes = { width: pWidth, height: pHeight };\n      if (pAR && (pAR.alignX !== 'none' || pAR.alignY !== 'none')) {\n        if (pAR.meetOrSlice === 'meet') {\n          scaleX = scaleY = fabric.util.findScaleToFit(this._element, parsedAttributes);\n          offset = (pWidth - rWidth * scaleX) / 2;\n          if (pAR.alignX === 'Min') {\n            offsetLeft = -offset;\n          }\n          if (pAR.alignX === 'Max') {\n            offsetLeft = offset;\n          }\n          offset = (pHeight - rHeight * scaleY) / 2;\n          if (pAR.alignY === 'Min') {\n            offsetTop = -offset;\n          }\n          if (pAR.alignY === 'Max') {\n            offsetTop = offset;\n          }\n        }\n        if (pAR.meetOrSlice === 'slice') {\n          scaleX = scaleY = fabric.util.findScaleToCover(this._element, parsedAttributes);\n          offset = rWidth - pWidth / scaleX;\n          if (pAR.alignX === 'Mid') {\n            cropX = offset / 2;\n          }\n          if (pAR.alignX === 'Max') {\n            cropX = offset;\n          }\n          offset = rHeight - pHeight / scaleY;\n          if (pAR.alignY === 'Mid') {\n            cropY = offset / 2;\n          }\n          if (pAR.alignY === 'Max') {\n            cropY = offset;\n          }\n          rWidth = pWidth / scaleX;\n          rHeight = pHeight / scaleY;\n        }\n      }\n      else {\n        scaleX = pWidth / rWidth;\n        scaleY = pHeight / rHeight;\n      }\n      return {\n        width: rWidth,\n        height: rHeight,\n        scaleX: scaleX,\n        scaleY: scaleY,\n        offsetLeft: offsetLeft,\n        offsetTop: offsetTop,\n        cropX: cropX,\n        cropY: cropY\n      };\n    }\n  });\n\n  /**\n   * Default CSS class name for canvas\n   * @static\n   * @type String\n   * @default\n   */\n  fabric.Image.CSS_CANVAS = 'canvas-img';\n\n  /**\n   * Alias for getSrc\n   * @static\n   */\n  fabric.Image.prototype.getSvgSrc = fabric.Image.prototype.getSrc;\n\n  /**\n   * Creates an instance of fabric.Image from its object representation\n   * @static\n   * @param {Object} object Object to create an instance from\n   * @param {Function} callback Callback to invoke when an image instance is created\n   */\n  fabric.Image.fromObject = function(_object, callback) {\n    var object = fabric.util.object.clone(_object);\n    fabric.util.loadImage(object.src, function(img, isError) {\n      if (isError) {\n        callback && callback(null, true);\n        return;\n      }\n      fabric.Image.prototype._initFilters.call(object, object.filters, function(filters) {\n        object.filters = filters || [];\n        fabric.Image.prototype._initFilters.call(object, [object.resizeFilter], function(resizeFilters) {\n          object.resizeFilter = resizeFilters[0];\n          fabric.util.enlivenObjects([object.clipPath], function(enlivedProps) {\n            object.clipPath = enlivedProps[0];\n            var image = new fabric.Image(img, object);\n            callback(image, false);\n          });\n        });\n      });\n    }, null, object.crossOrigin);\n  };\n\n  /**\n   * Creates an instance of fabric.Image from an URL string\n   * @static\n   * @param {String} url URL to create an image from\n   * @param {Function} [callback] Callback to invoke when image is created (newly created image is passed as a first argument). Second argument is a boolean indicating if an error occurred or not.\n   * @param {Object} [imgOptions] Options object\n   */\n  fabric.Image.fromURL = function(url, callback, imgOptions) {\n    fabric.util.loadImage(url, function(img, isError) {\n      callback && callback(new fabric.Image(img, imgOptions), isError);\n    }, null, imgOptions && imgOptions.crossOrigin);\n  };\n\n  /* _FROM_SVG_START_ */\n  /**\n   * List of attribute names to account for when parsing SVG element (used by {@link fabric.Image.fromElement})\n   * @static\n   * @see {@link http://www.w3.org/TR/SVG/struct.html#ImageElement}\n   */\n  fabric.Image.ATTRIBUTE_NAMES =\n    fabric.SHARED_ATTRIBUTES.concat(\n      'x y width height preserveAspectRatio xlink:href crossOrigin image-rendering'.split(' ')\n    );\n\n  /**\n   * Returns {@link fabric.Image} instance from an SVG element\n   * @static\n   * @param {SVGElement} element Element to parse\n   * @param {Object} [options] Options object\n   * @param {Function} callback Callback to execute when fabric.Image object is created\n   * @return {fabric.Image} Instance of fabric.Image\n   */\n  fabric.Image.fromElement = function(element, callback, options) {\n    var parsedAttributes = fabric.parseAttributes(element, fabric.Image.ATTRIBUTE_NAMES);\n    fabric.Image.fromURL(parsedAttributes['xlink:href'], callback,\n      extend((options ? fabric.util.object.clone(options) : { }), parsedAttributes));\n  };\n  /* _FROM_SVG_END_ */\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\nfabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prototype */ {\n\n  /**\n   * @private\n   * @return {Number} angle value\n   */\n  _getAngleValueForStraighten: function() {\n    var angle = this.angle % 360;\n    if (angle > 0) {\n      return Math.round((angle - 1) / 90) * 90;\n    }\n    return Math.round(angle / 90) * 90;\n  },\n\n  /**\n   * Straightens an object (rotating it from current angle to one of 0, 90, 180, 270, etc. depending on which is closer)\n   * @return {fabric.Object} thisArg\n   * @chainable\n   */\n  straighten: function() {\n    this.rotate(this._getAngleValueForStraighten());\n    return this;\n  },\n\n  /**\n   * Same as {@link fabric.Object.prototype.straighten} but with animation\n   * @param {Object} callbacks Object with callback functions\n   * @param {Function} [callbacks.onComplete] Invoked on completion\n   * @param {Function} [callbacks.onChange] Invoked on every step of animation\n   * @return {fabric.Object} thisArg\n   * @chainable\n   */\n  fxStraighten: function(callbacks) {\n    callbacks = callbacks || { };\n\n    var empty = function() { },\n        onComplete = callbacks.onComplete || empty,\n        onChange = callbacks.onChange || empty,\n        _this = this;\n\n    fabric.util.animate({\n      startValue: this.get('angle'),\n      endValue: this._getAngleValueForStraighten(),\n      duration: this.FX_DURATION,\n      onChange: function(value) {\n        _this.rotate(value);\n        onChange();\n      },\n      onComplete: function() {\n        _this.setCoords();\n        onComplete();\n      },\n    });\n\n    return this;\n  }\n});\n\nfabric.util.object.extend(fabric.StaticCanvas.prototype, /** @lends fabric.StaticCanvas.prototype */ {\n\n  /**\n   * Straightens object, then rerenders canvas\n   * @param {fabric.Object} object Object to straighten\n   * @return {fabric.Canvas} thisArg\n   * @chainable\n   */\n  straightenObject: function (object) {\n    object.straighten();\n    this.requestRenderAll();\n    return this;\n  },\n\n  /**\n   * Same as {@link fabric.Canvas.prototype.straightenObject}, but animated\n   * @param {fabric.Object} object Object to straighten\n   * @return {fabric.Canvas} thisArg\n   * @chainable\n   */\n  fxStraightenObject: function (object) {\n    object.fxStraighten({\n      onChange: this.requestRenderAllBound\n    });\n    return this;\n  }\n});\n\n\n(function() {\n\n  'use strict';\n\n  /**\n   * Tests if webgl supports certain precision\n   * @param {WebGL} Canvas WebGL context to test on\n   * @param {String} Precision to test can be any of following: 'lowp', 'mediump', 'highp'\n   * @returns {Boolean} Whether the user's browser WebGL supports given precision.\n   */\n  function testPrecision(gl, precision){\n    var fragmentSource = 'precision ' + precision + ' float;\\nvoid main(){}';\n    var fragmentShader = gl.createShader(gl.FRAGMENT_SHADER);\n    gl.shaderSource(fragmentShader, fragmentSource);\n    gl.compileShader(fragmentShader);\n    if (!gl.getShaderParameter(fragmentShader, gl.COMPILE_STATUS)) {\n      return false;\n    }\n    return true;\n  }\n\n  /**\n   * Indicate whether this filtering backend is supported by the user's browser.\n   * @param {Number} tileSize check if the tileSize is supported\n   * @returns {Boolean} Whether the user's browser supports WebGL.\n   */\n  fabric.isWebglSupported = function(tileSize) {\n    if (fabric.isLikelyNode) {\n      return false;\n    }\n    tileSize = tileSize || fabric.WebglFilterBackend.prototype.tileSize;\n    var canvas = document.createElement('canvas');\n    var gl = canvas.getContext('webgl') || canvas.getContext('experimental-webgl');\n    var isSupported = false;\n    // eslint-disable-next-line\n    if (gl) {\n      fabric.maxTextureSize = gl.getParameter(gl.MAX_TEXTURE_SIZE);\n      isSupported = fabric.maxTextureSize >= tileSize;\n      var precisions = ['highp', 'mediump', 'lowp'];\n      for (var i = 0; i < 3; i++){\n        if (testPrecision(gl, precisions[i])){\n          fabric.webGlPrecision = precisions[i];\n          break;\n        };\n      }\n    }\n    this.isSupported = isSupported;\n    return isSupported;\n  };\n\n  fabric.WebglFilterBackend = WebglFilterBackend;\n\n  /**\n   * WebGL filter backend.\n   */\n  function WebglFilterBackend(options) {\n    if (options && options.tileSize) {\n      this.tileSize = options.tileSize;\n    }\n    this.setupGLContext(this.tileSize, this.tileSize);\n    this.captureGPUInfo();\n  };\n\n  WebglFilterBackend.prototype = /** @lends fabric.WebglFilterBackend.prototype */ {\n\n    tileSize: 2048,\n\n    /**\n     * Experimental. This object is a sort of repository of help layers used to avoid\n     * of recreating them during frequent filtering. If you are previewing a filter with\n     * a slider you probably do not want to create help layers every filter step.\n     * in this object there will be appended some canvases, created once, resized sometimes\n     * cleared never. Clearing is left to the developer.\n     **/\n    resources: {\n\n    },\n\n    /**\n     * Setup a WebGL context suitable for filtering, and bind any needed event handlers.\n     */\n    setupGLContext: function(width, height) {\n      this.dispose();\n      this.createWebGLCanvas(width, height);\n      // eslint-disable-next-line\n      this.aPosition = new Float32Array([0, 0, 0, 1, 1, 0, 1, 1]);\n      this.chooseFastestCopyGLTo2DMethod(width, height);\n    },\n\n    /**\n     * Pick a method to copy data from GL context to 2d canvas.  In some browsers using\n     * putImageData is faster than drawImage for that specific operation.\n     */\n    chooseFastestCopyGLTo2DMethod: function(width, height) {\n      var canMeasurePerf = typeof window.performance !== 'undefined', canUseImageData;\n      try {\n        new ImageData(1, 1);\n        canUseImageData = true;\n      }\n      catch (e) {\n        canUseImageData = false;\n      }\n      // eslint-disable-next-line no-undef\n      var canUseArrayBuffer = typeof ArrayBuffer !== 'undefined';\n      // eslint-disable-next-line no-undef\n      var canUseUint8Clamped = typeof Uint8ClampedArray !== 'undefined';\n\n      if (!(canMeasurePerf && canUseImageData && canUseArrayBuffer && canUseUint8Clamped)) {\n        return;\n      }\n\n      var targetCanvas = fabric.util.createCanvasElement();\n      // eslint-disable-next-line no-undef\n      var imageBuffer = new ArrayBuffer(width * height * 4);\n      if (fabric.forceGLPutImageData) {\n        this.imageBuffer = imageBuffer;\n        this.copyGLTo2D = copyGLTo2DPutImageData;\n        return;\n      }\n      var testContext = {\n        imageBuffer: imageBuffer,\n        destinationWidth: width,\n        destinationHeight: height,\n        targetCanvas: targetCanvas\n      };\n      var startTime, drawImageTime, putImageDataTime;\n      targetCanvas.width = width;\n      targetCanvas.height = height;\n\n      startTime = window.performance.now();\n      copyGLTo2DDrawImage.call(testContext, this.gl, testContext);\n      drawImageTime = window.performance.now() - startTime;\n\n      startTime = window.performance.now();\n      copyGLTo2DPutImageData.call(testContext, this.gl, testContext);\n      putImageDataTime = window.performance.now() - startTime;\n\n      if (drawImageTime > putImageDataTime) {\n        this.imageBuffer = imageBuffer;\n        this.copyGLTo2D = copyGLTo2DPutImageData;\n      }\n      else {\n        this.copyGLTo2D = copyGLTo2DDrawImage;\n      }\n    },\n\n    /**\n     * Create a canvas element and associated WebGL context and attaches them as\n     * class properties to the GLFilterBackend class.\n     */\n    createWebGLCanvas: function(width, height) {\n      var canvas = fabric.util.createCanvasElement();\n      canvas.width = width;\n      canvas.height = height;\n      var glOptions = {\n            alpha: true,\n            premultipliedAlpha: false,\n            depth: false,\n            stencil: false,\n            antialias: false\n          },\n          gl = canvas.getContext('webgl', glOptions);\n      if (!gl) {\n        gl = canvas.getContext('experimental-webgl', glOptions);\n      }\n      if (!gl) {\n        return;\n      }\n      gl.clearColor(0, 0, 0, 0);\n      // this canvas can fire webglcontextlost and webglcontextrestored\n      this.canvas = canvas;\n      this.gl = gl;\n    },\n\n    /**\n     * Attempts to apply the requested filters to the source provided, drawing the filtered output\n     * to the provided target canvas.\n     *\n     * @param {Array} filters The filters to apply.\n     * @param {HTMLImageElement|HTMLCanvasElement} source The source to be filtered.\n     * @param {Number} width The width of the source input.\n     * @param {Number} height The height of the source input.\n     * @param {HTMLCanvasElement} targetCanvas The destination for filtered output to be drawn.\n     * @param {String|undefined} cacheKey A key used to cache resources related to the source. If\n     * omitted, caching will be skipped.\n     */\n    applyFilters: function(filters, source, width, height, targetCanvas, cacheKey) {\n      var gl = this.gl;\n      var cachedTexture;\n      if (cacheKey) {\n        cachedTexture = this.getCachedTexture(cacheKey, source);\n      }\n      var pipelineState = {\n        originalWidth: source.width || source.originalWidth,\n        originalHeight: source.height || source.originalHeight,\n        sourceWidth: width,\n        sourceHeight: height,\n        destinationWidth: width,\n        destinationHeight: height,\n        context: gl,\n        sourceTexture: this.createTexture(gl, width, height, !cachedTexture && source),\n        targetTexture: this.createTexture(gl, width, height),\n        originalTexture: cachedTexture ||\n          this.createTexture(gl, width, height, !cachedTexture && source),\n        passes: filters.length,\n        webgl: true,\n        aPosition: this.aPosition,\n        programCache: this.programCache,\n        pass: 0,\n        filterBackend: this,\n        targetCanvas: targetCanvas\n      };\n      var tempFbo = gl.createFramebuffer();\n      gl.bindFramebuffer(gl.FRAMEBUFFER, tempFbo);\n      filters.forEach(function(filter) { filter && filter.applyTo(pipelineState); });\n      resizeCanvasIfNeeded(pipelineState);\n      this.copyGLTo2D(gl, pipelineState);\n      gl.bindTexture(gl.TEXTURE_2D, null);\n      gl.deleteTexture(pipelineState.sourceTexture);\n      gl.deleteTexture(pipelineState.targetTexture);\n      gl.deleteFramebuffer(tempFbo);\n      targetCanvas.getContext('2d').setTransform(1, 0, 0, 1, 0, 0);\n      return pipelineState;\n    },\n\n    /**\n     * Detach event listeners, remove references, and clean up caches.\n     */\n    dispose: function() {\n      if (this.canvas) {\n        this.canvas = null;\n        this.gl = null;\n      }\n      this.clearWebGLCaches();\n    },\n\n    /**\n     * Wipe out WebGL-related caches.\n     */\n    clearWebGLCaches: function() {\n      this.programCache = {};\n      this.textureCache = {};\n    },\n\n    /**\n     * Create a WebGL texture object.\n     *\n     * Accepts specific dimensions to initialize the texture to or a source image.\n     *\n     * @param {WebGLRenderingContext} gl The GL context to use for creating the texture.\n     * @param {Number} width The width to initialize the texture at.\n     * @param {Number} height The height to initialize the texture.\n     * @param {HTMLImageElement|HTMLCanvasElement} textureImageSource A source for the texture data.\n     * @returns {WebGLTexture}\n     */\n    createTexture: function(gl, width, height, textureImageSource) {\n      var texture = gl.createTexture();\n      gl.bindTexture(gl.TEXTURE_2D, texture);\n      gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);\n      gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);\n      gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n      gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n      if (textureImageSource) {\n        gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, textureImageSource);\n      }\n      else {\n        gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, width, height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null);\n      }\n      return texture;\n    },\n\n    /**\n     * Can be optionally used to get a texture from the cache array\n     *\n     * If an existing texture is not found, a new texture is created and cached.\n     *\n     * @param {String} uniqueId A cache key to use to find an existing texture.\n     * @param {HTMLImageElement|HTMLCanvasElement} textureImageSource A source to use to create the\n     * texture cache entry if one does not already exist.\n     */\n    getCachedTexture: function(uniqueId, textureImageSource) {\n      if (this.textureCache[uniqueId]) {\n        return this.textureCache[uniqueId];\n      }\n      else {\n        var texture = this.createTexture(\n          this.gl, textureImageSource.width, textureImageSource.height, textureImageSource);\n        this.textureCache[uniqueId] = texture;\n        return texture;\n      }\n    },\n\n    /**\n     * Clear out cached resources related to a source image that has been\n     * filtered previously.\n     *\n     * @param {String} cacheKey The cache key provided when the source image was filtered.\n     */\n    evictCachesForKey: function(cacheKey) {\n      if (this.textureCache[cacheKey]) {\n        this.gl.deleteTexture(this.textureCache[cacheKey]);\n        delete this.textureCache[cacheKey];\n      }\n    },\n\n    copyGLTo2D: copyGLTo2DDrawImage,\n\n    /**\n     * Attempt to extract GPU information strings from a WebGL context.\n     *\n     * Useful information when debugging or blacklisting specific GPUs.\n     *\n     * @returns {Object} A GPU info object with renderer and vendor strings.\n     */\n    captureGPUInfo: function() {\n      if (this.gpuInfo) {\n        return this.gpuInfo;\n      }\n      var gl = this.gl, gpuInfo = { renderer: '', vendor: '' };\n      if (!gl) {\n        return gpuInfo;\n      }\n      var ext = gl.getExtension('WEBGL_debug_renderer_info');\n      if (ext) {\n        var renderer = gl.getParameter(ext.UNMASKED_RENDERER_WEBGL);\n        var vendor = gl.getParameter(ext.UNMASKED_VENDOR_WEBGL);\n        if (renderer) {\n          gpuInfo.renderer = renderer.toLowerCase();\n        }\n        if (vendor) {\n          gpuInfo.vendor = vendor.toLowerCase();\n        }\n      }\n      this.gpuInfo = gpuInfo;\n      return gpuInfo;\n    },\n  };\n})();\n\nfunction resizeCanvasIfNeeded(pipelineState) {\n  var targetCanvas = pipelineState.targetCanvas,\n      width = targetCanvas.width, height = targetCanvas.height,\n      dWidth = pipelineState.destinationWidth,\n      dHeight = pipelineState.destinationHeight;\n\n  if (width !== dWidth || height !== dHeight) {\n    targetCanvas.width = dWidth;\n    targetCanvas.height = dHeight;\n  }\n}\n\n/**\n * Copy an input WebGL canvas on to an output 2D canvas.\n *\n * The WebGL canvas is assumed to be upside down, with the top-left pixel of the\n * desired output image appearing in the bottom-left corner of the WebGL canvas.\n *\n * @param {WebGLRenderingContext} sourceContext The WebGL context to copy from.\n * @param {HTMLCanvasElement} targetCanvas The 2D target canvas to copy on to.\n * @param {Object} pipelineState The 2D target canvas to copy on to.\n */\nfunction copyGLTo2DDrawImage(gl, pipelineState) {\n  var glCanvas = gl.canvas, targetCanvas = pipelineState.targetCanvas,\n      ctx = targetCanvas.getContext('2d');\n  ctx.translate(0, targetCanvas.height); // move it down again\n  ctx.scale(1, -1); // vertical flip\n  // where is my image on the big glcanvas?\n  var sourceY = glCanvas.height - targetCanvas.height;\n  ctx.drawImage(glCanvas, 0, sourceY, targetCanvas.width, targetCanvas.height, 0, 0,\n    targetCanvas.width, targetCanvas.height);\n}\n\n/**\n * Copy an input WebGL canvas on to an output 2D canvas using 2d canvas' putImageData\n * API. Measurably faster than using ctx.drawImage in Firefox (version 54 on OSX Sierra).\n *\n * @param {WebGLRenderingContext} sourceContext The WebGL context to copy from.\n * @param {HTMLCanvasElement} targetCanvas The 2D target canvas to copy on to.\n * @param {Object} pipelineState The 2D target canvas to copy on to.\n */\nfunction copyGLTo2DPutImageData(gl, pipelineState) {\n  var targetCanvas = pipelineState.targetCanvas, ctx = targetCanvas.getContext('2d'),\n      dWidth = pipelineState.destinationWidth,\n      dHeight = pipelineState.destinationHeight,\n      numBytes = dWidth * dHeight * 4;\n\n  // eslint-disable-next-line no-undef\n  var u8 = new Uint8Array(this.imageBuffer, 0, numBytes);\n  // eslint-disable-next-line no-undef\n  var u8Clamped = new Uint8ClampedArray(this.imageBuffer, 0, numBytes);\n\n  gl.readPixels(0, 0, dWidth, dHeight, gl.RGBA, gl.UNSIGNED_BYTE, u8);\n  var imgData = new ImageData(u8Clamped, dWidth, dHeight);\n  ctx.putImageData(imgData, 0, 0);\n}\n\n\n(function() {\n\n  'use strict';\n\n  var noop = function() {};\n\n  fabric.Canvas2dFilterBackend = Canvas2dFilterBackend;\n\n  /**\n   * Canvas 2D filter backend.\n   */\n  function Canvas2dFilterBackend() {};\n\n  Canvas2dFilterBackend.prototype = /** @lends fabric.Canvas2dFilterBackend.prototype */ {\n    evictCachesForKey: noop,\n    dispose: noop,\n    clearWebGLCaches: noop,\n\n    /**\n     * Experimental. This object is a sort of repository of help layers used to avoid\n     * of recreating them during frequent filtering. If you are previewing a filter with\n     * a slider you probably do not want to create help layers every filter step.\n     * in this object there will be appended some canvases, created once, resized sometimes\n     * cleared never. Clearing is left to the developer.\n     **/\n    resources: {\n\n    },\n\n    /**\n     * Apply a set of filters against a source image and draw the filtered output\n     * to the provided destination canvas.\n     *\n     * @param {EnhancedFilter} filters The filter to apply.\n     * @param {HTMLImageElement|HTMLCanvasElement} sourceElement The source to be filtered.\n     * @param {Number} sourceWidth The width of the source input.\n     * @param {Number} sourceHeight The height of the source input.\n     * @param {HTMLCanvasElement} targetCanvas The destination for filtered output to be drawn.\n     */\n    applyFilters: function(filters, sourceElement, sourceWidth, sourceHeight, targetCanvas) {\n      var ctx = targetCanvas.getContext('2d');\n      ctx.drawImage(sourceElement, 0, 0, sourceWidth, sourceHeight);\n      var imageData = ctx.getImageData(0, 0, sourceWidth, sourceHeight);\n      var originalImageData = ctx.getImageData(0, 0, sourceWidth, sourceHeight);\n      var pipelineState = {\n        sourceWidth: sourceWidth,\n        sourceHeight: sourceHeight,\n        imageData: imageData,\n        originalEl: sourceElement,\n        originalImageData: originalImageData,\n        canvasEl: targetCanvas,\n        ctx: ctx,\n        filterBackend: this,\n      };\n      filters.forEach(function(filter) { filter.applyTo(pipelineState); });\n      if (pipelineState.imageData.width !== sourceWidth || pipelineState.imageData.height !== sourceHeight) {\n        targetCanvas.width = pipelineState.imageData.width;\n        targetCanvas.height = pipelineState.imageData.height;\n      }\n      ctx.putImageData(pipelineState.imageData, 0, 0);\n      return pipelineState;\n    },\n\n  };\n})();\n\n\n/**\n * @namespace fabric.Image.filters\n * @memberOf fabric.Image\n * @tutorial {@link http://fabricjs.com/fabric-intro-part-2#image_filters}\n * @see {@link http://fabricjs.com/image-filters|ImageFilters demo}\n */\nfabric.Image = fabric.Image || { };\nfabric.Image.filters = fabric.Image.filters || { };\n\n/**\n * Root filter class from which all filter classes inherit from\n * @class fabric.Image.filters.BaseFilter\n * @memberOf fabric.Image.filters\n */\nfabric.Image.filters.BaseFilter = fabric.util.createClass(/** @lends fabric.Image.filters.BaseFilter.prototype */ {\n\n  /**\n   * Filter type\n   * @param {String} type\n   * @default\n   */\n  type: 'BaseFilter',\n\n  /**\n   * Array of attributes to send with buffers. do not modify\n   * @private\n   */\n\n  vertexSource: 'attribute vec2 aPosition;\\n' +\n    'varying vec2 vTexCoord;\\n' +\n    'void main() {\\n' +\n      'vTexCoord = aPosition;\\n' +\n      'gl_Position = vec4(aPosition * 2.0 - 1.0, 0.0, 1.0);\\n' +\n    '}',\n\n  fragmentSource: 'precision highp float;\\n' +\n    'varying vec2 vTexCoord;\\n' +\n    'uniform sampler2D uTexture;\\n' +\n    'void main() {\\n' +\n      'gl_FragColor = texture2D(uTexture, vTexCoord);\\n' +\n    '}',\n\n  /**\n   * Constructor\n   * @param {Object} [options] Options object\n   */\n  initialize: function(options) {\n    if (options) {\n      this.setOptions(options);\n    }\n  },\n\n  /**\n   * Sets filter's properties from options\n   * @param {Object} [options] Options object\n   */\n  setOptions: function(options) {\n    for (var prop in options) {\n      this[prop] = options[prop];\n    }\n  },\n\n  /**\n   * Compile this filter's shader program.\n   *\n   * @param {WebGLRenderingContext} gl The GL canvas context to use for shader compilation.\n   * @param {String} fragmentSource fragmentShader source for compilation\n   * @param {String} vertexSource vertexShader source for compilation\n   */\n  createProgram: function(gl, fragmentSource, vertexSource) {\n    fragmentSource = fragmentSource || this.fragmentSource;\n    vertexSource = vertexSource || this.vertexSource;\n    if (fabric.webGlPrecision !== 'highp'){\n      fragmentSource = fragmentSource.replace(\n        /precision highp float/g,\n        'precision ' + fabric.webGlPrecision + ' float'\n      );\n    }\n    var vertexShader = gl.createShader(gl.VERTEX_SHADER);\n    gl.shaderSource(vertexShader, vertexSource);\n    gl.compileShader(vertexShader);\n    if (!gl.getShaderParameter(vertexShader, gl.COMPILE_STATUS)) {\n      throw new Error(\n        // eslint-disable-next-line prefer-template\n        'Vertex shader compile error for ' + this.type + ': ' +\n        gl.getShaderInfoLog(vertexShader)\n      );\n    }\n\n    var fragmentShader = gl.createShader(gl.FRAGMENT_SHADER);\n    gl.shaderSource(fragmentShader, fragmentSource);\n    gl.compileShader(fragmentShader);\n    if (!gl.getShaderParameter(fragmentShader, gl.COMPILE_STATUS)) {\n      throw new Error(\n        // eslint-disable-next-line prefer-template\n        'Fragment shader compile error for ' + this.type + ': ' +\n        gl.getShaderInfoLog(fragmentShader)\n      );\n    }\n\n    var program = gl.createProgram();\n    gl.attachShader(program, vertexShader);\n    gl.attachShader(program, fragmentShader);\n    gl.linkProgram(program);\n    if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {\n      throw new Error(\n        // eslint-disable-next-line prefer-template\n        'Shader link error for \"${this.type}\" ' +\n        gl.getProgramInfoLog(program)\n      );\n    }\n\n    var attributeLocations = this.getAttributeLocations(gl, program);\n    var uniformLocations = this.getUniformLocations(gl, program) || { };\n    uniformLocations.uStepW = gl.getUniformLocation(program, 'uStepW');\n    uniformLocations.uStepH = gl.getUniformLocation(program, 'uStepH');\n    return {\n      program: program,\n      attributeLocations: attributeLocations,\n      uniformLocations: uniformLocations\n    };\n  },\n\n  /**\n   * Return a map of attribute names to WebGLAttributeLocation objects.\n   *\n   * @param {WebGLRenderingContext} gl The canvas context used to compile the shader program.\n   * @param {WebGLShaderProgram} program The shader program from which to take attribute locations.\n   * @returns {Object} A map of attribute names to attribute locations.\n   */\n  getAttributeLocations: function(gl, program) {\n    return {\n      aPosition: gl.getAttribLocation(program, 'aPosition'),\n    };\n  },\n\n  /**\n   * Return a map of uniform names to WebGLUniformLocation objects.\n   *\n   * Intended to be overridden by subclasses.\n   *\n   * @param {WebGLRenderingContext} gl The canvas context used to compile the shader program.\n   * @param {WebGLShaderProgram} program The shader program from which to take uniform locations.\n   * @returns {Object} A map of uniform names to uniform locations.\n   */\n  getUniformLocations: function (/* gl, program */) {\n    // in case i do not need any special uniform i need to return an empty object\n    return { };\n  },\n\n  /**\n   * Send attribute data from this filter to its shader program on the GPU.\n   *\n   * @param {WebGLRenderingContext} gl The canvas context used to compile the shader program.\n   * @param {Object} attributeLocations A map of shader attribute names to their locations.\n   */\n  sendAttributeData: function(gl, attributeLocations, aPositionData) {\n    var attributeLocation = attributeLocations.aPosition;\n    var buffer = gl.createBuffer();\n    gl.bindBuffer(gl.ARRAY_BUFFER, buffer);\n    gl.enableVertexAttribArray(attributeLocation);\n    gl.vertexAttribPointer(attributeLocation, 2, gl.FLOAT, false, 0, 0);\n    gl.bufferData(gl.ARRAY_BUFFER, aPositionData, gl.STATIC_DRAW);\n  },\n\n  _setupFrameBuffer: function(options) {\n    var gl = options.context, width, height;\n    if (options.passes > 1) {\n      width = options.destinationWidth;\n      height = options.destinationHeight;\n      if (options.sourceWidth !== width || options.sourceHeight !== height) {\n        gl.deleteTexture(options.targetTexture);\n        options.targetTexture = options.filterBackend.createTexture(gl, width, height);\n      }\n      gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D,\n        options.targetTexture, 0);\n    }\n    else {\n      // draw last filter on canvas and not to framebuffer.\n      gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n      gl.finish();\n    }\n  },\n\n  _swapTextures: function(options) {\n    options.passes--;\n    options.pass++;\n    var temp = options.targetTexture;\n    options.targetTexture = options.sourceTexture;\n    options.sourceTexture = temp;\n  },\n\n  /**\n   * Generic isNeutral implementation for one parameter based filters.\n   * Used only in image applyFilters to discard filters that will not have an effect\n   * on the image\n   * Other filters may need their own version ( ColorMatrix, HueRotation, gamma, ComposedFilter )\n   * @param {Object} options\n   **/\n  isNeutralState: function(/* options */) {\n    var main = this.mainParameter,\n        _class = fabric.Image.filters[this.type].prototype;\n    if (main) {\n      if (Array.isArray(_class[main])) {\n        for (var i = _class[main].length; i--;) {\n          if (this[main][i] !== _class[main][i]) {\n            return false;\n          }\n        }\n        return true;\n      }\n      else {\n        return _class[main] === this[main];\n      }\n    }\n    else {\n      return false;\n    }\n  },\n\n  /**\n   * Apply this filter to the input image data provided.\n   *\n   * Determines whether to use WebGL or Canvas2D based on the options.webgl flag.\n   *\n   * @param {Object} options\n   * @param {Number} options.passes The number of filters remaining to be executed\n   * @param {Boolean} options.webgl Whether to use webgl to render the filter.\n   * @param {WebGLTexture} options.sourceTexture The texture setup as the source to be filtered.\n   * @param {WebGLTexture} options.targetTexture The texture where filtered output should be drawn.\n   * @param {WebGLRenderingContext} options.context The GL context used for rendering.\n   * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type.\n   */\n  applyTo: function(options) {\n    if (options.webgl) {\n      this._setupFrameBuffer(options);\n      this.applyToWebGL(options);\n      this._swapTextures(options);\n    }\n    else {\n      this.applyTo2d(options);\n    }\n  },\n\n  /**\n   * Retrieves the cached shader.\n   * @param {Object} options\n   * @param {WebGLRenderingContext} options.context The GL context used for rendering.\n   * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type.\n   */\n  retrieveShader: function(options) {\n    if (!options.programCache.hasOwnProperty(this.type)) {\n      options.programCache[this.type] = this.createProgram(options.context);\n    }\n    return options.programCache[this.type];\n  },\n\n  /**\n   * Apply this filter using webgl.\n   *\n   * @param {Object} options\n   * @param {Number} options.passes The number of filters remaining to be executed\n   * @param {Boolean} options.webgl Whether to use webgl to render the filter.\n   * @param {WebGLTexture} options.originalTexture The texture of the original input image.\n   * @param {WebGLTexture} options.sourceTexture The texture setup as the source to be filtered.\n   * @param {WebGLTexture} options.targetTexture The texture where filtered output should be drawn.\n   * @param {WebGLRenderingContext} options.context The GL context used for rendering.\n   * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type.\n   */\n  applyToWebGL: function(options) {\n    var gl = options.context;\n    var shader = this.retrieveShader(options);\n    if (options.pass === 0 && options.originalTexture) {\n      gl.bindTexture(gl.TEXTURE_2D, options.originalTexture);\n    }\n    else {\n      gl.bindTexture(gl.TEXTURE_2D, options.sourceTexture);\n    }\n    gl.useProgram(shader.program);\n    this.sendAttributeData(gl, shader.attributeLocations, options.aPosition);\n\n    gl.uniform1f(shader.uniformLocations.uStepW, 1 / options.sourceWidth);\n    gl.uniform1f(shader.uniformLocations.uStepH, 1 / options.sourceHeight);\n\n    this.sendUniformData(gl, shader.uniformLocations);\n    gl.viewport(0, 0, options.destinationWidth, options.destinationHeight);\n    gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);\n  },\n\n  bindAdditionalTexture: function(gl, texture, textureUnit) {\n    gl.activeTexture(textureUnit);\n    gl.bindTexture(gl.TEXTURE_2D, texture);\n    // reset active texture to 0 as usual\n    gl.activeTexture(gl.TEXTURE0);\n  },\n\n  unbindAdditionalTexture: function(gl, textureUnit) {\n    gl.activeTexture(textureUnit);\n    gl.bindTexture(gl.TEXTURE_2D, null);\n    gl.activeTexture(gl.TEXTURE0);\n  },\n\n  getMainParameter: function() {\n    return this[this.mainParameter];\n  },\n\n  setMainParameter: function(value) {\n    this[this.mainParameter] = value;\n  },\n\n  /**\n   * Send uniform data from this filter to its shader program on the GPU.\n   *\n   * Intended to be overridden by subclasses.\n   *\n   * @param {WebGLRenderingContext} gl The canvas context used to compile the shader program.\n   * @param {Object} uniformLocations A map of shader uniform names to their locations.\n   */\n  sendUniformData: function(/* gl, uniformLocations */) {\n    // Intentionally left blank.  Override me in subclasses.\n  },\n\n  /**\n   * If needed by a 2d filter, this functions can create an helper canvas to be used\n   * remember that options.targetCanvas is available for use till end of chain.\n   */\n  createHelpLayer: function(options) {\n    if (!options.helpLayer) {\n      var helpLayer = document.createElement('canvas');\n      helpLayer.width = options.sourceWidth;\n      helpLayer.height = options.sourceHeight;\n      options.helpLayer = helpLayer;\n    }\n  },\n\n  /**\n   * Returns object representation of an instance\n   * @return {Object} Object representation of an instance\n   */\n  toObject: function() {\n    var object = { type: this.type }, mainP = this.mainParameter;\n    if (mainP) {\n      object[mainP] = this[mainP];\n    }\n    return object;\n  },\n\n  /**\n   * Returns a JSON representation of an instance\n   * @return {Object} JSON\n   */\n  toJSON: function() {\n    // delegate, not alias\n    return this.toObject();\n  }\n});\n\nfabric.Image.filters.BaseFilter.fromObject = function(object, callback) {\n  var filter = new fabric.Image.filters[object.type](object);\n  callback && callback(filter);\n  return filter;\n};\n\n\n(function(global) {\n\n  'use strict';\n\n  var fabric  = global.fabric || (global.fabric = { }),\n      filters = fabric.Image.filters,\n      createClass = fabric.util.createClass;\n\n  /**\n   * Color Matrix filter class\n   * @class fabric.Image.filters.ColorMatrix\n   * @memberOf fabric.Image.filters\n   * @extends fabric.Image.filters.BaseFilter\n   * @see {@link fabric.Image.filters.ColorMatrix#initialize} for constructor definition\n   * @see {@link http://fabricjs.com/image-filters|ImageFilters demo}\n   * @see {@Link http://www.webwasp.co.uk/tutorials/219/Color_Matrix_Filter.php}\n   * @see {@Link http://phoboslab.org/log/2013/11/fast-image-filters-with-webgl}\n   * @example <caption>Kodachrome filter</caption>\n   * var filter = new fabric.Image.filters.ColorMatrix({\n   *  matrix: [\n       1.1285582396593525, -0.3967382283601348, -0.03992559172921793, 0, 63.72958762196502,\n       -0.16404339962244616, 1.0835251566291304, -0.05498805115633132, 0, 24.732407896706203,\n       -0.16786010706155763, -0.5603416277695248, 1.6014850761964943, 0, 35.62982807460946,\n       0, 0, 0, 1, 0\n      ]\n   * });\n   * object.filters.push(filter);\n   * object.applyFilters();\n   */\n  filters.ColorMatrix = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.ColorMatrix.prototype */ {\n\n    /**\n     * Filter type\n     * @param {String} type\n     * @default\n     */\n    type: 'ColorMatrix',\n\n    fragmentSource: 'precision highp float;\\n' +\n      'uniform sampler2D uTexture;\\n' +\n      'varying vec2 vTexCoord;\\n' +\n      'uniform mat4 uColorMatrix;\\n' +\n      'uniform vec4 uConstants;\\n' +\n      'void main() {\\n' +\n        'vec4 color = texture2D(uTexture, vTexCoord);\\n' +\n        'color *= uColorMatrix;\\n' +\n        'color += uConstants;\\n' +\n        'gl_FragColor = color;\\n' +\n      '}',\n\n    /**\n     * Colormatrix for pixels.\n     * array of 20 floats. Numbers in positions 4, 9, 14, 19 loose meaning\n     * outside the -1, 1 range.\n     * 0.0039215686 is the part of 1 that get translated to 1 in 2d\n     * @param {Array} matrix array of 20 numbers.\n     * @default\n     */\n    matrix: [\n      1, 0, 0, 0, 0,\n      0, 1, 0, 0, 0,\n      0, 0, 1, 0, 0,\n      0, 0, 0, 1, 0\n    ],\n\n    mainParameter: 'matrix',\n\n    /**\n     * Lock the colormatrix on the color part, skipping alpha, manly for non webgl scenario\n     * to save some calculation\n     */\n    colorsOnly: true,\n\n    /**\n     * Constructor\n     * @param {Object} [options] Options object\n     */\n    initialize: function(options) {\n      this.callSuper('initialize', options);\n      // create a new array instead mutating the prototype with push\n      this.matrix = this.matrix.slice(0);\n    },\n\n    /**\n     * Apply the ColorMatrix operation to a Uint8Array representing the pixels of an image.\n     *\n     * @param {Object} options\n     * @param {ImageData} options.imageData The Uint8Array to be filtered.\n     */\n    applyTo2d: function(options) {\n      var imageData = options.imageData,\n          data = imageData.data,\n          iLen = data.length,\n          m = this.matrix,\n          r, g, b, a, i, colorsOnly = this.colorsOnly;\n\n      for (i = 0; i < iLen; i += 4) {\n        r = data[i];\n        g = data[i + 1];\n        b = data[i + 2];\n        if (colorsOnly) {\n          data[i] = r * m[0] + g * m[1] + b * m[2] + m[4] * 255;\n          data[i + 1] = r * m[5] + g * m[6] + b * m[7] + m[9] * 255;\n          data[i + 2] = r * m[10] + g * m[11] + b * m[12] + m[14] * 255;\n        }\n        else {\n          a = data[i + 3];\n          data[i] = r * m[0] + g * m[1] + b * m[2] + a * m[3] + m[4] * 255;\n          data[i + 1] = r * m[5] + g * m[6] + b * m[7] + a * m[8] + m[9] * 255;\n          data[i + 2] = r * m[10] + g * m[11] + b * m[12] + a * m[13] + m[14] * 255;\n          data[i + 3] = r * m[15] + g * m[16] + b * m[17] + a * m[18] + m[19] * 255;\n        }\n      }\n    },\n\n    /**\n     * Return WebGL uniform locations for this filter's shader.\n     *\n     * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n     * @param {WebGLShaderProgram} program This filter's compiled shader program.\n     */\n    getUniformLocations: function(gl, program) {\n      return {\n        uColorMatrix: gl.getUniformLocation(program, 'uColorMatrix'),\n        uConstants: gl.getUniformLocation(program, 'uConstants'),\n      };\n    },\n\n    /**\n     * Send data from this filter to its shader program's uniforms.\n     *\n     * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n     * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n     */\n    sendUniformData: function(gl, uniformLocations) {\n      var m = this.matrix,\n          matrix = [\n            m[0], m[1], m[2], m[3],\n            m[5], m[6], m[7], m[8],\n            m[10], m[11], m[12], m[13],\n            m[15], m[16], m[17], m[18]\n          ],\n          constants = [m[4], m[9], m[14], m[19]];\n      gl.uniformMatrix4fv(uniformLocations.uColorMatrix, false, matrix);\n      gl.uniform4fv(uniformLocations.uConstants, constants);\n    },\n  });\n\n  /**\n   * Returns filter instance from an object representation\n   * @static\n   * @param {Object} object Object to create an instance from\n   * @param {function} [callback] function to invoke after filter creation\n   * @return {fabric.Image.filters.ColorMatrix} Instance of fabric.Image.filters.ColorMatrix\n   */\n  fabric.Image.filters.ColorMatrix.fromObject = fabric.Image.filters.BaseFilter.fromObject;\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n  'use strict';\n\n  var fabric  = global.fabric || (global.fabric = { }),\n      filters = fabric.Image.filters,\n      createClass = fabric.util.createClass;\n\n  /**\n   * Brightness filter class\n   * @class fabric.Image.filters.Brightness\n   * @memberOf fabric.Image.filters\n   * @extends fabric.Image.filters.BaseFilter\n   * @see {@link fabric.Image.filters.Brightness#initialize} for constructor definition\n   * @see {@link http://fabricjs.com/image-filters|ImageFilters demo}\n   * @example\n   * var filter = new fabric.Image.filters.Brightness({\n   *   brightness: 0.05\n   * });\n   * object.filters.push(filter);\n   * object.applyFilters();\n   */\n  filters.Brightness = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.Brightness.prototype */ {\n\n    /**\n     * Filter type\n     * @param {String} type\n     * @default\n     */\n    type: 'Brightness',\n\n    /**\n     * Fragment source for the brightness program\n     */\n    fragmentSource: 'precision highp float;\\n' +\n      'uniform sampler2D uTexture;\\n' +\n      'uniform float uBrightness;\\n' +\n      'varying vec2 vTexCoord;\\n' +\n      'void main() {\\n' +\n        'vec4 color = texture2D(uTexture, vTexCoord);\\n' +\n        'color.rgb += uBrightness;\\n' +\n        'gl_FragColor = color;\\n' +\n      '}',\n\n    /**\n     * Brightness value, from -1 to 1.\n     * translated to -255 to 255 for 2d\n     * 0.0039215686 is the part of 1 that get translated to 1 in 2d\n     * @param {Number} brightness\n     * @default\n     */\n    brightness: 0,\n\n    /**\n     * Describe the property that is the filter parameter\n     * @param {String} m\n     * @default\n     */\n    mainParameter: 'brightness',\n\n    /**\n    * Apply the Brightness operation to a Uint8ClampedArray representing the pixels of an image.\n    *\n    * @param {Object} options\n    * @param {ImageData} options.imageData The Uint8ClampedArray to be filtered.\n    */\n    applyTo2d: function(options) {\n      if (this.brightness === 0) {\n        return;\n      }\n      var imageData = options.imageData,\n          data = imageData.data, i, len = data.length,\n          brightness = Math.round(this.brightness * 255);\n      for (i = 0; i < len; i += 4) {\n        data[i] = data[i] + brightness;\n        data[i + 1] = data[i + 1] + brightness;\n        data[i + 2] = data[i + 2] + brightness;\n      }\n    },\n\n    /**\n     * Return WebGL uniform locations for this filter's shader.\n     *\n     * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n     * @param {WebGLShaderProgram} program This filter's compiled shader program.\n     */\n    getUniformLocations: function(gl, program) {\n      return {\n        uBrightness: gl.getUniformLocation(program, 'uBrightness'),\n      };\n    },\n\n    /**\n     * Send data from this filter to its shader program's uniforms.\n     *\n     * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n     * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n     */\n    sendUniformData: function(gl, uniformLocations) {\n      gl.uniform1f(uniformLocations.uBrightness, this.brightness);\n    },\n  });\n\n  /**\n   * Returns filter instance from an object representation\n   * @static\n   * @param {Object} object Object to create an instance from\n   * @param {function} [callback] to be invoked after filter creation\n   * @return {fabric.Image.filters.Brightness} Instance of fabric.Image.filters.Brightness\n   */\n  fabric.Image.filters.Brightness.fromObject = fabric.Image.filters.BaseFilter.fromObject;\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n  'use strict';\n\n  var fabric  = global.fabric || (global.fabric = { }),\n      extend = fabric.util.object.extend,\n      filters = fabric.Image.filters,\n      createClass = fabric.util.createClass;\n\n  /**\n   * Adapted from <a href=\"http://www.html5rocks.com/en/tutorials/canvas/imagefilters/\">html5rocks article</a>\n   * @class fabric.Image.filters.Convolute\n   * @memberOf fabric.Image.filters\n   * @extends fabric.Image.filters.BaseFilter\n   * @see {@link fabric.Image.filters.Convolute#initialize} for constructor definition\n   * @see {@link http://fabricjs.com/image-filters|ImageFilters demo}\n   * @example <caption>Sharpen filter</caption>\n   * var filter = new fabric.Image.filters.Convolute({\n   *   matrix: [ 0, -1,  0,\n   *            -1,  5, -1,\n   *             0, -1,  0 ]\n   * });\n   * object.filters.push(filter);\n   * object.applyFilters();\n   * canvas.renderAll();\n   * @example <caption>Blur filter</caption>\n   * var filter = new fabric.Image.filters.Convolute({\n   *   matrix: [ 1/9, 1/9, 1/9,\n   *             1/9, 1/9, 1/9,\n   *             1/9, 1/9, 1/9 ]\n   * });\n   * object.filters.push(filter);\n   * object.applyFilters();\n   * canvas.renderAll();\n   * @example <caption>Emboss filter</caption>\n   * var filter = new fabric.Image.filters.Convolute({\n   *   matrix: [ 1,   1,  1,\n   *             1, 0.7, -1,\n   *            -1,  -1, -1 ]\n   * });\n   * object.filters.push(filter);\n   * object.applyFilters();\n   * canvas.renderAll();\n   * @example <caption>Emboss filter with opaqueness</caption>\n   * var filter = new fabric.Image.filters.Convolute({\n   *   opaque: true,\n   *   matrix: [ 1,   1,  1,\n   *             1, 0.7, -1,\n   *            -1,  -1, -1 ]\n   * });\n   * object.filters.push(filter);\n   * object.applyFilters();\n   * canvas.renderAll();\n   */\n  filters.Convolute = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.Convolute.prototype */ {\n\n    /**\n     * Filter type\n     * @param {String} type\n     * @default\n     */\n    type: 'Convolute',\n\n    /*\n     * Opaque value (true/false)\n     */\n    opaque: false,\n\n    /*\n     * matrix for the filter, max 9x9\n     */\n    matrix: [0, 0, 0, 0, 1, 0, 0, 0, 0],\n\n    /**\n     * Fragment source for the brightness program\n     */\n    fragmentSource: {\n      Convolute_3_1: 'precision highp float;\\n' +\n        'uniform sampler2D uTexture;\\n' +\n        'uniform float uMatrix[9];\\n' +\n        'uniform float uStepW;\\n' +\n        'uniform float uStepH;\\n' +\n        'varying vec2 vTexCoord;\\n' +\n        'void main() {\\n' +\n          'vec4 color = vec4(0, 0, 0, 0);\\n' +\n          'for (float h = 0.0; h < 3.0; h+=1.0) {\\n' +\n            'for (float w = 0.0; w < 3.0; w+=1.0) {\\n' +\n              'vec2 matrixPos = vec2(uStepW * (w - 1), uStepH * (h - 1));\\n' +\n              'color += texture2D(uTexture, vTexCoord + matrixPos) * uMatrix[int(h * 3.0 + w)];\\n' +\n            '}\\n' +\n          '}\\n' +\n          'gl_FragColor = color;\\n' +\n        '}',\n      Convolute_3_0: 'precision highp float;\\n' +\n        'uniform sampler2D uTexture;\\n' +\n        'uniform float uMatrix[9];\\n' +\n        'uniform float uStepW;\\n' +\n        'uniform float uStepH;\\n' +\n        'varying vec2 vTexCoord;\\n' +\n        'void main() {\\n' +\n          'vec4 color = vec4(0, 0, 0, 1);\\n' +\n          'for (float h = 0.0; h < 3.0; h+=1.0) {\\n' +\n            'for (float w = 0.0; w < 3.0; w+=1.0) {\\n' +\n              'vec2 matrixPos = vec2(uStepW * (w - 1.0), uStepH * (h - 1.0));\\n' +\n              'color.rgb += texture2D(uTexture, vTexCoord + matrixPos).rgb * uMatrix[int(h * 3.0 + w)];\\n' +\n            '}\\n' +\n          '}\\n' +\n          'float alpha = texture2D(uTexture, vTexCoord).a;\\n' +\n          'gl_FragColor = color;\\n' +\n          'gl_FragColor.a = alpha;\\n' +\n        '}',\n      Convolute_5_1: 'precision highp float;\\n' +\n        'uniform sampler2D uTexture;\\n' +\n        'uniform float uMatrix[25];\\n' +\n        'uniform float uStepW;\\n' +\n        'uniform float uStepH;\\n' +\n        'varying vec2 vTexCoord;\\n' +\n        'void main() {\\n' +\n          'vec4 color = vec4(0, 0, 0, 0);\\n' +\n          'for (float h = 0.0; h < 5.0; h+=1.0) {\\n' +\n            'for (float w = 0.0; w < 5.0; w+=1.0) {\\n' +\n              'vec2 matrixPos = vec2(uStepW * (w - 2.0), uStepH * (h - 2.0));\\n' +\n              'color += texture2D(uTexture, vTexCoord + matrixPos) * uMatrix[int(h * 5.0 + w)];\\n' +\n            '}\\n' +\n          '}\\n' +\n          'gl_FragColor = color;\\n' +\n        '}',\n      Convolute_5_0: 'precision highp float;\\n' +\n        'uniform sampler2D uTexture;\\n' +\n        'uniform float uMatrix[25];\\n' +\n        'uniform float uStepW;\\n' +\n        'uniform float uStepH;\\n' +\n        'varying vec2 vTexCoord;\\n' +\n        'void main() {\\n' +\n          'vec4 color = vec4(0, 0, 0, 1);\\n' +\n          'for (float h = 0.0; h < 5.0; h+=1.0) {\\n' +\n            'for (float w = 0.0; w < 5.0; w+=1.0) {\\n' +\n              'vec2 matrixPos = vec2(uStepW * (w - 2.0), uStepH * (h - 2.0));\\n' +\n              'color.rgb += texture2D(uTexture, vTexCoord + matrixPos).rgb * uMatrix[int(h * 5.0 + w)];\\n' +\n            '}\\n' +\n          '}\\n' +\n          'float alpha = texture2D(uTexture, vTexCoord).a;\\n' +\n          'gl_FragColor = color;\\n' +\n          'gl_FragColor.a = alpha;\\n' +\n        '}',\n      Convolute_7_1: 'precision highp float;\\n' +\n        'uniform sampler2D uTexture;\\n' +\n        'uniform float uMatrix[49];\\n' +\n        'uniform float uStepW;\\n' +\n        'uniform float uStepH;\\n' +\n        'varying vec2 vTexCoord;\\n' +\n        'void main() {\\n' +\n          'vec4 color = vec4(0, 0, 0, 0);\\n' +\n          'for (float h = 0.0; h < 7.0; h+=1.0) {\\n' +\n            'for (float w = 0.0; w < 7.0; w+=1.0) {\\n' +\n              'vec2 matrixPos = vec2(uStepW * (w - 3.0), uStepH * (h - 3.0));\\n' +\n              'color += texture2D(uTexture, vTexCoord + matrixPos) * uMatrix[int(h * 7.0 + w)];\\n' +\n            '}\\n' +\n          '}\\n' +\n          'gl_FragColor = color;\\n' +\n        '}',\n      Convolute_7_0: 'precision highp float;\\n' +\n        'uniform sampler2D uTexture;\\n' +\n        'uniform float uMatrix[49];\\n' +\n        'uniform float uStepW;\\n' +\n        'uniform float uStepH;\\n' +\n        'varying vec2 vTexCoord;\\n' +\n        'void main() {\\n' +\n          'vec4 color = vec4(0, 0, 0, 1);\\n' +\n          'for (float h = 0.0; h < 7.0; h+=1.0) {\\n' +\n            'for (float w = 0.0; w < 7.0; w+=1.0) {\\n' +\n              'vec2 matrixPos = vec2(uStepW * (w - 3.0), uStepH * (h - 3.0));\\n' +\n              'color.rgb += texture2D(uTexture, vTexCoord + matrixPos).rgb * uMatrix[int(h * 7.0 + w)];\\n' +\n            '}\\n' +\n          '}\\n' +\n          'float alpha = texture2D(uTexture, vTexCoord).a;\\n' +\n          'gl_FragColor = color;\\n' +\n          'gl_FragColor.a = alpha;\\n' +\n        '}',\n      Convolute_9_1: 'precision highp float;\\n' +\n        'uniform sampler2D uTexture;\\n' +\n        'uniform float uMatrix[81];\\n' +\n        'uniform float uStepW;\\n' +\n        'uniform float uStepH;\\n' +\n        'varying vec2 vTexCoord;\\n' +\n        'void main() {\\n' +\n          'vec4 color = vec4(0, 0, 0, 0);\\n' +\n          'for (float h = 0.0; h < 9.0; h+=1.0) {\\n' +\n            'for (float w = 0.0; w < 9.0; w+=1.0) {\\n' +\n              'vec2 matrixPos = vec2(uStepW * (w - 4.0), uStepH * (h - 4.0));\\n' +\n              'color += texture2D(uTexture, vTexCoord + matrixPos) * uMatrix[int(h * 9.0 + w)];\\n' +\n            '}\\n' +\n          '}\\n' +\n          'gl_FragColor = color;\\n' +\n        '}',\n      Convolute_9_0: 'precision highp float;\\n' +\n        'uniform sampler2D uTexture;\\n' +\n        'uniform float uMatrix[81];\\n' +\n        'uniform float uStepW;\\n' +\n        'uniform float uStepH;\\n' +\n        'varying vec2 vTexCoord;\\n' +\n        'void main() {\\n' +\n          'vec4 color = vec4(0, 0, 0, 1);\\n' +\n          'for (float h = 0.0; h < 9.0; h+=1.0) {\\n' +\n            'for (float w = 0.0; w < 9.0; w+=1.0) {\\n' +\n              'vec2 matrixPos = vec2(uStepW * (w - 4.0), uStepH * (h - 4.0));\\n' +\n              'color.rgb += texture2D(uTexture, vTexCoord + matrixPos).rgb * uMatrix[int(h * 9.0 + w)];\\n' +\n            '}\\n' +\n          '}\\n' +\n          'float alpha = texture2D(uTexture, vTexCoord).a;\\n' +\n          'gl_FragColor = color;\\n' +\n          'gl_FragColor.a = alpha;\\n' +\n        '}',\n    },\n\n    /**\n     * Constructor\n     * @memberOf fabric.Image.filters.Convolute.prototype\n     * @param {Object} [options] Options object\n     * @param {Boolean} [options.opaque=false] Opaque value (true/false)\n     * @param {Array} [options.matrix] Filter matrix\n     */\n\n\n    /**\n    * Retrieves the cached shader.\n    * @param {Object} options\n    * @param {WebGLRenderingContext} options.context The GL context used for rendering.\n    * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type.\n    */\n    retrieveShader: function(options) {\n      var size = Math.sqrt(this.matrix.length);\n      var cacheKey = this.type + '_' + size + '_' + (this.opaque ? 1 : 0);\n      var shaderSource = this.fragmentSource[cacheKey];\n      if (!options.programCache.hasOwnProperty(cacheKey)) {\n        options.programCache[cacheKey] = this.createProgram(options.context, shaderSource);\n      }\n      return options.programCache[cacheKey];\n    },\n\n    /**\n     * Apply the Brightness operation to a Uint8ClampedArray representing the pixels of an image.\n     *\n     * @param {Object} options\n     * @param {ImageData} options.imageData The Uint8ClampedArray to be filtered.\n     */\n    applyTo2d: function(options) {\n      var imageData = options.imageData,\n          data = imageData.data,\n          weights = this.matrix,\n          side = Math.round(Math.sqrt(weights.length)),\n          halfSide = Math.floor(side / 2),\n          sw = imageData.width,\n          sh = imageData.height,\n          output = options.ctx.createImageData(sw, sh),\n          dst = output.data,\n          // go through the destination image pixels\n          alphaFac = this.opaque ? 1 : 0,\n          r, g, b, a, dstOff,\n          scx, scy, srcOff, wt,\n          x, y, cx, cy;\n\n      for (y = 0; y < sh; y++) {\n        for (x = 0; x < sw; x++) {\n          dstOff = (y * sw + x) * 4;\n          // calculate the weighed sum of the source image pixels that\n          // fall under the convolution matrix\n          r = 0; g = 0; b = 0; a = 0;\n\n          for (cy = 0; cy < side; cy++) {\n            for (cx = 0; cx < side; cx++) {\n              scy = y + cy - halfSide;\n              scx = x + cx - halfSide;\n\n              // eslint-disable-next-line max-depth\n              if (scy < 0 || scy >= sh || scx < 0 || scx >= sw) {\n                continue;\n              }\n\n              srcOff = (scy * sw + scx) * 4;\n              wt = weights[cy * side + cx];\n\n              r += data[srcOff] * wt;\n              g += data[srcOff + 1] * wt;\n              b += data[srcOff + 2] * wt;\n              // eslint-disable-next-line max-depth\n              if (!alphaFac) {\n                a += data[srcOff + 3] * wt;\n              }\n            }\n          }\n          dst[dstOff] = r;\n          dst[dstOff + 1] = g;\n          dst[dstOff + 2] = b;\n          if (!alphaFac) {\n            dst[dstOff + 3] = a;\n          }\n          else {\n            dst[dstOff + 3] = data[dstOff + 3];\n          }\n        }\n      }\n      options.imageData = output;\n    },\n\n    /**\n     * Return WebGL uniform locations for this filter's shader.\n     *\n     * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n     * @param {WebGLShaderProgram} program This filter's compiled shader program.\n     */\n    getUniformLocations: function(gl, program) {\n      return {\n        uMatrix: gl.getUniformLocation(program, 'uMatrix'),\n        uOpaque: gl.getUniformLocation(program, 'uOpaque'),\n        uHalfSize: gl.getUniformLocation(program, 'uHalfSize'),\n        uSize: gl.getUniformLocation(program, 'uSize'),\n      };\n    },\n\n    /**\n     * Send data from this filter to its shader program's uniforms.\n     *\n     * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n     * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n     */\n    sendUniformData: function(gl, uniformLocations) {\n      gl.uniform1fv(uniformLocations.uMatrix, this.matrix);\n    },\n\n    /**\n     * Returns object representation of an instance\n     * @return {Object} Object representation of an instance\n     */\n    toObject: function() {\n      return extend(this.callSuper('toObject'), {\n        opaque: this.opaque,\n        matrix: this.matrix\n      });\n    }\n  });\n\n  /**\n   * Returns filter instance from an object representation\n   * @static\n   * @param {Object} object Object to create an instance from\n   * @param {function} [callback] to be invoked after filter creation\n   * @return {fabric.Image.filters.Convolute} Instance of fabric.Image.filters.Convolute\n   */\n  fabric.Image.filters.Convolute.fromObject = fabric.Image.filters.BaseFilter.fromObject;\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n  'use strict';\n\n  var fabric  = global.fabric || (global.fabric = { }),\n      filters = fabric.Image.filters,\n      createClass = fabric.util.createClass;\n\n  /**\n   * Grayscale image filter class\n   * @class fabric.Image.filters.Grayscale\n   * @memberOf fabric.Image.filters\n   * @extends fabric.Image.filters.BaseFilter\n   * @see {@link http://fabricjs.com/image-filters|ImageFilters demo}\n   * @example\n   * var filter = new fabric.Image.filters.Grayscale();\n   * object.filters.push(filter);\n   * object.applyFilters();\n   */\n  filters.Grayscale = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.Grayscale.prototype */ {\n\n    /**\n     * Filter type\n     * @param {String} type\n     * @default\n     */\n    type: 'Grayscale',\n\n    fragmentSource: {\n      average: 'precision highp float;\\n' +\n        'uniform sampler2D uTexture;\\n' +\n        'varying vec2 vTexCoord;\\n' +\n        'void main() {\\n' +\n          'vec4 color = texture2D(uTexture, vTexCoord);\\n' +\n          'float average = (color.r + color.b + color.g) / 3.0;\\n' +\n          'gl_FragColor = vec4(average, average, average, color.a);\\n' +\n        '}',\n      lightness: 'precision highp float;\\n' +\n        'uniform sampler2D uTexture;\\n' +\n        'uniform int uMode;\\n' +\n        'varying vec2 vTexCoord;\\n' +\n        'void main() {\\n' +\n          'vec4 col = texture2D(uTexture, vTexCoord);\\n' +\n          'float average = (max(max(col.r, col.g),col.b) + min(min(col.r, col.g),col.b)) / 2.0;\\n' +\n          'gl_FragColor = vec4(average, average, average, col.a);\\n' +\n        '}',\n      luminosity: 'precision highp float;\\n' +\n        'uniform sampler2D uTexture;\\n' +\n        'uniform int uMode;\\n' +\n        'varying vec2 vTexCoord;\\n' +\n        'void main() {\\n' +\n          'vec4 col = texture2D(uTexture, vTexCoord);\\n' +\n          'float average = 0.21 * col.r + 0.72 * col.g + 0.07 * col.b;\\n' +\n          'gl_FragColor = vec4(average, average, average, col.a);\\n' +\n        '}',\n    },\n\n\n    /**\n     * Grayscale mode, between 'average', 'lightness', 'luminosity'\n     * @param {String} type\n     * @default\n     */\n    mode: 'average',\n\n    mainParameter: 'mode',\n\n    /**\n     * Apply the Grayscale operation to a Uint8Array representing the pixels of an image.\n     *\n     * @param {Object} options\n     * @param {ImageData} options.imageData The Uint8Array to be filtered.\n     */\n    applyTo2d: function(options) {\n      var imageData = options.imageData,\n          data = imageData.data, i,\n          len = data.length, value,\n          mode = this.mode;\n      for (i = 0; i < len; i += 4) {\n        if (mode === 'average') {\n          value = (data[i] + data[i + 1] + data[i + 2]) / 3;\n        }\n        else if (mode === 'lightness') {\n          value = (Math.min(data[i], data[i + 1], data[i + 2]) +\n            Math.max(data[i], data[i + 1], data[i + 2])) / 2;\n        }\n        else if (mode === 'luminosity') {\n          value = 0.21 * data[i] + 0.72 * data[i + 1] + 0.07 * data[i + 2];\n        }\n        data[i] = value;\n        data[i + 1] = value;\n        data[i + 2] = value;\n      }\n    },\n\n    /**\n     * Retrieves the cached shader.\n     * @param {Object} options\n     * @param {WebGLRenderingContext} options.context The GL context used for rendering.\n     * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type.\n     */\n    retrieveShader: function(options) {\n      var cacheKey = this.type + '_' + this.mode;\n      if (!options.programCache.hasOwnProperty(cacheKey)) {\n        var shaderSource = this.fragmentSource[this.mode];\n        options.programCache[cacheKey] = this.createProgram(options.context, shaderSource);\n      }\n      return options.programCache[cacheKey];\n    },\n\n    /**\n     * Return WebGL uniform locations for this filter's shader.\n     *\n     * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n     * @param {WebGLShaderProgram} program This filter's compiled shader program.\n     */\n    getUniformLocations: function(gl, program) {\n      return {\n        uMode: gl.getUniformLocation(program, 'uMode'),\n      };\n    },\n\n    /**\n     * Send data from this filter to its shader program's uniforms.\n     *\n     * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n     * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n     */\n    sendUniformData: function(gl, uniformLocations) {\n      // default average mode.\n      var mode = 1;\n      gl.uniform1i(uniformLocations.uMode, mode);\n    },\n\n    /**\n     * Grayscale filter isNeutralState implementation\n     * The filter is never neutral\n     * on the image\n     **/\n    isNeutralState: function() {\n      return false;\n    },\n  });\n\n  /**\n   * Returns filter instance from an object representation\n   * @static\n   * @param {Object} object Object to create an instance from\n   * @param {function} [callback] to be invoked after filter creation\n   * @return {fabric.Image.filters.Grayscale} Instance of fabric.Image.filters.Grayscale\n   */\n  fabric.Image.filters.Grayscale.fromObject = fabric.Image.filters.BaseFilter.fromObject;\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n  'use strict';\n\n  var fabric  = global.fabric || (global.fabric = { }),\n      filters = fabric.Image.filters,\n      createClass = fabric.util.createClass;\n\n  /**\n   * Invert filter class\n   * @class fabric.Image.filters.Invert\n   * @memberOf fabric.Image.filters\n   * @extends fabric.Image.filters.BaseFilter\n   * @see {@link http://fabricjs.com/image-filters|ImageFilters demo}\n   * @example\n   * var filter = new fabric.Image.filters.Invert();\n   * object.filters.push(filter);\n   * object.applyFilters(canvas.renderAll.bind(canvas));\n   */\n  filters.Invert = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.Invert.prototype */ {\n\n    /**\n     * Filter type\n     * @param {String} type\n     * @default\n     */\n    type: 'Invert',\n\n    fragmentSource: 'precision highp float;\\n' +\n      'uniform sampler2D uTexture;\\n' +\n      'uniform int uInvert;\\n' +\n      'varying vec2 vTexCoord;\\n' +\n      'void main() {\\n' +\n        'vec4 color = texture2D(uTexture, vTexCoord);\\n' +\n        'if (uInvert == 1) {\\n' +\n          'gl_FragColor = vec4(1.0 - color.r,1.0 -color.g,1.0 -color.b,color.a);\\n' +\n        '} else {\\n' +\n          'gl_FragColor = color;\\n' +\n        '}\\n' +\n      '}',\n\n    /**\n     * Filter invert. if false, does nothing\n     * @param {Boolean} invert\n     * @default\n     */\n    invert: true,\n\n    mainParameter: 'invert',\n\n    /**\n     * Apply the Invert operation to a Uint8Array representing the pixels of an image.\n     *\n     * @param {Object} options\n     * @param {ImageData} options.imageData The Uint8Array to be filtered.\n     */\n    applyTo2d: function(options) {\n      var imageData = options.imageData,\n          data = imageData.data, i,\n          len = data.length;\n      for (i = 0; i < len; i += 4) {\n        data[i] = 255 - data[i];\n        data[i + 1] = 255 - data[i + 1];\n        data[i + 2] = 255 - data[i + 2];\n      }\n    },\n\n    /**\n     * Invert filter isNeutralState implementation\n     * Used only in image applyFilters to discard filters that will not have an effect\n     * on the image\n     * @param {Object} options\n     **/\n    isNeutralState: function() {\n      return !this.invert;\n    },\n\n    /**\n     * Return WebGL uniform locations for this filter's shader.\n     *\n     * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n     * @param {WebGLShaderProgram} program This filter's compiled shader program.\n     */\n    getUniformLocations: function(gl, program) {\n      return {\n        uInvert: gl.getUniformLocation(program, 'uInvert'),\n      };\n    },\n\n    /**\n     * Send data from this filter to its shader program's uniforms.\n     *\n     * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n     * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n     */\n    sendUniformData: function(gl, uniformLocations) {\n      gl.uniform1i(uniformLocations.uInvert, this.invert);\n    },\n  });\n\n  /**\n   * Returns filter instance from an object representation\n   * @static\n   * @param {Object} object Object to create an instance from\n   * @param {function} [callback] to be invoked after filter creation\n   * @return {fabric.Image.filters.Invert} Instance of fabric.Image.filters.Invert\n   */\n  fabric.Image.filters.Invert.fromObject = fabric.Image.filters.BaseFilter.fromObject;\n\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n  'use strict';\n\n  var fabric  = global.fabric || (global.fabric = { }),\n      extend = fabric.util.object.extend,\n      filters = fabric.Image.filters,\n      createClass = fabric.util.createClass;\n\n  /**\n   * Noise filter class\n   * @class fabric.Image.filters.Noise\n   * @memberOf fabric.Image.filters\n   * @extends fabric.Image.filters.BaseFilter\n   * @see {@link fabric.Image.filters.Noise#initialize} for constructor definition\n   * @see {@link http://fabricjs.com/image-filters|ImageFilters demo}\n   * @example\n   * var filter = new fabric.Image.filters.Noise({\n   *   noise: 700\n   * });\n   * object.filters.push(filter);\n   * object.applyFilters();\n   * canvas.renderAll();\n   */\n  filters.Noise = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.Noise.prototype */ {\n\n    /**\n     * Filter type\n     * @param {String} type\n     * @default\n     */\n    type: 'Noise',\n\n    /**\n     * Fragment source for the noise program\n     */\n    fragmentSource: 'precision highp float;\\n' +\n      'uniform sampler2D uTexture;\\n' +\n      'uniform float uStepH;\\n' +\n      'uniform float uNoise;\\n' +\n      'uniform float uSeed;\\n' +\n      'varying vec2 vTexCoord;\\n' +\n      'float rand(vec2 co, float seed, float vScale) {\\n' +\n        'return fract(sin(dot(co.xy * vScale ,vec2(12.9898 , 78.233))) * 43758.5453 * (seed + 0.01) / 2.0);\\n' +\n      '}\\n' +\n      'void main() {\\n' +\n        'vec4 color = texture2D(uTexture, vTexCoord);\\n' +\n        'color.rgb += (0.5 - rand(vTexCoord, uSeed, 0.1 / uStepH)) * uNoise;\\n' +\n        'gl_FragColor = color;\\n' +\n      '}',\n\n    /**\n     * Describe the property that is the filter parameter\n     * @param {String} m\n     * @default\n     */\n    mainParameter: 'noise',\n\n    /**\n     * Noise value, from\n     * @param {Number} noise\n     * @default\n     */\n    noise: 0,\n\n    /**\n     * Apply the Brightness operation to a Uint8ClampedArray representing the pixels of an image.\n     *\n     * @param {Object} options\n     * @param {ImageData} options.imageData The Uint8ClampedArray to be filtered.\n     */\n    applyTo2d: function(options) {\n      if (this.noise === 0) {\n        return;\n      }\n      var imageData = options.imageData,\n          data = imageData.data, i, len = data.length,\n          noise = this.noise, rand;\n\n      for (i = 0, len = data.length; i < len; i += 4) {\n\n        rand = (0.5 - Math.random()) * noise;\n\n        data[i] += rand;\n        data[i + 1] += rand;\n        data[i + 2] += rand;\n      }\n    },\n\n    /**\n     * Return WebGL uniform locations for this filter's shader.\n     *\n     * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n     * @param {WebGLShaderProgram} program This filter's compiled shader program.\n     */\n    getUniformLocations: function(gl, program) {\n      return {\n        uNoise: gl.getUniformLocation(program, 'uNoise'),\n        uSeed: gl.getUniformLocation(program, 'uSeed'),\n      };\n    },\n\n    /**\n     * Send data from this filter to its shader program's uniforms.\n     *\n     * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n     * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n     */\n    sendUniformData: function(gl, uniformLocations) {\n      gl.uniform1f(uniformLocations.uNoise, this.noise / 255);\n      gl.uniform1f(uniformLocations.uSeed, Math.random());\n    },\n\n    /**\n     * Returns object representation of an instance\n     * @return {Object} Object representation of an instance\n     */\n    toObject: function() {\n      return extend(this.callSuper('toObject'), {\n        noise: this.noise\n      });\n    }\n  });\n\n  /**\n   * Returns filter instance from an object representation\n   * @static\n   * @param {Object} object Object to create an instance from\n   * @param {Function} [callback] to be invoked after filter creation\n   * @return {fabric.Image.filters.Noise} Instance of fabric.Image.filters.Noise\n   */\n  fabric.Image.filters.Noise.fromObject = fabric.Image.filters.BaseFilter.fromObject;\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n  'use strict';\n\n  var fabric  = global.fabric || (global.fabric = { }),\n      filters = fabric.Image.filters,\n      createClass = fabric.util.createClass;\n\n  /**\n   * Pixelate filter class\n   * @class fabric.Image.filters.Pixelate\n   * @memberOf fabric.Image.filters\n   * @extends fabric.Image.filters.BaseFilter\n   * @see {@link fabric.Image.filters.Pixelate#initialize} for constructor definition\n   * @see {@link http://fabricjs.com/image-filters|ImageFilters demo}\n   * @example\n   * var filter = new fabric.Image.filters.Pixelate({\n   *   blocksize: 8\n   * });\n   * object.filters.push(filter);\n   * object.applyFilters();\n   */\n  filters.Pixelate = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.Pixelate.prototype */ {\n\n    /**\n     * Filter type\n     * @param {String} type\n     * @default\n     */\n    type: 'Pixelate',\n\n    blocksize: 4,\n\n    mainParameter: 'blocksize',\n\n    /**\n     * Fragment source for the Pixelate program\n     */\n    fragmentSource: 'precision highp float;\\n' +\n      'uniform sampler2D uTexture;\\n' +\n      'uniform float uBlocksize;\\n' +\n      'uniform float uStepW;\\n' +\n      'uniform float uStepH;\\n' +\n      'varying vec2 vTexCoord;\\n' +\n      'void main() {\\n' +\n        'float blockW = uBlocksize * uStepW;\\n' +\n        'float blockH = uBlocksize * uStepW;\\n' +\n        'int posX = int(vTexCoord.x / blockW);\\n' +\n        'int posY = int(vTexCoord.y / blockH);\\n' +\n        'float fposX = float(posX);\\n' +\n        'float fposY = float(posY);\\n' +\n        'vec2 squareCoords = vec2(fposX * blockW, fposY * blockH);\\n' +\n        'vec4 color = texture2D(uTexture, squareCoords);\\n' +\n        'gl_FragColor = color;\\n' +\n      '}',\n\n    /**\n     * Apply the Pixelate operation to a Uint8ClampedArray representing the pixels of an image.\n     *\n     * @param {Object} options\n     * @param {ImageData} options.imageData The Uint8ClampedArray to be filtered.\n     */\n    applyTo2d: function(options) {\n      var imageData = options.imageData,\n          data = imageData.data,\n          iLen = imageData.height,\n          jLen = imageData.width,\n          index, i, j, r, g, b, a,\n          _i, _j, _iLen, _jLen;\n\n      for (i = 0; i < iLen; i += this.blocksize) {\n        for (j = 0; j < jLen; j += this.blocksize) {\n\n          index = (i * 4) * jLen + (j * 4);\n\n          r = data[index];\n          g = data[index + 1];\n          b = data[index + 2];\n          a = data[index + 3];\n\n          _iLen = Math.min(i + this.blocksize, iLen);\n          _jLen = Math.min(j + this.blocksize, jLen);\n          for (_i = i; _i < _iLen; _i++) {\n            for (_j = j; _j < _jLen; _j++) {\n              index = (_i * 4) * jLen + (_j * 4);\n              data[index] = r;\n              data[index + 1] = g;\n              data[index + 2] = b;\n              data[index + 3] = a;\n            }\n          }\n        }\n      }\n    },\n\n    /**\n     * Indicate when the filter is not gonna apply changes to the image\n     **/\n    isNeutralState: function() {\n      return this.blocksize === 1;\n    },\n\n    /**\n     * Return WebGL uniform locations for this filter's shader.\n     *\n     * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n     * @param {WebGLShaderProgram} program This filter's compiled shader program.\n     */\n    getUniformLocations: function(gl, program) {\n      return {\n        uBlocksize: gl.getUniformLocation(program, 'uBlocksize'),\n        uStepW: gl.getUniformLocation(program, 'uStepW'),\n        uStepH: gl.getUniformLocation(program, 'uStepH'),\n      };\n    },\n\n    /**\n     * Send data from this filter to its shader program's uniforms.\n     *\n     * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n     * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n     */\n    sendUniformData: function(gl, uniformLocations) {\n      gl.uniform1f(uniformLocations.uBlocksize, this.blocksize);\n    },\n  });\n\n  /**\n   * Returns filter instance from an object representation\n   * @static\n   * @param {Object} object Object to create an instance from\n   * @param {Function} [callback] to be invoked after filter creation\n   * @return {fabric.Image.filters.Pixelate} Instance of fabric.Image.filters.Pixelate\n   */\n  fabric.Image.filters.Pixelate.fromObject = fabric.Image.filters.BaseFilter.fromObject;\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n  'use strict';\n\n  var fabric  = global.fabric || (global.fabric = { }),\n      extend = fabric.util.object.extend,\n      filters = fabric.Image.filters,\n      createClass = fabric.util.createClass;\n\n  /**\n   * Remove white filter class\n   * @class fabric.Image.filters.RemoveColor\n   * @memberOf fabric.Image.filters\n   * @extends fabric.Image.filters.BaseFilter\n   * @see {@link fabric.Image.filters.RemoveColor#initialize} for constructor definition\n   * @see {@link http://fabricjs.com/image-filters|ImageFilters demo}\n   * @example\n   * var filter = new fabric.Image.filters.RemoveColor({\n   *   threshold: 0.2,\n   * });\n   * object.filters.push(filter);\n   * object.applyFilters();\n   * canvas.renderAll();\n   */\n  filters.RemoveColor = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.RemoveColor.prototype */ {\n\n    /**\n     * Filter type\n     * @param {String} type\n     * @default\n     */\n    type: 'RemoveColor',\n\n    /**\n     * Color to remove, in any format understood by fabric.Color.\n     * @param {String} type\n     * @default\n     */\n    color: '#FFFFFF',\n\n    /**\n     * Fragment source for the brightness program\n     */\n    fragmentSource: 'precision highp float;\\n' +\n      'uniform sampler2D uTexture;\\n' +\n      'uniform vec4 uLow;\\n' +\n      'uniform vec4 uHigh;\\n' +\n      'varying vec2 vTexCoord;\\n' +\n      'void main() {\\n' +\n        'gl_FragColor = texture2D(uTexture, vTexCoord);\\n' +\n        'if(all(greaterThan(gl_FragColor.rgb,uLow.rgb)) && all(greaterThan(uHigh.rgb,gl_FragColor.rgb))) {\\n' +\n          'gl_FragColor.a = 0.0;\\n' +\n        '}\\n' +\n      '}',\n\n    /**\n     * distance to actual color, as value up or down from each r,g,b\n     * between 0 and 1\n     **/\n    distance: 0.02,\n\n    /**\n     * For color to remove inside distance, use alpha channel for a smoother deletion\n     * NOT IMPLEMENTED YET\n     **/\n    useAlpha: false,\n\n    /**\n     * Constructor\n     * @memberOf fabric.Image.filters.RemoveWhite.prototype\n     * @param {Object} [options] Options object\n     * @param {Number} [options.color=#RRGGBB] Threshold value\n     * @param {Number} [options.distance=10] Distance value\n     */\n\n    /**\n     * Applies filter to canvas element\n     * @param {Object} canvasEl Canvas element to apply filter to\n     */\n    applyTo2d: function(options) {\n      var imageData = options.imageData,\n          data = imageData.data, i,\n          distance = this.distance * 255,\n          r, g, b,\n          source = new fabric.Color(this.color).getSource(),\n          lowC = [\n            source[0] - distance,\n            source[1] - distance,\n            source[2] - distance,\n          ],\n          highC = [\n            source[0] + distance,\n            source[1] + distance,\n            source[2] + distance,\n          ];\n\n\n      for (i = 0; i < data.length; i += 4) {\n        r = data[i];\n        g = data[i + 1];\n        b = data[i + 2];\n\n        if (r > lowC[0] &&\n            g > lowC[1] &&\n            b > lowC[2] &&\n            r < highC[0] &&\n            g < highC[1] &&\n            b < highC[2]) {\n          data[i + 3] = 0;\n        }\n      }\n    },\n\n    /**\n     * Return WebGL uniform locations for this filter's shader.\n     *\n     * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n     * @param {WebGLShaderProgram} program This filter's compiled shader program.\n     */\n    getUniformLocations: function(gl, program) {\n      return {\n        uLow: gl.getUniformLocation(program, 'uLow'),\n        uHigh: gl.getUniformLocation(program, 'uHigh'),\n      };\n    },\n\n    /**\n     * Send data from this filter to its shader program's uniforms.\n     *\n     * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n     * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n     */\n    sendUniformData: function(gl, uniformLocations) {\n      var source = new fabric.Color(this.color).getSource(),\n          distance = parseFloat(this.distance),\n          lowC = [\n            0 + source[0] / 255 - distance,\n            0 + source[1] / 255 - distance,\n            0 + source[2] / 255 - distance,\n            1\n          ],\n          highC = [\n            source[0] / 255 + distance,\n            source[1] / 255 + distance,\n            source[2] / 255 + distance,\n            1\n          ];\n      gl.uniform4fv(uniformLocations.uLow, lowC);\n      gl.uniform4fv(uniformLocations.uHigh, highC);\n    },\n\n    /**\n     * Returns object representation of an instance\n     * @return {Object} Object representation of an instance\n     */\n    toObject: function() {\n      return extend(this.callSuper('toObject'), {\n        color: this.color,\n        distance: this.distance\n      });\n    }\n  });\n\n  /**\n   * Returns filter instance from an object representation\n   * @static\n   * @param {Object} object Object to create an instance from\n   * @param {Function} [callback] to be invoked after filter creation\n   * @return {fabric.Image.filters.RemoveColor} Instance of fabric.Image.filters.RemoveWhite\n   */\n  fabric.Image.filters.RemoveColor.fromObject = fabric.Image.filters.BaseFilter.fromObject;\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n  'use strict';\n\n  var fabric  = global.fabric || (global.fabric = { }),\n      filters = fabric.Image.filters,\n      createClass = fabric.util.createClass;\n\n  var matrices = {\n    Brownie: [\n      0.59970,0.34553,-0.27082,0,0.186,\n      -0.03770,0.86095,0.15059,0,-0.1449,\n      0.24113,-0.07441,0.44972,0,-0.02965,\n      0,0,0,1,0\n    ],\n    Vintage: [\n      0.62793,0.32021,-0.03965,0,0.03784,\n      0.02578,0.64411,0.03259,0,0.02926,\n      0.04660,-0.08512,0.52416,0,0.02023,\n      0,0,0,1,0\n    ],\n    Kodachrome: [\n      1.12855,-0.39673,-0.03992,0,0.24991,\n      -0.16404,1.08352,-0.05498,0,0.09698,\n      -0.16786,-0.56034,1.60148,0,0.13972,\n      0,0,0,1,0\n    ],\n    Technicolor: [\n      1.91252,-0.85453,-0.09155,0,0.04624,\n      -0.30878,1.76589,-0.10601,0,-0.27589,\n      -0.23110,-0.75018,1.84759,0,0.12137,\n      0,0,0,1,0\n    ],\n    Polaroid: [\n      1.438,-0.062,-0.062,0,0,\n      -0.122,1.378,-0.122,0,0,\n      -0.016,-0.016,1.483,0,0,\n      0,0,0,1,0\n    ],\n    Sepia: [\n      0.393, 0.769, 0.189, 0, 0,\n      0.349, 0.686, 0.168, 0, 0,\n      0.272, 0.534, 0.131, 0, 0,\n      0, 0, 0, 1, 0\n    ],\n    BlackWhite: [\n      1.5, 1.5, 1.5, 0, -1,\n      1.5, 1.5, 1.5, 0, -1,\n      1.5, 1.5, 1.5, 0, -1,\n      0, 0, 0, 1, 0,\n    ]\n  };\n\n  for (var key in matrices) {\n    filters[key] = createClass(filters.ColorMatrix, /** @lends fabric.Image.filters.Sepia.prototype */ {\n\n      /**\n       * Filter type\n       * @param {String} type\n       * @default\n       */\n      type: key,\n\n      /**\n       * Colormatrix for the effect\n       * array of 20 floats. Numbers in positions 4, 9, 14, 19 loose meaning\n       * outside the -1, 1 range.\n       * @param {Array} matrix array of 20 numbers.\n       * @default\n       */\n      matrix: matrices[key],\n\n      /**\n       * Lock the matrix export for this kind of static, parameter less filters.\n       */\n      mainParameter: false,\n      /**\n       * Lock the colormatrix on the color part, skipping alpha\n       */\n      colorsOnly: true,\n\n    });\n    fabric.Image.filters[key].fromObject = fabric.Image.filters.BaseFilter.fromObject;\n  }\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n  'use strict';\n\n  var fabric = global.fabric,\n      filters = fabric.Image.filters,\n      createClass = fabric.util.createClass;\n\n  /**\n   * Color Blend filter class\n   * @class fabric.Image.filter.BlendColor\n   * @memberOf fabric.Image.filters\n   * @extends fabric.Image.filters.BaseFilter\n   * @example\n   * var filter = new fabric.Image.filters.BlendColor({\n   *  color: '#000',\n   *  mode: 'multiply'\n   * });\n   *\n   * var filter = new fabric.Image.filters.BlendImage({\n   *  image: fabricImageObject,\n   *  mode: 'multiply',\n   *  alpha: 0.5\n   * });\n   * object.filters.push(filter);\n   * object.applyFilters();\n   * canvas.renderAll();\n   */\n\n  filters.BlendColor = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.Blend.prototype */ {\n    type: 'BlendColor',\n\n    /**\n     * Color to make the blend operation with. default to a reddish color since black or white\n     * gives always strong result.\n     **/\n    color: '#F95C63',\n\n    /**\n     * Blend mode for the filter: one of multiply, add, diff, screen, subtract,\n     * darken, lighten, overlay, exclusion, tint.\n     **/\n    mode: 'multiply',\n\n    /**\n     * alpha value. represent the strength of the blend color operation.\n     **/\n    alpha: 1,\n\n    /**\n     * Fragment source for the Multiply program\n     */\n    fragmentSource: {\n      multiply: 'gl_FragColor.rgb *= uColor.rgb;\\n',\n      screen: 'gl_FragColor.rgb = 1.0 - (1.0 - gl_FragColor.rgb) * (1.0 - uColor.rgb);\\n',\n      add: 'gl_FragColor.rgb += uColor.rgb;\\n',\n      diff: 'gl_FragColor.rgb = abs(gl_FragColor.rgb - uColor.rgb);\\n',\n      subtract: 'gl_FragColor.rgb -= uColor.rgb;\\n',\n      lighten: 'gl_FragColor.rgb = max(gl_FragColor.rgb, uColor.rgb);\\n',\n      darken: 'gl_FragColor.rgb = min(gl_FragColor.rgb, uColor.rgb);\\n',\n      exclusion: 'gl_FragColor.rgb += uColor.rgb - 2.0 * (uColor.rgb * gl_FragColor.rgb);\\n',\n      overlay: 'if (uColor.r < 0.5) {\\n' +\n          'gl_FragColor.r *= 2.0 * uColor.r;\\n' +\n        '} else {\\n' +\n          'gl_FragColor.r = 1.0 - 2.0 * (1.0 - gl_FragColor.r) * (1.0 - uColor.r);\\n' +\n        '}\\n' +\n        'if (uColor.g < 0.5) {\\n' +\n          'gl_FragColor.g *= 2.0 * uColor.g;\\n' +\n        '} else {\\n' +\n          'gl_FragColor.g = 1.0 - 2.0 * (1.0 - gl_FragColor.g) * (1.0 - uColor.g);\\n' +\n        '}\\n' +\n        'if (uColor.b < 0.5) {\\n' +\n          'gl_FragColor.b *= 2.0 * uColor.b;\\n' +\n        '} else {\\n' +\n          'gl_FragColor.b = 1.0 - 2.0 * (1.0 - gl_FragColor.b) * (1.0 - uColor.b);\\n' +\n        '}\\n',\n      tint: 'gl_FragColor.rgb *= (1.0 - uColor.a);\\n' +\n        'gl_FragColor.rgb += uColor.rgb;\\n',\n    },\n\n    /**\n     * build the fragment source for the filters, joining the common part with\n     * the specific one.\n     * @param {String} mode the mode of the filter, a key of this.fragmentSource\n     * @return {String} the source to be compiled\n     * @private\n     */\n    buildSource: function(mode) {\n      return 'precision highp float;\\n' +\n        'uniform sampler2D uTexture;\\n' +\n        'uniform vec4 uColor;\\n' +\n        'varying vec2 vTexCoord;\\n' +\n        'void main() {\\n' +\n          'vec4 color = texture2D(uTexture, vTexCoord);\\n' +\n          'gl_FragColor = color;\\n' +\n          'if (color.a > 0.0) {\\n' +\n            this.fragmentSource[mode] +\n          '}\\n' +\n        '}';\n    },\n\n    /**\n     * Retrieves the cached shader.\n     * @param {Object} options\n     * @param {WebGLRenderingContext} options.context The GL context used for rendering.\n     * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type.\n     */\n    retrieveShader: function(options) {\n      var cacheKey = this.type + '_' + this.mode, shaderSource;\n      if (!options.programCache.hasOwnProperty(cacheKey)) {\n        shaderSource = this.buildSource(this.mode);\n        options.programCache[cacheKey] = this.createProgram(options.context, shaderSource);\n      }\n      return options.programCache[cacheKey];\n    },\n\n    /**\n     * Apply the Blend operation to a Uint8ClampedArray representing the pixels of an image.\n     *\n     * @param {Object} options\n     * @param {ImageData} options.imageData The Uint8ClampedArray to be filtered.\n     */\n    applyTo2d: function(options) {\n      var imageData = options.imageData,\n          data = imageData.data, iLen = data.length,\n          tr, tg, tb,\n          r, g, b,\n          source, alpha1 = 1 - this.alpha;\n\n      source = new fabric.Color(this.color).getSource();\n      tr = source[0] * this.alpha;\n      tg = source[1] * this.alpha;\n      tb = source[2] * this.alpha;\n\n      for (var i = 0; i < iLen; i += 4) {\n\n        r = data[i];\n        g = data[i + 1];\n        b = data[i + 2];\n\n        switch (this.mode) {\n          case 'multiply':\n            data[i] = r * tr / 255;\n            data[i + 1] = g * tg / 255;\n            data[i + 2] = b * tb / 255;\n            break;\n          case 'screen':\n            data[i] = 255 - (255 - r) * (255 - tr) / 255;\n            data[i + 1] = 255 - (255 - g) * (255 - tg) / 255;\n            data[i + 2] = 255 - (255 - b) * (255 - tb) / 255;\n            break;\n          case 'add':\n            data[i] = r + tr;\n            data[i + 1] = g + tg;\n            data[i + 2] = b + tb;\n            break;\n          case 'diff':\n          case 'difference':\n            data[i] = Math.abs(r - tr);\n            data[i + 1] = Math.abs(g - tg);\n            data[i + 2] = Math.abs(b - tb);\n            break;\n          case 'subtract':\n            data[i] = r - tr;\n            data[i + 1] = g - tg;\n            data[i + 2] = b - tb;\n            break;\n          case 'darken':\n            data[i] = Math.min(r, tr);\n            data[i + 1] = Math.min(g, tg);\n            data[i + 2] = Math.min(b, tb);\n            break;\n          case 'lighten':\n            data[i] = Math.max(r, tr);\n            data[i + 1] = Math.max(g, tg);\n            data[i + 2] = Math.max(b, tb);\n            break;\n          case 'overlay':\n            data[i] = tr < 128 ? (2 * r * tr / 255) : (255 - 2 * (255 - r) * (255 - tr) / 255);\n            data[i + 1] = tg < 128 ? (2 * g * tg / 255) : (255 - 2 * (255 - g) * (255 - tg) / 255);\n            data[i + 2] = tb < 128 ? (2 * b * tb / 255) : (255 - 2 * (255 - b) * (255 - tb) / 255);\n            break;\n          case 'exclusion':\n            data[i] = tr + r - ((2 * tr * r) / 255);\n            data[i + 1] = tg + g - ((2 * tg * g) / 255);\n            data[i + 2] = tb + b - ((2 * tb * b) / 255);\n            break;\n          case 'tint':\n            data[i] = tr + r * alpha1;\n            data[i + 1] = tg + g * alpha1;\n            data[i + 2] = tb + b * alpha1;\n        }\n      }\n    },\n\n    /**\n     * Return WebGL uniform locations for this filter's shader.\n     *\n     * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n     * @param {WebGLShaderProgram} program This filter's compiled shader program.\n     */\n    getUniformLocations: function(gl, program) {\n      return {\n        uColor: gl.getUniformLocation(program, 'uColor'),\n      };\n    },\n\n    /**\n     * Send data from this filter to its shader program's uniforms.\n     *\n     * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n     * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n     */\n    sendUniformData: function(gl, uniformLocations) {\n      var source = new fabric.Color(this.color).getSource();\n      source[0] = this.alpha * source[0] / 255;\n      source[1] = this.alpha * source[1] / 255;\n      source[2] = this.alpha * source[2] / 255;\n      source[3] = this.alpha;\n      gl.uniform4fv(uniformLocations.uColor, source);\n    },\n\n    /**\n     * Returns object representation of an instance\n     * @return {Object} Object representation of an instance\n     */\n    toObject: function() {\n      return {\n        type: this.type,\n        color: this.color,\n        mode: this.mode,\n        alpha: this.alpha\n      };\n    }\n  });\n\n  /**\n   * Returns filter instance from an object representation\n   * @static\n   * @param {Object} object Object to create an instance from\n   * @param {function} [callback] to be invoked after filter creation\n   * @return {fabric.Image.filters.BlendColor} Instance of fabric.Image.filters.BlendColor\n   */\n  fabric.Image.filters.BlendColor.fromObject = fabric.Image.filters.BaseFilter.fromObject;\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n  'use strict';\n\n  var fabric = global.fabric,\n      filters = fabric.Image.filters,\n      createClass = fabric.util.createClass;\n\n  /**\n   * Image Blend filter class\n   * @class fabric.Image.filter.BlendImage\n   * @memberOf fabric.Image.filters\n   * @extends fabric.Image.filters.BaseFilter\n   * @example\n   * var filter = new fabric.Image.filters.BlendColor({\n   *  color: '#000',\n   *  mode: 'multiply'\n   * });\n   *\n   * var filter = new fabric.Image.filters.BlendImage({\n   *  image: fabricImageObject,\n   *  mode: 'multiply',\n   *  alpha: 0.5\n   * });\n   * object.filters.push(filter);\n   * object.applyFilters();\n   * canvas.renderAll();\n   */\n\n  filters.BlendImage = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.BlendImage.prototype */ {\n    type: 'BlendImage',\n\n    /**\n     * Color to make the blend operation with. default to a reddish color since black or white\n     * gives always strong result.\n     **/\n    image: null,\n\n    /**\n     * Blend mode for the filter: one of multiply, add, diff, screen, subtract,\n     * darken, lighten, overlay, exclusion, tint.\n     **/\n    mode: 'multiply',\n\n    /**\n     * alpha value. represent the strength of the blend image operation.\n     * not implemented.\n     **/\n    alpha: 1,\n\n    vertexSource: 'attribute vec2 aPosition;\\n' +\n      'varying vec2 vTexCoord;\\n' +\n      'varying vec2 vTexCoord2;\\n' +\n      'uniform mat3 uTransformMatrix;\\n' +\n      'void main() {\\n' +\n        'vTexCoord = aPosition;\\n' +\n        'vTexCoord2 = (uTransformMatrix * vec3(aPosition, 1.0)).xy;\\n' +\n        'gl_Position = vec4(aPosition * 2.0 - 1.0, 0.0, 1.0);\\n' +\n      '}',\n\n    /**\n     * Fragment source for the Multiply program\n     */\n    fragmentSource: {\n      multiply: 'precision highp float;\\n' +\n        'uniform sampler2D uTexture;\\n' +\n        'uniform sampler2D uImage;\\n' +\n        'uniform vec4 uColor;\\n' +\n        'varying vec2 vTexCoord;\\n' +\n        'varying vec2 vTexCoord2;\\n' +\n        'void main() {\\n' +\n          'vec4 color = texture2D(uTexture, vTexCoord);\\n' +\n          'vec4 color2 = texture2D(uImage, vTexCoord2);\\n' +\n          'color.rgba *= color2.rgba;\\n' +\n          'gl_FragColor = color;\\n' +\n        '}',\n      mask: 'precision highp float;\\n' +\n        'uniform sampler2D uTexture;\\n' +\n        'uniform sampler2D uImage;\\n' +\n        'uniform vec4 uColor;\\n' +\n        'varying vec2 vTexCoord;\\n' +\n        'varying vec2 vTexCoord2;\\n' +\n        'void main() {\\n' +\n          'vec4 color = texture2D(uTexture, vTexCoord);\\n' +\n          'vec4 color2 = texture2D(uImage, vTexCoord2);\\n' +\n          'color.a = color2.a;\\n' +\n          'gl_FragColor = color;\\n' +\n        '}',\n    },\n\n    /**\n     * Retrieves the cached shader.\n     * @param {Object} options\n     * @param {WebGLRenderingContext} options.context The GL context used for rendering.\n     * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type.\n     */\n    retrieveShader: function(options) {\n      var cacheKey = this.type + '_' + this.mode;\n      var shaderSource = this.fragmentSource[this.mode];\n      if (!options.programCache.hasOwnProperty(cacheKey)) {\n        options.programCache[cacheKey] = this.createProgram(options.context, shaderSource);\n      }\n      return options.programCache[cacheKey];\n    },\n\n    applyToWebGL: function(options) {\n      // load texture to blend.\n      var gl = options.context,\n          texture = this.createTexture(options.filterBackend, this.image);\n      this.bindAdditionalTexture(gl, texture, gl.TEXTURE1);\n      this.callSuper('applyToWebGL', options);\n      this.unbindAdditionalTexture(gl, gl.TEXTURE1);\n    },\n\n    createTexture: function(backend, image) {\n      return backend.getCachedTexture(image.cacheKey, image._element);\n    },\n\n    /**\n     * Calculate a transformMatrix to adapt the image to blend over\n     * @param {Object} options\n     * @param {WebGLRenderingContext} options.context The GL context used for rendering.\n     * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type.\n     */\n    calculateMatrix: function() {\n      var image = this.image,\n          width = image._element.width,\n          height = image._element.height;\n      return [\n        1 / image.scaleX, 0, 0,\n        0, 1 / image.scaleY, 0,\n        -image.left / width, -image.top / height, 1\n      ];\n    },\n\n    /**\n     * Apply the Blend operation to a Uint8ClampedArray representing the pixels of an image.\n     *\n     * @param {Object} options\n     * @param {ImageData} options.imageData The Uint8ClampedArray to be filtered.\n     */\n    applyTo2d: function(options) {\n      var imageData = options.imageData,\n          resources = options.filterBackend.resources,\n          data = imageData.data, iLen = data.length,\n          width = imageData.width,\n          height = imageData.height,\n          tr, tg, tb, ta,\n          r, g, b, a,\n          canvas1, context, image = this.image, blendData;\n\n      if (!resources.blendImage) {\n        resources.blendImage = fabric.util.createCanvasElement();\n      }\n      canvas1 = resources.blendImage;\n      context = canvas1.getContext('2d');\n      if (canvas1.width !== width || canvas1.height !== height) {\n        canvas1.width = width;\n        canvas1.height = height;\n      }\n      else {\n        context.clearRect(0, 0, width, height);\n      }\n      context.setTransform(image.scaleX, 0, 0, image.scaleY, image.left, image.top);\n      context.drawImage(image._element, 0, 0, width, height);\n      blendData = context.getImageData(0, 0, width, height).data;\n      for (var i = 0; i < iLen; i += 4) {\n\n        r = data[i];\n        g = data[i + 1];\n        b = data[i + 2];\n        a = data[i + 3];\n\n        tr = blendData[i];\n        tg = blendData[i + 1];\n        tb = blendData[i + 2];\n        ta = blendData[i + 3];\n\n        switch (this.mode) {\n          case 'multiply':\n            data[i] = r * tr / 255;\n            data[i + 1] = g * tg / 255;\n            data[i + 2] = b * tb / 255;\n            data[i + 3] = a * ta / 255;\n            break;\n          case 'mask':\n            data[i + 3] = ta;\n            break;\n        }\n      }\n    },\n\n    /**\n     * Return WebGL uniform locations for this filter's shader.\n     *\n     * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n     * @param {WebGLShaderProgram} program This filter's compiled shader program.\n     */\n    getUniformLocations: function(gl, program) {\n      return {\n        uTransformMatrix: gl.getUniformLocation(program, 'uTransformMatrix'),\n        uImage: gl.getUniformLocation(program, 'uImage'),\n      };\n    },\n\n    /**\n     * Send data from this filter to its shader program's uniforms.\n     *\n     * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n     * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n     */\n    sendUniformData: function(gl, uniformLocations) {\n      var matrix = this.calculateMatrix();\n      gl.uniform1i(uniformLocations.uImage, 1); // texture unit 1.\n      gl.uniformMatrix3fv(uniformLocations.uTransformMatrix, false, matrix);\n    },\n\n    /**\n     * Returns object representation of an instance\n     * @return {Object} Object representation of an instance\n     */\n    toObject: function() {\n      return {\n        type: this.type,\n        image: this.image && this.image.toObject(),\n        mode: this.mode,\n        alpha: this.alpha\n      };\n    }\n  });\n\n  /**\n   * Returns filter instance from an object representation\n   * @static\n   * @param {Object} object Object to create an instance from\n   * @param {function} callback to be invoked after filter creation\n   * @return {fabric.Image.filters.BlendImage} Instance of fabric.Image.filters.BlendImage\n   */\n  fabric.Image.filters.BlendImage.fromObject = function(object, callback) {\n    fabric.Image.fromObject(object.image, function(image) {\n      var options = fabric.util.object.clone(object);\n      options.image = image;\n      callback(new fabric.Image.filters.BlendImage(options));\n    });\n  };\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n  'use strict';\n\n  var fabric  = global.fabric || (global.fabric = { }), pow = Math.pow, floor = Math.floor,\n      sqrt = Math.sqrt, abs = Math.abs, round = Math.round, sin = Math.sin,\n      ceil = Math.ceil,\n      filters = fabric.Image.filters,\n      createClass = fabric.util.createClass;\n\n  /**\n   * Resize image filter class\n   * @class fabric.Image.filters.Resize\n   * @memberOf fabric.Image.filters\n   * @extends fabric.Image.filters.BaseFilter\n   * @see {@link http://fabricjs.com/image-filters|ImageFilters demo}\n   * @example\n   * var filter = new fabric.Image.filters.Resize();\n   * object.filters.push(filter);\n   * object.applyFilters(canvas.renderAll.bind(canvas));\n   */\n  filters.Resize = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.Resize.prototype */ {\n\n    /**\n     * Filter type\n     * @param {String} type\n     * @default\n     */\n    type: 'Resize',\n\n    /**\n     * Resize type\n     * for webgl resizeType is just lanczos, for canvas2d can be:\n     * bilinear, hermite, sliceHack, lanczos.\n     * @param {String} resizeType\n     * @default\n     */\n    resizeType: 'hermite',\n\n    /**\n     * Scale factor for resizing, x axis\n     * @param {Number} scaleX\n     * @default\n     */\n    scaleX: 1,\n\n    /**\n     * Scale factor for resizing, y axis\n     * @param {Number} scaleY\n     * @default\n     */\n    scaleY: 1,\n\n    /**\n     * LanczosLobes parameter for lanczos filter, valid for resizeType lanczos\n     * @param {Number} lanczosLobes\n     * @default\n     */\n    lanczosLobes: 3,\n\n\n    /**\n     * Return WebGL uniform locations for this filter's shader.\n     *\n     * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n     * @param {WebGLShaderProgram} program This filter's compiled shader program.\n     */\n    getUniformLocations: function(gl, program) {\n      return {\n        uDelta: gl.getUniformLocation(program, 'uDelta'),\n        uTaps: gl.getUniformLocation(program, 'uTaps'),\n      };\n    },\n\n    /**\n     * Send data from this filter to its shader program's uniforms.\n     *\n     * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n     * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n     */\n    sendUniformData: function(gl, uniformLocations) {\n      gl.uniform2fv(uniformLocations.uDelta, this.horizontal ? [1 / this.width, 0] : [0, 1 / this.height]);\n      gl.uniform1fv(uniformLocations.uTaps, this.taps);\n    },\n\n    /**\n     * Retrieves the cached shader.\n     * @param {Object} options\n     * @param {WebGLRenderingContext} options.context The GL context used for rendering.\n     * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type.\n     */\n    retrieveShader: function(options) {\n      var filterWindow = this.getFilterWindow(), cacheKey = this.type + '_' + filterWindow;\n      if (!options.programCache.hasOwnProperty(cacheKey)) {\n        var fragmentShader = this.generateShader(filterWindow);\n        options.programCache[cacheKey] = this.createProgram(options.context, fragmentShader);\n      }\n      return options.programCache[cacheKey];\n    },\n\n    getFilterWindow: function() {\n      var scale = this.tempScale;\n      return Math.ceil(this.lanczosLobes / scale);\n    },\n\n    getTaps: function() {\n      var lobeFunction = this.lanczosCreate(this.lanczosLobes), scale = this.tempScale,\n          filterWindow = this.getFilterWindow(), taps = new Array(filterWindow);\n      for (var i = 1; i <= filterWindow; i++) {\n        taps[i - 1] = lobeFunction(i * scale);\n      }\n      return taps;\n    },\n\n    /**\n     * Generate vertex and shader sources from the necessary steps numbers\n     * @param {Number} filterWindow\n     */\n    generateShader: function(filterWindow) {\n      var offsets = new Array(filterWindow),\n          fragmentShader = this.fragmentSourceTOP, filterWindow;\n\n      for (var i = 1; i <= filterWindow; i++) {\n        offsets[i - 1] = i + '.0 * uDelta';\n      }\n\n      fragmentShader += 'uniform float uTaps[' + filterWindow + '];\\n';\n      fragmentShader += 'void main() {\\n';\n      fragmentShader += '  vec4 color = texture2D(uTexture, vTexCoord);\\n';\n      fragmentShader += '  float sum = 1.0;\\n';\n\n      offsets.forEach(function(offset, i) {\n        fragmentShader += '  color += texture2D(uTexture, vTexCoord + ' + offset + ') * uTaps[' + i + '];\\n';\n        fragmentShader += '  color += texture2D(uTexture, vTexCoord - ' + offset + ') * uTaps[' + i + '];\\n';\n        fragmentShader += '  sum += 2.0 * uTaps[' + i + '];\\n';\n      });\n      fragmentShader += '  gl_FragColor = color / sum;\\n';\n      fragmentShader += '}';\n      return fragmentShader;\n    },\n\n    fragmentSourceTOP: 'precision highp float;\\n' +\n      'uniform sampler2D uTexture;\\n' +\n      'uniform vec2 uDelta;\\n' +\n      'varying vec2 vTexCoord;\\n',\n\n    /**\n     * Apply the resize filter to the image\n     * Determines whether to use WebGL or Canvas2D based on the options.webgl flag.\n     *\n     * @param {Object} options\n     * @param {Number} options.passes The number of filters remaining to be executed\n     * @param {Boolean} options.webgl Whether to use webgl to render the filter.\n     * @param {WebGLTexture} options.sourceTexture The texture setup as the source to be filtered.\n     * @param {WebGLTexture} options.targetTexture The texture where filtered output should be drawn.\n     * @param {WebGLRenderingContext} options.context The GL context used for rendering.\n     * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type.\n     */\n    applyTo: function(options) {\n      if (options.webgl) {\n        options.passes++;\n        this.width = options.sourceWidth;\n        this.horizontal = true;\n        this.dW = Math.round(this.width * this.scaleX);\n        this.dH = options.sourceHeight;\n        this.tempScale = this.dW / this.width;\n        this.taps = this.getTaps();\n        options.destinationWidth = this.dW;\n        this._setupFrameBuffer(options);\n        this.applyToWebGL(options);\n        this._swapTextures(options);\n        options.sourceWidth = options.destinationWidth;\n\n        this.height = options.sourceHeight;\n        this.horizontal = false;\n        this.dH = Math.round(this.height * this.scaleY);\n        this.tempScale = this.dH / this.height;\n        this.taps = this.getTaps();\n        options.destinationHeight = this.dH;\n        this._setupFrameBuffer(options);\n        this.applyToWebGL(options);\n        this._swapTextures(options);\n        options.sourceHeight = options.destinationHeight;\n      }\n      else {\n        this.applyTo2d(options);\n      }\n    },\n\n    isNeutralState: function() {\n      return this.scaleX === 1 && this.scaleY === 1;\n    },\n\n    lanczosCreate: function(lobes) {\n      return function(x) {\n        if (x >= lobes || x <= -lobes) {\n          return 0.0;\n        }\n        if (x < 1.19209290E-07 && x > -1.19209290E-07) {\n          return 1.0;\n        }\n        x *= Math.PI;\n        var xx = x / lobes;\n        return (sin(x) / x) * sin(xx) / xx;\n      };\n    },\n\n    /**\n     * Applies filter to canvas element\n     * @memberOf fabric.Image.filters.Resize.prototype\n     * @param {Object} canvasEl Canvas element to apply filter to\n     * @param {Number} scaleX\n     * @param {Number} scaleY\n     */\n    applyTo2d: function(options) {\n      var imageData = options.imageData,\n          scaleX = this.scaleX,\n          scaleY = this.scaleY;\n\n      this.rcpScaleX = 1 / scaleX;\n      this.rcpScaleY = 1 / scaleY;\n\n      var oW = imageData.width, oH = imageData.height,\n          dW = round(oW * scaleX), dH = round(oH * scaleY),\n          newData;\n\n      if (this.resizeType === 'sliceHack') {\n        newData = this.sliceByTwo(options, oW, oH, dW, dH);\n      }\n      else if (this.resizeType === 'hermite') {\n        newData = this.hermiteFastResize(options, oW, oH, dW, dH);\n      }\n      else if (this.resizeType === 'bilinear') {\n        newData = this.bilinearFiltering(options, oW, oH, dW, dH);\n      }\n      else if (this.resizeType === 'lanczos') {\n        newData = this.lanczosResize(options, oW, oH, dW, dH);\n      }\n      options.imageData = newData;\n    },\n\n    /**\n     * Filter sliceByTwo\n     * @param {Object} canvasEl Canvas element to apply filter to\n     * @param {Number} oW Original Width\n     * @param {Number} oH Original Height\n     * @param {Number} dW Destination Width\n     * @param {Number} dH Destination Height\n     * @returns {ImageData}\n     */\n    sliceByTwo: function(options, oW, oH, dW, dH) {\n      var imageData = options.imageData,\n          mult = 0.5, doneW = false, doneH = false, stepW = oW * mult,\n          stepH = oH * mult, resources = fabric.filterBackend.resources,\n          tmpCanvas, ctx, sX = 0, sY = 0, dX = oW, dY = 0;\n      if (!resources.sliceByTwo) {\n        resources.sliceByTwo = document.createElement('canvas');\n      }\n      tmpCanvas = resources.sliceByTwo;\n      if (tmpCanvas.width < oW * 1.5 || tmpCanvas.height < oH) {\n        tmpCanvas.width = oW * 1.5;\n        tmpCanvas.height = oH;\n      }\n      ctx = tmpCanvas.getContext('2d');\n      ctx.clearRect(0, 0, oW * 1.5, oH);\n      ctx.putImageData(imageData, 0, 0);\n\n      dW = floor(dW);\n      dH = floor(dH);\n\n      while (!doneW || !doneH) {\n        oW = stepW;\n        oH = stepH;\n        if (dW < floor(stepW * mult)) {\n          stepW = floor(stepW * mult);\n        }\n        else {\n          stepW = dW;\n          doneW = true;\n        }\n        if (dH < floor(stepH * mult)) {\n          stepH = floor(stepH * mult);\n        }\n        else {\n          stepH = dH;\n          doneH = true;\n        }\n        ctx.drawImage(tmpCanvas, sX, sY, oW, oH, dX, dY, stepW, stepH);\n        sX = dX;\n        sY = dY;\n        dY += stepH;\n      }\n      return ctx.getImageData(sX, sY, dW, dH);\n    },\n\n    /**\n     * Filter lanczosResize\n     * @param {Object} canvasEl Canvas element to apply filter to\n     * @param {Number} oW Original Width\n     * @param {Number} oH Original Height\n     * @param {Number} dW Destination Width\n     * @param {Number} dH Destination Height\n     * @returns {ImageData}\n     */\n    lanczosResize: function(options, oW, oH, dW, dH) {\n\n      function process(u) {\n        var v, i, weight, idx, a, red, green,\n            blue, alpha, fX, fY;\n        center.x = (u + 0.5) * ratioX;\n        icenter.x = floor(center.x);\n        for (v = 0; v < dH; v++) {\n          center.y = (v + 0.5) * ratioY;\n          icenter.y = floor(center.y);\n          a = 0; red = 0; green = 0; blue = 0; alpha = 0;\n          for (i = icenter.x - range2X; i <= icenter.x + range2X; i++) {\n            if (i < 0 || i >= oW) {\n              continue;\n            }\n            fX = floor(1000 * abs(i - center.x));\n            if (!cacheLanc[fX]) {\n              cacheLanc[fX] = { };\n            }\n            for (var j = icenter.y - range2Y; j <= icenter.y + range2Y; j++) {\n              if (j < 0 || j >= oH) {\n                continue;\n              }\n              fY = floor(1000 * abs(j - center.y));\n              if (!cacheLanc[fX][fY]) {\n                cacheLanc[fX][fY] = lanczos(sqrt(pow(fX * rcpRatioX, 2) + pow(fY * rcpRatioY, 2)) / 1000);\n              }\n              weight = cacheLanc[fX][fY];\n              if (weight > 0) {\n                idx = (j * oW + i) * 4;\n                a += weight;\n                red += weight * srcData[idx];\n                green += weight * srcData[idx + 1];\n                blue += weight * srcData[idx + 2];\n                alpha += weight * srcData[idx + 3];\n              }\n            }\n          }\n          idx = (v * dW + u) * 4;\n          destData[idx] = red / a;\n          destData[idx + 1] = green / a;\n          destData[idx + 2] = blue / a;\n          destData[idx + 3] = alpha / a;\n        }\n\n        if (++u < dW) {\n          return process(u);\n        }\n        else {\n          return destImg;\n        }\n      }\n\n      var srcData = options.imageData.data,\n          destImg = options.ctx.createImageData(dW, dH),\n          destData = destImg.data,\n          lanczos = this.lanczosCreate(this.lanczosLobes),\n          ratioX = this.rcpScaleX, ratioY = this.rcpScaleY,\n          rcpRatioX = 2 / this.rcpScaleX, rcpRatioY = 2 / this.rcpScaleY,\n          range2X = ceil(ratioX * this.lanczosLobes / 2),\n          range2Y = ceil(ratioY * this.lanczosLobes / 2),\n          cacheLanc = { }, center = { }, icenter = { };\n\n      return process(0);\n    },\n\n    /**\n     * bilinearFiltering\n     * @param {Object} canvasEl Canvas element to apply filter to\n     * @param {Number} oW Original Width\n     * @param {Number} oH Original Height\n     * @param {Number} dW Destination Width\n     * @param {Number} dH Destination Height\n     * @returns {ImageData}\n     */\n    bilinearFiltering: function(options, oW, oH, dW, dH) {\n      var a, b, c, d, x, y, i, j, xDiff, yDiff, chnl,\n          color, offset = 0, origPix, ratioX = this.rcpScaleX,\n          ratioY = this.rcpScaleY,\n          w4 = 4 * (oW - 1), img = options.imageData,\n          pixels = img.data, destImage = options.ctx.createImageData(dW, dH),\n          destPixels = destImage.data;\n      for (i = 0; i < dH; i++) {\n        for (j = 0; j < dW; j++) {\n          x = floor(ratioX * j);\n          y = floor(ratioY * i);\n          xDiff = ratioX * j - x;\n          yDiff = ratioY * i - y;\n          origPix = 4 * (y * oW + x);\n\n          for (chnl = 0; chnl < 4; chnl++) {\n            a = pixels[origPix + chnl];\n            b = pixels[origPix + 4 + chnl];\n            c = pixels[origPix + w4 + chnl];\n            d = pixels[origPix + w4 + 4 + chnl];\n            color = a * (1 - xDiff) * (1 - yDiff) + b * xDiff * (1 - yDiff) +\n                    c * yDiff * (1 - xDiff) + d * xDiff * yDiff;\n            destPixels[offset++] = color;\n          }\n        }\n      }\n      return destImage;\n    },\n\n    /**\n     * hermiteFastResize\n     * @param {Object} canvasEl Canvas element to apply filter to\n     * @param {Number} oW Original Width\n     * @param {Number} oH Original Height\n     * @param {Number} dW Destination Width\n     * @param {Number} dH Destination Height\n     * @returns {ImageData}\n     */\n    hermiteFastResize: function(options, oW, oH, dW, dH) {\n      var ratioW = this.rcpScaleX, ratioH = this.rcpScaleY,\n          ratioWHalf = ceil(ratioW / 2),\n          ratioHHalf = ceil(ratioH / 2),\n          img = options.imageData, data = img.data,\n          img2 = options.ctx.createImageData(dW, dH), data2 = img2.data;\n      for (var j = 0; j < dH; j++) {\n        for (var i = 0; i < dW; i++) {\n          var x2 = (i + j * dW) * 4, weight = 0, weights = 0, weightsAlpha = 0,\n              gxR = 0, gxG = 0, gxB = 0, gxA = 0, centerY = (j + 0.5) * ratioH;\n          for (var yy = floor(j * ratioH); yy < (j + 1) * ratioH; yy++) {\n            var dy = abs(centerY - (yy + 0.5)) / ratioHHalf,\n                centerX = (i + 0.5) * ratioW, w0 = dy * dy;\n            for (var xx = floor(i * ratioW); xx < (i + 1) * ratioW; xx++) {\n              var dx = abs(centerX - (xx + 0.5)) / ratioWHalf,\n                  w = sqrt(w0 + dx * dx);\n              /* eslint-disable max-depth */\n              if (w > 1 && w < -1) {\n                continue;\n              }\n              //hermite filter\n              weight = 2 * w * w * w - 3 * w * w + 1;\n              if (weight > 0) {\n                dx = 4 * (xx + yy * oW);\n                //alpha\n                gxA += weight * data[dx + 3];\n                weightsAlpha += weight;\n                //colors\n                if (data[dx + 3] < 255) {\n                  weight = weight * data[dx + 3] / 250;\n                }\n                gxR += weight * data[dx];\n                gxG += weight * data[dx + 1];\n                gxB += weight * data[dx + 2];\n                weights += weight;\n              }\n              /* eslint-enable max-depth */\n            }\n          }\n          data2[x2] = gxR / weights;\n          data2[x2 + 1] = gxG / weights;\n          data2[x2 + 2] = gxB / weights;\n          data2[x2 + 3] = gxA / weightsAlpha;\n        }\n      }\n      return img2;\n    },\n\n    /**\n     * Returns object representation of an instance\n     * @return {Object} Object representation of an instance\n     */\n    toObject: function() {\n      return {\n        type: this.type,\n        scaleX: this.scaleX,\n        scaleY: this.scaleY,\n        resizeType: this.resizeType,\n        lanczosLobes: this.lanczosLobes\n      };\n    }\n  });\n\n  /**\n   * Returns filter instance from an object representation\n   * @static\n   * @param {Object} object Object to create an instance from\n   * @param {Function} [callback] to be invoked after filter creation\n   * @return {fabric.Image.filters.Resize} Instance of fabric.Image.filters.Resize\n   */\n  fabric.Image.filters.Resize.fromObject = fabric.Image.filters.BaseFilter.fromObject;\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n  'use strict';\n\n  var fabric  = global.fabric || (global.fabric = { }),\n      filters = fabric.Image.filters,\n      createClass = fabric.util.createClass;\n\n  /**\n   * Contrast filter class\n   * @class fabric.Image.filters.Contrast\n   * @memberOf fabric.Image.filters\n   * @extends fabric.Image.filters.BaseFilter\n   * @see {@link fabric.Image.filters.Contrast#initialize} for constructor definition\n   * @see {@link http://fabricjs.com/image-filters|ImageFilters demo}\n   * @example\n   * var filter = new fabric.Image.filters.Contrast({\n   *   contrast: 0.25\n   * });\n   * object.filters.push(filter);\n   * object.applyFilters();\n   */\n  filters.Contrast = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.Contrast.prototype */ {\n\n    /**\n     * Filter type\n     * @param {String} type\n     * @default\n     */\n    type: 'Contrast',\n\n    fragmentSource: 'precision highp float;\\n' +\n      'uniform sampler2D uTexture;\\n' +\n      'uniform float uContrast;\\n' +\n      'varying vec2 vTexCoord;\\n' +\n      'void main() {\\n' +\n        'vec4 color = texture2D(uTexture, vTexCoord);\\n' +\n        'float contrastF = 1.015 * (uContrast + 1.0) / (1.0 * (1.015 - uContrast));\\n' +\n        'color.rgb = contrastF * (color.rgb - 0.5) + 0.5;\\n' +\n        'gl_FragColor = color;\\n' +\n      '}',\n\n    /**\n     * contrast value, range from -1 to 1.\n     * @param {Number} contrast\n     * @default 0\n     */\n    contrast: 0,\n\n    mainParameter: 'contrast',\n\n    /**\n     * Constructor\n     * @memberOf fabric.Image.filters.Contrast.prototype\n     * @param {Object} [options] Options object\n     * @param {Number} [options.contrast=0] Value to contrast the image up (-1...1)\n     */\n\n    /**\n      * Apply the Contrast operation to a Uint8Array representing the pixels of an image.\n      *\n      * @param {Object} options\n      * @param {ImageData} options.imageData The Uint8Array to be filtered.\n      */\n    applyTo2d: function(options) {\n      if (this.contrast === 0) {\n        return;\n      }\n      var imageData = options.imageData, i, len,\n          data = imageData.data, len = data.length,\n          contrast = Math.floor(this.contrast * 255),\n          contrastF = 259 * (contrast + 255) / (255 * (259 - contrast));\n\n      for (i = 0; i < len; i += 4) {\n        data[i] = contrastF * (data[i] - 128) + 128;\n        data[i + 1] = contrastF * (data[i + 1] - 128) + 128;\n        data[i + 2] = contrastF * (data[i + 2] - 128) + 128;\n      }\n    },\n\n    /**\n     * Return WebGL uniform locations for this filter's shader.\n     *\n     * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n     * @param {WebGLShaderProgram} program This filter's compiled shader program.\n     */\n    getUniformLocations: function(gl, program) {\n      return {\n        uContrast: gl.getUniformLocation(program, 'uContrast'),\n      };\n    },\n\n    /**\n     * Send data from this filter to its shader program's uniforms.\n     *\n     * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n     * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n     */\n    sendUniformData: function(gl, uniformLocations) {\n      gl.uniform1f(uniformLocations.uContrast, this.contrast);\n    },\n  });\n\n  /**\n   * Returns filter instance from an object representation\n   * @static\n   * @param {Object} object Object to create an instance from\n   * @param {function} [callback] to be invoked after filter creation\n   * @return {fabric.Image.filters.Contrast} Instance of fabric.Image.filters.Contrast\n   */\n  fabric.Image.filters.Contrast.fromObject = fabric.Image.filters.BaseFilter.fromObject;\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n  'use strict';\n\n  var fabric  = global.fabric || (global.fabric = { }),\n      filters = fabric.Image.filters,\n      createClass = fabric.util.createClass;\n\n  /**\n   * Saturate filter class\n   * @class fabric.Image.filters.Saturation\n   * @memberOf fabric.Image.filters\n   * @extends fabric.Image.filters.BaseFilter\n   * @see {@link fabric.Image.filters.Saturation#initialize} for constructor definition\n   * @see {@link http://fabricjs.com/image-filters|ImageFilters demo}\n   * @example\n   * var filter = new fabric.Image.filters.Saturation({\n   *   saturation: 1\n   * });\n   * object.filters.push(filter);\n   * object.applyFilters();\n   */\n  filters.Saturation = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.Saturation.prototype */ {\n\n    /**\n     * Filter type\n     * @param {String} type\n     * @default\n     */\n    type: 'Saturation',\n\n    fragmentSource: 'precision highp float;\\n' +\n      'uniform sampler2D uTexture;\\n' +\n      'uniform float uSaturation;\\n' +\n      'varying vec2 vTexCoord;\\n' +\n      'void main() {\\n' +\n        'vec4 color = texture2D(uTexture, vTexCoord);\\n' +\n        'float rgMax = max(color.r, color.g);\\n' +\n        'float rgbMax = max(rgMax, color.b);\\n' +\n        'color.r += rgbMax != color.r ? (rgbMax - color.r) * uSaturation : 0.00;\\n' +\n        'color.g += rgbMax != color.g ? (rgbMax - color.g) * uSaturation : 0.00;\\n' +\n        'color.b += rgbMax != color.b ? (rgbMax - color.b) * uSaturation : 0.00;\\n' +\n        'gl_FragColor = color;\\n' +\n      '}',\n\n    /**\n     * Saturation value, from -1 to 1.\n     * Increases/decreases the color saturation.\n     * A value of 0 has no effect.\n     * \n     * @param {Number} saturation\n     * @default\n     */\n    saturation: 0,\n\n    mainParameter: 'saturation',\n\n    /**\n     * Constructor\n     * @memberOf fabric.Image.filters.Saturate.prototype\n     * @param {Object} [options] Options object\n     * @param {Number} [options.saturate=0] Value to saturate the image (-1...1)\n     */\n\n    /**\n     * Apply the Saturation operation to a Uint8ClampedArray representing the pixels of an image.\n     *\n     * @param {Object} options\n     * @param {ImageData} options.imageData The Uint8ClampedArray to be filtered.\n     */\n    applyTo2d: function(options) {\n      if (this.saturation === 0) {\n        return;\n      }\n      var imageData = options.imageData,\n          data = imageData.data, len = data.length,\n          adjust = -this.saturation, i, max;\n\n      for (i = 0; i < len; i += 4) {\n        max = Math.max(data[i], data[i + 1], data[i + 2]);\n        data[i] += max !== data[i] ? (max - data[i]) * adjust : 0;\n        data[i + 1] += max !== data[i + 1] ? (max - data[i + 1]) * adjust : 0;\n        data[i + 2] += max !== data[i + 2] ? (max - data[i + 2]) * adjust : 0;\n      }\n    },\n\n    /**\n     * Return WebGL uniform locations for this filter's shader.\n     *\n     * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n     * @param {WebGLShaderProgram} program This filter's compiled shader program.\n     */\n    getUniformLocations: function(gl, program) {\n      return {\n        uSaturation: gl.getUniformLocation(program, 'uSaturation'),\n      };\n    },\n\n    /**\n     * Send data from this filter to its shader program's uniforms.\n     *\n     * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n     * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n     */\n    sendUniformData: function(gl, uniformLocations) {\n      gl.uniform1f(uniformLocations.uSaturation, -this.saturation);\n    },\n  });\n\n  /**\n   * Returns filter instance from an object representation\n   * @static\n   * @param {Object} object Object to create an instance from\n   * @param {Function} [callback] to be invoked after filter creation\n   * @return {fabric.Image.filters.Saturation} Instance of fabric.Image.filters.Saturate\n   */\n  fabric.Image.filters.Saturation.fromObject = fabric.Image.filters.BaseFilter.fromObject;\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n  'use strict';\n\n  var fabric  = global.fabric || (global.fabric = { }),\n      filters = fabric.Image.filters,\n      createClass = fabric.util.createClass;\n\n  /**\n   * Vibrance filter class\n   * @class fabric.Image.filters.Vibrance\n   * @memberOf fabric.Image.filters\n   * @extends fabric.Image.filters.BaseFilter\n   * @see {@link fabric.Image.filters.Vibrance#initialize} for constructor definition\n   * @see {@link http://fabricjs.com/image-filters|ImageFilters demo}\n   * @example\n   * var filter = new fabric.Image.filters.Vibrance({\n   *   vibrance: 1\n   * });\n   * object.filters.push(filter);\n   * object.applyFilters();\n   */\n  filters.Vibrance = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.Vibrance.prototype */ {\n\n    /**\n     * Filter type\n     * @param {String} type\n     * @default\n     */\n    type: 'Vibrance',\n\n    fragmentSource: 'precision highp float;\\n' +\n      'uniform sampler2D uTexture;\\n' +\n      'uniform float uVibrance;\\n' +\n      'varying vec2 vTexCoord;\\n' +\n      'void main() {\\n' +\n        'vec4 color = texture2D(uTexture, vTexCoord);\\n' +\n        'float max = max(color.r, max(color.g, color.b));\\n' +\n        'float avg = (color.r + color.g + color.b) / 3.0;\\n' +\n        'float amt = (abs(max - avg) * 2.0) * uVibrance;\\n' +\n        'color.r += max != color.r ? (max - color.r) * amt : 0.00;\\n' +\n        'color.g += max != color.g ? (max - color.g) * amt : 0.00;\\n' +\n        'color.b += max != color.b ? (max - color.b) * amt : 0.00;\\n' +\n        'gl_FragColor = color;\\n' +\n      '}',\n\n    /**\n     * Vibrance value, from -1 to 1.\n     * Increases/decreases the saturation of more muted colors with less effect on saturated colors.\n     * A value of 0 has no effect.\n     * \n     * @param {Number} vibrance\n     * @default\n     */\n    vibrance: 0,\n\n    mainParameter: 'vibrance',\n\n    /**\n     * Constructor\n     * @memberOf fabric.Image.filters.Vibrance.prototype\n     * @param {Object} [options] Options object\n     * @param {Number} [options.vibrance=0] Vibrance value for the image (between -1 and 1)\n     */\n\n    /**\n     * Apply the Vibrance operation to a Uint8ClampedArray representing the pixels of an image.\n     *\n     * @param {Object} options\n     * @param {ImageData} options.imageData The Uint8ClampedArray to be filtered.\n     */\n    applyTo2d: function(options) {\n      if (this.vibrance === 0) {\n        return;\n      }\n      var imageData = options.imageData,\n          data = imageData.data, len = data.length,\n          adjust = -this.vibrance, i, max, avg, amt;\n\n      for (i = 0; i < len; i += 4) {\n        max = Math.max(data[i], data[i + 1], data[i + 2]);\n        avg = (data[i] + data[i + 1] + data[i + 2]) / 3;\n        amt = ((Math.abs(max - avg) * 2 / 255) * adjust);\n        data[i] += max !== data[i] ? (max - data[i]) * amt : 0;\n        data[i + 1] += max !== data[i + 1] ? (max - data[i + 1]) * amt : 0;\n        data[i + 2] += max !== data[i + 2] ? (max - data[i + 2]) * amt : 0;\n      }\n    },\n\n    /**\n     * Return WebGL uniform locations for this filter's shader.\n     *\n     * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n     * @param {WebGLShaderProgram} program This filter's compiled shader program.\n     */\n    getUniformLocations: function(gl, program) {\n      return {\n        uVibrance: gl.getUniformLocation(program, 'uVibrance'),\n      };\n    },\n\n    /**\n     * Send data from this filter to its shader program's uniforms.\n     *\n     * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n     * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n     */\n    sendUniformData: function(gl, uniformLocations) {\n      gl.uniform1f(uniformLocations.uVibrance, -this.vibrance);\n    },\n  });\n\n  /**\n   * Returns filter instance from an object representation\n   * @static\n   * @param {Object} object Object to create an instance from\n   * @param {Function} [callback] to be invoked after filter creation\n   * @return {fabric.Image.filters.Vibrance} Instance of fabric.Image.filters.Vibrance\n   */\n  fabric.Image.filters.Vibrance.fromObject = fabric.Image.filters.BaseFilter.fromObject;\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n  'use strict';\n\n  var fabric  = global.fabric || (global.fabric = { }),\n      filters = fabric.Image.filters,\n      createClass = fabric.util.createClass;\n\n  /**\n   * Blur filter class\n   * @class fabric.Image.filters.Blur\n   * @memberOf fabric.Image.filters\n   * @extends fabric.Image.filters.BaseFilter\n   * @see {@link fabric.Image.filters.Blur#initialize} for constructor definition\n   * @see {@link http://fabricjs.com/image-filters|ImageFilters demo}\n   * @example\n   * var filter = new fabric.Image.filters.Blur({\n   *   blur: 0.5\n   * });\n   * object.filters.push(filter);\n   * object.applyFilters();\n   * canvas.renderAll();\n   */\n  filters.Blur = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.Blur.prototype */ {\n\n    type: 'Blur',\n\n    /*\n'gl_FragColor = vec4(0.0);',\n'gl_FragColor += texture2D(texture, vTexCoord + -7 * uDelta)*0.0044299121055113265;',\n'gl_FragColor += texture2D(texture, vTexCoord + -6 * uDelta)*0.00895781211794;',\n'gl_FragColor += texture2D(texture, vTexCoord + -5 * uDelta)*0.0215963866053;',\n'gl_FragColor += texture2D(texture, vTexCoord + -4 * uDelta)*0.0443683338718;',\n'gl_FragColor += texture2D(texture, vTexCoord + -3 * uDelta)*0.0776744219933;',\n'gl_FragColor += texture2D(texture, vTexCoord + -2 * uDelta)*0.115876621105;',\n'gl_FragColor += texture2D(texture, vTexCoord + -1 * uDelta)*0.147308056121;',\n'gl_FragColor += texture2D(texture, vTexCoord              )*0.159576912161;',\n'gl_FragColor += texture2D(texture, vTexCoord + 1 * uDelta)*0.147308056121;',\n'gl_FragColor += texture2D(texture, vTexCoord + 2 * uDelta)*0.115876621105;',\n'gl_FragColor += texture2D(texture, vTexCoord + 3 * uDelta)*0.0776744219933;',\n'gl_FragColor += texture2D(texture, vTexCoord + 4 * uDelta)*0.0443683338718;',\n'gl_FragColor += texture2D(texture, vTexCoord + 5 * uDelta)*0.0215963866053;',\n'gl_FragColor += texture2D(texture, vTexCoord + 6 * uDelta)*0.00895781211794;',\n'gl_FragColor += texture2D(texture, vTexCoord + 7 * uDelta)*0.0044299121055113265;',\n*/\n\n    /* eslint-disable max-len */\n    fragmentSource: 'precision highp float;\\n' +\n      'uniform sampler2D uTexture;\\n' +\n      'uniform vec2 uDelta;\\n' +\n      'varying vec2 vTexCoord;\\n' +\n      'const float nSamples = 15.0;\\n' +\n      'vec3 v3offset = vec3(12.9898, 78.233, 151.7182);\\n' +\n      'float random(vec3 scale) {\\n' +\n        /* use the fragment position for a different seed per-pixel */\n        'return fract(sin(dot(gl_FragCoord.xyz, scale)) * 43758.5453);\\n' +\n      '}\\n' +\n      'void main() {\\n' +\n        'vec4 color = vec4(0.0);\\n' +\n        'float total = 0.0;\\n' +\n        'float offset = random(v3offset);\\n' +\n        'for (float t = -nSamples; t <= nSamples; t++) {\\n' +\n          'float percent = (t + offset - 0.5) / nSamples;\\n' +\n          'float weight = 1.0 - abs(percent);\\n' +\n          'color += texture2D(uTexture, vTexCoord + uDelta * percent) * weight;\\n' +\n          'total += weight;\\n' +\n        '}\\n' +\n        'gl_FragColor = color / total;\\n' +\n      '}',\n    /* eslint-enable max-len */\n\n    /**\n     * blur value, in percentage of image dimensions.\n     * specific to keep the image blur constant at different resolutions\n     * range between 0 and 1.\n     */\n    blur: 0,\n\n    mainParameter: 'blur',\n\n    applyTo: function(options) {\n      if (options.webgl) {\n        // this aspectRatio is used to give the same blur to vertical and horizontal\n        this.aspectRatio = options.sourceWidth / options.sourceHeight;\n        options.passes++;\n        this._setupFrameBuffer(options);\n        this.horizontal = true;\n        this.applyToWebGL(options);\n        this._swapTextures(options);\n        this._setupFrameBuffer(options);\n        this.horizontal = false;\n        this.applyToWebGL(options);\n        this._swapTextures(options);\n      }\n      else {\n        this.applyTo2d(options);\n      }\n    },\n\n    applyTo2d: function(options) {\n      // paint canvasEl with current image data.\n      //options.ctx.putImageData(options.imageData, 0, 0);\n      options.imageData = this.simpleBlur(options);\n    },\n\n    simpleBlur: function(options) {\n      var resources = options.filterBackend.resources, canvas1, canvas2,\n          width = options.imageData.width,\n          height = options.imageData.height;\n\n      if (!resources.blurLayer1) {\n        resources.blurLayer1 = fabric.util.createCanvasElement();\n        resources.blurLayer2 = fabric.util.createCanvasElement();\n      }\n      canvas1 = resources.blurLayer1;\n      canvas2 = resources.blurLayer2;\n      if (canvas1.width !== width || canvas1.height !== height) {\n        canvas2.width = canvas1.width = width;\n        canvas2.height = canvas1.height = height;\n      }\n      var ctx1 = canvas1.getContext('2d'),\n          ctx2 = canvas2.getContext('2d'),\n          nSamples = 15,\n          random, percent, j, i,\n          blur = this.blur * 0.06 * 0.5;\n\n      // load first canvas\n      ctx1.putImageData(options.imageData, 0, 0);\n      ctx2.clearRect(0, 0, width, height);\n\n      for (i = -nSamples; i <= nSamples; i++) {\n        random = (Math.random() - 0.5) / 4;\n        percent = i / nSamples;\n        j = blur * percent * width + random;\n        ctx2.globalAlpha = 1 - Math.abs(percent);\n        ctx2.drawImage(canvas1, j, random);\n        ctx1.drawImage(canvas2, 0, 0);\n        ctx2.globalAlpha = 1;\n        ctx2.clearRect(0, 0, canvas2.width, canvas2.height);\n      }\n      for (i = -nSamples; i <= nSamples; i++) {\n        random = (Math.random() - 0.5) / 4;\n        percent = i / nSamples;\n        j = blur * percent * height + random;\n        ctx2.globalAlpha = 1 - Math.abs(percent);\n        ctx2.drawImage(canvas1, random, j);\n        ctx1.drawImage(canvas2, 0, 0);\n        ctx2.globalAlpha = 1;\n        ctx2.clearRect(0, 0, canvas2.width, canvas2.height);\n      }\n      options.ctx.drawImage(canvas1, 0, 0);\n      var newImageData = options.ctx.getImageData(0, 0, canvas1.width, canvas1.height);\n      ctx1.globalAlpha = 1;\n      ctx1.clearRect(0, 0, canvas1.width, canvas1.height);\n      return newImageData;\n    },\n\n    /**\n     * Return WebGL uniform locations for this filter's shader.\n     *\n     * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n     * @param {WebGLShaderProgram} program This filter's compiled shader program.\n     */\n    getUniformLocations: function(gl, program) {\n      return {\n        delta: gl.getUniformLocation(program, 'uDelta'),\n      };\n    },\n\n    /**\n     * Send data from this filter to its shader program's uniforms.\n     *\n     * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n     * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n     */\n    sendUniformData: function(gl, uniformLocations) {\n      var delta = this.chooseRightDelta();\n      gl.uniform2fv(uniformLocations.delta, delta);\n    },\n\n    /**\n     * choose right value of image percentage to blur with\n     * @returns {Array} a numeric array with delta values\n     */\n    chooseRightDelta: function() {\n      var blurScale = 1, delta = [0, 0], blur;\n      if (this.horizontal) {\n        if (this.aspectRatio > 1) {\n          // image is wide, i want to shrink radius horizontal\n          blurScale = 1 / this.aspectRatio;\n        }\n      }\n      else {\n        if (this.aspectRatio < 1) {\n          // image is tall, i want to shrink radius vertical\n          blurScale = this.aspectRatio;\n        }\n      }\n      blur = blurScale * this.blur * 0.12;\n      if (this.horizontal) {\n        delta[0] = blur;\n      }\n      else {\n        delta[1] = blur;\n      }\n      return delta;\n    },\n  });\n\n  /**\n   * Deserialize a JSON definition of a BlurFilter into a concrete instance.\n   */\n  filters.Blur.fromObject = fabric.Image.filters.BaseFilter.fromObject;\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n  'use strict';\n\n  var fabric  = global.fabric || (global.fabric = { }),\n      filters = fabric.Image.filters,\n      createClass = fabric.util.createClass;\n\n  /**\n   * Gamma filter class\n   * @class fabric.Image.filters.Gamma\n   * @memberOf fabric.Image.filters\n   * @extends fabric.Image.filters.BaseFilter\n   * @see {@link fabric.Image.filters.Gamma#initialize} for constructor definition\n   * @see {@link http://fabricjs.com/image-filters|ImageFilters demo}\n   * @example\n   * var filter = new fabric.Image.filters.Gamma({\n   *   gamma: [1, 0.5, 2.1]\n   * });\n   * object.filters.push(filter);\n   * object.applyFilters();\n   */\n  filters.Gamma = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.Gamma.prototype */ {\n\n    /**\n     * Filter type\n     * @param {String} type\n     * @default\n     */\n    type: 'Gamma',\n\n    fragmentSource: 'precision highp float;\\n' +\n      'uniform sampler2D uTexture;\\n' +\n      'uniform vec3 uGamma;\\n' +\n      'varying vec2 vTexCoord;\\n' +\n      'void main() {\\n' +\n        'vec4 color = texture2D(uTexture, vTexCoord);\\n' +\n        'vec3 correction = (1.0 / uGamma);\\n' +\n        'color.r = pow(color.r, correction.r);\\n' +\n        'color.g = pow(color.g, correction.g);\\n' +\n        'color.b = pow(color.b, correction.b);\\n' +\n        'gl_FragColor = color;\\n' +\n        'gl_FragColor.rgb *= color.a;\\n' +\n      '}',\n\n    /**\n     * Gamma array value, from 0.01 to 2.2.\n     * @param {Array} gamma\n     * @default\n     */\n    gamma: [1, 1, 1],\n\n    /**\n     * Describe the property that is the filter parameter\n     * @param {String} m\n     * @default\n     */\n    mainParameter: 'gamma',\n\n    /**\n     * Constructor\n     * @param {Object} [options] Options object\n     */\n    initialize: function(options) {\n      this.gamma = [1, 1, 1];\n      filters.BaseFilter.prototype.initialize.call(this, options);\n    },\n\n    /**\n     * Apply the Gamma operation to a Uint8Array representing the pixels of an image.\n     *\n     * @param {Object} options\n     * @param {ImageData} options.imageData The Uint8Array to be filtered.\n     */\n    applyTo2d: function(options) {\n      var imageData = options.imageData, data = imageData.data,\n          gamma = this.gamma, len = data.length,\n          rInv = 1 / gamma[0], gInv = 1 / gamma[1],\n          bInv = 1 / gamma[2], i;\n\n      if (!this.rVals) {\n        // eslint-disable-next-line\n        this.rVals = new Uint8Array(256);\n        // eslint-disable-next-line\n        this.gVals = new Uint8Array(256);\n        // eslint-disable-next-line\n        this.bVals = new Uint8Array(256);\n      }\n\n      // This is an optimization - pre-compute a look-up table for each color channel\n      // instead of performing these pow calls for each pixel in the image.\n      for (i = 0, len = 256; i < len; i++) {\n        this.rVals[i] = Math.pow(i / 255, rInv) * 255;\n        this.gVals[i] = Math.pow(i / 255, gInv) * 255;\n        this.bVals[i] = Math.pow(i / 255, bInv) * 255;\n      }\n      for (i = 0, len = data.length; i < len; i += 4) {\n        data[i] = this.rVals[data[i]];\n        data[i + 1] = this.gVals[data[i + 1]];\n        data[i + 2] = this.bVals[data[i + 2]];\n      }\n    },\n\n    /**\n     * Return WebGL uniform locations for this filter's shader.\n     *\n     * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n     * @param {WebGLShaderProgram} program This filter's compiled shader program.\n     */\n    getUniformLocations: function(gl, program) {\n      return {\n        uGamma: gl.getUniformLocation(program, 'uGamma'),\n      };\n    },\n\n    /**\n     * Send data from this filter to its shader program's uniforms.\n     *\n     * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n     * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n     */\n    sendUniformData: function(gl, uniformLocations) {\n      gl.uniform3fv(uniformLocations.uGamma, this.gamma);\n    },\n  });\n\n  /**\n   * Returns filter instance from an object representation\n   * @static\n   * @param {Object} object Object to create an instance from\n   * @param {function} [callback] to be invoked after filter creation\n   * @return {fabric.Image.filters.Gamma} Instance of fabric.Image.filters.Gamma\n   */\n  fabric.Image.filters.Gamma.fromObject = fabric.Image.filters.BaseFilter.fromObject;\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n  'use strict';\n\n  var fabric  = global.fabric || (global.fabric = { }),\n      filters = fabric.Image.filters,\n      createClass = fabric.util.createClass;\n\n  /**\n   * A container class that knows how to apply a sequence of filters to an input image.\n   */\n  filters.Composed = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.Composed.prototype */ {\n\n    type: 'Composed',\n\n    /**\n     * A non sparse array of filters to apply\n     */\n    subFilters: [],\n\n    /**\n     * Constructor\n     * @param {Object} [options] Options object\n     */\n    initialize: function(options) {\n      this.callSuper('initialize', options);\n      // create a new array instead mutating the prototype with push\n      this.subFilters = this.subFilters.slice(0);\n    },\n\n    /**\n     * Apply this container's filters to the input image provided.\n     *\n     * @param {Object} options\n     * @param {Number} options.passes The number of filters remaining to be applied.\n     */\n    applyTo: function(options) {\n      options.passes += this.subFilters.length - 1;\n      this.subFilters.forEach(function(filter) {\n        filter.applyTo(options);\n      });\n    },\n\n    /**\n     * Serialize this filter into JSON.\n     *\n     * @returns {Object} A JSON representation of this filter.\n     */\n    toObject: function() {\n      return fabric.util.object.extend(this.callSuper('toObject'), {\n        subFilters: this.subFilters.map(function(filter) { return filter.toObject(); }),\n      });\n    },\n\n    isNeutralState: function() {\n      return !this.subFilters.some(function(filter) { return !filter.isNeutralState(); });\n    }\n  });\n\n  /**\n   * Deserialize a JSON definition of a ComposedFilter into a concrete instance.\n   */\n  fabric.Image.filters.Composed.fromObject = function(object, callback) {\n    var filters = object.subFilters || [],\n        subFilters = filters.map(function(filter) {\n          return new fabric.Image.filters[filter.type](filter);\n        }),\n        instance = new fabric.Image.filters.Composed({ subFilters: subFilters });\n    callback && callback(instance);\n    return instance;\n  };\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n  'use strict';\n\n  var fabric  = global.fabric || (global.fabric = { }),\n      filters = fabric.Image.filters,\n      createClass = fabric.util.createClass;\n\n  /**\n   * HueRotation filter class\n   * @class fabric.Image.filters.HueRotation\n   * @memberOf fabric.Image.filters\n   * @extends fabric.Image.filters.BaseFilter\n   * @see {@link fabric.Image.filters.HueRotation#initialize} for constructor definition\n   * @see {@link http://fabricjs.com/image-filters|ImageFilters demo}\n   * @example\n   * var filter = new fabric.Image.filters.HueRotation({\n   *   rotation: -0.5\n   * });\n   * object.filters.push(filter);\n   * object.applyFilters();\n   */\n  filters.HueRotation = createClass(filters.ColorMatrix, /** @lends fabric.Image.filters.HueRotation.prototype */ {\n\n    /**\n     * Filter type\n     * @param {String} type\n     * @default\n     */\n    type: 'HueRotation',\n\n    /**\n     * HueRotation value, from -1 to 1.\n     * the unit is radians\n     * @param {Number} myParameter\n     * @default\n     */\n    rotation: 0,\n\n    /**\n     * Describe the property that is the filter parameter\n     * @param {String} m\n     * @default\n     */\n    mainParameter: 'rotation',\n\n    calculateMatrix: function() {\n      var rad = this.rotation * Math.PI, cos = fabric.util.cos(rad), sin = fabric.util.sin(rad),\n          aThird = 1 / 3, aThirdSqtSin = Math.sqrt(aThird) * sin, OneMinusCos = 1 - cos;\n      this.matrix = [\n        1, 0, 0, 0, 0,\n        0, 1, 0, 0, 0,\n        0, 0, 1, 0, 0,\n        0, 0, 0, 1, 0\n      ];\n      this.matrix[0] = cos + OneMinusCos / 3;\n      this.matrix[1] = aThird * OneMinusCos - aThirdSqtSin;\n      this.matrix[2] = aThird * OneMinusCos + aThirdSqtSin;\n      this.matrix[5] = aThird * OneMinusCos + aThirdSqtSin;\n      this.matrix[6] = cos + aThird * OneMinusCos;\n      this.matrix[7] = aThird * OneMinusCos - aThirdSqtSin;\n      this.matrix[10] = aThird * OneMinusCos - aThirdSqtSin;\n      this.matrix[11] = aThird * OneMinusCos + aThirdSqtSin;\n      this.matrix[12] = cos + aThird * OneMinusCos;\n    },\n\n    /**\n     * HueRotation isNeutralState implementation\n     * Used only in image applyFilters to discard filters that will not have an effect\n     * on the image\n     * @param {Object} options\n     **/\n    isNeutralState: function(options) {\n      this.calculateMatrix();\n      return filters.BaseFilter.prototype.isNeutralState.call(this, options);\n    },\n\n    /**\n     * Apply this filter to the input image data provided.\n     *\n     * Determines whether to use WebGL or Canvas2D based on the options.webgl flag.\n     *\n     * @param {Object} options\n     * @param {Number} options.passes The number of filters remaining to be executed\n     * @param {Boolean} options.webgl Whether to use webgl to render the filter.\n     * @param {WebGLTexture} options.sourceTexture The texture setup as the source to be filtered.\n     * @param {WebGLTexture} options.targetTexture The texture where filtered output should be drawn.\n     * @param {WebGLRenderingContext} options.context The GL context used for rendering.\n     * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type.\n     */\n    applyTo: function(options) {\n      this.calculateMatrix();\n      filters.BaseFilter.prototype.applyTo.call(this, options);\n    },\n\n  });\n\n  /**\n   * Returns filter instance from an object representation\n   * @static\n   * @param {Object} object Object to create an instance from\n   * @param {function} [callback] to be invoked after filter creation\n   * @return {fabric.Image.filters.HueRotation} Instance of fabric.Image.filters.HueRotation\n   */\n  fabric.Image.filters.HueRotation.fromObject = fabric.Image.filters.BaseFilter.fromObject;\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n  'use strict';\n\n  var fabric = global.fabric || (global.fabric = { }),\n      clone = fabric.util.object.clone;\n\n  if (fabric.Text) {\n    fabric.warn('fabric.Text is already defined');\n    return;\n  }\n\n  var additionalProps =\n    ('fontFamily fontWeight fontSize text underline overline linethrough' +\n    ' textAlign fontStyle lineHeight textBackgroundColor charSpacing styles' +\n    ' direction path pathStartOffset pathSide').split(' ');\n\n  /**\n   * Text class\n   * @class fabric.Text\n   * @extends fabric.Object\n   * @return {fabric.Text} thisArg\n   * @tutorial {@link http://fabricjs.com/fabric-intro-part-2#text}\n   * @see {@link fabric.Text#initialize} for constructor definition\n   */\n  fabric.Text = fabric.util.createClass(fabric.Object, /** @lends fabric.Text.prototype */ {\n\n    /**\n     * Properties which when set cause object to change dimensions\n     * @type Array\n     * @private\n     */\n    _dimensionAffectingProps: [\n      'fontSize',\n      'fontWeight',\n      'fontFamily',\n      'fontStyle',\n      'lineHeight',\n      'text',\n      'charSpacing',\n      'textAlign',\n      'styles',\n      'path',\n      'pathStartOffset',\n      'pathSide'\n    ],\n\n    /**\n     * @private\n     */\n    _reNewline: /\\r?\\n/,\n\n    /**\n     * Use this regular expression to filter for whitespaces that is not a new line.\n     * Mostly used when text is 'justify' aligned.\n     * @private\n     */\n    _reSpacesAndTabs: /[ \\t\\r]/g,\n\n    /**\n     * Use this regular expression to filter for whitespace that is not a new line.\n     * Mostly used when text is 'justify' aligned.\n     * @private\n     */\n    _reSpaceAndTab: /[ \\t\\r]/,\n\n    /**\n     * Use this regular expression to filter consecutive groups of non spaces.\n     * Mostly used when text is 'justify' aligned.\n     * @private\n     */\n    _reWords: /\\S+/g,\n\n    /**\n     * Type of an object\n     * @type String\n     * @default\n     */\n    type:                 'text',\n\n    /**\n     * Font size (in pixels)\n     * @type Number\n     * @default\n     */\n    fontSize:             40,\n\n    /**\n     * Font weight (e.g. bold, normal, 400, 600, 800)\n     * @type {(Number|String)}\n     * @default\n     */\n    fontWeight:           'normal',\n\n    /**\n     * Font family\n     * @type String\n     * @default\n     */\n    fontFamily:           'Times New Roman',\n\n    /**\n     * Text decoration underline.\n     * @type Boolean\n     * @default\n     */\n    underline:       false,\n\n    /**\n     * Text decoration overline.\n     * @type Boolean\n     * @default\n     */\n    overline:       false,\n\n    /**\n     * Text decoration linethrough.\n     * @type Boolean\n     * @default\n     */\n    linethrough:       false,\n\n    /**\n     * Text alignment. Possible values: \"left\", \"center\", \"right\", \"justify\",\n     * \"justify-left\", \"justify-center\" or \"justify-right\".\n     * @type String\n     * @default\n     */\n    textAlign:            'left',\n\n    /**\n     * Font style . Possible values: \"\", \"normal\", \"italic\" or \"oblique\".\n     * @type String\n     * @default\n     */\n    fontStyle:            'normal',\n\n    /**\n     * Line height\n     * @type Number\n     * @default\n     */\n    lineHeight:           1.16,\n\n    /**\n     * Superscript schema object (minimum overlap)\n     * @type {Object}\n     * @default\n     */\n    superscript: {\n      size:      0.60, // fontSize factor\n      baseline: -0.35  // baseline-shift factor (upwards)\n    },\n\n    /**\n     * Subscript schema object (minimum overlap)\n     * @type {Object}\n     * @default\n     */\n    subscript: {\n      size:      0.60, // fontSize factor\n      baseline:  0.11  // baseline-shift factor (downwards)\n    },\n\n    /**\n     * Background color of text lines\n     * @type String\n     * @default\n     */\n    textBackgroundColor:  '',\n\n    /**\n     * List of properties to consider when checking if\n     * state of an object is changed ({@link fabric.Object#hasStateChanged})\n     * as well as for history (undo/redo) purposes\n     * @type Array\n     */\n    stateProperties: fabric.Object.prototype.stateProperties.concat(additionalProps),\n\n    /**\n     * List of properties to consider when checking if cache needs refresh\n     * @type Array\n     */\n    cacheProperties: fabric.Object.prototype.cacheProperties.concat(additionalProps),\n\n    /**\n     * When defined, an object is rendered via stroke and this property specifies its color.\n     * <b>Backwards incompatibility note:</b> This property was named \"strokeStyle\" until v1.1.6\n     * @type String\n     * @default\n     */\n    stroke:               null,\n\n    /**\n     * Shadow object representing shadow of this shape.\n     * <b>Backwards incompatibility note:</b> This property was named \"textShadow\" (String) until v1.2.11\n     * @type fabric.Shadow\n     * @default\n     */\n    shadow:               null,\n\n    /**\n     * fabric.Path that the text should follow.\n     * since 4.6.0 the path will be drawn automatically.\n     * if you want to make the path visible, give it a stroke and strokeWidth or fill value\n     * if you want it to be hidden, assign visible = false to the path.\n     * This feature is in BETA, and SVG import/export is not yet supported.\n     * @type fabric.Path\n     * @example\n     * var textPath = new fabric.Text('Text on a path', {\n     *     top: 150,\n     *     left: 150,\n     *     textAlign: 'center',\n     *     charSpacing: -50,\n     *     path: new fabric.Path('M 0 0 C 50 -100 150 -100 200 0', {\n     *         strokeWidth: 1,\n     *         visible: false\n     *     }),\n     *     pathSide: 'left',\n     *     pathStartOffset: 0\n     * });\n     * @default\n     */\n    path:               null,\n\n    /**\n     * Offset amount for text path starting position\n     * Only used when text has a path\n     * @type Number\n     * @default\n     */\n    pathStartOffset:               0,\n\n    /**\n     * Which side of the path the text should be drawn on.\n     * Only used when text has a path\n     * @type {String} 'left|right'\n     * @default\n     */\n    pathSide:               'left',\n\n    /**\n     * @private\n     */\n    _fontSizeFraction: 0.222,\n\n    /**\n     * @private\n     */\n    offsets: {\n      underline: 0.10,\n      linethrough: -0.315,\n      overline: -0.88\n    },\n\n    /**\n     * Text Line proportion to font Size (in pixels)\n     * @type Number\n     * @default\n     */\n    _fontSizeMult:             1.13,\n\n    /**\n     * additional space between characters\n     * expressed in thousands of em unit\n     * @type Number\n     * @default\n     */\n    charSpacing:             0,\n\n    /**\n     * Object containing character styles - top-level properties -> line numbers,\n     * 2nd-level properties - character numbers\n     * @type Object\n     * @default\n     */\n    styles: null,\n\n    /**\n     * Reference to a context to measure text char or couple of chars\n     * the cacheContext of the canvas will be used or a freshly created one if the object is not on canvas\n     * once created it will be referenced on fabric._measuringContext to avoid creating a canvas for every\n     * text object created.\n     * @type {CanvasRenderingContext2D}\n     * @default\n     */\n    _measuringContext: null,\n\n    /**\n     * Baseline shift, styles only, keep at 0 for the main text object\n     * @type {Number}\n     * @default\n     */\n    deltaY: 0,\n\n    /**\n     * WARNING: EXPERIMENTAL. NOT SUPPORTED YET\n     * determine the direction of the text.\n     * This has to be set manually together with textAlign and originX for proper\n     * experience.\n     * some interesting link for the future\n     * https://www.w3.org/International/questions/qa-bidi-unicode-controls\n     * @since 4.5.0\n     * @type {String} 'ltr|rtl'\n     * @default\n     */\n    direction: 'ltr',\n\n    /**\n     * Array of properties that define a style unit (of 'styles').\n     * @type {Array}\n     * @default\n     */\n    _styleProperties: [\n      'stroke',\n      'strokeWidth',\n      'fill',\n      'fontFamily',\n      'fontSize',\n      'fontWeight',\n      'fontStyle',\n      'underline',\n      'overline',\n      'linethrough',\n      'deltaY',\n      'textBackgroundColor',\n    ],\n\n    /**\n     * contains characters bounding boxes\n     */\n    __charBounds: [],\n\n    /**\n     * use this size when measuring text. To avoid IE11 rounding errors\n     * @type {Number}\n     * @default\n     * @readonly\n     * @private\n     */\n    CACHE_FONT_SIZE: 400,\n\n    /**\n     * contains the min text width to avoid getting 0\n     * @type {Number}\n     * @default\n     */\n    MIN_TEXT_WIDTH: 2,\n\n    /**\n     * Constructor\n     * @param {String} text Text string\n     * @param {Object} [options] Options object\n     * @return {fabric.Text} thisArg\n     */\n    initialize: function(text, options) {\n      this.styles = options ? (options.styles || { }) : { };\n      this.text = text;\n      this.__skipDimension = true;\n      this.callSuper('initialize', options);\n      if (this.path) {\n        this.setPathInfo();\n      }\n      this.__skipDimension = false;\n      this.initDimensions();\n      this.setCoords();\n      this.setupState({ propertySet: '_dimensionAffectingProps' });\n    },\n\n    /**\n     * If text has a path, it will add the extra information needed\n     * for path and text calculations\n     * @return {fabric.Text} thisArg\n     */\n    setPathInfo: function() {\n      var path = this.path;\n      if (path) {\n        path.segmentsInfo = fabric.util.getPathSegmentsInfo(path.path);\n      }\n    },\n\n    /**\n     * Return a context for measurement of text string.\n     * if created it gets stored for reuse\n     * @param {String} text Text string\n     * @param {Object} [options] Options object\n     * @return {fabric.Text} thisArg\n     */\n    getMeasuringContext: function() {\n      // if we did not return we have to measure something.\n      if (!fabric._measuringContext) {\n        fabric._measuringContext = this.canvas && this.canvas.contextCache ||\n          fabric.util.createCanvasElement().getContext('2d');\n      }\n      return fabric._measuringContext;\n    },\n\n    /**\n     * @private\n     * Divides text into lines of text and lines of graphemes.\n     */\n    _splitText: function() {\n      var newLines = this._splitTextIntoLines(this.text);\n      this.textLines = newLines.lines;\n      this._textLines = newLines.graphemeLines;\n      this._unwrappedTextLines = newLines._unwrappedLines;\n      this._text = newLines.graphemeText;\n      return newLines;\n    },\n\n    /**\n     * Initialize or update text dimensions.\n     * Updates this.width and this.height with the proper values.\n     * Does not return dimensions.\n     */\n    initDimensions: function() {\n      if (this.__skipDimension) {\n        return;\n      }\n      this._splitText();\n      this._clearCache();\n      if (this.path) {\n        this.width = this.path.width;\n        this.height = this.path.height;\n      }\n      else {\n        this.width = this.calcTextWidth() || this.cursorWidth || this.MIN_TEXT_WIDTH;\n        this.height = this.calcTextHeight();\n      }\n      if (this.textAlign.indexOf('justify') !== -1) {\n        // once text is measured we need to make space fatter to make justified text.\n        this.enlargeSpaces();\n      }\n      this.saveState({ propertySet: '_dimensionAffectingProps' });\n    },\n\n    /**\n     * Enlarge space boxes and shift the others\n     */\n    enlargeSpaces: function() {\n      var diffSpace, currentLineWidth, numberOfSpaces, accumulatedSpace, line, charBound, spaces;\n      for (var i = 0, len = this._textLines.length; i < len; i++) {\n        if (this.textAlign !== 'justify' && (i === len - 1 || this.isEndOfWrapping(i))) {\n          continue;\n        }\n        accumulatedSpace = 0;\n        line = this._textLines[i];\n        currentLineWidth = this.getLineWidth(i);\n        if (currentLineWidth < this.width && (spaces = this.textLines[i].match(this._reSpacesAndTabs))) {\n          numberOfSpaces = spaces.length;\n          diffSpace = (this.width - currentLineWidth) / numberOfSpaces;\n          for (var j = 0, jlen = line.length; j <= jlen; j++) {\n            charBound = this.__charBounds[i][j];\n            if (this._reSpaceAndTab.test(line[j])) {\n              charBound.width += diffSpace;\n              charBound.kernedWidth += diffSpace;\n              charBound.left += accumulatedSpace;\n              accumulatedSpace += diffSpace;\n            }\n            else {\n              charBound.left += accumulatedSpace;\n            }\n          }\n        }\n      }\n    },\n\n    /**\n     * Detect if the text line is ended with an hard break\n     * text and itext do not have wrapping, return false\n     * @return {Boolean}\n     */\n    isEndOfWrapping: function(lineIndex) {\n      return lineIndex === this._textLines.length - 1;\n    },\n\n    /**\n     * Detect if a line has a linebreak and so we need to account for it when moving\n     * and counting style.\n     * It return always for text and Itext.\n     * @return Number\n     */\n    missingNewlineOffset: function() {\n      return 1;\n    },\n\n    /**\n     * Returns string representation of an instance\n     * @return {String} String representation of text object\n     */\n    toString: function() {\n      return '#<fabric.Text (' + this.complexity() +\n        '): { \"text\": \"' + this.text + '\", \"fontFamily\": \"' + this.fontFamily + '\" }>';\n    },\n\n    /**\n     * Return the dimension and the zoom level needed to create a cache canvas\n     * big enough to host the object to be cached.\n     * @private\n     * @param {Object} dim.x width of object to be cached\n     * @param {Object} dim.y height of object to be cached\n     * @return {Object}.width width of canvas\n     * @return {Object}.height height of canvas\n     * @return {Object}.zoomX zoomX zoom value to unscale the canvas before drawing cache\n     * @return {Object}.zoomY zoomY zoom value to unscale the canvas before drawing cache\n     */\n    _getCacheCanvasDimensions: function() {\n      var dims = this.callSuper('_getCacheCanvasDimensions');\n      var fontSize = this.fontSize;\n      dims.width += fontSize * dims.zoomX;\n      dims.height += fontSize * dims.zoomY;\n      return dims;\n    },\n\n    /**\n     * @private\n     * @param {CanvasRenderingContext2D} ctx Context to render on\n     */\n    _render: function(ctx) {\n      var path = this.path;\n      path && !path.isNotVisible() && path._render(ctx);\n      this._setTextStyles(ctx);\n      this._renderTextLinesBackground(ctx);\n      this._renderTextDecoration(ctx, 'underline');\n      this._renderText(ctx);\n      this._renderTextDecoration(ctx, 'overline');\n      this._renderTextDecoration(ctx, 'linethrough');\n    },\n\n    /**\n     * @private\n     * @param {CanvasRenderingContext2D} ctx Context to render on\n     */\n    _renderText: function(ctx) {\n      if (this.paintFirst === 'stroke') {\n        this._renderTextStroke(ctx);\n        this._renderTextFill(ctx);\n      }\n      else {\n        this._renderTextFill(ctx);\n        this._renderTextStroke(ctx);\n      }\n    },\n\n    /**\n     * Set the font parameter of the context with the object properties or with charStyle\n     * @private\n     * @param {CanvasRenderingContext2D} ctx Context to render on\n     * @param {Object} [charStyle] object with font style properties\n     * @param {String} [charStyle.fontFamily] Font Family\n     * @param {Number} [charStyle.fontSize] Font size in pixels. ( without px suffix )\n     * @param {String} [charStyle.fontWeight] Font weight\n     * @param {String} [charStyle.fontStyle] Font style (italic|normal)\n     */\n    _setTextStyles: function(ctx, charStyle, forMeasuring) {\n      ctx.textBaseline = 'alphabetic';\n      ctx.font = this._getFontDeclaration(charStyle, forMeasuring);\n    },\n\n    /**\n     * calculate and return the text Width measuring each line.\n     * @private\n     * @param {CanvasRenderingContext2D} ctx Context to render on\n     * @return {Number} Maximum width of fabric.Text object\n     */\n    calcTextWidth: function() {\n      var maxWidth = this.getLineWidth(0);\n\n      for (var i = 1, len = this._textLines.length; i < len; i++) {\n        var currentLineWidth = this.getLineWidth(i);\n        if (currentLineWidth > maxWidth) {\n          maxWidth = currentLineWidth;\n        }\n      }\n      return maxWidth;\n    },\n\n    /**\n     * @private\n     * @param {String} method Method name (\"fillText\" or \"strokeText\")\n     * @param {CanvasRenderingContext2D} ctx Context to render on\n     * @param {String} line Text to render\n     * @param {Number} left Left position of text\n     * @param {Number} top Top position of text\n     * @param {Number} lineIndex Index of a line in a text\n     */\n    _renderTextLine: function(method, ctx, line, left, top, lineIndex) {\n      this._renderChars(method, ctx, line, left, top, lineIndex);\n    },\n\n    /**\n     * Renders the text background for lines, taking care of style\n     * @private\n     * @param {CanvasRenderingContext2D} ctx Context to render on\n     */\n    _renderTextLinesBackground: function(ctx) {\n      if (!this.textBackgroundColor && !this.styleHas('textBackgroundColor')) {\n        return;\n      }\n      var heightOfLine,\n          lineLeftOffset, originalFill = ctx.fillStyle,\n          line, lastColor,\n          leftOffset = this._getLeftOffset(),\n          lineTopOffset = this._getTopOffset(),\n          boxStart = 0, boxWidth = 0, charBox, currentColor, path = this.path,\n          drawStart;\n\n      for (var i = 0, len = this._textLines.length; i < len; i++) {\n        heightOfLine = this.getHeightOfLine(i);\n        if (!this.textBackgroundColor && !this.styleHas('textBackgroundColor', i)) {\n          lineTopOffset += heightOfLine;\n          continue;\n        }\n        line = this._textLines[i];\n        lineLeftOffset = this._getLineLeftOffset(i);\n        boxWidth = 0;\n        boxStart = 0;\n        lastColor = this.getValueOfPropertyAt(i, 0, 'textBackgroundColor');\n        for (var j = 0, jlen = line.length; j < jlen; j++) {\n          charBox = this.__charBounds[i][j];\n          currentColor = this.getValueOfPropertyAt(i, j, 'textBackgroundColor');\n          if (path) {\n            ctx.save();\n            ctx.translate(charBox.renderLeft, charBox.renderTop);\n            ctx.rotate(charBox.angle);\n            ctx.fillStyle = currentColor;\n            currentColor && ctx.fillRect(\n              -charBox.width / 2,\n              -heightOfLine / this.lineHeight * (1 - this._fontSizeFraction),\n              charBox.width,\n              heightOfLine / this.lineHeight\n            );\n            ctx.restore();\n          }\n          else if (currentColor !== lastColor) {\n            drawStart = leftOffset + lineLeftOffset + boxStart;\n            if (this.direction === 'rtl') {\n              drawStart = this.width - drawStart - boxWidth;\n            }\n            ctx.fillStyle = lastColor;\n            lastColor && ctx.fillRect(\n              drawStart,\n              lineTopOffset,\n              boxWidth,\n              heightOfLine / this.lineHeight\n            );\n            boxStart = charBox.left;\n            boxWidth = charBox.width;\n            lastColor = currentColor;\n          }\n          else {\n            boxWidth += charBox.kernedWidth;\n          }\n        }\n        if (currentColor && !path) {\n          drawStart = leftOffset + lineLeftOffset + boxStart;\n          if (this.direction === 'rtl') {\n            drawStart = this.width - drawStart - boxWidth;\n          }\n          ctx.fillStyle = currentColor;\n          ctx.fillRect(\n            drawStart,\n            lineTopOffset,\n            boxWidth,\n            heightOfLine / this.lineHeight\n          );\n        }\n        lineTopOffset += heightOfLine;\n      }\n      ctx.fillStyle = originalFill;\n      // if there is text background color no\n      // other shadows should be casted\n      this._removeShadow(ctx);\n    },\n\n    /**\n     * @private\n     * @param {Object} decl style declaration for cache\n     * @param {String} decl.fontFamily fontFamily\n     * @param {String} decl.fontStyle fontStyle\n     * @param {String} decl.fontWeight fontWeight\n     * @return {Object} reference to cache\n     */\n    getFontCache: function(decl) {\n      var fontFamily = decl.fontFamily.toLowerCase();\n      if (!fabric.charWidthsCache[fontFamily]) {\n        fabric.charWidthsCache[fontFamily] = { };\n      }\n      var cache = fabric.charWidthsCache[fontFamily],\n          cacheProp = decl.fontStyle.toLowerCase() + '_' + (decl.fontWeight + '').toLowerCase();\n      if (!cache[cacheProp]) {\n        cache[cacheProp] = { };\n      }\n      return cache[cacheProp];\n    },\n\n    /**\n     * measure and return the width of a single character.\n     * possibly overridden to accommodate different measure logic or\n     * to hook some external lib for character measurement\n     * @private\n     * @param {String} _char, char to be measured\n     * @param {Object} charStyle style of char to be measured\n     * @param {String} [previousChar] previous char\n     * @param {Object} [prevCharStyle] style of previous char\n     */\n    _measureChar: function(_char, charStyle, previousChar, prevCharStyle) {\n      // first i try to return from cache\n      var fontCache = this.getFontCache(charStyle), fontDeclaration = this._getFontDeclaration(charStyle),\n          previousFontDeclaration = this._getFontDeclaration(prevCharStyle), couple = previousChar + _char,\n          stylesAreEqual = fontDeclaration === previousFontDeclaration, width, coupleWidth, previousWidth,\n          fontMultiplier = charStyle.fontSize / this.CACHE_FONT_SIZE, kernedWidth;\n\n      if (previousChar && fontCache[previousChar] !== undefined) {\n        previousWidth = fontCache[previousChar];\n      }\n      if (fontCache[_char] !== undefined) {\n        kernedWidth = width = fontCache[_char];\n      }\n      if (stylesAreEqual && fontCache[couple] !== undefined) {\n        coupleWidth = fontCache[couple];\n        kernedWidth = coupleWidth - previousWidth;\n      }\n      if (width === undefined || previousWidth === undefined || coupleWidth === undefined) {\n        var ctx = this.getMeasuringContext();\n        // send a TRUE to specify measuring font size CACHE_FONT_SIZE\n        this._setTextStyles(ctx, charStyle, true);\n      }\n      if (width === undefined) {\n        kernedWidth = width = ctx.measureText(_char).width;\n        fontCache[_char] = width;\n      }\n      if (previousWidth === undefined && stylesAreEqual && previousChar) {\n        previousWidth = ctx.measureText(previousChar).width;\n        fontCache[previousChar] = previousWidth;\n      }\n      if (stylesAreEqual && coupleWidth === undefined) {\n        // we can measure the kerning couple and subtract the width of the previous character\n        coupleWidth = ctx.measureText(couple).width;\n        fontCache[couple] = coupleWidth;\n        kernedWidth = coupleWidth - previousWidth;\n      }\n      return { width: width * fontMultiplier, kernedWidth: kernedWidth * fontMultiplier };\n    },\n\n    /**\n     * Computes height of character at given position\n     * @param {Number} line the line index number\n     * @param {Number} _char the character index number\n     * @return {Number} fontSize of the character\n     */\n    getHeightOfChar: function(line, _char) {\n      return this.getValueOfPropertyAt(line, _char, 'fontSize');\n    },\n\n    /**\n     * measure a text line measuring all characters.\n     * @param {Number} lineIndex line number\n     * @return {Number} Line width\n     */\n    measureLine: function(lineIndex) {\n      var lineInfo = this._measureLine(lineIndex);\n      if (this.charSpacing !== 0) {\n        lineInfo.width -= this._getWidthOfCharSpacing();\n      }\n      if (lineInfo.width < 0) {\n        lineInfo.width = 0;\n      }\n      return lineInfo;\n    },\n\n    /**\n     * measure every grapheme of a line, populating __charBounds\n     * @param {Number} lineIndex\n     * @return {Object} object.width total width of characters\n     * @return {Object} object.widthOfSpaces length of chars that match this._reSpacesAndTabs\n     */\n    _measureLine: function(lineIndex) {\n      var width = 0, i, grapheme, line = this._textLines[lineIndex], prevGrapheme,\n          graphemeInfo, numOfSpaces = 0, lineBounds = new Array(line.length),\n          positionInPath = 0, startingPoint, totalPathLength, path = this.path,\n          reverse = this.pathSide === 'right';\n\n      this.__charBounds[lineIndex] = lineBounds;\n      for (i = 0; i < line.length; i++) {\n        grapheme = line[i];\n        graphemeInfo = this._getGraphemeBox(grapheme, lineIndex, i, prevGrapheme);\n        lineBounds[i] = graphemeInfo;\n        width += graphemeInfo.kernedWidth;\n        prevGrapheme = grapheme;\n      }\n      // this latest bound box represent the last character of the line\n      // to simplify cursor handling in interactive mode.\n      lineBounds[i] = {\n        left: graphemeInfo ? graphemeInfo.left + graphemeInfo.width : 0,\n        width: 0,\n        kernedWidth: 0,\n        height: this.fontSize\n      };\n      if (path) {\n        totalPathLength = path.segmentsInfo[path.segmentsInfo.length - 1].length;\n        startingPoint = fabric.util.getPointOnPath(path.path, 0, path.segmentsInfo);\n        startingPoint.x += path.pathOffset.x;\n        startingPoint.y += path.pathOffset.y;\n        switch (this.textAlign) {\n          case 'left':\n            positionInPath = reverse ? (totalPathLength - width) : 0;\n            break;\n          case 'center':\n            positionInPath = (totalPathLength - width) / 2;\n            break;\n          case 'right':\n            positionInPath = reverse ? 0 : (totalPathLength - width);\n            break;\n          //todo - add support for justify\n        }\n        positionInPath += this.pathStartOffset * (reverse ? -1 : 1);\n        for (i = reverse ? line.length - 1 : 0;\n          reverse ? i >= 0 : i < line.length;\n          reverse ? i-- : i++) {\n          graphemeInfo = lineBounds[i];\n          if (positionInPath > totalPathLength) {\n            positionInPath %= totalPathLength;\n          }\n          else if (positionInPath < 0) {\n            positionInPath += totalPathLength;\n          }\n          // it would probably much faster to send all the grapheme position for a line\n          // and calculate path position/angle at once.\n          this._setGraphemeOnPath(positionInPath, graphemeInfo, startingPoint);\n          positionInPath += graphemeInfo.kernedWidth;\n        }\n      }\n      return { width: width, numOfSpaces: numOfSpaces };\n    },\n\n    /**\n     * Calculate the angle  and the left,top position of the char that follow a path.\n     * It appends it to graphemeInfo to be reused later at rendering\n     * @private\n     * @param {Number} positionInPath to be measured\n     * @param {Object} graphemeInfo current grapheme box information\n     * @param {Object} startingPoint position of the point\n     */\n    _setGraphemeOnPath: function(positionInPath, graphemeInfo, startingPoint) {\n      var centerPosition = positionInPath + graphemeInfo.kernedWidth / 2,\n          path = this.path;\n\n      // we are at currentPositionOnPath. we want to know what point on the path is.\n      var info = fabric.util.getPointOnPath(path.path, centerPosition, path.segmentsInfo);\n      graphemeInfo.renderLeft = info.x - startingPoint.x;\n      graphemeInfo.renderTop = info.y - startingPoint.y;\n      graphemeInfo.angle = info.angle + (this.pathSide ===  'right' ? Math.PI : 0);\n    },\n\n    /**\n     * Measure and return the info of a single grapheme.\n     * needs the the info of previous graphemes already filled\n     * @private\n     * @param {String} grapheme to be measured\n     * @param {Number} lineIndex index of the line where the char is\n     * @param {Number} charIndex position in the line\n     * @param {String} [prevGrapheme] character preceding the one to be measured\n     */\n    _getGraphemeBox: function(grapheme, lineIndex, charIndex, prevGrapheme, skipLeft) {\n      var style = this.getCompleteStyleDeclaration(lineIndex, charIndex),\n          prevStyle = prevGrapheme ? this.getCompleteStyleDeclaration(lineIndex, charIndex - 1) : { },\n          info = this._measureChar(grapheme, style, prevGrapheme, prevStyle),\n          kernedWidth = info.kernedWidth,\n          width = info.width, charSpacing;\n\n      if (this.charSpacing !== 0) {\n        charSpacing = this._getWidthOfCharSpacing();\n        width += charSpacing;\n        kernedWidth += charSpacing;\n      }\n\n      var box = {\n        width: width,\n        left: 0,\n        height: style.fontSize,\n        kernedWidth: kernedWidth,\n        deltaY: style.deltaY,\n      };\n      if (charIndex > 0 && !skipLeft) {\n        var previousBox = this.__charBounds[lineIndex][charIndex - 1];\n        box.left = previousBox.left + previousBox.width + info.kernedWidth - info.width;\n      }\n      return box;\n    },\n\n    /**\n     * Calculate height of line at 'lineIndex'\n     * @param {Number} lineIndex index of line to calculate\n     * @return {Number}\n     */\n    getHeightOfLine: function(lineIndex) {\n      if (this.__lineHeights[lineIndex]) {\n        return this.__lineHeights[lineIndex];\n      }\n\n      var line = this._textLines[lineIndex],\n          // char 0 is measured before the line cycle because it nneds to char\n          // emptylines\n          maxHeight = this.getHeightOfChar(lineIndex, 0);\n      for (var i = 1, len = line.length; i < len; i++) {\n        maxHeight = Math.max(this.getHeightOfChar(lineIndex, i), maxHeight);\n      }\n\n      return this.__lineHeights[lineIndex] = maxHeight * this.lineHeight * this._fontSizeMult;\n    },\n\n    /**\n     * Calculate text box height\n     */\n    calcTextHeight: function() {\n      var lineHeight, height = 0;\n      for (var i = 0, len = this._textLines.length; i < len; i++) {\n        lineHeight = this.getHeightOfLine(i);\n        height += (i === len - 1 ? lineHeight / this.lineHeight : lineHeight);\n      }\n      return height;\n    },\n\n    /**\n     * @private\n     * @return {Number} Left offset\n     */\n    _getLeftOffset: function() {\n      return this.direction === 'ltr' ? -this.width / 2 : this.width / 2;\n    },\n\n    /**\n     * @private\n     * @return {Number} Top offset\n     */\n    _getTopOffset: function() {\n      return -this.height / 2;\n    },\n\n    /**\n     * @private\n     * @param {CanvasRenderingContext2D} ctx Context to render on\n     * @param {String} method Method name (\"fillText\" or \"strokeText\")\n     */\n    _renderTextCommon: function(ctx, method) {\n      ctx.save();\n      var lineHeights = 0, left = this._getLeftOffset(), top = this._getTopOffset();\n      for (var i = 0, len = this._textLines.length; i < len; i++) {\n        var heightOfLine = this.getHeightOfLine(i),\n            maxHeight = heightOfLine / this.lineHeight,\n            leftOffset = this._getLineLeftOffset(i);\n        this._renderTextLine(\n          method,\n          ctx,\n          this._textLines[i],\n          left + leftOffset,\n          top + lineHeights + maxHeight,\n          i\n        );\n        lineHeights += heightOfLine;\n      }\n      ctx.restore();\n    },\n\n    /**\n     * @private\n     * @param {CanvasRenderingContext2D} ctx Context to render on\n     */\n    _renderTextFill: function(ctx) {\n      if (!this.fill && !this.styleHas('fill')) {\n        return;\n      }\n\n      this._renderTextCommon(ctx, 'fillText');\n    },\n\n    /**\n     * @private\n     * @param {CanvasRenderingContext2D} ctx Context to render on\n     */\n    _renderTextStroke: function(ctx) {\n      if ((!this.stroke || this.strokeWidth === 0) && this.isEmptyStyles()) {\n        return;\n      }\n\n      if (this.shadow && !this.shadow.affectStroke) {\n        this._removeShadow(ctx);\n      }\n\n      ctx.save();\n      this._setLineDash(ctx, this.strokeDashArray);\n      ctx.beginPath();\n      this._renderTextCommon(ctx, 'strokeText');\n      ctx.closePath();\n      ctx.restore();\n    },\n\n    /**\n     * @private\n     * @param {String} method fillText or strokeText.\n     * @param {CanvasRenderingContext2D} ctx Context to render on\n     * @param {Array} line Content of the line, splitted in an array by grapheme\n     * @param {Number} left\n     * @param {Number} top\n     * @param {Number} lineIndex\n     */\n    _renderChars: function(method, ctx, line, left, top, lineIndex) {\n      // set proper line offset\n      var lineHeight = this.getHeightOfLine(lineIndex),\n          isJustify = this.textAlign.indexOf('justify') !== -1,\n          actualStyle,\n          nextStyle,\n          charsToRender = '',\n          charBox,\n          boxWidth = 0,\n          timeToRender,\n          path = this.path,\n          shortCut = !isJustify && this.charSpacing === 0 && this.isEmptyStyles(lineIndex) && !path,\n          isLtr = this.direction === 'ltr', sign = this.direction === 'ltr' ? 1 : -1,\n          drawingLeft;\n\n      ctx.save();\n      top -= lineHeight * this._fontSizeFraction / this.lineHeight;\n      if (shortCut) {\n        // render all the line in one pass without checking\n        // drawingLeft = isLtr ? left : left - this.getLineWidth(lineIndex);\n        ctx.canvas.setAttribute('dir', isLtr ? 'ltr' : 'rtl');\n        ctx.direction = isLtr ? 'ltr' : 'rtl';\n        ctx.textAlign = isLtr ? 'left' : 'right';\n        this._renderChar(method, ctx, lineIndex, 0, line.join(''), left, top, lineHeight);\n        ctx.restore();\n        return;\n      }\n      for (var i = 0, len = line.length - 1; i <= len; i++) {\n        timeToRender = i === len || this.charSpacing || path;\n        charsToRender += line[i];\n        charBox = this.__charBounds[lineIndex][i];\n        if (boxWidth === 0) {\n          left += sign * (charBox.kernedWidth - charBox.width);\n          boxWidth += charBox.width;\n        }\n        else {\n          boxWidth += charBox.kernedWidth;\n        }\n        if (isJustify && !timeToRender) {\n          if (this._reSpaceAndTab.test(line[i])) {\n            timeToRender = true;\n          }\n        }\n        if (!timeToRender) {\n          // if we have charSpacing, we render char by char\n          actualStyle = actualStyle || this.getCompleteStyleDeclaration(lineIndex, i);\n          nextStyle = this.getCompleteStyleDeclaration(lineIndex, i + 1);\n          timeToRender = this._hasStyleChanged(actualStyle, nextStyle);\n        }\n        if (timeToRender) {\n          if (path) {\n            ctx.save();\n            ctx.translate(charBox.renderLeft, charBox.renderTop);\n            ctx.rotate(charBox.angle);\n            this._renderChar(method, ctx, lineIndex, i, charsToRender, -boxWidth / 2, 0, lineHeight);\n            ctx.restore();\n          }\n          else {\n            drawingLeft = left;\n            ctx.canvas.setAttribute('dir', isLtr ? 'ltr' : 'rtl');\n            ctx.direction = isLtr ? 'ltr' : 'rtl';\n            ctx.textAlign = isLtr ? 'left' : 'right';\n            this._renderChar(method, ctx, lineIndex, i, charsToRender, drawingLeft, top, lineHeight);\n          }\n          charsToRender = '';\n          actualStyle = nextStyle;\n          left += sign * boxWidth;\n          boxWidth = 0;\n        }\n      }\n      ctx.restore();\n    },\n\n    /**\n     * This function try to patch the missing gradientTransform on canvas gradients.\n     * transforming a context to transform the gradient, is going to transform the stroke too.\n     * we want to transform the gradient but not the stroke operation, so we create\n     * a transformed gradient on a pattern and then we use the pattern instead of the gradient.\n     * this method has drawbacks: is slow, is in low resolution, needs a patch for when the size\n     * is limited.\n     * @private\n     * @param {fabric.Gradient} filler a fabric gradient instance\n     * @return {CanvasPattern} a pattern to use as fill/stroke style\n     */\n    _applyPatternGradientTransformText: function(filler) {\n      var pCanvas = fabric.util.createCanvasElement(), pCtx,\n          // TODO: verify compatibility with strokeUniform\n          width = this.width + this.strokeWidth, height = this.height + this.strokeWidth;\n      pCanvas.width = width;\n      pCanvas.height = height;\n      pCtx = pCanvas.getContext('2d');\n      pCtx.beginPath(); pCtx.moveTo(0, 0); pCtx.lineTo(width, 0); pCtx.lineTo(width, height);\n      pCtx.lineTo(0, height); pCtx.closePath();\n      pCtx.translate(width / 2, height / 2);\n      pCtx.fillStyle = filler.toLive(pCtx);\n      this._applyPatternGradientTransform(pCtx, filler);\n      pCtx.fill();\n      return pCtx.createPattern(pCanvas, 'no-repeat');\n    },\n\n    handleFiller: function(ctx, property, filler) {\n      var offsetX, offsetY;\n      if (filler.toLive) {\n        if (filler.gradientUnits === 'percentage' || filler.gradientTransform || filler.patternTransform) {\n          // need to transform gradient in a pattern.\n          // this is a slow process. If you are hitting this codepath, and the object\n          // is not using caching, you should consider switching it on.\n          // we need a canvas as big as the current object caching canvas.\n          offsetX = -this.width / 2;\n          offsetY = -this.height / 2;\n          ctx.translate(offsetX, offsetY);\n          ctx[property] = this._applyPatternGradientTransformText(filler);\n          return { offsetX: offsetX, offsetY: offsetY };\n        }\n        else {\n          // is a simple gradient or pattern\n          ctx[property] = filler.toLive(ctx, this);\n          return this._applyPatternGradientTransform(ctx, filler);\n        }\n      }\n      else {\n        // is a color\n        ctx[property] = filler;\n      }\n      return { offsetX: 0, offsetY: 0 };\n    },\n\n    _setStrokeStyles: function(ctx, decl) {\n      ctx.lineWidth = decl.strokeWidth;\n      ctx.lineCap = this.strokeLineCap;\n      ctx.lineDashOffset = this.strokeDashOffset;\n      ctx.lineJoin = this.strokeLineJoin;\n      ctx.miterLimit = this.strokeMiterLimit;\n      return this.handleFiller(ctx, 'strokeStyle', decl.stroke);\n    },\n\n    _setFillStyles: function(ctx, decl) {\n      return this.handleFiller(ctx, 'fillStyle', decl.fill);\n    },\n\n    /**\n     * @private\n     * @param {String} method\n     * @param {CanvasRenderingContext2D} ctx Context to render on\n     * @param {Number} lineIndex\n     * @param {Number} charIndex\n     * @param {String} _char\n     * @param {Number} left Left coordinate\n     * @param {Number} top Top coordinate\n     * @param {Number} lineHeight Height of the line\n     */\n    _renderChar: function(method, ctx, lineIndex, charIndex, _char, left, top) {\n      var decl = this._getStyleDeclaration(lineIndex, charIndex),\n          fullDecl = this.getCompleteStyleDeclaration(lineIndex, charIndex),\n          shouldFill = method === 'fillText' && fullDecl.fill,\n          shouldStroke = method === 'strokeText' && fullDecl.stroke && fullDecl.strokeWidth,\n          fillOffsets, strokeOffsets;\n\n      if (!shouldStroke && !shouldFill) {\n        return;\n      }\n      ctx.save();\n\n      shouldFill && (fillOffsets = this._setFillStyles(ctx, fullDecl));\n      shouldStroke && (strokeOffsets = this._setStrokeStyles(ctx, fullDecl));\n\n      ctx.font = this._getFontDeclaration(fullDecl);\n\n\n      if (decl && decl.textBackgroundColor) {\n        this._removeShadow(ctx);\n      }\n      if (decl && decl.deltaY) {\n        top += decl.deltaY;\n      }\n      shouldFill && ctx.fillText(_char, left - fillOffsets.offsetX, top - fillOffsets.offsetY);\n      shouldStroke && ctx.strokeText(_char, left - strokeOffsets.offsetX, top - strokeOffsets.offsetY);\n      ctx.restore();\n    },\n\n    /**\n     * Turns the character into a 'superior figure' (i.e. 'superscript')\n     * @param {Number} start selection start\n     * @param {Number} end selection end\n     * @returns {fabric.Text} thisArg\n     * @chainable\n     */\n    setSuperscript: function(start, end) {\n      return this._setScript(start, end, this.superscript);\n    },\n\n    /**\n     * Turns the character into an 'inferior figure' (i.e. 'subscript')\n     * @param {Number} start selection start\n     * @param {Number} end selection end\n     * @returns {fabric.Text} thisArg\n     * @chainable\n     */\n    setSubscript: function(start, end) {\n      return this._setScript(start, end, this.subscript);\n    },\n\n    /**\n     * Applies 'schema' at given position\n     * @private\n     * @param {Number} start selection start\n     * @param {Number} end selection end\n     * @param {Number} schema\n     * @returns {fabric.Text} thisArg\n     * @chainable\n     */\n    _setScript: function(start, end, schema) {\n      var loc = this.get2DCursorLocation(start, true),\n          fontSize = this.getValueOfPropertyAt(loc.lineIndex, loc.charIndex, 'fontSize'),\n          dy = this.getValueOfPropertyAt(loc.lineIndex, loc.charIndex, 'deltaY'),\n          style = { fontSize: fontSize * schema.size, deltaY: dy + fontSize * schema.baseline };\n      this.setSelectionStyles(style, start, end);\n      return this;\n    },\n\n    /**\n     * @private\n     * @param {Object} prevStyle\n     * @param {Object} thisStyle\n     */\n    _hasStyleChanged: function(prevStyle, thisStyle) {\n      return prevStyle.fill !== thisStyle.fill ||\n              prevStyle.stroke !== thisStyle.stroke ||\n              prevStyle.strokeWidth !== thisStyle.strokeWidth ||\n              prevStyle.fontSize !== thisStyle.fontSize ||\n              prevStyle.fontFamily !== thisStyle.fontFamily ||\n              prevStyle.fontWeight !== thisStyle.fontWeight ||\n              prevStyle.fontStyle !== thisStyle.fontStyle ||\n              prevStyle.deltaY !== thisStyle.deltaY;\n    },\n\n    /**\n     * @private\n     * @param {Object} prevStyle\n     * @param {Object} thisStyle\n     */\n    _hasStyleChangedForSvg: function(prevStyle, thisStyle) {\n      return this._hasStyleChanged(prevStyle, thisStyle) ||\n        prevStyle.overline !== thisStyle.overline ||\n        prevStyle.underline !== thisStyle.underline ||\n        prevStyle.linethrough !== thisStyle.linethrough;\n    },\n\n    /**\n     * @private\n     * @param {Number} lineIndex index text line\n     * @return {Number} Line left offset\n     */\n    _getLineLeftOffset: function(lineIndex) {\n      var lineWidth = this.getLineWidth(lineIndex),\n          lineDiff = this.width - lineWidth, textAlign = this.textAlign, direction = this.direction,\n          isEndOfWrapping, leftOffset = 0, isEndOfWrapping = this.isEndOfWrapping(lineIndex);\n      if (textAlign === 'justify'\n        || (textAlign === 'justify-center' && !isEndOfWrapping)\n        || (textAlign === 'justify-right' && !isEndOfWrapping)\n        || (textAlign === 'justify-left' && !isEndOfWrapping)\n      ) {\n        return 0;\n      }\n      if (textAlign === 'center') {\n        leftOffset = lineDiff / 2;\n      }\n      if (textAlign === 'right') {\n        leftOffset = lineDiff;\n      }\n      if (textAlign === 'justify-center') {\n        leftOffset = lineDiff / 2;\n      }\n      if (textAlign === 'justify-right') {\n        leftOffset = lineDiff;\n      }\n      if (direction === 'rtl') {\n        leftOffset -= lineDiff;\n      }\n      return leftOffset;\n    },\n\n    /**\n     * @private\n     */\n    _clearCache: function() {\n      this.__lineWidths = [];\n      this.__lineHeights = [];\n      this.__charBounds = [];\n    },\n\n    /**\n     * @private\n     */\n    _shouldClearDimensionCache: function() {\n      var shouldClear = this._forceClearCache;\n      shouldClear || (shouldClear = this.hasStateChanged('_dimensionAffectingProps'));\n      if (shouldClear) {\n        this.dirty = true;\n        this._forceClearCache = false;\n      }\n      return shouldClear;\n    },\n\n    /**\n     * Measure a single line given its index. Used to calculate the initial\n     * text bounding box. The values are calculated and stored in __lineWidths cache.\n     * @private\n     * @param {Number} lineIndex line number\n     * @return {Number} Line width\n     */\n    getLineWidth: function(lineIndex) {\n      if (this.__lineWidths[lineIndex]) {\n        return this.__lineWidths[lineIndex];\n      }\n\n      var width, line = this._textLines[lineIndex], lineInfo;\n\n      if (line === '') {\n        width = 0;\n      }\n      else {\n        lineInfo = this.measureLine(lineIndex);\n        width = lineInfo.width;\n      }\n      this.__lineWidths[lineIndex] = width;\n      return width;\n    },\n\n    _getWidthOfCharSpacing: function() {\n      if (this.charSpacing !== 0) {\n        return this.fontSize * this.charSpacing / 1000;\n      }\n      return 0;\n    },\n\n    /**\n     * Retrieves the value of property at given character position\n     * @param {Number} lineIndex the line number\n     * @param {Number} charIndex the character number\n     * @param {String} property the property name\n     * @returns the value of 'property'\n     */\n    getValueOfPropertyAt: function(lineIndex, charIndex, property) {\n      var charStyle = this._getStyleDeclaration(lineIndex, charIndex);\n      if (charStyle && typeof charStyle[property] !== 'undefined') {\n        return charStyle[property];\n      }\n      return this[property];\n    },\n\n    /**\n     * @private\n     * @param {CanvasRenderingContext2D} ctx Context to render on\n     */\n    _renderTextDecoration: function(ctx, type) {\n      if (!this[type] && !this.styleHas(type)) {\n        return;\n      }\n      var heightOfLine, size, _size,\n          lineLeftOffset, dy, _dy,\n          line, lastDecoration,\n          leftOffset = this._getLeftOffset(),\n          topOffset = this._getTopOffset(), top,\n          boxStart, boxWidth, charBox, currentDecoration,\n          maxHeight, currentFill, lastFill, path = this.path,\n          charSpacing = this._getWidthOfCharSpacing(),\n          offsetY = this.offsets[type];\n\n      for (var i = 0, len = this._textLines.length; i < len; i++) {\n        heightOfLine = this.getHeightOfLine(i);\n        if (!this[type] && !this.styleHas(type, i)) {\n          topOffset += heightOfLine;\n          continue;\n        }\n        line = this._textLines[i];\n        maxHeight = heightOfLine / this.lineHeight;\n        lineLeftOffset = this._getLineLeftOffset(i);\n        boxStart = 0;\n        boxWidth = 0;\n        lastDecoration = this.getValueOfPropertyAt(i, 0, type);\n        lastFill = this.getValueOfPropertyAt(i, 0, 'fill');\n        top = topOffset + maxHeight * (1 - this._fontSizeFraction);\n        size = this.getHeightOfChar(i, 0);\n        dy = this.getValueOfPropertyAt(i, 0, 'deltaY');\n        for (var j = 0, jlen = line.length; j < jlen; j++) {\n          charBox = this.__charBounds[i][j];\n          currentDecoration = this.getValueOfPropertyAt(i, j, type);\n          currentFill = this.getValueOfPropertyAt(i, j, 'fill');\n          _size = this.getHeightOfChar(i, j);\n          _dy = this.getValueOfPropertyAt(i, j, 'deltaY');\n          if (path && currentDecoration && currentFill) {\n            ctx.save();\n            ctx.fillStyle = lastFill;\n            ctx.translate(charBox.renderLeft, charBox.renderTop);\n            ctx.rotate(charBox.angle);\n            ctx.fillRect(\n              -charBox.kernedWidth / 2,\n              offsetY * _size + _dy,\n              charBox.kernedWidth,\n              this.fontSize / 15\n            );\n            ctx.restore();\n          }\n          else if (\n            (currentDecoration !== lastDecoration || currentFill !== lastFill || _size !== size || _dy !== dy)\n            && boxWidth > 0\n          ) {\n            var drawStart = leftOffset + lineLeftOffset + boxStart;\n            if (this.direction === 'rtl') {\n              drawStart = this.width - drawStart - boxWidth;\n            }\n            if (lastDecoration && lastFill) {\n              ctx.fillStyle = lastFill;\n              ctx.fillRect(\n                drawStart,\n                top + offsetY * size + dy,\n                boxWidth,\n                this.fontSize / 15\n              );\n            }\n            boxStart = charBox.left;\n            boxWidth = charBox.width;\n            lastDecoration = currentDecoration;\n            lastFill = currentFill;\n            size = _size;\n            dy = _dy;\n          }\n          else {\n            boxWidth += charBox.kernedWidth;\n          }\n        }\n        var drawStart = leftOffset + lineLeftOffset + boxStart;\n        if (this.direction === 'rtl') {\n          drawStart = this.width - drawStart - boxWidth;\n        }\n        ctx.fillStyle = currentFill;\n        currentDecoration && currentFill && ctx.fillRect(\n          drawStart,\n          top + offsetY * size + dy,\n          boxWidth - charSpacing,\n          this.fontSize / 15\n        );\n        topOffset += heightOfLine;\n      }\n      // if there is text background color no\n      // other shadows should be casted\n      this._removeShadow(ctx);\n    },\n\n    /**\n     * return font declaration string for canvas context\n     * @param {Object} [styleObject] object\n     * @returns {String} font declaration formatted for canvas context.\n     */\n    _getFontDeclaration: function(styleObject, forMeasuring) {\n      var style = styleObject || this, family = this.fontFamily,\n          fontIsGeneric = fabric.Text.genericFonts.indexOf(family.toLowerCase()) > -1;\n      var fontFamily = family === undefined ||\n      family.indexOf('\\'') > -1 || family.indexOf(',') > -1 ||\n      family.indexOf('\"') > -1 || fontIsGeneric\n        ? style.fontFamily : '\"' + style.fontFamily + '\"';\n      return [\n        // node-canvas needs \"weight style\", while browsers need \"style weight\"\n        // verify if this can be fixed in JSDOM\n        (fabric.isLikelyNode ? style.fontWeight : style.fontStyle),\n        (fabric.isLikelyNode ? style.fontStyle : style.fontWeight),\n        forMeasuring ? this.CACHE_FONT_SIZE + 'px' : style.fontSize + 'px',\n        fontFamily\n      ].join(' ');\n    },\n\n    /**\n     * Renders text instance on a specified context\n     * @param {CanvasRenderingContext2D} ctx Context to render on\n     */\n    render: function(ctx) {\n      // do not render if object is not visible\n      if (!this.visible) {\n        return;\n      }\n      if (this.canvas && this.canvas.skipOffscreen && !this.group && !this.isOnScreen()) {\n        return;\n      }\n      if (this._shouldClearDimensionCache()) {\n        this.initDimensions();\n      }\n      this.callSuper('render', ctx);\n    },\n\n    /**\n     * Returns the text as an array of lines.\n     * @param {String} text text to split\n     * @returns {Array} Lines in the text\n     */\n    _splitTextIntoLines: function(text) {\n      var lines = text.split(this._reNewline),\n          newLines = new Array(lines.length),\n          newLine = ['\\n'],\n          newText = [];\n      for (var i = 0; i < lines.length; i++) {\n        newLines[i] = fabric.util.string.graphemeSplit(lines[i]);\n        newText = newText.concat(newLines[i], newLine);\n      }\n      newText.pop();\n      return { _unwrappedLines: newLines, lines: lines, graphemeText: newText, graphemeLines: newLines };\n    },\n\n    /**\n     * Returns object representation of an instance\n     * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n     * @return {Object} Object representation of an instance\n     */\n    toObject: function(propertiesToInclude) {\n      var allProperties = additionalProps.concat(propertiesToInclude);\n      var obj = this.callSuper('toObject', allProperties);\n      // styles will be overridden with a properly cloned structure\n      obj.styles = clone(this.styles, true);\n      if (obj.path) {\n        obj.path = this.path.toObject();\n      }\n      return obj;\n    },\n\n    /**\n     * Sets property to a given value. When changing position/dimension -related properties (left, top, scale, angle, etc.) `set` does not update position of object's borders/controls. If you need to update those, call `setCoords()`.\n     * @param {String|Object} key Property name or object (if object, iterate over the object properties)\n     * @param {Object|Function} value Property value (if function, the value is passed into it and its return value is used as a new one)\n     * @return {fabric.Object} thisArg\n     * @chainable\n     */\n    set: function(key, value) {\n      this.callSuper('set', key, value);\n      var needsDims = false;\n      var isAddingPath = false;\n      if (typeof key === 'object') {\n        for (var _key in key) {\n          if (_key === 'path') {\n            this.setPathInfo();\n          }\n          needsDims = needsDims || this._dimensionAffectingProps.indexOf(_key) !== -1;\n          isAddingPath = isAddingPath || _key === 'path';\n        }\n      }\n      else {\n        needsDims = this._dimensionAffectingProps.indexOf(key) !== -1;\n        isAddingPath = key === 'path';\n      }\n      if (isAddingPath) {\n        this.setPathInfo();\n      }\n      if (needsDims) {\n        this.initDimensions();\n        this.setCoords();\n      }\n      return this;\n    },\n\n    /**\n     * Returns complexity of an instance\n     * @return {Number} complexity\n     */\n    complexity: function() {\n      return 1;\n    }\n  });\n\n  /* _FROM_SVG_START_ */\n  /**\n   * List of attribute names to account for when parsing SVG element (used by {@link fabric.Text.fromElement})\n   * @static\n   * @memberOf fabric.Text\n   * @see: http://www.w3.org/TR/SVG/text.html#TextElement\n   */\n  fabric.Text.ATTRIBUTE_NAMES = fabric.SHARED_ATTRIBUTES.concat(\n    'x y dx dy font-family font-style font-weight font-size letter-spacing text-decoration text-anchor'.split(' '));\n\n  /**\n   * Default SVG font size\n   * @static\n   * @memberOf fabric.Text\n   */\n  fabric.Text.DEFAULT_SVG_FONT_SIZE = 16;\n\n  /**\n   * Returns fabric.Text instance from an SVG element (<b>not yet implemented</b>)\n   * @static\n   * @memberOf fabric.Text\n   * @param {SVGElement} element Element to parse\n   * @param {Function} callback callback function invoked after parsing\n   * @param {Object} [options] Options object\n   */\n  fabric.Text.fromElement = function(element, callback, options) {\n    if (!element) {\n      return callback(null);\n    }\n\n    var parsedAttributes = fabric.parseAttributes(element, fabric.Text.ATTRIBUTE_NAMES),\n        parsedAnchor = parsedAttributes.textAnchor || 'left';\n    options = fabric.util.object.extend((options ? clone(options) : { }), parsedAttributes);\n\n    options.top = options.top || 0;\n    options.left = options.left || 0;\n    if (parsedAttributes.textDecoration) {\n      var textDecoration = parsedAttributes.textDecoration;\n      if (textDecoration.indexOf('underline') !== -1) {\n        options.underline = true;\n      }\n      if (textDecoration.indexOf('overline') !== -1) {\n        options.overline = true;\n      }\n      if (textDecoration.indexOf('line-through') !== -1) {\n        options.linethrough = true;\n      }\n      delete options.textDecoration;\n    }\n    if ('dx' in parsedAttributes) {\n      options.left += parsedAttributes.dx;\n    }\n    if ('dy' in parsedAttributes) {\n      options.top += parsedAttributes.dy;\n    }\n    if (!('fontSize' in options)) {\n      options.fontSize = fabric.Text.DEFAULT_SVG_FONT_SIZE;\n    }\n\n    var textContent = '';\n\n    // The XML is not properly parsed in IE9 so a workaround to get\n    // textContent is through firstChild.data. Another workaround would be\n    // to convert XML loaded from a file to be converted using DOMParser (same way loadSVGFromString() does)\n    if (!('textContent' in element)) {\n      if ('firstChild' in element && element.firstChild !== null) {\n        if ('data' in element.firstChild && element.firstChild.data !== null) {\n          textContent = element.firstChild.data;\n        }\n      }\n    }\n    else {\n      textContent = element.textContent;\n    }\n\n    textContent = textContent.replace(/^\\s+|\\s+$|\\n+/g, '').replace(/\\s+/g, ' ');\n    var originalStrokeWidth = options.strokeWidth;\n    options.strokeWidth = 0;\n\n    var text = new fabric.Text(textContent, options),\n        textHeightScaleFactor = text.getScaledHeight() / text.height,\n        lineHeightDiff = (text.height + text.strokeWidth) * text.lineHeight - text.height,\n        scaledDiff = lineHeightDiff * textHeightScaleFactor,\n        textHeight = text.getScaledHeight() + scaledDiff,\n        offX = 0;\n    /*\n      Adjust positioning:\n        x/y attributes in SVG correspond to the bottom-left corner of text bounding box\n        fabric output by default at top, left.\n    */\n    if (parsedAnchor === 'center') {\n      offX = text.getScaledWidth() / 2;\n    }\n    if (parsedAnchor === 'right') {\n      offX = text.getScaledWidth();\n    }\n    text.set({\n      left: text.left - offX,\n      top: text.top - (textHeight - text.fontSize * (0.07 + text._fontSizeFraction)) / text.lineHeight,\n      strokeWidth: typeof originalStrokeWidth !== 'undefined' ? originalStrokeWidth : 1,\n    });\n    callback(text);\n  };\n  /* _FROM_SVG_END_ */\n\n  /**\n   * Returns fabric.Text instance from an object representation\n   * @static\n   * @memberOf fabric.Text\n   * @param {Object} object plain js Object to create an instance from\n   * @param {Function} [callback] Callback to invoke when an fabric.Text instance is created\n   */\n  fabric.Text.fromObject = function(object, callback) {\n    var objectCopy = clone(object), path = object.path;\n    delete objectCopy.path;\n    return fabric.Object._fromObject('Text', objectCopy, function(textInstance) {\n      if (path) {\n        fabric.Object._fromObject('Path', path, function(pathInstance) {\n          textInstance.set('path', pathInstance);\n          callback(textInstance);\n        }, 'path');\n      }\n      else {\n        callback(textInstance);\n      }\n    }, 'text');\n  };\n\n  fabric.Text.genericFonts = ['sans-serif', 'serif', 'cursive', 'fantasy', 'monospace'];\n\n  fabric.util.createAccessors && fabric.util.createAccessors(fabric.Text);\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function() {\n  fabric.util.object.extend(fabric.Text.prototype, /** @lends fabric.Text.prototype */ {\n    /**\n     * Returns true if object has no styling or no styling in a line\n     * @param {Number} lineIndex , lineIndex is on wrapped lines.\n     * @return {Boolean}\n     */\n    isEmptyStyles: function(lineIndex) {\n      if (!this.styles) {\n        return true;\n      }\n      if (typeof lineIndex !== 'undefined' && !this.styles[lineIndex]) {\n        return true;\n      }\n      var obj = typeof lineIndex === 'undefined' ? this.styles : { line: this.styles[lineIndex] };\n      for (var p1 in obj) {\n        for (var p2 in obj[p1]) {\n          // eslint-disable-next-line no-unused-vars\n          for (var p3 in obj[p1][p2]) {\n            return false;\n          }\n        }\n      }\n      return true;\n    },\n\n    /**\n     * Returns true if object has a style property or has it ina specified line\n     * This function is used to detect if a text will use a particular property or not.\n     * @param {String} property to check for\n     * @param {Number} lineIndex to check the style on\n     * @return {Boolean}\n     */\n    styleHas: function(property, lineIndex) {\n      if (!this.styles || !property || property === '') {\n        return false;\n      }\n      if (typeof lineIndex !== 'undefined' && !this.styles[lineIndex]) {\n        return false;\n      }\n      var obj = typeof lineIndex === 'undefined' ? this.styles : { 0: this.styles[lineIndex] };\n      // eslint-disable-next-line\n      for (var p1 in obj) {\n        // eslint-disable-next-line\n        for (var p2 in obj[p1]) {\n          if (typeof obj[p1][p2][property] !== 'undefined') {\n            return true;\n          }\n        }\n      }\n      return false;\n    },\n\n    /**\n     * Check if characters in a text have a value for a property\n     * whose value matches the textbox's value for that property.  If so,\n     * the character-level property is deleted.  If the character\n     * has no other properties, then it is also deleted.  Finally,\n     * if the line containing that character has no other characters\n     * then it also is deleted.\n     *\n     * @param {string} property The property to compare between characters and text.\n     */\n    cleanStyle: function(property) {\n      if (!this.styles || !property || property === '') {\n        return false;\n      }\n      var obj = this.styles, stylesCount = 0, letterCount, stylePropertyValue,\n          allStyleObjectPropertiesMatch = true, graphemeCount = 0, styleObject;\n      // eslint-disable-next-line\n      for (var p1 in obj) {\n        letterCount = 0;\n        // eslint-disable-next-line\n        for (var p2 in obj[p1]) {\n          var styleObject = obj[p1][p2],\n              stylePropertyHasBeenSet = styleObject.hasOwnProperty(property);\n\n          stylesCount++;\n\n          if (stylePropertyHasBeenSet) {\n            if (!stylePropertyValue) {\n              stylePropertyValue = styleObject[property];\n            }\n            else if (styleObject[property] !== stylePropertyValue) {\n              allStyleObjectPropertiesMatch = false;\n            }\n\n            if (styleObject[property] === this[property]) {\n              delete styleObject[property];\n            }\n          }\n          else {\n            allStyleObjectPropertiesMatch = false;\n          }\n\n          if (Object.keys(styleObject).length !== 0) {\n            letterCount++;\n          }\n          else {\n            delete obj[p1][p2];\n          }\n        }\n\n        if (letterCount === 0) {\n          delete obj[p1];\n        }\n      }\n      // if every grapheme has the same style set then\n      // delete those styles and set it on the parent\n      for (var i = 0; i < this._textLines.length; i++) {\n        graphemeCount += this._textLines[i].length;\n      }\n      if (allStyleObjectPropertiesMatch && stylesCount === graphemeCount) {\n        this[property] = stylePropertyValue;\n        this.removeStyle(property);\n      }\n    },\n\n    /**\n     * Remove a style property or properties from all individual character styles\n     * in a text object.  Deletes the character style object if it contains no other style\n     * props.  Deletes a line style object if it contains no other character styles.\n     *\n     * @param {String} props The property to remove from character styles.\n     */\n    removeStyle: function(property) {\n      if (!this.styles || !property || property === '') {\n        return;\n      }\n      var obj = this.styles, line, lineNum, charNum;\n      for (lineNum in obj) {\n        line = obj[lineNum];\n        for (charNum in line) {\n          delete line[charNum][property];\n          if (Object.keys(line[charNum]).length === 0) {\n            delete line[charNum];\n          }\n        }\n        if (Object.keys(line).length === 0) {\n          delete obj[lineNum];\n        }\n      }\n    },\n\n    /**\n     * @private\n     */\n    _extendStyles: function(index, styles) {\n      var loc = this.get2DCursorLocation(index);\n\n      if (!this._getLineStyle(loc.lineIndex)) {\n        this._setLineStyle(loc.lineIndex);\n      }\n\n      if (!this._getStyleDeclaration(loc.lineIndex, loc.charIndex)) {\n        this._setStyleDeclaration(loc.lineIndex, loc.charIndex, {});\n      }\n\n      fabric.util.object.extend(this._getStyleDeclaration(loc.lineIndex, loc.charIndex), styles);\n    },\n\n    /**\n     * Returns 2d representation (lineIndex and charIndex) of cursor (or selection start)\n     * @param {Number} [selectionStart] Optional index. When not given, current selectionStart is used.\n     * @param {Boolean} [skipWrapping] consider the location for unwrapped lines. useful to manage styles.\n     */\n    get2DCursorLocation: function(selectionStart, skipWrapping) {\n      if (typeof selectionStart === 'undefined') {\n        selectionStart = this.selectionStart;\n      }\n      var lines = skipWrapping ? this._unwrappedTextLines : this._textLines,\n          len = lines.length;\n      for (var i = 0; i < len; i++) {\n        if (selectionStart <= lines[i].length) {\n          return {\n            lineIndex: i,\n            charIndex: selectionStart\n          };\n        }\n        selectionStart -= lines[i].length + this.missingNewlineOffset(i);\n      }\n      return {\n        lineIndex: i - 1,\n        charIndex: lines[i - 1].length < selectionStart ? lines[i - 1].length : selectionStart\n      };\n    },\n\n    /**\n     * Gets style of a current selection/cursor (at the start position)\n     * if startIndex or endIndex are not provided, selectionStart or selectionEnd will be used.\n     * @param {Number} [startIndex] Start index to get styles at\n     * @param {Number} [endIndex] End index to get styles at, if not specified selectionEnd or startIndex + 1\n     * @param {Boolean} [complete] get full style or not\n     * @return {Array} styles an array with one, zero or more Style objects\n     */\n    getSelectionStyles: function(startIndex, endIndex, complete) {\n      if (typeof startIndex === 'undefined') {\n        startIndex = this.selectionStart || 0;\n      }\n      if (typeof endIndex === 'undefined') {\n        endIndex = this.selectionEnd || startIndex;\n      }\n      var styles = [];\n      for (var i = startIndex; i < endIndex; i++) {\n        styles.push(this.getStyleAtPosition(i, complete));\n      }\n      return styles;\n    },\n\n    /**\n     * Gets style of a current selection/cursor position\n     * @param {Number} position  to get styles at\n     * @param {Boolean} [complete] full style if true\n     * @return {Object} style Style object at a specified index\n     * @private\n     */\n    getStyleAtPosition: function(position, complete) {\n      var loc = this.get2DCursorLocation(position),\n          style = complete ? this.getCompleteStyleDeclaration(loc.lineIndex, loc.charIndex) :\n            this._getStyleDeclaration(loc.lineIndex, loc.charIndex);\n      return style || {};\n    },\n\n    /**\n     * Sets style of a current selection, if no selection exist, do not set anything.\n     * @param {Object} [styles] Styles object\n     * @param {Number} [startIndex] Start index to get styles at\n     * @param {Number} [endIndex] End index to get styles at, if not specified selectionEnd or startIndex + 1\n     * @return {fabric.IText} thisArg\n     * @chainable\n     */\n    setSelectionStyles: function(styles, startIndex, endIndex) {\n      if (typeof startIndex === 'undefined') {\n        startIndex = this.selectionStart || 0;\n      }\n      if (typeof endIndex === 'undefined') {\n        endIndex = this.selectionEnd || startIndex;\n      }\n      for (var i = startIndex; i < endIndex; i++) {\n        this._extendStyles(i, styles);\n      }\n      /* not included in _extendStyles to avoid clearing cache more than once */\n      this._forceClearCache = true;\n      return this;\n    },\n\n    /**\n     * get the reference, not a clone, of the style object for a given character\n     * @param {Number} lineIndex\n     * @param {Number} charIndex\n     * @return {Object} style object\n     */\n    _getStyleDeclaration: function(lineIndex, charIndex) {\n      var lineStyle = this.styles && this.styles[lineIndex];\n      if (!lineStyle) {\n        return null;\n      }\n      return lineStyle[charIndex];\n    },\n\n    /**\n     * return a new object that contains all the style property for a character\n     * the object returned is newly created\n     * @param {Number} lineIndex of the line where the character is\n     * @param {Number} charIndex position of the character on the line\n     * @return {Object} style object\n     */\n    getCompleteStyleDeclaration: function(lineIndex, charIndex) {\n      var style = this._getStyleDeclaration(lineIndex, charIndex) || { },\n          styleObject = { }, prop;\n      for (var i = 0; i < this._styleProperties.length; i++) {\n        prop = this._styleProperties[i];\n        styleObject[prop] = typeof style[prop] === 'undefined' ? this[prop] : style[prop];\n      }\n      return styleObject;\n    },\n\n    /**\n     * @param {Number} lineIndex\n     * @param {Number} charIndex\n     * @param {Object} style\n     * @private\n     */\n    _setStyleDeclaration: function(lineIndex, charIndex, style) {\n      this.styles[lineIndex][charIndex] = style;\n    },\n\n    /**\n     *\n     * @param {Number} lineIndex\n     * @param {Number} charIndex\n     * @private\n     */\n    _deleteStyleDeclaration: function(lineIndex, charIndex) {\n      delete this.styles[lineIndex][charIndex];\n    },\n\n    /**\n     * @param {Number} lineIndex\n     * @return {Boolean} if the line exists or not\n     * @private\n     */\n    _getLineStyle: function(lineIndex) {\n      return !!this.styles[lineIndex];\n    },\n\n    /**\n     * Set the line style to an empty object so that is initialized\n     * @param {Number} lineIndex\n     * @private\n     */\n    _setLineStyle: function(lineIndex) {\n      this.styles[lineIndex] = {};\n    },\n\n    /**\n     * @param {Number} lineIndex\n     * @private\n     */\n    _deleteLineStyle: function(lineIndex) {\n      delete this.styles[lineIndex];\n    }\n  });\n})();\n\n\n(function() {\n\n  function parseDecoration(object) {\n    if (object.textDecoration) {\n      object.textDecoration.indexOf('underline') > -1 && (object.underline = true);\n      object.textDecoration.indexOf('line-through') > -1 && (object.linethrough = true);\n      object.textDecoration.indexOf('overline') > -1 && (object.overline = true);\n      delete object.textDecoration;\n    }\n  }\n\n  /**\n   * IText class (introduced in <b>v1.4</b>) Events are also fired with \"text:\"\n   * prefix when observing canvas.\n   * @class fabric.IText\n   * @extends fabric.Text\n   * @mixes fabric.Observable\n   *\n   * @fires changed\n   * @fires selection:changed\n   * @fires editing:entered\n   * @fires editing:exited\n   *\n   * @return {fabric.IText} thisArg\n   * @see {@link fabric.IText#initialize} for constructor definition\n   *\n   * <p>Supported key combinations:</p>\n   * <pre>\n   *   Move cursor:                    left, right, up, down\n   *   Select character:               shift + left, shift + right\n   *   Select text vertically:         shift + up, shift + down\n   *   Move cursor by word:            alt + left, alt + right\n   *   Select words:                   shift + alt + left, shift + alt + right\n   *   Move cursor to line start/end:  cmd + left, cmd + right or home, end\n   *   Select till start/end of line:  cmd + shift + left, cmd + shift + right or shift + home, shift + end\n   *   Jump to start/end of text:      cmd + up, cmd + down\n   *   Select till start/end of text:  cmd + shift + up, cmd + shift + down or shift + pgUp, shift + pgDown\n   *   Delete character:               backspace\n   *   Delete word:                    alt + backspace\n   *   Delete line:                    cmd + backspace\n   *   Forward delete:                 delete\n   *   Copy text:                      ctrl/cmd + c\n   *   Paste text:                     ctrl/cmd + v\n   *   Cut text:                       ctrl/cmd + x\n   *   Select entire text:             ctrl/cmd + a\n   *   Quit editing                    tab or esc\n   * </pre>\n   *\n   * <p>Supported mouse/touch combination</p>\n   * <pre>\n   *   Position cursor:                click/touch\n   *   Create selection:               click/touch & drag\n   *   Create selection:               click & shift + click\n   *   Select word:                    double click\n   *   Select line:                    triple click\n   * </pre>\n   */\n  fabric.IText = fabric.util.createClass(fabric.Text, fabric.Observable, /** @lends fabric.IText.prototype */ {\n\n    /**\n     * Type of an object\n     * @type String\n     * @default\n     */\n    type: 'i-text',\n\n    /**\n     * Index where text selection starts (or where cursor is when there is no selection)\n     * @type Number\n     * @default\n     */\n    selectionStart: 0,\n\n    /**\n     * Index where text selection ends\n     * @type Number\n     * @default\n     */\n    selectionEnd: 0,\n\n    /**\n     * Color of text selection\n     * @type String\n     * @default\n     */\n    selectionColor: 'rgba(17,119,255,0.3)',\n\n    /**\n     * Indicates whether text is in editing mode\n     * @type Boolean\n     * @default\n     */\n    isEditing: false,\n\n    /**\n     * Indicates whether a text can be edited\n     * @type Boolean\n     * @default\n     */\n    editable: true,\n\n    /**\n     * Border color of text object while it's in editing mode\n     * @type String\n     * @default\n     */\n    editingBorderColor: 'rgba(102,153,255,0.25)',\n\n    /**\n     * Width of cursor (in px)\n     * @type Number\n     * @default\n     */\n    cursorWidth: 2,\n\n    /**\n     * Color of text cursor color in editing mode.\n     * if not set (default) will take color from the text.\n     * if set to a color value that fabric can understand, it will\n     * be used instead of the color of the text at the current position.\n     * @type String\n     * @default\n     */\n    cursorColor: '',\n\n    /**\n     * Delay between cursor blink (in ms)\n     * @type Number\n     * @default\n     */\n    cursorDelay: 1000,\n\n    /**\n     * Duration of cursor fadein (in ms)\n     * @type Number\n     * @default\n     */\n    cursorDuration: 600,\n\n    /**\n     * Indicates whether internal text char widths can be cached\n     * @type Boolean\n     * @default\n     */\n    caching: true,\n\n    /**\n     * DOM container to append the hiddenTextarea.\n     * An alternative to attaching to the document.body.\n     * Useful to reduce laggish redraw of the full document.body tree and\n     * also with modals event capturing that won't let the textarea take focus.\n     * @type HTMLElement\n     * @default\n     */\n    hiddenTextareaContainer: null,\n\n    /**\n     * @private\n     */\n    _reSpace: /\\s|\\n/,\n\n    /**\n     * @private\n     */\n    _currentCursorOpacity: 0,\n\n    /**\n     * @private\n     */\n    _selectionDirection: null,\n\n    /**\n     * @private\n     */\n    _abortCursorAnimation: false,\n\n    /**\n     * @private\n     */\n    __widthOfSpace: [],\n\n    /**\n     * Helps determining when the text is in composition, so that the cursor\n     * rendering is altered.\n     */\n    inCompositionMode: false,\n\n    /**\n     * Constructor\n     * @param {String} text Text string\n     * @param {Object} [options] Options object\n     * @return {fabric.IText} thisArg\n     */\n    initialize: function(text, options) {\n      this.callSuper('initialize', text, options);\n      this.initBehavior();\n    },\n\n    /**\n     * Sets selection start (left boundary of a selection)\n     * @param {Number} index Index to set selection start to\n     */\n    setSelectionStart: function(index) {\n      index = Math.max(index, 0);\n      this._updateAndFire('selectionStart', index);\n    },\n\n    /**\n     * Sets selection end (right boundary of a selection)\n     * @param {Number} index Index to set selection end to\n     */\n    setSelectionEnd: function(index) {\n      index = Math.min(index, this.text.length);\n      this._updateAndFire('selectionEnd', index);\n    },\n\n    /**\n     * @private\n     * @param {String} property 'selectionStart' or 'selectionEnd'\n     * @param {Number} index new position of property\n     */\n    _updateAndFire: function(property, index) {\n      if (this[property] !== index) {\n        this._fireSelectionChanged();\n        this[property] = index;\n      }\n      this._updateTextarea();\n    },\n\n    /**\n     * Fires the even of selection changed\n     * @private\n     */\n    _fireSelectionChanged: function() {\n      this.fire('selection:changed');\n      this.canvas && this.canvas.fire('text:selection:changed', { target: this });\n    },\n\n    /**\n     * Initialize text dimensions. Render all text on given context\n     * or on a offscreen canvas to get the text width with measureText.\n     * Updates this.width and this.height with the proper values.\n     * Does not return dimensions.\n     * @private\n     */\n    initDimensions: function() {\n      this.isEditing && this.initDelayedCursor();\n      this.clearContextTop();\n      this.callSuper('initDimensions');\n    },\n\n    /**\n     * @private\n     * @param {CanvasRenderingContext2D} ctx Context to render on\n     */\n    render: function(ctx) {\n      this.clearContextTop();\n      this.callSuper('render', ctx);\n      // clear the cursorOffsetCache, so we ensure to calculate once per renderCursor\n      // the correct position but not at every cursor animation.\n      this.cursorOffsetCache = { };\n      this.renderCursorOrSelection();\n    },\n\n    /**\n     * @private\n     * @param {CanvasRenderingContext2D} ctx Context to render on\n     */\n    _render: function(ctx) {\n      this.callSuper('_render', ctx);\n    },\n\n    /**\n     * Prepare and clean the contextTop\n     */\n    clearContextTop: function(skipRestore) {\n      if (!this.isEditing || !this.canvas || !this.canvas.contextTop) {\n        return;\n      }\n      var ctx = this.canvas.contextTop, v = this.canvas.viewportTransform;\n      ctx.save();\n      ctx.transform(v[0], v[1], v[2], v[3], v[4], v[5]);\n      this.transform(ctx);\n      this._clearTextArea(ctx);\n      skipRestore || ctx.restore();\n    },\n    /**\n     * Renders cursor or selection (depending on what exists)\n     * it does on the contextTop. If contextTop is not available, do nothing.\n     */\n    renderCursorOrSelection: function() {\n      if (!this.isEditing || !this.canvas || !this.canvas.contextTop) {\n        return;\n      }\n      var boundaries = this._getCursorBoundaries(),\n          ctx = this.canvas.contextTop;\n      this.clearContextTop(true);\n      if (this.selectionStart === this.selectionEnd) {\n        this.renderCursor(boundaries, ctx);\n      }\n      else {\n        this.renderSelection(boundaries, ctx);\n      }\n      ctx.restore();\n    },\n\n    _clearTextArea: function(ctx) {\n      // we add 4 pixel, to be sure to do not leave any pixel out\n      var width = this.width + 4, height = this.height + 4;\n      ctx.clearRect(-width / 2, -height / 2, width, height);\n    },\n\n    /**\n     * Returns cursor boundaries (left, top, leftOffset, topOffset)\n     * @private\n     * @param {Array} chars Array of characters\n     * @param {String} typeOfBoundaries\n     */\n    _getCursorBoundaries: function(position) {\n\n      // left/top are left/top of entire text box\n      // leftOffset/topOffset are offset from that left/top point of a text box\n\n      if (typeof position === 'undefined') {\n        position = this.selectionStart;\n      }\n\n      var left = this._getLeftOffset(),\n          top = this._getTopOffset(),\n          offsets = this._getCursorBoundariesOffsets(position);\n      return {\n        left: left,\n        top: top,\n        leftOffset: offsets.left,\n        topOffset: offsets.top\n      };\n    },\n\n    /**\n     * @private\n     */\n    _getCursorBoundariesOffsets: function(position) {\n      if (this.cursorOffsetCache && 'top' in this.cursorOffsetCache) {\n        return this.cursorOffsetCache;\n      }\n      var lineLeftOffset,\n          lineIndex,\n          charIndex,\n          topOffset = 0,\n          leftOffset = 0,\n          boundaries,\n          cursorPosition = this.get2DCursorLocation(position);\n      charIndex = cursorPosition.charIndex;\n      lineIndex = cursorPosition.lineIndex;\n      for (var i = 0; i < lineIndex; i++) {\n        topOffset += this.getHeightOfLine(i);\n      }\n      lineLeftOffset = this._getLineLeftOffset(lineIndex);\n      var bound = this.__charBounds[lineIndex][charIndex];\n      bound && (leftOffset = bound.left);\n      if (this.charSpacing !== 0 && charIndex === this._textLines[lineIndex].length) {\n        leftOffset -= this._getWidthOfCharSpacing();\n      }\n      boundaries = {\n        top: topOffset,\n        left: lineLeftOffset + (leftOffset > 0 ? leftOffset : 0),\n      };\n      if (this.direction === 'rtl') {\n        boundaries.left *= -1;\n      }\n      this.cursorOffsetCache = boundaries;\n      return this.cursorOffsetCache;\n    },\n\n    /**\n     * Renders cursor\n     * @param {Object} boundaries\n     * @param {CanvasRenderingContext2D} ctx transformed context to draw on\n     */\n    renderCursor: function(boundaries, ctx) {\n      var cursorLocation = this.get2DCursorLocation(),\n          lineIndex = cursorLocation.lineIndex,\n          charIndex = cursorLocation.charIndex > 0 ? cursorLocation.charIndex - 1 : 0,\n          charHeight = this.getValueOfPropertyAt(lineIndex, charIndex, 'fontSize'),\n          multiplier = this.scaleX * this.canvas.getZoom(),\n          cursorWidth = this.cursorWidth / multiplier,\n          topOffset = boundaries.topOffset,\n          dy = this.getValueOfPropertyAt(lineIndex, charIndex, 'deltaY');\n      topOffset += (1 - this._fontSizeFraction) * this.getHeightOfLine(lineIndex) / this.lineHeight\n        - charHeight * (1 - this._fontSizeFraction);\n\n      if (this.inCompositionMode) {\n        this.renderSelection(boundaries, ctx);\n      }\n      ctx.fillStyle = this.cursorColor || this.getValueOfPropertyAt(lineIndex, charIndex, 'fill');\n      ctx.globalAlpha = this.__isMousedown ? 1 : this._currentCursorOpacity;\n      ctx.fillRect(\n        boundaries.left + boundaries.leftOffset - cursorWidth / 2,\n        topOffset + boundaries.top + dy,\n        cursorWidth,\n        charHeight);\n    },\n\n    /**\n     * Renders text selection\n     * @param {Object} boundaries Object with left/top/leftOffset/topOffset\n     * @param {CanvasRenderingContext2D} ctx transformed context to draw on\n     */\n    renderSelection: function(boundaries, ctx) {\n\n      var selectionStart = this.inCompositionMode ? this.hiddenTextarea.selectionStart : this.selectionStart,\n          selectionEnd = this.inCompositionMode ? this.hiddenTextarea.selectionEnd : this.selectionEnd,\n          isJustify = this.textAlign.indexOf('justify') !== -1,\n          start = this.get2DCursorLocation(selectionStart),\n          end = this.get2DCursorLocation(selectionEnd),\n          startLine = start.lineIndex,\n          endLine = end.lineIndex,\n          startChar = start.charIndex < 0 ? 0 : start.charIndex,\n          endChar = end.charIndex < 0 ? 0 : end.charIndex;\n\n      for (var i = startLine; i <= endLine; i++) {\n        var lineOffset = this._getLineLeftOffset(i) || 0,\n            lineHeight = this.getHeightOfLine(i),\n            realLineHeight = 0, boxStart = 0, boxEnd = 0;\n\n        if (i === startLine) {\n          boxStart = this.__charBounds[startLine][startChar].left;\n        }\n        if (i >= startLine && i < endLine) {\n          boxEnd = isJustify && !this.isEndOfWrapping(i) ? this.width : this.getLineWidth(i) || 5; // WTF is this 5?\n        }\n        else if (i === endLine) {\n          if (endChar === 0) {\n            boxEnd = this.__charBounds[endLine][endChar].left;\n          }\n          else {\n            var charSpacing = this._getWidthOfCharSpacing();\n            boxEnd = this.__charBounds[endLine][endChar - 1].left\n              + this.__charBounds[endLine][endChar - 1].width - charSpacing;\n          }\n        }\n        realLineHeight = lineHeight;\n        if (this.lineHeight < 1 || (i === endLine && this.lineHeight > 1)) {\n          lineHeight /= this.lineHeight;\n        }\n        var drawStart = boundaries.left + lineOffset + boxStart,\n            drawWidth = boxEnd - boxStart,\n            drawHeight = lineHeight, extraTop = 0;\n        if (this.inCompositionMode) {\n          ctx.fillStyle = this.compositionColor || 'black';\n          drawHeight = 1;\n          extraTop = lineHeight;\n        }\n        else {\n          ctx.fillStyle = this.selectionColor;\n        }\n        if (this.direction === 'rtl') {\n          drawStart = this.width - drawStart - drawWidth;\n        }\n        ctx.fillRect(\n          drawStart,\n          boundaries.top + boundaries.topOffset + extraTop,\n          drawWidth,\n          drawHeight);\n        boundaries.topOffset += realLineHeight;\n      }\n    },\n\n    /**\n     * High level function to know the height of the cursor.\n     * the currentChar is the one that precedes the cursor\n     * Returns fontSize of char at the current cursor\n     * Unused from the library, is for the end user\n     * @return {Number} Character font size\n     */\n    getCurrentCharFontSize: function() {\n      var cp = this._getCurrentCharIndex();\n      return this.getValueOfPropertyAt(cp.l, cp.c, 'fontSize');\n    },\n\n    /**\n     * High level function to know the color of the cursor.\n     * the currentChar is the one that precedes the cursor\n     * Returns color (fill) of char at the current cursor\n     * if the text object has a pattern or gradient for filler, it will return that.\n     * Unused by the library, is for the end user\n     * @return {String | fabric.Gradient | fabric.Pattern} Character color (fill)\n     */\n    getCurrentCharColor: function() {\n      var cp = this._getCurrentCharIndex();\n      return this.getValueOfPropertyAt(cp.l, cp.c, 'fill');\n    },\n\n    /**\n     * Returns the cursor position for the getCurrent.. functions\n     * @private\n     */\n    _getCurrentCharIndex: function() {\n      var cursorPosition = this.get2DCursorLocation(this.selectionStart, true),\n          charIndex = cursorPosition.charIndex > 0 ? cursorPosition.charIndex - 1 : 0;\n      return { l: cursorPosition.lineIndex, c: charIndex };\n    }\n  });\n\n  /**\n   * Returns fabric.IText instance from an object representation\n   * @static\n   * @memberOf fabric.IText\n   * @param {Object} object Object to create an instance from\n   * @param {function} [callback] invoked with new instance as argument\n   */\n  fabric.IText.fromObject = function(object, callback) {\n    parseDecoration(object);\n    if (object.styles) {\n      for (var i in object.styles) {\n        for (var j in object.styles[i]) {\n          parseDecoration(object.styles[i][j]);\n        }\n      }\n    }\n    fabric.Object._fromObject('IText', object, callback, 'text');\n  };\n})();\n\n\n(function() {\n\n  var clone = fabric.util.object.clone;\n\n  fabric.util.object.extend(fabric.IText.prototype, /** @lends fabric.IText.prototype */ {\n\n    /**\n     * Initializes all the interactive behavior of IText\n     */\n    initBehavior: function() {\n      this.initAddedHandler();\n      this.initRemovedHandler();\n      this.initCursorSelectionHandlers();\n      this.initDoubleClickSimulation();\n      this.mouseMoveHandler = this.mouseMoveHandler.bind(this);\n    },\n\n    onDeselect: function() {\n      this.isEditing && this.exitEditing();\n      this.selected = false;\n    },\n\n    /**\n     * Initializes \"added\" event handler\n     */\n    initAddedHandler: function() {\n      var _this = this;\n      this.on('added', function() {\n        var canvas = _this.canvas;\n        if (canvas) {\n          if (!canvas._hasITextHandlers) {\n            canvas._hasITextHandlers = true;\n            _this._initCanvasHandlers(canvas);\n          }\n          canvas._iTextInstances = canvas._iTextInstances || [];\n          canvas._iTextInstances.push(_this);\n        }\n      });\n    },\n\n    initRemovedHandler: function() {\n      var _this = this;\n      this.on('removed', function() {\n        var canvas = _this.canvas;\n        if (canvas) {\n          canvas._iTextInstances = canvas._iTextInstances || [];\n          fabric.util.removeFromArray(canvas._iTextInstances, _this);\n          if (canvas._iTextInstances.length === 0) {\n            canvas._hasITextHandlers = false;\n            _this._removeCanvasHandlers(canvas);\n          }\n        }\n      });\n    },\n\n    /**\n     * register canvas event to manage exiting on other instances\n     * @private\n     */\n    _initCanvasHandlers: function(canvas) {\n      canvas._mouseUpITextHandler = function() {\n        if (canvas._iTextInstances) {\n          canvas._iTextInstances.forEach(function(obj) {\n            obj.__isMousedown = false;\n          });\n        }\n      };\n      canvas.on('mouse:up', canvas._mouseUpITextHandler);\n    },\n\n    /**\n     * remove canvas event to manage exiting on other instances\n     * @private\n     */\n    _removeCanvasHandlers: function(canvas) {\n      canvas.off('mouse:up', canvas._mouseUpITextHandler);\n    },\n\n    /**\n     * @private\n     */\n    _tick: function() {\n      this._currentTickState = this._animateCursor(this, 1, this.cursorDuration, '_onTickComplete');\n    },\n\n    /**\n     * @private\n     */\n    _animateCursor: function(obj, targetOpacity, duration, completeMethod) {\n\n      var tickState;\n\n      tickState = {\n        isAborted: false,\n        abort: function() {\n          this.isAborted = true;\n        },\n      };\n\n      obj.animate('_currentCursorOpacity', targetOpacity, {\n        duration: duration,\n        onComplete: function() {\n          if (!tickState.isAborted) {\n            obj[completeMethod]();\n          }\n        },\n        onChange: function() {\n          // we do not want to animate a selection, only cursor\n          if (obj.canvas && obj.selectionStart === obj.selectionEnd) {\n            obj.renderCursorOrSelection();\n          }\n        },\n        abort: function() {\n          return tickState.isAborted;\n        }\n      });\n      return tickState;\n    },\n\n    /**\n     * @private\n     */\n    _onTickComplete: function() {\n\n      var _this = this;\n\n      if (this._cursorTimeout1) {\n        clearTimeout(this._cursorTimeout1);\n      }\n      this._cursorTimeout1 = setTimeout(function() {\n        _this._currentTickCompleteState = _this._animateCursor(_this, 0, this.cursorDuration / 2, '_tick');\n      }, 100);\n    },\n\n    /**\n     * Initializes delayed cursor\n     */\n    initDelayedCursor: function(restart) {\n      var _this = this,\n          delay = restart ? 0 : this.cursorDelay;\n\n      this.abortCursorAnimation();\n      this._currentCursorOpacity = 1;\n      this._cursorTimeout2 = setTimeout(function() {\n        _this._tick();\n      }, delay);\n    },\n\n    /**\n     * Aborts cursor animation and clears all timeouts\n     */\n    abortCursorAnimation: function() {\n      var shouldClear = this._currentTickState || this._currentTickCompleteState,\n          canvas = this.canvas;\n      this._currentTickState && this._currentTickState.abort();\n      this._currentTickCompleteState && this._currentTickCompleteState.abort();\n\n      clearTimeout(this._cursorTimeout1);\n      clearTimeout(this._cursorTimeout2);\n\n      this._currentCursorOpacity = 0;\n      // to clear just itext area we need to transform the context\n      // it may not be worth it\n      if (shouldClear && canvas) {\n        canvas.clearContext(canvas.contextTop || canvas.contextContainer);\n      }\n\n    },\n\n    /**\n     * Selects entire text\n     * @return {fabric.IText} thisArg\n     * @chainable\n     */\n    selectAll: function() {\n      this.selectionStart = 0;\n      this.selectionEnd = this._text.length;\n      this._fireSelectionChanged();\n      this._updateTextarea();\n      return this;\n    },\n\n    /**\n     * Returns selected text\n     * @return {String}\n     */\n    getSelectedText: function() {\n      return this._text.slice(this.selectionStart, this.selectionEnd).join('');\n    },\n\n    /**\n     * Find new selection index representing start of current word according to current selection index\n     * @param {Number} startFrom Current selection index\n     * @return {Number} New selection index\n     */\n    findWordBoundaryLeft: function(startFrom) {\n      var offset = 0, index = startFrom - 1;\n\n      // remove space before cursor first\n      if (this._reSpace.test(this._text[index])) {\n        while (this._reSpace.test(this._text[index])) {\n          offset++;\n          index--;\n        }\n      }\n      while (/\\S/.test(this._text[index]) && index > -1) {\n        offset++;\n        index--;\n      }\n\n      return startFrom - offset;\n    },\n\n    /**\n     * Find new selection index representing end of current word according to current selection index\n     * @param {Number} startFrom Current selection index\n     * @return {Number} New selection index\n     */\n    findWordBoundaryRight: function(startFrom) {\n      var offset = 0, index = startFrom;\n\n      // remove space after cursor first\n      if (this._reSpace.test(this._text[index])) {\n        while (this._reSpace.test(this._text[index])) {\n          offset++;\n          index++;\n        }\n      }\n      while (/\\S/.test(this._text[index]) && index < this._text.length) {\n        offset++;\n        index++;\n      }\n\n      return startFrom + offset;\n    },\n\n    /**\n     * Find new selection index representing start of current line according to current selection index\n     * @param {Number} startFrom Current selection index\n     * @return {Number} New selection index\n     */\n    findLineBoundaryLeft: function(startFrom) {\n      var offset = 0, index = startFrom - 1;\n\n      while (!/\\n/.test(this._text[index]) && index > -1) {\n        offset++;\n        index--;\n      }\n\n      return startFrom - offset;\n    },\n\n    /**\n     * Find new selection index representing end of current line according to current selection index\n     * @param {Number} startFrom Current selection index\n     * @return {Number} New selection index\n     */\n    findLineBoundaryRight: function(startFrom) {\n      var offset = 0, index = startFrom;\n\n      while (!/\\n/.test(this._text[index]) && index < this._text.length) {\n        offset++;\n        index++;\n      }\n\n      return startFrom + offset;\n    },\n\n    /**\n     * Finds index corresponding to beginning or end of a word\n     * @param {Number} selectionStart Index of a character\n     * @param {Number} direction 1 or -1\n     * @return {Number} Index of the beginning or end of a word\n     */\n    searchWordBoundary: function(selectionStart, direction) {\n      var text = this._text,\n          index     = this._reSpace.test(text[selectionStart]) ? selectionStart - 1 : selectionStart,\n          _char     = text[index],\n          // wrong\n          reNonWord = fabric.reNonWord;\n\n      while (!reNonWord.test(_char) && index > 0 && index < text.length) {\n        index += direction;\n        _char = text[index];\n      }\n      if (reNonWord.test(_char)) {\n        index += direction === 1 ? 0 : 1;\n      }\n      return index;\n    },\n\n    /**\n     * Selects a word based on the index\n     * @param {Number} selectionStart Index of a character\n     */\n    selectWord: function(selectionStart) {\n      selectionStart = selectionStart || this.selectionStart;\n      var newSelectionStart = this.searchWordBoundary(selectionStart, -1), /* search backwards */\n          newSelectionEnd = this.searchWordBoundary(selectionStart, 1); /* search forward */\n\n      this.selectionStart = newSelectionStart;\n      this.selectionEnd = newSelectionEnd;\n      this._fireSelectionChanged();\n      this._updateTextarea();\n      this.renderCursorOrSelection();\n    },\n\n    /**\n     * Selects a line based on the index\n     * @param {Number} selectionStart Index of a character\n     * @return {fabric.IText} thisArg\n     * @chainable\n     */\n    selectLine: function(selectionStart) {\n      selectionStart = selectionStart || this.selectionStart;\n      var newSelectionStart = this.findLineBoundaryLeft(selectionStart),\n          newSelectionEnd = this.findLineBoundaryRight(selectionStart);\n\n      this.selectionStart = newSelectionStart;\n      this.selectionEnd = newSelectionEnd;\n      this._fireSelectionChanged();\n      this._updateTextarea();\n      return this;\n    },\n\n    /**\n     * Enters editing state\n     * @return {fabric.IText} thisArg\n     * @chainable\n     */\n    enterEditing: function(e) {\n      if (this.isEditing || !this.editable) {\n        return;\n      }\n\n      if (this.canvas) {\n        this.canvas.calcOffset();\n        this.exitEditingOnOthers(this.canvas);\n      }\n\n      this.isEditing = true;\n\n      this.initHiddenTextarea(e);\n      this.hiddenTextarea.focus();\n      this.hiddenTextarea.value = this.text;\n      this._updateTextarea();\n      this._saveEditingProps();\n      this._setEditingProps();\n      this._textBeforeEdit = this.text;\n\n      this._tick();\n      this.fire('editing:entered');\n      this._fireSelectionChanged();\n      if (!this.canvas) {\n        return this;\n      }\n      this.canvas.fire('text:editing:entered', { target: this });\n      this.initMouseMoveHandler();\n      this.canvas.requestRenderAll();\n      return this;\n    },\n\n    exitEditingOnOthers: function(canvas) {\n      if (canvas._iTextInstances) {\n        canvas._iTextInstances.forEach(function(obj) {\n          obj.selected = false;\n          if (obj.isEditing) {\n            obj.exitEditing();\n          }\n        });\n      }\n    },\n\n    /**\n     * Initializes \"mousemove\" event handler\n     */\n    initMouseMoveHandler: function() {\n      this.canvas.on('mouse:move', this.mouseMoveHandler);\n    },\n\n    /**\n     * @private\n     */\n    mouseMoveHandler: function(options) {\n      if (!this.__isMousedown || !this.isEditing) {\n        return;\n      }\n\n      var newSelectionStart = this.getSelectionStartFromPointer(options.e),\n          currentStart = this.selectionStart,\n          currentEnd = this.selectionEnd;\n      if (\n        (newSelectionStart !== this.__selectionStartOnMouseDown || currentStart === currentEnd)\n        &&\n        (currentStart === newSelectionStart || currentEnd === newSelectionStart)\n      ) {\n        return;\n      }\n      if (newSelectionStart > this.__selectionStartOnMouseDown) {\n        this.selectionStart = this.__selectionStartOnMouseDown;\n        this.selectionEnd = newSelectionStart;\n      }\n      else {\n        this.selectionStart = newSelectionStart;\n        this.selectionEnd = this.__selectionStartOnMouseDown;\n      }\n      if (this.selectionStart !== currentStart || this.selectionEnd !== currentEnd) {\n        this.restartCursorIfNeeded();\n        this._fireSelectionChanged();\n        this._updateTextarea();\n        this.renderCursorOrSelection();\n      }\n    },\n\n    /**\n     * @private\n     */\n    _setEditingProps: function() {\n      this.hoverCursor = 'text';\n\n      if (this.canvas) {\n        this.canvas.defaultCursor = this.canvas.moveCursor = 'text';\n      }\n\n      this.borderColor = this.editingBorderColor;\n      this.hasControls = this.selectable = false;\n      this.lockMovementX = this.lockMovementY = true;\n    },\n\n    /**\n     * convert from textarea to grapheme indexes\n     */\n    fromStringToGraphemeSelection: function(start, end, text) {\n      var smallerTextStart = text.slice(0, start),\n          graphemeStart = fabric.util.string.graphemeSplit(smallerTextStart).length;\n      if (start === end) {\n        return { selectionStart: graphemeStart, selectionEnd: graphemeStart };\n      }\n      var smallerTextEnd = text.slice(start, end),\n          graphemeEnd = fabric.util.string.graphemeSplit(smallerTextEnd).length;\n      return { selectionStart: graphemeStart, selectionEnd: graphemeStart + graphemeEnd };\n    },\n\n    /**\n     * convert from fabric to textarea values\n     */\n    fromGraphemeToStringSelection: function(start, end, _text) {\n      var smallerTextStart = _text.slice(0, start),\n          graphemeStart = smallerTextStart.join('').length;\n      if (start === end) {\n        return { selectionStart: graphemeStart, selectionEnd: graphemeStart };\n      }\n      var smallerTextEnd = _text.slice(start, end),\n          graphemeEnd = smallerTextEnd.join('').length;\n      return { selectionStart: graphemeStart, selectionEnd: graphemeStart + graphemeEnd };\n    },\n\n    /**\n     * @private\n     */\n    _updateTextarea: function() {\n      this.cursorOffsetCache = { };\n      if (!this.hiddenTextarea) {\n        return;\n      }\n      if (!this.inCompositionMode) {\n        var newSelection = this.fromGraphemeToStringSelection(this.selectionStart, this.selectionEnd, this._text);\n        this.hiddenTextarea.selectionStart = newSelection.selectionStart;\n        this.hiddenTextarea.selectionEnd = newSelection.selectionEnd;\n      }\n      this.updateTextareaPosition();\n    },\n\n    /**\n     * @private\n     */\n    updateFromTextArea: function() {\n      if (!this.hiddenTextarea) {\n        return;\n      }\n      this.cursorOffsetCache = { };\n      this.text = this.hiddenTextarea.value;\n      if (this._shouldClearDimensionCache()) {\n        this.initDimensions();\n        this.setCoords();\n      }\n      var newSelection = this.fromStringToGraphemeSelection(\n        this.hiddenTextarea.selectionStart, this.hiddenTextarea.selectionEnd, this.hiddenTextarea.value);\n      this.selectionEnd = this.selectionStart = newSelection.selectionEnd;\n      if (!this.inCompositionMode) {\n        this.selectionStart = newSelection.selectionStart;\n      }\n      this.updateTextareaPosition();\n    },\n\n    /**\n     * @private\n     */\n    updateTextareaPosition: function() {\n      if (this.selectionStart === this.selectionEnd) {\n        var style = this._calcTextareaPosition();\n        this.hiddenTextarea.style.left = style.left;\n        this.hiddenTextarea.style.top = style.top;\n      }\n    },\n\n    /**\n     * @private\n     * @return {Object} style contains style for hiddenTextarea\n     */\n    _calcTextareaPosition: function() {\n      if (!this.canvas) {\n        return { x: 1, y: 1 };\n      }\n      var desiredPosition = this.inCompositionMode ? this.compositionStart : this.selectionStart,\n          boundaries = this._getCursorBoundaries(desiredPosition),\n          cursorLocation = this.get2DCursorLocation(desiredPosition),\n          lineIndex = cursorLocation.lineIndex,\n          charIndex = cursorLocation.charIndex,\n          charHeight = this.getValueOfPropertyAt(lineIndex, charIndex, 'fontSize') * this.lineHeight,\n          leftOffset = boundaries.leftOffset,\n          m = this.calcTransformMatrix(),\n          p = {\n            x: boundaries.left + leftOffset,\n            y: boundaries.top + boundaries.topOffset + charHeight\n          },\n          retinaScaling = this.canvas.getRetinaScaling(),\n          upperCanvas = this.canvas.upperCanvasEl,\n          upperCanvasWidth = upperCanvas.width / retinaScaling,\n          upperCanvasHeight = upperCanvas.height / retinaScaling,\n          maxWidth = upperCanvasWidth - charHeight,\n          maxHeight = upperCanvasHeight - charHeight,\n          scaleX = upperCanvas.clientWidth / upperCanvasWidth,\n          scaleY = upperCanvas.clientHeight / upperCanvasHeight;\n\n      p = fabric.util.transformPoint(p, m);\n      p = fabric.util.transformPoint(p, this.canvas.viewportTransform);\n      p.x *= scaleX;\n      p.y *= scaleY;\n      if (p.x < 0) {\n        p.x = 0;\n      }\n      if (p.x > maxWidth) {\n        p.x = maxWidth;\n      }\n      if (p.y < 0) {\n        p.y = 0;\n      }\n      if (p.y > maxHeight) {\n        p.y = maxHeight;\n      }\n\n      // add canvas offset on document\n      p.x += this.canvas._offset.left;\n      p.y += this.canvas._offset.top;\n\n      return { left: p.x + 'px', top: p.y + 'px', fontSize: charHeight + 'px', charHeight: charHeight };\n    },\n\n    /**\n     * @private\n     */\n    _saveEditingProps: function() {\n      this._savedProps = {\n        hasControls: this.hasControls,\n        borderColor: this.borderColor,\n        lockMovementX: this.lockMovementX,\n        lockMovementY: this.lockMovementY,\n        hoverCursor: this.hoverCursor,\n        selectable: this.selectable,\n        defaultCursor: this.canvas && this.canvas.defaultCursor,\n        moveCursor: this.canvas && this.canvas.moveCursor\n      };\n    },\n\n    /**\n     * @private\n     */\n    _restoreEditingProps: function() {\n      if (!this._savedProps) {\n        return;\n      }\n\n      this.hoverCursor = this._savedProps.hoverCursor;\n      this.hasControls = this._savedProps.hasControls;\n      this.borderColor = this._savedProps.borderColor;\n      this.selectable = this._savedProps.selectable;\n      this.lockMovementX = this._savedProps.lockMovementX;\n      this.lockMovementY = this._savedProps.lockMovementY;\n\n      if (this.canvas) {\n        this.canvas.defaultCursor = this._savedProps.defaultCursor;\n        this.canvas.moveCursor = this._savedProps.moveCursor;\n      }\n    },\n\n    /**\n     * Exits from editing state\n     * @return {fabric.IText} thisArg\n     * @chainable\n     */\n    exitEditing: function() {\n      var isTextChanged = (this._textBeforeEdit !== this.text);\n      var hiddenTextarea = this.hiddenTextarea;\n      this.selected = false;\n      this.isEditing = false;\n\n      this.selectionEnd = this.selectionStart;\n\n      if (hiddenTextarea) {\n        hiddenTextarea.blur && hiddenTextarea.blur();\n        hiddenTextarea.parentNode && hiddenTextarea.parentNode.removeChild(hiddenTextarea);\n      }\n      this.hiddenTextarea = null;\n      this.abortCursorAnimation();\n      this._restoreEditingProps();\n      this._currentCursorOpacity = 0;\n      if (this._shouldClearDimensionCache()) {\n        this.initDimensions();\n        this.setCoords();\n      }\n      this.fire('editing:exited');\n      isTextChanged && this.fire('modified');\n      if (this.canvas) {\n        this.canvas.off('mouse:move', this.mouseMoveHandler);\n        this.canvas.fire('text:editing:exited', { target: this });\n        isTextChanged && this.canvas.fire('object:modified', { target: this });\n      }\n      return this;\n    },\n\n    /**\n     * @private\n     */\n    _removeExtraneousStyles: function() {\n      for (var prop in this.styles) {\n        if (!this._textLines[prop]) {\n          delete this.styles[prop];\n        }\n      }\n    },\n\n    /**\n     * remove and reflow a style block from start to end.\n     * @param {Number} start linear start position for removal (included in removal)\n     * @param {Number} end linear end position for removal ( excluded from removal )\n     */\n    removeStyleFromTo: function(start, end) {\n      var cursorStart = this.get2DCursorLocation(start, true),\n          cursorEnd = this.get2DCursorLocation(end, true),\n          lineStart = cursorStart.lineIndex,\n          charStart = cursorStart.charIndex,\n          lineEnd = cursorEnd.lineIndex,\n          charEnd = cursorEnd.charIndex,\n          i, styleObj;\n      if (lineStart !== lineEnd) {\n        // step1 remove the trailing of lineStart\n        if (this.styles[lineStart]) {\n          for (i = charStart; i < this._unwrappedTextLines[lineStart].length; i++) {\n            delete this.styles[lineStart][i];\n          }\n        }\n        // step2 move the trailing of lineEnd to lineStart if needed\n        if (this.styles[lineEnd]) {\n          for (i = charEnd; i < this._unwrappedTextLines[lineEnd].length; i++) {\n            styleObj = this.styles[lineEnd][i];\n            if (styleObj) {\n              this.styles[lineStart] || (this.styles[lineStart] = { });\n              this.styles[lineStart][charStart + i - charEnd] = styleObj;\n            }\n          }\n        }\n        // step3 detects lines will be completely removed.\n        for (i = lineStart + 1; i <= lineEnd; i++) {\n          delete this.styles[i];\n        }\n        // step4 shift remaining lines.\n        this.shiftLineStyles(lineEnd, lineStart - lineEnd);\n      }\n      else {\n        // remove and shift left on the same line\n        if (this.styles[lineStart]) {\n          styleObj = this.styles[lineStart];\n          var diff = charEnd - charStart, numericChar, _char;\n          for (i = charStart; i < charEnd; i++) {\n            delete styleObj[i];\n          }\n          for (_char in this.styles[lineStart]) {\n            numericChar = parseInt(_char, 10);\n            if (numericChar >= charEnd) {\n              styleObj[numericChar - diff] = styleObj[_char];\n              delete styleObj[_char];\n            }\n          }\n        }\n      }\n    },\n\n    /**\n     * Shifts line styles up or down\n     * @param {Number} lineIndex Index of a line\n     * @param {Number} offset Can any number?\n     */\n    shiftLineStyles: function(lineIndex, offset) {\n      // shift all line styles by offset upward or downward\n      // do not clone deep. we need new array, not new style objects\n      var clonedStyles = clone(this.styles);\n      for (var line in this.styles) {\n        var numericLine = parseInt(line, 10);\n        if (numericLine > lineIndex) {\n          this.styles[numericLine + offset] = clonedStyles[numericLine];\n          if (!clonedStyles[numericLine - offset]) {\n            delete this.styles[numericLine];\n          }\n        }\n      }\n    },\n\n    restartCursorIfNeeded: function() {\n      if (!this._currentTickState || this._currentTickState.isAborted\n        || !this._currentTickCompleteState || this._currentTickCompleteState.isAborted\n      ) {\n        this.initDelayedCursor();\n      }\n    },\n\n    /**\n     * Handle insertion of more consecutive style lines for when one or more\n     * newlines gets added to the text. Since current style needs to be shifted\n     * first we shift the current style of the number lines needed, then we add\n     * new lines from the last to the first.\n     * @param {Number} lineIndex Index of a line\n     * @param {Number} charIndex Index of a char\n     * @param {Number} qty number of lines to add\n     * @param {Array} copiedStyle Array of objects styles\n     */\n    insertNewlineStyleObject: function(lineIndex, charIndex, qty, copiedStyle) {\n      var currentCharStyle,\n          newLineStyles = {},\n          somethingAdded = false,\n          isEndOfLine = this._unwrappedTextLines[lineIndex].length === charIndex;\n\n      qty || (qty = 1);\n      this.shiftLineStyles(lineIndex, qty);\n      if (this.styles[lineIndex]) {\n        currentCharStyle = this.styles[lineIndex][charIndex === 0 ? charIndex : charIndex - 1];\n      }\n      // we clone styles of all chars\n      // after cursor onto the current line\n      for (var index in this.styles[lineIndex]) {\n        var numIndex = parseInt(index, 10);\n        if (numIndex >= charIndex) {\n          somethingAdded = true;\n          newLineStyles[numIndex - charIndex] = this.styles[lineIndex][index];\n          // remove lines from the previous line since they're on a new line now\n          if (!(isEndOfLine && charIndex === 0)) {\n            delete this.styles[lineIndex][index];\n          }\n        }\n      }\n      var styleCarriedOver = false;\n      if (somethingAdded && !isEndOfLine) {\n        // if is end of line, the extra style we copied\n        // is probably not something we want\n        this.styles[lineIndex + qty] = newLineStyles;\n        styleCarriedOver = true;\n      }\n      if (styleCarriedOver) {\n        // skip the last line of since we already prepared it.\n        qty--;\n      }\n      // for the all the lines or all the other lines\n      // we clone current char style onto the next (otherwise empty) line\n      while (qty > 0) {\n        if (copiedStyle && copiedStyle[qty - 1]) {\n          this.styles[lineIndex + qty] = { 0: clone(copiedStyle[qty - 1]) };\n        }\n        else if (currentCharStyle) {\n          this.styles[lineIndex + qty] = { 0: clone(currentCharStyle) };\n        }\n        else {\n          delete this.styles[lineIndex + qty];\n        }\n        qty--;\n      }\n      this._forceClearCache = true;\n    },\n\n    /**\n     * Inserts style object for a given line/char index\n     * @param {Number} lineIndex Index of a line\n     * @param {Number} charIndex Index of a char\n     * @param {Number} quantity number Style object to insert, if given\n     * @param {Array} copiedStyle array of style objects\n     */\n    insertCharStyleObject: function(lineIndex, charIndex, quantity, copiedStyle) {\n      if (!this.styles) {\n        this.styles = {};\n      }\n      var currentLineStyles       = this.styles[lineIndex],\n          currentLineStylesCloned = currentLineStyles ? clone(currentLineStyles) : {};\n\n      quantity || (quantity = 1);\n      // shift all char styles by quantity forward\n      // 0,1,2,3 -> (charIndex=2) -> 0,1,3,4 -> (insert 2) -> 0,1,2,3,4\n      for (var index in currentLineStylesCloned) {\n        var numericIndex = parseInt(index, 10);\n        if (numericIndex >= charIndex) {\n          currentLineStyles[numericIndex + quantity] = currentLineStylesCloned[numericIndex];\n          // only delete the style if there was nothing moved there\n          if (!currentLineStylesCloned[numericIndex - quantity]) {\n            delete currentLineStyles[numericIndex];\n          }\n        }\n      }\n      this._forceClearCache = true;\n      if (copiedStyle) {\n        while (quantity--) {\n          if (!Object.keys(copiedStyle[quantity]).length) {\n            continue;\n          }\n          if (!this.styles[lineIndex]) {\n            this.styles[lineIndex] = {};\n          }\n          this.styles[lineIndex][charIndex + quantity] = clone(copiedStyle[quantity]);\n        }\n        return;\n      }\n      if (!currentLineStyles) {\n        return;\n      }\n      var newStyle = currentLineStyles[charIndex ? charIndex - 1 : 1];\n      while (newStyle && quantity--) {\n        this.styles[lineIndex][charIndex + quantity] = clone(newStyle);\n      }\n    },\n\n    /**\n     * Inserts style object(s)\n     * @param {Array} insertedText Characters at the location where style is inserted\n     * @param {Number} start cursor index for inserting style\n     * @param {Array} [copiedStyle] array of style objects to insert.\n     */\n    insertNewStyleBlock: function(insertedText, start, copiedStyle) {\n      var cursorLoc = this.get2DCursorLocation(start, true),\n          addedLines = [0], linesLength = 0;\n      // get an array of how many char per lines are being added.\n      for (var i = 0; i < insertedText.length; i++) {\n        if (insertedText[i] === '\\n') {\n          linesLength++;\n          addedLines[linesLength] = 0;\n        }\n        else {\n          addedLines[linesLength]++;\n        }\n      }\n      // for the first line copy the style from the current char position.\n      if (addedLines[0] > 0) {\n        this.insertCharStyleObject(cursorLoc.lineIndex, cursorLoc.charIndex, addedLines[0], copiedStyle);\n        copiedStyle = copiedStyle && copiedStyle.slice(addedLines[0] + 1);\n      }\n      linesLength && this.insertNewlineStyleObject(\n        cursorLoc.lineIndex, cursorLoc.charIndex + addedLines[0], linesLength);\n      for (var i = 1; i < linesLength; i++) {\n        if (addedLines[i] > 0) {\n          this.insertCharStyleObject(cursorLoc.lineIndex + i, 0, addedLines[i], copiedStyle);\n        }\n        else if (copiedStyle) {\n          this.styles[cursorLoc.lineIndex + i][0] = copiedStyle[0];\n        }\n        copiedStyle = copiedStyle && copiedStyle.slice(addedLines[i] + 1);\n      }\n      // we use i outside the loop to get it like linesLength\n      if (addedLines[i] > 0) {\n        this.insertCharStyleObject(cursorLoc.lineIndex + i, 0, addedLines[i], copiedStyle);\n      }\n    },\n\n    /**\n     * Set the selectionStart and selectionEnd according to the new position of cursor\n     * mimic the key - mouse navigation when shift is pressed.\n     */\n    setSelectionStartEndWithShift: function(start, end, newSelection) {\n      if (newSelection <= start) {\n        if (end === start) {\n          this._selectionDirection = 'left';\n        }\n        else if (this._selectionDirection === 'right') {\n          this._selectionDirection = 'left';\n          this.selectionEnd = start;\n        }\n        this.selectionStart = newSelection;\n      }\n      else if (newSelection > start && newSelection < end) {\n        if (this._selectionDirection === 'right') {\n          this.selectionEnd = newSelection;\n        }\n        else {\n          this.selectionStart = newSelection;\n        }\n      }\n      else {\n        // newSelection is > selection start and end\n        if (end === start) {\n          this._selectionDirection = 'right';\n        }\n        else if (this._selectionDirection === 'left') {\n          this._selectionDirection = 'right';\n          this.selectionStart = end;\n        }\n        this.selectionEnd = newSelection;\n      }\n    },\n\n    setSelectionInBoundaries: function() {\n      var length = this.text.length;\n      if (this.selectionStart > length) {\n        this.selectionStart = length;\n      }\n      else if (this.selectionStart < 0) {\n        this.selectionStart = 0;\n      }\n      if (this.selectionEnd > length) {\n        this.selectionEnd = length;\n      }\n      else if (this.selectionEnd < 0) {\n        this.selectionEnd = 0;\n      }\n    }\n  });\n})();\n\n\nfabric.util.object.extend(fabric.IText.prototype, /** @lends fabric.IText.prototype */ {\n  /**\n   * Initializes \"dbclick\" event handler\n   */\n  initDoubleClickSimulation: function() {\n\n    // for double click\n    this.__lastClickTime = +new Date();\n\n    // for triple click\n    this.__lastLastClickTime = +new Date();\n\n    this.__lastPointer = { };\n\n    this.on('mousedown', this.onMouseDown);\n  },\n\n  /**\n   * Default event handler to simulate triple click\n   * @private\n   */\n  onMouseDown: function(options) {\n    if (!this.canvas) {\n      return;\n    }\n    this.__newClickTime = +new Date();\n    var newPointer = options.pointer;\n    if (this.isTripleClick(newPointer)) {\n      this.fire('tripleclick', options);\n      this._stopEvent(options.e);\n    }\n    this.__lastLastClickTime = this.__lastClickTime;\n    this.__lastClickTime = this.__newClickTime;\n    this.__lastPointer = newPointer;\n    this.__lastIsEditing = this.isEditing;\n    this.__lastSelected = this.selected;\n  },\n\n  isTripleClick: function(newPointer) {\n    return this.__newClickTime - this.__lastClickTime < 500 &&\n        this.__lastClickTime - this.__lastLastClickTime < 500 &&\n        this.__lastPointer.x === newPointer.x &&\n        this.__lastPointer.y === newPointer.y;\n  },\n\n  /**\n   * @private\n   */\n  _stopEvent: function(e) {\n    e.preventDefault && e.preventDefault();\n    e.stopPropagation && e.stopPropagation();\n  },\n\n  /**\n   * Initializes event handlers related to cursor or selection\n   */\n  initCursorSelectionHandlers: function() {\n    this.initMousedownHandler();\n    this.initMouseupHandler();\n    this.initClicks();\n  },\n\n  /**\n   * Default handler for double click, select a word\n   */\n  doubleClickHandler: function(options) {\n    if (!this.isEditing) {\n      return;\n    }\n    this.selectWord(this.getSelectionStartFromPointer(options.e));\n  },\n\n  /**\n   * Default handler for triple click, select a line\n   */\n  tripleClickHandler: function(options) {\n    if (!this.isEditing) {\n      return;\n    }\n    this.selectLine(this.getSelectionStartFromPointer(options.e));\n  },\n\n  /**\n   * Initializes double and triple click event handlers\n   */\n  initClicks: function() {\n    this.on('mousedblclick', this.doubleClickHandler);\n    this.on('tripleclick', this.tripleClickHandler);\n  },\n\n  /**\n   * Default event handler for the basic functionalities needed on _mouseDown\n   * can be overridden to do something different.\n   * Scope of this implementation is: find the click position, set selectionStart\n   * find selectionEnd, initialize the drawing of either cursor or selection area\n   * initializing a mousedDown on a text area will cancel fabricjs knowledge of\n   * current compositionMode. It will be set to false.\n   */\n  _mouseDownHandler: function(options) {\n    if (!this.canvas || !this.editable || (options.e.button && options.e.button !== 1)) {\n      return;\n    }\n\n    this.__isMousedown = true;\n\n    if (this.selected) {\n      this.inCompositionMode = false;\n      this.setCursorByClick(options.e);\n    }\n\n    if (this.isEditing) {\n      this.__selectionStartOnMouseDown = this.selectionStart;\n      if (this.selectionStart === this.selectionEnd) {\n        this.abortCursorAnimation();\n      }\n      this.renderCursorOrSelection();\n    }\n  },\n\n  /**\n   * Default event handler for the basic functionalities needed on mousedown:before\n   * can be overridden to do something different.\n   * Scope of this implementation is: verify the object is already selected when mousing down\n   */\n  _mouseDownHandlerBefore: function(options) {\n    if (!this.canvas || !this.editable || (options.e.button && options.e.button !== 1)) {\n      return;\n    }\n    // we want to avoid that an object that was selected and then becomes unselectable,\n    // may trigger editing mode in some way.\n    this.selected = this === this.canvas._activeObject;\n  },\n\n  /**\n   * Initializes \"mousedown\" event handler\n   */\n  initMousedownHandler: function() {\n    this.on('mousedown', this._mouseDownHandler);\n    this.on('mousedown:before', this._mouseDownHandlerBefore);\n  },\n\n  /**\n   * Initializes \"mouseup\" event handler\n   */\n  initMouseupHandler: function() {\n    this.on('mouseup', this.mouseUpHandler);\n  },\n\n  /**\n   * standard handler for mouse up, overridable\n   * @private\n   */\n  mouseUpHandler: function(options) {\n    this.__isMousedown = false;\n    if (!this.editable || this.group ||\n      (options.transform && options.transform.actionPerformed) ||\n      (options.e.button && options.e.button !== 1)) {\n      return;\n    }\n\n    if (this.canvas) {\n      var currentActive = this.canvas._activeObject;\n      if (currentActive && currentActive !== this) {\n        // avoid running this logic when there is an active object\n        // this because is possible with shift click and fast clicks,\n        // to rapidly deselect and reselect this object and trigger an enterEdit\n        return;\n      }\n    }\n\n    if (this.__lastSelected && !this.__corner) {\n      this.selected = false;\n      this.__lastSelected = false;\n      this.enterEditing(options.e);\n      if (this.selectionStart === this.selectionEnd) {\n        this.initDelayedCursor(true);\n      }\n      else {\n        this.renderCursorOrSelection();\n      }\n    }\n    else {\n      this.selected = true;\n    }\n  },\n\n  /**\n   * Changes cursor location in a text depending on passed pointer (x/y) object\n   * @param {Event} e Event object\n   */\n  setCursorByClick: function(e) {\n    var newSelection = this.getSelectionStartFromPointer(e),\n        start = this.selectionStart, end = this.selectionEnd;\n    if (e.shiftKey) {\n      this.setSelectionStartEndWithShift(start, end, newSelection);\n    }\n    else {\n      this.selectionStart = newSelection;\n      this.selectionEnd = newSelection;\n    }\n    if (this.isEditing) {\n      this._fireSelectionChanged();\n      this._updateTextarea();\n    }\n  },\n\n  /**\n   * Returns index of a character corresponding to where an object was clicked\n   * @param {Event} e Event object\n   * @return {Number} Index of a character\n   */\n  getSelectionStartFromPointer: function(e) {\n    var mouseOffset = this.getLocalPointer(e),\n        prevWidth = 0,\n        width = 0,\n        height = 0,\n        charIndex = 0,\n        lineIndex = 0,\n        lineLeftOffset,\n        line;\n    for (var i = 0, len = this._textLines.length; i < len; i++) {\n      if (height <= mouseOffset.y) {\n        height += this.getHeightOfLine(i) * this.scaleY;\n        lineIndex = i;\n        if (i > 0) {\n          charIndex += this._textLines[i - 1].length + this.missingNewlineOffset(i - 1);\n        }\n      }\n      else {\n        break;\n      }\n    }\n    lineLeftOffset = this._getLineLeftOffset(lineIndex);\n    width = lineLeftOffset * this.scaleX;\n    line = this._textLines[lineIndex];\n    // handling of RTL: in order to get things work correctly,\n    // we assume RTL writing is mirrored compared to LTR writing.\n    // so in position detection we mirror the X offset, and when is time\n    // of rendering it, we mirror it again.\n    if (this.direction === 'rtl') {\n      mouseOffset.x = this.width * this.scaleX - mouseOffset.x + width;\n    }\n    for (var j = 0, jlen = line.length; j < jlen; j++) {\n      prevWidth = width;\n      // i removed something about flipX here, check.\n      width += this.__charBounds[lineIndex][j].kernedWidth * this.scaleX;\n      if (width <= mouseOffset.x) {\n        charIndex++;\n      }\n      else {\n        break;\n      }\n    }\n    return this._getNewSelectionStartFromOffset(mouseOffset, prevWidth, width, charIndex, jlen);\n  },\n\n  /**\n   * @private\n   */\n  _getNewSelectionStartFromOffset: function(mouseOffset, prevWidth, width, index, jlen) {\n    // we need Math.abs because when width is after the last char, the offset is given as 1, while is 0\n    var distanceBtwLastCharAndCursor = mouseOffset.x - prevWidth,\n        distanceBtwNextCharAndCursor = width - mouseOffset.x,\n        offset = distanceBtwNextCharAndCursor > distanceBtwLastCharAndCursor ||\n          distanceBtwNextCharAndCursor < 0 ? 0 : 1,\n        newSelectionStart = index + offset;\n    // if object is horizontally flipped, mirror cursor location from the end\n    if (this.flipX) {\n      newSelectionStart = jlen - newSelectionStart;\n    }\n\n    if (newSelectionStart > this._text.length) {\n      newSelectionStart = this._text.length;\n    }\n\n    return newSelectionStart;\n  }\n});\n\n\nfabric.util.object.extend(fabric.IText.prototype, /** @lends fabric.IText.prototype */ {\n\n  /**\n   * Initializes hidden textarea (needed to bring up keyboard in iOS)\n   */\n  initHiddenTextarea: function() {\n    this.hiddenTextarea = fabric.document.createElement('textarea');\n    this.hiddenTextarea.setAttribute('autocapitalize', 'off');\n    this.hiddenTextarea.setAttribute('autocorrect', 'off');\n    this.hiddenTextarea.setAttribute('autocomplete', 'off');\n    this.hiddenTextarea.setAttribute('spellcheck', 'false');\n    this.hiddenTextarea.setAttribute('data-fabric-hiddentextarea', '');\n    this.hiddenTextarea.setAttribute('wrap', 'off');\n    var style = this._calcTextareaPosition();\n    // line-height: 1px; was removed from the style to fix this:\n    // https://bugs.chromium.org/p/chromium/issues/detail?id=870966\n    this.hiddenTextarea.style.cssText = 'position: absolute; top: ' + style.top +\n    '; left: ' + style.left + '; z-index: -999; opacity: 0; width: 1px; height: 1px; font-size: 1px;' +\n    ' paddingーtop: ' + style.fontSize + ';';\n\n    if (this.hiddenTextareaContainer) {\n      this.hiddenTextareaContainer.appendChild(this.hiddenTextarea);\n    }\n    else {\n      fabric.document.body.appendChild(this.hiddenTextarea);\n    }\n\n    fabric.util.addListener(this.hiddenTextarea, 'keydown', this.onKeyDown.bind(this));\n    fabric.util.addListener(this.hiddenTextarea, 'keyup', this.onKeyUp.bind(this));\n    fabric.util.addListener(this.hiddenTextarea, 'input', this.onInput.bind(this));\n    fabric.util.addListener(this.hiddenTextarea, 'copy', this.copy.bind(this));\n    fabric.util.addListener(this.hiddenTextarea, 'cut', this.copy.bind(this));\n    fabric.util.addListener(this.hiddenTextarea, 'paste', this.paste.bind(this));\n    fabric.util.addListener(this.hiddenTextarea, 'compositionstart', this.onCompositionStart.bind(this));\n    fabric.util.addListener(this.hiddenTextarea, 'compositionupdate', this.onCompositionUpdate.bind(this));\n    fabric.util.addListener(this.hiddenTextarea, 'compositionend', this.onCompositionEnd.bind(this));\n\n    if (!this._clickHandlerInitialized && this.canvas) {\n      fabric.util.addListener(this.canvas.upperCanvasEl, 'click', this.onClick.bind(this));\n      this._clickHandlerInitialized = true;\n    }\n  },\n\n  /**\n   * For functionalities on keyDown\n   * Map a special key to a function of the instance/prototype\n   * If you need different behaviour for ESC or TAB or arrows, you have to change\n   * this map setting the name of a function that you build on the fabric.Itext or\n   * your prototype.\n   * the map change will affect all Instances unless you need for only some text Instances\n   * in that case you have to clone this object and assign your Instance.\n   * this.keysMap = fabric.util.object.clone(this.keysMap);\n   * The function must be in fabric.Itext.prototype.myFunction And will receive event as args[0]\n   */\n  keysMap: {\n    9:  'exitEditing',\n    27: 'exitEditing',\n    33: 'moveCursorUp',\n    34: 'moveCursorDown',\n    35: 'moveCursorRight',\n    36: 'moveCursorLeft',\n    37: 'moveCursorLeft',\n    38: 'moveCursorUp',\n    39: 'moveCursorRight',\n    40: 'moveCursorDown',\n  },\n\n  keysMapRtl: {\n    9:  'exitEditing',\n    27: 'exitEditing',\n    33: 'moveCursorUp',\n    34: 'moveCursorDown',\n    35: 'moveCursorLeft',\n    36: 'moveCursorRight',\n    37: 'moveCursorRight',\n    38: 'moveCursorUp',\n    39: 'moveCursorLeft',\n    40: 'moveCursorDown',\n  },\n\n  /**\n   * For functionalities on keyUp + ctrl || cmd\n   */\n  ctrlKeysMapUp: {\n    67: 'copy',\n    88: 'cut'\n  },\n\n  /**\n   * For functionalities on keyDown + ctrl || cmd\n   */\n  ctrlKeysMapDown: {\n    65: 'selectAll'\n  },\n\n  onClick: function() {\n    // No need to trigger click event here, focus is enough to have the keyboard appear on Android\n    this.hiddenTextarea && this.hiddenTextarea.focus();\n  },\n\n  /**\n   * Handles keydown event\n   * only used for arrows and combination of modifier keys.\n   * @param {Event} e Event object\n   */\n  onKeyDown: function(e) {\n    if (!this.isEditing) {\n      return;\n    }\n    var keyMap = this.direction === 'rtl' ? this.keysMapRtl : this.keysMap;\n    if (e.keyCode in keyMap) {\n      this[keyMap[e.keyCode]](e);\n    }\n    else if ((e.keyCode in this.ctrlKeysMapDown) && (e.ctrlKey || e.metaKey)) {\n      this[this.ctrlKeysMapDown[e.keyCode]](e);\n    }\n    else {\n      return;\n    }\n    e.stopImmediatePropagation();\n    e.preventDefault();\n    if (e.keyCode >= 33 && e.keyCode <= 40) {\n      // if i press an arrow key just update selection\n      this.inCompositionMode = false;\n      this.clearContextTop();\n      this.renderCursorOrSelection();\n    }\n    else {\n      this.canvas && this.canvas.requestRenderAll();\n    }\n  },\n\n  /**\n   * Handles keyup event\n   * We handle KeyUp because ie11 and edge have difficulties copy/pasting\n   * if a copy/cut event fired, keyup is dismissed\n   * @param {Event} e Event object\n   */\n  onKeyUp: function(e) {\n    if (!this.isEditing || this._copyDone || this.inCompositionMode) {\n      this._copyDone = false;\n      return;\n    }\n    if ((e.keyCode in this.ctrlKeysMapUp) && (e.ctrlKey || e.metaKey)) {\n      this[this.ctrlKeysMapUp[e.keyCode]](e);\n    }\n    else {\n      return;\n    }\n    e.stopImmediatePropagation();\n    e.preventDefault();\n    this.canvas && this.canvas.requestRenderAll();\n  },\n\n  /**\n   * Handles onInput event\n   * @param {Event} e Event object\n   */\n  onInput: function(e) {\n    var fromPaste = this.fromPaste;\n    this.fromPaste = false;\n    e && e.stopPropagation();\n    if (!this.isEditing) {\n      return;\n    }\n    // decisions about style changes.\n    var nextText = this._splitTextIntoLines(this.hiddenTextarea.value).graphemeText,\n        charCount = this._text.length,\n        nextCharCount = nextText.length,\n        removedText, insertedText,\n        charDiff = nextCharCount - charCount,\n        selectionStart = this.selectionStart, selectionEnd = this.selectionEnd,\n        selection = selectionStart !== selectionEnd,\n        copiedStyle, removeFrom, removeTo;\n    if (this.hiddenTextarea.value === '') {\n      this.styles = { };\n      this.updateFromTextArea();\n      this.fire('changed');\n      if (this.canvas) {\n        this.canvas.fire('text:changed', { target: this });\n        this.canvas.requestRenderAll();\n      }\n      return;\n    }\n\n    var textareaSelection = this.fromStringToGraphemeSelection(\n      this.hiddenTextarea.selectionStart,\n      this.hiddenTextarea.selectionEnd,\n      this.hiddenTextarea.value\n    );\n    var backDelete = selectionStart > textareaSelection.selectionStart;\n\n    if (selection) {\n      removedText = this._text.slice(selectionStart, selectionEnd);\n      charDiff += selectionEnd - selectionStart;\n    }\n    else if (nextCharCount < charCount) {\n      if (backDelete) {\n        removedText = this._text.slice(selectionEnd + charDiff, selectionEnd);\n      }\n      else {\n        removedText = this._text.slice(selectionStart, selectionStart - charDiff);\n      }\n    }\n    insertedText = nextText.slice(textareaSelection.selectionEnd - charDiff, textareaSelection.selectionEnd);\n    if (removedText && removedText.length) {\n      if (insertedText.length) {\n        // let's copy some style before deleting.\n        // we want to copy the style before the cursor OR the style at the cursor if selection\n        // is bigger than 0.\n        copiedStyle = this.getSelectionStyles(selectionStart, selectionStart + 1, false);\n        // now duplicate the style one for each inserted text.\n        copiedStyle = insertedText.map(function() {\n          // this return an array of references, but that is fine since we are\n          // copying the style later.\n          return copiedStyle[0];\n        });\n      }\n      if (selection) {\n        removeFrom = selectionStart;\n        removeTo = selectionEnd;\n      }\n      else if (backDelete) {\n        // detect differences between forwardDelete and backDelete\n        removeFrom = selectionEnd - removedText.length;\n        removeTo = selectionEnd;\n      }\n      else {\n        removeFrom = selectionEnd;\n        removeTo = selectionEnd + removedText.length;\n      }\n      this.removeStyleFromTo(removeFrom, removeTo);\n    }\n    if (insertedText.length) {\n      if (fromPaste && insertedText.join('') === fabric.copiedText && !fabric.disableStyleCopyPaste) {\n        copiedStyle = fabric.copiedTextStyle;\n      }\n      this.insertNewStyleBlock(insertedText, selectionStart, copiedStyle);\n    }\n    this.updateFromTextArea();\n    this.fire('changed');\n    if (this.canvas) {\n      this.canvas.fire('text:changed', { target: this });\n      this.canvas.requestRenderAll();\n    }\n  },\n  /**\n   * Composition start\n   */\n  onCompositionStart: function() {\n    this.inCompositionMode = true;\n  },\n\n  /**\n   * Composition end\n   */\n  onCompositionEnd: function() {\n    this.inCompositionMode = false;\n  },\n\n  // /**\n  //  * Composition update\n  //  */\n  onCompositionUpdate: function(e) {\n    this.compositionStart = e.target.selectionStart;\n    this.compositionEnd = e.target.selectionEnd;\n    this.updateTextareaPosition();\n  },\n\n  /**\n   * Copies selected text\n   * @param {Event} e Event object\n   */\n  copy: function() {\n    if (this.selectionStart === this.selectionEnd) {\n      //do not cut-copy if no selection\n      return;\n    }\n\n    fabric.copiedText = this.getSelectedText();\n    if (!fabric.disableStyleCopyPaste) {\n      fabric.copiedTextStyle = this.getSelectionStyles(this.selectionStart, this.selectionEnd, true);\n    }\n    else {\n      fabric.copiedTextStyle = null;\n    }\n    this._copyDone = true;\n  },\n\n  /**\n   * Pastes text\n   * @param {Event} e Event object\n   */\n  paste: function() {\n    this.fromPaste = true;\n  },\n\n  /**\n   * @private\n   * @param {Event} e Event object\n   * @return {Object} Clipboard data object\n   */\n  _getClipboardData: function(e) {\n    return (e && e.clipboardData) || fabric.window.clipboardData;\n  },\n\n  /**\n   * Finds the width in pixels before the cursor on the same line\n   * @private\n   * @param {Number} lineIndex\n   * @param {Number} charIndex\n   * @return {Number} widthBeforeCursor width before cursor\n   */\n  _getWidthBeforeCursor: function(lineIndex, charIndex) {\n    var widthBeforeCursor = this._getLineLeftOffset(lineIndex), bound;\n\n    if (charIndex > 0) {\n      bound = this.__charBounds[lineIndex][charIndex - 1];\n      widthBeforeCursor += bound.left + bound.width;\n    }\n    return widthBeforeCursor;\n  },\n\n  /**\n   * Gets start offset of a selection\n   * @param {Event} e Event object\n   * @param {Boolean} isRight\n   * @return {Number}\n   */\n  getDownCursorOffset: function(e, isRight) {\n    var selectionProp = this._getSelectionForOffset(e, isRight),\n        cursorLocation = this.get2DCursorLocation(selectionProp),\n        lineIndex = cursorLocation.lineIndex;\n    // if on last line, down cursor goes to end of line\n    if (lineIndex === this._textLines.length - 1 || e.metaKey || e.keyCode === 34) {\n      // move to the end of a text\n      return this._text.length - selectionProp;\n    }\n    var charIndex = cursorLocation.charIndex,\n        widthBeforeCursor = this._getWidthBeforeCursor(lineIndex, charIndex),\n        indexOnOtherLine = this._getIndexOnLine(lineIndex + 1, widthBeforeCursor),\n        textAfterCursor = this._textLines[lineIndex].slice(charIndex);\n    return textAfterCursor.length + indexOnOtherLine + 1 + this.missingNewlineOffset(lineIndex);\n  },\n\n  /**\n   * private\n   * Helps finding if the offset should be counted from Start or End\n   * @param {Event} e Event object\n   * @param {Boolean} isRight\n   * @return {Number}\n   */\n  _getSelectionForOffset: function(e, isRight) {\n    if (e.shiftKey && this.selectionStart !== this.selectionEnd && isRight) {\n      return this.selectionEnd;\n    }\n    else {\n      return this.selectionStart;\n    }\n  },\n\n  /**\n   * @param {Event} e Event object\n   * @param {Boolean} isRight\n   * @return {Number}\n   */\n  getUpCursorOffset: function(e, isRight) {\n    var selectionProp = this._getSelectionForOffset(e, isRight),\n        cursorLocation = this.get2DCursorLocation(selectionProp),\n        lineIndex = cursorLocation.lineIndex;\n    if (lineIndex === 0 || e.metaKey || e.keyCode === 33) {\n      // if on first line, up cursor goes to start of line\n      return -selectionProp;\n    }\n    var charIndex = cursorLocation.charIndex,\n        widthBeforeCursor = this._getWidthBeforeCursor(lineIndex, charIndex),\n        indexOnOtherLine = this._getIndexOnLine(lineIndex - 1, widthBeforeCursor),\n        textBeforeCursor = this._textLines[lineIndex].slice(0, charIndex),\n        missingNewlineOffset = this.missingNewlineOffset(lineIndex - 1);\n    // return a negative offset\n    return -this._textLines[lineIndex - 1].length\n     + indexOnOtherLine - textBeforeCursor.length + (1 - missingNewlineOffset);\n  },\n\n  /**\n   * for a given width it founds the matching character.\n   * @private\n   */\n  _getIndexOnLine: function(lineIndex, width) {\n\n    var line = this._textLines[lineIndex],\n        lineLeftOffset = this._getLineLeftOffset(lineIndex),\n        widthOfCharsOnLine = lineLeftOffset,\n        indexOnLine = 0, charWidth, foundMatch;\n\n    for (var j = 0, jlen = line.length; j < jlen; j++) {\n      charWidth = this.__charBounds[lineIndex][j].width;\n      widthOfCharsOnLine += charWidth;\n      if (widthOfCharsOnLine > width) {\n        foundMatch = true;\n        var leftEdge = widthOfCharsOnLine - charWidth,\n            rightEdge = widthOfCharsOnLine,\n            offsetFromLeftEdge = Math.abs(leftEdge - width),\n            offsetFromRightEdge = Math.abs(rightEdge - width);\n\n        indexOnLine = offsetFromRightEdge < offsetFromLeftEdge ? j : (j - 1);\n        break;\n      }\n    }\n\n    // reached end\n    if (!foundMatch) {\n      indexOnLine = line.length - 1;\n    }\n\n    return indexOnLine;\n  },\n\n\n  /**\n   * Moves cursor down\n   * @param {Event} e Event object\n   */\n  moveCursorDown: function(e) {\n    if (this.selectionStart >= this._text.length && this.selectionEnd >= this._text.length) {\n      return;\n    }\n    this._moveCursorUpOrDown('Down', e);\n  },\n\n  /**\n   * Moves cursor up\n   * @param {Event} e Event object\n   */\n  moveCursorUp: function(e) {\n    if (this.selectionStart === 0 && this.selectionEnd === 0) {\n      return;\n    }\n    this._moveCursorUpOrDown('Up', e);\n  },\n\n  /**\n   * Moves cursor up or down, fires the events\n   * @param {String} direction 'Up' or 'Down'\n   * @param {Event} e Event object\n   */\n  _moveCursorUpOrDown: function(direction, e) {\n    // getUpCursorOffset\n    // getDownCursorOffset\n    var action = 'get' + direction + 'CursorOffset',\n        offset = this[action](e, this._selectionDirection === 'right');\n    if (e.shiftKey) {\n      this.moveCursorWithShift(offset);\n    }\n    else {\n      this.moveCursorWithoutShift(offset);\n    }\n    if (offset !== 0) {\n      this.setSelectionInBoundaries();\n      this.abortCursorAnimation();\n      this._currentCursorOpacity = 1;\n      this.initDelayedCursor();\n      this._fireSelectionChanged();\n      this._updateTextarea();\n    }\n  },\n\n  /**\n   * Moves cursor with shift\n   * @param {Number} offset\n   */\n  moveCursorWithShift: function(offset) {\n    var newSelection = this._selectionDirection === 'left'\n      ? this.selectionStart + offset\n      : this.selectionEnd + offset;\n    this.setSelectionStartEndWithShift(this.selectionStart, this.selectionEnd, newSelection);\n    return offset !== 0;\n  },\n\n  /**\n   * Moves cursor up without shift\n   * @param {Number} offset\n   */\n  moveCursorWithoutShift: function(offset) {\n    if (offset < 0) {\n      this.selectionStart += offset;\n      this.selectionEnd = this.selectionStart;\n    }\n    else {\n      this.selectionEnd += offset;\n      this.selectionStart = this.selectionEnd;\n    }\n    return offset !== 0;\n  },\n\n  /**\n   * Moves cursor left\n   * @param {Event} e Event object\n   */\n  moveCursorLeft: function(e) {\n    if (this.selectionStart === 0 && this.selectionEnd === 0) {\n      return;\n    }\n    this._moveCursorLeftOrRight('Left', e);\n  },\n\n  /**\n   * @private\n   * @return {Boolean} true if a change happened\n   */\n  _move: function(e, prop, direction) {\n    var newValue;\n    if (e.altKey) {\n      newValue = this['findWordBoundary' + direction](this[prop]);\n    }\n    else if (e.metaKey || e.keyCode === 35 ||  e.keyCode === 36 ) {\n      newValue = this['findLineBoundary' + direction](this[prop]);\n    }\n    else {\n      this[prop] += direction === 'Left' ? -1 : 1;\n      return true;\n    }\n    if (typeof newValue !== undefined && this[prop] !== newValue) {\n      this[prop] = newValue;\n      return true;\n    }\n  },\n\n  /**\n   * @private\n   */\n  _moveLeft: function(e, prop) {\n    return this._move(e, prop, 'Left');\n  },\n\n  /**\n   * @private\n   */\n  _moveRight: function(e, prop) {\n    return this._move(e, prop, 'Right');\n  },\n\n  /**\n   * Moves cursor left without keeping selection\n   * @param {Event} e\n   */\n  moveCursorLeftWithoutShift: function(e) {\n    var change = true;\n    this._selectionDirection = 'left';\n\n    // only move cursor when there is no selection,\n    // otherwise we discard it, and leave cursor on same place\n    if (this.selectionEnd === this.selectionStart && this.selectionStart !== 0) {\n      change = this._moveLeft(e, 'selectionStart');\n\n    }\n    this.selectionEnd = this.selectionStart;\n    return change;\n  },\n\n  /**\n   * Moves cursor left while keeping selection\n   * @param {Event} e\n   */\n  moveCursorLeftWithShift: function(e) {\n    if (this._selectionDirection === 'right' && this.selectionStart !== this.selectionEnd) {\n      return this._moveLeft(e, 'selectionEnd');\n    }\n    else if (this.selectionStart !== 0){\n      this._selectionDirection = 'left';\n      return this._moveLeft(e, 'selectionStart');\n    }\n  },\n\n  /**\n   * Moves cursor right\n   * @param {Event} e Event object\n   */\n  moveCursorRight: function(e) {\n    if (this.selectionStart >= this._text.length && this.selectionEnd >= this._text.length) {\n      return;\n    }\n    this._moveCursorLeftOrRight('Right', e);\n  },\n\n  /**\n   * Moves cursor right or Left, fires event\n   * @param {String} direction 'Left', 'Right'\n   * @param {Event} e Event object\n   */\n  _moveCursorLeftOrRight: function(direction, e) {\n    var actionName = 'moveCursor' + direction + 'With';\n    this._currentCursorOpacity = 1;\n\n    if (e.shiftKey) {\n      actionName += 'Shift';\n    }\n    else {\n      actionName += 'outShift';\n    }\n    if (this[actionName](e)) {\n      this.abortCursorAnimation();\n      this.initDelayedCursor();\n      this._fireSelectionChanged();\n      this._updateTextarea();\n    }\n  },\n\n  /**\n   * Moves cursor right while keeping selection\n   * @param {Event} e\n   */\n  moveCursorRightWithShift: function(e) {\n    if (this._selectionDirection === 'left' && this.selectionStart !== this.selectionEnd) {\n      return this._moveRight(e, 'selectionStart');\n    }\n    else if (this.selectionEnd !== this._text.length) {\n      this._selectionDirection = 'right';\n      return this._moveRight(e, 'selectionEnd');\n    }\n  },\n\n  /**\n   * Moves cursor right without keeping selection\n   * @param {Event} e Event object\n   */\n  moveCursorRightWithoutShift: function(e) {\n    var changed = true;\n    this._selectionDirection = 'right';\n\n    if (this.selectionStart === this.selectionEnd) {\n      changed = this._moveRight(e, 'selectionStart');\n      this.selectionEnd = this.selectionStart;\n    }\n    else {\n      this.selectionStart = this.selectionEnd;\n    }\n    return changed;\n  },\n\n  /**\n   * Removes characters from start/end\n   * start/end ar per grapheme position in _text array.\n   *\n   * @param {Number} start\n   * @param {Number} end default to start + 1\n   */\n  removeChars: function(start, end) {\n    if (typeof end === 'undefined') {\n      end = start + 1;\n    }\n    this.removeStyleFromTo(start, end);\n    this._text.splice(start, end - start);\n    this.text = this._text.join('');\n    this.set('dirty', true);\n    if (this._shouldClearDimensionCache()) {\n      this.initDimensions();\n      this.setCoords();\n    }\n    this._removeExtraneousStyles();\n  },\n\n  /**\n   * insert characters at start position, before start position.\n   * start  equal 1 it means the text get inserted between actual grapheme 0 and 1\n   * if style array is provided, it must be as the same length of text in graphemes\n   * if end is provided and is bigger than start, old text is replaced.\n   * start/end ar per grapheme position in _text array.\n   *\n   * @param {String} text text to insert\n   * @param {Array} style array of style objects\n   * @param {Number} start\n   * @param {Number} end default to start + 1\n   */\n  insertChars: function(text, style, start, end) {\n    if (typeof end === 'undefined') {\n      end = start;\n    }\n    if (end > start) {\n      this.removeStyleFromTo(start, end);\n    }\n    var graphemes = fabric.util.string.graphemeSplit(text);\n    this.insertNewStyleBlock(graphemes, start, style);\n    this._text = [].concat(this._text.slice(0, start), graphemes, this._text.slice(end));\n    this.text = this._text.join('');\n    this.set('dirty', true);\n    if (this._shouldClearDimensionCache()) {\n      this.initDimensions();\n      this.setCoords();\n    }\n    this._removeExtraneousStyles();\n  },\n\n});\n\n\n/* _TO_SVG_START_ */\n(function() {\n  var toFixed = fabric.util.toFixed,\n      multipleSpacesRegex = /  +/g;\n\n  fabric.util.object.extend(fabric.Text.prototype, /** @lends fabric.Text.prototype */ {\n\n    /**\n     * Returns SVG representation of an instance\n     * @param {Function} [reviver] Method for further parsing of svg representation.\n     * @return {String} svg representation of an instance\n     */\n    _toSVG: function() {\n      var offsets = this._getSVGLeftTopOffsets(),\n          textAndBg = this._getSVGTextAndBg(offsets.textTop, offsets.textLeft);\n      return this._wrapSVGTextAndBg(textAndBg);\n    },\n\n    /**\n     * Returns svg representation of an instance\n     * @param {Function} [reviver] Method for further parsing of svg representation.\n     * @return {String} svg representation of an instance\n     */\n    toSVG: function(reviver) {\n      return this._createBaseSVGMarkup(\n        this._toSVG(),\n        { reviver: reviver, noStyle: true, withShadow: true }\n      );\n    },\n\n    /**\n     * @private\n     */\n    _getSVGLeftTopOffsets: function() {\n      return {\n        textLeft: -this.width / 2,\n        textTop: -this.height / 2,\n        lineTop: this.getHeightOfLine(0)\n      };\n    },\n\n    /**\n     * @private\n     */\n    _wrapSVGTextAndBg: function(textAndBg) {\n      var noShadow = true,\n          textDecoration = this.getSvgTextDecoration(this);\n      return [\n        textAndBg.textBgRects.join(''),\n        '\\t\\t<text xml:space=\"preserve\" ',\n        (this.fontFamily ? 'font-family=\"' + this.fontFamily.replace(/\"/g, '\\'') + '\" ' : ''),\n        (this.fontSize ? 'font-size=\"' + this.fontSize + '\" ' : ''),\n        (this.fontStyle ? 'font-style=\"' + this.fontStyle + '\" ' : ''),\n        (this.fontWeight ? 'font-weight=\"' + this.fontWeight + '\" ' : ''),\n        (textDecoration ? 'text-decoration=\"' + textDecoration + '\" ' : ''),\n        'style=\"', this.getSvgStyles(noShadow), '\"', this.addPaintOrder(), ' >',\n        textAndBg.textSpans.join(''),\n        '</text>\\n'\n      ];\n    },\n\n    /**\n     * @private\n     * @param {Number} textTopOffset Text top offset\n     * @param {Number} textLeftOffset Text left offset\n     * @return {Object}\n     */\n    _getSVGTextAndBg: function(textTopOffset, textLeftOffset) {\n      var textSpans = [],\n          textBgRects = [],\n          height = textTopOffset, lineOffset;\n      // bounding-box background\n      this._setSVGBg(textBgRects);\n\n      // text and text-background\n      for (var i = 0, len = this._textLines.length; i < len; i++) {\n        lineOffset = this._getLineLeftOffset(i);\n        if (this.textBackgroundColor || this.styleHas('textBackgroundColor', i)) {\n          this._setSVGTextLineBg(textBgRects, i, textLeftOffset + lineOffset, height);\n        }\n        this._setSVGTextLineText(textSpans, i, textLeftOffset + lineOffset, height);\n        height += this.getHeightOfLine(i);\n      }\n\n      return {\n        textSpans: textSpans,\n        textBgRects: textBgRects\n      };\n    },\n\n    /**\n     * @private\n     */\n    _createTextCharSpan: function(_char, styleDecl, left, top) {\n      var shouldUseWhitespace = _char !== _char.trim() || _char.match(multipleSpacesRegex),\n          styleProps = this.getSvgSpanStyles(styleDecl, shouldUseWhitespace),\n          fillStyles = styleProps ? 'style=\"' + styleProps + '\"' : '',\n          dy = styleDecl.deltaY, dySpan = '',\n          NUM_FRACTION_DIGITS = fabric.Object.NUM_FRACTION_DIGITS;\n      if (dy) {\n        dySpan = ' dy=\"' + toFixed(dy, NUM_FRACTION_DIGITS) + '\" ';\n      }\n      return [\n        '<tspan x=\"', toFixed(left, NUM_FRACTION_DIGITS), '\" y=\"',\n        toFixed(top, NUM_FRACTION_DIGITS), '\" ', dySpan,\n        fillStyles, '>',\n        fabric.util.string.escapeXml(_char),\n        '</tspan>'\n      ].join('');\n    },\n\n    _setSVGTextLineText: function(textSpans, lineIndex, textLeftOffset, textTopOffset) {\n      // set proper line offset\n      var lineHeight = this.getHeightOfLine(lineIndex),\n          isJustify = this.textAlign.indexOf('justify') !== -1,\n          actualStyle,\n          nextStyle,\n          charsToRender = '',\n          charBox, style,\n          boxWidth = 0,\n          line = this._textLines[lineIndex],\n          timeToRender;\n\n      textTopOffset += lineHeight * (1 - this._fontSizeFraction) / this.lineHeight;\n      for (var i = 0, len = line.length - 1; i <= len; i++) {\n        timeToRender = i === len || this.charSpacing;\n        charsToRender += line[i];\n        charBox = this.__charBounds[lineIndex][i];\n        if (boxWidth === 0) {\n          textLeftOffset += charBox.kernedWidth - charBox.width;\n          boxWidth += charBox.width;\n        }\n        else {\n          boxWidth += charBox.kernedWidth;\n        }\n        if (isJustify && !timeToRender) {\n          if (this._reSpaceAndTab.test(line[i])) {\n            timeToRender = true;\n          }\n        }\n        if (!timeToRender) {\n          // if we have charSpacing, we render char by char\n          actualStyle = actualStyle || this.getCompleteStyleDeclaration(lineIndex, i);\n          nextStyle = this.getCompleteStyleDeclaration(lineIndex, i + 1);\n          timeToRender = this._hasStyleChangedForSvg(actualStyle, nextStyle);\n        }\n        if (timeToRender) {\n          style = this._getStyleDeclaration(lineIndex, i) || { };\n          textSpans.push(this._createTextCharSpan(charsToRender, style, textLeftOffset, textTopOffset));\n          charsToRender = '';\n          actualStyle = nextStyle;\n          textLeftOffset += boxWidth;\n          boxWidth = 0;\n        }\n      }\n    },\n\n    _pushTextBgRect: function(textBgRects, color, left, top, width, height) {\n      var NUM_FRACTION_DIGITS = fabric.Object.NUM_FRACTION_DIGITS;\n      textBgRects.push(\n        '\\t\\t<rect ',\n        this._getFillAttributes(color),\n        ' x=\"',\n        toFixed(left, NUM_FRACTION_DIGITS),\n        '\" y=\"',\n        toFixed(top, NUM_FRACTION_DIGITS),\n        '\" width=\"',\n        toFixed(width, NUM_FRACTION_DIGITS),\n        '\" height=\"',\n        toFixed(height, NUM_FRACTION_DIGITS),\n        '\"></rect>\\n');\n    },\n\n    _setSVGTextLineBg: function(textBgRects, i, leftOffset, textTopOffset) {\n      var line = this._textLines[i],\n          heightOfLine = this.getHeightOfLine(i) / this.lineHeight,\n          boxWidth = 0,\n          boxStart = 0,\n          charBox, currentColor,\n          lastColor = this.getValueOfPropertyAt(i, 0, 'textBackgroundColor');\n      for (var j = 0, jlen = line.length; j < jlen; j++) {\n        charBox = this.__charBounds[i][j];\n        currentColor = this.getValueOfPropertyAt(i, j, 'textBackgroundColor');\n        if (currentColor !== lastColor) {\n          lastColor && this._pushTextBgRect(textBgRects, lastColor, leftOffset + boxStart,\n            textTopOffset, boxWidth, heightOfLine);\n          boxStart = charBox.left;\n          boxWidth = charBox.width;\n          lastColor = currentColor;\n        }\n        else {\n          boxWidth += charBox.kernedWidth;\n        }\n      }\n      currentColor && this._pushTextBgRect(textBgRects, currentColor, leftOffset + boxStart,\n        textTopOffset, boxWidth, heightOfLine);\n    },\n\n    /**\n     * Adobe Illustrator (at least CS5) is unable to render rgba()-based fill values\n     * we work around it by \"moving\" alpha channel into opacity attribute and setting fill's alpha to 1\n     *\n     * @private\n     * @param {*} value\n     * @return {String}\n     */\n    _getFillAttributes: function(value) {\n      var fillColor = (value && typeof value === 'string') ? new fabric.Color(value) : '';\n      if (!fillColor || !fillColor.getSource() || fillColor.getAlpha() === 1) {\n        return 'fill=\"' + value + '\"';\n      }\n      return 'opacity=\"' + fillColor.getAlpha() + '\" fill=\"' + fillColor.setAlpha(1).toRgb() + '\"';\n    },\n\n    /**\n     * @private\n     */\n    _getSVGLineTopOffset: function(lineIndex) {\n      var lineTopOffset = 0, lastHeight = 0;\n      for (var j = 0; j < lineIndex; j++) {\n        lineTopOffset += this.getHeightOfLine(j);\n      }\n      lastHeight = this.getHeightOfLine(j);\n      return {\n        lineTop: lineTopOffset,\n        offset: (this._fontSizeMult - this._fontSizeFraction) * lastHeight / (this.lineHeight * this._fontSizeMult)\n      };\n    },\n\n    /**\n     * Returns styles-string for svg-export\n     * @param {Boolean} skipShadow a boolean to skip shadow filter output\n     * @return {String}\n     */\n    getSvgStyles: function(skipShadow) {\n      var svgStyle = fabric.Object.prototype.getSvgStyles.call(this, skipShadow);\n      return svgStyle + ' white-space: pre;';\n    },\n  });\n})();\n/* _TO_SVG_END_ */\n\n\n(function(global) {\n\n  'use strict';\n\n  var fabric = global.fabric || (global.fabric = {});\n\n  /**\n   * Textbox class, based on IText, allows the user to resize the text rectangle\n   * and wraps lines automatically. Textboxes have their Y scaling locked, the\n   * user can only change width. Height is adjusted automatically based on the\n   * wrapping of lines.\n   * @class fabric.Textbox\n   * @extends fabric.IText\n   * @mixes fabric.Observable\n   * @return {fabric.Textbox} thisArg\n   * @see {@link fabric.Textbox#initialize} for constructor definition\n   */\n  fabric.Textbox = fabric.util.createClass(fabric.IText, fabric.Observable, {\n\n    /**\n     * Type of an object\n     * @type String\n     * @default\n     */\n    type: 'textbox',\n\n    /**\n     * Minimum width of textbox, in pixels.\n     * @type Number\n     * @default\n     */\n    minWidth: 20,\n\n    /**\n     * Minimum calculated width of a textbox, in pixels.\n     * fixed to 2 so that an empty textbox cannot go to 0\n     * and is still selectable without text.\n     * @type Number\n     * @default\n     */\n    dynamicMinWidth: 2,\n\n    /**\n     * Cached array of text wrapping.\n     * @type Array\n     */\n    __cachedLines: null,\n\n    /**\n     * Override standard Object class values\n     */\n    lockScalingFlip: true,\n\n    /**\n     * Override standard Object class values\n     * Textbox needs this on false\n     */\n    noScaleCache: false,\n\n    /**\n     * Properties which when set cause object to change dimensions\n     * @type Object\n     * @private\n     */\n    _dimensionAffectingProps: fabric.Text.prototype._dimensionAffectingProps.concat('width'),\n\n    /**\n     * Use this regular expression to split strings in breakable lines\n     * @private\n     */\n    _wordJoiners: /[ \\t\\r]/,\n\n    /**\n     * Use this boolean property in order to split strings that have no white space concept.\n     * this is a cheap way to help with chinese/japanese\n     * @type Boolean\n     * @since 2.6.0\n     */\n    splitByGrapheme: false,\n\n    /**\n     * Unlike superclass's version of this function, Textbox does not update\n     * its width.\n     * @private\n     * @override\n     */\n    initDimensions: function() {\n      if (this.__skipDimension) {\n        return;\n      }\n      this.isEditing && this.initDelayedCursor();\n      this.clearContextTop();\n      this._clearCache();\n      // clear dynamicMinWidth as it will be different after we re-wrap line\n      this.dynamicMinWidth = 0;\n      // wrap lines\n      this._styleMap = this._generateStyleMap(this._splitText());\n      // if after wrapping, the width is smaller than dynamicMinWidth, change the width and re-wrap\n      if (this.dynamicMinWidth > this.width) {\n        this._set('width', this.dynamicMinWidth);\n      }\n      if (this.textAlign.indexOf('justify') !== -1) {\n        // once text is measured we need to make space fatter to make justified text.\n        this.enlargeSpaces();\n      }\n      // clear cache and re-calculate height\n      this.height = this.calcTextHeight();\n      this.saveState({ propertySet: '_dimensionAffectingProps' });\n    },\n\n    /**\n     * Generate an object that translates the style object so that it is\n     * broken up by visual lines (new lines and automatic wrapping).\n     * The original text styles object is broken up by actual lines (new lines only),\n     * which is only sufficient for Text / IText\n     * @private\n     */\n    _generateStyleMap: function(textInfo) {\n      var realLineCount     = 0,\n          realLineCharCount = 0,\n          charCount         = 0,\n          map               = {};\n\n      for (var i = 0; i < textInfo.graphemeLines.length; i++) {\n        if (textInfo.graphemeText[charCount] === '\\n' && i > 0) {\n          realLineCharCount = 0;\n          charCount++;\n          realLineCount++;\n        }\n        else if (!this.splitByGrapheme && this._reSpaceAndTab.test(textInfo.graphemeText[charCount]) && i > 0) {\n          // this case deals with space's that are removed from end of lines when wrapping\n          realLineCharCount++;\n          charCount++;\n        }\n\n        map[i] = { line: realLineCount, offset: realLineCharCount };\n\n        charCount += textInfo.graphemeLines[i].length;\n        realLineCharCount += textInfo.graphemeLines[i].length;\n      }\n\n      return map;\n    },\n\n    /**\n     * Returns true if object has a style property or has it on a specified line\n     * @param {Number} lineIndex\n     * @return {Boolean}\n     */\n    styleHas: function(property, lineIndex) {\n      if (this._styleMap && !this.isWrapping) {\n        var map = this._styleMap[lineIndex];\n        if (map) {\n          lineIndex = map.line;\n        }\n      }\n      return fabric.Text.prototype.styleHas.call(this, property, lineIndex);\n    },\n\n    /**\n     * Returns true if object has no styling or no styling in a line\n     * @param {Number} lineIndex , lineIndex is on wrapped lines.\n     * @return {Boolean}\n     */\n    isEmptyStyles: function(lineIndex) {\n      if (!this.styles) {\n        return true;\n      }\n      var offset = 0, nextLineIndex = lineIndex + 1, nextOffset, obj, shouldLimit = false,\n          map = this._styleMap[lineIndex], mapNextLine = this._styleMap[lineIndex + 1];\n      if (map) {\n        lineIndex = map.line;\n        offset = map.offset;\n      }\n      if (mapNextLine) {\n        nextLineIndex = mapNextLine.line;\n        shouldLimit = nextLineIndex === lineIndex;\n        nextOffset = mapNextLine.offset;\n      }\n      obj = typeof lineIndex === 'undefined' ? this.styles : { line: this.styles[lineIndex] };\n      for (var p1 in obj) {\n        for (var p2 in obj[p1]) {\n          if (p2 >= offset && (!shouldLimit || p2 < nextOffset)) {\n            // eslint-disable-next-line no-unused-vars\n            for (var p3 in obj[p1][p2]) {\n              return false;\n            }\n          }\n        }\n      }\n      return true;\n    },\n\n    /**\n     * @param {Number} lineIndex\n     * @param {Number} charIndex\n     * @private\n     */\n    _getStyleDeclaration: function(lineIndex, charIndex) {\n      if (this._styleMap && !this.isWrapping) {\n        var map = this._styleMap[lineIndex];\n        if (!map) {\n          return null;\n        }\n        lineIndex = map.line;\n        charIndex = map.offset + charIndex;\n      }\n      return this.callSuper('_getStyleDeclaration', lineIndex, charIndex);\n    },\n\n    /**\n     * @param {Number} lineIndex\n     * @param {Number} charIndex\n     * @param {Object} style\n     * @private\n     */\n    _setStyleDeclaration: function(lineIndex, charIndex, style) {\n      var map = this._styleMap[lineIndex];\n      lineIndex = map.line;\n      charIndex = map.offset + charIndex;\n\n      this.styles[lineIndex][charIndex] = style;\n    },\n\n    /**\n     * @param {Number} lineIndex\n     * @param {Number} charIndex\n     * @private\n     */\n    _deleteStyleDeclaration: function(lineIndex, charIndex) {\n      var map = this._styleMap[lineIndex];\n      lineIndex = map.line;\n      charIndex = map.offset + charIndex;\n      delete this.styles[lineIndex][charIndex];\n    },\n\n    /**\n     * probably broken need a fix\n     * Returns the real style line that correspond to the wrapped lineIndex line\n     * Used just to verify if the line does exist or not.\n     * @param {Number} lineIndex\n     * @returns {Boolean} if the line exists or not\n     * @private\n     */\n    _getLineStyle: function(lineIndex) {\n      var map = this._styleMap[lineIndex];\n      return !!this.styles[map.line];\n    },\n\n    /**\n     * Set the line style to an empty object so that is initialized\n     * @param {Number} lineIndex\n     * @param {Object} style\n     * @private\n     */\n    _setLineStyle: function(lineIndex) {\n      var map = this._styleMap[lineIndex];\n      this.styles[map.line] = {};\n    },\n\n    /**\n     * Wraps text using the 'width' property of Textbox. First this function\n     * splits text on newlines, so we preserve newlines entered by the user.\n     * Then it wraps each line using the width of the Textbox by calling\n     * _wrapLine().\n     * @param {Array} lines The string array of text that is split into lines\n     * @param {Number} desiredWidth width you want to wrap to\n     * @returns {Array} Array of lines\n     */\n    _wrapText: function(lines, desiredWidth) {\n      var wrapped = [], i;\n      this.isWrapping = true;\n      for (i = 0; i < lines.length; i++) {\n        wrapped = wrapped.concat(this._wrapLine(lines[i], i, desiredWidth));\n      }\n      this.isWrapping = false;\n      return wrapped;\n    },\n\n    /**\n     * Helper function to measure a string of text, given its lineIndex and charIndex offset\n     * it gets called when charBounds are not available yet.\n     * @param {CanvasRenderingContext2D} ctx\n     * @param {String} text\n     * @param {number} lineIndex\n     * @param {number} charOffset\n     * @returns {number}\n     * @private\n     */\n    _measureWord: function(word, lineIndex, charOffset) {\n      var width = 0, prevGrapheme, skipLeft = true;\n      charOffset = charOffset || 0;\n      for (var i = 0, len = word.length; i < len; i++) {\n        var box = this._getGraphemeBox(word[i], lineIndex, i + charOffset, prevGrapheme, skipLeft);\n        width += box.kernedWidth;\n        prevGrapheme = word[i];\n      }\n      return width;\n    },\n\n    /**\n     * Wraps a line of text using the width of the Textbox and a context.\n     * @param {Array} line The grapheme array that represent the line\n     * @param {Number} lineIndex\n     * @param {Number} desiredWidth width you want to wrap the line to\n     * @param {Number} reservedSpace space to remove from wrapping for custom functionalities\n     * @returns {Array} Array of line(s) into which the given text is wrapped\n     * to.\n     */\n    _wrapLine: function(_line, lineIndex, desiredWidth, reservedSpace) {\n      var lineWidth = 0,\n          splitByGrapheme = this.splitByGrapheme,\n          graphemeLines = [],\n          line = [],\n          // spaces in different languages?\n          words = splitByGrapheme ? fabric.util.string.graphemeSplit(_line) : _line.split(this._wordJoiners),\n          word = '',\n          offset = 0,\n          infix = splitByGrapheme ? '' : ' ',\n          wordWidth = 0,\n          infixWidth = 0,\n          largestWordWidth = 0,\n          lineJustStarted = true,\n          additionalSpace = this._getWidthOfCharSpacing(),\n          reservedSpace = reservedSpace || 0;\n      // fix a difference between split and graphemeSplit\n      if (words.length === 0) {\n        words.push([]);\n      }\n      desiredWidth -= reservedSpace;\n      for (var i = 0; i < words.length; i++) {\n        // if using splitByGrapheme words are already in graphemes.\n        word = splitByGrapheme ? words[i] : fabric.util.string.graphemeSplit(words[i]);\n        wordWidth = this._measureWord(word, lineIndex, offset);\n        offset += word.length;\n\n        lineWidth += infixWidth + wordWidth - additionalSpace;\n        if (lineWidth > desiredWidth && !lineJustStarted) {\n          graphemeLines.push(line);\n          line = [];\n          lineWidth = wordWidth;\n          lineJustStarted = true;\n        }\n        else {\n          lineWidth += additionalSpace;\n        }\n\n        if (!lineJustStarted && !splitByGrapheme) {\n          line.push(infix);\n        }\n        line = line.concat(word);\n\n        infixWidth = splitByGrapheme ? 0 : this._measureWord([infix], lineIndex, offset);\n        offset++;\n        lineJustStarted = false;\n        // keep track of largest word\n        if (wordWidth > largestWordWidth) {\n          largestWordWidth = wordWidth;\n        }\n      }\n\n      i && graphemeLines.push(line);\n\n      if (largestWordWidth + reservedSpace > this.dynamicMinWidth) {\n        this.dynamicMinWidth = largestWordWidth - additionalSpace + reservedSpace;\n      }\n      return graphemeLines;\n    },\n\n    /**\n     * Detect if the text line is ended with an hard break\n     * text and itext do not have wrapping, return false\n     * @param {Number} lineIndex text to split\n     * @return {Boolean}\n     */\n    isEndOfWrapping: function(lineIndex) {\n      if (!this._styleMap[lineIndex + 1]) {\n        // is last line, return true;\n        return true;\n      }\n      if (this._styleMap[lineIndex + 1].line !== this._styleMap[lineIndex].line) {\n        // this is last line before a line break, return true;\n        return true;\n      }\n      return false;\n    },\n\n    /**\n     * Detect if a line has a linebreak and so we need to account for it when moving\n     * and counting style.\n     * @return Number\n     */\n    missingNewlineOffset: function(lineIndex) {\n      if (this.splitByGrapheme) {\n        return this.isEndOfWrapping(lineIndex) ? 1 : 0;\n      }\n      return 1;\n    },\n\n    /**\n    * Gets lines of text to render in the Textbox. This function calculates\n    * text wrapping on the fly every time it is called.\n    * @param {String} text text to split\n    * @returns {Array} Array of lines in the Textbox.\n    * @override\n    */\n    _splitTextIntoLines: function(text) {\n      var newText = fabric.Text.prototype._splitTextIntoLines.call(this, text),\n          graphemeLines = this._wrapText(newText.lines, this.width),\n          lines = new Array(graphemeLines.length);\n      for (var i = 0; i < graphemeLines.length; i++) {\n        lines[i] = graphemeLines[i].join('');\n      }\n      newText.lines = lines;\n      newText.graphemeLines = graphemeLines;\n      return newText;\n    },\n\n    getMinWidth: function() {\n      return Math.max(this.minWidth, this.dynamicMinWidth);\n    },\n\n    _removeExtraneousStyles: function() {\n      var linesToKeep = {};\n      for (var prop in this._styleMap) {\n        if (this._textLines[prop]) {\n          linesToKeep[this._styleMap[prop].line] = 1;\n        }\n      }\n      for (var prop in this.styles) {\n        if (!linesToKeep[prop]) {\n          delete this.styles[prop];\n        }\n      }\n    },\n\n    /**\n     * Returns object representation of an instance\n     * @method toObject\n     * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n     * @return {Object} object representation of an instance\n     */\n    toObject: function(propertiesToInclude) {\n      return this.callSuper('toObject', ['minWidth', 'splitByGrapheme'].concat(propertiesToInclude));\n    }\n  });\n\n  /**\n   * Returns fabric.Textbox instance from an object representation\n   * @static\n   * @memberOf fabric.Textbox\n   * @param {Object} object Object to create an instance from\n   * @param {Function} [callback] Callback to invoke when an fabric.Textbox instance is created\n   */\n  fabric.Textbox.fromObject = function(object, callback) {\n    return fabric.Object._fromObject('Textbox', object, callback, 'text');\n  };\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function() {\n\n  var controlsUtils = fabric.controlsUtils,\n      scaleSkewStyleHandler = controlsUtils.scaleSkewCursorStyleHandler,\n      scaleStyleHandler = controlsUtils.scaleCursorStyleHandler,\n      scalingEqually = controlsUtils.scalingEqually,\n      scalingYOrSkewingX = controlsUtils.scalingYOrSkewingX,\n      scalingXOrSkewingY = controlsUtils.scalingXOrSkewingY,\n      scaleOrSkewActionName = controlsUtils.scaleOrSkewActionName,\n      objectControls = fabric.Object.prototype.controls;\n\n  objectControls.ml = new fabric.Control({\n    x: -0.5,\n    y: 0,\n    cursorStyleHandler: scaleSkewStyleHandler,\n    actionHandler: scalingXOrSkewingY,\n    getActionName: scaleOrSkewActionName,\n  });\n\n  objectControls.mr = new fabric.Control({\n    x: 0.5,\n    y: 0,\n    cursorStyleHandler: scaleSkewStyleHandler,\n    actionHandler: scalingXOrSkewingY,\n    getActionName: scaleOrSkewActionName,\n  });\n\n  objectControls.mb = new fabric.Control({\n    x: 0,\n    y: 0.5,\n    cursorStyleHandler: scaleSkewStyleHandler,\n    actionHandler: scalingYOrSkewingX,\n    getActionName: scaleOrSkewActionName,\n  });\n\n  objectControls.mt = new fabric.Control({\n    x: 0,\n    y: -0.5,\n    cursorStyleHandler: scaleSkewStyleHandler,\n    actionHandler: scalingYOrSkewingX,\n    getActionName: scaleOrSkewActionName,\n  });\n\n  objectControls.tl = new fabric.Control({\n    x: -0.5,\n    y: -0.5,\n    cursorStyleHandler: scaleStyleHandler,\n    actionHandler: scalingEqually\n  });\n\n  objectControls.tr = new fabric.Control({\n    x: 0.5,\n    y: -0.5,\n    cursorStyleHandler: scaleStyleHandler,\n    actionHandler: scalingEqually\n  });\n\n  objectControls.bl = new fabric.Control({\n    x: -0.5,\n    y: 0.5,\n    cursorStyleHandler: scaleStyleHandler,\n    actionHandler: scalingEqually\n  });\n\n  objectControls.br = new fabric.Control({\n    x: 0.5,\n    y: 0.5,\n    cursorStyleHandler: scaleStyleHandler,\n    actionHandler: scalingEqually\n  });\n\n  objectControls.mtr = new fabric.Control({\n    x: 0,\n    y: -0.5,\n    actionHandler: controlsUtils.rotationWithSnapping,\n    cursorStyleHandler: controlsUtils.rotationStyleHandler,\n    offsetY: -40,\n    withConnection: true,\n    actionName: 'rotate',\n  });\n\n  if (fabric.Textbox) {\n    // this is breaking the prototype inheritance, no time / ideas to fix it.\n    // is important to document that if you want to have all objects to have a\n    // specific custom control, you have to add it to Object prototype and to Textbox\n    // prototype. The controls are shared as references. So changes to control `tr`\n    // can still apply to all objects if needed.\n    var textBoxControls = fabric.Textbox.prototype.controls = { };\n\n    textBoxControls.mtr = objectControls.mtr;\n    textBoxControls.tr = objectControls.tr;\n    textBoxControls.br = objectControls.br;\n    textBoxControls.tl = objectControls.tl;\n    textBoxControls.bl = objectControls.bl;\n    textBoxControls.mt = objectControls.mt;\n    textBoxControls.mb = objectControls.mb;\n\n    textBoxControls.mr = new fabric.Control({\n      x: 0.5,\n      y: 0,\n      actionHandler: controlsUtils.changeWidth,\n      cursorStyleHandler: scaleSkewStyleHandler,\n      actionName: 'resizing',\n    });\n\n    textBoxControls.ml = new fabric.Control({\n      x: -0.5,\n      y: 0,\n      actionHandler: controlsUtils.changeWidth,\n      cursorStyleHandler: scaleSkewStyleHandler,\n      actionName: 'resizing',\n    });\n  }\n})();\n\n","import {IObjectOptions} from 'fabric/fabric-impl';\n\nexport const DEFAULT_OBJ_CONFIG: IObjectOptions = {\n  lockScalingFlip: true,\n  originY: 'center',\n  originX: 'center',\n  lockMovementX: true,\n  lockMovementY: true,\n  borderColor: 'transparent',\n};\n","export function randomString(length: number = 36) {\n  let random = '';\n  const possible =\n    'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';\n\n  for (let i = 0; i < length; i += 1) {\n    random += possible.charAt(Math.floor(Math.random() * possible.length));\n  }\n\n  return random;\n}\n","import {Canvas} from 'fabric/fabric-impl';\nimport type {Tools} from '../tools/init-tools';\nimport type {PixieState} from './store';\nimport {useStore} from './store';\n\nexport function state(): PixieState {\n  return useStore.getState();\n}\n\nexport function tools(): Tools {\n  return state().editor.tools;\n}\n\nexport function fabricCanvas(): Canvas {\n  return state().fabric;\n}\n","import {fabric} from 'fabric';\nimport {Canvas} from 'fabric/fabric-impl';\nimport {DEFAULT_OBJ_CONFIG} from '../objects/default-obj-config';\nimport {randomString} from '../common/utils/string/random-string';\nimport {state} from '../state/utils';\n\nexport function initFabric(canvasEl: HTMLCanvasElement): Canvas {\n  const fabricCanvas = new fabric.Canvas(canvasEl, {width: 1, height: 1});\n  fabricCanvas.preserveObjectStacking = true;\n  fabricCanvas.selection = false;\n  fabricCanvas.renderOnAddRemove = false;\n\n  const textureSize = state().config.textureSize;\n  if (textureSize) fabric.textureSize = textureSize;\n\n  const userConfig = state().config.objectDefaults?.global;\n  const objectDefaults = {\n    ...userConfig,\n    ...DEFAULT_OBJ_CONFIG,\n  };\n\n  Object.keys(objectDefaults).forEach(key => {\n    // @ts-ignore\n    fabric.Object.prototype[key] = objectDefaults[key];\n  });\n\n  // add ID to all objects\n  fabricCanvas.on('object:added', e => {\n    if (e.target && !e.target?.data?.id) {\n      if (!e.target.data) e.target.data = {};\n      e.target.data.id = randomString(10);\n    }\n  });\n\n  // remove native fabric object controls\n  const objectControls = fabric.Object.prototype.controls;\n  Object.keys(objectControls).forEach(key => {\n    delete objectControls[key];\n  });\n\n  return fabricCanvas;\n}\n","import NP from 'number-precision';\nimport {useStore} from '../state/store';\nimport {fabricCanvas, state} from '../state/utils';\n\nexport class ZoomTool {\n  protected readonly maxZoom = 2;\n  protected minZoom = 1;\n  readonly step = 0.05;\n\n  get allowUserZoom() {\n    return state().config?.tools?.zoom?.allowUserZoom ?? true;\n  }\n\n  get currentZoom(): number {\n    return state().zoom;\n  }\n\n  constructor() {\n    if (this.allowUserZoom) {\n      this.bindMouseWheel();\n    }\n\n    useStore.subscribe(\n      s => s.stageSize,\n      () => {\n        setTimeout(() => {\n          this.fitToScreen();\n        }, 1);\n      }\n    );\n  }\n\n  zoomIn(amount = this.step) {\n    this.set(this.currentZoom + amount);\n  }\n\n  canZoomIn(amount = this.step): boolean {\n    return this.currentZoom + amount <= this.maxZoom;\n  }\n\n  canZoomOut(amount = this.step): boolean {\n    return this.currentZoom - amount >= this.minZoom;\n  }\n\n  zoomOut(amount = this.step) {\n    this.set(this.currentZoom - amount);\n  }\n\n  /**\n   * Zoom canvas to specified scale.\n   */\n  set(newZoom: number, resize: boolean = true) {\n    if (newZoom < this.minZoom || newZoom > this.maxZoom) return;\n\n    const width = NP.round(state().original.width * newZoom, 0);\n    const height = NP.round(state().original.height * newZoom, 0);\n\n    fabricCanvas().setZoom(newZoom);\n\n    if (resize) {\n      fabricCanvas().setDimensions({width, height});\n    }\n\n    state().setZoom(newZoom);\n  }\n\n  /**\n   * Resize canvas to fit available screen space.\n   */\n  fitToScreen() {\n    if (!state().config.tools?.zoom?.fitImageToScreen) {\n      return;\n    }\n    const {width, height} = state().stageSize;\n    const stageHeight = Math.max(height, 1);\n    const stageWidth = Math.max(width, 1);\n\n    // image won't fit into current space available to canvas\n    if (\n      state().original.height > stageHeight ||\n      state().original.width > stageWidth\n    ) {\n      const scale = Math.min(\n        stageHeight / state().original.height,\n        stageWidth / state().original.width\n      );\n      // no need to allow zooming out beyond maximum size that fits into canvas\n      this.minZoom = Math.min(scale, 1);\n      // image will fit, so we can just load it in original size\n    } else {\n      this.minZoom = 1;\n    }\n\n    this.set(this.minZoom);\n  }\n\n  private bindMouseWheel() {\n    fabricCanvas().on('mouse:wheel', opt => {\n      opt.e.preventDefault();\n      opt.e.stopPropagation();\n\n      if ((opt.e as WheelEvent).deltaY < 0) {\n        this.zoomIn();\n      } else {\n        this.zoomOut();\n      }\n    });\n  }\n}\n","import {IObjectOptions} from 'fabric/fabric-impl';\n\nexport const staticObjectConfig: IObjectOptions = {\n  selectable: false,\n  evented: false,\n  lockMovementX: true,\n  lockMovementY: true,\n  lockRotation: true,\n  lockScalingX: true,\n  lockScalingY: true,\n  lockUniScaling: true,\n  hasControls: false,\n  hasBorders: false,\n  hasRotatingPoint: false,\n  strokeWidth: 0,\n};\n","import {Image} from 'fabric/fabric-impl';\nimport {fabric} from 'fabric';\nimport {state} from '../../state/utils';\n\nexport function loadFabricImage(data: string): Promise<Image> {\n  return new Promise(resolve => {\n    fabric.util.loadImage(\n      data,\n      img => resolve(new fabric.Image(img)),\n      null,\n      state().config.crossOrigin ? 'anonymous' : undefined\n    );\n  });\n}\n","import {fabricCanvas, state} from '../../state/utils';\n\nexport function canvasIsEmpty(): boolean {\n  return (\n    !state().config.image &&\n    !state().config.blankCanvasSize &&\n    (!fabricCanvas() || fabricCanvas().getObjects().length === 0)\n  );\n}\n","import {SerializedPixieState} from '../history/serialized-pixie-state';\n\nexport async function fetchStateJsonFromUrl(\n  url: string\n): Promise<SerializedPixieState> {\n  const response = await fetch(url);\n  return response.json();\n}\n","import {IImageOptions, Image} from 'fabric/fabric-impl';\nimport {staticObjectConfig} from '../../objects/static-object-config';\nimport {ObjectName} from '../../objects/object-name';\nimport {loadFabricImage} from './load-fabric-image';\nimport {LoadingType} from '../../state/editor-state';\nimport {fabricCanvas, state, tools} from '../../state/utils';\nimport {canvasIsEmpty} from './canvas-is-empty';\nimport {fetchStateJsonFromUrl} from '../import/fetch-state-json-from-url';\n\nexport class PixieCanvas {\n  private readonly minWidth: number = 50;\n  private readonly minHeight: number = 50;\n\n  resize(\n    width: number,\n    height: number,\n    {\n      applyZoom = false,\n      resizeHelper = true,\n    }: {applyZoom?: boolean; resizeHelper?: boolean} = {}\n  ) {\n    const currentZoom = state().zoom;\n    fabricCanvas().setWidth(width * (applyZoom ? currentZoom : 1));\n    fabricCanvas().setHeight(height * (applyZoom ? currentZoom : 1));\n    state().setOriginal(width, height);\n    if (resizeHelper) {\n      tools().transform.resetStraightenAnchor();\n    }\n  }\n\n  async addMainImage(\n    url: string,\n    loadStateName: LoadingType = 'mainImage'\n  ): Promise<Image | undefined> {\n    state().toggleLoading(loadStateName);\n\n    const img = await loadFabricImage(url);\n    if (!img) return;\n\n    this.clear();\n    img.set(staticObjectConfig as IImageOptions);\n    img.name = ObjectName.MainImage;\n    fabricCanvas().add(img);\n\n    this.resize(img.width!, img.height!);\n    img.center();\n    img.setCoords();\n    tools().zoom.fitToScreen();\n    state().toggleLoading(false);\n    state().config.onMainImageLoaded?.(img);\n    return img;\n  }\n\n  openNew(\n    width: number,\n    height: number,\n    bgColor?: string\n  ): Promise<{width: number; height: number}> {\n    width = Math.max(this.minWidth, width);\n    height = Math.max(this.minHeight, height);\n\n    this.clear();\n    this.resize(width, height);\n    fabricCanvas().backgroundColor = bgColor;\n\n    tools().zoom.fitToScreen();\n    state().toggleLoading('newCanvas');\n    requestAnimationFrame(() => {\n      state().toggleLoading(false);\n    });\n    return Promise.resolve({width, height});\n  }\n\n  /**\n   * Get main image object, if it exists.\n   */\n  getMainImage(): Image {\n    return fabricCanvas()\n      .getObjects()\n      .find(obj => obj.name === ObjectName.MainImage) as Image;\n  }\n\n  render() {\n    fabricCanvas().requestRenderAll();\n  }\n\n  async loadInitialContent(): Promise<void> {\n    const image = state().config.image;\n    const size = state().config.blankCanvasSize;\n    const stateJson = state().config.state;\n    if (image && image.endsWith('json')) {\n      const stateObj = await fetchStateJsonFromUrl(image);\n      await tools().import.loadState(stateObj);\n    } else if (image && image.startsWith('{\"canvas')) {\n      await tools().import.loadState(image);\n    } else if (image) {\n      await this.addMainImage(image);\n    } else if (stateJson) {\n      await tools().import.loadState(stateJson);\n    } else if (size) {\n      await this.openNew(size.width, size.height);\n    }\n    if (canvasIsEmpty() && state().config.ui?.openImageDialog?.show) {\n      state().togglePanel('newImage', true);\n    }\n    // delay adding initial so changes made in the returned promise are caught\n    return new Promise<void>(resolve => {\n      setTimeout(() => {\n        tools().history.addInitial();\n        resolve();\n      }, 10);\n    });\n  }\n\n  clear() {\n    fabricCanvas().clear();\n    tools().frame.remove();\n    tools().transform.resetStraightenAnchor();\n  }\n}\n","import {Group, Object} from 'fabric/fabric-impl';\nimport {ObjectName} from '../object-name';\n\nexport function isSvgSticker(obj: Object): obj is Group {\n  return obj.name === ObjectName.Sticker && 'forEachObject' in obj;\n}\n","import type {ObjectOptions} from './object-modified-event';\n\nexport const SIZE_AND_POSITION_PROPS: (keyof ObjectOptions)[] = [\n  'fontSize',\n  'fontFamily',\n  'left',\n  'top',\n  'width',\n  'height',\n  'scaleX',\n  'scaleY',\n  'flipX',\n  'flipY',\n  'angle',\n  'src',\n  'strokeWidth',\n];\n","import {IImageOptions, IObjectOptions, ITextOptions} from 'fabric/fabric-impl';\nimport {SIZE_AND_POSITION_PROPS} from './size-and-position-props';\nimport {fabricCanvas} from '../state/utils';\n\nexport type ObjectOptions = IObjectOptions &\n  ITextOptions &\n  IImageOptions & {src?: string};\n\nexport interface ObjectModifiedEvent {\n  values: ObjectOptions;\n  sizeOrPositionChanged: boolean;\n}\n\nexport function fireObjModifiedEvent(values: ObjectOptions = {}) {\n  fabricCanvas().fire('object:modified', buildObjModifiedEvent(values));\n}\n\nexport function buildObjModifiedEvent(\n  values: ObjectOptions\n): ObjectModifiedEvent {\n  return {\n    values,\n    sizeOrPositionChanged: sizeOrPositionChanged(values),\n  };\n}\n\nfunction sizeOrPositionChanged(values: ObjectOptions): boolean {\n  return Object.keys(values).some(r =>\n    SIZE_AND_POSITION_PROPS.includes(r as keyof ObjectOptions)\n  );\n}\n","import {Object as IObject} from 'fabric/fabric-impl';\nimport {ObjectName} from '../../objects/object-name';\nimport {ToolName} from '../../tools/tool-name';\nimport {ActiveToolOverlay} from '../../state/editor-state';\nimport {fabricCanvas, state, tools} from '../../state/utils';\n\nexport function setActiveTool(name: ToolName | null = null): void {\n  // prevent changing of active tool if editor is dirty\n  if (state().dirty) {\n    return;\n  }\n\n  tools().zoom.fitToScreen();\n\n  const [toolName, overlayName] = getToolForObj(\n    fabricCanvas().getActiveObject()\n  );\n\n  if (name) {\n    state().setActiveTool(name, toolName === name ? overlayName : null);\n  } else {\n    state().setActiveTool(toolName, overlayName);\n  }\n}\n\nexport function getToolForObj(\n  obj?: IObject\n): [ToolName | null, ActiveToolOverlay | null] {\n  switch (obj?.name) {\n    case ObjectName.Text:\n      return [ToolName.TEXT, ActiveToolOverlay.Text];\n    case ObjectName.Sticker:\n    case ObjectName.Image:\n      return [ToolName.STICKERS, ActiveToolOverlay.ActiveObject];\n    case ObjectName.Shape:\n      return [ToolName.SHAPES, ActiveToolOverlay.ActiveObject];\n    default:\n      return [null, null];\n  }\n}\n","import {IEvent, Object as IObject} from 'fabric/fabric-impl';\nimport {getToolForObj, setActiveTool} from '../ui/navbar/set-active-tool';\nimport {state, tools} from '../state/utils';\n\ninterface SelectionEvent extends IEvent {\n  deselected?: IObject[];\n}\n\nexport function bindToFabricSelectionEvents() {\n  state().fabric.on('selection:created', e => {\n    if (!shouldPreventObjDeselect(e)) {\n      selectNewObj(e.target);\n    }\n  });\n  state().fabric.on('selection:updated', e => {\n    if (!shouldPreventObjDeselect(e)) {\n      selectNewObj(e.target);\n    }\n  });\n  state().fabric.on('selection:cleared', () => {\n    selectNewObj();\n  });\n}\n\nfunction shouldPreventObjDeselect(e: SelectionEvent): boolean {\n  const [toolName] = getToolForObj(e.target);\n  const objIsHandledByActiveTool = toolName === state().activeTool;\n  if (state().dirty && (!e.target || !objIsHandledByActiveTool)) {\n    if (e.deselected) {\n      tools().objects.select(e.deselected[0]);\n    }\n    return true;\n  }\n  return false;\n}\n\nfunction selectNewObj(obj?: IObject) {\n  if (obj?.data.id === state().objects.active.id) {\n    return;\n  }\n  state().objects.setActive(obj ?? null);\n  setActiveTool();\n}\n","import {Object as IObject} from 'fabric/fabric-impl';\nimport {isSvgSticker} from './utils/is-svg-sticker';\nimport {isText} from './utils/is-text';\nimport {fireObjModifiedEvent, ObjectOptions} from './object-modified-event';\nimport {bindToFabricSelectionEvents} from './bind-to-fabric-selection-events';\nimport {fabricCanvas, state, tools} from '../state/utils';\nimport {useStore} from '../state/store';\nimport {randomString} from '../common/utils/string/random-string';\n\nexport class ObjectTool {\n  constructor() {\n    this.syncObjects();\n\n    bindToFabricSelectionEvents();\n\n    state().fabric.on('text:editing:entered', () => {\n      state().objects.setIsEditingText(true);\n    });\n    state().fabric.on('text:editing:exited', () => {\n      state().objects.setIsEditingText(false);\n    });\n\n    state().fabric.on('object:added', () => {\n      this.syncObjects();\n    });\n    state().fabric.on('object:removed', () => {\n      this.syncObjects();\n    });\n  }\n\n  /**\n   * Get all objects that are currently on canvas.\n   */\n  getAll(): IObject[] {\n    return fabricCanvas()\n      .getObjects()\n      .filter(obj => !obj?.data?.pixieInternal);\n  }\n\n  /**\n   * Get object with specified name from canvas.\n   */\n  get(name: string) {\n    return this.getAll().find(obj => obj.name === name);\n  }\n\n  /**\n   * Get object with specified id from canvas.\n   */\n  getById(id: string) {\n    return this.getAll().find(obj => obj.data.id === id);\n  }\n\n  /**\n   * Check whether specified object is currently selected.\n   */\n  isActive(objectOrId: IObject | string): boolean {\n    const objId =\n      typeof objectOrId === 'string' ? objectOrId : objectOrId.data.id;\n    return state().objects.active?.id === objId;\n  }\n\n  /**\n   * Get currently active object.\n   */\n  getActive(): IObject | null {\n    return fabricCanvas().getActiveObject();\n  }\n\n  /**\n   * Check if object with specified name exists on canvas.\n   */\n  has(name: string) {\n    return this.getAll().findIndex(obj => obj.name === name) > -1;\n  }\n\n  /**\n   * Select specified object.\n   */\n  select(objOrId: IObject | string) {\n    const obj = typeof objOrId === 'string' ? this.getById(objOrId) : objOrId;\n    if (!obj) return;\n    fabricCanvas().setActiveObject(obj);\n    fabricCanvas().requestRenderAll();\n  }\n\n  /**\n   * Deselect currently active object.\n   */\n  deselectActive() {\n    fabricCanvas().discardActiveObject();\n    fabricCanvas().requestRenderAll();\n  }\n\n  /**\n   * Apply values to specified or currently active object.\n   */\n  setValues(values: ObjectOptions, obj?: IObject | null) {\n    obj = obj || this.getActive();\n    if (!obj) return;\n\n    let fontChanged = false;\n\n    // apply fill color to each svg line separately, so sticker\n    // is not recolored when other values like shadow change\n    if (isSvgSticker(obj) && values.fill !== obj.fill) {\n      obj.forEachObject(path => path.set('fill', values.fill));\n    }\n\n    if (isText(obj)) {\n      if (\n        values.fontFamily !== obj.fontFamily ||\n        values.fontSize !== obj.fontSize\n      ) {\n        fontChanged = true;\n      }\n      if (obj.selectionStart !== obj.selectionEnd) {\n        obj.setSelectionStyles(values);\n      } else {\n        obj.set(values);\n      }\n    } else {\n      obj.set(values);\n    }\n\n    // sometimes changes are not rendered until next render without this\n    if (fontChanged) {\n      setTimeout(() => {\n        fabricCanvas().requestRenderAll();\n      }, 50);\n    } else {\n      fabricCanvas().requestRenderAll();\n    }\n\n    state().objects.setActive(obj);\n    fireObjModifiedEvent(values);\n  }\n\n  /**\n   * Move specified or currently active object in given direction.\n   */\n  move(\n    direction: 'up' | 'right' | 'down' | 'left',\n    amount: number = 1,\n    obj?: IObject | null\n  ) {\n    obj = obj || this.getActive();\n    if (!obj) return;\n    if (direction === 'up') {\n      this.setValues({top: obj.top! - amount});\n    } else if (direction === 'down') {\n      this.setValues({top: obj.top! + amount});\n    } else if (direction === 'left') {\n      this.setValues({left: obj.left! - amount});\n    } else if (direction === 'right') {\n      this.setValues({left: obj.left! + amount});\n    }\n    tools().canvas.render();\n  }\n\n  /**\n   * Bring specified or currently active object to front of canvas.\n   */\n  bringToFront(obj?: IObject | null) {\n    obj = obj || this.getActive();\n    if (!obj) return;\n    obj.bringToFront();\n    tools().canvas.render();\n  }\n\n  /**\n   * Send specified or currently active object to the back of canvas.\n   */\n  sendToBack(obj?: IObject | null) {\n    obj = obj || this.getActive();\n    if (!obj) return;\n    obj.sendToBack();\n    tools().canvas.render();\n  }\n\n  /**\n   * Flip specified or currently active object horizontally.\n   */\n  flipHorizontally(obj?: IObject | null) {\n    obj = obj || this.getActive();\n    if (!obj) return;\n    this.setValues({flipX: !obj.flipX});\n    tools().canvas.render();\n  }\n\n  /**\n   * Duplicate specified or currently active object.\n   */\n  duplicate(obj?: IObject | null) {\n    const original = obj || this.getActive();\n    if (!original) return;\n\n    this.deselectActive();\n\n    original.clone((clonedObj: IObject) => {\n      clonedObj.set({\n        left: original.left! + 40,\n        top: original.top! + 40,\n        data: {...original.data, id: randomString(10)},\n        name: original.name,\n      });\n\n      fabricCanvas().add(clonedObj);\n      this.select(clonedObj);\n      tools().canvas.render();\n    });\n  }\n\n  /**\n   * Delete specified or currently active object.\n   */\n  delete(obj?: IObject | null) {\n    obj = obj || this.getActive();\n    if (!obj) return;\n    this.deselectActive();\n    fabricCanvas().remove(obj);\n    fabricCanvas().requestRenderAll();\n    tools().history.addHistoryItem({name: 'deletedObject'});\n  }\n\n  /**\n   * Sync layers list with fabric.js objects.\n   * @hidden\n   */\n  syncObjects() {\n    const partial = this.getAll().map(o => ({\n      name: o.name!,\n      selectable: o.selectable ?? false,\n      id: o.data.id,\n    }));\n    useStore.setState({\n      objects: {\n        ...state().objects,\n        all: partial,\n      },\n    });\n  }\n}\n","import {IObjectOptions} from 'fabric/fabric-impl';\n\nexport interface SerializedPixieState {\n  canvas: SerializedFabricState;\n  editor: {\n    frame: {name: string; sizePercent: number} | null;\n    zoom: number;\n    activeObjectId: string | null;\n  };\n  canvasWidth: number;\n  canvasHeight: number;\n}\n\nexport const DEFAULT_SERIALIZED_EDITOR_STATE = {\n  frame: null,\n  fonts: [],\n};\n\nexport interface SerializedFabricState {\n  objects: IObjectOptions[];\n}\n","import {Image} from 'fabric/fabric-impl';\nimport {\n  SerializedFabricState,\n  SerializedPixieState,\n} from '../serialized-pixie-state';\nimport {staticObjectConfig} from '../../../objects/static-object-config';\nimport {isText} from '../../../objects/utils/is-text';\nimport {fabricCanvas, state, tools} from '../../../state/utils';\n\nexport function getCurrentCanvasState(\n  customProps: string[] = []\n): SerializedPixieState {\n  customProps = [\n    ...Object.keys(staticObjectConfig),\n    'crossOrigin',\n    'name',\n    'displayName',\n    'data',\n    ...customProps,\n  ];\n  const canvas = fabricCanvas().toJSON(\n    customProps\n  ) as unknown as SerializedFabricState;\n  canvas.objects = canvas.objects\n    .filter(obj => !obj.data.pixieInternal)\n    .map(obj => {\n      if (obj.type === 'image' && state().config.crossOrigin) {\n        (obj as Image).crossOrigin = 'anonymous';\n      }\n      // text is not selectable/movable when saving\n      // state without first moving the text object\n      if (isText(obj)) {\n        obj.selectable = true;\n        obj.lockMovementX = false;\n        obj.lockMovementY = false;\n        obj.lockUniScaling = false;\n      }\n      // make sure there are no references to live objects\n      return {...obj, data: obj.data ? {...obj.data} : {}};\n    });\n\n  const activeFrame = tools().frame.active.config\n    ? {\n        name: tools().frame.active.config!.name,\n        sizePercent: tools().frame.active.currentSizeInPercent,\n      }\n    : null;\n\n  return {\n    canvas,\n    editor: {\n      frame: activeFrame,\n      // fonts: tools().text.getUsedFonts(),\n      zoom: state().zoom,\n      activeObjectId: state().objects.active?.id || null,\n    },\n    canvasWidth: state().original.width,\n    canvasHeight: state().original.height,\n  };\n}\n","import {SerializedPixieState} from '../serialized-pixie-state';\nimport {HistoryItem} from '../history-item.interface';\nimport {randomString} from '../../../common/utils/string/random-string';\nimport {getCurrentCanvasState} from './get-current-canvas-state';\nimport {HistoryName} from '../history-display-names';\n\nexport function createHistoryItem(params: {\n  name: HistoryName;\n  state?: SerializedPixieState;\n}): HistoryItem {\n  if (!params.state) {\n    params.state = getCurrentCanvasState();\n  }\n  const state = params.state || getCurrentCanvasState();\n  return {\n    ...state,\n    name: params.name,\n    id: randomString(15),\n  };\n}\n","import {IText, ITextOptions} from 'fabric/fabric-impl';\nimport {fabric} from 'fabric';\nimport {defaultObjectProps} from '../../config/default-object-props';\nimport {ObjectName} from '../../objects/object-name';\nimport {fabricCanvas, state, tools} from '../../state/utils';\n\nexport const TEXT_CONTROLS_PADDING = 15;\n\nexport class TextTool {\n  private readonly minWidth: number = 250;\n\n  /**\n   * Add specified text to canvas.\n   */\n  add(text?: string, providedConfig: ITextOptions = {}) {\n    text = text || state().config.tools?.text?.defaultText;\n    if (!text) return;\n\n    const options = {\n      ...state().config.objectDefaults?.text,\n      ...providedConfig,\n      name: ObjectName.Text,\n      padding: TEXT_CONTROLS_PADDING,\n      editingBorderColor: defaultObjectProps.fill,\n    };\n\n    const itext = new fabric.IText(text, options);\n    fabricCanvas().add(itext);\n    this.autoPositionText(itext);\n\n    tools().objects.select(itext);\n  }\n\n  private autoPositionText(text: IText) {\n    const canvasWidth = fabricCanvas().getWidth();\n    const canvasHeight = fabricCanvas().getHeight();\n\n    // make sure min width is not larger than canvas width\n    const minWidth = Math.min(fabricCanvas().getWidth(), this.minWidth);\n\n    text.scaleToWidth(Math.max(canvasWidth / 3, minWidth));\n\n    // make sure text is not scaled outside canvas\n    if (text.getScaledHeight() > canvasHeight) {\n      text.scaleToHeight(canvasHeight - text.getScaledHeight() - 20);\n    }\n\n    text.viewportCenter();\n\n    // push text down, if it intersects with another text object\n    fabricCanvas()\n      .getObjects('i-text')\n      .forEach(obj => {\n        if (obj === text) return;\n        if (obj.intersectsWithObject(text)) {\n          const offset = obj.top! - text.top! + obj.getScaledHeight();\n          let newTop = text.top! + offset;\n\n          // if pushing object down would push it outside canvas, position text at top of canvas\n          if (newTop > state().original.height - obj.getScaledHeight()) {\n            newTop = 0;\n          }\n\n          text.set('top', newTop);\n          text.setCoords();\n        }\n      });\n  }\n}\n","export function isAbsoluteUrl(url: string): boolean {\n  if (!url) return false;\n  return /^[a-zA-Z][a-zA-Z\\d+\\-.]*?:/.test(url);\n}\n","import {state} from '../state/utils';\nimport {isAbsoluteUrl} from '../common/utils/urls/is-absolute-url';\n\nexport function assetUrl(uri?: string): string {\n  if (!uri) return '';\n  if (isAbsoluteUrl(uri)) {\n    return uri;\n  }\n  const baseUrl = state().config.baseUrl ? `${state().config.baseUrl}/` : '';\n  return `${baseUrl}${uri}`;\n}\n","import {FontFaceConfig} from './font-face-config';\nimport {assetUrl} from '../../../utils/asset-url';\n\nexport function loadFonts(fonts: FontFaceConfig[]): Promise<FontFace[]> {\n  const promises = fonts.map(async fontConfig => {\n    const loadedFont = Array.from(document.fonts.values()).find(current => {\n      return current.family === fontConfig.family;\n    });\n    if (loadedFont) {\n      return loadedFont.loaded;\n    }\n    const fontFace = new FontFace(\n      fontConfig.family,\n      `url(${assetUrl(fontConfig.src)})`,\n      fontConfig.descriptors\n    );\n    document.fonts.add(fontFace);\n    return fontFace.load();\n  });\n  return Promise.all(promises);\n}\n","import {IObjectOptions} from 'fabric/fabric-impl';\nimport {\n  DEFAULT_SERIALIZED_EDITOR_STATE,\n  SerializedPixieState,\n} from './serialized-pixie-state';\nimport {HistoryItem} from './history-item.interface';\nimport {HistoryName} from './history-display-names';\nimport {createHistoryItem} from './state/create-history-item';\nimport {TEXT_CONTROLS_PADDING} from '../text/text-tool';\nimport {isText} from '../../objects/utils/is-text';\nimport {loadFonts} from '../../common/ui/font-picker/load-fonts';\nimport {FontFaceConfig} from '../../common/ui/font-picker/font-face-config';\nimport {DEFAULT_OBJ_CONFIG} from '../../objects/default-obj-config';\nimport {fabricCanvas, state, tools} from '../../state/utils';\nimport {canvasIsEmpty} from '../canvas/canvas-is-empty';\n\nexport class HistoryTool {\n  /**\n   * Undo last canvas operation.\n   */\n  async undo(): Promise<void> {\n    if (this.canUndo()) {\n      const prev = state().history.items[state().history.pointer - 1];\n      await this.load(prev);\n    }\n  }\n\n  /**\n   * Redo last canvas operation.\n   */\n  async redo(): Promise<void> {\n    if (this.canRedo()) {\n      const next = state().history.items[state().history.pointer + 1];\n      await this.load(next);\n    }\n  }\n\n  /**\n   * Check if there are any actions to undo.\n   */\n  canUndo(): boolean {\n    return state().history.canUndo;\n  }\n\n  /**\n   * Check if there are any actions to redo.\n   */\n  canRedo(): boolean {\n    return state().history.canRedo;\n  }\n\n  /**\n   * Reload current history state, undoing any actions that were not yet applied.\n   */\n  reload() {\n    return this.load(state().history.items[state().history.pointer]);\n  }\n\n  /**\n   * Replace current history item with current canvas state.\n   */\n  replaceCurrent() {\n    const current = state().history.items[state().history.pointer];\n    const items = [...state().history.items];\n    items[state().history.pointer] = createHistoryItem({\n      name: current.name,\n      state: current,\n    });\n  }\n\n  /**\n   * Create a new history item from current canvas state.\n   */\n  addHistoryItem(params: {name: HistoryName; state?: SerializedPixieState}) {\n    const item = createHistoryItem(params);\n    const stateUntilPointer = state().history.items.slice(\n      0,\n      state().history.pointer + 1\n    );\n    const newItems = [...stateUntilPointer, item];\n    state().history.update(newItems.length - 1, newItems);\n  }\n\n  /**\n   * Replace current canvas state with specified history item.\n   */\n  load(item: HistoryItem): Promise<any> {\n    item = {...item, editor: item.editor || DEFAULT_SERIALIZED_EDITOR_STATE};\n    return new Promise<void>(resolve => {\n      loadFonts(getUsedFonts(item.canvas.objects)).then(() => {\n        fabricCanvas().loadFromJSON(item.canvas, () => {\n          tools().zoom.set(1);\n\n          // resize canvas if needed\n          if (item.canvasWidth && item.canvasHeight) {\n            tools().canvas.resize(item.canvasWidth, item.canvasHeight, {\n              resizeHelper: false,\n              applyZoom: false,\n            });\n          }\n\n          // add frame\n          tools().frame.remove();\n          if (item.editor.frame) {\n            tools().frame.add(\n              item.editor.frame.name,\n              item.editor.frame.sizePercent\n            );\n          }\n\n          tools().objects.syncObjects();\n\n          // restore padding\n          tools()\n            .objects.getAll()\n            .forEach(o => {\n              // translate left/top to center/center coordinates, for compatibility with old .json state files\n              if (\n                !o.data.pixieInternal &&\n                o.originX === 'left' &&\n                o.originY === 'top'\n              ) {\n                const point = o.getPointByOrigin('center', 'center');\n                o.set('left', point.x);\n                o.set('top', point.y);\n              }\n              o.set({...DEFAULT_OBJ_CONFIG});\n              if (o.type === 'i-text') {\n                o.padding = TEXT_CONTROLS_PADDING;\n              }\n            });\n\n          // prepare fabric.js and canvas\n          tools().canvas.render();\n          fabricCanvas().calcOffset();\n          tools().zoom.fitToScreen();\n\n          // update pointer ID after state is applied to canvas\n          state().history.updatePointerById(item.id);\n          tools().transform.resetStraightenAnchor();\n          resolve();\n        });\n      });\n    });\n  }\n\n  /**\n   * @hidden\n   */\n  addInitial(stateObj?: SerializedPixieState) {\n    const initial = state().history.items.find(i => i.name === 'initial');\n    if (!initial && (stateObj || !canvasIsEmpty())) {\n      this.addHistoryItem({name: 'initial', state: stateObj});\n    }\n  }\n}\n\nfunction getUsedFonts(objects: IObjectOptions[]): FontFaceConfig[] {\n  const fonts: FontFaceConfig[] = [];\n  objects.forEach(obj => {\n    if (!isText(obj)) return;\n    const fontConfig = state().config.tools?.text?.items?.find(\n      f => f.family === obj.fontFamily\n    );\n    if (fontConfig) {\n      fonts.push(fontConfig);\n    }\n  });\n  return fonts;\n}\n","import {ObjectName} from '../../objects/object-name';\nimport {state, tools} from '../../state/utils';\n\nexport class MergeTool {\n  canMerge(): boolean {\n    return (\n      tools()\n        .objects.getAll()\n        .filter(obj => obj.name !== ObjectName.MainImage).length > 0\n    );\n  }\n\n  async apply(): Promise<any> {\n    state().toggleLoading('merge');\n    const data = tools().export.getDataUrl();\n    if (data) {\n      await tools().canvas.addMainImage(data, 'merge');\n    }\n  }\n}\n","import {IAllFilters} from 'fabric/fabric-impl';\nimport {defineMessages, MessageDescriptor} from 'react-intl';\n\nexport interface FilterConfig {\n  name: string;\n  fabricType?: string;\n  uses?: keyof IAllFilters;\n  options?: FilterOptions;\n  initialConfig?: {[key: string]: any};\n  matrix?: number[];\n  apply?: Function;\n}\n\nexport interface FilterOptions {\n  [key: string]: SliderOptions | SelectOptions | ColorOptions;\n}\n\ninterface SliderOptions {\n  type: 'slider';\n  current: number;\n  min: number;\n  max: number;\n  step?: number;\n}\n\ninterface SelectOptions {\n  type: 'select';\n  current: string;\n  available: {key: string}[];\n}\n\ninterface ColorOptions {\n  type: 'colorPicker';\n  current: string;\n}\n\nexport const filterList: FilterConfig[] = [\n  {name: 'grayscale'},\n  {name: 'blackWhite', fabricType: 'blackwhite'},\n  {\n    name: 'sharpen',\n    uses: 'Convolute',\n    matrix: [0, -1, 0, -1, 5, -1, 0, -1, 0],\n  },\n  {name: 'invert'},\n  {name: 'vintage'},\n  {name: 'polaroid'},\n  {name: 'kodachrome'},\n  {name: 'technicolor'},\n  {name: 'brownie'},\n  {name: 'sepia'},\n  {\n    name: 'removeColor',\n    fabricType: 'removecolor',\n    options: {\n      distance: {type: 'slider', current: 0.1, min: 0, max: 1, step: 0.01},\n      color: {current: '#fff', type: 'colorPicker'},\n    },\n  },\n  {\n    name: 'brightness',\n    options: {\n      brightness: {type: 'slider', current: 0.1, min: -1, max: 1, step: 0.1},\n    },\n  },\n  {\n    name: 'gamma',\n    options: {\n      red: {type: 'slider', current: 0.1, min: 0.2, max: 2.2, step: 0.003921},\n      green: {type: 'slider', current: 0.1, min: 0.2, max: 2.2, step: 0.003921},\n      blue: {type: 'slider', current: 0.1, min: 0.2, max: 2.2, step: 0.003921},\n    },\n    apply: (filter: any) => {\n      filter.gamma = [filter.red, filter.green, filter.blue];\n    },\n  },\n  {\n    name: 'noise',\n    options: {\n      noise: {type: 'slider', current: 40, min: 1, max: 600},\n    },\n  },\n  {\n    name: 'pixelate',\n    options: {\n      blocksize: {type: 'slider', min: 1, max: 40, current: 6},\n    },\n  },\n  {\n    name: 'blur',\n    uses: 'Convolute',\n    matrix: [1 / 9, 1 / 9, 1 / 9, 1 / 9, 1 / 9, 1 / 9, 1 / 9, 1 / 9, 1 / 9],\n  },\n  {\n    name: 'emboss',\n    uses: 'Convolute',\n    matrix: [1, 1, 1, 1, 0.7, -1, -1, -1, -1],\n  },\n  {\n    name: 'blendColor',\n    fabricType: 'blendcolor',\n    options: {\n      alpha: {type: 'slider', current: 0.5, min: 0.1, max: 1, step: 0.1},\n      mode: {\n        current: 'add',\n        type: 'select',\n        available: [\n          {key: 'add'},\n          {key: 'multiply'},\n          {key: 'subtract'},\n          {key: 'diff'},\n          {key: 'screen'},\n          {key: 'lighten'},\n          {key: 'darken'},\n        ],\n      },\n      color: {type: 'colorPicker', current: '#FF4081'},\n    },\n  },\n];\n\nexport const filterNameMessages: Record<string, MessageDescriptor> =\n  defineMessages({\n    grayscale: {defaultMessage: 'grayscale', description: 'Filter name'},\n    blackWhite: {defaultMessage: 'Black & White', description: 'Filter name'},\n    sharpen: {defaultMessage: 'Sharpen', description: 'Filter name'},\n    invert: {defaultMessage: 'Invert', description: 'Filter name'},\n    vintage: {defaultMessage: 'Vintage', description: 'Filter name'},\n    polaroid: {defaultMessage: 'Polaroid', description: 'Filter name'},\n    kodachrome: {defaultMessage: 'Kodachrome', description: 'Filter name'},\n    technicolor: {defaultMessage: 'Technicolor', description: 'Filter name'},\n    brownie: {defaultMessage: 'Brownie', description: 'Filter name'},\n    sepia: {defaultMessage: 'Sepia', description: 'Filter name'},\n    removeColor: {defaultMessage: 'Remove Color', description: 'Filter name'},\n    brightness: {defaultMessage: 'Brightness', description: 'Filter name'},\n    gamma: {defaultMessage: 'Gamma', description: 'Filter name'},\n    noise: {defaultMessage: 'Noise', description: 'Filter name'},\n    pixelate: {defaultMessage: 'Pixelate', description: 'Filter name'},\n    blur: {defaultMessage: 'Blur', description: 'Filter name'},\n    emboss: {defaultMessage: 'Emboss', description: 'Filter name'},\n    blendColor: {defaultMessage: 'Blend Color', description: 'Filter name'},\n  });\n\nexport const filterOptionMessages: Record<string, MessageDescriptor> =\n  defineMessages({\n    distance: {defaultMessage: 'distance', description: 'Filter options'},\n    color: {defaultMessage: 'color', description: 'Filter options'},\n    brightness: {defaultMessage: 'brightness', description: 'Filter options'},\n    red: {defaultMessage: 'red', description: 'Filter options'},\n    green: {defaultMessage: 'green', description: 'Filter options'},\n    blue: {defaultMessage: 'blue', description: 'Filter options'},\n    noise: {defaultMessage: 'noise', description: 'Filter options'},\n    blocksize: {defaultMessage: 'blocksize', description: 'Filter options'},\n    mode: {defaultMessage: 'mode', description: 'Filter options'},\n    alpha: {defaultMessage: 'alpha', description: 'Filter options'},\n  });\n","export function ucFirst<T extends string>(string: T): T {\n    if ( ! string) return string;\n    return (string.charAt(0).toUpperCase() + string.slice(1)) as T;\n}\n","import {fabric} from 'fabric';\nimport {IAllFilters, IBaseFilter, Image} from 'fabric/fabric-impl';\nimport {FilterConfig, filterList, FilterOptions} from './filter-list';\nimport {ucFirst} from '../../common/utils/string/uc-first';\nimport {useStore} from '../../state/store';\nimport {ObjectName} from '../../objects/object-name';\nimport {state, tools} from '../../state/utils';\n\nexport interface FabricFilter extends IBaseFilter {\n  type: string;\n  matrix?: number[];\n\n  [key: string]: any;\n}\n\nexport class FilterTool {\n  constructor() {\n    useStore.subscribe(\n      s => s.history.pointer,\n      () => {\n        this.syncState();\n      }\n    );\n  }\n\n  /**\n   * Apply specified filter to all images.\n   */\n  apply(filterName: string) {\n    state().filter.select(filterName, this.hasOptions(filterName));\n    const filter = this.getByName(filterName);\n    if (this.isApplied(filter.name)) {\n      this.remove(filter.name);\n      return;\n    }\n\n    const newFilter = this.create(filter);\n    this.getImages().forEach(image => {\n      image.filters?.push(newFilter);\n      image.applyFilters();\n    });\n\n    this.syncState();\n    tools().canvas.render();\n  }\n\n  /**\n   * Remove specified filter from all images.\n   */\n  remove(filterName: string) {\n    state().filter.deselect(filterName);\n    const filter = this.getByName(filterName);\n    this.getImages().forEach(image => {\n      const i = this.findFilterIndex(\n        filter.name,\n        image.filters as FabricFilter[]\n      );\n      image.filters?.splice(i, 1);\n      image.applyFilters();\n    });\n    this.syncState();\n    tools().canvas.render();\n  }\n\n  /**\n   * Get a list of all available filters.\n   */\n  getAll(): FilterConfig[] {\n    return filterList;\n  }\n\n  /**\n   * Get configuration for specified filter.\n   */\n  getByName(name: string): FilterConfig {\n    return filterList.find(f => f.name === name) as FilterConfig;\n  }\n\n  /**\n   * Check if specified filter is currently applied.\n   */\n  isApplied(name: string): boolean {\n    const mainImage = tools().canvas.getMainImage();\n    if (!mainImage) return false;\n    return this.findFilterIndex(name, mainImage.filters as FabricFilter[]) > -1;\n  }\n\n  /**\n   * Change specified value for an active filter.\n   */\n  applyValue(\n    filterName: string,\n    optionName: string,\n    optionValue: number | string\n  ) {\n    const filter = this.getByName(filterName);\n\n    this.getImages().forEach(image => {\n      const fabricFilter = ((image.filters || []) as FabricFilter[]).find(\n        curr => curr.type.toLowerCase() === filter.name.toLowerCase()\n      );\n      if (!fabricFilter) return;\n\n      fabricFilter[optionName] = optionValue;\n\n      // filter has a special \"apply\" function that needs to be invoked\n      if (filter.apply) {\n        filter.apply(fabricFilter, optionName, optionValue);\n      }\n\n      image.applyFilters();\n    });\n\n    tools().canvas.render();\n  }\n\n  /**\n   * Create a custom filter.\n   */\n  addCustom(\n    name: string,\n    filter: object,\n    editableOptions?: FilterOptions,\n    initialConfig?: object\n  ) {\n    const imgFilters = fabric.Image.filters as unknown as Record<string, any>;\n    imgFilters[ucFirst(name)] = fabric.util.createClass(\n      imgFilters.BaseFilter,\n      filter\n    );\n    imgFilters[ucFirst(name)].fromObject = imgFilters.BaseFilter.fromObject;\n    filterList.push({\n      name,\n      options: editableOptions,\n      initialConfig,\n    });\n  }\n\n  /**\n   * @hidden\n   */\n  create(config: FilterConfig): IBaseFilter {\n    const initialConfig = config.initialConfig || {};\n    let filter: IBaseFilter;\n    if (config.uses) {\n      initialConfig.matrix = config.matrix;\n      filter = new fabric.Image.filters[ucFirst(config.uses)](initialConfig);\n    } else {\n      Object.entries(config.options || {}).forEach(([key, value]) => {\n        initialConfig[key] = value.current;\n      });\n      filter = new fabric.Image.filters[\n        ucFirst(config.name) as keyof IAllFilters\n      ](initialConfig);\n    }\n    (filter as FabricFilter).name = config.name;\n    return filter;\n  }\n\n  /**\n   * @hidden\n   */\n  hasOptions(name: string) {\n    return !!this.getByName(name).options;\n  }\n\n  /**\n   * @hidden\n   */\n  findFilterIndex(name: string, fabricFilters?: FabricFilter[]): number {\n    if (!fabricFilters?.length) return -1;\n\n    const filterConfig = this.getByName(name);\n\n    return fabricFilters.findIndex(fabricFilter => {\n      return this.configMatchesFabricFilter(filterConfig, fabricFilter);\n    });\n  }\n\n  /**\n   * @hidden\n   */\n  syncState() {\n    const applied: string[] = [];\n    const fabricFilters = this.getImages()[0]?.filters || [];\n    fabricFilters.forEach(fabricFilter => {\n      const filterConfig = this.getByFabricFilter(fabricFilter as FabricFilter);\n      if (filterConfig) {\n        applied.push(filterConfig.name);\n      }\n    });\n    useStore.setState({\n      filter: {\n        ...state().filter,\n        applied,\n      },\n    });\n  }\n\n  private getByFabricFilter(\n    fabricFilter: FabricFilter\n  ): FilterConfig | undefined {\n    return filterList.find(filterConfig => {\n      return this.configMatchesFabricFilter(filterConfig, fabricFilter);\n    });\n  }\n\n  private configMatchesFabricFilter(\n    filterConfig: FilterConfig,\n    fabricFilter: FabricFilter\n  ): boolean {\n    const type = fabricFilter.type.toLowerCase().replace(' ', '');\n    if (type === filterConfig.fabricType || type === filterConfig.name) {\n      return true;\n    }\n    // match by matrix\n    return (\n      type === 'convolute' &&\n      this.matrixAreEqual(filterConfig.matrix, fabricFilter.matrix)\n    );\n  }\n\n  private matrixAreEqual(\n    matrix1: number[] | undefined,\n    matrix2: number[] | undefined\n  ): boolean {\n    if (!matrix1 || !matrix2 || matrix1.length !== matrix2.length) return false;\n    for (let i = matrix1.length; i--; ) {\n      if (matrix1[i] !== matrix2[i]) return false;\n    }\n    return true;\n  }\n\n  private getImages(): Image[] {\n    return tools()\n      .objects.getAll()\n      .filter(obj => {\n        return obj.name === ObjectName.Image || ObjectName.MainImage;\n      }) as Image[];\n  }\n}\n","import {state} from '../../state/utils';\nimport type {ResizePayload} from './resize-tool';\n\nexport function clampResizePayload(value: ResizePayload): ResizePayload {\n  if (value.width < getMinWidth(value.usePercentages)) {\n    value.width = getMinWidth(value.usePercentages);\n    if (value.maintainAspect) {\n      value.height = aspectToHeight(value.width, value.usePercentages);\n    }\n  }\n  if (value.width > getMaxWidth(value.usePercentages)) {\n    value.width = getMaxWidth(value.usePercentages);\n    if (value.maintainAspect) {\n      value.height = aspectToHeight(value.width, value.usePercentages);\n    }\n  }\n  if (value.height < getMinHeight(value.usePercentages)) {\n    value.height = getMinHeight(value.usePercentages);\n    if (value.maintainAspect) {\n      value.width = aspectToWidth(value.height, value.usePercentages);\n    }\n  }\n  if (value.height > getMaxHeight(value.usePercentages)) {\n    value.height = getMaxHeight(value.usePercentages);\n    if (value.maintainAspect) {\n      value.width = aspectToWidth(value.height, value.usePercentages);\n    }\n  }\n  return value;\n}\n\nfunction getMinWidth(usePercentages: boolean) {\n  const minWidth = state().config.tools?.resize?.minWidth || 50;\n  if (usePercentages) {\n    return Math.ceil((minWidth * 100) / state().original.width);\n  }\n  return minWidth;\n}\n\nfunction getMaxWidth(usePercentages: boolean) {\n  const maxWidth = state().config.tools?.resize?.maxWidth || 2400;\n  if (usePercentages) {\n    return Math.ceil((maxWidth * 100) / state().original.width);\n  }\n  return maxWidth;\n}\n\nfunction getMinHeight(usePercentages: boolean) {\n  const minHeight = state().config.tools?.resize?.minHeight || 50;\n  if (usePercentages) {\n    return Math.ceil((minHeight * 100) / state().original.height);\n  }\n  return minHeight;\n}\n\nfunction getMaxHeight(usePercentages: boolean) {\n  const maxHeight = state().config.tools?.resize?.maxHeight || 2400;\n  if (usePercentages) {\n    return Math.ceil((maxHeight * 100) / state().original.height);\n  }\n  return maxHeight;\n}\n\nexport function aspectToWidth(\n  newHeight: number,\n  usePercentages: boolean\n): number {\n  if (usePercentages) {\n    // noinspection JSSuspiciousNameCombination\n    return newHeight;\n  }\n  const hRatio = state().original.height / newHeight;\n  return Math.floor(state().original.width / hRatio);\n}\n\nexport function aspectToHeight(\n  newWidth: number,\n  usePercentages: boolean\n): number {\n  if (usePercentages) {\n    // noinspection JSSuspiciousNameCombination\n    return newWidth;\n  }\n  const wRatio = state().original.width / newWidth;\n  return Math.floor(state().original.height / wRatio);\n}\n","import {clampResizePayload} from './clamp-resize-payload';\nimport {fabricCanvas, state, tools} from '../../state/utils';\n\nexport class ResizeTool {\n  /**\n   * Resize image and other canvas objects.\n   * If \"usePercentages\" is false, width/height should be pixels.\n   */\n  apply(payload: ResizePayload) {\n    const {width, height, usePercentages} = clampResizePayload(payload);\n    const currentWidth = Math.ceil(state().original.width);\n    const currentHeight = Math.ceil(state().original.height);\n    const newWidth = Math.ceil(width);\n    const newHeight = Math.ceil(height);\n    let widthScale;\n    let heightScale;\n\n    if (usePercentages) {\n      widthScale = width / 100;\n      heightScale = height / 100;\n    } else {\n      widthScale = width / state().original.width;\n      heightScale = height / state().original.height;\n    }\n\n    if (currentWidth === newWidth && currentHeight === newHeight) return;\n\n    this.resize(widthScale, heightScale);\n  }\n\n  /**\n   * Resize canvas and all objects to specified scale.\n   */\n  private resize(widthScale: number, heightScale: number) {\n    tools().zoom.set(1, false);\n\n    const newHeight = Math.round(state().original.height * heightScale);\n    const newWidth = Math.round(state().original.width * widthScale);\n\n    tools().canvas.resize(newWidth, newHeight, {\n      applyZoom: false,\n      resizeHelper: true,\n    });\n\n    tools()\n      .objects.getAll()\n      .forEach(object => {\n        const scaleX = object.scaleX || 1;\n        const scaleY = object.scaleY || 1;\n        const left = object.left || 0;\n        const top = object.top || 0;\n\n        const tempScaleX = scaleX * widthScale;\n        const tempScaleY = scaleY * heightScale;\n        const tempLeft = left * widthScale;\n        const tempTop = top * heightScale;\n\n        object.scaleX = tempScaleX;\n        object.scaleY = tempScaleY;\n        object.left = tempLeft;\n        object.top = tempTop;\n\n        object.setCoords();\n      });\n\n    tools().zoom.fitToScreen();\n    fabricCanvas().requestRenderAll();\n  }\n}\n\nexport interface ResizePayload {\n  width: number;\n  height: number;\n  maintainAspect: boolean;\n  usePercentages: boolean;\n}\n","import {InteractableRect} from '../../../../common/ui/interactions/interactable-rect';\nimport {CropzoneRefs} from './cropzone-refs';\nimport {state} from '../../../../state/utils';\n\nexport function drawCropzone(rect: InteractableRect, refs: CropzoneRefs) {\n  if (refs.innerZone !== null) {\n    refs = refs as NonNullable<CropzoneRefs>;\n    drawInnerZone(rect, refs);\n    drawMask(rect, refs);\n    drawLines(rect, refs);\n  }\n}\n\nfunction drawInnerZone(\n  rect: InteractableRect,\n  refs: NonNullable<CropzoneRefs>\n) {\n  refs.innerZone!.style.width = `${rect.width}px`;\n  refs.innerZone!.style.height = `${rect.height}px`;\n  refs.innerZone!.style.transform = `translate(${rect.left}px, ${rect.top}px)`;\n}\n\nfunction drawMask(rect: InteractableRect, refs: CropzoneRefs) {\n  const contWidth = state().canvasSize.width;\n  const contHeight = state().canvasSize.height;\n\n  // top\n  refs.maskTop!.style.height = `${rect.top}px`;\n  refs.maskTop!.style.width = `${contWidth}px`;\n  // left\n  refs.maskLeft!.style.top = `${rect.top}px`;\n  refs.maskLeft!.style.height = `${rect.height}px`;\n  refs.maskLeft!.style.width = `${rect.left}px`;\n  // right\n  const rightLeft = rect.left + rect.width;\n  refs.maskRight!.style.left = `${rightLeft}px`;\n  refs.maskRight!.style.top = `${rect.top}px`;\n  refs.maskRight!.style.height = `${rect.height}px`;\n  refs.maskRight!.style.width = `${contWidth - rightLeft}px`;\n  // bottom\n  refs.maskBottom!.style.height = `${contHeight - (rect.top + rect.height)}px`;\n  refs.maskBottom!.style.width = `${contWidth}px`;\n}\n\nfunction drawLines(rect: InteractableRect, refs: CropzoneRefs) {\n  const horSpace = (rect.width - 2) / 3;\n  refs.lineVer1!.style.height = `${rect.height}px`;\n  refs.lineVer1!.style.transform = `translate(${horSpace}px, 0)`;\n  refs.lineVer2!.style.height = `${rect.height}px`;\n  refs.lineVer2!.style.transform = `translate(${horSpace * 2}px, 0)`;\n  const verSpace = (rect.height - 2) / 3;\n  refs.lineHor1!.style.width = `${rect.width}px`;\n  refs.lineHor1!.style.transform = `translate(0, ${verSpace}px)`;\n  refs.lineHor2!.style.width = `${rect.width}px`;\n  refs.lineHor2!.style.transform = `translate(0, ${verSpace * 2}px)`;\n}\n","export function calcNewSizeFromAspectRatio(\n  aspectRatio: number | null,\n  oldWidth: number,\n  oldHeight: number\n) {\n  let newWidth = oldWidth;\n  let newHeight = oldHeight;\n\n  if (aspectRatio) {\n    if (oldHeight * aspectRatio > oldWidth) {\n      newHeight = oldWidth / aspectRatio;\n    } else {\n      newWidth = oldHeight * aspectRatio;\n    }\n  }\n\n  return {width: Math.floor(newWidth), height: Math.floor(newHeight)};\n}\n\nexport function aspectRatioFromStr(ratio: string | null): number | null {\n  if (!ratio) return null;\n  const parts = ratio.split(':');\n  return parseInt(parts[0], 10) / parseInt(parts[1], 10);\n}\n","import {InteractableRect} from '../interactable-rect';\nimport {calcNewSizeFromAspectRatio} from './calc-new-size-from-aspect-ratio';\n\nexport function centerWithinBoundary(\n  boundary: Omit<InteractableRect, 'angle'>,\n  aspectRatio: number | null = null\n): InteractableRect {\n  // set rect to the size of specified boundary\n  const rect: InteractableRect = {\n    width: boundary.width,\n    height: boundary.height,\n    top: 0,\n    left: 0,\n    angle: 0,\n  };\n  // maybe resize rect based on aspect ratio\n  if (aspectRatio) {\n    const newSize = calcNewSizeFromAspectRatio(\n      aspectRatio,\n      rect.width,\n      rect.height\n    );\n    rect.width = newSize.width;\n    rect.height = newSize.height;\n  }\n  // center the rect\n  rect.left = (boundary.width - rect.width) / 2;\n  rect.top = (boundary.height - rect.height) / 2;\n  return rect;\n}\n","import React from 'react';\nimport {drawCropzone} from './ui/cropzone/draw-cropzone';\nimport {InteractableRect} from '../../common/ui/interactions/interactable-rect';\nimport {Interactable} from '../../common/ui/interactions/interactable';\nimport {centerWithinBoundary} from '../../common/ui/interactions/utils/center-within-boundary';\nimport {aspectRatioFromStr} from '../../common/ui/interactions/utils/calc-new-size-from-aspect-ratio';\nimport {CropzoneRefs} from './ui/cropzone/cropzone-refs';\nimport {state, tools} from '../../state/utils';\n\nexport class CropTool {\n  private refs: React.MutableRefObject<CropzoneRefs> | null = null;\n  zone?: Interactable;\n\n  apply(box: Omit<InteractableRect, 'angle'>): Promise<void> {\n    const frameName = tools().frame.active.config?.name;\n    const frameSize = tools().frame.active.currentSizeInPercent;\n    tools().frame.active.hide();\n\n    return tools()\n      .merge.apply()\n      .then(() => {\n        tools().canvas.resize(Math.round(box.width), Math.round(box.height), {\n          applyZoom: true,\n          resizeHelper: true,\n        });\n\n        const img = tools().canvas.getMainImage();\n        img.cropX = Math.round(box.left);\n        img.cropY = Math.round(box.top);\n        img.width = Math.round(box.width);\n        img.height = Math.round(box.height);\n        img.viewportCenter();\n\n        if (frameName) {\n          tools().frame.add(frameName, frameSize);\n        }\n\n        tools().zoom.fitToScreen();\n        tools().canvas.render();\n      });\n  }\n\n  drawZone(rect: InteractableRect) {\n    if (this.refs?.current) {\n      state().crop.setCropzoneRect(rect);\n      drawCropzone(rect, this.refs.current);\n    }\n  }\n\n  resetCropzone(aspectRatioStr: string | null) {\n    const boundaryRect = state().canvasSize;\n    const aspectRatio = aspectRatioFromStr(aspectRatioStr);\n    if (!boundaryRect) return;\n    this.zone?.setConfig({aspectRatio, boundaryRect});\n    state().crop.setAspectRatio(aspectRatioStr);\n    const newRect = centerWithinBoundary(boundaryRect, aspectRatio);\n    this.drawZone(newRect);\n  }\n\n  registerRefs(refs: React.MutableRefObject<CropzoneRefs>) {\n    this.refs = refs;\n  }\n}\n","import {Object} from 'fabric/fabric-impl';\nimport {fabric} from 'fabric';\nimport {BasicShape, PathOptions} from '../../config/default-shapes';\nimport {StickerCategory} from '../../config/default-stickers';\nimport {ObjectName} from '../../objects/object-name';\nimport {fabricCanvas, state, tools} from '../../state/utils';\nimport {assetUrl} from '../../utils/asset-url';\n\nexport class ShapeTool {\n  getShapeByName(name: string): BasicShape | null {\n    const shapes = state().config.tools?.shapes?.items;\n    return shapes?.find(shape => shape.name === name) || null;\n  }\n\n  addBasicShape(shapeName: string): Object | null {\n    const shape = this.getShapeByName(shapeName);\n    if (!shape) return null;\n\n    const {width, height, ...userConfig} =\n      state().config.objectDefaults?.shape || {};\n\n    const options: BasicShape['options'] = {\n      ...userConfig,\n      ...shape.options,\n    };\n\n    let fabricShape: Object;\n\n    if (shape.name === 'circle') {\n      fabricShape = new fabric.Circle({\n        ...options,\n        radius: 100,\n      });\n    } else if (shape.name === 'ellipse') {\n      fabricShape = new fabric.Ellipse({\n        ...options,\n        rx: 100,\n        ry: 50,\n      });\n    } else if (shape.type === 'Path') {\n      fabricShape = new fabric.Path((options as PathOptions).path, {\n        // @ts-ignore\n        displayName: shape.name,\n        ...options,\n      });\n    } else {\n      const shapeType = shape.type as 'Circle' | 'Rect';\n      fabricShape = new fabric[shapeType]({\n        ...options,\n        width: 150,\n        height: 150,\n      });\n    }\n\n    this.addAndPositionShape(fabricShape, ObjectName.Shape, {width, height});\n    return fabricShape;\n  }\n\n  addSticker(categoryName: string, name: number | string): Promise<void> {\n    const category = state().config.tools?.stickers?.items?.find(\n      cat => cat.name === categoryName\n    );\n    if (!category) return Promise.resolve();\n    if (category.type === 'svg') {\n      const url = stickerUrl(category, name);\n      return this.addSvgSticker(url);\n    }\n    return this.addRegularSticker(category, name);\n  }\n\n  private addRegularSticker(\n    category: StickerCategory,\n    name: number | string\n  ): Promise<void> {\n    return new Promise(resolve => {\n      fabric.util.loadImage(stickerUrl(category, name), img => {\n        const {width, height, ...userConfig} =\n          state().config.objectDefaults?.sticker || {};\n        const sticker = new fabric.Image(img, userConfig);\n        this.addAndPositionShape(sticker, ObjectName.Sticker, {width, height});\n        resolve();\n      });\n    });\n  }\n\n  addSvgSticker(\n    url: string,\n    objectName: ObjectName = ObjectName.Sticker\n  ): Promise<void> {\n    return new Promise(resolve => {\n      fabric.loadSVGFromURL(url, (objects, options) => {\n        const {width, height, ...userConfig} =\n          state().config.objectDefaults?.sticker || {};\n        const sticker = fabric.util.groupSVGElements(objects, options);\n        sticker.set(userConfig);\n        this.addAndPositionShape(sticker, objectName, {width, height});\n        resolve();\n      });\n    });\n  }\n\n  private addAndPositionShape(\n    shape: Object,\n    objectName: ObjectName,\n    {width}: {width?: number; height?: number}\n  ) {\n    shape.name = objectName;\n    shape.scaleX = 1;\n    shape.scaleY = 1;\n    fabricCanvas().add(shape);\n\n    const newWidth = width || (state().original.width * state().zoom) / 4;\n    shape.scaleToWidth(Math.min(150, newWidth));\n\n    shape.viewportCenter();\n    shape.setCoords();\n    tools().canvas.render();\n    fabricCanvas().setActiveObject(shape);\n  }\n}\n\nexport function stickerUrl(\n  category: StickerCategory,\n  stickerName: number | string\n): string {\n  return assetUrl(\n    `images/stickers/${category.name}/${stickerName}.${category.type}`\n  );\n}\n","import {fabric} from 'fabric';\nimport {IImageOptions, Image, StaticCanvas} from 'fabric/fabric-impl';\nimport {ActiveFrame, ActiveFrameParts} from './active-frame';\nimport {Frame} from './frame';\nimport {staticObjectConfig} from '../../objects/static-object-config';\nimport {fabricCanvas, state, tools} from '../../state/utils';\nimport {assetUrl} from '../../utils/asset-url';\n\ninterface FramePatternPart {\n  name: keyof ActiveFrameParts;\n  img: Image;\n  canvas: StaticCanvas;\n}\n\nexport class FramePatterns {\n  patternCache: FramePatternPart[] = [];\n\n  constructor(private activeFrame: ActiveFrame) {}\n\n  /**\n   * Fill frame part objects with matching pattern images.\n   */\n  private fillParts(mode: 'stretch' | 'repeat' | 'basic') {\n    this.patternCache.forEach(part => {\n      this.fillPartWithPattern(part, mode);\n    });\n  }\n\n  /**\n   * Fill specified frame part with matching pattern.\n   */\n  private fillPartWithPattern(\n    part: FramePatternPart,\n    mode: 'stretch' | 'repeat' | 'basic'\n  ) {\n    if (!this.activeFrame.parts) return;\n    part.canvas = new fabric.StaticCanvas(null);\n    part.canvas.add(part.img);\n\n    const pattern = new fabric.Pattern({\n      source: part.canvas.getElement() as any,\n      repeat: mode === 'repeat' ? 'repeat' : 'no-repeat',\n    });\n\n    if (this.activeFrame.parts[part.name]) {\n      this.activeFrame.parts[part.name].set('fill', pattern);\n    }\n  }\n\n  /**\n   * Scale all frame patterns to fill their container rect objects.\n   */\n  public scale(value: number) {\n    if (!this.activeFrame.config || !this.patternCache) {\n      return;\n    }\n\n    const mode = this.activeFrame.config.mode;\n\n    // @ts-ignore\n    value /= fabricCanvas().getRetinaScaling();\n\n    this.patternCache.forEach(part => {\n      if (!this.activeFrame.parts) return;\n      // scale or repeat top and bottom sides\n      if (part.name === 'top' || part.name === 'bottom') {\n        if (mode === 'stretch') {\n          this.scalePatternToWidth(\n            part.img,\n            this.activeFrame.parts.top.getScaledWidth()\n          ); // minus width of left and right corners\n          this.scalePatternToHeight(part.img, value);\n        } else {\n          part.img.scaleToHeight(value);\n        }\n\n        // scale or repeat left and right sides\n      } else if (part.name === 'left' || part.name === 'right') {\n        if (mode === 'stretch') {\n          this.scalePatternToWidth(part.img, value);\n          this.scalePatternToHeight(\n            part.img,\n            this.activeFrame.parts.left.getScaledHeight()\n          ); // minus width of left and right corners\n        } else {\n          part.img.scaleToWidth(value);\n        }\n\n        // scale corners\n      } else if (mode === 'stretch') {\n        this.scalePatternToWidth(part.img, value);\n        this.scalePatternToHeight(part.img, value); // minus width of left and right corners\n      } else {\n        part.img.scaleToWidth(value);\n      }\n      part.canvas.setDimensions({\n        width: part.img.getScaledWidth(),\n        height: part.img.getScaledHeight(),\n      });\n    });\n    tools().canvas.render();\n  }\n\n  /**\n   * Scale pattern image to specified width.\n   */\n  private scalePatternToWidth(pattern: Image, value: number) {\n    if (!pattern.width) return;\n    const boundingRectFactor =\n      pattern.getBoundingRect().width / pattern.getScaledWidth();\n    pattern.set('scaleX', value / pattern.width / boundingRectFactor);\n    pattern.setCoords();\n  }\n\n  /**\n   * Scale pattern image to specified height.\n   */\n  private scalePatternToHeight(pattern: Image, value: number) {\n    if (!pattern.height) return;\n    const boundingRectFactor =\n      pattern.getBoundingRect().height / pattern.getScaledHeight();\n    pattern.set('scaleY', value / pattern.height / boundingRectFactor);\n    pattern.setCoords();\n  }\n\n  /**\n   * Load all images needed to build specified frame.\n   */\n  public load(frame: Frame) {\n    const promises = this.activeFrame.getPartNames().map(part => {\n      return new Promise(resolve => {\n        const config = {\n          ...staticObjectConfig,\n          originX: 'left',\n          originY: 'top',\n        } as IImageOptions;\n        if (state().config.crossOrigin) {\n          config.crossOrigin = 'anonymous';\n        }\n        fabric.Image.fromURL(\n          this.getPartUrl(frame, part),\n          img => {\n            resolve({name: part, img});\n          },\n          config\n        );\n      });\n    });\n\n    return Promise.all(promises).then(images => {\n      this.patternCache = images as any;\n      this.fillParts(frame.mode);\n    });\n  }\n\n  private getPartUrl(frame: Frame, part: string): string {\n    return assetUrl(`images/frames/${frame.name}/${part}.png`);\n  }\n}\n","import {fabric} from 'fabric';\nimport {ActiveFrame, ActiveFrameParts} from './active-frame';\nimport {FramePatterns} from './frame-patterns';\nimport {Frame} from './frame';\nimport {staticObjectConfig} from '../../objects/static-object-config';\nimport {fabricCanvas, state, tools} from '../../state/utils';\n\nexport class FrameBuilder {\n  get defaultColor(): string | undefined {\n    return state().config.objectDefaults?.global?.fill;\n  }\n\n  constructor(\n    private activeFrame: ActiveFrame,\n    private patterns: FramePatterns\n  ) {}\n\n  /**\n   * Build a new canvas frame group.\n   */\n  build(frame: Frame, size: number): void {\n    this.createParts(frame);\n    this.resize(size);\n    this.activeFrame.config = frame;\n\n    // basic frame has no pattern fill\n    if (frame.mode === 'basic') {\n      tools().canvas.render();\n      return;\n    }\n\n    this.patterns.load(frame).then(() => {\n      this.patterns.scale(size);\n      tools().canvas.render();\n    });\n  }\n\n  /**\n   * Create rect object for each frame part.\n   */\n  private createParts(frame: Frame) {\n    const parts: ActiveFrameParts = {} as ActiveFrameParts;\n    this.activeFrame.getPartNames().forEach(partName => {\n      const fill = frame.mode === 'basic' ? this.defaultColor : undefined;\n      parts[partName] = new fabric.Rect({\n        ...staticObjectConfig,\n        fill,\n        originX: 'left',\n        originY: 'top',\n        name: `frame.rect.${partName}`,\n        objectCaching: false, // patterns are not redrawn correctly when resizing frame without this\n        data: {pixieInternal: true},\n      });\n      fabricCanvas().add(parts[partName]);\n    });\n    this.activeFrame.parts = parts;\n  }\n\n  /**\n   * Position and resize all frame parts.\n   */\n  resize(value: number) {\n    const fullWidth = state().original.width;\n    const fullHeight = state().original.height;\n    const frame = this.activeFrame;\n    const cornerSize = value;\n\n    if (!frame.parts) return;\n\n    frame.parts.topLeft.set({\n      width: cornerSize,\n      height: cornerSize,\n    });\n\n    frame.parts.topRight.set({\n      left: fullWidth - frame.parts.topLeft.getScaledWidth(),\n      width: cornerSize,\n      height: cornerSize,\n    });\n\n    frame.parts.top.set({\n      left: frame.parts.topLeft.getScaledWidth() - 1,\n      width:\n        fullWidth -\n        frame.parts.topLeft.getScaledWidth() -\n        frame.parts.topRight.getScaledWidth() +\n        3,\n      height: cornerSize,\n    });\n\n    frame.parts.bottomLeft.set({\n      top: fullHeight - frame.parts.topLeft.getScaledHeight(),\n      width: cornerSize,\n      height: cornerSize,\n    });\n\n    frame.parts.left.set({\n      top: frame.parts.topLeft.getScaledHeight() - 1,\n      width: cornerSize,\n      height:\n        fullHeight -\n        frame.parts.topLeft.getScaledHeight() -\n        frame.parts.bottomLeft.getScaledHeight() +\n        3,\n    });\n\n    frame.parts.bottomRight.set({\n      left: fullWidth - frame.parts.bottomLeft.getScaledWidth(),\n      top: fullHeight - frame.parts.topRight.getScaledWidth(),\n      width: cornerSize,\n      height: cornerSize,\n    });\n\n    frame.parts.bottom.set({\n      left: frame.parts.top.left,\n      top: fullHeight - frame.parts.top.getScaledHeight(),\n      width: frame.parts.top.getScaledWidth(),\n      height: cornerSize,\n    });\n\n    frame.parts.right.set({\n      left: fullWidth - frame.parts.left.getScaledWidth(),\n      top: frame.parts.left.top,\n      width: frame.parts.left.width,\n      height: frame.parts.left.getScaledHeight(),\n    });\n  }\n}\n","import {Rect} from 'fabric/fabric-impl';\nimport {Frame} from './frame';\nimport {fabricCanvas, tools} from '../../state/utils';\n\nexport interface ActiveFrameParts {\n  topLeft: Rect;\n  top: Rect;\n  topRight: Rect;\n  right: Rect;\n  bottomRight: Rect;\n  bottom: Rect;\n  bottomLeft: Rect;\n  left: Rect;\n}\n\nexport class ActiveFrame {\n  /**\n   * List of frame corner names.\n   */\n  readonly corners = [\n    'topLeft',\n    'topRight',\n    'bottomLeft',\n    'bottomRight',\n  ] as const;\n\n  /**\n   * List of frame side names.\n   */\n  readonly sides = ['top', 'right', 'bottom', 'left'] as const;\n\n  parts: ActiveFrameParts | null = null;\n\n  /**\n   * Configuration for currently active frame.\n   */\n  config: Frame | null = null;\n\n  /**\n   * Current size of frame in percents relative to canvas size.\n   */\n  currentSizeInPercent: number = 100;\n\n  getPartNames() {\n    return [...this.corners, ...this.sides];\n  }\n\n  hide() {\n    if (!this.parts) return;\n    Object.values(this.parts).forEach(part => part.set({visible: false}));\n    tools().canvas.render();\n  }\n\n  show() {\n    if (!this.parts) return;\n    Object.values(this.parts).forEach(part => part.set({visible: true}));\n    tools().canvas.render();\n  }\n\n  /**\n   * Remove currently active frame.\n   */\n  remove() {\n    if (!this.parts) return;\n\n    // delete all fabric object references\n    this.config = null;\n    Object.values(this.parts).forEach(part => {\n      fabricCanvas().remove(part);\n    });\n    this.parts = null;\n    tools().canvas.render();\n  }\n\n  /**\n   * Check if specified frame is active.\n   */\n  is(frame: Frame): boolean {\n    if (!this.config) return false;\n    return this.config.name === frame.name;\n  }\n\n  /**\n   * Change color of basic frame.\n   */\n  changeColor(value: string) {\n    if (this.config?.mode !== 'basic' || !this.parts) return;\n\n    Object.values(this.parts).forEach(part => {\n      part.set('fill', value);\n    });\n\n    tools().canvas.render();\n  }\n\n  getMinSize(): number {\n    return this.config?.size.min ?? 1;\n  }\n\n  getMaxSize(): number {\n    return this.config?.size.max ?? 35;\n  }\n}\n","import {Frame} from './frame';\nimport {FramePatterns} from './frame-patterns';\nimport {FrameBuilder} from './frame-builder';\nimport {ActiveFrame} from './active-frame';\nimport {fabricCanvas, state, tools} from '../../state/utils';\n\nexport class FrameTool {\n  private readonly patterns: FramePatterns;\n  builder: FrameBuilder;\n  active: ActiveFrame;\n\n  constructor() {\n    this.active = new ActiveFrame();\n    this.patterns = new FramePatterns(this.active);\n    this.builder = new FrameBuilder(this.active, this.patterns);\n    fabricCanvas().on('object:added', () => {\n      Object.values(this.active.parts || []).forEach(part => part.moveTo(98));\n    });\n  }\n\n  /**\n   * Add a new frame to canvas.\n   */\n  add(frameName: string, sizePercent?: number) {\n    const frame = this.getByName(frameName);\n    if (!frame || this.active.is(frame)) return;\n\n    this.active.remove();\n\n    this.active.currentSizeInPercent = sizePercent ?? frame.size.default;\n    const size = this.calcFrameSizeInPixels(this.active.currentSizeInPercent);\n    this.builder.build(frame, size);\n    state().frame.select(frame);\n  }\n\n  /**\n   * Resize active frame to specified percentage relative to canvas size.\n   */\n  resize(percentage?: number) {\n    if (!this.active.parts || !this.active.config) return;\n    if (!percentage) {\n      percentage = this.active.currentSizeInPercent;\n    } else {\n      this.active.currentSizeInPercent = percentage;\n    }\n    const size = this.calcFrameSizeInPixels(percentage);\n    this.builder.resize(size);\n    this.patterns.scale(size);\n    tools().canvas.render();\n  }\n\n  /**\n   * Change color of currently active frame. Only works for \"basic\" frame.\n   */\n  changeColor(value: string) {\n    this.active.changeColor(value);\n  }\n\n  /**\n   * Remove currently active frame.\n   */\n  remove() {\n    this.active.remove();\n    state().frame.deselect();\n  }\n\n  /**\n   * Get frame by specified name.\n   */\n  getByName(frameName: string): Frame | undefined {\n    const items = state().config.tools?.frame?.items;\n    if (items) {\n      return items.find(frame => frame.name === frameName);\n    }\n  }\n\n  /**\n   * @hidden\n   */\n  getActiveFrameConfig(): Frame | null {\n    return this.active.config;\n  }\n\n  /**\n   * Calculate frame size in pixels based on specified percentage relative to canvas size.\n   */\n  private calcFrameSizeInPixels(percentage: number) {\n    const min = Math.min(state().original.width, state().original.height);\n    return Math.ceil((percentage / 100) * min);\n  }\n}\n","import {fabric} from 'fabric';\n\nexport const VLineBrush = (canvas: fabric.Canvas) => {\n  const vLinePatternBrush = new (fabric.PatternBrush as any)(canvas);\n  vLinePatternBrush.getPatternSrc = function VLineBrushSrc() {\n    const patternCanvas = (fabric as any).document.createElement('canvas');\n    patternCanvas.width = 10;\n    patternCanvas.height = 10;\n    const ctx = patternCanvas.getContext('2d');\n\n    ctx.strokeStyle = this.color;\n    ctx.lineWidth = 5;\n    ctx.beginPath();\n    ctx.moveTo(0, 5);\n    ctx.lineTo(10, 5);\n    ctx.closePath();\n    ctx.stroke();\n\n    return patternCanvas;\n  };\n  return vLinePatternBrush;\n};\n","import {fabric} from 'fabric';\n\nexport const HLineBrush = (canvas: fabric.Canvas) => {\n  const hLinePatternBrush = new (fabric.PatternBrush as any)(canvas);\n  hLinePatternBrush.getPatternSrc = function HLineBrushSrc() {\n    const patternCanvas = document.createElement('canvas');\n    patternCanvas.width = 10;\n    patternCanvas.height = 10;\n    const ctx = patternCanvas.getContext('2d')!;\n\n    ctx.strokeStyle = this.color;\n    ctx.lineWidth = 5;\n    ctx.beginPath();\n    ctx.moveTo(5, 0);\n    ctx.lineTo(5, 10);\n    ctx.closePath();\n    ctx.stroke();\n\n    return patternCanvas;\n  };\n\n  return hLinePatternBrush;\n};\n","import {fabric} from 'fabric';\n\nexport const DiamondBrush = (canvas: fabric.Canvas) => {\n  const diamondBrush = new (fabric.PatternBrush as any)(canvas);\n\n  diamondBrush.getPatternSrc = function DiamondBrushSrc() {\n    const squareWidth = this.width / 2;\n    const squareDistance = 5;\n    const patternCanvas = document.createElement('canvas');\n\n    // noinspection JSSuspiciousNameCombination\n    const rect = new fabric.Rect({\n      width: squareWidth,\n      height: squareWidth,\n      angle: 45,\n      fill: this.color,\n    });\n\n    const canvasWidth = rect.getBoundingRect().width;\n\n    patternCanvas.width = canvasWidth + squareDistance;\n    patternCanvas.height = canvasWidth + squareDistance;\n    rect.set({left: canvasWidth / 2, top: canvasWidth / 2});\n\n    const ctx = patternCanvas.getContext('2d');\n    rect.render(ctx!);\n\n    return patternCanvas;\n  };\n\n  return diamondBrush;\n};\n","import {fabric} from 'fabric';\n\nexport const SquareBrush = (canvas: fabric.Canvas) => {\n  const squareBrush = new (fabric.PatternBrush as any)(canvas);\n\n  squareBrush.getPatternSrc = function SquareBrushSrc() {\n    const squareWidth = 10;\n    const squareDistance = 2;\n\n    const patternCanvas = document.createElement('canvas');\n    patternCanvas.width = squareWidth + squareDistance;\n    patternCanvas.height = squareWidth + squareDistance;\n    const ctx = patternCanvas.getContext('2d')!;\n\n    ctx.fillStyle = this.color;\n    ctx.fillRect(0, 0, squareWidth, squareWidth);\n\n    return patternCanvas;\n  };\n\n  return squareBrush;\n};\n","import {fabric} from 'fabric';\nimport {Path} from 'fabric/fabric-impl';\nimport {VLineBrush} from './brushes/v-line-brush';\nimport {HLineBrush} from './brushes/h-line-brush';\nimport {DiamondBrush} from './brushes/diamond-brush';\nimport {SquareBrush} from './brushes/square-brush';\nimport {BrushSizes} from './draw-defaults';\nimport {ObjectName} from '../../objects/object-name';\nimport {staticObjectConfig} from '../../objects/static-object-config';\nimport {fabricCanvas, state} from '../../state/utils';\n\nexport class DrawTool {\n  private customBrushes = {\n    VLineBrush,\n    HLineBrush,\n    DiamondBrush,\n    SquareBrush,\n  } as const;\n  currentBrush = {\n    type: 'PencilBrush',\n    color: state().config.objectDefaults?.global?.fill,\n    width: BrushSizes[1],\n  };\n\n  onPathCreated = (e: {path: Path}) => {\n    e.path.name = ObjectName.Drawing;\n    e.path.set(getPathConfig());\n    state().setDirty(true);\n  };\n\n  /**\n   * Enable drawing mode on canvas.\n   */\n  enable() {\n    fabricCanvas().on('path:created', this.onPathCreated as any);\n    fabricCanvas().isDrawingMode = true;\n    this.setBrushType(this.currentBrush.type);\n    this.setBrushSize(this.currentBrush.width);\n  }\n\n  /**\n   * Disable drawing mode on canvas.\n   */\n  disable() {\n    fabricCanvas().off('path:created', this.onPathCreated as any);\n    fabricCanvas().isDrawingMode = false;\n  }\n\n  getBrushType(): string {\n    return this.currentBrush.type;\n  }\n\n  setBrushType(type: string) {\n    this.currentBrush.type = type;\n    fabricCanvas().freeDrawingBrush =\n      type in fabric\n        ? // @ts-ignore\n          new fabric[type](fabricCanvas())\n        : // @ts-ignore\n          this.customBrushes[type](fabricCanvas());\n    this.applyBrushStyles();\n  }\n\n  /**\n   * Apply current brush styles to fabric.js FreeDrawingBrush instance.\n   */\n  private applyBrushStyles() {\n    Object.keys(this.currentBrush).forEach(key => {\n      // @ts-ignore\n      fabricCanvas().freeDrawingBrush[key] = this.currentBrush[key];\n    });\n    const brush = fabricCanvas().freeDrawingBrush as any;\n    if (brush.getPatternSrc) {\n      brush.source = brush.getPatternSrc.call(brush);\n    }\n  }\n\n  setBrushSize(size: number) {\n    this.currentBrush.width = size;\n    this.applyBrushStyles();\n  }\n\n  getBrushSize(): number {\n    return this.currentBrush.width;\n  }\n\n  /**\n   * Change color of drawing brush.\n   */\n  setBrushColor(color: string) {\n    this.currentBrush.color = color;\n    this.applyBrushStyles();\n  }\n\n  /**\n   * Get color of drawing brush.\n   */\n  getBrushColor(): string | undefined {\n    return this.currentBrush.color;\n  }\n}\n\nfunction getPathConfig() {\n  const staticObjConfig = {...staticObjectConfig};\n  delete staticObjConfig.strokeWidth;\n  return staticObjConfig;\n}\n","export function extensionFromFilename(\n  fullFileName: string\n): string | undefined {\n  const re = /(?:\\.([^.]+))?$/;\n  return re.exec(fullFileName)?.[1];\n}\n","import {extensionFromFilename} from './extension-from-filename';\n\nexport function getFileMime(file: File): string | null {\n  const extensionsToMime: Record<string, string> = {\n    md: 'text/markdown',\n    markdown: 'text/markdown',\n    mp4: 'video/mp4',\n    mp3: 'audio/mp3',\n    svg: 'image/svg+xml',\n    jpg: 'image/jpeg',\n    png: 'image/png',\n    gif: 'image/gif',\n    yaml: 'text/yaml',\n    yml: 'text/yaml',\n  };\n\n  const fileExtension = file.name ? extensionFromFilename(file.name) : null;\n\n  // check if mime type is set in the file object\n  if (file.type) {\n    return file.type;\n  }\n\n  // see if we can map extension to a mime type\n  if (fileExtension && fileExtension in extensionsToMime) {\n    return extensionsToMime[fileExtension];\n  }\n\n  return null;\n}\n","import {getFileMime} from './utils/get-file-mime';\nimport {extensionFromFilename} from './utils/extension-from-filename';\n\nexport class UploadedFile {\n  name: string;\n  relativePath?: string | null;\n  size: number;\n  mime: string | null;\n  extension?: string;\n  native: File;\n  lastModified: number;\n  url: string | null = null;\n\n  private cachedData?: string;\n  get data(): Promise<string> {\n    return new Promise(resolve => {\n      if (this.cachedData) {\n        resolve(this.cachedData);\n      }\n      const reader = new FileReader();\n\n      reader.addEventListener('load', () => {\n        this.cachedData = reader.result as string;\n        resolve(this.cachedData);\n      });\n\n      if (this.extension === 'json') {\n        reader.readAsText(this.native);\n      } else {\n        reader.readAsDataURL(this.native);\n      }\n    });\n  }\n\n  constructor(file: File, relativePath?: string | null) {\n    this.name = file.name;\n    this.size = file.size;\n    this.mime = getFileMime(file);\n    this.lastModified = file.lastModified;\n    this.extension = extensionFromFilename(file.name);\n    this.native = file;\n    relativePath = relativePath || file.webkitRelativePath || null;\n    // only include relative path if file is actually in a folder and not just /file.txt\n    if (relativePath && relativePath.match(/\\//g)!.length > 1) {\n      this.relativePath = relativePath;\n    }\n  }\n}\n","import {UploadInputConfig} from '../upload-input-config';\n\nexport function createUploadInput(\n  config: UploadInputConfig = {}\n): HTMLInputElement {\n  const old = document.querySelector('#hidden-file-upload-input');\n  if (old) old.remove();\n\n  const input = document.createElement('input');\n  input.type = 'file';\n  input.multiple = config.multiple ?? false;\n  input.classList.add('hidden');\n  input.style.display = 'none';\n  input.style.visibility = 'hidden';\n  input.id = 'hidden-file-upload-input';\n\n  input.accept = buildUploadInputAccept(config);\n\n  if (config.directory) {\n    input.webkitdirectory = true;\n  }\n\n  document.body.appendChild(input);\n\n  return input;\n}\n\nexport interface UploadAccentProps {\n  extensions?: string[];\n  types?: string[];\n}\nexport function buildUploadInputAccept({\n  extensions = [],\n  types = [],\n}: UploadAccentProps): string {\n  const accept = [];\n  if (extensions) {\n    extensions = extensions.map(e => {\n      return e.startsWith('.') ? e : `.${e}`;\n    });\n    accept.push(extensions.join(','));\n  }\n\n  if (types) {\n    accept.push(types.join(','));\n  }\n\n  return accept.join(',');\n}\n","import {UploadInputConfig} from '../upload-input-config';\nimport {UploadedFile} from '../uploaded-file';\nimport {createUploadInput} from './create-upload-input';\n\n/**\n * Open browser dialog for uploading files and\n * resolve promise with uploaded files.\n */\nexport function openUploadWindow(\n  config: UploadInputConfig = {}\n): Promise<UploadedFile[]> {\n  return new Promise(resolve => {\n    const input = createUploadInput(config);\n\n    input.onchange = e => {\n      const fileList = (e.target as HTMLInputElement).files;\n      if (!fileList) {\n        return resolve([]);\n      }\n\n      const uploads = Array.from(fileList).map(file => new UploadedFile(file));\n      resolve(uploads);\n      input.remove();\n    };\n\n    document.body.appendChild(input);\n    input.click();\n  });\n}\n","let e={data:\"\"},t=t=>\"object\"==typeof window?((t?t.querySelector(\"#_goober\"):window._goober)||Object.assign((t||document.head).appendChild(document.createElement(\"style\")),{innerHTML:\" \",id:\"_goober\"})).firstChild:t||e,r=e=>{let r=t(e),l=r.data;return r.data=\"\",l},l=/(?:([\\u0080-\\uFFFF\\w-%@]+) *:? *([^{;]+?);|([^;}{]*?) *{)|(}\\s*)/g,a=/\\/\\*[^]*?\\*\\/|\\s\\s+|\\n/g,n=(e,t)=>{let r=\"\",l=\"\",a=\"\";for(let o in e){let s=e[o];\"@\"==o[0]?\"i\"==o[1]?r=o+\" \"+s+\";\":l+=\"f\"==o[1]?n(s,o):o+\"{\"+n(s,\"k\"==o[1]?\"\":t)+\"}\":\"object\"==typeof s?l+=n(s,t?t.replace(/([^,])+/g,e=>o.replace(/(^:.*)|([^,])+/g,t=>/&/.test(t)?t.replace(/&/g,e):e?e+\" \"+t:t)):o):null!=s&&(o=/^--/.test(o)?o:o.replace(/[A-Z]/g,\"-$&\").toLowerCase(),a+=n.p?n.p(o,s):o+\":\"+s+\";\")}return r+(t&&a?t+\"{\"+a+\"}\":a)+l},o={},s=e=>{if(\"object\"==typeof e){let t=\"\";for(let r in e)t+=r+s(e[r]);return t}return e},c=(e,t,r,c,i)=>{let u=s(e),p=o[u]||(o[u]=(e=>{let t=0,r=11;for(;t<e.length;)r=101*r+e.charCodeAt(t++)>>>0;return\"go\"+r})(u));if(!o[p]){let t=u!==e?e:(e=>{let t,r=[{}];for(;t=l.exec(e.replace(a,\"\"));)t[4]?r.shift():t[3]?r.unshift(r[0][t[3]]=r[0][t[3]]||{}):r[0][t[1]]=t[2];return r[0]})(e);o[p]=n(i?{[\"@keyframes \"+p]:t}:t,r?\"\":\".\"+p)}return((e,t,r)=>{-1==t.data.indexOf(e)&&(t.data=r?e+t.data:t.data+e)})(o[p],t,c),p},i=(e,t,r)=>e.reduce((e,l,a)=>{let o=t[a];if(o&&o.call){let e=o(r),t=e&&e.props&&e.props.className||/^go/.test(e)&&e;o=t?\".\"+t:e&&\"object\"==typeof e?e.props?\"\":n(e,\"\"):!1===e?\"\":e}return e+l+(null==o?\"\":o)},\"\");function u(e){let r=this||{},l=e.call?e(r.p):e;return c(l.unshift?l.raw?i(l,[].slice.call(arguments,1),r.p):l.reduce((e,t)=>Object.assign(e,t&&t.call?t(r.p):t),{}):l,t(r.target),r.g,r.o,r.k)}let p,d,f,g=u.bind({g:1}),b=u.bind({k:1});function h(e,t,r,l){n.p=t,p=e,d=r,f=l}function m(e,t){let r=this||{};return function(){let l=arguments;function a(n,o){let s=Object.assign({},n),c=s.className||a.className;r.p=Object.assign({theme:d&&d()},s),r.o=/ *go\\d+/.test(c),s.className=u.apply(r,l)+(c?\" \"+c:\"\"),t&&(s.ref=o);let i=e;return e[0]&&(i=s.as||e,delete s.as),f&&i[0]&&f(s),p(i,s)}return t?t(a):a}}export{u as css,r as extractCss,g as glob,b as keyframes,h as setup,m as styled};\n","import { useState, useEffect, useMemo, createElement, memo, Fragment, forwardRef } from 'react';\nimport { styled, keyframes, setup, css } from 'goober';\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\nfunction _taggedTemplateLiteralLoose(strings, raw) {\n  if (!raw) {\n    raw = strings.slice(0);\n  }\n\n  strings.raw = raw;\n  return strings;\n}\n\nvar isFunction = function isFunction(valOrFunction) {\n  return typeof valOrFunction === 'function';\n};\n\nvar resolveValue = function resolveValue(valOrFunction, arg) {\n  return isFunction(valOrFunction) ? valOrFunction(arg) : valOrFunction;\n};\n\nvar genId = /*#__PURE__*/function () {\n  var count = 0;\n  return function () {\n    return (++count).toString();\n  };\n}();\nvar createRectRef = function createRectRef(onRect) {\n  return function (el) {\n    if (el) {\n      setTimeout(function () {\n        var boundingRect = el.getBoundingClientRect();\n        onRect(boundingRect);\n      });\n    }\n  };\n};\nvar prefersReducedMotion = /*#__PURE__*/function () {\n  // Cache result\n  var shouldReduceMotion = undefined;\n  return function () {\n    if (shouldReduceMotion === undefined && typeof window !== 'undefined') {\n      var mediaQuery = matchMedia('(prefers-reduced-motion: reduce)');\n      shouldReduceMotion = !mediaQuery || mediaQuery.matches;\n    }\n\n    return shouldReduceMotion;\n  };\n}();\n\nvar TOAST_LIMIT = 20;\nvar ActionType;\n\n(function (ActionType) {\n  ActionType[ActionType[\"ADD_TOAST\"] = 0] = \"ADD_TOAST\";\n  ActionType[ActionType[\"UPDATE_TOAST\"] = 1] = \"UPDATE_TOAST\";\n  ActionType[ActionType[\"UPSERT_TOAST\"] = 2] = \"UPSERT_TOAST\";\n  ActionType[ActionType[\"DISMISS_TOAST\"] = 3] = \"DISMISS_TOAST\";\n  ActionType[ActionType[\"REMOVE_TOAST\"] = 4] = \"REMOVE_TOAST\";\n  ActionType[ActionType[\"START_PAUSE\"] = 5] = \"START_PAUSE\";\n  ActionType[ActionType[\"END_PAUSE\"] = 6] = \"END_PAUSE\";\n})(ActionType || (ActionType = {}));\n\nvar toastTimeouts = /*#__PURE__*/new Map();\n\nvar addToRemoveQueue = function addToRemoveQueue(toastId) {\n  if (toastTimeouts.has(toastId)) {\n    return;\n  }\n\n  var timeout = setTimeout(function () {\n    toastTimeouts[\"delete\"](toastId);\n    dispatch({\n      type: ActionType.REMOVE_TOAST,\n      toastId: toastId\n    });\n  }, 1000);\n  toastTimeouts.set(toastId, timeout);\n};\n\nvar clearFromRemoveQueue = function clearFromRemoveQueue(toastId) {\n  var timeout = toastTimeouts.get(toastId);\n\n  if (timeout) {\n    clearTimeout(timeout);\n  }\n};\n\nvar reducer = function reducer(state, action) {\n  switch (action.type) {\n    case ActionType.ADD_TOAST:\n      return _extends({}, state, {\n        toasts: [action.toast].concat(state.toasts).slice(0, TOAST_LIMIT)\n      });\n\n    case ActionType.UPDATE_TOAST:\n      //  ! Side effects !\n      if (action.toast.id) {\n        clearFromRemoveQueue(action.toast.id);\n      }\n\n      return _extends({}, state, {\n        toasts: state.toasts.map(function (t) {\n          return t.id === action.toast.id ? _extends({}, t, action.toast) : t;\n        })\n      });\n\n    case ActionType.UPSERT_TOAST:\n      var toast = action.toast;\n      return state.toasts.find(function (t) {\n        return t.id === toast.id;\n      }) ? reducer(state, {\n        type: ActionType.UPDATE_TOAST,\n        toast: toast\n      }) : reducer(state, {\n        type: ActionType.ADD_TOAST,\n        toast: toast\n      });\n\n    case ActionType.DISMISS_TOAST:\n      var toastId = action.toastId; // ! Side effects ! - This could be execrated into a dismissToast() action, but I'll keep it here for simplicity\n\n      if (toastId) {\n        addToRemoveQueue(toastId);\n      } else {\n        state.toasts.forEach(function (toast) {\n          addToRemoveQueue(toast.id);\n        });\n      }\n\n      return _extends({}, state, {\n        toasts: state.toasts.map(function (t) {\n          return t.id === toastId || toastId === undefined ? _extends({}, t, {\n            visible: false\n          }) : t;\n        })\n      });\n\n    case ActionType.REMOVE_TOAST:\n      if (action.toastId === undefined) {\n        return _extends({}, state, {\n          toasts: []\n        });\n      }\n\n      return _extends({}, state, {\n        toasts: state.toasts.filter(function (t) {\n          return t.id !== action.toastId;\n        })\n      });\n\n    case ActionType.START_PAUSE:\n      return _extends({}, state, {\n        pausedAt: action.time\n      });\n\n    case ActionType.END_PAUSE:\n      var diff = action.time - (state.pausedAt || 0);\n      return _extends({}, state, {\n        pausedAt: undefined,\n        toasts: state.toasts.map(function (t) {\n          return _extends({}, t, {\n            pauseDuration: t.pauseDuration + diff\n          });\n        })\n      });\n  }\n};\nvar listeners = [];\nvar memoryState = {\n  toasts: [],\n  pausedAt: undefined\n};\nvar dispatch = function dispatch(action) {\n  memoryState = reducer(memoryState, action);\n  listeners.forEach(function (listener) {\n    listener(memoryState);\n  });\n};\nvar defaultTimeouts = {\n  blank: 4000,\n  error: 4000,\n  success: 2000,\n  loading: Infinity,\n  custom: 4000\n};\nvar useStore = function useStore(toastOptions) {\n  if (toastOptions === void 0) {\n    toastOptions = {};\n  }\n\n  var _useState = useState(memoryState),\n      state = _useState[0],\n      setState = _useState[1];\n\n  useEffect(function () {\n    listeners.push(setState);\n    return function () {\n      var index = listeners.indexOf(setState);\n\n      if (index > -1) {\n        listeners.splice(index, 1);\n      }\n    };\n  }, [state]);\n  var mergedToasts = state.toasts.map(function (t) {\n    var _toastOptions$t$type, _toastOptions, _toastOptions$t$type2;\n\n    return _extends({}, toastOptions, toastOptions[t.type], t, {\n      duration: t.duration || ((_toastOptions$t$type = toastOptions[t.type]) == null ? void 0 : _toastOptions$t$type.duration) || ((_toastOptions = toastOptions) == null ? void 0 : _toastOptions.duration) || defaultTimeouts[t.type],\n      style: _extends({}, toastOptions.style, (_toastOptions$t$type2 = toastOptions[t.type]) == null ? void 0 : _toastOptions$t$type2.style, t.style)\n    });\n  });\n  return _extends({}, state, {\n    toasts: mergedToasts\n  });\n};\n\nvar createToast = function createToast(message, type, opts) {\n  if (type === void 0) {\n    type = 'blank';\n  }\n\n  return _extends({\n    createdAt: Date.now(),\n    visible: true,\n    type: type,\n    ariaProps: {\n      role: 'status',\n      'aria-live': 'polite'\n    },\n    message: message,\n    pauseDuration: 0\n  }, opts, {\n    id: (opts == null ? void 0 : opts.id) || genId()\n  });\n};\n\nvar createHandler = function createHandler(type) {\n  return function (message, options) {\n    var toast = createToast(message, type, options);\n    dispatch({\n      type: ActionType.UPSERT_TOAST,\n      toast: toast\n    });\n    return toast.id;\n  };\n};\n\nvar toast = function toast(message, opts) {\n  return createHandler('blank')(message, opts);\n};\n\ntoast.error = /*#__PURE__*/createHandler('error');\ntoast.success = /*#__PURE__*/createHandler('success');\ntoast.loading = /*#__PURE__*/createHandler('loading');\ntoast.custom = /*#__PURE__*/createHandler('custom');\n\ntoast.dismiss = function (toastId) {\n  dispatch({\n    type: ActionType.DISMISS_TOAST,\n    toastId: toastId\n  });\n};\n\ntoast.remove = function (toastId) {\n  return dispatch({\n    type: ActionType.REMOVE_TOAST,\n    toastId: toastId\n  });\n};\n\ntoast.promise = function (promise, msgs, opts) {\n  var id = toast.loading(msgs.loading, _extends({}, opts, opts == null ? void 0 : opts.loading));\n  promise.then(function (p) {\n    toast.success(resolveValue(msgs.success, p), _extends({\n      id: id\n    }, opts, opts == null ? void 0 : opts.success));\n    return p;\n  })[\"catch\"](function (e) {\n    toast.error(resolveValue(msgs.error, e), _extends({\n      id: id\n    }, opts, opts == null ? void 0 : opts.error));\n  });\n  return promise;\n};\n\nvar useToaster = function useToaster(toastOptions) {\n  var _useStore = useStore(toastOptions),\n      toasts = _useStore.toasts,\n      pausedAt = _useStore.pausedAt;\n\n  useEffect(function () {\n    if (pausedAt) {\n      return;\n    }\n\n    var now = Date.now();\n    var timeouts = toasts.map(function (t) {\n      if (t.duration === Infinity) {\n        return;\n      }\n\n      var durationLeft = (t.duration || 0) + t.pauseDuration - (now - t.createdAt);\n\n      if (durationLeft < 0) {\n        if (t.visible) {\n          toast.dismiss(t.id);\n        }\n\n        return;\n      }\n\n      return setTimeout(function () {\n        return toast.dismiss(t.id);\n      }, durationLeft);\n    });\n    return function () {\n      timeouts.forEach(function (timeout) {\n        return timeout && clearTimeout(timeout);\n      });\n    };\n  }, [toasts, pausedAt]);\n  var handlers = useMemo(function () {\n    return {\n      startPause: function startPause() {\n        dispatch({\n          type: ActionType.START_PAUSE,\n          time: Date.now()\n        });\n      },\n      endPause: function endPause() {\n        if (pausedAt) {\n          dispatch({\n            type: ActionType.END_PAUSE,\n            time: Date.now()\n          });\n        }\n      },\n      updateHeight: function updateHeight(toastId, height) {\n        return dispatch({\n          type: ActionType.UPDATE_TOAST,\n          toast: {\n            id: toastId,\n            height: height\n          }\n        });\n      },\n      calculateOffset: function calculateOffset(toast, opts) {\n        var _relevantToasts$filte;\n\n        var _ref = opts || {},\n            _ref$reverseOrder = _ref.reverseOrder,\n            reverseOrder = _ref$reverseOrder === void 0 ? false : _ref$reverseOrder,\n            _ref$gutter = _ref.gutter,\n            gutter = _ref$gutter === void 0 ? 8 : _ref$gutter,\n            defaultPosition = _ref.defaultPosition;\n\n        var relevantToasts = toasts.filter(function (t) {\n          return (t.position || defaultPosition) === (toast.position || defaultPosition) && t.height;\n        });\n        var toastIndex = relevantToasts.findIndex(function (t) {\n          return t.id === toast.id;\n        });\n        var toastsBefore = relevantToasts.filter(function (toast, i) {\n          return i < toastIndex && toast.visible;\n        }).length;\n\n        var offset = (_relevantToasts$filte = relevantToasts.filter(function (t) {\n          return t.visible;\n        })).slice.apply(_relevantToasts$filte, reverseOrder ? [toastsBefore + 1] : [0, toastsBefore]).reduce(function (acc, t) {\n          return acc + (t.height || 0) + gutter;\n        }, 0);\n\n        return offset;\n      }\n    };\n  }, [toasts, pausedAt]);\n  return {\n    toasts: toasts,\n    handlers: handlers\n  };\n};\n\nfunction _templateObject4() {\n  var data = _taggedTemplateLiteralLoose([\"\\n  width: 20px;\\n  opacity: 0;\\n  height: 20px;\\n  border-radius: 10px;\\n  background: \", \";\\n  position: relative;\\n  transform: rotate(45deg);\\n\\n  animation: \", \" 0.3s cubic-bezier(0.175, 0.885, 0.32, 1.275)\\n    forwards;\\n  animation-delay: 100ms;\\n\\n  &:after,\\n  &:before {\\n    content: '';\\n    animation: \", \" 0.15s ease-out forwards;\\n    animation-delay: 150ms;\\n    position: absolute;\\n    border-radius: 3px;\\n    opacity: 0;\\n    background: \", \";\\n    bottom: 9px;\\n    left: 4px;\\n    height: 2px;\\n    width: 12px;\\n  }\\n\\n  &:before {\\n    animation: \", \" 0.15s ease-out forwards;\\n    animation-delay: 180ms;\\n    transform: rotate(90deg);\\n  }\\n\"]);\n\n  _templateObject4 = function _templateObject4() {\n    return data;\n  };\n\n  return data;\n}\n\nfunction _templateObject3() {\n  var data = _taggedTemplateLiteralLoose([\"\\nfrom {\\n  transform: scale(0) rotate(90deg);\\n\\topacity: 0;\\n}\\nto {\\n  transform: scale(1) rotate(90deg);\\n\\topacity: 1;\\n}\"]);\n\n  _templateObject3 = function _templateObject3() {\n    return data;\n  };\n\n  return data;\n}\n\nfunction _templateObject2() {\n  var data = _taggedTemplateLiteralLoose([\"\\nfrom {\\n  transform: scale(0);\\n  opacity: 0;\\n}\\nto {\\n  transform: scale(1);\\n  opacity: 1;\\n}\"]);\n\n  _templateObject2 = function _templateObject2() {\n    return data;\n  };\n\n  return data;\n}\n\nfunction _templateObject() {\n  var data = _taggedTemplateLiteralLoose([\"\\nfrom {\\n  transform: scale(0) rotate(45deg);\\n\\topacity: 0;\\n}\\nto {\\n transform: scale(1) rotate(45deg);\\n  opacity: 1;\\n}\"]);\n\n  _templateObject = function _templateObject() {\n    return data;\n  };\n\n  return data;\n}\nvar circleAnimation = /*#__PURE__*/keyframes( /*#__PURE__*/_templateObject());\nvar firstLineAnimation = /*#__PURE__*/keyframes( /*#__PURE__*/_templateObject2());\nvar secondLineAnimation = /*#__PURE__*/keyframes( /*#__PURE__*/_templateObject3());\nvar ErrorIcon = /*#__PURE__*/styled('div')( /*#__PURE__*/_templateObject4(), function (p) {\n  return p.primary || '#ff4b4b';\n}, circleAnimation, firstLineAnimation, function (p) {\n  return p.secondary || '#fff';\n}, secondLineAnimation);\n\nfunction _templateObject2$1() {\n  var data = _taggedTemplateLiteralLoose([\"\\n  width: 12px;\\n  height: 12px;\\n  box-sizing: border-box;\\n  border: 2px solid;\\n  border-radius: 100%;\\n  border-color: \", \";\\n  border-right-color: \", \";\\n  animation: \", \" 1s linear infinite;\\n\"]);\n\n  _templateObject2$1 = function _templateObject2() {\n    return data;\n  };\n\n  return data;\n}\n\nfunction _templateObject$1() {\n  var data = _taggedTemplateLiteralLoose([\"\\n  from {\\n    transform: rotate(0deg);\\n  }\\n  to {\\n    transform: rotate(360deg);\\n  }\\n\"]);\n\n  _templateObject$1 = function _templateObject() {\n    return data;\n  };\n\n  return data;\n}\nvar rotate = /*#__PURE__*/keyframes( /*#__PURE__*/_templateObject$1());\nvar LoaderIcon = /*#__PURE__*/styled('div')( /*#__PURE__*/_templateObject2$1(), function (p) {\n  return p.secondary || '#e0e0e0';\n}, function (p) {\n  return p.primary || '#616161';\n}, rotate);\n\nfunction _templateObject3$1() {\n  var data = _taggedTemplateLiteralLoose([\"\\n  width: 20px;\\n  opacity: 0;\\n  height: 20px;\\n  border-radius: 10px;\\n  background: \", \";\\n  position: relative;\\n  transform: rotate(45deg);\\n\\n  animation: \", \" 0.3s cubic-bezier(0.175, 0.885, 0.32, 1.275)\\n    forwards;\\n  animation-delay: 100ms;\\n  &:after {\\n    content: '';\\n    box-sizing: border-box;\\n    animation: \", \" 0.2s ease-out forwards;\\n    opacity: 0;\\n    animation-delay: 200ms;\\n    position: absolute;\\n    border-right: 2px solid;\\n    border-bottom: 2px solid;\\n    border-color: \", \";\\n    bottom: 6px;\\n    left: 6px;\\n    height: 10px;\\n    width: 6px;\\n  }\\n\"]);\n\n  _templateObject3$1 = function _templateObject3() {\n    return data;\n  };\n\n  return data;\n}\n\nfunction _templateObject2$2() {\n  var data = _taggedTemplateLiteralLoose([\"\\n0% {\\n\\theight: 0;\\n\\twidth: 0;\\n\\topacity: 0;\\n}\\n40% {\\n  height: 0;\\n\\twidth: 6px;\\n\\topacity: 1;\\n}\\n100% {\\n  opacity: 1;\\n  height: 10px;\\n}\"]);\n\n  _templateObject2$2 = function _templateObject2() {\n    return data;\n  };\n\n  return data;\n}\n\nfunction _templateObject$2() {\n  var data = _taggedTemplateLiteralLoose([\"\\nfrom {\\n  transform: scale(0) rotate(45deg);\\n\\topacity: 0;\\n}\\nto {\\n  transform: scale(1) rotate(45deg);\\n\\topacity: 1;\\n}\"]);\n\n  _templateObject$2 = function _templateObject() {\n    return data;\n  };\n\n  return data;\n}\nvar circleAnimation$1 = /*#__PURE__*/keyframes( /*#__PURE__*/_templateObject$2());\nvar checkmarkAnimation = /*#__PURE__*/keyframes( /*#__PURE__*/_templateObject2$2());\nvar CheckmarkIcon = /*#__PURE__*/styled('div')( /*#__PURE__*/_templateObject3$1(), function (p) {\n  return p.primary || '#61d345';\n}, circleAnimation$1, checkmarkAnimation, function (p) {\n  return p.secondary || '#fff';\n});\n\nfunction _templateObject4$1() {\n  var data = _taggedTemplateLiteralLoose([\"\\n  position: relative;\\n  transform: scale(0.6);\\n  opacity: 0.4;\\n  min-width: 20px;\\n  animation: \", \" 0.3s 0.12s cubic-bezier(0.175, 0.885, 0.32, 1.275)\\n    forwards;\\n\"]);\n\n  _templateObject4$1 = function _templateObject4() {\n    return data;\n  };\n\n  return data;\n}\n\nfunction _templateObject3$2() {\n  var data = _taggedTemplateLiteralLoose([\"\\nfrom {\\n  transform: scale(0.6);\\n  opacity: 0.4;\\n}\\nto {\\n  transform: scale(1);\\n  opacity: 1;\\n}\"]);\n\n  _templateObject3$2 = function _templateObject3() {\n    return data;\n  };\n\n  return data;\n}\n\nfunction _templateObject2$3() {\n  var data = _taggedTemplateLiteralLoose([\"\\n  position: relative;\\n  display: flex;\\n  justify-content: center;\\n  align-items: center;\\n  min-width: 20px;\\n  min-height: 20px;\\n\"]);\n\n  _templateObject2$3 = function _templateObject2() {\n    return data;\n  };\n\n  return data;\n}\n\nfunction _templateObject$3() {\n  var data = _taggedTemplateLiteralLoose([\"\\n  position: absolute;\\n\"]);\n\n  _templateObject$3 = function _templateObject() {\n    return data;\n  };\n\n  return data;\n}\nvar StatusWrapper = /*#__PURE__*/styled('div')( /*#__PURE__*/_templateObject$3());\nvar IndicatorWrapper = /*#__PURE__*/styled('div')( /*#__PURE__*/_templateObject2$3());\nvar enter = /*#__PURE__*/keyframes( /*#__PURE__*/_templateObject3$2());\nvar AnimatedIconWrapper = /*#__PURE__*/styled('div')( /*#__PURE__*/_templateObject4$1(), enter);\nvar ToastIcon = function ToastIcon(_ref) {\n  var toast = _ref.toast;\n  var icon = toast.icon,\n      type = toast.type,\n      iconTheme = toast.iconTheme;\n\n  if (icon !== undefined) {\n    if (typeof icon === 'string') {\n      return createElement(AnimatedIconWrapper, null, icon);\n    } else {\n      return icon;\n    }\n  }\n\n  if (type === 'blank') {\n    return null;\n  }\n\n  return createElement(IndicatorWrapper, null, createElement(LoaderIcon, Object.assign({}, iconTheme)), type !== 'loading' && createElement(StatusWrapper, null, type === 'error' ? createElement(ErrorIcon, Object.assign({}, iconTheme)) : createElement(CheckmarkIcon, Object.assign({}, iconTheme))));\n};\n\nfunction _templateObject2$4() {\n  var data = _taggedTemplateLiteralLoose([\"\\n  display: flex;\\n  justify-content: center;\\n  margin: 4px 10px;\\n  color: inherit;\\n  flex: 1 1 auto;\\n  white-space: pre-line;\\n\"]);\n\n  _templateObject2$4 = function _templateObject2() {\n    return data;\n  };\n\n  return data;\n}\n\nfunction _templateObject$4() {\n  var data = _taggedTemplateLiteralLoose([\"\\n  display: flex;\\n  align-items: center;\\n  background: #fff;\\n  color: #363636;\\n  line-height: 1.3;\\n  will-change: transform;\\n  box-shadow: 0 3px 10px rgba(0, 0, 0, 0.1), 0 3px 3px rgba(0, 0, 0, 0.05);\\n  max-width: 350px;\\n  pointer-events: auto;\\n  padding: 8px 10px;\\n  border-radius: 8px;\\n\"]);\n\n  _templateObject$4 = function _templateObject() {\n    return data;\n  };\n\n  return data;\n}\n\nvar enterAnimation = function enterAnimation(factor) {\n  return \"\\n0% {transform: translate3d(0,\" + factor * -200 + \"%,0) scale(.6); opacity:.5;}\\n100% {transform: translate3d(0,0,0) scale(1); opacity:1;}\\n\";\n};\n\nvar exitAnimation = function exitAnimation(factor) {\n  return \"\\n0% {transform: translate3d(0,0,-1px) scale(1); opacity:1;}\\n100% {transform: translate3d(0,\" + factor * -150 + \"%,-1px) scale(.6); opacity:0;}\\n\";\n};\n\nvar fadeInAnimation = \"0%{opacity:0;} 100%{opacity:1;}\";\nvar fadeOutAnimation = \"0%{opacity:1;} 100%{opacity:0;}\";\nvar ToastBarBase = /*#__PURE__*/styled('div', forwardRef)( /*#__PURE__*/_templateObject$4());\nvar Message = /*#__PURE__*/styled('div')( /*#__PURE__*/_templateObject2$4());\n\nvar getAnimationStyle = function getAnimationStyle(position, visible) {\n  var top = position.includes('top');\n  var factor = top ? 1 : -1;\n\n  var _ref = prefersReducedMotion() ? [fadeInAnimation, fadeOutAnimation] : [enterAnimation(factor), exitAnimation(factor)],\n      enter = _ref[0],\n      exit = _ref[1];\n\n  return {\n    animation: visible ? keyframes(enter) + \" 0.35s cubic-bezier(.21,1.02,.73,1) forwards\" : keyframes(exit) + \" 0.4s forwards cubic-bezier(.06,.71,.55,1)\"\n  };\n};\n\nvar ToastBar = /*#__PURE__*/memo(function (_ref2) {\n  var toast = _ref2.toast,\n      position = _ref2.position,\n      style = _ref2.style,\n      children = _ref2.children;\n  var animationStyle = toast != null && toast.height ? getAnimationStyle(toast.position || position || 'top-center', toast.visible) : {\n    opacity: 0\n  };\n  var icon = createElement(ToastIcon, {\n    toast: toast\n  });\n  var message = createElement(Message, Object.assign({}, toast.ariaProps), resolveValue(toast.message, toast));\n  return createElement(ToastBarBase, {\n    className: toast.className,\n    style: _extends({}, animationStyle, style, toast.style)\n  }, typeof children === 'function' ? children({\n    icon: icon,\n    message: message\n  }) : createElement(Fragment, null, icon, message));\n});\n\nfunction _templateObject$5() {\n  var data = _taggedTemplateLiteralLoose([\"\\n  z-index: 9999;\\n  > * {\\n    pointer-events: auto;\\n  }\\n\"]);\n\n  _templateObject$5 = function _templateObject() {\n    return data;\n  };\n\n  return data;\n}\nsetup(createElement);\n\nvar getPositionStyle = function getPositionStyle(position, offset) {\n  var top = position.includes('top');\n  var verticalStyle = top ? {\n    top: 0\n  } : {\n    bottom: 0\n  };\n  var horizontalStyle = position.includes('center') ? {\n    justifyContent: 'center'\n  } : position.includes('right') ? {\n    justifyContent: 'flex-end'\n  } : {};\n  return _extends({\n    left: 0,\n    right: 0,\n    display: 'flex',\n    position: 'absolute',\n    transition: prefersReducedMotion() ? undefined : \"all 230ms cubic-bezier(.21,1.02,.73,1)\",\n    transform: \"translateY(\" + offset * (top ? 1 : -1) + \"px)\"\n  }, verticalStyle, horizontalStyle);\n};\n\nvar activeClass = /*#__PURE__*/css( /*#__PURE__*/_templateObject$5());\nvar DEFAULT_OFFSET = 16;\nvar Toaster = function Toaster(_ref) {\n  var reverseOrder = _ref.reverseOrder,\n      _ref$position = _ref.position,\n      position = _ref$position === void 0 ? 'top-center' : _ref$position,\n      toastOptions = _ref.toastOptions,\n      gutter = _ref.gutter,\n      children = _ref.children,\n      containerStyle = _ref.containerStyle,\n      containerClassName = _ref.containerClassName;\n\n  var _useToaster = useToaster(toastOptions),\n      toasts = _useToaster.toasts,\n      handlers = _useToaster.handlers;\n\n  return createElement(\"div\", {\n    style: _extends({\n      position: 'fixed',\n      zIndex: 9999,\n      top: DEFAULT_OFFSET,\n      left: DEFAULT_OFFSET,\n      right: DEFAULT_OFFSET,\n      bottom: DEFAULT_OFFSET,\n      pointerEvents: 'none'\n    }, containerStyle),\n    className: containerClassName,\n    onMouseEnter: handlers.startPause,\n    onMouseLeave: handlers.endPause\n  }, toasts.map(function (t) {\n    var toastPosition = t.position || position;\n    var offset = handlers.calculateOffset(t, {\n      reverseOrder: reverseOrder,\n      gutter: gutter,\n      defaultPosition: position\n    });\n    var positionStyle = getPositionStyle(toastPosition, offset);\n    var ref = t.height ? undefined : createRectRef(function (rect) {\n      handlers.updateHeight(t.id, rect.height);\n    });\n    return createElement(\"div\", {\n      ref: ref,\n      className: t.visible ? activeClass : '',\n      key: t.id,\n      style: positionStyle\n    }, t.type === 'custom' ? resolveValue(t.message, t) : children ? children(t) : createElement(ToastBar, {\n      toast: t,\n      position: toastPosition\n    }));\n  }));\n};\n\nexport default toast;\nexport { CheckmarkIcon, ErrorIcon, LoaderIcon, ToastBar, ToastIcon, Toaster, resolveValue, toast, useToaster, useStore as useToasterStore };\n//# sourceMappingURL=react-hot-toast.esm.js.map\n","import {toast} from 'react-hot-toast';\nimport {MessageDescriptor} from 'react-intl';\n\ninterface Options {\n  type?: 'error' | null;\n}\nexport function showToast(\n  message: MessageDescriptor | string,\n  {type}: Options = {}\n) {\n  if (type === 'error') {\n    return toast.error(message as any);\n  }\n  return toast(message as any);\n}\n","import {\n  ErrorMessageDescriptor,\n  UploadValidation,\n} from './validations/upload-validation';\nimport {UploadedFile} from '../uploaded-file';\nimport {showToast} from '../../ui/toast/show-toast';\n\nexport abstract class UploadValidator {\n  protected validations: UploadValidation[] = [];\n  showToast = false;\n\n  validate(file: UploadedFile): {\n    failed: boolean;\n    errorMessage?: ErrorMessageDescriptor | null;\n  } {\n    if (!this.validations.length) {\n      this.initValidations();\n    }\n\n    const failed = this.validations.find(validation => {\n      return validation.fails(file);\n    });\n    if (failed && this.showToast && failed.errorMessage) {\n      showToast(failed.errorMessage, {type: 'error'});\n    }\n\n    return {\n      failed: !!failed,\n      errorMessage: failed ? failed.errorMessage : null,\n    };\n  }\n\n  /**\n   * Can't init validators in constructor, because ngxs\n   * store injects do not wait for angular APP_INITIALIZER\n   */\n  protected abstract initValidations(): void;\n}\n","import {MessageDescriptor} from 'react-intl';\nimport {UploadedFile} from '../../uploaded-file';\n\nexport interface ErrorMessageDescriptor extends MessageDescriptor {\n  values?: Record<string, string | null>;\n}\n\nexport abstract class UploadValidation {\n  errorMessage?: ErrorMessageDescriptor;\n  abstract fails(file: UploadedFile): boolean;\n\n  passes(file: UploadedFile) {\n    return !this.fails(file);\n  }\n}\n","// 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\nexport function prettyBytes(num: number) {\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(\n    Math.floor(Math.log(num) / Math.log(1024)),\n    units.length - 1\n  );\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","import {defineMessage} from 'react-intl';\nimport {UploadedFile} from '../../uploaded-file';\nimport {ErrorMessageDescriptor, UploadValidation} from './upload-validation';\nimport {prettyBytes} from '../../utils/pretty-bytes';\n\nexport class FileSizeValidation extends UploadValidation {\n  constructor(protected params: {maxSize: number}) {\n    super();\n\n    this.errorMessage = defineMessage<ErrorMessageDescriptor>({\n      defaultMessage: 'Maximum file size is {number}',\n      values: {\n        number: prettyBytes(+this.params.maxSize),\n      },\n    });\n  }\n\n  public fails(file: UploadedFile) {\n    return this.params.maxSize < file.size;\n  }\n}\n","import {defineMessage} from 'react-intl';\nimport {UploadedFile} from '../../uploaded-file';\nimport {ErrorMessageDescriptor, UploadValidation} from './upload-validation';\n\nexport class AllowedExtensionsValidation extends UploadValidation {\n  constructor(protected params: {extensions: string[]}) {\n    super();\n\n    this.errorMessage = defineMessage<ErrorMessageDescriptor>({\n      defaultMessage: 'Only these file types are allowed: {extensions}',\n      values: {\n        extensions: this.params.extensions.join(', '),\n      },\n    });\n  }\n\n  public fails(file: UploadedFile) {\n    return !this.params.extensions.some(extension => {\n      return extension.toLowerCase() === file.extension?.toLowerCase();\n    });\n  }\n}\n","type UNITS = 'KB' | 'MB' | 'GB' | 'TB' | 'PB';\n\nexport function convertToBytes(value: number, unit: UNITS): number {\n  if (value == null) return 0;\n  switch (unit) {\n    case 'KB':\n      return value * 1024;\n    case 'MB':\n      return value * 1024 ** 2;\n    case 'GB':\n      return value * 1024 ** 3;\n    case 'TB':\n      return value * 1024 ** 4;\n    case 'PB':\n      return value * 1024 ** 5;\n    default:\n      return value;\n  }\n}\n","import {UploadValidator} from '../../common/uploads/validation/upload-validator';\nimport {FileSizeValidation} from '../../common/uploads/validation/validations/file-size-validation';\nimport {AllowedExtensionsValidation} from '../../common/uploads/validation/validations/allowed-extensions-validation';\nimport {convertToBytes} from '../../common/uploads/utils/convert-to-bytes';\nimport {state} from '../../state/utils';\n\nexport class ImportToolValidator extends UploadValidator {\n  protected readonly DEFAULT_MAX_FILE_SIZE_MB = 10;\n  showToast = true;\n\n  protected initValidations() {\n    this.validations.push(\n      new FileSizeValidation({maxSize: this.getMaxFileSize()})\n    );\n\n    const allowedExtensions = this.getAllowedExtensions();\n\n    if (allowedExtensions && allowedExtensions.length) {\n      this.validations.push(\n        new AllowedExtensionsValidation({extensions: allowedExtensions})\n      );\n    }\n  }\n\n  protected getMaxFileSize(): number {\n    return (\n      state().config.tools?.import?.maxFileSize ??\n      convertToBytes(this.DEFAULT_MAX_FILE_SIZE_MB, 'MB')\n    );\n  }\n\n  protected getAllowedExtensions(): string[] {\n    const imgExtensions =\n      state().config.tools?.import?.validImgExtensions ?? [];\n    return [...imgExtensions, 'json'];\n  }\n}\n","import {Image} from 'fabric/fabric-impl';\nimport {loadFabricImage} from './load-fabric-image';\nimport {ObjectName} from '../../objects/object-name';\nimport {state, tools} from '../../state/utils';\n\nexport async function addImage(\n  url: string,\n  fitToScreen = true\n): Promise<Image | undefined> {\n  const img = await loadFabricImage(url);\n  if (!img) return;\n  return new Promise(resolve => {\n    img.name = ObjectName.Image;\n    img.opacity = 0;\n\n    // use either main image or canvas dimensions as outer boundaries for scaling new image\n    const maxWidth = state().original.width;\n    const maxHeight = state().original.height;\n\n    // if image is wider or higher than the current canvas, we'll scale it down\n    if (fitToScreen && (img.width! >= maxWidth || img.height! >= maxHeight)) {\n      // calc new image dimensions (main image height - 10% and width - 10%)\n      const newWidth = maxWidth - 0.1 * maxWidth;\n      const newHeight = maxHeight - 0.1 * maxHeight;\n      const scale =\n        1 /\n        Math.min(\n          newHeight / img.getScaledHeight(),\n          newWidth / img.getScaledWidth()\n        );\n\n      // scale newly uploaded image to the above dimensions\n      img.scaleX! *= 1 / scale;\n      img.scaleY! *= 1 / scale;\n    }\n\n    // center and render newly uploaded image on the canvas\n    state().fabric.add(img);\n    state().fabric.setActiveObject(img);\n    img.viewportCenter();\n    img.setCoords();\n    state().fabric.requestRenderAll();\n    tools().zoom.fitToScreen();\n\n    img.animate('opacity', '1', {\n      duration: 425,\n      onChange: () => {\n        state().fabric.requestRenderAll();\n      },\n      onComplete: () => {\n        resolve(img);\n      },\n    });\n  });\n}\n","import {state, tools} from '../state/utils';\nimport {PixieConfig} from '../config/default-config';\n\nexport function resetEditor(config?: PixieConfig): Promise<void> {\n  // reset UI\n  tools().canvas.clear();\n  tools().frame.remove();\n\n  // remove previous image and canvas size\n  state().setConfig({image: undefined, blankCanvasSize: undefined, ...config});\n\n  state().reset();\n\n  return new Promise<void>(resolve => setTimeout(resolve));\n}\n","export interface UploadInputConfig {\n  types?: (UploadInputType | string)[];\n  extensions?: string[];\n  multiple?: boolean;\n  directory?: boolean;\n}\n\nexport enum UploadInputType {\n  image = 'image/*',\n  audio = 'audio/*',\n  json = 'application/json',\n  video = 'video/mp4,video/mpeg,video/x-m4v,video/*',\n}\n","import {Image} from 'fabric/fabric-impl';\nimport {openUploadWindow} from '../../common/uploads/utils/open-upload-window';\nimport {UploadedFile} from '../../common/uploads/uploaded-file';\nimport {ObjectName} from '../../objects/object-name';\nimport {SerializedPixieState} from '../history/serialized-pixie-state';\nimport {ImportToolValidator} from './import-tool-validator';\nimport {addImage} from '../canvas/add-image';\nimport {state, tools} from '../../state/utils';\nimport {resetEditor} from '../../utils/reset-editor';\nimport {UploadAccentProps} from '../../common/uploads/utils/create-upload-input';\nimport {UploadInputType} from '../../common/uploads/upload-input-config';\nimport {fetchStateJsonFromUrl} from './fetch-state-json-from-url';\n\nexport class ImportTool {\n  private validator = new ImportToolValidator();\n\n  /**\n   * Open file upload window and add selected image to canvas.\n   */\n  async uploadAndAddImage(): Promise<void> {\n    const file = await this.openUploadWindow();\n    await this.openUploadedFile(file);\n  }\n\n  /**\n   * Open file upload window and replace canvas contents with selected image.\n   */\n  async uploadAndReplaceMainImage(): Promise<void> {\n    const file = await this.openUploadWindow();\n    if (file) {\n      await this.openBackgroundImage(file);\n    }\n  }\n\n  /**\n   * Open file upload window and replace canvas contents with selected state file.\n   */\n  async uploadAndOpenStateFile(): Promise<void> {\n    const file = await this.openUploadWindow(stateContentType);\n    if (file) {\n      await this.loadState(await file.data);\n    }\n  }\n\n  /**\n   * @hidden\n   */\n  async openUploadedFile(file?: UploadedFile | null) {\n    if (!file) return;\n    const fileData = await file.data;\n    switch (file.extension) {\n      case 'json':\n        await this.loadState(fileData);\n        break;\n      case 'svg':\n        await tools().shape.addSvgSticker(fileData, ObjectName.Image);\n        tools().history.addHistoryItem({name: 'overlayImage'});\n        break;\n      default:\n        await addImage(\n          fileData,\n          state().config.tools?.import?.fitOverlayToScreen ?? true\n        );\n        tools().history.addHistoryItem({name: 'overlayImage'});\n    }\n  }\n\n  /**\n   * Replace current editor state with specified one.\n   */\n  async loadState(data: string | SerializedPixieState): Promise<void> {\n    state().toggleLoading('state');\n    await resetEditor();\n\n    let stateObj: SerializedPixieState;\n\n    if (typeof data === 'string') {\n      if (data.endsWith('.json')) {\n        stateObj = await fetchStateJsonFromUrl(data);\n      } else {\n        stateObj = JSON.parse(data);\n      }\n    } else {\n      stateObj = data;\n    }\n\n    await tools().history.addInitial(stateObj);\n    await tools().history.reload();\n    state().toggleLoading(false);\n  }\n\n  /**\n   * @hidden\n   */\n  async openUploadWindow(\n    contentTypes?: UploadAccentProps\n  ): Promise<UploadedFile | null> {\n    contentTypes = contentTypes || imgContentTypes();\n    const file = (await openUploadWindow(contentTypes))[0];\n    if (this.fileIsValid(file)) {\n      state().config.onFileOpen?.(file);\n      return file;\n    }\n    return null;\n  }\n\n  /**\n   * Open specified data or image as background image.\n   */\n  async openBackgroundImage(\n    image: UploadedFile | HTMLImageElement | string\n  ): Promise<Image | undefined> {\n    await resetEditor();\n    let src: string;\n    if (image instanceof HTMLImageElement) {\n      src = image.src;\n    } else if (image instanceof UploadedFile) {\n      src = await image.data;\n    } else {\n      src = image;\n    }\n    const response = await tools().canvas.addMainImage(src);\n    await tools().history.addInitial();\n    return response;\n  }\n\n  private fileIsValid(file: UploadedFile): boolean {\n    return !this.validator.validate(file).failed;\n  }\n}\n\nexport function imgContentTypes(): UploadAccentProps {\n  const validExtensions = state().config.tools?.import?.validImgExtensions;\n  if (validExtensions) {\n    return {extensions: validExtensions};\n  }\n  return {types: [UploadInputType.image]};\n}\n\nexport const stateContentType: UploadAccentProps = {\n  types: ['.json', UploadInputType.json],\n};\n","import {Group} from 'fabric/fabric-impl';\nimport {fabric} from 'fabric';\nimport {staticObjectConfig} from '../../objects/static-object-config';\nimport {fabricCanvas, state, tools} from '../../state/utils';\n\nexport class WatermarkTool {\n  private watermark: Group | null = null;\n\n  private lineStyle = {\n    stroke: 'rgba(255,255,255,0.3)',\n    strokeWidth: 5,\n    strokeLineCap: 'round',\n    strokeLineJoin: 'round',\n  };\n\n  /**\n   * Add a watermark to canvas.\n   */\n  add(watermarkText: string) {\n    this.createGroup();\n    this.addText(watermarkText);\n    this.addLines();\n\n    fabricCanvas().add(this.watermark!);\n    tools().canvas.render();\n  }\n\n  /**\n   * Remove watermark from canvas.\n   */\n  remove() {\n    if (!this.watermark) return;\n    fabricCanvas().remove(this.watermark);\n    this.watermark = null;\n    tools().canvas.render();\n  }\n\n  private createGroup() {\n    this.watermark = new fabric.Group(undefined, {\n      ...staticObjectConfig,\n      width: state().original.width,\n      height: state().original.height,\n      excludeFromExport: true,\n      top: 0,\n      left: 0,\n      originX: 'left',\n      originY: 'top',\n    });\n  }\n\n  private addText(watermarkText: string) {\n    const text = new fabric.Text(watermarkText, {\n      fill: 'rgba(255,255,255,0.3)',\n      strokeWidth: 2,\n      stroke: 'rgba(255,255,255,0.4)',\n      originX: 'center',\n      originY: 'center',\n      fontWeight: 600,\n      fontSize: 150,\n      fontFamily: 'Courier New',\n    });\n\n    text.scaleToWidth(state().original.width / 2);\n    this.watermark?.add(text);\n  }\n\n  private addLines() {\n    if (!this.watermark) return;\n    const text = this.watermark?.getObjects('text')[0];\n\n    // original canvas size\n    const halfWidth = state().original.width / 2;\n    const halfHeight = state().original.height / 2;\n\n    // offset from text for watermark lines\n    const offsetY = 100;\n    const offsetX = text.width! / 4;\n\n    const line1 = new fabric.Line(undefined, this.lineStyle);\n    const line2 = new fabric.Line(undefined, this.lineStyle);\n    const line3 = new fabric.Line(undefined, this.lineStyle);\n    const line4 = new fabric.Line(undefined, this.lineStyle);\n\n    this.watermark.add(line1, line2, line3, line4);\n\n    line1.set({\n      x1: offsetX,\n      y1: -offsetY,\n      x2: halfWidth,\n      y2: -halfHeight,\n    });\n\n    line2.set({\n      x1: offsetX,\n      y1: offsetY,\n      x2: halfWidth,\n      y2: halfHeight,\n    });\n\n    line3.set({\n      x1: -offsetX,\n      y1: -offsetY,\n      x2: -halfWidth,\n      y2: -halfHeight,\n    });\n\n    line4.set({\n      x1: -offsetX,\n      y1: offsetY,\n      x2: -halfWidth,\n      y2: halfHeight,\n    });\n  }\n}\n","(function(a,b){if(\"function\"==typeof define&&define.amd)define([],b);else if(\"undefined\"!=typeof exports)b();else{b(),a.FileSaver={exports:{}}.exports}})(this,function(){\"use strict\";function b(a,b){return\"undefined\"==typeof b?b={autoBom:!1}:\"object\"!=typeof b&&(console.warn(\"Deprecated: Expected third argument to be a object\"),b={autoBom:!b}),b.autoBom&&/^\\s*(?:text\\/\\S*|application\\/xml|\\S*\\/\\S*\\+xml)\\s*;.*charset\\s*=\\s*utf-8/i.test(a.type)?new Blob([\"\\uFEFF\",a],{type:a.type}):a}function c(a,b,c){var d=new XMLHttpRequest;d.open(\"GET\",a),d.responseType=\"blob\",d.onload=function(){g(d.response,b,c)},d.onerror=function(){console.error(\"could not download file\")},d.send()}function d(a){var b=new XMLHttpRequest;b.open(\"HEAD\",a,!1);try{b.send()}catch(a){}return 200<=b.status&&299>=b.status}function e(a){try{a.dispatchEvent(new MouseEvent(\"click\"))}catch(c){var b=document.createEvent(\"MouseEvents\");b.initMouseEvent(\"click\",!0,!0,window,0,0,0,80,20,!1,!1,!1,!1,0,null),a.dispatchEvent(b)}}var f=\"object\"==typeof window&&window.window===window?window:\"object\"==typeof self&&self.self===self?self:\"object\"==typeof global&&global.global===global?global:void 0,a=f.navigator&&/Macintosh/.test(navigator.userAgent)&&/AppleWebKit/.test(navigator.userAgent)&&!/Safari/.test(navigator.userAgent),g=f.saveAs||(\"object\"!=typeof window||window!==f?function(){}:\"download\"in HTMLAnchorElement.prototype&&!a?function(b,g,h){var i=f.URL||f.webkitURL,j=document.createElement(\"a\");g=g||b.name||\"download\",j.download=g,j.rel=\"noopener\",\"string\"==typeof b?(j.href=b,j.origin===location.origin?e(j):d(j.href)?c(b,g,h):e(j,j.target=\"_blank\")):(j.href=i.createObjectURL(b),setTimeout(function(){i.revokeObjectURL(j.href)},4E4),setTimeout(function(){e(j)},0))}:\"msSaveOrOpenBlob\"in navigator?function(f,g,h){if(g=g||f.name||\"download\",\"string\"!=typeof f)navigator.msSaveOrOpenBlob(b(f,h),g);else if(d(f))c(f,g,h);else{var i=document.createElement(\"a\");i.href=f,i.target=\"_blank\",setTimeout(function(){e(i)})}}:function(b,d,e,g){if(g=g||open(\"\",\"_blank\"),g&&(g.document.title=g.document.body.innerText=\"downloading...\"),\"string\"==typeof b)return c(b,d,e);var h=\"application/octet-stream\"===b.type,i=/constructor/i.test(f.HTMLElement)||f.safari,j=/CriOS\\/[\\d]+/.test(navigator.userAgent);if((j||h&&i||a)&&\"undefined\"!=typeof FileReader){var k=new FileReader;k.onloadend=function(){var a=k.result;a=j?a:a.replace(/^data:[^;]*;/,\"data:attachment/file;\"),g?g.location.href=a:location=a,g=null},k.readAsDataURL(b)}else{var l=f.URL||f.webkitURL,m=l.createObjectURL(b);g?g.location=m:location.href=m,g=null,setTimeout(function(){l.revokeObjectURL(m)},4E4)}});f.saveAs=g.saveAs=g,\"undefined\"!=typeof module&&(module.exports=g)});\n\n//# sourceMappingURL=FileSaver.min.js.map","export function b64toBlob(\n  b64Data: string,\n  contentType?: string,\n  sliceSize?: number\n) {\n  contentType = contentType || '';\n  sliceSize = sliceSize || 512;\n\n  const byteCharacters = atob(b64Data);\n  const byteArrays = [];\n\n  for (let offset = 0; offset < byteCharacters.length; offset += sliceSize) {\n    const slice = byteCharacters.slice(offset, offset + sliceSize);\n\n    const byteNumbers = new Array(slice.length);\n    for (let i = 0; i < slice.length; i++) {\n      byteNumbers[i] = slice.charCodeAt(i);\n    }\n\n    const byteArray = new Uint8Array(byteNumbers);\n\n    byteArrays.push(byteArray);\n  }\n\n  return new Blob(byteArrays, {type: contentType});\n}\n","import {saveAs} from 'file-saver';\nimport {defineMessage} from 'react-intl';\nimport {getCurrentCanvasState} from '../history/state/get-current-canvas-state';\nimport {fabricCanvas, state, tools} from '../../state/utils';\nimport {showToast} from '../../common/ui/toast/show-toast';\nimport {b64toBlob} from './b64-to-blob';\n\ntype ValidFormats = 'png' | 'jpeg' | 'json' | 'svg';\n\nexport class ExportTool {\n  /**\n   * Primary \"save\" function. This is called when user clicks \"Done\" button in the toolbar.\n   * It will apply watermark (if specified) and execute one of the actions below in the order of priority:\n   *\n   * 1. Send image data to url. If specified via \"saveUrl\" option in configuration.\n   * 2. Execute \"onSave\" callback function. If provided in configuration.\n   * 3. Download image or state file to user device with specified name, format and quality.\n   */\n  save(name?: string, format?: ValidFormats, quality?: number) {\n    const exportConfig = state().config.tools?.export;\n    name = name || exportConfig?.defaultName;\n    format = this.getFormat(format);\n    quality = this.getQuality(quality);\n\n    const filename = `${name}.${format}`;\n\n    this.applyWaterMark();\n\n    const data: string | null =\n      format === 'json'\n        ? this.getJsonState()\n        : this.getDataUrl(format, quality);\n\n    tools().watermark.remove();\n\n    if (!data) return;\n\n    if (state().config.saveUrl) {\n      fetch(state().config.saveUrl!, {\n        method: 'POST',\n        body: JSON.stringify({data, filename, format}),\n      });\n    } else if (state().config.onSave) {\n      state().config.onSave?.(data, filename, format);\n    } else {\n      const blob = this.getCanvasBlob(format, data);\n      saveAs(blob, filename);\n    }\n  }\n\n  /**\n   * Returns base64 encoded data for current image.\n   */\n  getDataUrl(format?: ValidFormats, quality?: number): string | null {\n    this.prepareCanvas();\n    try {\n      if (format === 'svg') {\n        return fabricCanvas().toSVG();\n      }\n      return fabricCanvas().toDataURL({\n        format: this.getFormat(format),\n        quality: this.getQuality(quality),\n        multiplier: Math.max(\n          state().original.width / fabricCanvas().width!,\n          state().original.height / fabricCanvas().height!\n        ),\n      });\n    } catch (e) {\n      if ((e as TypeError).message.toLowerCase().includes('tainted')) {\n        showToast(\n          defineMessage({\n            defaultMessage: 'Could not export canvas with external image.',\n          }),\n          {type: 'error'}\n        );\n      }\n    }\n    return null;\n  }\n\n  private getCanvasBlob(format: ValidFormats, data: string): Blob {\n    if (format === 'json') {\n      return new Blob([data], {type: 'application/json'});\n    }\n    if (format === 'svg') {\n      return new Blob([data], {type: 'image/svg+xml'});\n    }\n    const contentType = `image/${format}`;\n    data = data.replace(/data:image\\/([a-z]*)?;base64,/, '');\n    return b64toBlob(data, contentType);\n  }\n\n  private getJsonState(): string {\n    return JSON.stringify(getCurrentCanvasState());\n  }\n\n  private prepareCanvas() {\n    fabricCanvas().discardActiveObject();\n  }\n\n  private applyWaterMark() {\n    const watermark = state().config.watermarkText;\n    if (watermark) {\n      tools().watermark.add(watermark);\n    }\n  }\n\n  private getFormat(format?: ValidFormats | 'jpg'): ValidFormats {\n    const config = state().config.tools?.export;\n    format = format || config?.defaultFormat || 'png';\n    if (format === 'jpg') format = 'jpeg';\n    return format;\n  }\n\n  private getQuality(quality?: number): number {\n    const config = state().config.tools?.export;\n    quality = quality || config?.defaultQuality || 0.8;\n    return quality;\n  }\n}\n","import {Rect} from 'fabric/fabric-impl';\nimport {fabric} from 'fabric';\nimport {fabricCanvas, state, tools} from '../../state/utils';\n\nexport class CornersTool {\n  private previewRect: Rect | null = null;\n\n  async apply(radius: number) {\n    if (!this.previewRect) {\n      this.showPreview();\n    }\n    this.updatePreview(radius);\n\n    fabricCanvas().remove(this.previewRect!);\n    fabricCanvas().clipPath = this.previewRect!;\n\n    // get data and clear canvas\n    const data = tools().export.getDataUrl();\n    if (data) {\n      tools().canvas.clear();\n    }\n\n    // hide preview\n    this.hidePreview();\n\n    // add new rounded image\n    if (data) {\n      await tools().canvas.addMainImage(data);\n    }\n\n    fabricCanvas().clipPath = undefined;\n  }\n\n  getPreviewRadius(): number {\n    return this.previewRect?.rx || 0;\n  }\n\n  updatePreview(radius: number) {\n    if (!this.previewRect) return;\n    this.previewRect.set({\n      rx: radius,\n      ry: radius,\n    });\n    tools().canvas.render();\n  }\n\n  showPreview() {\n    this.previewRect = new fabric.Rect({\n      width: state().original.width,\n      height: state().original.height,\n      rx: 50,\n      ry: 50,\n      objectCaching: false,\n      fill: 'transparent',\n      name: 'round.rect',\n      data: {pixieInternal: true},\n      stroke: 'rgba(255,255,255,0.8)',\n      strokeWidth: 3,\n      strokeDashArray: [4, 4],\n      selectable: false,\n      evented: false,\n    });\n\n    fabricCanvas().add(this.previewRect);\n    this.previewRect.moveTo(99);\n    this.previewRect.viewportCenter();\n    tools().canvas.render();\n  }\n\n  hidePreview() {\n    if (!this.previewRect) return;\n    fabricCanvas().remove(this.previewRect);\n    tools().canvas.render();\n    this.previewRect = null;\n  }\n}\n","import {IRectOptions, Object as IObject} from 'fabric/fabric-impl';\nimport {fabric} from 'fabric';\nimport {fabricCanvas, state, tools} from '../../state/utils';\nimport {StraightenAnchor} from './straighten-anchor';\nimport {staticObjectConfig} from '../../objects/static-object-config';\nimport {ObjectName} from '../../objects/object-name';\n\nexport class TransformTool {\n  private get straightenAnchor(): StraightenAnchor {\n    return fabricCanvas()\n      .getObjects()\n      .find(\n        obj => obj.name === ObjectName.StraightenAnchor\n      ) as StraightenAnchor;\n  }\n\n  /**\n   * Rotate canvas left by 90 degrees.\n   */\n  rotateLeft() {\n    this.rotateFixed(-90);\n  }\n\n  /**\n   * Rotate canvas right by 90 degrees.\n   */\n  rotateRight() {\n    this.rotateFixed(90);\n  }\n\n  /**\n   * Straighten canvas by specified number of degrees.\n   */\n  straighten(degrees: number) {\n    this.storeObjectsRelationToHelper();\n    tools().objects.deselectActive();\n    const newAngle = (this.straightenAnchor.data.rotateAngle || 0) + degrees;\n    const scale = this.getImageScale(newAngle, this.straightenAnchor);\n\n    this.straightenAnchor.angle = newAngle;\n    this.straightenAnchor.scaleX = scale;\n    this.straightenAnchor.scaleY = scale;\n\n    this.straightenAnchor.data.straightenAngle = degrees;\n\n    this.transformObjectsBasedOnHelper();\n  }\n\n  /**\n   * Flip canvas vertically or horizontally.\n   */\n  flip(direction: 'horizontal' | 'vertical') {\n    const prop = direction === 'horizontal' ? 'flipY' : 'flipX';\n    tools()\n      .objects.getAll()\n      .forEach(obj => {\n        obj[prop] = !obj[prop];\n      });\n    tools().canvas.render();\n  }\n\n  private rotateFixed(degrees: number) {\n    tools().zoom.set(1, false);\n    tools().objects.deselectActive();\n    const currentRotateAngle = this.straightenAnchor.data.rotateAngle || 0;\n    degrees = Math.round(degrees / 90) * 90;\n    const newAngle =\n      currentRotateAngle +\n      (this.straightenAnchor.data.straightenAngle || 0) +\n      degrees;\n\n    // noinspection JSSuspiciousNameCombination\n    tools().canvas.resize(state().original.height, state().original.width, {\n      applyZoom: false,\n      resizeHelper: false,\n    });\n\n    this.storeObjectsRelationToHelper();\n\n    this.straightenAnchor.rotate(newAngle);\n    this.straightenAnchor.data.rotateAngle = currentRotateAngle + degrees;\n\n    this.straightenAnchor.center();\n    this.transformObjectsBasedOnHelper();\n    tools().frame.resize(tools().frame.active.currentSizeInPercent);\n    // pattern frames dont resize properly if we dont zoom on next paint\n    requestAnimationFrame(() => {\n      tools().zoom.fitToScreen();\n    });\n  }\n\n  /**\n   * Get minimum scale in order for image to fill the whole canvas, based on rotation.\n   */\n  private getImageScale(angle: number, image: IObject): number {\n    angle = fabric.util.degreesToRadians(angle);\n    const w = state().original.width;\n    const h = state().original.height;\n    const cw = w / 2;\n    const ch = h / 2;\n\n    const iw = image.width! / 2;\n    const ih = image.height! / 2;\n    const dist = Math.sqrt(cw ** 2 + ch ** 2);\n    const diagAngle = Math.asin(ch / dist);\n\n    let a1 = ((angle % (Math.PI * 2)) + Math.PI * 4) % (Math.PI * 2);\n    if (a1 > Math.PI) {\n      a1 -= Math.PI;\n    }\n    if (a1 > Math.PI / 2 && a1 <= Math.PI) {\n      a1 = Math.PI / 2 - (a1 - Math.PI / 2);\n    }\n\n    const ang1 = Math.PI / 2 - diagAngle - Math.abs(a1);\n    const ang2 = Math.abs(diagAngle - Math.abs(a1));\n    const dist1 = Math.cos(ang1) * dist;\n    const dist2 = Math.cos(ang2) * dist;\n    return Math.max(dist2 / iw, dist1 / ih);\n  }\n\n  private storeObjectsRelationToHelper() {\n    tools()\n      .objects.getAll()\n      .forEach(o => {\n        if (o !== this.straightenAnchor) {\n          const relationToCanvas = fabric.util.multiplyTransformMatrices(\n            fabric.util.invertTransform(\n              this.straightenAnchor.calcTransformMatrix()\n            ),\n            o.calcTransformMatrix()\n          );\n          o.data = {...o.data, relationToCanvas};\n        }\n      });\n  }\n\n  private transformObjectsBasedOnHelper() {\n    tools()\n      .objects.getAll()\n      .forEach(o => {\n        if (o.data.relationToCanvas) {\n          const newTransform = fabric.util.multiplyTransformMatrices(\n            this.straightenAnchor.calcTransformMatrix(),\n            o.data.relationToCanvas\n          );\n          const opt = fabric.util.qrDecompose(newTransform);\n          o.set({flipX: false, flipY: false});\n          o.setPositionByOrigin(\n            {x: opt.translateX, y: opt.translateY} as any,\n            'center',\n            'center'\n          );\n          o.set(opt);\n          o.setCoords();\n          o.data.relationToCanvas = null;\n        }\n      });\n  }\n\n  /**\n   * @hidden\n   */\n  resetStraightenAnchor() {\n    const oldHelper = this.straightenAnchor;\n    if (oldHelper) {\n      fabricCanvas().remove(oldHelper);\n    }\n    const newHelper = new fabric.Rect({\n      ...(staticObjectConfig as IRectOptions),\n      name: ObjectName.StraightenAnchor,\n      visible: false,\n      width: state().original.width,\n      height: state().original.height,\n      data: {\n        pixieInternal: true,\n        straightenAngle: 0,\n        rotateAngle: 0,\n      },\n    }) as StraightenAnchor;\n    fabricCanvas().add(newHelper);\n    newHelper.viewportCenter();\n  }\n}\n","import {initFabric} from '../utils/init-fabric';\nimport {ZoomTool} from './zoom-tool';\nimport {PixieCanvas} from './canvas/pixie-canvas';\nimport {ObjectTool} from '../objects/object-tool';\nimport {HistoryTool} from './history/history-tool';\nimport {MergeTool} from './merge/merge-tool';\nimport {FilterTool} from './filter/filter-tool';\nimport {ResizeTool} from './resize/resize-tool';\nimport {CropTool} from './crop/crop-tool';\nimport {ShapeTool} from './shapes/shape-tool';\nimport {FrameTool} from './frame/frame-tool';\nimport {TextTool} from './text/text-tool';\nimport {DrawTool} from './draw/draw-tool';\nimport {ImportTool} from './import/import-tool';\nimport {WatermarkTool} from './export/watermark-tool';\nimport {ExportTool} from './export/export-tool';\nimport {useStore} from '../state/store';\nimport {CornersTool} from './corners/corners-tool';\nimport {TransformTool} from './transform/transform-tool';\nimport {state} from '../state/utils';\n\nexport interface Tools {\n  filter: FilterTool;\n  history: HistoryTool;\n  objects: ObjectTool;\n  canvas: PixieCanvas;\n  zoom: ZoomTool;\n  resize: ResizeTool;\n  crop: CropTool;\n  merge: MergeTool;\n  shape: ShapeTool;\n  frame: FrameTool;\n  text: TextTool;\n  draw: DrawTool;\n  transform: TransformTool;\n  import: ImportTool;\n  watermark: WatermarkTool;\n  export: ExportTool;\n  corners: CornersTool;\n}\n\nexport function initTools(canvasEl: HTMLCanvasElement) {\n  const fabric = initFabric(canvasEl);\n  state().editor.fabric = fabric;\n  useStore.setState({fabric});\n  state().editor.tools = {\n    canvas: new PixieCanvas(),\n    objects: new ObjectTool(),\n    zoom: new ZoomTool(),\n    history: new HistoryTool(),\n    filter: new FilterTool(),\n    resize: new ResizeTool(),\n    crop: new CropTool(),\n    merge: new MergeTool(),\n    shape: new ShapeTool(),\n    frame: new FrameTool(),\n    text: new TextTool(),\n    draw: new DrawTool(),\n    transform: new TransformTool(),\n    import: new ImportTool(),\n    watermark: new WatermarkTool(),\n    export: new ExportTool(),\n    corners: new CornersTool(),\n  };\n}\n","type Callback = (e: {width: number; height: number}) => void;\n\nexport function observeSize(el: HTMLElement, callback: Callback): () => void {\n  const observer = new ResizeObserver(entries => {\n    const rect = entries[0].contentRect;\n    callback({width: rect.width, height: rect.height});\n  });\n  observer.observe(el);\n  return () => observer.unobserve(el);\n}\n","export interface PlainRect {\n  top: number;\n  right: number;\n  bottom: number;\n  left: number;\n  width: number;\n  height: number;\n}\n\nexport function getBoundingClientRect(el: HTMLElement) {\n  const rect = el.getBoundingClientRect();\n  return {\n    top: rect.top,\n    right: rect.right,\n    bottom: rect.bottom,\n    left: rect.left,\n    width: rect.width,\n    height: rect.height,\n  };\n}\n","'use strict'\r\n\r\nmodule.exports = {\r\n\t\"aliceblue\": [240, 248, 255],\r\n\t\"antiquewhite\": [250, 235, 215],\r\n\t\"aqua\": [0, 255, 255],\r\n\t\"aquamarine\": [127, 255, 212],\r\n\t\"azure\": [240, 255, 255],\r\n\t\"beige\": [245, 245, 220],\r\n\t\"bisque\": [255, 228, 196],\r\n\t\"black\": [0, 0, 0],\r\n\t\"blanchedalmond\": [255, 235, 205],\r\n\t\"blue\": [0, 0, 255],\r\n\t\"blueviolet\": [138, 43, 226],\r\n\t\"brown\": [165, 42, 42],\r\n\t\"burlywood\": [222, 184, 135],\r\n\t\"cadetblue\": [95, 158, 160],\r\n\t\"chartreuse\": [127, 255, 0],\r\n\t\"chocolate\": [210, 105, 30],\r\n\t\"coral\": [255, 127, 80],\r\n\t\"cornflowerblue\": [100, 149, 237],\r\n\t\"cornsilk\": [255, 248, 220],\r\n\t\"crimson\": [220, 20, 60],\r\n\t\"cyan\": [0, 255, 255],\r\n\t\"darkblue\": [0, 0, 139],\r\n\t\"darkcyan\": [0, 139, 139],\r\n\t\"darkgoldenrod\": [184, 134, 11],\r\n\t\"darkgray\": [169, 169, 169],\r\n\t\"darkgreen\": [0, 100, 0],\r\n\t\"darkgrey\": [169, 169, 169],\r\n\t\"darkkhaki\": [189, 183, 107],\r\n\t\"darkmagenta\": [139, 0, 139],\r\n\t\"darkolivegreen\": [85, 107, 47],\r\n\t\"darkorange\": [255, 140, 0],\r\n\t\"darkorchid\": [153, 50, 204],\r\n\t\"darkred\": [139, 0, 0],\r\n\t\"darksalmon\": [233, 150, 122],\r\n\t\"darkseagreen\": [143, 188, 143],\r\n\t\"darkslateblue\": [72, 61, 139],\r\n\t\"darkslategray\": [47, 79, 79],\r\n\t\"darkslategrey\": [47, 79, 79],\r\n\t\"darkturquoise\": [0, 206, 209],\r\n\t\"darkviolet\": [148, 0, 211],\r\n\t\"deeppink\": [255, 20, 147],\r\n\t\"deepskyblue\": [0, 191, 255],\r\n\t\"dimgray\": [105, 105, 105],\r\n\t\"dimgrey\": [105, 105, 105],\r\n\t\"dodgerblue\": [30, 144, 255],\r\n\t\"firebrick\": [178, 34, 34],\r\n\t\"floralwhite\": [255, 250, 240],\r\n\t\"forestgreen\": [34, 139, 34],\r\n\t\"fuchsia\": [255, 0, 255],\r\n\t\"gainsboro\": [220, 220, 220],\r\n\t\"ghostwhite\": [248, 248, 255],\r\n\t\"gold\": [255, 215, 0],\r\n\t\"goldenrod\": [218, 165, 32],\r\n\t\"gray\": [128, 128, 128],\r\n\t\"green\": [0, 128, 0],\r\n\t\"greenyellow\": [173, 255, 47],\r\n\t\"grey\": [128, 128, 128],\r\n\t\"honeydew\": [240, 255, 240],\r\n\t\"hotpink\": [255, 105, 180],\r\n\t\"indianred\": [205, 92, 92],\r\n\t\"indigo\": [75, 0, 130],\r\n\t\"ivory\": [255, 255, 240],\r\n\t\"khaki\": [240, 230, 140],\r\n\t\"lavender\": [230, 230, 250],\r\n\t\"lavenderblush\": [255, 240, 245],\r\n\t\"lawngreen\": [124, 252, 0],\r\n\t\"lemonchiffon\": [255, 250, 205],\r\n\t\"lightblue\": [173, 216, 230],\r\n\t\"lightcoral\": [240, 128, 128],\r\n\t\"lightcyan\": [224, 255, 255],\r\n\t\"lightgoldenrodyellow\": [250, 250, 210],\r\n\t\"lightgray\": [211, 211, 211],\r\n\t\"lightgreen\": [144, 238, 144],\r\n\t\"lightgrey\": [211, 211, 211],\r\n\t\"lightpink\": [255, 182, 193],\r\n\t\"lightsalmon\": [255, 160, 122],\r\n\t\"lightseagreen\": [32, 178, 170],\r\n\t\"lightskyblue\": [135, 206, 250],\r\n\t\"lightslategray\": [119, 136, 153],\r\n\t\"lightslategrey\": [119, 136, 153],\r\n\t\"lightsteelblue\": [176, 196, 222],\r\n\t\"lightyellow\": [255, 255, 224],\r\n\t\"lime\": [0, 255, 0],\r\n\t\"limegreen\": [50, 205, 50],\r\n\t\"linen\": [250, 240, 230],\r\n\t\"magenta\": [255, 0, 255],\r\n\t\"maroon\": [128, 0, 0],\r\n\t\"mediumaquamarine\": [102, 205, 170],\r\n\t\"mediumblue\": [0, 0, 205],\r\n\t\"mediumorchid\": [186, 85, 211],\r\n\t\"mediumpurple\": [147, 112, 219],\r\n\t\"mediumseagreen\": [60, 179, 113],\r\n\t\"mediumslateblue\": [123, 104, 238],\r\n\t\"mediumspringgreen\": [0, 250, 154],\r\n\t\"mediumturquoise\": [72, 209, 204],\r\n\t\"mediumvioletred\": [199, 21, 133],\r\n\t\"midnightblue\": [25, 25, 112],\r\n\t\"mintcream\": [245, 255, 250],\r\n\t\"mistyrose\": [255, 228, 225],\r\n\t\"moccasin\": [255, 228, 181],\r\n\t\"navajowhite\": [255, 222, 173],\r\n\t\"navy\": [0, 0, 128],\r\n\t\"oldlace\": [253, 245, 230],\r\n\t\"olive\": [128, 128, 0],\r\n\t\"olivedrab\": [107, 142, 35],\r\n\t\"orange\": [255, 165, 0],\r\n\t\"orangered\": [255, 69, 0],\r\n\t\"orchid\": [218, 112, 214],\r\n\t\"palegoldenrod\": [238, 232, 170],\r\n\t\"palegreen\": [152, 251, 152],\r\n\t\"paleturquoise\": [175, 238, 238],\r\n\t\"palevioletred\": [219, 112, 147],\r\n\t\"papayawhip\": [255, 239, 213],\r\n\t\"peachpuff\": [255, 218, 185],\r\n\t\"peru\": [205, 133, 63],\r\n\t\"pink\": [255, 192, 203],\r\n\t\"plum\": [221, 160, 221],\r\n\t\"powderblue\": [176, 224, 230],\r\n\t\"purple\": [128, 0, 128],\r\n\t\"rebeccapurple\": [102, 51, 153],\r\n\t\"red\": [255, 0, 0],\r\n\t\"rosybrown\": [188, 143, 143],\r\n\t\"royalblue\": [65, 105, 225],\r\n\t\"saddlebrown\": [139, 69, 19],\r\n\t\"salmon\": [250, 128, 114],\r\n\t\"sandybrown\": [244, 164, 96],\r\n\t\"seagreen\": [46, 139, 87],\r\n\t\"seashell\": [255, 245, 238],\r\n\t\"sienna\": [160, 82, 45],\r\n\t\"silver\": [192, 192, 192],\r\n\t\"skyblue\": [135, 206, 235],\r\n\t\"slateblue\": [106, 90, 205],\r\n\t\"slategray\": [112, 128, 144],\r\n\t\"slategrey\": [112, 128, 144],\r\n\t\"snow\": [255, 250, 250],\r\n\t\"springgreen\": [0, 255, 127],\r\n\t\"steelblue\": [70, 130, 180],\r\n\t\"tan\": [210, 180, 140],\r\n\t\"teal\": [0, 128, 128],\r\n\t\"thistle\": [216, 191, 216],\r\n\t\"tomato\": [255, 99, 71],\r\n\t\"turquoise\": [64, 224, 208],\r\n\t\"violet\": [238, 130, 238],\r\n\t\"wheat\": [245, 222, 179],\r\n\t\"white\": [255, 255, 255],\r\n\t\"whitesmoke\": [245, 245, 245],\r\n\t\"yellow\": [255, 255, 0],\r\n\t\"yellowgreen\": [154, 205, 50]\r\n};\r\n","module.exports = function isArrayish(obj) {\n\tif (!obj || typeof obj === 'string') {\n\t\treturn false;\n\t}\n\n\treturn obj instanceof Array || Array.isArray(obj) ||\n\t\t(obj.length >= 0 && (obj.splice instanceof Function ||\n\t\t\t(Object.getOwnPropertyDescriptor(obj, (obj.length - 1)) && obj.constructor.name !== 'String')));\n};\n","'use strict';\n\nvar isArrayish = require('is-arrayish');\n\nvar concat = Array.prototype.concat;\nvar slice = Array.prototype.slice;\n\nvar swizzle = module.exports = function swizzle(args) {\n\tvar results = [];\n\n\tfor (var i = 0, len = args.length; i < len; i++) {\n\t\tvar arg = args[i];\n\n\t\tif (isArrayish(arg)) {\n\t\t\t// http://jsperf.com/javascript-array-concat-vs-push/98\n\t\t\tresults = concat.call(results, slice.call(arg));\n\t\t} else {\n\t\t\tresults.push(arg);\n\t\t}\n\t}\n\n\treturn results;\n};\n\nswizzle.wrap = function (fn) {\n\treturn function () {\n\t\treturn fn(swizzle(arguments));\n\t};\n};\n","/* MIT license */\nvar colorNames = require('color-name');\nvar swizzle = require('simple-swizzle');\nvar hasOwnProperty = Object.hasOwnProperty;\n\nvar reverseNames = {};\n\n// create a list of reverse color names\nfor (var name in colorNames) {\n\tif (hasOwnProperty.call(colorNames, name)) {\n\t\treverseNames[colorNames[name]] = name;\n\t}\n}\n\nvar cs = module.exports = {\n\tto: {},\n\tget: {}\n};\n\ncs.get = function (string) {\n\tvar prefix = string.substring(0, 3).toLowerCase();\n\tvar val;\n\tvar model;\n\tswitch (prefix) {\n\t\tcase 'hsl':\n\t\t\tval = cs.get.hsl(string);\n\t\t\tmodel = 'hsl';\n\t\t\tbreak;\n\t\tcase 'hwb':\n\t\t\tval = cs.get.hwb(string);\n\t\t\tmodel = 'hwb';\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tval = cs.get.rgb(string);\n\t\t\tmodel = 'rgb';\n\t\t\tbreak;\n\t}\n\n\tif (!val) {\n\t\treturn null;\n\t}\n\n\treturn {model: model, value: val};\n};\n\ncs.get.rgb = function (string) {\n\tif (!string) {\n\t\treturn null;\n\t}\n\n\tvar abbr = /^#([a-f0-9]{3,4})$/i;\n\tvar hex = /^#([a-f0-9]{6})([a-f0-9]{2})?$/i;\n\tvar rgba = /^rgba?\\(\\s*([+-]?\\d+)(?=[\\s,])\\s*(?:,\\s*)?([+-]?\\d+)(?=[\\s,])\\s*(?:,\\s*)?([+-]?\\d+)\\s*(?:[,|\\/]\\s*([+-]?[\\d\\.]+)(%?)\\s*)?\\)$/;\n\tvar per = /^rgba?\\(\\s*([+-]?[\\d\\.]+)\\%\\s*,?\\s*([+-]?[\\d\\.]+)\\%\\s*,?\\s*([+-]?[\\d\\.]+)\\%\\s*(?:[,|\\/]\\s*([+-]?[\\d\\.]+)(%?)\\s*)?\\)$/;\n\tvar keyword = /^(\\w+)$/;\n\n\tvar rgb = [0, 0, 0, 1];\n\tvar match;\n\tvar i;\n\tvar hexAlpha;\n\n\tif (match = string.match(hex)) {\n\t\thexAlpha = match[2];\n\t\tmatch = match[1];\n\n\t\tfor (i = 0; i < 3; i++) {\n\t\t\t// https://jsperf.com/slice-vs-substr-vs-substring-methods-long-string/19\n\t\t\tvar i2 = i * 2;\n\t\t\trgb[i] = parseInt(match.slice(i2, i2 + 2), 16);\n\t\t}\n\n\t\tif (hexAlpha) {\n\t\t\trgb[3] = parseInt(hexAlpha, 16) / 255;\n\t\t}\n\t} else if (match = string.match(abbr)) {\n\t\tmatch = match[1];\n\t\thexAlpha = match[3];\n\n\t\tfor (i = 0; i < 3; i++) {\n\t\t\trgb[i] = parseInt(match[i] + match[i], 16);\n\t\t}\n\n\t\tif (hexAlpha) {\n\t\t\trgb[3] = parseInt(hexAlpha + hexAlpha, 16) / 255;\n\t\t}\n\t} else if (match = string.match(rgba)) {\n\t\tfor (i = 0; i < 3; i++) {\n\t\t\trgb[i] = parseInt(match[i + 1], 0);\n\t\t}\n\n\t\tif (match[4]) {\n\t\t\tif (match[5]) {\n\t\t\t\trgb[3] = parseFloat(match[4]) * 0.01;\n\t\t\t} else {\n\t\t\t\trgb[3] = parseFloat(match[4]);\n\t\t\t}\n\t\t}\n\t} else if (match = string.match(per)) {\n\t\tfor (i = 0; i < 3; i++) {\n\t\t\trgb[i] = Math.round(parseFloat(match[i + 1]) * 2.55);\n\t\t}\n\n\t\tif (match[4]) {\n\t\t\tif (match[5]) {\n\t\t\t\trgb[3] = parseFloat(match[4]) * 0.01;\n\t\t\t} else {\n\t\t\t\trgb[3] = parseFloat(match[4]);\n\t\t\t}\n\t\t}\n\t} else if (match = string.match(keyword)) {\n\t\tif (match[1] === 'transparent') {\n\t\t\treturn [0, 0, 0, 0];\n\t\t}\n\n\t\tif (!hasOwnProperty.call(colorNames, match[1])) {\n\t\t\treturn null;\n\t\t}\n\n\t\trgb = colorNames[match[1]];\n\t\trgb[3] = 1;\n\n\t\treturn rgb;\n\t} else {\n\t\treturn null;\n\t}\n\n\tfor (i = 0; i < 3; i++) {\n\t\trgb[i] = clamp(rgb[i], 0, 255);\n\t}\n\trgb[3] = clamp(rgb[3], 0, 1);\n\n\treturn rgb;\n};\n\ncs.get.hsl = function (string) {\n\tif (!string) {\n\t\treturn null;\n\t}\n\n\tvar hsl = /^hsla?\\(\\s*([+-]?(?:\\d{0,3}\\.)?\\d+)(?:deg)?\\s*,?\\s*([+-]?[\\d\\.]+)%\\s*,?\\s*([+-]?[\\d\\.]+)%\\s*(?:[,|\\/]\\s*([+-]?(?=\\.\\d|\\d)(?:0|[1-9]\\d*)?(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)\\s*)?\\)$/;\n\tvar match = string.match(hsl);\n\n\tif (match) {\n\t\tvar alpha = parseFloat(match[4]);\n\t\tvar h = ((parseFloat(match[1]) % 360) + 360) % 360;\n\t\tvar s = clamp(parseFloat(match[2]), 0, 100);\n\t\tvar l = clamp(parseFloat(match[3]), 0, 100);\n\t\tvar a = clamp(isNaN(alpha) ? 1 : alpha, 0, 1);\n\n\t\treturn [h, s, l, a];\n\t}\n\n\treturn null;\n};\n\ncs.get.hwb = function (string) {\n\tif (!string) {\n\t\treturn null;\n\t}\n\n\tvar hwb = /^hwb\\(\\s*([+-]?\\d{0,3}(?:\\.\\d+)?)(?:deg)?\\s*,\\s*([+-]?[\\d\\.]+)%\\s*,\\s*([+-]?[\\d\\.]+)%\\s*(?:,\\s*([+-]?(?=\\.\\d|\\d)(?:0|[1-9]\\d*)?(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)\\s*)?\\)$/;\n\tvar match = string.match(hwb);\n\n\tif (match) {\n\t\tvar alpha = parseFloat(match[4]);\n\t\tvar h = ((parseFloat(match[1]) % 360) + 360) % 360;\n\t\tvar w = clamp(parseFloat(match[2]), 0, 100);\n\t\tvar b = clamp(parseFloat(match[3]), 0, 100);\n\t\tvar a = clamp(isNaN(alpha) ? 1 : alpha, 0, 1);\n\t\treturn [h, w, b, a];\n\t}\n\n\treturn null;\n};\n\ncs.to.hex = function () {\n\tvar rgba = swizzle(arguments);\n\n\treturn (\n\t\t'#' +\n\t\thexDouble(rgba[0]) +\n\t\thexDouble(rgba[1]) +\n\t\thexDouble(rgba[2]) +\n\t\t(rgba[3] < 1\n\t\t\t? (hexDouble(Math.round(rgba[3] * 255)))\n\t\t\t: '')\n\t);\n};\n\ncs.to.rgb = function () {\n\tvar rgba = swizzle(arguments);\n\n\treturn rgba.length < 4 || rgba[3] === 1\n\t\t? 'rgb(' + Math.round(rgba[0]) + ', ' + Math.round(rgba[1]) + ', ' + Math.round(rgba[2]) + ')'\n\t\t: 'rgba(' + Math.round(rgba[0]) + ', ' + Math.round(rgba[1]) + ', ' + Math.round(rgba[2]) + ', ' + rgba[3] + ')';\n};\n\ncs.to.rgb.percent = function () {\n\tvar rgba = swizzle(arguments);\n\n\tvar r = Math.round(rgba[0] / 255 * 100);\n\tvar g = Math.round(rgba[1] / 255 * 100);\n\tvar b = Math.round(rgba[2] / 255 * 100);\n\n\treturn rgba.length < 4 || rgba[3] === 1\n\t\t? 'rgb(' + r + '%, ' + g + '%, ' + b + '%)'\n\t\t: 'rgba(' + r + '%, ' + g + '%, ' + b + '%, ' + rgba[3] + ')';\n};\n\ncs.to.hsl = function () {\n\tvar hsla = swizzle(arguments);\n\treturn hsla.length < 4 || hsla[3] === 1\n\t\t? 'hsl(' + hsla[0] + ', ' + hsla[1] + '%, ' + hsla[2] + '%)'\n\t\t: 'hsla(' + hsla[0] + ', ' + hsla[1] + '%, ' + hsla[2] + '%, ' + hsla[3] + ')';\n};\n\n// hwb is a bit different than rgb(a) & hsl(a) since there is no alpha specific syntax\n// (hwb have alpha optional & 1 is default value)\ncs.to.hwb = function () {\n\tvar hwba = swizzle(arguments);\n\n\tvar a = '';\n\tif (hwba.length >= 4 && hwba[3] !== 1) {\n\t\ta = ', ' + hwba[3];\n\t}\n\n\treturn 'hwb(' + hwba[0] + ', ' + hwba[1] + '%, ' + hwba[2] + '%' + a + ')';\n};\n\ncs.to.keyword = function (rgb) {\n\treturn reverseNames[rgb.slice(0, 3)];\n};\n\n// helpers\nfunction clamp(num, min, max) {\n\treturn Math.min(Math.max(min, num), max);\n}\n\nfunction hexDouble(num) {\n\tvar str = Math.round(num).toString(16).toUpperCase();\n\treturn (str.length < 2) ? '0' + str : str;\n}\n","/* MIT license */\n/* eslint-disable no-mixed-operators */\nconst cssKeywords = require('color-name');\n\n// NOTE: conversions should only return primitive values (i.e. arrays, or\n//       values that give correct `typeof` results).\n//       do not use box values types (i.e. Number(), String(), etc.)\n\nconst reverseKeywords = {};\nfor (const key of Object.keys(cssKeywords)) {\n\treverseKeywords[cssKeywords[key]] = key;\n}\n\nconst convert = {\n\trgb: {channels: 3, labels: 'rgb'},\n\thsl: {channels: 3, labels: 'hsl'},\n\thsv: {channels: 3, labels: 'hsv'},\n\thwb: {channels: 3, labels: 'hwb'},\n\tcmyk: {channels: 4, labels: 'cmyk'},\n\txyz: {channels: 3, labels: 'xyz'},\n\tlab: {channels: 3, labels: 'lab'},\n\tlch: {channels: 3, labels: 'lch'},\n\thex: {channels: 1, labels: ['hex']},\n\tkeyword: {channels: 1, labels: ['keyword']},\n\tansi16: {channels: 1, labels: ['ansi16']},\n\tansi256: {channels: 1, labels: ['ansi256']},\n\thcg: {channels: 3, labels: ['h', 'c', 'g']},\n\tapple: {channels: 3, labels: ['r16', 'g16', 'b16']},\n\tgray: {channels: 1, labels: ['gray']}\n};\n\nmodule.exports = convert;\n\n// Hide .channels and .labels properties\nfor (const model of Object.keys(convert)) {\n\tif (!('channels' in convert[model])) {\n\t\tthrow new Error('missing channels property: ' + model);\n\t}\n\n\tif (!('labels' in convert[model])) {\n\t\tthrow new Error('missing channel labels property: ' + model);\n\t}\n\n\tif (convert[model].labels.length !== convert[model].channels) {\n\t\tthrow new Error('channel and label counts mismatch: ' + model);\n\t}\n\n\tconst {channels, labels} = convert[model];\n\tdelete convert[model].channels;\n\tdelete convert[model].labels;\n\tObject.defineProperty(convert[model], 'channels', {value: channels});\n\tObject.defineProperty(convert[model], 'labels', {value: labels});\n}\n\nconvert.rgb.hsl = function (rgb) {\n\tconst r = rgb[0] / 255;\n\tconst g = rgb[1] / 255;\n\tconst b = rgb[2] / 255;\n\tconst min = Math.min(r, g, b);\n\tconst max = Math.max(r, g, b);\n\tconst delta = max - min;\n\tlet h;\n\tlet s;\n\n\tif (max === min) {\n\t\th = 0;\n\t} else if (r === max) {\n\t\th = (g - b) / delta;\n\t} else if (g === max) {\n\t\th = 2 + (b - r) / delta;\n\t} else if (b === max) {\n\t\th = 4 + (r - g) / delta;\n\t}\n\n\th = Math.min(h * 60, 360);\n\n\tif (h < 0) {\n\t\th += 360;\n\t}\n\n\tconst l = (min + max) / 2;\n\n\tif (max === min) {\n\t\ts = 0;\n\t} else if (l <= 0.5) {\n\t\ts = delta / (max + min);\n\t} else {\n\t\ts = delta / (2 - max - min);\n\t}\n\n\treturn [h, s * 100, l * 100];\n};\n\nconvert.rgb.hsv = function (rgb) {\n\tlet rdif;\n\tlet gdif;\n\tlet bdif;\n\tlet h;\n\tlet s;\n\n\tconst r = rgb[0] / 255;\n\tconst g = rgb[1] / 255;\n\tconst b = rgb[2] / 255;\n\tconst v = Math.max(r, g, b);\n\tconst diff = v - Math.min(r, g, b);\n\tconst diffc = function (c) {\n\t\treturn (v - c) / 6 / diff + 1 / 2;\n\t};\n\n\tif (diff === 0) {\n\t\th = 0;\n\t\ts = 0;\n\t} else {\n\t\ts = diff / v;\n\t\trdif = diffc(r);\n\t\tgdif = diffc(g);\n\t\tbdif = diffc(b);\n\n\t\tif (r === v) {\n\t\t\th = bdif - gdif;\n\t\t} else if (g === v) {\n\t\t\th = (1 / 3) + rdif - bdif;\n\t\t} else if (b === v) {\n\t\t\th = (2 / 3) + gdif - rdif;\n\t\t}\n\n\t\tif (h < 0) {\n\t\t\th += 1;\n\t\t} else if (h > 1) {\n\t\t\th -= 1;\n\t\t}\n\t}\n\n\treturn [\n\t\th * 360,\n\t\ts * 100,\n\t\tv * 100\n\t];\n};\n\nconvert.rgb.hwb = function (rgb) {\n\tconst r = rgb[0];\n\tconst g = rgb[1];\n\tlet b = rgb[2];\n\tconst h = convert.rgb.hsl(rgb)[0];\n\tconst w = 1 / 255 * Math.min(r, Math.min(g, b));\n\n\tb = 1 - 1 / 255 * Math.max(r, Math.max(g, b));\n\n\treturn [h, w * 100, b * 100];\n};\n\nconvert.rgb.cmyk = function (rgb) {\n\tconst r = rgb[0] / 255;\n\tconst g = rgb[1] / 255;\n\tconst b = rgb[2] / 255;\n\n\tconst k = Math.min(1 - r, 1 - g, 1 - b);\n\tconst c = (1 - r - k) / (1 - k) || 0;\n\tconst m = (1 - g - k) / (1 - k) || 0;\n\tconst y = (1 - b - k) / (1 - k) || 0;\n\n\treturn [c * 100, m * 100, y * 100, k * 100];\n};\n\nfunction comparativeDistance(x, y) {\n\t/*\n\t\tSee https://en.m.wikipedia.org/wiki/Euclidean_distance#Squared_Euclidean_distance\n\t*/\n\treturn (\n\t\t((x[0] - y[0]) ** 2) +\n\t\t((x[1] - y[1]) ** 2) +\n\t\t((x[2] - y[2]) ** 2)\n\t);\n}\n\nconvert.rgb.keyword = function (rgb) {\n\tconst reversed = reverseKeywords[rgb];\n\tif (reversed) {\n\t\treturn reversed;\n\t}\n\n\tlet currentClosestDistance = Infinity;\n\tlet currentClosestKeyword;\n\n\tfor (const keyword of Object.keys(cssKeywords)) {\n\t\tconst value = cssKeywords[keyword];\n\n\t\t// Compute comparative distance\n\t\tconst distance = comparativeDistance(rgb, value);\n\n\t\t// Check if its less, if so set as closest\n\t\tif (distance < currentClosestDistance) {\n\t\t\tcurrentClosestDistance = distance;\n\t\t\tcurrentClosestKeyword = keyword;\n\t\t}\n\t}\n\n\treturn currentClosestKeyword;\n};\n\nconvert.keyword.rgb = function (keyword) {\n\treturn cssKeywords[keyword];\n};\n\nconvert.rgb.xyz = function (rgb) {\n\tlet r = rgb[0] / 255;\n\tlet g = rgb[1] / 255;\n\tlet b = rgb[2] / 255;\n\n\t// Assume sRGB\n\tr = r > 0.04045 ? (((r + 0.055) / 1.055) ** 2.4) : (r / 12.92);\n\tg = g > 0.04045 ? (((g + 0.055) / 1.055) ** 2.4) : (g / 12.92);\n\tb = b > 0.04045 ? (((b + 0.055) / 1.055) ** 2.4) : (b / 12.92);\n\n\tconst x = (r * 0.4124) + (g * 0.3576) + (b * 0.1805);\n\tconst y = (r * 0.2126) + (g * 0.7152) + (b * 0.0722);\n\tconst z = (r * 0.0193) + (g * 0.1192) + (b * 0.9505);\n\n\treturn [x * 100, y * 100, z * 100];\n};\n\nconvert.rgb.lab = function (rgb) {\n\tconst xyz = convert.rgb.xyz(rgb);\n\tlet x = xyz[0];\n\tlet y = xyz[1];\n\tlet z = xyz[2];\n\n\tx /= 95.047;\n\ty /= 100;\n\tz /= 108.883;\n\n\tx = x > 0.008856 ? (x ** (1 / 3)) : (7.787 * x) + (16 / 116);\n\ty = y > 0.008856 ? (y ** (1 / 3)) : (7.787 * y) + (16 / 116);\n\tz = z > 0.008856 ? (z ** (1 / 3)) : (7.787 * z) + (16 / 116);\n\n\tconst l = (116 * y) - 16;\n\tconst a = 500 * (x - y);\n\tconst b = 200 * (y - z);\n\n\treturn [l, a, b];\n};\n\nconvert.hsl.rgb = function (hsl) {\n\tconst h = hsl[0] / 360;\n\tconst s = hsl[1] / 100;\n\tconst l = hsl[2] / 100;\n\tlet t2;\n\tlet t3;\n\tlet val;\n\n\tif (s === 0) {\n\t\tval = l * 255;\n\t\treturn [val, val, val];\n\t}\n\n\tif (l < 0.5) {\n\t\tt2 = l * (1 + s);\n\t} else {\n\t\tt2 = l + s - l * s;\n\t}\n\n\tconst t1 = 2 * l - t2;\n\n\tconst rgb = [0, 0, 0];\n\tfor (let i = 0; i < 3; i++) {\n\t\tt3 = h + 1 / 3 * -(i - 1);\n\t\tif (t3 < 0) {\n\t\t\tt3++;\n\t\t}\n\n\t\tif (t3 > 1) {\n\t\t\tt3--;\n\t\t}\n\n\t\tif (6 * t3 < 1) {\n\t\t\tval = t1 + (t2 - t1) * 6 * t3;\n\t\t} else if (2 * t3 < 1) {\n\t\t\tval = t2;\n\t\t} else if (3 * t3 < 2) {\n\t\t\tval = t1 + (t2 - t1) * (2 / 3 - t3) * 6;\n\t\t} else {\n\t\t\tval = t1;\n\t\t}\n\n\t\trgb[i] = val * 255;\n\t}\n\n\treturn rgb;\n};\n\nconvert.hsl.hsv = function (hsl) {\n\tconst h = hsl[0];\n\tlet s = hsl[1] / 100;\n\tlet l = hsl[2] / 100;\n\tlet smin = s;\n\tconst lmin = Math.max(l, 0.01);\n\n\tl *= 2;\n\ts *= (l <= 1) ? l : 2 - l;\n\tsmin *= lmin <= 1 ? lmin : 2 - lmin;\n\tconst v = (l + s) / 2;\n\tconst sv = l === 0 ? (2 * smin) / (lmin + smin) : (2 * s) / (l + s);\n\n\treturn [h, sv * 100, v * 100];\n};\n\nconvert.hsv.rgb = function (hsv) {\n\tconst h = hsv[0] / 60;\n\tconst s = hsv[1] / 100;\n\tlet v = hsv[2] / 100;\n\tconst hi = Math.floor(h) % 6;\n\n\tconst f = h - Math.floor(h);\n\tconst p = 255 * v * (1 - s);\n\tconst q = 255 * v * (1 - (s * f));\n\tconst t = 255 * v * (1 - (s * (1 - f)));\n\tv *= 255;\n\n\tswitch (hi) {\n\t\tcase 0:\n\t\t\treturn [v, t, p];\n\t\tcase 1:\n\t\t\treturn [q, v, p];\n\t\tcase 2:\n\t\t\treturn [p, v, t];\n\t\tcase 3:\n\t\t\treturn [p, q, v];\n\t\tcase 4:\n\t\t\treturn [t, p, v];\n\t\tcase 5:\n\t\t\treturn [v, p, q];\n\t}\n};\n\nconvert.hsv.hsl = function (hsv) {\n\tconst h = hsv[0];\n\tconst s = hsv[1] / 100;\n\tconst v = hsv[2] / 100;\n\tconst vmin = Math.max(v, 0.01);\n\tlet sl;\n\tlet l;\n\n\tl = (2 - s) * v;\n\tconst lmin = (2 - s) * vmin;\n\tsl = s * vmin;\n\tsl /= (lmin <= 1) ? lmin : 2 - lmin;\n\tsl = sl || 0;\n\tl /= 2;\n\n\treturn [h, sl * 100, l * 100];\n};\n\n// http://dev.w3.org/csswg/css-color/#hwb-to-rgb\nconvert.hwb.rgb = function (hwb) {\n\tconst h = hwb[0] / 360;\n\tlet wh = hwb[1] / 100;\n\tlet bl = hwb[2] / 100;\n\tconst ratio = wh + bl;\n\tlet f;\n\n\t// Wh + bl cant be > 1\n\tif (ratio > 1) {\n\t\twh /= ratio;\n\t\tbl /= ratio;\n\t}\n\n\tconst i = Math.floor(6 * h);\n\tconst v = 1 - bl;\n\tf = 6 * h - i;\n\n\tif ((i & 0x01) !== 0) {\n\t\tf = 1 - f;\n\t}\n\n\tconst n = wh + f * (v - wh); // Linear interpolation\n\n\tlet r;\n\tlet g;\n\tlet b;\n\t/* eslint-disable max-statements-per-line,no-multi-spaces */\n\tswitch (i) {\n\t\tdefault:\n\t\tcase 6:\n\t\tcase 0: r = v;  g = n;  b = wh; break;\n\t\tcase 1: r = n;  g = v;  b = wh; break;\n\t\tcase 2: r = wh; g = v;  b = n; break;\n\t\tcase 3: r = wh; g = n;  b = v; break;\n\t\tcase 4: r = n;  g = wh; b = v; break;\n\t\tcase 5: r = v;  g = wh; b = n; break;\n\t}\n\t/* eslint-enable max-statements-per-line,no-multi-spaces */\n\n\treturn [r * 255, g * 255, b * 255];\n};\n\nconvert.cmyk.rgb = function (cmyk) {\n\tconst c = cmyk[0] / 100;\n\tconst m = cmyk[1] / 100;\n\tconst y = cmyk[2] / 100;\n\tconst k = cmyk[3] / 100;\n\n\tconst r = 1 - Math.min(1, c * (1 - k) + k);\n\tconst g = 1 - Math.min(1, m * (1 - k) + k);\n\tconst b = 1 - Math.min(1, y * (1 - k) + k);\n\n\treturn [r * 255, g * 255, b * 255];\n};\n\nconvert.xyz.rgb = function (xyz) {\n\tconst x = xyz[0] / 100;\n\tconst y = xyz[1] / 100;\n\tconst z = xyz[2] / 100;\n\tlet r;\n\tlet g;\n\tlet b;\n\n\tr = (x * 3.2406) + (y * -1.5372) + (z * -0.4986);\n\tg = (x * -0.9689) + (y * 1.8758) + (z * 0.0415);\n\tb = (x * 0.0557) + (y * -0.2040) + (z * 1.0570);\n\n\t// Assume sRGB\n\tr = r > 0.0031308\n\t\t? ((1.055 * (r ** (1.0 / 2.4))) - 0.055)\n\t\t: r * 12.92;\n\n\tg = g > 0.0031308\n\t\t? ((1.055 * (g ** (1.0 / 2.4))) - 0.055)\n\t\t: g * 12.92;\n\n\tb = b > 0.0031308\n\t\t? ((1.055 * (b ** (1.0 / 2.4))) - 0.055)\n\t\t: b * 12.92;\n\n\tr = Math.min(Math.max(0, r), 1);\n\tg = Math.min(Math.max(0, g), 1);\n\tb = Math.min(Math.max(0, b), 1);\n\n\treturn [r * 255, g * 255, b * 255];\n};\n\nconvert.xyz.lab = function (xyz) {\n\tlet x = xyz[0];\n\tlet y = xyz[1];\n\tlet z = xyz[2];\n\n\tx /= 95.047;\n\ty /= 100;\n\tz /= 108.883;\n\n\tx = x > 0.008856 ? (x ** (1 / 3)) : (7.787 * x) + (16 / 116);\n\ty = y > 0.008856 ? (y ** (1 / 3)) : (7.787 * y) + (16 / 116);\n\tz = z > 0.008856 ? (z ** (1 / 3)) : (7.787 * z) + (16 / 116);\n\n\tconst l = (116 * y) - 16;\n\tconst a = 500 * (x - y);\n\tconst b = 200 * (y - z);\n\n\treturn [l, a, b];\n};\n\nconvert.lab.xyz = function (lab) {\n\tconst l = lab[0];\n\tconst a = lab[1];\n\tconst b = lab[2];\n\tlet x;\n\tlet y;\n\tlet z;\n\n\ty = (l + 16) / 116;\n\tx = a / 500 + y;\n\tz = y - b / 200;\n\n\tconst y2 = y ** 3;\n\tconst x2 = x ** 3;\n\tconst z2 = z ** 3;\n\ty = y2 > 0.008856 ? y2 : (y - 16 / 116) / 7.787;\n\tx = x2 > 0.008856 ? x2 : (x - 16 / 116) / 7.787;\n\tz = z2 > 0.008856 ? z2 : (z - 16 / 116) / 7.787;\n\n\tx *= 95.047;\n\ty *= 100;\n\tz *= 108.883;\n\n\treturn [x, y, z];\n};\n\nconvert.lab.lch = function (lab) {\n\tconst l = lab[0];\n\tconst a = lab[1];\n\tconst b = lab[2];\n\tlet h;\n\n\tconst hr = Math.atan2(b, a);\n\th = hr * 360 / 2 / Math.PI;\n\n\tif (h < 0) {\n\t\th += 360;\n\t}\n\n\tconst c = Math.sqrt(a * a + b * b);\n\n\treturn [l, c, h];\n};\n\nconvert.lch.lab = function (lch) {\n\tconst l = lch[0];\n\tconst c = lch[1];\n\tconst h = lch[2];\n\n\tconst hr = h / 360 * 2 * Math.PI;\n\tconst a = c * Math.cos(hr);\n\tconst b = c * Math.sin(hr);\n\n\treturn [l, a, b];\n};\n\nconvert.rgb.ansi16 = function (args, saturation = null) {\n\tconst [r, g, b] = args;\n\tlet value = saturation === null ? convert.rgb.hsv(args)[2] : saturation; // Hsv -> ansi16 optimization\n\n\tvalue = Math.round(value / 50);\n\n\tif (value === 0) {\n\t\treturn 30;\n\t}\n\n\tlet ansi = 30\n\t\t+ ((Math.round(b / 255) << 2)\n\t\t| (Math.round(g / 255) << 1)\n\t\t| Math.round(r / 255));\n\n\tif (value === 2) {\n\t\tansi += 60;\n\t}\n\n\treturn ansi;\n};\n\nconvert.hsv.ansi16 = function (args) {\n\t// Optimization here; we already know the value and don't need to get\n\t// it converted for us.\n\treturn convert.rgb.ansi16(convert.hsv.rgb(args), args[2]);\n};\n\nconvert.rgb.ansi256 = function (args) {\n\tconst r = args[0];\n\tconst g = args[1];\n\tconst b = args[2];\n\n\t// We use the extended greyscale palette here, with the exception of\n\t// black and white. normal palette only has 4 greyscale shades.\n\tif (r === g && g === b) {\n\t\tif (r < 8) {\n\t\t\treturn 16;\n\t\t}\n\n\t\tif (r > 248) {\n\t\t\treturn 231;\n\t\t}\n\n\t\treturn Math.round(((r - 8) / 247) * 24) + 232;\n\t}\n\n\tconst ansi = 16\n\t\t+ (36 * Math.round(r / 255 * 5))\n\t\t+ (6 * Math.round(g / 255 * 5))\n\t\t+ Math.round(b / 255 * 5);\n\n\treturn ansi;\n};\n\nconvert.ansi16.rgb = function (args) {\n\tlet color = args % 10;\n\n\t// Handle greyscale\n\tif (color === 0 || color === 7) {\n\t\tif (args > 50) {\n\t\t\tcolor += 3.5;\n\t\t}\n\n\t\tcolor = color / 10.5 * 255;\n\n\t\treturn [color, color, color];\n\t}\n\n\tconst mult = (~~(args > 50) + 1) * 0.5;\n\tconst r = ((color & 1) * mult) * 255;\n\tconst g = (((color >> 1) & 1) * mult) * 255;\n\tconst b = (((color >> 2) & 1) * mult) * 255;\n\n\treturn [r, g, b];\n};\n\nconvert.ansi256.rgb = function (args) {\n\t// Handle greyscale\n\tif (args >= 232) {\n\t\tconst c = (args - 232) * 10 + 8;\n\t\treturn [c, c, c];\n\t}\n\n\targs -= 16;\n\n\tlet rem;\n\tconst r = Math.floor(args / 36) / 5 * 255;\n\tconst g = Math.floor((rem = args % 36) / 6) / 5 * 255;\n\tconst b = (rem % 6) / 5 * 255;\n\n\treturn [r, g, b];\n};\n\nconvert.rgb.hex = function (args) {\n\tconst integer = ((Math.round(args[0]) & 0xFF) << 16)\n\t\t+ ((Math.round(args[1]) & 0xFF) << 8)\n\t\t+ (Math.round(args[2]) & 0xFF);\n\n\tconst string = integer.toString(16).toUpperCase();\n\treturn '000000'.substring(string.length) + string;\n};\n\nconvert.hex.rgb = function (args) {\n\tconst match = args.toString(16).match(/[a-f0-9]{6}|[a-f0-9]{3}/i);\n\tif (!match) {\n\t\treturn [0, 0, 0];\n\t}\n\n\tlet colorString = match[0];\n\n\tif (match[0].length === 3) {\n\t\tcolorString = colorString.split('').map(char => {\n\t\t\treturn char + char;\n\t\t}).join('');\n\t}\n\n\tconst integer = parseInt(colorString, 16);\n\tconst r = (integer >> 16) & 0xFF;\n\tconst g = (integer >> 8) & 0xFF;\n\tconst b = integer & 0xFF;\n\n\treturn [r, g, b];\n};\n\nconvert.rgb.hcg = function (rgb) {\n\tconst r = rgb[0] / 255;\n\tconst g = rgb[1] / 255;\n\tconst b = rgb[2] / 255;\n\tconst max = Math.max(Math.max(r, g), b);\n\tconst min = Math.min(Math.min(r, g), b);\n\tconst chroma = (max - min);\n\tlet grayscale;\n\tlet hue;\n\n\tif (chroma < 1) {\n\t\tgrayscale = min / (1 - chroma);\n\t} else {\n\t\tgrayscale = 0;\n\t}\n\n\tif (chroma <= 0) {\n\t\thue = 0;\n\t} else\n\tif (max === r) {\n\t\thue = ((g - b) / chroma) % 6;\n\t} else\n\tif (max === g) {\n\t\thue = 2 + (b - r) / chroma;\n\t} else {\n\t\thue = 4 + (r - g) / chroma;\n\t}\n\n\thue /= 6;\n\thue %= 1;\n\n\treturn [hue * 360, chroma * 100, grayscale * 100];\n};\n\nconvert.hsl.hcg = function (hsl) {\n\tconst s = hsl[1] / 100;\n\tconst l = hsl[2] / 100;\n\n\tconst c = l < 0.5 ? (2.0 * s * l) : (2.0 * s * (1.0 - l));\n\n\tlet f = 0;\n\tif (c < 1.0) {\n\t\tf = (l - 0.5 * c) / (1.0 - c);\n\t}\n\n\treturn [hsl[0], c * 100, f * 100];\n};\n\nconvert.hsv.hcg = function (hsv) {\n\tconst s = hsv[1] / 100;\n\tconst v = hsv[2] / 100;\n\n\tconst c = s * v;\n\tlet f = 0;\n\n\tif (c < 1.0) {\n\t\tf = (v - c) / (1 - c);\n\t}\n\n\treturn [hsv[0], c * 100, f * 100];\n};\n\nconvert.hcg.rgb = function (hcg) {\n\tconst h = hcg[0] / 360;\n\tconst c = hcg[1] / 100;\n\tconst g = hcg[2] / 100;\n\n\tif (c === 0.0) {\n\t\treturn [g * 255, g * 255, g * 255];\n\t}\n\n\tconst pure = [0, 0, 0];\n\tconst hi = (h % 1) * 6;\n\tconst v = hi % 1;\n\tconst w = 1 - v;\n\tlet mg = 0;\n\n\t/* eslint-disable max-statements-per-line */\n\tswitch (Math.floor(hi)) {\n\t\tcase 0:\n\t\t\tpure[0] = 1; pure[1] = v; pure[2] = 0; break;\n\t\tcase 1:\n\t\t\tpure[0] = w; pure[1] = 1; pure[2] = 0; break;\n\t\tcase 2:\n\t\t\tpure[0] = 0; pure[1] = 1; pure[2] = v; break;\n\t\tcase 3:\n\t\t\tpure[0] = 0; pure[1] = w; pure[2] = 1; break;\n\t\tcase 4:\n\t\t\tpure[0] = v; pure[1] = 0; pure[2] = 1; break;\n\t\tdefault:\n\t\t\tpure[0] = 1; pure[1] = 0; pure[2] = w;\n\t}\n\t/* eslint-enable max-statements-per-line */\n\n\tmg = (1.0 - c) * g;\n\n\treturn [\n\t\t(c * pure[0] + mg) * 255,\n\t\t(c * pure[1] + mg) * 255,\n\t\t(c * pure[2] + mg) * 255\n\t];\n};\n\nconvert.hcg.hsv = function (hcg) {\n\tconst c = hcg[1] / 100;\n\tconst g = hcg[2] / 100;\n\n\tconst v = c + g * (1.0 - c);\n\tlet f = 0;\n\n\tif (v > 0.0) {\n\t\tf = c / v;\n\t}\n\n\treturn [hcg[0], f * 100, v * 100];\n};\n\nconvert.hcg.hsl = function (hcg) {\n\tconst c = hcg[1] / 100;\n\tconst g = hcg[2] / 100;\n\n\tconst l = g * (1.0 - c) + 0.5 * c;\n\tlet s = 0;\n\n\tif (l > 0.0 && l < 0.5) {\n\t\ts = c / (2 * l);\n\t} else\n\tif (l >= 0.5 && l < 1.0) {\n\t\ts = c / (2 * (1 - l));\n\t}\n\n\treturn [hcg[0], s * 100, l * 100];\n};\n\nconvert.hcg.hwb = function (hcg) {\n\tconst c = hcg[1] / 100;\n\tconst g = hcg[2] / 100;\n\tconst v = c + g * (1.0 - c);\n\treturn [hcg[0], (v - c) * 100, (1 - v) * 100];\n};\n\nconvert.hwb.hcg = function (hwb) {\n\tconst w = hwb[1] / 100;\n\tconst b = hwb[2] / 100;\n\tconst v = 1 - b;\n\tconst c = v - w;\n\tlet g = 0;\n\n\tif (c < 1) {\n\t\tg = (v - c) / (1 - c);\n\t}\n\n\treturn [hwb[0], c * 100, g * 100];\n};\n\nconvert.apple.rgb = function (apple) {\n\treturn [(apple[0] / 65535) * 255, (apple[1] / 65535) * 255, (apple[2] / 65535) * 255];\n};\n\nconvert.rgb.apple = function (rgb) {\n\treturn [(rgb[0] / 255) * 65535, (rgb[1] / 255) * 65535, (rgb[2] / 255) * 65535];\n};\n\nconvert.gray.rgb = function (args) {\n\treturn [args[0] / 100 * 255, args[0] / 100 * 255, args[0] / 100 * 255];\n};\n\nconvert.gray.hsl = function (args) {\n\treturn [0, 0, args[0]];\n};\n\nconvert.gray.hsv = convert.gray.hsl;\n\nconvert.gray.hwb = function (gray) {\n\treturn [0, 100, gray[0]];\n};\n\nconvert.gray.cmyk = function (gray) {\n\treturn [0, 0, 0, gray[0]];\n};\n\nconvert.gray.lab = function (gray) {\n\treturn [gray[0], 0, 0];\n};\n\nconvert.gray.hex = function (gray) {\n\tconst val = Math.round(gray[0] / 100 * 255) & 0xFF;\n\tconst integer = (val << 16) + (val << 8) + val;\n\n\tconst string = integer.toString(16).toUpperCase();\n\treturn '000000'.substring(string.length) + string;\n};\n\nconvert.rgb.gray = function (rgb) {\n\tconst val = (rgb[0] + rgb[1] + rgb[2]) / 3;\n\treturn [val / 255 * 100];\n};\n","const conversions = require('./conversions');\n\n/*\n\tThis function routes a model to all other models.\n\n\tall functions that are routed have a property `.conversion` attached\n\tto the returned synthetic function. This property is an array\n\tof strings, each with the steps in between the 'from' and 'to'\n\tcolor models (inclusive).\n\n\tconversions that are not possible simply are not included.\n*/\n\nfunction buildGraph() {\n\tconst graph = {};\n\t// https://jsperf.com/object-keys-vs-for-in-with-closure/3\n\tconst models = Object.keys(conversions);\n\n\tfor (let len = models.length, i = 0; i < len; i++) {\n\t\tgraph[models[i]] = {\n\t\t\t// http://jsperf.com/1-vs-infinity\n\t\t\t// micro-opt, but this is simple.\n\t\t\tdistance: -1,\n\t\t\tparent: null\n\t\t};\n\t}\n\n\treturn graph;\n}\n\n// https://en.wikipedia.org/wiki/Breadth-first_search\nfunction deriveBFS(fromModel) {\n\tconst graph = buildGraph();\n\tconst queue = [fromModel]; // Unshift -> queue -> pop\n\n\tgraph[fromModel].distance = 0;\n\n\twhile (queue.length) {\n\t\tconst current = queue.pop();\n\t\tconst adjacents = Object.keys(conversions[current]);\n\n\t\tfor (let len = adjacents.length, i = 0; i < len; i++) {\n\t\t\tconst adjacent = adjacents[i];\n\t\t\tconst node = graph[adjacent];\n\n\t\t\tif (node.distance === -1) {\n\t\t\t\tnode.distance = graph[current].distance + 1;\n\t\t\t\tnode.parent = current;\n\t\t\t\tqueue.unshift(adjacent);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn graph;\n}\n\nfunction link(from, to) {\n\treturn function (args) {\n\t\treturn to(from(args));\n\t};\n}\n\nfunction wrapConversion(toModel, graph) {\n\tconst path = [graph[toModel].parent, toModel];\n\tlet fn = conversions[graph[toModel].parent][toModel];\n\n\tlet cur = graph[toModel].parent;\n\twhile (graph[cur].parent) {\n\t\tpath.unshift(graph[cur].parent);\n\t\tfn = link(conversions[graph[cur].parent][cur], fn);\n\t\tcur = graph[cur].parent;\n\t}\n\n\tfn.conversion = path;\n\treturn fn;\n}\n\nmodule.exports = function (fromModel) {\n\tconst graph = deriveBFS(fromModel);\n\tconst conversion = {};\n\n\tconst models = Object.keys(graph);\n\tfor (let len = models.length, i = 0; i < len; i++) {\n\t\tconst toModel = models[i];\n\t\tconst node = graph[toModel];\n\n\t\tif (node.parent === null) {\n\t\t\t// No possible conversion, or this node is the source model.\n\t\t\tcontinue;\n\t\t}\n\n\t\tconversion[toModel] = wrapConversion(toModel, graph);\n\t}\n\n\treturn conversion;\n};\n\n","const conversions = require('./conversions');\nconst route = require('./route');\n\nconst convert = {};\n\nconst models = Object.keys(conversions);\n\nfunction wrapRaw(fn) {\n\tconst wrappedFn = function (...args) {\n\t\tconst arg0 = args[0];\n\t\tif (arg0 === undefined || arg0 === null) {\n\t\t\treturn arg0;\n\t\t}\n\n\t\tif (arg0.length > 1) {\n\t\t\targs = arg0;\n\t\t}\n\n\t\treturn fn(args);\n\t};\n\n\t// Preserve .conversion property if there is one\n\tif ('conversion' in fn) {\n\t\twrappedFn.conversion = fn.conversion;\n\t}\n\n\treturn wrappedFn;\n}\n\nfunction wrapRounded(fn) {\n\tconst wrappedFn = function (...args) {\n\t\tconst arg0 = args[0];\n\n\t\tif (arg0 === undefined || arg0 === null) {\n\t\t\treturn arg0;\n\t\t}\n\n\t\tif (arg0.length > 1) {\n\t\t\targs = arg0;\n\t\t}\n\n\t\tconst result = fn(args);\n\n\t\t// We're assuming the result is an array here.\n\t\t// see notice in conversions.js; don't use box types\n\t\t// in conversion functions.\n\t\tif (typeof result === 'object') {\n\t\t\tfor (let len = result.length, i = 0; i < len; i++) {\n\t\t\t\tresult[i] = Math.round(result[i]);\n\t\t\t}\n\t\t}\n\n\t\treturn result;\n\t};\n\n\t// Preserve .conversion property if there is one\n\tif ('conversion' in fn) {\n\t\twrappedFn.conversion = fn.conversion;\n\t}\n\n\treturn wrappedFn;\n}\n\nmodels.forEach(fromModel => {\n\tconvert[fromModel] = {};\n\n\tObject.defineProperty(convert[fromModel], 'channels', {value: conversions[fromModel].channels});\n\tObject.defineProperty(convert[fromModel], 'labels', {value: conversions[fromModel].labels});\n\n\tconst routes = route(fromModel);\n\tconst routeModels = Object.keys(routes);\n\n\trouteModels.forEach(toModel => {\n\t\tconst fn = routes[toModel];\n\n\t\tconvert[fromModel][toModel] = wrapRounded(fn);\n\t\tconvert[fromModel][toModel].raw = wrapRaw(fn);\n\t});\n});\n\nmodule.exports = convert;\n","const colorString = require('color-string');\nconst convert = require('color-convert');\n\nconst _slice = [].slice;\n\nconst skippedModels = [\n\t// To be honest, I don't really feel like keyword belongs in color convert, but eh.\n\t'keyword',\n\n\t// Gray conflicts with some method names, and has its own method defined.\n\t'gray',\n\n\t// Shouldn't really be in color-convert either...\n\t'hex',\n];\n\nconst hashedModelKeys = {};\nfor (const model of Object.keys(convert)) {\n\thashedModelKeys[_slice.call(convert[model].labels).sort().join('')] = model;\n}\n\nconst limiters = {};\n\nfunction Color(object, model) {\n\tif (!(this instanceof Color)) {\n\t\treturn new Color(object, model);\n\t}\n\n\tif (model && model in skippedModels) {\n\t\tmodel = null;\n\t}\n\n\tif (model && !(model in convert)) {\n\t\tthrow new Error('Unknown model: ' + model);\n\t}\n\n\tlet i;\n\tlet channels;\n\n\tif (object == null) { // eslint-disable-line no-eq-null,eqeqeq\n\t\tthis.model = 'rgb';\n\t\tthis.color = [0, 0, 0];\n\t\tthis.valpha = 1;\n\t} else if (object instanceof Color) {\n\t\tthis.model = object.model;\n\t\tthis.color = object.color.slice();\n\t\tthis.valpha = object.valpha;\n\t} else if (typeof object === 'string') {\n\t\tconst result = colorString.get(object);\n\t\tif (result === null) {\n\t\t\tthrow new Error('Unable to parse color from string: ' + object);\n\t\t}\n\n\t\tthis.model = result.model;\n\t\tchannels = convert[this.model].channels;\n\t\tthis.color = result.value.slice(0, channels);\n\t\tthis.valpha = typeof result.value[channels] === 'number' ? result.value[channels] : 1;\n\t} else if (object.length > 0) {\n\t\tthis.model = model || 'rgb';\n\t\tchannels = convert[this.model].channels;\n\t\tconst newArray = _slice.call(object, 0, channels);\n\t\tthis.color = zeroArray(newArray, channels);\n\t\tthis.valpha = typeof object[channels] === 'number' ? object[channels] : 1;\n\t} else if (typeof object === 'number') {\n\t\t// This is always RGB - can be converted later on.\n\t\tthis.model = 'rgb';\n\t\tthis.color = [\n\t\t\t(object >> 16) & 0xFF,\n\t\t\t(object >> 8) & 0xFF,\n\t\t\tobject & 0xFF,\n\t\t];\n\t\tthis.valpha = 1;\n\t} else {\n\t\tthis.valpha = 1;\n\n\t\tconst keys = Object.keys(object);\n\t\tif ('alpha' in object) {\n\t\t\tkeys.splice(keys.indexOf('alpha'), 1);\n\t\t\tthis.valpha = typeof object.alpha === 'number' ? object.alpha : 0;\n\t\t}\n\n\t\tconst hashedKeys = keys.sort().join('');\n\t\tif (!(hashedKeys in hashedModelKeys)) {\n\t\t\tthrow new Error('Unable to parse color from object: ' + JSON.stringify(object));\n\t\t}\n\n\t\tthis.model = hashedModelKeys[hashedKeys];\n\n\t\tconst labels = convert[this.model].labels;\n\t\tconst color = [];\n\t\tfor (i = 0; i < labels.length; i++) {\n\t\t\tcolor.push(object[labels[i]]);\n\t\t}\n\n\t\tthis.color = zeroArray(color);\n\t}\n\n\t// Perform limitations (clamping, etc.)\n\tif (limiters[this.model]) {\n\t\tchannels = convert[this.model].channels;\n\t\tfor (i = 0; i < channels; i++) {\n\t\t\tconst limit = limiters[this.model][i];\n\t\t\tif (limit) {\n\t\t\t\tthis.color[i] = limit(this.color[i]);\n\t\t\t}\n\t\t}\n\t}\n\n\tthis.valpha = Math.max(0, Math.min(1, this.valpha));\n\n\tif (Object.freeze) {\n\t\tObject.freeze(this);\n\t}\n}\n\nColor.prototype = {\n\ttoString() {\n\t\treturn this.string();\n\t},\n\n\ttoJSON() {\n\t\treturn this[this.model]();\n\t},\n\n\tstring(places) {\n\t\tlet self = this.model in colorString.to ? this : this.rgb();\n\t\tself = self.round(typeof places === 'number' ? places : 1);\n\t\tconst args = self.valpha === 1 ? self.color : self.color.concat(this.valpha);\n\t\treturn colorString.to[self.model](args);\n\t},\n\n\tpercentString(places) {\n\t\tconst self = this.rgb().round(typeof places === 'number' ? places : 1);\n\t\tconst args = self.valpha === 1 ? self.color : self.color.concat(this.valpha);\n\t\treturn colorString.to.rgb.percent(args);\n\t},\n\n\tarray() {\n\t\treturn this.valpha === 1 ? this.color.slice() : this.color.concat(this.valpha);\n\t},\n\n\tobject() {\n\t\tconst result = {};\n\t\tconst channels = convert[this.model].channels;\n\t\tconst labels = convert[this.model].labels;\n\n\t\tfor (let i = 0; i < channels; i++) {\n\t\t\tresult[labels[i]] = this.color[i];\n\t\t}\n\n\t\tif (this.valpha !== 1) {\n\t\t\tresult.alpha = this.valpha;\n\t\t}\n\n\t\treturn result;\n\t},\n\n\tunitArray() {\n\t\tconst rgb = this.rgb().color;\n\t\trgb[0] /= 255;\n\t\trgb[1] /= 255;\n\t\trgb[2] /= 255;\n\n\t\tif (this.valpha !== 1) {\n\t\t\trgb.push(this.valpha);\n\t\t}\n\n\t\treturn rgb;\n\t},\n\n\tunitObject() {\n\t\tconst rgb = this.rgb().object();\n\t\trgb.r /= 255;\n\t\trgb.g /= 255;\n\t\trgb.b /= 255;\n\n\t\tif (this.valpha !== 1) {\n\t\t\trgb.alpha = this.valpha;\n\t\t}\n\n\t\treturn rgb;\n\t},\n\n\tround(places) {\n\t\tplaces = Math.max(places || 0, 0);\n\t\treturn new Color(this.color.map(roundToPlace(places)).concat(this.valpha), this.model);\n\t},\n\n\talpha(value) {\n\t\tif (arguments.length > 0) {\n\t\t\treturn new Color(this.color.concat(Math.max(0, Math.min(1, value))), this.model);\n\t\t}\n\n\t\treturn this.valpha;\n\t},\n\n\t// Rgb\n\tred: getset('rgb', 0, maxfn(255)),\n\tgreen: getset('rgb', 1, maxfn(255)),\n\tblue: getset('rgb', 2, maxfn(255)),\n\n\thue: getset(['hsl', 'hsv', 'hsl', 'hwb', 'hcg'], 0, value => ((value % 360) + 360) % 360),\n\n\tsaturationl: getset('hsl', 1, maxfn(100)),\n\tlightness: getset('hsl', 2, maxfn(100)),\n\n\tsaturationv: getset('hsv', 1, maxfn(100)),\n\tvalue: getset('hsv', 2, maxfn(100)),\n\n\tchroma: getset('hcg', 1, maxfn(100)),\n\tgray: getset('hcg', 2, maxfn(100)),\n\n\twhite: getset('hwb', 1, maxfn(100)),\n\twblack: getset('hwb', 2, maxfn(100)),\n\n\tcyan: getset('cmyk', 0, maxfn(100)),\n\tmagenta: getset('cmyk', 1, maxfn(100)),\n\tyellow: getset('cmyk', 2, maxfn(100)),\n\tblack: getset('cmyk', 3, maxfn(100)),\n\n\tx: getset('xyz', 0, maxfn(100)),\n\ty: getset('xyz', 1, maxfn(100)),\n\tz: getset('xyz', 2, maxfn(100)),\n\n\tl: getset('lab', 0, maxfn(100)),\n\ta: getset('lab', 1),\n\tb: getset('lab', 2),\n\n\tkeyword(value) {\n\t\tif (arguments.length > 0) {\n\t\t\treturn new Color(value);\n\t\t}\n\n\t\treturn convert[this.model].keyword(this.color);\n\t},\n\n\thex(value) {\n\t\tif (arguments.length > 0) {\n\t\t\treturn new Color(value);\n\t\t}\n\n\t\treturn colorString.to.hex(this.rgb().round().color);\n\t},\n\n\thexa(value) {\n\t\tif (arguments.length > 0) {\n\t\t\treturn new Color(value);\n\t\t}\n\n\t\tconst rgbArray = this.rgb().round().color;\n\n\t\tlet alphaHex = Math.round(this.valpha * 255).toString(16).toUpperCase();\n\t\tif (alphaHex.length === 1) {\n\t\t\talphaHex = '0' + alphaHex;\n\t\t}\n\n\t\treturn colorString.to.hex(rgbArray) + alphaHex;\n\t},\n\n\trgbNumber() {\n\t\tconst rgb = this.rgb().color;\n\t\treturn ((rgb[0] & 0xFF) << 16) | ((rgb[1] & 0xFF) << 8) | (rgb[2] & 0xFF);\n\t},\n\n\tluminosity() {\n\t\t// http://www.w3.org/TR/WCAG20/#relativeluminancedef\n\t\tconst rgb = this.rgb().color;\n\n\t\tconst lum = [];\n\t\tfor (const [i, element] of rgb.entries()) {\n\t\t\tconst chan = element / 255;\n\t\t\tlum[i] = (chan <= 0.039_28) ? chan / 12.92 : ((chan + 0.055) / 1.055) ** 2.4;\n\t\t}\n\n\t\treturn 0.2126 * lum[0] + 0.7152 * lum[1] + 0.0722 * lum[2];\n\t},\n\n\tcontrast(color2) {\n\t\t// http://www.w3.org/TR/WCAG20/#contrast-ratiodef\n\t\tconst lum1 = this.luminosity();\n\t\tconst lum2 = color2.luminosity();\n\n\t\tif (lum1 > lum2) {\n\t\t\treturn (lum1 + 0.05) / (lum2 + 0.05);\n\t\t}\n\n\t\treturn (lum2 + 0.05) / (lum1 + 0.05);\n\t},\n\n\tlevel(color2) {\n\t\tconst contrastRatio = this.contrast(color2);\n\t\tif (contrastRatio >= 7.1) {\n\t\t\treturn 'AAA';\n\t\t}\n\n\t\treturn (contrastRatio >= 4.5) ? 'AA' : '';\n\t},\n\n\tisDark() {\n\t\t// YIQ equation from http://24ways.org/2010/calculating-color-contrast\n\t\tconst rgb = this.rgb().color;\n\t\tconst yiq = (rgb[0] * 299 + rgb[1] * 587 + rgb[2] * 114) / 1000;\n\t\treturn yiq < 128;\n\t},\n\n\tisLight() {\n\t\treturn !this.isDark();\n\t},\n\n\tnegate() {\n\t\tconst rgb = this.rgb();\n\t\tfor (let i = 0; i < 3; i++) {\n\t\t\trgb.color[i] = 255 - rgb.color[i];\n\t\t}\n\n\t\treturn rgb;\n\t},\n\n\tlighten(ratio) {\n\t\tconst hsl = this.hsl();\n\t\thsl.color[2] += hsl.color[2] * ratio;\n\t\treturn hsl;\n\t},\n\n\tdarken(ratio) {\n\t\tconst hsl = this.hsl();\n\t\thsl.color[2] -= hsl.color[2] * ratio;\n\t\treturn hsl;\n\t},\n\n\tsaturate(ratio) {\n\t\tconst hsl = this.hsl();\n\t\thsl.color[1] += hsl.color[1] * ratio;\n\t\treturn hsl;\n\t},\n\n\tdesaturate(ratio) {\n\t\tconst hsl = this.hsl();\n\t\thsl.color[1] -= hsl.color[1] * ratio;\n\t\treturn hsl;\n\t},\n\n\twhiten(ratio) {\n\t\tconst hwb = this.hwb();\n\t\thwb.color[1] += hwb.color[1] * ratio;\n\t\treturn hwb;\n\t},\n\n\tblacken(ratio) {\n\t\tconst hwb = this.hwb();\n\t\thwb.color[2] += hwb.color[2] * ratio;\n\t\treturn hwb;\n\t},\n\n\tgrayscale() {\n\t\t// http://en.wikipedia.org/wiki/Grayscale#Converting_color_to_grayscale\n\t\tconst rgb = this.rgb().color;\n\t\tconst value = rgb[0] * 0.3 + rgb[1] * 0.59 + rgb[2] * 0.11;\n\t\treturn Color.rgb(value, value, value);\n\t},\n\n\tfade(ratio) {\n\t\treturn this.alpha(this.valpha - (this.valpha * ratio));\n\t},\n\n\topaquer(ratio) {\n\t\treturn this.alpha(this.valpha + (this.valpha * ratio));\n\t},\n\n\trotate(degrees) {\n\t\tconst hsl = this.hsl();\n\t\tlet hue = hsl.color[0];\n\t\thue = (hue + degrees) % 360;\n\t\thue = hue < 0 ? 360 + hue : hue;\n\t\thsl.color[0] = hue;\n\t\treturn hsl;\n\t},\n\n\tmix(mixinColor, weight) {\n\t\t// Ported from sass implementation in C\n\t\t// https://github.com/sass/libsass/blob/0e6b4a2850092356aa3ece07c6b249f0221caced/functions.cpp#L209\n\t\tif (!mixinColor || !mixinColor.rgb) {\n\t\t\tthrow new Error('Argument to \"mix\" was not a Color instance, but rather an instance of ' + typeof mixinColor);\n\t\t}\n\n\t\tconst color1 = mixinColor.rgb();\n\t\tconst color2 = this.rgb();\n\t\tconst p = weight === undefined ? 0.5 : weight;\n\n\t\tconst w = 2 * p - 1;\n\t\tconst a = color1.alpha() - color2.alpha();\n\n\t\tconst w1 = (((w * a === -1) ? w : (w + a) / (1 + w * a)) + 1) / 2;\n\t\tconst w2 = 1 - w1;\n\n\t\treturn Color.rgb(\n\t\t\tw1 * color1.red() + w2 * color2.red(),\n\t\t\tw1 * color1.green() + w2 * color2.green(),\n\t\t\tw1 * color1.blue() + w2 * color2.blue(),\n\t\t\tcolor1.alpha() * p + color2.alpha() * (1 - p));\n\t},\n};\n\n// Model conversion methods and static constructors\nfor (const model of Object.keys(convert)) {\n\tif (skippedModels.includes(model)) {\n\t\tcontinue;\n\t}\n\n\tconst channels = convert[model].channels;\n\n\t// Conversion methods\n\tColor.prototype[model] = function () {\n\t\tif (this.model === model) {\n\t\t\treturn new Color(this);\n\t\t}\n\n\t\tif (arguments.length > 0) {\n\t\t\treturn new Color(arguments, model);\n\t\t}\n\n\t\tconst newAlpha = typeof arguments[channels] === 'number' ? channels : this.valpha;\n\t\treturn new Color(assertArray(convert[this.model][model].raw(this.color)).concat(newAlpha), model);\n\t};\n\n\t// 'static' construction methods\n\tColor[model] = function (color) {\n\t\tif (typeof color === 'number') {\n\t\t\tcolor = zeroArray(_slice.call(arguments), channels);\n\t\t}\n\n\t\treturn new Color(color, model);\n\t};\n}\n\nfunction roundTo(number, places) {\n\treturn Number(number.toFixed(places));\n}\n\nfunction roundToPlace(places) {\n\treturn function (number) {\n\t\treturn roundTo(number, places);\n\t};\n}\n\nfunction getset(model, channel, modifier) {\n\tmodel = Array.isArray(model) ? model : [model];\n\n\tfor (const m of model) {\n\t\t(limiters[m] || (limiters[m] = []))[channel] = modifier;\n\t}\n\n\tmodel = model[0];\n\n\treturn function (value) {\n\t\tlet result;\n\n\t\tif (arguments.length > 0) {\n\t\t\tif (modifier) {\n\t\t\t\tvalue = modifier(value);\n\t\t\t}\n\n\t\t\tresult = this[model]();\n\t\t\tresult.color[channel] = value;\n\t\t\treturn result;\n\t\t}\n\n\t\tresult = this[model]().color[channel];\n\t\tif (modifier) {\n\t\t\tresult = modifier(result);\n\t\t}\n\n\t\treturn result;\n\t};\n}\n\nfunction maxfn(max) {\n\treturn function (v) {\n\t\treturn Math.max(0, Math.min(max, v));\n\t};\n}\n\nfunction assertArray(value) {\n\treturn Array.isArray(value) ? value : [value];\n}\n\nfunction zeroArray(array, length) {\n\tfor (let i = 0; i < length; i++) {\n\t\tif (typeof array[i] !== 'number') {\n\t\t\tarray[i] = 0;\n\t\t}\n\t}\n\n\treturn array;\n}\n\nmodule.exports = Color;\n","import color from 'color';\nimport {useStore} from '../state/store';\nimport {PixieTheme} from '../config/default-config';\nimport {DEFAULT_THEMES} from '../config/default-themes';\n\nexport function initThemes(rootEl: HTMLElement, activeTheme?: PixieTheme) {\n  if (!activeTheme) return;\n\n  const defaultTheme = activeTheme.isDark\n    ? DEFAULT_THEMES.find(t => t.isDark)!\n    : DEFAULT_THEMES.find(t => !t.isDark)!;\n\n  const mergedTheme = {\n    ...defaultTheme,\n    ...activeTheme,\n    colors: {\n      ...defaultTheme.colors,\n      ...activeTheme.colors,\n    },\n  };\n\n  Object.entries(mergedTheme.colors).forEach(([key, value]) => {\n    rootEl.style.setProperty(key, parseThemeValue(value));\n  });\n  if (activeTheme.isDark) {\n    rootEl.classList.add('dark');\n  } else {\n    rootEl.classList.remove('dark');\n  }\n}\n\nfunction parseThemeValue(value: string) {\n  // opacity or rgb string: 0 0 0\n  if (value.endsWith('%') || value.split(' ').length === 3) {\n    return value;\n  }\n  // convert user provided color to rgb string\n  return color(value).rgb().array().slice(0, 3).join(' ');\n}\n\nexport function useActiveTheme() {\n  const activeTheme = useStore(s => s.config.ui?.activeTheme);\n  return useStore(s =>\n    (s.config.ui?.themes || []).find(t => t.name === activeTheme)\n  );\n}\n","import React, {RefObject} from 'react';\nimport {Placement} from '@floating-ui/react-dom';\n\ninterface IOverlayPositionContext {\n  boundary?: RefObject<HTMLElement>;\n  portalContainer?: RefObject<HTMLElement>;\n  placement?: Placement;\n  shouldFlip?: boolean;\n  maxHeight?: string;\n}\n\nexport const OverlayPositionContext =\n  React.createContext<IOverlayPositionContext | null>(null);\n","import {HTMLMotionProps} from 'framer-motion';\n\nexport const toolbarStyle =\n  'flex flex-shrink-0 items-center justify-between px-12 py-[9px] w-full h-[54px]';\n\nexport const toolbarAnimation: HTMLMotionProps<'div'> = {\n  initial: {opacity: 0},\n  animate: {opacity: 1},\n  exit: {opacity: 0, position: 'absolute'},\n  transition: {type: 'tween', duration: 0.15},\n};\n","export type ButtonSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl';\n\nexport function getButtonSizeStyle(\n  size?: ButtonSize,\n  {padding, equalWidth}: {padding?: string; equalWidth?: boolean} = {}\n): string {\n  switch (size) {\n    case 'xs':\n      return `text-xs h-30 ${equalWidth ? 'w-30' : padding || 'px-14'}`;\n    case 'sm':\n      return `text-sm h-36 ${equalWidth ? 'w-36' : padding || 'px-18'}`;\n    case 'lg':\n      return `text-lg h-50 ${equalWidth ? 'w-50' : padding || 'px-26'}`;\n    case 'xl':\n      return `text-xl h-60 ${equalWidth ? 'w-60' : padding || 'px-32'}`;\n    case 'md':\n      return `text-base h-42 ${equalWidth ? 'w-42' : padding || 'px-22'}`;\n    default:\n      return '';\n  }\n}\n\nexport function getIconSizeStyle(size?: ButtonSize): string {\n  switch (size) {\n    case 'xs':\n      return 'icon-xs';\n    case 'sm':\n      return 'icon-sm';\n    case 'md':\n      return 'icon-md';\n    case 'lg':\n      return 'icon-lg';\n    case 'xl':\n      return 'icon-xl';\n    default:\n      return '';\n  }\n}\n","import $6saFI$react, {useRef as $6saFI$useRef, useContext as $6saFI$useContext, useEffect as $6saFI$useEffect, useState as $6saFI$useState} from \"react\";\nimport {useLayoutEffect as $6saFI$useLayoutEffect, runAfterTransition as $6saFI$runAfterTransition, focusWithoutScrolling as $6saFI$focusWithoutScrolling, mergeProps as $6saFI$mergeProps, useSyncRef as $6saFI$useSyncRef} from \"@react-aria/utils\";\nimport {getInteractionModality as $6saFI$getInteractionModality, isFocusVisible as $6saFI$isFocusVisible, useFocusVisibleListener as $6saFI$useFocusVisibleListener, useFocus as $6saFI$useFocus, useFocusWithin as $6saFI$useFocusWithin, useKeyboard as $6saFI$useKeyboard} from \"@react-aria/interactions\";\nimport $6saFI$clsx from \"clsx\";\n\nfunction $parcel$export(e, n, v, s) {\n  Object.defineProperty(e, n, {get: v, set: s, enumerable: true, configurable: true});\n}\nvar $14e5c84cbc2e6e2e$exports = {};\n\n$parcel$export($14e5c84cbc2e6e2e$exports, \"FocusScope\", () => $14e5c84cbc2e6e2e$export$20e40289641fbbb6);\n$parcel$export($14e5c84cbc2e6e2e$exports, \"useFocusManager\", () => $14e5c84cbc2e6e2e$export$10c5169755ce7bd7);\n$parcel$export($14e5c84cbc2e6e2e$exports, \"getFocusableTreeWalker\", () => $14e5c84cbc2e6e2e$export$2d6ec8fc375ceafa);\n$parcel$export($14e5c84cbc2e6e2e$exports, \"createFocusManager\", () => $14e5c84cbc2e6e2e$export$c5251b9e124bf29);\nvar $1159c3b6ba210e4f$exports = {};\n\n$parcel$export($1159c3b6ba210e4f$exports, \"focusSafely\", () => $1159c3b6ba210e4f$export$80f3e147d781571c);\n\n\nfunction $1159c3b6ba210e4f$export$80f3e147d781571c(element) {\n    // If the user is interacting with a virtual cursor, e.g. screen reader, then\n    // wait until after any animated transitions that are currently occurring on\n    // the page before shifting focus. This avoids issues with VoiceOver on iOS\n    // causing the page to scroll when moving focus if the element is transitioning\n    // from off the screen.\n    if ($6saFI$getInteractionModality() === 'virtual') {\n        let lastFocusedElement = document.activeElement;\n        $6saFI$runAfterTransition(()=>{\n            // If focus did not move and the element is still in the document, focus it.\n            if (document.activeElement === lastFocusedElement && document.contains(element)) $6saFI$focusWithoutScrolling(element);\n        });\n    } else $6saFI$focusWithoutScrolling(element);\n}\n\n\n/*\n * Copyright 2021 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */ function $985a2847ebcbb615$var$isStyleVisible(element) {\n    if (!(element instanceof HTMLElement) && !(element instanceof SVGElement)) return false;\n    let { display: display , visibility: visibility  } = element.style;\n    let isVisible = display !== 'none' && visibility !== 'hidden' && visibility !== 'collapse';\n    if (isVisible) {\n        const { getComputedStyle: getComputedStyle  } = element.ownerDocument.defaultView;\n        let { display: computedDisplay , visibility: computedVisibility  } = getComputedStyle(element);\n        isVisible = computedDisplay !== 'none' && computedVisibility !== 'hidden' && computedVisibility !== 'collapse';\n    }\n    return isVisible;\n}\nfunction $985a2847ebcbb615$var$isAttributeVisible(element, childElement) {\n    return !element.hasAttribute('hidden') && (element.nodeName === 'DETAILS' && childElement && childElement.nodeName !== 'SUMMARY' ? element.hasAttribute('open') : true);\n}\nfunction $985a2847ebcbb615$export$e989c0fffaa6b27a(element, childElement) {\n    return element.nodeName !== '#comment' && $985a2847ebcbb615$var$isStyleVisible(element) && $985a2847ebcbb615$var$isAttributeVisible(element, childElement) && (!element.parentElement || $985a2847ebcbb615$export$e989c0fffaa6b27a(element.parentElement, element));\n}\n\n\n\n\nconst $14e5c84cbc2e6e2e$var$FocusContext = /*#__PURE__*/ $6saFI$react.createContext(null);\nlet $14e5c84cbc2e6e2e$var$activeScope = null;\nlet $14e5c84cbc2e6e2e$var$scopes = new Map();\nfunction $14e5c84cbc2e6e2e$export$20e40289641fbbb6(props) {\n    let { children: children , contain: contain , restoreFocus: restoreFocus , autoFocus: autoFocus  } = props;\n    let startRef = $6saFI$useRef();\n    let endRef = $6saFI$useRef();\n    let scopeRef = $6saFI$useRef([]);\n    let ctx = $6saFI$useContext($14e5c84cbc2e6e2e$var$FocusContext);\n    let parentScope = ctx === null || ctx === void 0 ? void 0 : ctx.scopeRef;\n    $6saFI$useLayoutEffect(()=>{\n        // Find all rendered nodes between the sentinels and add them to the scope.\n        let node = startRef.current.nextSibling;\n        let nodes = [];\n        while(node && node !== endRef.current){\n            nodes.push(node);\n            node = node.nextSibling;\n        }\n        scopeRef.current = nodes;\n    }, [\n        children,\n        parentScope\n    ]);\n    $6saFI$useLayoutEffect(()=>{\n        $14e5c84cbc2e6e2e$var$scopes.set(scopeRef, parentScope);\n        return ()=>{\n            // Restore the active scope on unmount if this scope or a descendant scope is active.\n            // Parent effect cleanups run before children, so we need to check if the\n            // parent scope actually still exists before restoring the active scope to it.\n            if ((scopeRef === $14e5c84cbc2e6e2e$var$activeScope || $14e5c84cbc2e6e2e$var$isAncestorScope(scopeRef, $14e5c84cbc2e6e2e$var$activeScope)) && (!parentScope || $14e5c84cbc2e6e2e$var$scopes.has(parentScope))) $14e5c84cbc2e6e2e$var$activeScope = parentScope;\n            $14e5c84cbc2e6e2e$var$scopes.delete(scopeRef);\n        };\n    }, [\n        scopeRef,\n        parentScope\n    ]);\n    $14e5c84cbc2e6e2e$var$useFocusContainment(scopeRef, contain);\n    $14e5c84cbc2e6e2e$var$useRestoreFocus(scopeRef, restoreFocus, contain);\n    $14e5c84cbc2e6e2e$var$useAutoFocus(scopeRef, autoFocus);\n    let focusManager = $14e5c84cbc2e6e2e$var$createFocusManagerForScope(scopeRef);\n    return(/*#__PURE__*/ $6saFI$react.createElement($14e5c84cbc2e6e2e$var$FocusContext.Provider, {\n        value: {\n            scopeRef: scopeRef,\n            focusManager: focusManager\n        }\n    }, /*#__PURE__*/ $6saFI$react.createElement(\"span\", {\n        \"data-focus-scope-start\": true,\n        hidden: true,\n        ref: startRef\n    }), children, /*#__PURE__*/ $6saFI$react.createElement(\"span\", {\n        \"data-focus-scope-end\": true,\n        hidden: true,\n        ref: endRef\n    })));\n}\nfunction $14e5c84cbc2e6e2e$export$10c5169755ce7bd7() {\n    var ref;\n    return (ref = $6saFI$useContext($14e5c84cbc2e6e2e$var$FocusContext)) === null || ref === void 0 ? void 0 : ref.focusManager;\n}\nfunction $14e5c84cbc2e6e2e$var$createFocusManagerForScope(scopeRef) {\n    return {\n        focusNext (opts = {\n        }) {\n            let scope = scopeRef.current;\n            let { from: from , tabbable: tabbable , wrap: wrap  } = opts;\n            let node = from || document.activeElement;\n            let sentinel = scope[0].previousElementSibling;\n            let walker = $14e5c84cbc2e6e2e$export$2d6ec8fc375ceafa($14e5c84cbc2e6e2e$var$getScopeRoot(scope), {\n                tabbable: tabbable\n            }, scope);\n            walker.currentNode = $14e5c84cbc2e6e2e$var$isElementInScope(node, scope) ? node : sentinel;\n            let nextNode = walker.nextNode();\n            if (!nextNode && wrap) {\n                walker.currentNode = sentinel;\n                nextNode = walker.nextNode();\n            }\n            if (nextNode) $14e5c84cbc2e6e2e$var$focusElement(nextNode, true);\n            return nextNode;\n        },\n        focusPrevious (opts = {\n        }) {\n            let scope = scopeRef.current;\n            let { from: from , tabbable: tabbable , wrap: wrap  } = opts;\n            let node = from || document.activeElement;\n            let sentinel = scope[scope.length - 1].nextElementSibling;\n            let walker = $14e5c84cbc2e6e2e$export$2d6ec8fc375ceafa($14e5c84cbc2e6e2e$var$getScopeRoot(scope), {\n                tabbable: tabbable\n            }, scope);\n            walker.currentNode = $14e5c84cbc2e6e2e$var$isElementInScope(node, scope) ? node : sentinel;\n            let previousNode = walker.previousNode();\n            if (!previousNode && wrap) {\n                walker.currentNode = sentinel;\n                previousNode = walker.previousNode();\n            }\n            if (previousNode) $14e5c84cbc2e6e2e$var$focusElement(previousNode, true);\n            return previousNode;\n        },\n        focusFirst (opts = {\n        }) {\n            let scope = scopeRef.current;\n            let { tabbable: tabbable  } = opts;\n            let walker = $14e5c84cbc2e6e2e$export$2d6ec8fc375ceafa($14e5c84cbc2e6e2e$var$getScopeRoot(scope), {\n                tabbable: tabbable\n            }, scope);\n            walker.currentNode = scope[0].previousElementSibling;\n            let nextNode = walker.nextNode();\n            if (nextNode) $14e5c84cbc2e6e2e$var$focusElement(nextNode, true);\n            return nextNode;\n        },\n        focusLast (opts = {\n        }) {\n            let scope = scopeRef.current;\n            let { tabbable: tabbable  } = opts;\n            let walker = $14e5c84cbc2e6e2e$export$2d6ec8fc375ceafa($14e5c84cbc2e6e2e$var$getScopeRoot(scope), {\n                tabbable: tabbable\n            }, scope);\n            walker.currentNode = scope[scope.length - 1].nextElementSibling;\n            let previousNode = walker.previousNode();\n            if (previousNode) $14e5c84cbc2e6e2e$var$focusElement(previousNode, true);\n            return previousNode;\n        }\n    };\n}\nconst $14e5c84cbc2e6e2e$var$focusableElements = [\n    'input:not([disabled]):not([type=hidden])',\n    'select:not([disabled])',\n    'textarea:not([disabled])',\n    'button:not([disabled])',\n    'a[href]',\n    'area[href]',\n    'summary',\n    'iframe',\n    'object',\n    'embed',\n    'audio[controls]',\n    'video[controls]',\n    '[contenteditable]'\n];\nconst $14e5c84cbc2e6e2e$var$FOCUSABLE_ELEMENT_SELECTOR = $14e5c84cbc2e6e2e$var$focusableElements.join(':not([hidden]),') + ',[tabindex]:not([disabled]):not([hidden])';\n$14e5c84cbc2e6e2e$var$focusableElements.push('[tabindex]:not([tabindex=\"-1\"]):not([disabled])');\nconst $14e5c84cbc2e6e2e$var$TABBABLE_ELEMENT_SELECTOR = $14e5c84cbc2e6e2e$var$focusableElements.join(':not([hidden]):not([tabindex=\"-1\"]),');\nfunction $14e5c84cbc2e6e2e$var$getScopeRoot(scope) {\n    return scope[0].parentElement;\n}\nfunction $14e5c84cbc2e6e2e$var$useFocusContainment(scopeRef, contain) {\n    let focusedNode = $6saFI$useRef();\n    let raf = $6saFI$useRef(null);\n    $6saFI$useLayoutEffect(()=>{\n        let scope1 = scopeRef.current;\n        if (!contain) return;\n        // Handle the Tab key to contain focus within the scope\n        let onKeyDown = (e)=>{\n            if (e.key !== 'Tab' || e.altKey || e.ctrlKey || e.metaKey || scopeRef !== $14e5c84cbc2e6e2e$var$activeScope) return;\n            let focusedElement = document.activeElement;\n            let scope = scopeRef.current;\n            if (!$14e5c84cbc2e6e2e$var$isElementInScope(focusedElement, scope)) return;\n            let walker = $14e5c84cbc2e6e2e$export$2d6ec8fc375ceafa($14e5c84cbc2e6e2e$var$getScopeRoot(scope), {\n                tabbable: true\n            }, scope);\n            walker.currentNode = focusedElement;\n            let nextElement = e.shiftKey ? walker.previousNode() : walker.nextNode();\n            if (!nextElement) {\n                walker.currentNode = e.shiftKey ? scope[scope.length - 1].nextElementSibling : scope[0].previousElementSibling;\n                nextElement = e.shiftKey ? walker.previousNode() : walker.nextNode();\n            }\n            e.preventDefault();\n            if (nextElement) $14e5c84cbc2e6e2e$var$focusElement(nextElement, true);\n        };\n        let onFocus = (e)=>{\n            // If focusing an element in a child scope of the currently active scope, the child becomes active.\n            // Moving out of the active scope to an ancestor is not allowed.\n            if (!$14e5c84cbc2e6e2e$var$activeScope || $14e5c84cbc2e6e2e$var$isAncestorScope($14e5c84cbc2e6e2e$var$activeScope, scopeRef)) {\n                $14e5c84cbc2e6e2e$var$activeScope = scopeRef;\n                focusedNode.current = e.target;\n            } else if (scopeRef === $14e5c84cbc2e6e2e$var$activeScope && !$14e5c84cbc2e6e2e$var$isElementInChildScope(e.target, scopeRef)) {\n                // If a focus event occurs outside the active scope (e.g. user tabs from browser location bar),\n                // restore focus to the previously focused node or the first tabbable element in the active scope.\n                if (focusedNode.current) focusedNode.current.focus();\n                else if ($14e5c84cbc2e6e2e$var$activeScope) $14e5c84cbc2e6e2e$var$focusFirstInScope($14e5c84cbc2e6e2e$var$activeScope.current);\n            } else if (scopeRef === $14e5c84cbc2e6e2e$var$activeScope) focusedNode.current = e.target;\n        };\n        let onBlur = (e)=>{\n            // Firefox doesn't shift focus back to the Dialog properly without this\n            raf.current = requestAnimationFrame(()=>{\n                // Use document.activeElement instead of e.relatedTarget so we can tell if user clicked into iframe\n                if (scopeRef === $14e5c84cbc2e6e2e$var$activeScope && !$14e5c84cbc2e6e2e$var$isElementInChildScope(document.activeElement, scopeRef)) {\n                    $14e5c84cbc2e6e2e$var$activeScope = scopeRef;\n                    focusedNode.current = e.target;\n                    focusedNode.current.focus();\n                }\n            });\n        };\n        document.addEventListener('keydown', onKeyDown, false);\n        document.addEventListener('focusin', onFocus, false);\n        scope1.forEach((element)=>element.addEventListener('focusin', onFocus, false)\n        );\n        scope1.forEach((element)=>element.addEventListener('focusout', onBlur, false)\n        );\n        return ()=>{\n            document.removeEventListener('keydown', onKeyDown, false);\n            document.removeEventListener('focusin', onFocus, false);\n            scope1.forEach((element)=>element.removeEventListener('focusin', onFocus, false)\n            );\n            scope1.forEach((element)=>element.removeEventListener('focusout', onBlur, false)\n            );\n        };\n    }, [\n        scopeRef,\n        contain\n    ]);\n    // eslint-disable-next-line arrow-body-style\n    $6saFI$useEffect(()=>{\n        return ()=>cancelAnimationFrame(raf.current)\n        ;\n    }, [\n        raf\n    ]);\n}\nfunction $14e5c84cbc2e6e2e$var$isElementInAnyScope(element) {\n    for (let scope of $14e5c84cbc2e6e2e$var$scopes.keys()){\n        if ($14e5c84cbc2e6e2e$var$isElementInScope(element, scope.current)) return true;\n    }\n    return false;\n}\nfunction $14e5c84cbc2e6e2e$var$isElementInScope(element, scope) {\n    return scope.some((node)=>node.contains(element)\n    );\n}\nfunction $14e5c84cbc2e6e2e$var$isElementInChildScope(element, scope) {\n    // node.contains in isElementInScope covers child scopes that are also DOM children,\n    // but does not cover child scopes in portals.\n    for (let s of $14e5c84cbc2e6e2e$var$scopes.keys()){\n        if ((s === scope || $14e5c84cbc2e6e2e$var$isAncestorScope(scope, s)) && $14e5c84cbc2e6e2e$var$isElementInScope(element, s.current)) return true;\n    }\n    return false;\n}\nfunction $14e5c84cbc2e6e2e$var$isAncestorScope(ancestor, scope) {\n    let parent = $14e5c84cbc2e6e2e$var$scopes.get(scope);\n    if (!parent) return false;\n    if (parent === ancestor) return true;\n    return $14e5c84cbc2e6e2e$var$isAncestorScope(ancestor, parent);\n}\nfunction $14e5c84cbc2e6e2e$var$focusElement(element, scroll = false) {\n    if (element != null && !scroll) try {\n        $1159c3b6ba210e4f$export$80f3e147d781571c(element);\n    } catch (err) {\n    // ignore\n    }\n    else if (element != null) try {\n        element.focus();\n    } catch (err1) {\n    // ignore\n    }\n}\nfunction $14e5c84cbc2e6e2e$var$focusFirstInScope(scope) {\n    let sentinel = scope[0].previousElementSibling;\n    let walker = $14e5c84cbc2e6e2e$export$2d6ec8fc375ceafa($14e5c84cbc2e6e2e$var$getScopeRoot(scope), {\n        tabbable: true\n    }, scope);\n    walker.currentNode = sentinel;\n    $14e5c84cbc2e6e2e$var$focusElement(walker.nextNode());\n}\nfunction $14e5c84cbc2e6e2e$var$useAutoFocus(scopeRef, autoFocus) {\n    const autoFocusRef = $6saFI$react.useRef(autoFocus);\n    $6saFI$useEffect(()=>{\n        if (autoFocusRef.current) {\n            $14e5c84cbc2e6e2e$var$activeScope = scopeRef;\n            if (!$14e5c84cbc2e6e2e$var$isElementInScope(document.activeElement, $14e5c84cbc2e6e2e$var$activeScope.current)) $14e5c84cbc2e6e2e$var$focusFirstInScope(scopeRef.current);\n        }\n        autoFocusRef.current = false;\n    }, []);\n}\nfunction $14e5c84cbc2e6e2e$var$useRestoreFocus(scopeRef, restoreFocus, contain) {\n    // create a ref during render instead of useLayoutEffect so the active element is saved before a child with autoFocus=true mounts.\n    const nodeToRestoreRef = $6saFI$useRef(typeof document !== 'undefined' ? document.activeElement : null);\n    // useLayoutEffect instead of useEffect so the active element is saved synchronously instead of asynchronously.\n    $6saFI$useLayoutEffect(()=>{\n        let nodeToRestore = nodeToRestoreRef.current;\n        if (!restoreFocus) return;\n        // Handle the Tab key so that tabbing out of the scope goes to the next element\n        // after the node that had focus when the scope mounted. This is important when\n        // using portals for overlays, so that focus goes to the expected element when\n        // tabbing out of the overlay.\n        let onKeyDown = (e)=>{\n            if (e.key !== 'Tab' || e.altKey || e.ctrlKey || e.metaKey) return;\n            let focusedElement = document.activeElement;\n            if (!$14e5c84cbc2e6e2e$var$isElementInScope(focusedElement, scopeRef.current)) return;\n            // Create a DOM tree walker that matches all tabbable elements\n            let walker = $14e5c84cbc2e6e2e$export$2d6ec8fc375ceafa(document.body, {\n                tabbable: true\n            });\n            // Find the next tabbable element after the currently focused element\n            walker.currentNode = focusedElement;\n            let nextElement = e.shiftKey ? walker.previousNode() : walker.nextNode();\n            if (!document.body.contains(nodeToRestore) || nodeToRestore === document.body) nodeToRestore = null;\n            // If there is no next element, or it is outside the current scope, move focus to the\n            // next element after the node to restore to instead.\n            if ((!nextElement || !$14e5c84cbc2e6e2e$var$isElementInScope(nextElement, scopeRef.current)) && nodeToRestore) {\n                walker.currentNode = nodeToRestore;\n                // Skip over elements within the scope, in case the scope immediately follows the node to restore.\n                do nextElement = e.shiftKey ? walker.previousNode() : walker.nextNode();\n                while ($14e5c84cbc2e6e2e$var$isElementInScope(nextElement, scopeRef.current))\n                e.preventDefault();\n                e.stopPropagation();\n                if (nextElement) $14e5c84cbc2e6e2e$var$focusElement(nextElement, true);\n                else // If there is no next element and the nodeToRestore isn't within a FocusScope (i.e. we are leaving the top level focus scope)\n                // then move focus to the body.\n                // Otherwise restore focus to the nodeToRestore (e.g menu within a popover -> tabbing to close the menu should move focus to menu trigger)\n                if (!$14e5c84cbc2e6e2e$var$isElementInAnyScope(nodeToRestore)) focusedElement.blur();\n                else $14e5c84cbc2e6e2e$var$focusElement(nodeToRestore, true);\n            }\n        };\n        if (!contain) document.addEventListener('keydown', onKeyDown, true);\n        return ()=>{\n            if (!contain) document.removeEventListener('keydown', onKeyDown, true);\n            if (restoreFocus && nodeToRestore && $14e5c84cbc2e6e2e$var$isElementInScope(document.activeElement, scopeRef.current)) requestAnimationFrame(()=>{\n                if (document.body.contains(nodeToRestore)) $14e5c84cbc2e6e2e$var$focusElement(nodeToRestore);\n            });\n        };\n    }, [\n        scopeRef,\n        restoreFocus,\n        contain\n    ]);\n}\nfunction $14e5c84cbc2e6e2e$export$2d6ec8fc375ceafa(root, opts, scope) {\n    let selector = (opts === null || opts === void 0 ? void 0 : opts.tabbable) ? $14e5c84cbc2e6e2e$var$TABBABLE_ELEMENT_SELECTOR : $14e5c84cbc2e6e2e$var$FOCUSABLE_ELEMENT_SELECTOR;\n    let walker = document.createTreeWalker(root, NodeFilter.SHOW_ELEMENT, {\n        acceptNode (node) {\n            var ref;\n            // Skip nodes inside the starting node.\n            if (opts === null || opts === void 0 ? void 0 : (ref = opts.from) === null || ref === void 0 ? void 0 : ref.contains(node)) return NodeFilter.FILTER_REJECT;\n            if (node.matches(selector) && $985a2847ebcbb615$export$e989c0fffaa6b27a(node) && (!scope || $14e5c84cbc2e6e2e$var$isElementInScope(node, scope))) return NodeFilter.FILTER_ACCEPT;\n            return NodeFilter.FILTER_SKIP;\n        }\n    });\n    if (opts === null || opts === void 0 ? void 0 : opts.from) walker.currentNode = opts.from;\n    return walker;\n}\nfunction $14e5c84cbc2e6e2e$export$c5251b9e124bf29(ref) {\n    return {\n        focusNext (opts = {\n        }) {\n            let root = ref.current;\n            let { from: from , tabbable: tabbable , wrap: wrap  } = opts;\n            let node = from || document.activeElement;\n            let walker = $14e5c84cbc2e6e2e$export$2d6ec8fc375ceafa(root, {\n                tabbable: tabbable\n            });\n            if (root.contains(node)) walker.currentNode = node;\n            let nextNode = walker.nextNode();\n            if (!nextNode && wrap) {\n                walker.currentNode = root;\n                nextNode = walker.nextNode();\n            }\n            if (nextNode) $14e5c84cbc2e6e2e$var$focusElement(nextNode, true);\n            return nextNode;\n        },\n        focusPrevious (opts = {\n        }) {\n            let root = ref.current;\n            let { from: from , tabbable: tabbable , wrap: wrap  } = opts;\n            let node = from || document.activeElement;\n            let walker = $14e5c84cbc2e6e2e$export$2d6ec8fc375ceafa(root, {\n                tabbable: tabbable\n            });\n            if (root.contains(node)) walker.currentNode = node;\n            else {\n                let next = $14e5c84cbc2e6e2e$var$last(walker);\n                if (next) $14e5c84cbc2e6e2e$var$focusElement(next, true);\n                return next;\n            }\n            let previousNode = walker.previousNode();\n            if (!previousNode && wrap) {\n                walker.currentNode = root;\n                previousNode = $14e5c84cbc2e6e2e$var$last(walker);\n            }\n            if (previousNode) $14e5c84cbc2e6e2e$var$focusElement(previousNode, true);\n            return previousNode;\n        },\n        focusFirst (opts = {\n        }) {\n            let root = ref.current;\n            let { tabbable: tabbable  } = opts;\n            let walker = $14e5c84cbc2e6e2e$export$2d6ec8fc375ceafa(root, {\n                tabbable: tabbable\n            });\n            let nextNode = walker.nextNode();\n            if (nextNode) $14e5c84cbc2e6e2e$var$focusElement(nextNode, true);\n            return nextNode;\n        },\n        focusLast (opts = {\n        }) {\n            let root = ref.current;\n            let { tabbable: tabbable  } = opts;\n            let walker = $14e5c84cbc2e6e2e$export$2d6ec8fc375ceafa(root, {\n                tabbable: tabbable\n            });\n            let next = $14e5c84cbc2e6e2e$var$last(walker);\n            if (next) $14e5c84cbc2e6e2e$var$focusElement(next, true);\n            return next;\n        }\n    };\n}\nfunction $14e5c84cbc2e6e2e$var$last(walker) {\n    let next;\n    let last;\n    do {\n        last = walker.lastChild();\n        if (last) next = last;\n    }while (last)\n    return next;\n}\n\n\nvar $503734efc0922182$exports = {};\n\n$parcel$export($503734efc0922182$exports, \"FocusRing\", () => $503734efc0922182$export$1a38b4ad7f578e1d);\n\n\n\nvar $e63d024ca16f2165$exports = {};\n\n$parcel$export($e63d024ca16f2165$exports, \"useFocusRing\", () => $e63d024ca16f2165$export$4e328f61c538687f);\n\n\n\nfunction $e63d024ca16f2165$export$4e328f61c538687f(props = {\n}) {\n    let { autoFocus: autoFocus = false , isTextInput: isTextInput , within: within  } = props;\n    let state = $6saFI$useRef({\n        isFocused: false,\n        isFocusVisible: autoFocus || $6saFI$isFocusVisible()\n    }).current;\n    let [isFocused1, setFocused] = $6saFI$useState(false);\n    let [isFocusVisibleState, setFocusVisible] = $6saFI$useState(()=>state.isFocused && state.isFocusVisible\n    );\n    let updateState = ()=>setFocusVisible(state.isFocused && state.isFocusVisible)\n    ;\n    let onFocusChange = (isFocused)=>{\n        state.isFocused = isFocused;\n        setFocused(isFocused);\n        updateState();\n    };\n    $6saFI$useFocusVisibleListener((isFocusVisible)=>{\n        state.isFocusVisible = isFocusVisible;\n        updateState();\n    }, [], {\n        isTextInput: isTextInput\n    });\n    let { focusProps: focusProps  } = $6saFI$useFocus({\n        isDisabled: within,\n        onFocusChange: onFocusChange\n    });\n    let { focusWithinProps: focusWithinProps  } = $6saFI$useFocusWithin({\n        isDisabled: !within,\n        onFocusWithinChange: onFocusChange\n    });\n    return {\n        isFocused: isFocused1,\n        isFocusVisible: state.isFocused && isFocusVisibleState,\n        focusProps: within ? focusWithinProps : focusProps\n    };\n}\n\n\nfunction $503734efc0922182$export$1a38b4ad7f578e1d(props) {\n    let { children: children , focusClass: focusClass , focusRingClass: focusRingClass  } = props;\n    let { isFocused: isFocused , isFocusVisible: isFocusVisible , focusProps: focusProps  } = $e63d024ca16f2165$export$4e328f61c538687f(props);\n    let child = $6saFI$react.Children.only(children);\n    return(/*#__PURE__*/ $6saFI$react.cloneElement(child, $6saFI$mergeProps(child.props, {\n        ...focusProps,\n        className: $6saFI$clsx({\n            [focusClass || '']: isFocused,\n            [focusRingClass || '']: isFocusVisible\n        })\n    })));\n}\n\n\nvar $391c6482f25a1991$exports = {};\n\n$parcel$export($391c6482f25a1991$exports, \"FocusableProvider\", () => $391c6482f25a1991$export$13f3202a3e5ddd5);\n$parcel$export($391c6482f25a1991$exports, \"useFocusable\", () => $391c6482f25a1991$export$4c014de7c8940b4c);\n\n\n\nlet $391c6482f25a1991$var$FocusableContext = /*#__PURE__*/ $6saFI$react.createContext(null);\nfunction $391c6482f25a1991$var$useFocusableContext(ref) {\n    let context = $6saFI$useContext($391c6482f25a1991$var$FocusableContext) || {\n    };\n    $6saFI$useSyncRef(context, ref);\n    // eslint-disable-next-line\n    let { ref: _ , ...otherProps } = context;\n    return otherProps;\n}\n/**\n * Provides DOM props to the nearest focusable child.\n */ function $391c6482f25a1991$var$FocusableProvider(props, ref) {\n    let { children: children , ...otherProps } = props;\n    let context = {\n        ...otherProps,\n        ref: ref\n    };\n    return(/*#__PURE__*/ $6saFI$react.createElement($391c6482f25a1991$var$FocusableContext.Provider, {\n        value: context\n    }, children));\n}\nlet $391c6482f25a1991$export$13f3202a3e5ddd5 = /*#__PURE__*/ $6saFI$react.forwardRef($391c6482f25a1991$var$FocusableProvider);\nfunction $391c6482f25a1991$export$4c014de7c8940b4c(props, domRef) {\n    let { focusProps: focusProps  } = $6saFI$useFocus(props);\n    let { keyboardProps: keyboardProps  } = $6saFI$useKeyboard(props);\n    let interactions = $6saFI$mergeProps(focusProps, keyboardProps);\n    let domProps = $391c6482f25a1991$var$useFocusableContext(domRef);\n    let interactionProps = props.isDisabled ? {\n    } : domProps;\n    let autoFocusRef = $6saFI$useRef(props.autoFocus);\n    $6saFI$useEffect(()=>{\n        if (autoFocusRef.current && domRef.current) domRef.current.focus();\n        autoFocusRef.current = false;\n    }, []);\n    return {\n        focusableProps: $6saFI$mergeProps({\n            ...interactions,\n            tabIndex: props.excludeFromTabOrder && !props.isDisabled ? -1 : undefined\n        }, interactionProps)\n    };\n}\n\n\n\n\n\n\nexport {$14e5c84cbc2e6e2e$export$20e40289641fbbb6 as FocusScope, $14e5c84cbc2e6e2e$export$10c5169755ce7bd7 as useFocusManager, $14e5c84cbc2e6e2e$export$2d6ec8fc375ceafa as getFocusableTreeWalker, $14e5c84cbc2e6e2e$export$c5251b9e124bf29 as createFocusManager, $503734efc0922182$export$1a38b4ad7f578e1d as FocusRing, $391c6482f25a1991$export$13f3202a3e5ddd5 as FocusableProvider, $391c6482f25a1991$export$4c014de7c8940b4c as useFocusable, $e63d024ca16f2165$export$4e328f61c538687f as useFocusRing, $1159c3b6ba210e4f$export$80f3e147d781571c as focusSafely};\n//# sourceMappingURL=module.js.map\n","import {mergeProps as $8mfbS$mergeProps, filterDOMProps as $8mfbS$filterDOMProps, chain as $8mfbS$chain} from \"@react-aria/utils\";\nimport {useFocusable as $8mfbS$useFocusable} from \"@react-aria/focus\";\nimport {usePress as $8mfbS$usePress} from \"@react-aria/interactions\";\n\nfunction $parcel$export(e, n, v, s) {\n  Object.defineProperty(e, n, {get: v, set: s, enumerable: true, configurable: true});\n}\nvar $4e9d283129286548$exports = {};\n\n$parcel$export($4e9d283129286548$exports, \"useButton\", () => $4e9d283129286548$export$ea18c227d4417cc3);\n\n\n\n\nfunction $4e9d283129286548$export$ea18c227d4417cc3(props, ref) {\n    let { elementType: elementType = 'button' , isDisabled: isDisabled , onPress: onPress , onPressStart: onPressStart , onPressEnd: onPressEnd , onPressChange: onPressChange , preventFocusOnPress: // @ts-ignore - undocumented\n    preventFocusOnPress , allowFocusWhenDisabled: // @ts-ignore - undocumented\n    allowFocusWhenDisabled , // @ts-ignore\n    onClick: deprecatedOnClick , href: href , target: target , rel: rel , type: type = 'button'  } = props;\n    let additionalProps;\n    if (elementType === 'button') additionalProps = {\n        type: type,\n        disabled: isDisabled\n    };\n    else additionalProps = {\n        role: 'button',\n        tabIndex: isDisabled ? undefined : 0,\n        href: elementType === 'a' && isDisabled ? undefined : href,\n        target: elementType === 'a' ? target : undefined,\n        type: elementType === 'input' ? type : undefined,\n        disabled: elementType === 'input' ? isDisabled : undefined,\n        'aria-disabled': !isDisabled || elementType === 'input' ? undefined : isDisabled,\n        rel: elementType === 'a' ? rel : undefined\n    };\n    let { pressProps: pressProps , isPressed: isPressed  } = $8mfbS$usePress({\n        onPressStart: onPressStart,\n        onPressEnd: onPressEnd,\n        onPressChange: onPressChange,\n        onPress: onPress,\n        isDisabled: isDisabled,\n        preventFocusOnPress: preventFocusOnPress,\n        ref: ref\n    });\n    let { focusableProps: focusableProps  } = $8mfbS$useFocusable(props, ref);\n    if (allowFocusWhenDisabled) focusableProps.tabIndex = isDisabled ? -1 : focusableProps.tabIndex;\n    let buttonProps = $8mfbS$mergeProps(focusableProps, pressProps, $8mfbS$filterDOMProps(props, {\n        labelable: true\n    }));\n    return {\n        isPressed: isPressed,\n        buttonProps: $8mfbS$mergeProps(additionalProps, buttonProps, {\n            'aria-haspopup': props['aria-haspopup'],\n            'aria-expanded': props['aria-expanded'],\n            'aria-controls': props['aria-controls'],\n            'aria-pressed': props['aria-pressed'],\n            onClick: (e)=>{\n                if (deprecatedOnClick) {\n                    deprecatedOnClick(e);\n                    console.warn('onClick is deprecated, please use onPress');\n                }\n            }\n        })\n    };\n}\n\n\nvar $2f16ea8f6283ecbd$exports = {};\n\n$parcel$export($2f16ea8f6283ecbd$exports, \"useToggleButton\", () => $2f16ea8f6283ecbd$export$51e84d46ca0bc451);\n\n\n\nfunction $2f16ea8f6283ecbd$export$51e84d46ca0bc451(props, state, ref) {\n    const { isSelected: isSelected  } = state;\n    const { isPressed: isPressed , buttonProps: buttonProps  } = $4e9d283129286548$export$ea18c227d4417cc3({\n        ...props,\n        onPress: $8mfbS$chain(state.toggle, props.onPress)\n    }, ref);\n    return {\n        isPressed: isPressed,\n        buttonProps: $8mfbS$mergeProps(buttonProps, {\n            'aria-pressed': isSelected\n        })\n    };\n}\n\n\n\n\nexport {$4e9d283129286548$export$ea18c227d4417cc3 as useButton, $2f16ea8f6283ecbd$export$51e84d46ca0bc451 as useToggleButton};\n//# sourceMappingURL=module.js.map\n","export type Variant = 'text' | 'flat' | 'raised' | 'outline' | null;\nexport type ButtonColor = null | 'primary' | 'error' | 'paper';\n\nexport function getSharedButtonStyle(\n  variant?: Variant,\n  color?: ButtonColor\n): (string | boolean | null | undefined)[] {\n  let style: string[] = [];\n  if (variant === 'outline') {\n    style = outline(color);\n  } else if (variant === 'text') {\n    style = text(color);\n  } else if (variant === 'flat' || variant === 'raised') {\n    style = contained(color);\n  }\n  return [\n    ...style,\n    variant === 'raised' && 'shadow-md',\n    variant &&\n      'align-middle whitespace-nowrap inline-flex items-center transition-button duration-200',\n    'select-none appearance-none no-underline outline-none disabled:pointer-events-none disabled:cursor-default',\n  ];\n}\n\nfunction outline(color?: ButtonColor) {\n  const disabled =\n    'disabled:text-disabled disabled:bg-transparent disabled:border-disabled-bg';\n  switch (color) {\n    case 'primary':\n      return [\n        'text-primary bg-transparent border border-primary/50',\n        'hover:bg-primary/hover hover:border-primary',\n        disabled,\n      ];\n    case 'error':\n      return [\n        'text-error bg-transparent border border-error/50',\n        'hover:bg-error/4 hover:border-error',\n        disabled,\n      ];\n    case 'paper':\n      return ['text bg-paper border', 'hover:bg-hover', disabled];\n    default:\n      return ['text-current bg-transparent border', 'hover:bg-hover', disabled];\n  }\n}\n\nfunction text(color?: ButtonColor) {\n  const disabled = 'disabled:text-disabled disabled:bg-transparent';\n  switch (color) {\n    case 'primary':\n      return [\n        'text-primary bg-transparent border-transparent',\n        'hover:bg-primary/4',\n        disabled,\n      ];\n    case 'error':\n      return [\n        'text-error bg-transparent border-transparent',\n        'hover:bg-error/4',\n        disabled,\n      ];\n    default:\n      return [\n        'text-current bg-transparent border-transparent',\n        'hover:bg-hover',\n        disabled,\n      ];\n  }\n}\n\nfunction contained(color?: ButtonColor) {\n  const disabled =\n    'disabled:text-disabled disabled:bg-disabled disabled:border-transparent disabled:shadow-none';\n  switch (color) {\n    case 'primary':\n      return [\n        'text-on-primary bg-primary border border-primary',\n        'hover:bg-primary-dark hover:border-primary-dark',\n        disabled,\n      ];\n    case 'error':\n      return [\n        'text-on-error bg-error border border-error',\n        'hover:bg-error/90 hover:border-error/90',\n        disabled,\n      ];\n    default:\n      return ['text-current bg border-background', 'hover:bg-hover', disabled];\n  }\n}\n","import React, {CSSProperties, ReactNode, RefObject} from 'react';\nimport clsx from 'clsx';\nimport {AriaButtonProps} from '@react-types/button';\nimport {useFocusRing} from '@react-aria/focus';\nimport {useButton} from '@react-aria/button';\nimport {mergeProps} from '@react-aria/utils';\nimport {\n  ButtonColor,\n  getSharedButtonStyle,\n  Variant,\n} from './get-shared-button-style';\n\nexport interface ButtonBaseProps extends AriaButtonProps {\n  children?: ReactNode;\n  color?: ButtonColor;\n  variant?: Variant;\n  className?: string;\n  value?: any;\n  style?: CSSProperties;\n  justify?: string;\n  radius?:\n    | 'rounded-none'\n    | 'rounded'\n    | 'rounded-sm'\n    | 'rounded-md'\n    | 'rounded-lg'\n    | 'rounded-full'\n    | 'rounded-xl'\n    | 'rounded-2xl';\n}\n\nexport const ButtonBase = React.forwardRef<\n  HTMLButtonElement | HTMLLinkElement,\n  ButtonBaseProps\n>((props, ref) => {\n  const {\n    children,\n    color = null,\n    variant,\n    radius,\n    justify = 'justify-center',\n    className,\n    href,\n    style,\n  } = props;\n  const {isFocusVisible, focusProps} = useFocusRing();\n  const {buttonProps, isPressed} = useButton(\n    {...props, elementType: href ? 'a' : 'button'},\n    ref as RefObject<HTMLButtonElement>\n  );\n\n  const Element = href ? 'a' : 'button';\n\n  return (\n    // eslint-disable-next-line react/button-has-type\n    <Element\n      {...mergeProps(buttonProps, focusProps)}\n      ref={ref as any}\n      style={style}\n      className={clsx(\n        isPressed && 'translate-y-1',\n        isFocusVisible && 'outline outline-offset-2',\n        getSharedButtonStyle(variant, color),\n        radius,\n        justify,\n        className\n      )}\n    >\n      {children}\n    </Element>\n  );\n});\n","import React, {ReactElement} from 'react';\nimport clsx from 'clsx';\nimport {ButtonSize, getButtonSizeStyle, getIconSizeStyle} from './button-size';\nimport {ButtonBase, ButtonBaseProps} from './button-base';\n\nexport interface ButtonProps extends ButtonBaseProps {\n  size?: ButtonSize;\n  equalWidth?: boolean;\n  startIcon?: ReactElement | null;\n  endIcon?: ReactElement;\n}\nexport const Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n  (\n    {\n      children,\n      startIcon,\n      endIcon,\n      size,\n      className,\n      equalWidth = false,\n      radius = 'rounded',\n      variant = 'flat',\n      ...other\n    },\n    ref\n  ) => {\n    const mergedClassName = clsx(\n      'font-semibold',\n      getButtonSizeStyle(size, {equalWidth}),\n      className\n    );\n    const iconSize = getIconSizeStyle(size);\n    return (\n      <ButtonBase\n        className={mergedClassName}\n        ref={ref}\n        radius={radius}\n        variant={variant}\n        {...other}\n      >\n        {startIcon && (\n          <InlineIcon position=\"start\" icon={startIcon} size={iconSize} />\n        )}\n        {children}\n        {endIcon && (\n          <InlineIcon position=\"end\" icon={endIcon} size={iconSize} />\n        )}\n      </ButtonBase>\n    );\n  }\n);\n\ntype InlineIconProps = {\n  icon: ReactElement;\n  position: 'start' | 'end';\n  size?: string;\n};\nfunction InlineIcon({icon, position, size}: InlineIconProps): ReactElement {\n  const className = clsx(\n    'm-auto',\n    size,\n    {\n      '-ml-4 mr-8': position === 'start',\n      '-mr-4 ml-8': position === 'end',\n    },\n    icon.props.className\n  );\n  return React.cloneElement(icon, {className});\n}\n","import $dXgez$react, {useMemo as $dXgez$useMemo, useRef as $dXgez$useRef} from \"react\";\n\nfunction $parcel$export(e, n, v, s) {\n  Object.defineProperty(e, n, {get: v, set: s, enumerable: true, configurable: true});\n}\nvar $89e587cd0f107a73$exports = {};\n\n$parcel$export($89e587cd0f107a73$exports, \"Item\", () => $89e587cd0f107a73$export$6d08773d2e66f8f2);\n\nfunction $89e587cd0f107a73$var$Item(props) {\n    return null;\n}\n$89e587cd0f107a73$var$Item.getCollectionNode = function* getCollectionNode(props, context) {\n    let { childItems: childItems , title: title , children: children  } = props;\n    let rendered = props.title || props.children;\n    let textValue = props.textValue || (typeof rendered === 'string' ? rendered : '') || props['aria-label'] || '';\n    // suppressTextValueWarning is used in components like Tabs, which don't have type to select support.\n    if (!textValue && !(context === null || context === void 0 ? void 0 : context.suppressTextValueWarning)) console.warn('<Item> with non-plain text contents is unsupported by type to select for accessibility. Please add a `textValue` prop.');\n    yield {\n        type: 'item',\n        props: props,\n        rendered: rendered,\n        textValue: textValue,\n        'aria-label': props['aria-label'],\n        hasChildNodes: $89e587cd0f107a73$var$hasChildItems(props),\n        *childNodes () {\n            if (childItems) for (let child1 of childItems)yield {\n                type: 'item',\n                value: child1\n            };\n            else if (title) {\n                let items = [];\n                $dXgez$react.Children.forEach(children, (child)=>{\n                    items.push({\n                        type: 'item',\n                        element: child\n                    });\n                });\n                yield* items;\n            }\n        }\n    };\n};\nfunction $89e587cd0f107a73$var$hasChildItems(props) {\n    if (props.hasChildItems != null) return props.hasChildItems;\n    if (props.childItems) return true;\n    if (props.title && $dXgez$react.Children.count(props.children) > 0) return true;\n    return false;\n}\n// We don't want getCollectionNode to show up in the type definition\nlet $89e587cd0f107a73$export$6d08773d2e66f8f2 = $89e587cd0f107a73$var$Item;\n\n\nvar $c8f15027e29c0fc9$exports = {};\n\n$parcel$export($c8f15027e29c0fc9$exports, \"Section\", () => $c8f15027e29c0fc9$export$6e2c8f0811a474ce);\n\nfunction $c8f15027e29c0fc9$var$Section(props) {\n    return null;\n}\n$c8f15027e29c0fc9$var$Section.getCollectionNode = function* getCollectionNode(props) {\n    let { children: children , title: title , items: items1  } = props;\n    yield {\n        type: 'section',\n        hasChildNodes: true,\n        rendered: title,\n        'aria-label': props['aria-label'],\n        *childNodes () {\n            if (typeof children === 'function') {\n                if (!items1) throw new Error('props.children was a function but props.items is missing');\n                for (let item of items1)yield {\n                    type: 'item',\n                    value: item,\n                    renderer: children\n                };\n            } else {\n                let items = [];\n                $dXgez$react.Children.forEach(children, (child)=>{\n                    items.push({\n                        type: 'item',\n                        element: child\n                    });\n                });\n                yield* items;\n            }\n        }\n    };\n};\n// We don't want getCollectionNode to show up in the type definition\nlet $c8f15027e29c0fc9$export$6e2c8f0811a474ce = $c8f15027e29c0fc9$var$Section;\n\n\nvar $f2e94723ef6058b9$exports = {};\n\n\nvar $54e9526d7573190f$exports = {};\n\n$parcel$export($54e9526d7573190f$exports, \"useCollection\", () => $54e9526d7573190f$export$6cd28814d92fa9c9);\n\nclass $04d34f0d1495595c$export$bf788dd355e3a401 {\n    build(props, context) {\n        this.context = context;\n        return $04d34f0d1495595c$var$iterable(()=>this.iterateCollection(props)\n        );\n    }\n    *iterateCollection(props) {\n        let { children: children , items: items  } = props;\n        if (typeof children === 'function') {\n            if (!items) throw new Error('props.children was a function but props.items is missing');\n            for (let item of props.items)yield* this.getFullNode({\n                value: item\n            }, {\n                renderer: children\n            });\n        } else {\n            let items = [];\n            $dXgez$react.Children.forEach(children, (child)=>{\n                items.push(child);\n            });\n            let index = 0;\n            for (let item of items){\n                let nodes = this.getFullNode({\n                    element: item,\n                    index: index\n                }, {\n                });\n                for (let node of nodes){\n                    index++;\n                    yield node;\n                }\n            }\n        }\n    }\n    getKey(item, partialNode, state, parentKey) {\n        if (item.key != null) return item.key;\n        if (partialNode.type === 'cell' && partialNode.key != null) return `${parentKey}${partialNode.key}`;\n        let v = partialNode.value;\n        if (v != null) {\n            var _key;\n            let key = (_key = v.key) !== null && _key !== void 0 ? _key : v.id;\n            if (key == null) throw new Error('No key found for item');\n            return key;\n        }\n        return parentKey ? `${parentKey}.${partialNode.index}` : `$.${partialNode.index}`;\n    }\n    getChildState(state, partialNode) {\n        return {\n            renderer: partialNode.renderer || state.renderer\n        };\n    }\n    *getFullNode(partialNode, state, parentKey, parentNode) {\n        // If there's a value instead of an element on the node, and a parent renderer function is available,\n        // use it to render an element for the value.\n        let element = partialNode.element;\n        if (!element && partialNode.value && state && state.renderer) {\n            let cached = this.cache.get(partialNode.value);\n            if (cached && (!cached.shouldInvalidate || !cached.shouldInvalidate(this.context))) {\n                cached.index = partialNode.index;\n                cached.parentKey = parentNode ? parentNode.key : null;\n                yield cached;\n                return;\n            }\n            element = state.renderer(partialNode.value);\n        }\n        // If there's an element with a getCollectionNode function on its type, then it's a supported component.\n        // Call this function to get a partial node, and recursively build a full node from there.\n        if ($dXgez$react.isValidElement(element)) {\n            let type = element.type;\n            if (typeof type !== 'function' && typeof type.getCollectionNode !== 'function') {\n                let name = typeof element.type === 'function' ? element.type.name : element.type;\n                throw new Error(`Unknown element <${name}> in collection.`);\n            }\n            let childNodes = type.getCollectionNode(element.props, this.context);\n            let index = partialNode.index;\n            let result = childNodes.next();\n            while(!result.done && result.value){\n                let childNode = result.value;\n                partialNode.index = index;\n                let nodeKey = childNode.key;\n                if (!nodeKey) nodeKey = childNode.element ? null : this.getKey(element, partialNode, state, parentKey);\n                let nodes = this.getFullNode({\n                    ...childNode,\n                    key: nodeKey,\n                    index: index,\n                    wrapper: $04d34f0d1495595c$var$compose(partialNode.wrapper, childNode.wrapper)\n                }, this.getChildState(state, childNode), parentKey ? `${parentKey}${element.key}` : element.key, parentNode);\n                let children = [\n                    ...nodes\n                ];\n                for (let node of children){\n                    // Cache the node based on its value\n                    node.value = childNode.value || partialNode.value;\n                    if (node.value) this.cache.set(node.value, node);\n                    // The partial node may have specified a type for the child in order to specify a constraint.\n                    // Verify that the full node that was built recursively matches this type.\n                    if (partialNode.type && node.type !== partialNode.type) throw new Error(`Unsupported type <${$04d34f0d1495595c$var$capitalize(node.type)}> in <${$04d34f0d1495595c$var$capitalize(parentNode.type)}>. Only <${$04d34f0d1495595c$var$capitalize(partialNode.type)}> is supported.`);\n                    index++;\n                    yield node;\n                }\n                result = childNodes.next(children);\n            }\n            return;\n        }\n        // Ignore invalid elements\n        if (partialNode.key == null) return;\n        // Create full node\n        let builder = this;\n        let node = {\n            type: partialNode.type,\n            props: partialNode.props,\n            key: partialNode.key,\n            parentKey: parentNode ? parentNode.key : null,\n            value: partialNode.value,\n            level: parentNode ? parentNode.level + 1 : 0,\n            index: partialNode.index,\n            rendered: partialNode.rendered,\n            textValue: partialNode.textValue,\n            'aria-label': partialNode['aria-label'],\n            wrapper: partialNode.wrapper,\n            shouldInvalidate: partialNode.shouldInvalidate,\n            hasChildNodes: partialNode.hasChildNodes,\n            childNodes: $04d34f0d1495595c$var$iterable(function*() {\n                if (!partialNode.hasChildNodes) return;\n                let index = 0;\n                for (let child of partialNode.childNodes()){\n                    // Ensure child keys are globally unique by prepending the parent node's key\n                    if (child.key != null) child.key = `${node.key}${child.key}`;\n                    child.index = index;\n                    let nodes = builder.getFullNode(child, builder.getChildState(state, child), node.key, node);\n                    for (let node1 of nodes){\n                        index++;\n                        yield node1;\n                    }\n                }\n            })\n        };\n        yield node;\n    }\n    constructor(){\n        this.cache = new WeakMap();\n    }\n}\n// Wraps an iterator function as an iterable object, and caches the results.\nfunction $04d34f0d1495595c$var$iterable(iterator) {\n    let cache = [];\n    let iterable = null;\n    return {\n        *[Symbol.iterator] () {\n            for (let item of cache)yield item;\n            if (!iterable) iterable = iterator();\n            for (let item1 of iterable){\n                cache.push(item1);\n                yield item1;\n            }\n        }\n    };\n}\nfunction $04d34f0d1495595c$var$compose(outer, inner) {\n    if (outer && inner) return (element)=>outer(inner(element))\n    ;\n    if (outer) return outer;\n    if (inner) return inner;\n}\nfunction $04d34f0d1495595c$var$capitalize(str) {\n    return str[0].toUpperCase() + str.slice(1);\n}\n\n\n\nfunction $54e9526d7573190f$export$6cd28814d92fa9c9(props, factory, context, invalidators = []) {\n    let builder = $dXgez$useMemo(()=>new $04d34f0d1495595c$export$bf788dd355e3a401()\n    , []);\n    let prev = $dXgez$useRef(null);\n    return $dXgez$useMemo(()=>{\n        let nodes = builder.build(props, context);\n        prev.current = factory(nodes, prev.current);\n        return prev.current;\n    // Don't invalidate when any prop changes, just the two we care about.\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n    }, [\n        builder,\n        props.children,\n        props.items,\n        context,\n        ...invalidators\n    ]);\n}\n\n\nvar $c6b7d36982dcfffc$exports = {};\n\n$parcel$export($c6b7d36982dcfffc$exports, \"getItemCount\", () => $c6b7d36982dcfffc$export$77d5aafae4e095b2);\nconst $c6b7d36982dcfffc$var$cache = new WeakMap();\nfunction $c6b7d36982dcfffc$export$77d5aafae4e095b2(collection) {\n    let count = $c6b7d36982dcfffc$var$cache.get(collection);\n    if (count != null) return count;\n    count = 0;\n    for (let item of collection)if (item.type === 'section') count += $c6b7d36982dcfffc$export$77d5aafae4e095b2(item.childNodes);\n    else count++;\n    $c6b7d36982dcfffc$var$cache.set(collection, count);\n    return count;\n}\n\n\n\n\nexport {$89e587cd0f107a73$export$6d08773d2e66f8f2 as Item, $c8f15027e29c0fc9$export$6e2c8f0811a474ce as Section, $54e9526d7573190f$export$6cd28814d92fa9c9 as useCollection, $c6b7d36982dcfffc$export$77d5aafae4e095b2 as getItemCount};\n//# sourceMappingURL=module.js.map\n","import {useControlledState as $4oA3P$useControlledState} from \"@react-stately/utils\";\n\nfunction $parcel$export(e, n, v, s) {\n  Object.defineProperty(e, n, {get: v, set: s, enumerable: true, configurable: true});\n}\nvar $fc909762b330b746$exports = {};\n\n$parcel$export($fc909762b330b746$exports, \"useOverlayTriggerState\", () => $fc909762b330b746$export$61c6a8c84e605fb6);\n\nfunction $fc909762b330b746$export$61c6a8c84e605fb6(props) {\n    let [isOpen, setOpen] = $4oA3P$useControlledState(props.isOpen, props.defaultOpen || false, props.onOpenChange);\n    return {\n        isOpen: isOpen,\n        open () {\n            setOpen(true);\n        },\n        close () {\n            setOpen(false);\n        },\n        toggle () {\n            setOpen(!isOpen);\n        }\n    };\n}\n\n\n\n\nexport {$fc909762b330b746$export$61c6a8c84e605fb6 as useOverlayTriggerState};\n//# sourceMappingURL=module.js.map\n","import {useOverlayTriggerState as $aGzji$useOverlayTriggerState} from \"@react-stately/overlays\";\nimport {useState as $aGzji$useState} from \"react\";\n\nfunction $parcel$export(e, n, v, s) {\n  Object.defineProperty(e, n, {get: v, set: s, enumerable: true, configurable: true});\n}\nvar $89a94a12744b972a$exports = {};\n\n$parcel$export($89a94a12744b972a$exports, \"useMenuTriggerState\", () => $89a94a12744b972a$export$79fefeb1c2091ac3);\n\n\nfunction $89a94a12744b972a$export$79fefeb1c2091ac3(props) {\n    let overlayTriggerState = $aGzji$useOverlayTriggerState(props);\n    let [focusStrategy1, setFocusStrategy] = $aGzji$useState(null);\n    return {\n        focusStrategy: focusStrategy1,\n        ...overlayTriggerState,\n        open (focusStrategy = null) {\n            setFocusStrategy(focusStrategy);\n            overlayTriggerState.open();\n        },\n        toggle (focusStrategy = null) {\n            setFocusStrategy(focusStrategy);\n            overlayTriggerState.toggle();\n        }\n    };\n}\n\n\n\n\nexport {$89a94a12744b972a$export$79fefeb1c2091ac3 as useMenuTriggerState};\n//# sourceMappingURL=module.js.map\n","import $1Ofoe$intlmessageformat from \"intl-messageformat\";\n\nfunction $parcel$export(e, n, v, s) {\n  Object.defineProperty(e, n, {get: v, set: s, enumerable: true, configurable: true});\n}\nvar $70eee6030fd7c1a1$exports = {};\n\n$parcel$export($70eee6030fd7c1a1$exports, \"MessageDictionary\", () => $70eee6030fd7c1a1$export$64839e615120df17);\nclass $70eee6030fd7c1a1$export$64839e615120df17 {\n    getStringForLocale(key, locale) {\n        let strings = this.messages[locale];\n        if (!strings) {\n            strings = $70eee6030fd7c1a1$var$getStringsForLocale(locale, this.messages, this.defaultLocale);\n            this.messages[locale] = strings;\n        }\n        let string = strings[key];\n        if (!string) throw new Error(`Could not find intl message ${key} in ${locale} locale`);\n        return string;\n    }\n    constructor(messages, defaultLocale = 'en-US'){\n        // Clone messages so we don't modify the original object.\n        this.messages = {\n            ...messages\n        };\n        this.defaultLocale = defaultLocale;\n    }\n}\nfunction $70eee6030fd7c1a1$var$getStringsForLocale(locale, strings, defaultLocale = 'en-US') {\n    // If there is an exact match, use it.\n    if (strings[locale]) return strings[locale];\n    // Attempt to find the closest match by language.\n    // For example, if the locale is fr-CA (French Canadian), but there is only\n    // an fr-FR (France) set of strings, use that.\n    // This could be replaced with Intl.LocaleMatcher once it is supported.\n    // https://github.com/tc39/proposal-intl-localematcher\n    let language = $70eee6030fd7c1a1$var$getLanguage(locale);\n    for(let key in strings){\n        if (key.startsWith(language + '-')) return strings[key];\n    }\n    // Nothing close, use english.\n    return strings[defaultLocale];\n}\nfunction $70eee6030fd7c1a1$var$getLanguage(locale) {\n    // @ts-ignore\n    if (Intl.Locale) // @ts-ignore\n    return new Intl.Locale(locale).language;\n    return locale.split('-')[0];\n}\n\n\nvar $a96338b8d4eb3cb0$exports = {};\n\n$parcel$export($a96338b8d4eb3cb0$exports, \"MessageFormatter\", () => $a96338b8d4eb3cb0$export$526ebc05ff964723);\n\nclass $a96338b8d4eb3cb0$export$526ebc05ff964723 {\n    format(key, variables) {\n        let message = this.cache[key];\n        if (!message) {\n            let msg = this.messages.getStringForLocale(key, this.locale);\n            if (!msg) throw new Error(`Could not find intl message ${key} in ${this.locale} locale`);\n            message = new $1Ofoe$intlmessageformat(msg, this.locale);\n            this.cache[key] = message;\n        }\n        let varCopy;\n        if (variables) varCopy = Object.keys(variables).reduce((acc, key)=>{\n            acc[key] = variables[key] == null ? false : variables[key];\n            return acc;\n        }, {\n        });\n        return message.format(varCopy);\n    }\n    constructor(locale, messages){\n        this.locale = locale;\n        this.messages = messages;\n        this.cache = {\n        };\n    }\n}\n\n\n\n\nexport {$70eee6030fd7c1a1$export$64839e615120df17 as MessageDictionary, $a96338b8d4eb3cb0$export$526ebc05ff964723 as MessageFormatter};\n//# sourceMappingURL=module.js.map\n","function $parcel$export(e, n, v, s) {\n  Object.defineProperty(e, n, {get: v, set: s, enumerable: true, configurable: true});\n}\nvar $418a5bbf7b2f3448$exports = {};\n\n$parcel$export($418a5bbf7b2f3448$exports, \"CalendarDate\", () => $418a5bbf7b2f3448$export$99faa760c7908e4f);\n$parcel$export($418a5bbf7b2f3448$exports, \"Time\", () => $418a5bbf7b2f3448$export$680ea196effce5f);\n$parcel$export($418a5bbf7b2f3448$exports, \"CalendarDateTime\", () => $418a5bbf7b2f3448$export$ca871e8dbb80966f);\n$parcel$export($418a5bbf7b2f3448$exports, \"ZonedDateTime\", () => $418a5bbf7b2f3448$export$d3b7288e7994edea);\nvar $9ab2a87bc84c0bfa$exports = {};\n\n$parcel$export($9ab2a87bc84c0bfa$exports, \"epochFromDate\", () => $9ab2a87bc84c0bfa$export$bd4fb2bc8bb06fb);\n$parcel$export($9ab2a87bc84c0bfa$exports, \"toCalendar\", () => $9ab2a87bc84c0bfa$export$b4a036af3fc0b032);\n$parcel$export($9ab2a87bc84c0bfa$exports, \"getTimeZoneOffset\", () => $9ab2a87bc84c0bfa$export$59c99f3515d3493f);\n$parcel$export($9ab2a87bc84c0bfa$exports, \"possibleAbsolutes\", () => $9ab2a87bc84c0bfa$export$136f38efe7caf549);\n$parcel$export($9ab2a87bc84c0bfa$exports, \"toAbsolute\", () => $9ab2a87bc84c0bfa$export$5107c82f94518f5c);\n$parcel$export($9ab2a87bc84c0bfa$exports, \"toCalendarDateTime\", () => $9ab2a87bc84c0bfa$export$b21e0b124e224484);\n$parcel$export($9ab2a87bc84c0bfa$exports, \"toDate\", () => $9ab2a87bc84c0bfa$export$e67a095c620b86fe);\n$parcel$export($9ab2a87bc84c0bfa$exports, \"fromAbsolute\", () => $9ab2a87bc84c0bfa$export$1b96692a1ba042ac);\n$parcel$export($9ab2a87bc84c0bfa$exports, \"fromDate\", () => $9ab2a87bc84c0bfa$export$e57ff100d91bd4b9);\n$parcel$export($9ab2a87bc84c0bfa$exports, \"fromDateToLocal\", () => $9ab2a87bc84c0bfa$export$d7f92bcd3596b086);\n$parcel$export($9ab2a87bc84c0bfa$exports, \"toCalendarDate\", () => $9ab2a87bc84c0bfa$export$93522d1a439f3617);\n$parcel$export($9ab2a87bc84c0bfa$exports, \"toDateFields\", () => $9ab2a87bc84c0bfa$export$6f4d78149f3f53ac);\n$parcel$export($9ab2a87bc84c0bfa$exports, \"toTimeFields\", () => $9ab2a87bc84c0bfa$export$4d0393e732857be5);\n$parcel$export($9ab2a87bc84c0bfa$exports, \"toTime\", () => $9ab2a87bc84c0bfa$export$d33f79e3ffc3dc83);\n$parcel$export($9ab2a87bc84c0bfa$exports, \"toZoned\", () => $9ab2a87bc84c0bfa$export$84c95a83c799e074);\n$parcel$export($9ab2a87bc84c0bfa$exports, \"toTimeZone\", () => $9ab2a87bc84c0bfa$export$538b00033cc11c75);\n$parcel$export($9ab2a87bc84c0bfa$exports, \"zonedToDate\", () => $9ab2a87bc84c0bfa$export$83aac07b4c37b25);\n$parcel$export($9ab2a87bc84c0bfa$exports, \"toLocalTimeZone\", () => $9ab2a87bc84c0bfa$export$d9b67bc93c097491);\n\nvar $571ccebef3ef72f1$exports = {};\n\n$parcel$export($571ccebef3ef72f1$exports, \"isSameDay\", () => $571ccebef3ef72f1$export$ea39ec197993aef0);\n$parcel$export($571ccebef3ef72f1$exports, \"isSameMonth\", () => $571ccebef3ef72f1$export$a18c89cbd24170ff);\n$parcel$export($571ccebef3ef72f1$exports, \"startOfMonth\", () => $571ccebef3ef72f1$export$a5a3b454ada2268e);\n$parcel$export($571ccebef3ef72f1$exports, \"isSameYear\", () => $571ccebef3ef72f1$export$5841f9eb9773f25f);\n$parcel$export($571ccebef3ef72f1$exports, \"startOfYear\", () => $571ccebef3ef72f1$export$f91e89d3d0406102);\n$parcel$export($571ccebef3ef72f1$exports, \"isEqualDay\", () => $571ccebef3ef72f1$export$91b62ebf2ba703ee);\n$parcel$export($571ccebef3ef72f1$exports, \"isEqualMonth\", () => $571ccebef3ef72f1$export$5a8da0c44a3afdf2);\n$parcel$export($571ccebef3ef72f1$exports, \"isEqualYear\", () => $571ccebef3ef72f1$export$ea840f5a6dda8147);\n$parcel$export($571ccebef3ef72f1$exports, \"isToday\", () => $571ccebef3ef72f1$export$629b0a497aa65267);\n$parcel$export($571ccebef3ef72f1$exports, \"today\", () => $571ccebef3ef72f1$export$d0bdf45af03a6ea3);\n$parcel$export($571ccebef3ef72f1$exports, \"getDayOfWeek\", () => $571ccebef3ef72f1$export$2061056d06d7cdf7);\n$parcel$export($571ccebef3ef72f1$exports, \"now\", () => $571ccebef3ef72f1$export$461939dd4422153);\n$parcel$export($571ccebef3ef72f1$exports, \"compareDate\", () => $571ccebef3ef72f1$export$68781ddf31c0090f);\n$parcel$export($571ccebef3ef72f1$exports, \"compareTime\", () => $571ccebef3ef72f1$export$c19a80a9721b80f6);\n$parcel$export($571ccebef3ef72f1$exports, \"getHoursInDay\", () => $571ccebef3ef72f1$export$126c91c941de7e);\n$parcel$export($571ccebef3ef72f1$exports, \"getLocalTimeZone\", () => $571ccebef3ef72f1$export$aa8b41735afcabd2);\n$parcel$export($571ccebef3ef72f1$exports, \"endOfMonth\", () => $571ccebef3ef72f1$export$a2258d9c4118825c);\n$parcel$export($571ccebef3ef72f1$exports, \"endOfYear\", () => $571ccebef3ef72f1$export$8b7aa55c66d5569e);\n$parcel$export($571ccebef3ef72f1$exports, \"getMinimumMonthInYear\", () => $571ccebef3ef72f1$export$5412ac11713b72ad);\n$parcel$export($571ccebef3ef72f1$exports, \"getMinimumDayInMonth\", () => $571ccebef3ef72f1$export$b2f4953d301981d5);\n$parcel$export($571ccebef3ef72f1$exports, \"startOfWeek\", () => $571ccebef3ef72f1$export$42c81a444fbfb5d4);\n$parcel$export($571ccebef3ef72f1$exports, \"endOfWeek\", () => $571ccebef3ef72f1$export$ef8b6d9133084f4e);\n$parcel$export($571ccebef3ef72f1$exports, \"getWeeksInMonth\", () => $571ccebef3ef72f1$export$ccc1b2479e7dd654);\n$parcel$export($571ccebef3ef72f1$exports, \"minDate\", () => $571ccebef3ef72f1$export$5c333a116e949cdd);\n$parcel$export($571ccebef3ef72f1$exports, \"maxDate\", () => $571ccebef3ef72f1$export$a75f2bff57811055);\n$parcel$export($571ccebef3ef72f1$exports, \"isWeekend\", () => $571ccebef3ef72f1$export$618d60ea299da42);\n$parcel$export($571ccebef3ef72f1$exports, \"isWeekday\", () => $571ccebef3ef72f1$export$ee9d87258e1d19ed);\n\nconst $7470da919d0ed06d$export$7a5acbd77d414bd9 = {\n    '001': 1,\n    AD: 1,\n    AE: 6,\n    AF: 6,\n    AI: 1,\n    AL: 1,\n    AM: 1,\n    AN: 1,\n    AT: 1,\n    AX: 1,\n    AZ: 1,\n    BA: 1,\n    BE: 1,\n    BG: 1,\n    BH: 6,\n    BM: 1,\n    BN: 1,\n    BY: 1,\n    CH: 1,\n    CL: 1,\n    CM: 1,\n    CR: 1,\n    CY: 1,\n    CZ: 1,\n    DE: 1,\n    DJ: 6,\n    DK: 1,\n    DZ: 6,\n    EC: 1,\n    EE: 1,\n    EG: 6,\n    ES: 1,\n    FI: 1,\n    FJ: 1,\n    FO: 1,\n    FR: 1,\n    GB: 1,\n    GE: 1,\n    GF: 1,\n    GP: 1,\n    GR: 1,\n    HR: 1,\n    HU: 1,\n    IE: 1,\n    IQ: 6,\n    IR: 6,\n    IS: 1,\n    IT: 1,\n    JO: 6,\n    KG: 1,\n    KW: 6,\n    KZ: 1,\n    LB: 1,\n    LI: 1,\n    LK: 1,\n    LT: 1,\n    LU: 1,\n    LV: 1,\n    LY: 6,\n    MC: 1,\n    MD: 1,\n    ME: 1,\n    MK: 1,\n    MN: 1,\n    MQ: 1,\n    MV: 5,\n    MY: 1,\n    NL: 1,\n    NO: 1,\n    NZ: 1,\n    OM: 6,\n    PL: 1,\n    QA: 6,\n    RE: 1,\n    RO: 1,\n    RS: 1,\n    RU: 1,\n    SD: 6,\n    SE: 1,\n    SI: 1,\n    SK: 1,\n    SM: 1,\n    SY: 6,\n    TJ: 1,\n    TM: 1,\n    TR: 1,\n    UA: 1,\n    UY: 1,\n    UZ: 1,\n    VA: 1,\n    VN: 1,\n    XK: 1\n};\n\n\nfunction $571ccebef3ef72f1$export$ea39ec197993aef0(a, b) {\n    b = $9ab2a87bc84c0bfa$export$b4a036af3fc0b032(b, a.calendar);\n    return a.era === b.era && a.year === b.year && a.month === b.month && a.day === b.day;\n}\nfunction $571ccebef3ef72f1$export$a18c89cbd24170ff(a, b) {\n    b = $9ab2a87bc84c0bfa$export$b4a036af3fc0b032(b, a.calendar);\n    // In the Japanese calendar, months can span multiple eras/years, so only compare the first of the month.\n    a = $571ccebef3ef72f1$export$a5a3b454ada2268e(a);\n    b = $571ccebef3ef72f1$export$a5a3b454ada2268e(b);\n    return a.era === b.era && a.year === b.year && a.month === b.month;\n}\nfunction $571ccebef3ef72f1$export$5841f9eb9773f25f(a, b) {\n    b = $9ab2a87bc84c0bfa$export$b4a036af3fc0b032(b, a.calendar);\n    a = $571ccebef3ef72f1$export$f91e89d3d0406102(a);\n    b = $571ccebef3ef72f1$export$f91e89d3d0406102(b);\n    return a.era === b.era && a.year === b.year;\n}\nfunction $571ccebef3ef72f1$export$91b62ebf2ba703ee(a, b) {\n    return a.calendar.identifier === b.calendar.identifier && a.era === b.era && a.year === b.year && a.month === b.month && a.day === b.day;\n}\nfunction $571ccebef3ef72f1$export$5a8da0c44a3afdf2(a, b) {\n    a = $571ccebef3ef72f1$export$a5a3b454ada2268e(a);\n    b = $571ccebef3ef72f1$export$a5a3b454ada2268e(b);\n    return a.calendar.identifier === b.calendar.identifier && a.era === b.era && a.year === b.year && a.month === b.month;\n}\nfunction $571ccebef3ef72f1$export$ea840f5a6dda8147(a, b) {\n    a = $571ccebef3ef72f1$export$f91e89d3d0406102(a);\n    b = $571ccebef3ef72f1$export$f91e89d3d0406102(b);\n    return a.calendar.identifier === b.calendar.identifier && a.era === b.era && a.year === b.year;\n}\nfunction $571ccebef3ef72f1$export$629b0a497aa65267(date, timeZone) {\n    return $571ccebef3ef72f1$export$ea39ec197993aef0(date, $571ccebef3ef72f1$export$d0bdf45af03a6ea3(timeZone));\n}\nfunction $571ccebef3ef72f1$export$2061056d06d7cdf7(date, locale) {\n    let julian = date.calendar.toJulianDay(date);\n    // If julian is negative, then julian % 7 will be negative, so we adjust\n    // accordingly.  Julian day 0 is Monday.\n    let dayOfWeek = Math.ceil(julian + 1 - $571ccebef3ef72f1$var$getWeekStart(locale)) % 7;\n    if (dayOfWeek < 0) dayOfWeek += 7;\n    return dayOfWeek;\n}\nfunction $571ccebef3ef72f1$export$461939dd4422153(timeZone) {\n    return $9ab2a87bc84c0bfa$export$1b96692a1ba042ac(Date.now(), timeZone);\n}\nfunction $571ccebef3ef72f1$export$d0bdf45af03a6ea3(timeZone) {\n    return $9ab2a87bc84c0bfa$export$93522d1a439f3617($571ccebef3ef72f1$export$461939dd4422153(timeZone));\n}\nfunction $571ccebef3ef72f1$export$68781ddf31c0090f(a, b) {\n    return a.calendar.toJulianDay(a) - b.calendar.toJulianDay(b);\n}\nfunction $571ccebef3ef72f1$export$c19a80a9721b80f6(a, b) {\n    return $571ccebef3ef72f1$var$timeToMs(a) - $571ccebef3ef72f1$var$timeToMs(b);\n}\nfunction $571ccebef3ef72f1$var$timeToMs(a) {\n    return a.hour * 3600000 + a.minute * 60000 + a.second * 1000 + a.millisecond;\n}\nfunction $571ccebef3ef72f1$export$126c91c941de7e(a, timeZone) {\n    let ms = $9ab2a87bc84c0bfa$export$5107c82f94518f5c(a, timeZone);\n    let tomorrow = a.add({\n        days: 1\n    });\n    let tomorrowMs = $9ab2a87bc84c0bfa$export$5107c82f94518f5c(tomorrow, timeZone);\n    return (tomorrowMs - ms) / 3600000;\n}\nlet $571ccebef3ef72f1$var$localTimeZone = null;\nfunction $571ccebef3ef72f1$export$aa8b41735afcabd2() {\n    // TODO: invalidate this somehow?\n    if ($571ccebef3ef72f1$var$localTimeZone == null) $571ccebef3ef72f1$var$localTimeZone = new Intl.DateTimeFormat().resolvedOptions().timeZone;\n    return $571ccebef3ef72f1$var$localTimeZone;\n}\nfunction $571ccebef3ef72f1$export$a5a3b454ada2268e(date) {\n    // Use `subtract` instead of `set` so we don't get constrained in an era.\n    return date.subtract({\n        days: date.day - 1\n    });\n}\nfunction $571ccebef3ef72f1$export$a2258d9c4118825c(date) {\n    return date.add({\n        days: date.calendar.getDaysInMonth(date) - date.day\n    });\n}\nfunction $571ccebef3ef72f1$export$f91e89d3d0406102(date) {\n    return $571ccebef3ef72f1$export$a5a3b454ada2268e(date.subtract({\n        months: date.month - 1\n    }));\n}\nfunction $571ccebef3ef72f1$export$8b7aa55c66d5569e(date) {\n    return $571ccebef3ef72f1$export$a2258d9c4118825c(date.add({\n        months: date.calendar.getMonthsInYear(date) - date.month\n    }));\n}\nfunction $571ccebef3ef72f1$export$5412ac11713b72ad(date) {\n    if (date.calendar.getMinimumMonthInYear) return date.calendar.getMinimumMonthInYear(date);\n    return 1;\n}\nfunction $571ccebef3ef72f1$export$b2f4953d301981d5(date) {\n    if (date.calendar.getMinimumDayInMonth) return date.calendar.getMinimumDayInMonth(date);\n    return 1;\n}\nfunction $571ccebef3ef72f1$export$42c81a444fbfb5d4(date, locale) {\n    let dayOfWeek = $571ccebef3ef72f1$export$2061056d06d7cdf7(date, locale);\n    return date.subtract({\n        days: dayOfWeek\n    });\n}\nfunction $571ccebef3ef72f1$export$ef8b6d9133084f4e(date, locale) {\n    return $571ccebef3ef72f1$export$42c81a444fbfb5d4(date, locale).add({\n        days: 6\n    });\n}\nconst $571ccebef3ef72f1$var$cachedRegions = new Map();\nfunction $571ccebef3ef72f1$var$getRegion(locale) {\n    // If the Intl.Locale API is available, use it to get the region for the locale.\n    // @ts-ignore\n    if (Intl.Locale) {\n        // Constructing an Intl.Locale is expensive, so cache the result.\n        let region = $571ccebef3ef72f1$var$cachedRegions.get(locale);\n        if (!region) {\n            // @ts-ignore\n            region = new Intl.Locale(locale).maximize().region;\n            $571ccebef3ef72f1$var$cachedRegions.set(locale, region);\n        }\n        return region;\n    }\n    // If not, just try splitting the string.\n    // If the second part of the locale string is 'u',\n    // then this is a unicode extension, so ignore it.\n    // Otherwise, it should be the region.\n    let part = locale.split('-')[1];\n    return part === 'u' ? null : part;\n}\nfunction $571ccebef3ef72f1$var$getWeekStart(locale) {\n    // TODO: use Intl.Locale for this once browsers support the weekInfo property\n    // https://github.com/tc39/proposal-intl-locale-info\n    let region = $571ccebef3ef72f1$var$getRegion(locale);\n    return $7470da919d0ed06d$export$7a5acbd77d414bd9[region] || 0;\n}\nfunction $571ccebef3ef72f1$export$ccc1b2479e7dd654(date, locale) {\n    let days = date.calendar.getDaysInMonth(date);\n    return Math.ceil(($571ccebef3ef72f1$export$2061056d06d7cdf7($571ccebef3ef72f1$export$a5a3b454ada2268e(date), locale) + days) / 7);\n}\nfunction $571ccebef3ef72f1$export$5c333a116e949cdd(a, b) {\n    return a.compare(b) <= 0 ? a : b;\n}\nfunction $571ccebef3ef72f1$export$a75f2bff57811055(a, b) {\n    return a.compare(b) >= 0 ? a : b;\n}\nconst $571ccebef3ef72f1$var$WEEKEND_DATA = {\n    AF: [\n        4,\n        5\n    ],\n    AE: [\n        5,\n        6\n    ],\n    BH: [\n        5,\n        6\n    ],\n    DZ: [\n        5,\n        6\n    ],\n    EG: [\n        5,\n        6\n    ],\n    IL: [\n        5,\n        6\n    ],\n    IQ: [\n        5,\n        6\n    ],\n    IR: [\n        5,\n        5\n    ],\n    JO: [\n        5,\n        6\n    ],\n    KW: [\n        5,\n        6\n    ],\n    LY: [\n        5,\n        6\n    ],\n    OM: [\n        5,\n        6\n    ],\n    QA: [\n        5,\n        6\n    ],\n    SA: [\n        5,\n        6\n    ],\n    SD: [\n        5,\n        6\n    ],\n    SY: [\n        5,\n        6\n    ],\n    YE: [\n        5,\n        6\n    ]\n};\nfunction $571ccebef3ef72f1$export$618d60ea299da42(date, locale) {\n    let julian = date.calendar.toJulianDay(date);\n    // If julian is negative, then julian % 7 will be negative, so we adjust\n    // accordingly.  Julian day 0 is Monday.\n    let dayOfWeek = Math.ceil(julian + 1) % 7;\n    if (dayOfWeek < 0) dayOfWeek += 7;\n    let region = $571ccebef3ef72f1$var$getRegion(locale);\n    // Use Intl.Locale for this once weekInfo is supported.\n    // https://github.com/tc39/proposal-intl-locale-info\n    let [start, end] = $571ccebef3ef72f1$var$WEEKEND_DATA[region] || [\n        6,\n        0\n    ];\n    return dayOfWeek === start || dayOfWeek === end;\n}\nfunction $571ccebef3ef72f1$export$ee9d87258e1d19ed(date, locale) {\n    return !$571ccebef3ef72f1$export$618d60ea299da42(date, locale);\n}\n\n\n\n\nfunction $6a413dc772e69324$export$842a2cf37af977e1(amount, numerator) {\n    return amount - numerator * Math.floor(amount / numerator);\n}\nfunction $6a413dc772e69324$export$784d13d8ee351f07(date) {\n    if (date.era) return new $418a5bbf7b2f3448$export$99faa760c7908e4f(date.calendar, date.era, date.year, date.month, date.day);\n    else return new $418a5bbf7b2f3448$export$99faa760c7908e4f(date.calendar, date.year, date.month, date.day);\n}\nfunction $6a413dc772e69324$export$27fa0172ae2644b3(date) {\n    if (date.era) return new $418a5bbf7b2f3448$export$ca871e8dbb80966f(date.calendar, date.era, date.year, date.month, date.day, date.hour, date.minute, date.second, date.millisecond);\n    else return new $418a5bbf7b2f3448$export$ca871e8dbb80966f(date.calendar, date.year, date.month, date.day, date.hour, date.minute, date.second);\n}\n\n\nconst $22a507fc519bfd45$var$EPOCH = 1721426; // 001/01/03 Julian C.E.\nfunction $22a507fc519bfd45$export$f297eb839006d339(year, month, day) {\n    let y1 = year - 1;\n    let monthOffset = -2;\n    if (month <= 2) monthOffset = 0;\n    else if ($22a507fc519bfd45$export$553d7fa8e3805fc0(year)) monthOffset = -1;\n    return $22a507fc519bfd45$var$EPOCH - 1 + 365 * y1 + Math.floor(y1 / 4) - Math.floor(y1 / 100) + Math.floor(y1 / 400) + Math.floor((367 * month - 362) / 12 + monthOffset + day);\n}\nfunction $22a507fc519bfd45$export$553d7fa8e3805fc0(year) {\n    return year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0);\n}\nconst $22a507fc519bfd45$var$daysInMonth = {\n    standard: [\n        31,\n        28,\n        31,\n        30,\n        31,\n        30,\n        31,\n        31,\n        30,\n        31,\n        30,\n        31\n    ],\n    leapyear: [\n        31,\n        29,\n        31,\n        30,\n        31,\n        30,\n        31,\n        31,\n        30,\n        31,\n        30,\n        31\n    ]\n};\nclass $22a507fc519bfd45$export$80ee6245ec4f29ec {\n    fromJulianDay(jd) {\n        let jd0 = jd;\n        let depoch = jd0 - $22a507fc519bfd45$var$EPOCH;\n        let quadricent = Math.floor(depoch / 146097);\n        let dqc = $6a413dc772e69324$export$842a2cf37af977e1(depoch, 146097);\n        let cent = Math.floor(dqc / 36524);\n        let dcent = $6a413dc772e69324$export$842a2cf37af977e1(dqc, 36524);\n        let quad = Math.floor(dcent / 1461);\n        let dquad = $6a413dc772e69324$export$842a2cf37af977e1(dcent, 1461);\n        let yindex = Math.floor(dquad / 365);\n        let year = quadricent * 400 + cent * 100 + quad * 4 + yindex + (cent !== 4 && yindex !== 4 ? 1 : 0);\n        let yearDay = jd0 - $22a507fc519bfd45$export$f297eb839006d339(year, 1, 1);\n        let leapAdj = 2;\n        if (jd0 < $22a507fc519bfd45$export$f297eb839006d339(year, 3, 1)) leapAdj = 0;\n        else if ($22a507fc519bfd45$export$553d7fa8e3805fc0(year)) leapAdj = 1;\n        let month = Math.floor(((yearDay + leapAdj) * 12 + 373) / 367);\n        let day = jd0 - $22a507fc519bfd45$export$f297eb839006d339(year, month, 1) + 1;\n        return new $418a5bbf7b2f3448$export$99faa760c7908e4f(this, year, month, day);\n    }\n    toJulianDay(date) {\n        return $22a507fc519bfd45$export$f297eb839006d339(date.year, date.month, date.day);\n    }\n    getDaysInMonth(date) {\n        return $22a507fc519bfd45$var$daysInMonth[$22a507fc519bfd45$export$553d7fa8e3805fc0(date.year) ? 'leapyear' : 'standard'][date.month - 1];\n    }\n    // eslint-disable-next-line @typescript-eslint/no-unused-vars\n    getMonthsInYear(date) {\n        return 12;\n    }\n    getDaysInYear(date) {\n        return $22a507fc519bfd45$export$553d7fa8e3805fc0(date.year) ? 366 : 365;\n    }\n    // eslint-disable-next-line @typescript-eslint/no-unused-vars\n    getYearsInEra(date) {\n        return 9999;\n    }\n    getEras() {\n        return [\n            'BC',\n            'AD'\n        ];\n    }\n    getYearsToAdd(date, years) {\n        return date.era === 'BC' ? -years : years;\n    }\n    balanceDate(date) {\n        if (date.year <= 0) {\n            date.era = date.era === 'BC' ? 'AD' : 'BC';\n            date.year = 1 - date.year;\n        }\n    }\n    constructor(){\n        this.identifier = 'gregory';\n    }\n}\n\n\nfunction $9ab2a87bc84c0bfa$export$bd4fb2bc8bb06fb(date) {\n    date = $9ab2a87bc84c0bfa$export$b4a036af3fc0b032(date, new $22a507fc519bfd45$export$80ee6245ec4f29ec());\n    return $9ab2a87bc84c0bfa$var$epochFromParts(date.year, date.month, date.day, date.hour, date.minute, date.second, date.millisecond);\n}\nfunction $9ab2a87bc84c0bfa$var$epochFromParts(year, month, day, hour, minute, second, millisecond) {\n    // Note: Date.UTC() interprets one and two-digit years as being in the\n    // 20th century, so don't use it\n    let date = new Date();\n    date.setUTCHours(hour, minute, second, millisecond);\n    date.setUTCFullYear(year, month - 1, day);\n    return date.getTime();\n}\nfunction $9ab2a87bc84c0bfa$export$59c99f3515d3493f(ms, timeZone) {\n    // Fast path: for local timezone, use native Date.\n    if (timeZone === $571ccebef3ef72f1$export$aa8b41735afcabd2()) return new Date(ms).getTimezoneOffset() * -60000;\n    let { year: year , month: month , day: day , hour: hour , minute: minute , second: second  } = $9ab2a87bc84c0bfa$var$getTimeZoneParts(ms, timeZone);\n    let utc = $9ab2a87bc84c0bfa$var$epochFromParts(year, month, day, hour, minute, second, 0);\n    return utc - Math.floor(ms / 1000) * 1000;\n}\nconst $9ab2a87bc84c0bfa$var$formattersByTimeZone = new Map();\nfunction $9ab2a87bc84c0bfa$var$getTimeZoneParts(ms, timeZone) {\n    let formatter = $9ab2a87bc84c0bfa$var$formattersByTimeZone.get(timeZone);\n    if (!formatter) {\n        formatter = new Intl.DateTimeFormat('en-US', {\n            timeZone: timeZone,\n            hour12: false,\n            era: 'short',\n            year: 'numeric',\n            month: 'numeric',\n            day: 'numeric',\n            hour: 'numeric',\n            minute: 'numeric',\n            second: 'numeric'\n        });\n        $9ab2a87bc84c0bfa$var$formattersByTimeZone.set(timeZone, formatter);\n    }\n    let parts = formatter.formatToParts(new Date(ms));\n    let namedParts = {\n    };\n    for (let part of parts)if (part.type !== 'literal') namedParts[part.type] = part.value;\n    return {\n        year: namedParts.era === 'BC' ? -namedParts.year + 1 : +namedParts.year,\n        month: +namedParts.month,\n        day: +namedParts.day,\n        hour: namedParts.hour === '24' ? 0 : +namedParts.hour,\n        minute: +namedParts.minute,\n        second: +namedParts.second\n    };\n}\nconst $9ab2a87bc84c0bfa$var$DAYMILLIS = 86400000;\nfunction $9ab2a87bc84c0bfa$export$136f38efe7caf549(date, timeZone) {\n    let ms = $9ab2a87bc84c0bfa$export$bd4fb2bc8bb06fb(date);\n    let earlier = ms - $9ab2a87bc84c0bfa$export$59c99f3515d3493f(ms - $9ab2a87bc84c0bfa$var$DAYMILLIS, timeZone);\n    let later = ms - $9ab2a87bc84c0bfa$export$59c99f3515d3493f(ms + $9ab2a87bc84c0bfa$var$DAYMILLIS, timeZone);\n    return $9ab2a87bc84c0bfa$var$getValidWallTimes(date, timeZone, earlier, later);\n}\nfunction $9ab2a87bc84c0bfa$var$getValidWallTimes(date, timeZone, earlier, later) {\n    let found = earlier === later ? [\n        earlier\n    ] : [\n        earlier,\n        later\n    ];\n    return found.filter((absolute)=>$9ab2a87bc84c0bfa$var$isValidWallTime(date, timeZone, absolute)\n    );\n}\nfunction $9ab2a87bc84c0bfa$var$isValidWallTime(date, timeZone, absolute) {\n    let parts = $9ab2a87bc84c0bfa$var$getTimeZoneParts(absolute, timeZone);\n    return date.year === parts.year && date.month === parts.month && date.day === parts.day && date.hour === parts.hour && date.minute === parts.minute && date.second === parts.second;\n}\nfunction $9ab2a87bc84c0bfa$export$5107c82f94518f5c(date, timeZone, disambiguation = 'compatible') {\n    let dateTime = $9ab2a87bc84c0bfa$export$b21e0b124e224484(date);\n    // Fast path: if the time zone is the local timezone and disambiguation is compatible, use native Date.\n    if (timeZone === $571ccebef3ef72f1$export$aa8b41735afcabd2() && disambiguation === 'compatible') {\n        dateTime = $9ab2a87bc84c0bfa$export$b4a036af3fc0b032(dateTime, new $22a507fc519bfd45$export$80ee6245ec4f29ec());\n        // Don't use Date constructor here because two-digit years are interpreted in the 20th century.\n        let date = new Date();\n        date.setFullYear(dateTime.year, dateTime.month - 1, dateTime.day);\n        date.setHours(dateTime.hour, dateTime.minute, dateTime.second, dateTime.millisecond);\n        return date.getTime();\n    }\n    let ms = $9ab2a87bc84c0bfa$export$bd4fb2bc8bb06fb(dateTime);\n    let offsetBefore = $9ab2a87bc84c0bfa$export$59c99f3515d3493f(ms - $9ab2a87bc84c0bfa$var$DAYMILLIS, timeZone);\n    let offsetAfter = $9ab2a87bc84c0bfa$export$59c99f3515d3493f(ms + $9ab2a87bc84c0bfa$var$DAYMILLIS, timeZone);\n    let valid = $9ab2a87bc84c0bfa$var$getValidWallTimes(dateTime, timeZone, ms - offsetBefore, ms - offsetAfter);\n    if (valid.length === 1) return valid[0];\n    if (valid.length > 1) switch(disambiguation){\n        // 'compatible' means 'earlier' for \"fall back\" transitions\n        case 'compatible':\n        case 'earlier':\n            return valid[0];\n        case 'later':\n            return valid[valid.length - 1];\n        case 'reject':\n            throw new RangeError('Multiple possible absolute times found');\n    }\n    switch(disambiguation){\n        case 'earlier':\n            return Math.min(ms - offsetBefore, ms - offsetAfter);\n        // 'compatible' means 'later' for \"spring forward\" transitions\n        case 'compatible':\n        case 'later':\n            return Math.max(ms - offsetBefore, ms - offsetAfter);\n        case 'reject':\n            throw new RangeError('No such absolute time found');\n    }\n}\nfunction $9ab2a87bc84c0bfa$export$e67a095c620b86fe(dateTime, timeZone, disambiguation = 'compatible') {\n    return new Date($9ab2a87bc84c0bfa$export$5107c82f94518f5c(dateTime, timeZone, disambiguation));\n}\nfunction $9ab2a87bc84c0bfa$export$1b96692a1ba042ac(ms, timeZone) {\n    let offset = $9ab2a87bc84c0bfa$export$59c99f3515d3493f(ms, timeZone);\n    let date = new Date(ms + offset);\n    let year = date.getUTCFullYear();\n    let month = date.getUTCMonth() + 1;\n    let day = date.getUTCDate();\n    let hour = date.getUTCHours();\n    let minute = date.getUTCMinutes();\n    let second = date.getUTCSeconds();\n    let millisecond = date.getUTCMilliseconds();\n    return new $418a5bbf7b2f3448$export$d3b7288e7994edea(year, month, day, timeZone, offset, hour, minute, second, millisecond);\n}\nfunction $9ab2a87bc84c0bfa$export$e57ff100d91bd4b9(date, timeZone) {\n    return $9ab2a87bc84c0bfa$export$1b96692a1ba042ac(date.getTime(), timeZone);\n}\nfunction $9ab2a87bc84c0bfa$export$d7f92bcd3596b086(date) {\n    return $9ab2a87bc84c0bfa$export$e57ff100d91bd4b9(date, $571ccebef3ef72f1$export$aa8b41735afcabd2());\n}\nfunction $9ab2a87bc84c0bfa$export$93522d1a439f3617(dateTime) {\n    return new $418a5bbf7b2f3448$export$99faa760c7908e4f(dateTime.calendar, dateTime.era, dateTime.year, dateTime.month, dateTime.day);\n}\nfunction $9ab2a87bc84c0bfa$export$6f4d78149f3f53ac(date) {\n    return {\n        era: date.era,\n        year: date.year,\n        month: date.month,\n        day: date.day\n    };\n}\nfunction $9ab2a87bc84c0bfa$export$4d0393e732857be5(date) {\n    return {\n        hour: date.hour,\n        minute: date.minute,\n        second: date.second,\n        millisecond: date.millisecond\n    };\n}\nfunction $9ab2a87bc84c0bfa$export$b21e0b124e224484(date, time) {\n    let hour = 0, minute = 0, second = 0, millisecond = 0;\n    if ('timeZone' in date) ({ hour: hour , minute: minute , second: second , millisecond: millisecond  } = date);\n    else if ('hour' in date && !time) return date;\n    if (time) ({ hour: hour , minute: minute , second: second , millisecond: millisecond  } = time);\n    return new $418a5bbf7b2f3448$export$ca871e8dbb80966f(date.calendar, date.era, date.year, date.month, date.day, hour, minute, second, millisecond);\n}\nfunction $9ab2a87bc84c0bfa$export$d33f79e3ffc3dc83(dateTime) {\n    return new $418a5bbf7b2f3448$export$680ea196effce5f(dateTime.hour, dateTime.minute, dateTime.second, dateTime.millisecond);\n}\nfunction $9ab2a87bc84c0bfa$export$b4a036af3fc0b032(date, calendar) {\n    if (date.calendar.identifier === calendar.identifier) return date;\n    let calendarDate = calendar.fromJulianDay(date.calendar.toJulianDay(date));\n    let copy = date.copy();\n    copy.calendar = calendar;\n    copy.era = calendarDate.era;\n    copy.year = calendarDate.year;\n    copy.month = calendarDate.month;\n    copy.day = calendarDate.day;\n    return copy;\n}\nfunction $9ab2a87bc84c0bfa$export$84c95a83c799e074(date, timeZone, disambiguation) {\n    if (date instanceof $418a5bbf7b2f3448$export$d3b7288e7994edea) {\n        if (date.timeZone === timeZone) return date;\n        return $9ab2a87bc84c0bfa$export$538b00033cc11c75(date, timeZone);\n    }\n    let ms = $9ab2a87bc84c0bfa$export$5107c82f94518f5c(date, timeZone, disambiguation);\n    return $9ab2a87bc84c0bfa$export$1b96692a1ba042ac(ms, timeZone);\n}\nfunction $9ab2a87bc84c0bfa$export$83aac07b4c37b25(date) {\n    let ms = $9ab2a87bc84c0bfa$export$bd4fb2bc8bb06fb(date) - date.offset;\n    return new Date(ms);\n}\nfunction $9ab2a87bc84c0bfa$export$538b00033cc11c75(date, timeZone) {\n    let ms = $9ab2a87bc84c0bfa$export$bd4fb2bc8bb06fb(date) - date.offset;\n    return $9ab2a87bc84c0bfa$export$b4a036af3fc0b032($9ab2a87bc84c0bfa$export$1b96692a1ba042ac(ms, timeZone), date.calendar);\n}\nfunction $9ab2a87bc84c0bfa$export$d9b67bc93c097491(date) {\n    return $9ab2a87bc84c0bfa$export$538b00033cc11c75(date, $571ccebef3ef72f1$export$aa8b41735afcabd2());\n}\n\n\n\nconst $1e1f3157d0513e0f$var$ONE_HOUR = 3600000;\nfunction $1e1f3157d0513e0f$export$e16d8520af44a096(date, duration) {\n    let mutableDate = date.copy();\n    let days = 'hour' in date ? $1e1f3157d0513e0f$var$addTimeFields(date, duration) : 0;\n    $1e1f3157d0513e0f$var$addYears(mutableDate, duration.years || 0);\n    if (mutableDate.calendar.balanceYearMonth) mutableDate.calendar.balanceYearMonth(mutableDate, date);\n    mutableDate.month += duration.months || 0;\n    $1e1f3157d0513e0f$var$balanceYearMonth(mutableDate);\n    $1e1f3157d0513e0f$var$constrainMonthDay(mutableDate);\n    mutableDate.day += (duration.weeks || 0) * 7;\n    mutableDate.day += duration.days || 0;\n    mutableDate.day += days;\n    $1e1f3157d0513e0f$var$balanceDay(mutableDate);\n    if (mutableDate.calendar.balanceDate) mutableDate.calendar.balanceDate(mutableDate);\n    return mutableDate;\n}\nfunction $1e1f3157d0513e0f$var$addYears(date, years) {\n    if (date.calendar.getYearsToAdd) years = date.calendar.getYearsToAdd(date, years);\n    date.year += years;\n}\nfunction $1e1f3157d0513e0f$var$balanceYearMonth(date) {\n    while(date.month < 1){\n        $1e1f3157d0513e0f$var$addYears(date, -1);\n        date.month += date.calendar.getMonthsInYear(date);\n    }\n    let monthsInYear = 0;\n    while(date.month > (monthsInYear = date.calendar.getMonthsInYear(date))){\n        date.month -= monthsInYear;\n        $1e1f3157d0513e0f$var$addYears(date, 1);\n    }\n}\nfunction $1e1f3157d0513e0f$var$balanceDay(date) {\n    while(date.day < 1){\n        date.month--;\n        $1e1f3157d0513e0f$var$balanceYearMonth(date);\n        date.day += date.calendar.getDaysInMonth(date);\n    }\n    while(date.day > date.calendar.getDaysInMonth(date)){\n        date.day -= date.calendar.getDaysInMonth(date);\n        date.month++;\n        $1e1f3157d0513e0f$var$balanceYearMonth(date);\n    }\n}\nfunction $1e1f3157d0513e0f$var$constrainMonthDay(date) {\n    date.month = Math.max(1, Math.min(date.calendar.getMonthsInYear(date), date.month));\n    date.day = Math.max(1, Math.min(date.calendar.getDaysInMonth(date), date.day));\n}\nfunction $1e1f3157d0513e0f$export$c4e2ecac49351ef2(date) {\n    if (date.calendar.constrainDate) date.calendar.constrainDate(date);\n    date.year = Math.max(1, Math.min(date.calendar.getYearsInEra(date), date.year));\n    $1e1f3157d0513e0f$var$constrainMonthDay(date);\n}\nfunction $1e1f3157d0513e0f$export$3e2544e88a25bff8(duration) {\n    let inverseDuration = {\n    };\n    for(let key in duration)if (typeof duration[key] === 'number') inverseDuration[key] = -duration[key];\n    return inverseDuration;\n}\nfunction $1e1f3157d0513e0f$export$4e2d2ead65e5f7e3(date, duration) {\n    return $1e1f3157d0513e0f$export$e16d8520af44a096(date, $1e1f3157d0513e0f$export$3e2544e88a25bff8(duration));\n}\nfunction $1e1f3157d0513e0f$export$adaa4cf7ef1b65be(date, fields) {\n    let mutableDate = date.copy();\n    if (fields.era != null) mutableDate.era = fields.era;\n    if (fields.year != null) mutableDate.year = fields.year;\n    if (fields.month != null) mutableDate.month = fields.month;\n    if (fields.day != null) mutableDate.day = fields.day;\n    $1e1f3157d0513e0f$export$c4e2ecac49351ef2(mutableDate);\n    return mutableDate;\n}\nfunction $1e1f3157d0513e0f$export$e5d5e1c1822b6e56(value, fields) {\n    let mutableValue = value.copy();\n    if (fields.hour != null) mutableValue.hour = fields.hour;\n    if (fields.minute != null) mutableValue.minute = fields.minute;\n    if (fields.second != null) mutableValue.second = fields.second;\n    if (fields.millisecond != null) mutableValue.millisecond = fields.millisecond;\n    $1e1f3157d0513e0f$export$7555de1e070510cb(mutableValue);\n    return mutableValue;\n}\nfunction $1e1f3157d0513e0f$var$balanceTime(time) {\n    time.second += Math.floor(time.millisecond / 1000);\n    time.millisecond = $1e1f3157d0513e0f$var$nonNegativeMod(time.millisecond, 1000);\n    time.minute += Math.floor(time.second / 60);\n    time.second = $1e1f3157d0513e0f$var$nonNegativeMod(time.second, 60);\n    time.hour += Math.floor(time.minute / 60);\n    time.minute = $1e1f3157d0513e0f$var$nonNegativeMod(time.minute, 60);\n    let days = Math.floor(time.hour / 24);\n    time.hour = $1e1f3157d0513e0f$var$nonNegativeMod(time.hour, 24);\n    return days;\n}\nfunction $1e1f3157d0513e0f$export$7555de1e070510cb(time) {\n    time.millisecond = Math.max(0, Math.min(time.millisecond, 1000));\n    time.second = Math.max(0, Math.min(time.second, 59));\n    time.minute = Math.max(0, Math.min(time.minute, 59));\n    time.hour = Math.max(0, Math.min(time.hour, 23));\n}\nfunction $1e1f3157d0513e0f$var$nonNegativeMod(a, b) {\n    let result = a % b;\n    if (result < 0) result += b;\n    return result;\n}\nfunction $1e1f3157d0513e0f$var$addTimeFields(time, duration) {\n    time.hour += duration.hours || 0;\n    time.minute += duration.minutes || 0;\n    time.second += duration.seconds || 0;\n    time.millisecond += duration.milliseconds || 0;\n    return $1e1f3157d0513e0f$var$balanceTime(time);\n}\nfunction $1e1f3157d0513e0f$export$7ed87b6bc2506470(time, duration) {\n    let res = time.copy();\n    $1e1f3157d0513e0f$var$addTimeFields(res, duration);\n    return res;\n}\nfunction $1e1f3157d0513e0f$export$fe34d3a381cd7501(time, duration) {\n    return $1e1f3157d0513e0f$export$7ed87b6bc2506470(time, $1e1f3157d0513e0f$export$3e2544e88a25bff8(duration));\n}\nfunction $1e1f3157d0513e0f$export$d52ced6badfb9a4c(value, field, amount, options) {\n    let mutable = value.copy();\n    switch(field){\n        case 'era':\n            {\n                let eras = value.calendar.getEras();\n                let eraIndex = eras.indexOf(value.era);\n                if (eraIndex < 0) throw new Error('Invalid era: ' + value.era);\n                eraIndex = $1e1f3157d0513e0f$var$cycleValue(eraIndex, amount, 0, eras.length - 1, options === null || options === void 0 ? void 0 : options.round);\n                mutable.era = eras[eraIndex];\n                // Constrain the year and other fields within the era, so the era doesn't change when we balance below.\n                $1e1f3157d0513e0f$export$c4e2ecac49351ef2(mutable);\n                break;\n            }\n        case 'year':\n            if (mutable.calendar.getYearsToAdd) amount = mutable.calendar.getYearsToAdd(mutable, amount);\n            // The year field should not cycle within the era as that can cause weird behavior affecting other fields.\n            // We need to also allow values < 1 so that decrementing goes to the previous era. If we get -Infinity back\n            // we know we wrapped around after reaching 9999 (the maximum), so set the year back to 1.\n            mutable.year = $1e1f3157d0513e0f$var$cycleValue(value.year, amount, -Infinity, 9999, options === null || options === void 0 ? void 0 : options.round);\n            if (mutable.year === -Infinity) mutable.year = 1;\n            if (mutable.calendar.balanceYearMonth) mutable.calendar.balanceYearMonth(mutable, value);\n            break;\n        case 'month':\n            mutable.month = $1e1f3157d0513e0f$var$cycleValue(value.month, amount, 1, value.calendar.getMonthsInYear(value), options === null || options === void 0 ? void 0 : options.round);\n            break;\n        case 'day':\n            mutable.day = $1e1f3157d0513e0f$var$cycleValue(value.day, amount, 1, value.calendar.getDaysInMonth(value), options === null || options === void 0 ? void 0 : options.round);\n            break;\n        default:\n            throw new Error('Unsupported field ' + field);\n    }\n    if (value.calendar.balanceDate) value.calendar.balanceDate(mutable);\n    $1e1f3157d0513e0f$export$c4e2ecac49351ef2(mutable);\n    return mutable;\n}\nfunction $1e1f3157d0513e0f$export$dd02b3e0007dfe28(value, field, amount, options) {\n    let mutable = value.copy();\n    switch(field){\n        case 'hour':\n            {\n                let hours = value.hour;\n                let min = 0;\n                let max = 23;\n                if ((options === null || options === void 0 ? void 0 : options.hourCycle) === 12) {\n                    let isPM = hours >= 12;\n                    min = isPM ? 12 : 0;\n                    max = isPM ? 23 : 11;\n                }\n                mutable.hour = $1e1f3157d0513e0f$var$cycleValue(hours, amount, min, max, options === null || options === void 0 ? void 0 : options.round);\n                break;\n            }\n        case 'minute':\n            mutable.minute = $1e1f3157d0513e0f$var$cycleValue(value.minute, amount, 0, 59, options === null || options === void 0 ? void 0 : options.round);\n            break;\n        case 'second':\n            mutable.second = $1e1f3157d0513e0f$var$cycleValue(value.second, amount, 0, 59, options === null || options === void 0 ? void 0 : options.round);\n            break;\n        case 'millisecond':\n            mutable.millisecond = $1e1f3157d0513e0f$var$cycleValue(value.millisecond, amount, 0, 999, options === null || options === void 0 ? void 0 : options.round);\n            break;\n        default:\n            throw new Error('Unsupported field ' + field);\n    }\n    return mutable;\n}\nfunction $1e1f3157d0513e0f$var$cycleValue(value, amount, min, max, round = false) {\n    if (round) {\n        value += Math.sign(amount);\n        if (value < min) value = max;\n        let div = Math.abs(amount);\n        if (amount > 0) value = Math.ceil(value / div) * div;\n        else value = Math.floor(value / div) * div;\n        if (value > max) value = min;\n    } else {\n        value += amount;\n        if (value < min) value = max - (min - value - 1);\n        else if (value > max) value = min + (value - max - 1);\n    }\n    return value;\n}\nfunction $1e1f3157d0513e0f$export$96b1d28349274637(dateTime, duration) {\n    let ms;\n    if (duration.years != null && duration.years !== 0 || duration.months != null && duration.months !== 0 || duration.days != null && duration.days !== 0) {\n        let res = $1e1f3157d0513e0f$export$e16d8520af44a096($9ab2a87bc84c0bfa$export$b21e0b124e224484(dateTime), {\n            years: duration.years,\n            months: duration.months,\n            days: duration.days\n        });\n        // Changing the date may change the timezone offset, so we need to recompute\n        // using the 'compatible' disambiguation.\n        ms = $9ab2a87bc84c0bfa$export$5107c82f94518f5c(res, dateTime.timeZone);\n    } else // Otherwise, preserve the offset of the original date.\n    ms = $9ab2a87bc84c0bfa$export$bd4fb2bc8bb06fb(dateTime) - dateTime.offset;\n    // Perform time manipulation in milliseconds rather than on the original time fields to account for DST.\n    // For example, adding one hour during a DST transition may result in the hour field staying the same or\n    // skipping an hour. This results in the offset field changing value instead of the specified field.\n    ms += duration.milliseconds || 0;\n    ms += (duration.seconds || 0) * 1000;\n    ms += (duration.minutes || 0) * 60000;\n    ms += (duration.hours || 0) * 3600000;\n    let res = $9ab2a87bc84c0bfa$export$1b96692a1ba042ac(ms, dateTime.timeZone);\n    return $9ab2a87bc84c0bfa$export$b4a036af3fc0b032(res, dateTime.calendar);\n}\nfunction $1e1f3157d0513e0f$export$6814caac34ca03c7(dateTime, duration) {\n    return $1e1f3157d0513e0f$export$96b1d28349274637(dateTime, $1e1f3157d0513e0f$export$3e2544e88a25bff8(duration));\n}\nfunction $1e1f3157d0513e0f$export$9a297d111fc86b79(dateTime, field, amount, options) {\n    // For date fields, we want the time to remain consistent and the UTC offset to potentially change to account for DST changes.\n    // For time fields, we want the time to change by the amount given. This may result in the hour field staying the same, but the UTC\n    // offset changing in the case of a backward DST transition, or skipping an hour in the case of a forward DST transition.\n    switch(field){\n        case 'hour':\n            {\n                let min = 0;\n                let max = 23;\n                if ((options === null || options === void 0 ? void 0 : options.hourCycle) === 12) {\n                    let isPM = dateTime.hour >= 12;\n                    min = isPM ? 12 : 0;\n                    max = isPM ? 23 : 11;\n                }\n                // The minimum and maximum hour may be affected by daylight saving time.\n                // For example, it might jump forward at midnight, and skip 1am.\n                // Or it might end at midnight and repeat the 11pm hour. To handle this, we get\n                // the possible absolute times for the min and max, and find the maximum range\n                // that is within the current day.\n                let plainDateTime = $9ab2a87bc84c0bfa$export$b21e0b124e224484(dateTime);\n                let minDate = $9ab2a87bc84c0bfa$export$b4a036af3fc0b032($1e1f3157d0513e0f$export$e5d5e1c1822b6e56(plainDateTime, {\n                    hour: min\n                }), new $22a507fc519bfd45$export$80ee6245ec4f29ec());\n                let minAbsolute = [\n                    $9ab2a87bc84c0bfa$export$5107c82f94518f5c(minDate, dateTime.timeZone, 'earlier'),\n                    $9ab2a87bc84c0bfa$export$5107c82f94518f5c(minDate, dateTime.timeZone, 'later')\n                ].filter((ms)=>$9ab2a87bc84c0bfa$export$1b96692a1ba042ac(ms, dateTime.timeZone).day === minDate.day\n                )[0];\n                let maxDate = $9ab2a87bc84c0bfa$export$b4a036af3fc0b032($1e1f3157d0513e0f$export$e5d5e1c1822b6e56(plainDateTime, {\n                    hour: max\n                }), new $22a507fc519bfd45$export$80ee6245ec4f29ec());\n                let maxAbsolute = [\n                    $9ab2a87bc84c0bfa$export$5107c82f94518f5c(maxDate, dateTime.timeZone, 'earlier'),\n                    $9ab2a87bc84c0bfa$export$5107c82f94518f5c(maxDate, dateTime.timeZone, 'later')\n                ].filter((ms)=>$9ab2a87bc84c0bfa$export$1b96692a1ba042ac(ms, dateTime.timeZone).day === maxDate.day\n                ).pop();\n                // Since hours may repeat, we need to operate on the absolute time in milliseconds.\n                // This is done in hours from the Unix epoch so that cycleValue works correctly,\n                // and then converted back to milliseconds.\n                let ms1 = $9ab2a87bc84c0bfa$export$bd4fb2bc8bb06fb(dateTime) - dateTime.offset;\n                let hours = Math.floor(ms1 / $1e1f3157d0513e0f$var$ONE_HOUR);\n                let remainder = ms1 % $1e1f3157d0513e0f$var$ONE_HOUR;\n                ms1 = $1e1f3157d0513e0f$var$cycleValue(hours, amount, Math.floor(minAbsolute / $1e1f3157d0513e0f$var$ONE_HOUR), Math.floor(maxAbsolute / $1e1f3157d0513e0f$var$ONE_HOUR), options === null || options === void 0 ? void 0 : options.round) * $1e1f3157d0513e0f$var$ONE_HOUR + remainder;\n                // Now compute the new timezone offset, and convert the absolute time back to local time.\n                return $9ab2a87bc84c0bfa$export$b4a036af3fc0b032($9ab2a87bc84c0bfa$export$1b96692a1ba042ac(ms1, dateTime.timeZone), dateTime.calendar);\n            }\n        case 'minute':\n        case 'second':\n        case 'millisecond':\n            // @ts-ignore\n            return $1e1f3157d0513e0f$export$dd02b3e0007dfe28(dateTime, field, amount, options);\n        case 'era':\n        case 'year':\n        case 'month':\n        case 'day':\n            {\n                let res = $1e1f3157d0513e0f$export$d52ced6badfb9a4c($9ab2a87bc84c0bfa$export$b21e0b124e224484(dateTime), field, amount, options);\n                let ms = $9ab2a87bc84c0bfa$export$5107c82f94518f5c(res, dateTime.timeZone);\n                return $9ab2a87bc84c0bfa$export$b4a036af3fc0b032($9ab2a87bc84c0bfa$export$1b96692a1ba042ac(ms, dateTime.timeZone), dateTime.calendar);\n            }\n        default:\n            throw new Error('Unsupported field ' + field);\n    }\n}\nfunction $1e1f3157d0513e0f$export$31b5430eb18be4f8(dateTime, fields, disambiguation) {\n    // Set the date/time fields, and recompute the UTC offset to account for DST changes.\n    // We also need to validate by converting back to a local time in case hours are skipped during forward DST transitions.\n    let plainDateTime = $9ab2a87bc84c0bfa$export$b21e0b124e224484(dateTime);\n    let res = $1e1f3157d0513e0f$export$e5d5e1c1822b6e56($1e1f3157d0513e0f$export$adaa4cf7ef1b65be(plainDateTime, fields), fields);\n    // If the resulting plain date time values are equal, return the original time.\n    // We don't want to change the offset when setting the time to the same value.\n    if (res.compare(plainDateTime) === 0) return dateTime;\n    let ms = $9ab2a87bc84c0bfa$export$5107c82f94518f5c(res, dateTime.timeZone, disambiguation);\n    return $9ab2a87bc84c0bfa$export$b4a036af3fc0b032($9ab2a87bc84c0bfa$export$1b96692a1ba042ac(ms, dateTime.timeZone), dateTime.calendar);\n}\n\n\n\nvar $78b7d46219519df2$exports = {};\n\n$parcel$export($78b7d46219519df2$exports, \"parseTime\", () => $78b7d46219519df2$export$c9698ec7f05a07e1);\n$parcel$export($78b7d46219519df2$exports, \"parseDate\", () => $78b7d46219519df2$export$6b862160d295c8e);\n$parcel$export($78b7d46219519df2$exports, \"parseDateTime\", () => $78b7d46219519df2$export$588937bcd60ade55);\n$parcel$export($78b7d46219519df2$exports, \"parseZonedDateTime\", () => $78b7d46219519df2$export$fd7893f06e92a6a4);\n$parcel$export($78b7d46219519df2$exports, \"dateTimeToString\", () => $78b7d46219519df2$export$4223de14708adc63);\n$parcel$export($78b7d46219519df2$exports, \"parseAbsolute\", () => $78b7d46219519df2$export$5adfdab05168c219);\n$parcel$export($78b7d46219519df2$exports, \"parseAbsoluteToLocal\", () => $78b7d46219519df2$export$8e384432362ed0f0);\n$parcel$export($78b7d46219519df2$exports, \"timeToString\", () => $78b7d46219519df2$export$f59dee82248f5ad4);\n$parcel$export($78b7d46219519df2$exports, \"dateToString\", () => $78b7d46219519df2$export$60dfd74aa96791bd);\n$parcel$export($78b7d46219519df2$exports, \"zonedDateTimeToString\", () => $78b7d46219519df2$export$bf79f1ebf4b18792);\n\n\n\n\nconst $78b7d46219519df2$var$TIME_RE = /^(\\d{2})(?::(\\d{2}))?(?::(\\d{2}))?(\\.\\d+)?$/;\nconst $78b7d46219519df2$var$DATE_RE = /^(\\d{4})-(\\d{2})-(\\d{2})$/;\nconst $78b7d46219519df2$var$DATE_TIME_RE = /^(\\d{4})-(\\d{2})-(\\d{2})(?:T(\\d{2}))?(?::(\\d{2}))?(?::(\\d{2}))?(\\.\\d+)?$/;\nconst $78b7d46219519df2$var$ZONED_DATE_TIME_RE = /^(\\d{4})-(\\d{2})-(\\d{2})(?:T(\\d{2}))?(?::(\\d{2}))?(?::(\\d{2}))?(\\.\\d+)?(?:([+-]\\d{2})(?::(\\d{2}))?)?\\[(.*?)\\]$/;\nconst $78b7d46219519df2$var$ABSOLUTE_RE = /^(\\d{4})-(\\d{2})-(\\d{2})(?:T(\\d{2}))?(?::(\\d{2}))?(?::(\\d{2}))?(\\.\\d+)?(?:(?:([+-]\\d{2})(?::(\\d{2}))?)|Z)$/;\nfunction $78b7d46219519df2$export$c9698ec7f05a07e1(value) {\n    let m = value.match($78b7d46219519df2$var$TIME_RE);\n    if (!m) throw new Error('Invalid ISO 8601 time string: ' + value);\n    return new $418a5bbf7b2f3448$export$680ea196effce5f($78b7d46219519df2$var$parseNumber(m[1], 0, 23), m[2] ? $78b7d46219519df2$var$parseNumber(m[2], 0, 59) : 0, m[3] ? $78b7d46219519df2$var$parseNumber(m[3], 0, 59) : 0, m[4] ? $78b7d46219519df2$var$parseNumber(m[4], 0, Infinity) * 1000 : 0);\n}\nfunction $78b7d46219519df2$export$6b862160d295c8e(value) {\n    let m = value.match($78b7d46219519df2$var$DATE_RE);\n    if (!m) throw new Error('Invalid ISO 8601 date string: ' + value);\n    let date = new $418a5bbf7b2f3448$export$99faa760c7908e4f($78b7d46219519df2$var$parseNumber(m[1], 0, 9999), $78b7d46219519df2$var$parseNumber(m[2], 1, 12), 1);\n    date.day = $78b7d46219519df2$var$parseNumber(m[3], 0, date.calendar.getDaysInMonth(date));\n    return date;\n}\nfunction $78b7d46219519df2$export$588937bcd60ade55(value) {\n    let m = value.match($78b7d46219519df2$var$DATE_TIME_RE);\n    if (!m) throw new Error('Invalid ISO 8601 date time string: ' + value);\n    let date = new $418a5bbf7b2f3448$export$ca871e8dbb80966f($78b7d46219519df2$var$parseNumber(m[1], 1, 9999), $78b7d46219519df2$var$parseNumber(m[2], 1, 12), 1, m[4] ? $78b7d46219519df2$var$parseNumber(m[4], 0, 23) : 0, m[5] ? $78b7d46219519df2$var$parseNumber(m[5], 0, 59) : 0, m[6] ? $78b7d46219519df2$var$parseNumber(m[6], 0, 59) : 0, m[7] ? $78b7d46219519df2$var$parseNumber(m[7], 0, Infinity) * 1000 : 0);\n    date.day = $78b7d46219519df2$var$parseNumber(m[3], 0, date.calendar.getDaysInMonth(date));\n    return date;\n}\nfunction $78b7d46219519df2$export$fd7893f06e92a6a4(value, disambiguation) {\n    let m = value.match($78b7d46219519df2$var$ZONED_DATE_TIME_RE);\n    if (!m) throw new Error('Invalid ISO 8601 date time string: ' + value);\n    let date = new $418a5bbf7b2f3448$export$d3b7288e7994edea($78b7d46219519df2$var$parseNumber(m[1], 1, 9999), $78b7d46219519df2$var$parseNumber(m[2], 1, 12), 1, m[10], 0, m[4] ? $78b7d46219519df2$var$parseNumber(m[4], 0, 23) : 0, m[5] ? $78b7d46219519df2$var$parseNumber(m[5], 0, 59) : 0, m[6] ? $78b7d46219519df2$var$parseNumber(m[6], 0, 59) : 0, m[7] ? $78b7d46219519df2$var$parseNumber(m[7], 0, Infinity) * 1000 : 0);\n    date.day = $78b7d46219519df2$var$parseNumber(m[3], 0, date.calendar.getDaysInMonth(date));\n    let plainDateTime = $9ab2a87bc84c0bfa$export$b21e0b124e224484(date);\n    let ms;\n    if (m[8]) {\n        var ref;\n        date.offset = $78b7d46219519df2$var$parseNumber(m[8], -23, 23) * 3600000 + $78b7d46219519df2$var$parseNumber((ref = m[9]) !== null && ref !== void 0 ? ref : '0', 0, 59) * 60000;\n        ms = $9ab2a87bc84c0bfa$export$bd4fb2bc8bb06fb(date) - date.offset;\n        // Validate offset against parsed date.\n        let absolutes = $9ab2a87bc84c0bfa$export$136f38efe7caf549(plainDateTime, date.timeZone);\n        if (!absolutes.includes(ms)) throw new Error(`Offset ${$78b7d46219519df2$var$offsetToString(date.offset)} is invalid for ${$78b7d46219519df2$export$4223de14708adc63(date)} in ${date.timeZone}`);\n    } else // Convert to absolute and back to fix invalid times due to DST.\n    ms = $9ab2a87bc84c0bfa$export$5107c82f94518f5c($9ab2a87bc84c0bfa$export$b21e0b124e224484(plainDateTime), date.timeZone, disambiguation);\n    return $9ab2a87bc84c0bfa$export$1b96692a1ba042ac(ms, date.timeZone);\n}\nfunction $78b7d46219519df2$export$5adfdab05168c219(value, timeZone) {\n    let m = value.match($78b7d46219519df2$var$ABSOLUTE_RE);\n    if (!m) throw new Error('Invalid ISO 8601 date time string: ' + value);\n    let date = new $418a5bbf7b2f3448$export$d3b7288e7994edea($78b7d46219519df2$var$parseNumber(m[1], 1, 9999), $78b7d46219519df2$var$parseNumber(m[2], 1, 12), 1, timeZone, 0, m[4] ? $78b7d46219519df2$var$parseNumber(m[4], 0, 23) : 0, m[5] ? $78b7d46219519df2$var$parseNumber(m[5], 0, 59) : 0, m[6] ? $78b7d46219519df2$var$parseNumber(m[6], 0, 59) : 0, m[7] ? $78b7d46219519df2$var$parseNumber(m[7], 0, Infinity) * 1000 : 0);\n    date.day = $78b7d46219519df2$var$parseNumber(m[3], 0, date.calendar.getDaysInMonth(date));\n    var ref;\n    if (m[8]) date.offset = $78b7d46219519df2$var$parseNumber(m[8], -23, 23) * 3600000 + $78b7d46219519df2$var$parseNumber((ref = m[9]) !== null && ref !== void 0 ? ref : '0', 0, 59) * 60000;\n    return $9ab2a87bc84c0bfa$export$538b00033cc11c75(date, timeZone);\n}\nfunction $78b7d46219519df2$export$8e384432362ed0f0(value) {\n    return $78b7d46219519df2$export$5adfdab05168c219(value, $571ccebef3ef72f1$export$aa8b41735afcabd2());\n}\nfunction $78b7d46219519df2$var$parseNumber(value, min, max) {\n    let val = Number(value);\n    if (val < min || val > max) throw new RangeError(`Value out of range: ${min} <= ${val} <= ${max}`);\n    return val;\n}\nfunction $78b7d46219519df2$export$f59dee82248f5ad4(time) {\n    return `${String(time.hour).padStart(2, '0')}:${String(time.minute).padStart(2, '0')}:${String(time.second).padStart(2, '0')}${time.millisecond ? String(time.millisecond / 1000).slice(1) : ''}`;\n}\nfunction $78b7d46219519df2$export$60dfd74aa96791bd(date) {\n    let gregorianDate = $9ab2a87bc84c0bfa$export$b4a036af3fc0b032(date, new $22a507fc519bfd45$export$80ee6245ec4f29ec());\n    return `${String(gregorianDate.year).padStart(4, '0')}-${String(gregorianDate.month).padStart(2, '0')}-${String(gregorianDate.day).padStart(2, '0')}`;\n}\nfunction $78b7d46219519df2$export$4223de14708adc63(date) {\n    // @ts-ignore\n    return `${$78b7d46219519df2$export$60dfd74aa96791bd(date)}T${$78b7d46219519df2$export$f59dee82248f5ad4(date)}`;\n}\nfunction $78b7d46219519df2$var$offsetToString(offset) {\n    let sign = Math.sign(offset) < 0 ? '-' : '+';\n    offset = Math.abs(offset);\n    let offsetHours = Math.floor(offset / 3600000);\n    let offsetMinutes = offset % 3600000 / 60000;\n    return `${sign}${String(offsetHours).padStart(2, '0')}:${String(offsetMinutes).padStart(2, '0')}`;\n}\nfunction $78b7d46219519df2$export$bf79f1ebf4b18792(date) {\n    return `${$78b7d46219519df2$export$4223de14708adc63(date)}${$78b7d46219519df2$var$offsetToString(date.offset)}[${date.timeZone}]`;\n}\n\n\n\n\nfunction $418a5bbf7b2f3448$var$shiftArgs(args) {\n    let calendar = typeof args[0] === 'object' ? args.shift() : new $22a507fc519bfd45$export$80ee6245ec4f29ec();\n    let era;\n    if (typeof args[0] === 'string') era = args.shift();\n    else {\n        let eras = calendar.getEras();\n        era = eras[eras.length - 1];\n    }\n    let year = args.shift();\n    let month = args.shift();\n    let day = args.shift();\n    return [\n        calendar,\n        era,\n        year,\n        month,\n        day\n    ];\n}\nclass $418a5bbf7b2f3448$export$99faa760c7908e4f {\n    copy() {\n        if (this.era) return new $418a5bbf7b2f3448$export$99faa760c7908e4f(this.calendar, this.era, this.year, this.month, this.day);\n        else return new $418a5bbf7b2f3448$export$99faa760c7908e4f(this.calendar, this.year, this.month, this.day);\n    }\n    add(duration) {\n        return $1e1f3157d0513e0f$export$e16d8520af44a096(this, duration);\n    }\n    subtract(duration) {\n        return $1e1f3157d0513e0f$export$4e2d2ead65e5f7e3(this, duration);\n    }\n    set(fields) {\n        return $1e1f3157d0513e0f$export$adaa4cf7ef1b65be(this, fields);\n    }\n    cycle(field, amount, options) {\n        return $1e1f3157d0513e0f$export$d52ced6badfb9a4c(this, field, amount, options);\n    }\n    toDate(timeZone) {\n        return $9ab2a87bc84c0bfa$export$e67a095c620b86fe(this, timeZone);\n    }\n    toString() {\n        return $78b7d46219519df2$export$60dfd74aa96791bd(this);\n    }\n    compare(b) {\n        return $571ccebef3ef72f1$export$68781ddf31c0090f(this, b);\n    }\n    constructor(...args){\n        // This prevents TypeScript from allowing other types with the same fields to match.\n        // i.e. a ZonedDateTime should not be be passable to a parameter that expects CalendarDate.\n        // If that behavior is desired, use the AnyCalendarDate interface instead.\n        _type.set(this, {\n            writable: true,\n            value: void 0\n        });\n        let [calendar, era, year, month, day] = $418a5bbf7b2f3448$var$shiftArgs(args);\n        this.calendar = calendar;\n        this.era = era;\n        this.year = year;\n        this.month = month;\n        this.day = day;\n        $1e1f3157d0513e0f$export$c4e2ecac49351ef2(this);\n    }\n}\nvar _type = new WeakMap();\nclass $418a5bbf7b2f3448$export$680ea196effce5f {\n    copy() {\n        return new $418a5bbf7b2f3448$export$680ea196effce5f(this.hour, this.minute, this.second, this.millisecond);\n    }\n    add(duration) {\n        return $1e1f3157d0513e0f$export$7ed87b6bc2506470(this, duration);\n    }\n    subtract(duration) {\n        return $1e1f3157d0513e0f$export$fe34d3a381cd7501(this, duration);\n    }\n    set(fields) {\n        return $1e1f3157d0513e0f$export$e5d5e1c1822b6e56(this, fields);\n    }\n    cycle(field, amount, options) {\n        return $1e1f3157d0513e0f$export$dd02b3e0007dfe28(this, field, amount, options);\n    }\n    toString() {\n        return $78b7d46219519df2$export$f59dee82248f5ad4(this);\n    }\n    compare(b) {\n        return $571ccebef3ef72f1$export$c19a80a9721b80f6(this, b);\n    }\n    constructor(hour = 0, minute = 0, second = 0, millisecond = 0){\n        // This prevents TypeScript from allowing other types with the same fields to match.\n        _type1.set(this, {\n            writable: true,\n            value: void 0\n        });\n        this.hour = hour;\n        this.minute = minute;\n        this.second = second;\n        this.millisecond = millisecond;\n        $1e1f3157d0513e0f$export$7555de1e070510cb(this);\n    }\n}\nvar _type1 = new WeakMap();\nclass $418a5bbf7b2f3448$export$ca871e8dbb80966f {\n    copy() {\n        if (this.era) return new $418a5bbf7b2f3448$export$ca871e8dbb80966f(this.calendar, this.era, this.year, this.month, this.day, this.hour, this.minute, this.second, this.millisecond);\n        else return new $418a5bbf7b2f3448$export$ca871e8dbb80966f(this.calendar, this.year, this.month, this.day, this.hour, this.minute, this.second, this.millisecond);\n    }\n    add(duration) {\n        return $1e1f3157d0513e0f$export$e16d8520af44a096(this, duration);\n    }\n    subtract(duration) {\n        return $1e1f3157d0513e0f$export$4e2d2ead65e5f7e3(this, duration);\n    }\n    set(fields) {\n        return $1e1f3157d0513e0f$export$adaa4cf7ef1b65be($1e1f3157d0513e0f$export$e5d5e1c1822b6e56(this, fields), fields);\n    }\n    cycle(field, amount, options) {\n        switch(field){\n            case 'era':\n            case 'year':\n            case 'month':\n            case 'day':\n                return $1e1f3157d0513e0f$export$d52ced6badfb9a4c(this, field, amount, options);\n            default:\n                return $1e1f3157d0513e0f$export$dd02b3e0007dfe28(this, field, amount, options);\n        }\n    }\n    toDate(timeZone) {\n        return $9ab2a87bc84c0bfa$export$e67a095c620b86fe(this, timeZone);\n    }\n    toString() {\n        return $78b7d46219519df2$export$4223de14708adc63(this);\n    }\n    compare(b) {\n        let res = $571ccebef3ef72f1$export$68781ddf31c0090f(this, b);\n        if (res === 0) return $571ccebef3ef72f1$export$c19a80a9721b80f6(this, $9ab2a87bc84c0bfa$export$b21e0b124e224484(b));\n        return res;\n    }\n    constructor(...args){\n        // This prevents TypeScript from allowing other types with the same fields to match.\n        _type2.set(this, {\n            writable: true,\n            value: void 0\n        });\n        let [calendar, era, year, month, day] = $418a5bbf7b2f3448$var$shiftArgs(args);\n        this.calendar = calendar;\n        this.era = era;\n        this.year = year;\n        this.month = month;\n        this.day = day;\n        this.hour = args.shift() || 0;\n        this.minute = args.shift() || 0;\n        this.second = args.shift() || 0;\n        this.millisecond = args.shift() || 0;\n        $1e1f3157d0513e0f$export$c4e2ecac49351ef2(this);\n    }\n}\nvar _type2 = new WeakMap();\nclass $418a5bbf7b2f3448$export$d3b7288e7994edea {\n    copy() {\n        if (this.era) return new $418a5bbf7b2f3448$export$d3b7288e7994edea(this.calendar, this.era, this.year, this.month, this.day, this.timeZone, this.offset, this.hour, this.minute, this.second, this.millisecond);\n        else return new $418a5bbf7b2f3448$export$d3b7288e7994edea(this.calendar, this.year, this.month, this.day, this.timeZone, this.offset, this.hour, this.minute, this.second, this.millisecond);\n    }\n    add(duration) {\n        return $1e1f3157d0513e0f$export$96b1d28349274637(this, duration);\n    }\n    subtract(duration) {\n        return $1e1f3157d0513e0f$export$6814caac34ca03c7(this, duration);\n    }\n    set(fields, disambiguation) {\n        return $1e1f3157d0513e0f$export$31b5430eb18be4f8(this, fields, disambiguation);\n    }\n    cycle(field, amount, options) {\n        return $1e1f3157d0513e0f$export$9a297d111fc86b79(this, field, amount, options);\n    }\n    toDate() {\n        return $9ab2a87bc84c0bfa$export$83aac07b4c37b25(this);\n    }\n    toString() {\n        return $78b7d46219519df2$export$bf79f1ebf4b18792(this);\n    }\n    toAbsoluteString() {\n        return this.toDate().toISOString();\n    }\n    compare(b) {\n        // TODO: Is this a bad idea??\n        return this.toDate().getTime() - $9ab2a87bc84c0bfa$export$84c95a83c799e074(b, this.timeZone).toDate().getTime();\n    }\n    constructor(...args){\n        // This prevents TypeScript from allowing other types with the same fields to match.\n        _type3.set(this, {\n            writable: true,\n            value: void 0\n        });\n        let [calendar, era, year, month, day] = $418a5bbf7b2f3448$var$shiftArgs(args);\n        let timeZone = args.shift();\n        let offset = args.shift();\n        this.calendar = calendar;\n        this.era = era;\n        this.year = year;\n        this.month = month;\n        this.day = day;\n        this.timeZone = timeZone;\n        this.offset = offset;\n        this.hour = args.shift() || 0;\n        this.minute = args.shift() || 0;\n        this.second = args.shift() || 0;\n        this.millisecond = args.shift() || 0;\n        $1e1f3157d0513e0f$export$c4e2ecac49351ef2(this);\n    }\n}\nvar _type3 = new WeakMap();\n\n\n\n\n\nconst $e3160abf84b3082c$var$ERA_START_DATES = [\n    [\n        1868,\n        9,\n        8\n    ],\n    [\n        1912,\n        7,\n        30\n    ],\n    [\n        1926,\n        12,\n        25\n    ],\n    [\n        1989,\n        1,\n        8\n    ],\n    [\n        2019,\n        5,\n        1\n    ]\n];\nconst $e3160abf84b3082c$var$ERA_END_DATES = [\n    [\n        1912,\n        7,\n        29\n    ],\n    [\n        1926,\n        12,\n        24\n    ],\n    [\n        1989,\n        1,\n        7\n    ],\n    [\n        2019,\n        4,\n        30\n    ]\n];\nconst $e3160abf84b3082c$var$ERA_ADDENDS = [\n    1867,\n    1911,\n    1925,\n    1988,\n    2018\n];\nconst $e3160abf84b3082c$var$ERA_NAMES = [\n    'meiji',\n    'taisho',\n    'showa',\n    'heisei',\n    'reiwa'\n];\nfunction $e3160abf84b3082c$var$findEraFromGregorianDate(date) {\n    const idx = $e3160abf84b3082c$var$ERA_START_DATES.findIndex(([year, month, day])=>{\n        if (date.year < year) return true;\n        if (date.year === year && date.month < month) return true;\n        if (date.year === year && date.month === month && date.day < day) return true;\n        return false;\n    });\n    if (idx === -1) return $e3160abf84b3082c$var$ERA_START_DATES.length - 1;\n    if (idx === 0) return 0;\n    return idx - 1;\n}\nfunction $e3160abf84b3082c$var$toGregorian(date) {\n    let eraAddend = $e3160abf84b3082c$var$ERA_ADDENDS[$e3160abf84b3082c$var$ERA_NAMES.indexOf(date.era)];\n    if (!eraAddend) throw new Error('Unknown era: ' + date.era);\n    return new $418a5bbf7b2f3448$export$99faa760c7908e4f(date.year + eraAddend, date.month, date.day);\n}\nclass $e3160abf84b3082c$export$b746ab2b60cdffbf extends $22a507fc519bfd45$export$80ee6245ec4f29ec {\n    fromJulianDay(jd) {\n        let date = super.fromJulianDay(jd);\n        let era = $e3160abf84b3082c$var$findEraFromGregorianDate(date);\n        date.era = $e3160abf84b3082c$var$ERA_NAMES[era];\n        date.year -= $e3160abf84b3082c$var$ERA_ADDENDS[era];\n        return date;\n    }\n    toJulianDay(date) {\n        return super.toJulianDay($e3160abf84b3082c$var$toGregorian(date));\n    }\n    balanceDate(date) {\n        let gregorianDate = $e3160abf84b3082c$var$toGregorian(date);\n        let era = $e3160abf84b3082c$var$findEraFromGregorianDate(gregorianDate);\n        if ($e3160abf84b3082c$var$ERA_NAMES[era] !== date.era) {\n            date.era = $e3160abf84b3082c$var$ERA_NAMES[era];\n            date.year = gregorianDate.year - $e3160abf84b3082c$var$ERA_ADDENDS[era];\n        }\n    }\n    constrainDate(date) {\n        let idx = $e3160abf84b3082c$var$ERA_NAMES.indexOf(date.era);\n        let end = $e3160abf84b3082c$var$ERA_END_DATES[idx];\n        if (end != null) {\n            let [endYear, endMonth, endDay] = end;\n            // Constrain the year to the maximum possible value in the era.\n            // Then constrain the month and day fields within that.\n            let maxYear = endYear - $e3160abf84b3082c$var$ERA_ADDENDS[idx];\n            date.year = Math.min(maxYear, date.year);\n            if (date.year === maxYear) {\n                date.month = Math.min(endMonth, date.month);\n                if (date.month === endMonth) date.day = Math.min(endDay, date.day);\n            }\n            if (date.year === 1) {\n                let [, startMonth, startDay] = $e3160abf84b3082c$var$ERA_START_DATES[idx];\n                date.month = Math.max(startMonth, date.month);\n                if (date.month === startMonth) date.day = Math.max(startDay, date.day);\n            }\n        }\n    }\n    getEras() {\n        return $e3160abf84b3082c$var$ERA_NAMES;\n    }\n    getYearsInEra(date) {\n        // Get the number of years in the era, taking into account the date's month and day fields.\n        let era = $e3160abf84b3082c$var$ERA_NAMES.indexOf(date.era);\n        let next = $e3160abf84b3082c$var$ERA_START_DATES[era + 1];\n        if (next == null) return 9999;\n        let cur = $e3160abf84b3082c$var$ERA_START_DATES[era];\n        let years = next[0] - cur[0];\n        if (date.month < next[1] || date.month === next[1] && date.day < next[2]) years++;\n        return years;\n    }\n    getMinimumMonthInYear(date) {\n        let start = $e3160abf84b3082c$var$getMinimums(date);\n        return start ? start[1] : 1;\n    }\n    getMinimumDayInMonth(date) {\n        let start = $e3160abf84b3082c$var$getMinimums(date);\n        return start && date.month === start[1] ? start[2] : 1;\n    }\n    constructor(...args){\n        super(...args);\n        this.identifier = 'japanese';\n    }\n}\nfunction $e3160abf84b3082c$var$getMinimums(date) {\n    if (date.year === 1) {\n        let idx = $e3160abf84b3082c$var$ERA_NAMES.indexOf(date.era);\n        return $e3160abf84b3082c$var$ERA_START_DATES[idx];\n    }\n}\n\n\n\n\nconst $16ad4c0fc3e87561$var$BUDDHIST_ERA_START = -543;\nclass $16ad4c0fc3e87561$export$42d20a78301dee44 extends $22a507fc519bfd45$export$80ee6245ec4f29ec {\n    fromJulianDay(jd) {\n        let date = super.fromJulianDay(jd);\n        date.year -= $16ad4c0fc3e87561$var$BUDDHIST_ERA_START;\n        return date;\n    }\n    toJulianDay(date) {\n        return super.toJulianDay(new $418a5bbf7b2f3448$export$99faa760c7908e4f(date.year + $16ad4c0fc3e87561$var$BUDDHIST_ERA_START, date.month, date.day));\n    }\n    getEras() {\n        return [\n            'BE'\n        ];\n    }\n    constructor(...args){\n        super(...args);\n        this.identifier = 'buddhist';\n    }\n}\n\n\n\n\nconst $ff4a0e4b9bb267dc$var$TAIWAN_ERA_START = 1911;\nfunction $ff4a0e4b9bb267dc$var$gregorianYear(date) {\n    return date.era === 'minguo' ? date.year + $ff4a0e4b9bb267dc$var$TAIWAN_ERA_START : 1 - date.year + $ff4a0e4b9bb267dc$var$TAIWAN_ERA_START;\n}\nfunction $ff4a0e4b9bb267dc$var$gregorianToTaiwan(year, date) {\n    let y = year - $ff4a0e4b9bb267dc$var$TAIWAN_ERA_START;\n    if (y > 0) {\n        date.era = 'minguo';\n        date.year = y;\n    } else {\n        date.era = 'before_minguo';\n        date.year = 1 - y;\n    }\n}\nclass $ff4a0e4b9bb267dc$export$65e01080afcb0799 extends $22a507fc519bfd45$export$80ee6245ec4f29ec {\n    fromJulianDay(jd) {\n        let date = super.fromJulianDay(jd);\n        $ff4a0e4b9bb267dc$var$gregorianToTaiwan(date.year, date);\n        return date;\n    }\n    toJulianDay(date) {\n        return super.toJulianDay(new $418a5bbf7b2f3448$export$99faa760c7908e4f($ff4a0e4b9bb267dc$var$gregorianYear(date), date.month, date.day));\n    }\n    getEras() {\n        return [\n            'before_minguo',\n            'minguo'\n        ];\n    }\n    balanceDate(date) {\n        $ff4a0e4b9bb267dc$var$gregorianToTaiwan($ff4a0e4b9bb267dc$var$gregorianYear(date), date);\n    }\n    getYearsToAdd(date, years) {\n        return date.era === 'before_minguo' ? -years : years;\n    }\n    constructor(...args){\n        super(...args);\n        this.identifier // Republic of China\n         = 'roc';\n    }\n}\n\n\n\n\nconst $ba726df0f17122fc$var$PERSIAN_EPOCH = 1948321; // 622/03/19 Julian C.E.\nfunction $ba726df0f17122fc$var$isLeapYear(year) {\n    let y0 = year > 0 ? year - 474 : year - 473;\n    let y1 = $6a413dc772e69324$export$842a2cf37af977e1(y0, 2820) + 474;\n    return $6a413dc772e69324$export$842a2cf37af977e1((y1 + 38) * 31, 128) < 31;\n}\nfunction $ba726df0f17122fc$var$persianToJulianDay(year, month, day) {\n    let y0 = year > 0 ? year - 474 : year - 473;\n    let y1 = $6a413dc772e69324$export$842a2cf37af977e1(y0, 2820) + 474;\n    let offset = month <= 7 ? 31 * (month - 1) : 30 * (month - 1) + 6;\n    return $ba726df0f17122fc$var$PERSIAN_EPOCH - 1 + 1029983 * Math.floor(y0 / 2820) + 365 * (y1 - 1) + Math.floor((31 * y1 - 5) / 128) + offset + day;\n}\nclass $ba726df0f17122fc$export$37fccdbfd14c5939 {\n    fromJulianDay(jd) {\n        let d0 = jd - $ba726df0f17122fc$var$persianToJulianDay(475, 1, 1);\n        let n2820 = Math.floor(d0 / 1029983);\n        let d1 = $6a413dc772e69324$export$842a2cf37af977e1(d0, 1029983);\n        let y2820 = d1 === 1029982 ? 2820 : Math.floor((128 * d1 + 46878) / 46751);\n        let year = 474 + 2820 * n2820 + y2820;\n        if (year <= 0) year--;\n        let yDay = jd - $ba726df0f17122fc$var$persianToJulianDay(year, 1, 1) + 1;\n        let month = yDay <= 186 ? Math.ceil(yDay / 31) : Math.ceil((yDay - 6) / 31);\n        let day = jd - $ba726df0f17122fc$var$persianToJulianDay(year, month, 1) + 1;\n        return new $418a5bbf7b2f3448$export$99faa760c7908e4f(this, year, month, day);\n    }\n    toJulianDay(date) {\n        return $ba726df0f17122fc$var$persianToJulianDay(date.year, date.month, date.day);\n    }\n    getMonthsInYear() {\n        return 12;\n    }\n    getDaysInMonth(date) {\n        if (date.month <= 6) return 31;\n        if (date.month <= 11) return 30;\n        return $ba726df0f17122fc$var$isLeapYear(date.year) ? 30 : 29;\n    }\n    getEras() {\n        return [\n            'AP'\n        ];\n    }\n    getYearsInEra() {\n        return 9999;\n    }\n    constructor(){\n        this.identifier = 'persian';\n    }\n}\n\n\n\n\n// Starts in 78 AD,\nconst $3d9dab5cb67ed9b1$var$INDIAN_ERA_START = 78;\n// The Indian year starts 80 days later than the Gregorian year.\nconst $3d9dab5cb67ed9b1$var$INDIAN_YEAR_START = 80;\nclass $3d9dab5cb67ed9b1$export$39f31c639fa15726 extends $22a507fc519bfd45$export$80ee6245ec4f29ec {\n    fromJulianDay(jd) {\n        // Gregorian date for Julian day\n        let date = super.fromJulianDay(jd);\n        // Year in Saka era\n        let indianYear = date.year - $3d9dab5cb67ed9b1$var$INDIAN_ERA_START;\n        // Day number in Gregorian year (starting from 0)\n        let yDay = jd - $22a507fc519bfd45$export$f297eb839006d339(date.year, 1, 1);\n        let leapMonth;\n        if (yDay < $3d9dab5cb67ed9b1$var$INDIAN_YEAR_START) {\n            //  Day is at the end of the preceding Saka year\n            indianYear--;\n            // Days in leapMonth this year, previous Gregorian year\n            leapMonth = $22a507fc519bfd45$export$553d7fa8e3805fc0(date.year - 1) ? 31 : 30;\n            yDay += leapMonth + 155 + 90 + 10;\n        } else {\n            // Days in leapMonth this year\n            leapMonth = $22a507fc519bfd45$export$553d7fa8e3805fc0(date.year) ? 31 : 30;\n            yDay -= $3d9dab5cb67ed9b1$var$INDIAN_YEAR_START;\n        }\n        let indianMonth;\n        let indianDay;\n        if (yDay < leapMonth) {\n            indianMonth = 1;\n            indianDay = yDay + 1;\n        } else {\n            let mDay = yDay - leapMonth;\n            if (mDay < 155) {\n                indianMonth = Math.floor(mDay / 31) + 2;\n                indianDay = mDay % 31 + 1;\n            } else {\n                mDay -= 155;\n                indianMonth = Math.floor(mDay / 30) + 7;\n                indianDay = mDay % 30 + 1;\n            }\n        }\n        return new $418a5bbf7b2f3448$export$99faa760c7908e4f(this, indianYear, indianMonth, indianDay);\n    }\n    toJulianDay(date) {\n        let year = date.year + $3d9dab5cb67ed9b1$var$INDIAN_ERA_START;\n        let leapMonth;\n        let jd;\n        if ($22a507fc519bfd45$export$553d7fa8e3805fc0(year)) {\n            leapMonth = 31;\n            jd = $22a507fc519bfd45$export$f297eb839006d339(year, 3, 21);\n        } else {\n            leapMonth = 30;\n            jd = $22a507fc519bfd45$export$f297eb839006d339(year, 3, 22);\n        }\n        if (date.month === 1) return jd + date.day - 1;\n        jd += leapMonth + Math.min(date.month - 2, 5) * 31;\n        if (date.month >= 8) jd += (date.month - 7) * 30;\n        jd += date.day - 1;\n        return jd;\n    }\n    getDaysInMonth(date) {\n        if (date.month === 1 && $22a507fc519bfd45$export$553d7fa8e3805fc0(date.year + $3d9dab5cb67ed9b1$var$INDIAN_ERA_START)) return 31;\n        if (date.month >= 2 && date.month <= 6) return 31;\n        return 30;\n    }\n    getYearsInEra() {\n        return 9999;\n    }\n    getEras() {\n        return [\n            'saka'\n        ];\n    }\n    constructor(...args){\n        super(...args);\n        this.identifier = 'indian';\n    }\n}\n\n\n\nconst $082daba6c2a83229$var$CIVIL_EPOC = 1948440; // CE 622 July 16 Friday (Julian calendar) / CE 622 July 19 (Gregorian calendar)\nconst $082daba6c2a83229$var$ASTRONOMICAL_EPOC = 1948439; // CE 622 July 15 Thursday (Julian calendar)\nconst $082daba6c2a83229$var$UMALQURA_YEAR_START = 1300;\nconst $082daba6c2a83229$var$UMALQURA_YEAR_END = 1600;\nconst $082daba6c2a83229$var$UMALQURA_START_DAYS = 460322;\nfunction $082daba6c2a83229$var$islamicToJulianDay(epoch, year, month, day) {\n    return day + Math.ceil(29.5 * (month - 1)) + (year - 1) * 354 + Math.floor((3 + 11 * year) / 30) + epoch - 1;\n}\nfunction $082daba6c2a83229$var$julianDayToIslamic(calendar, epoch, jd) {\n    let year = Math.floor((30 * (jd - epoch) + 10646) / 10631);\n    let month = Math.min(12, Math.ceil((jd - (29 + $082daba6c2a83229$var$islamicToJulianDay(epoch, year, 1, 1))) / 29.5) + 1);\n    let day = jd - $082daba6c2a83229$var$islamicToJulianDay(epoch, year, month, 1) + 1;\n    return new $418a5bbf7b2f3448$export$99faa760c7908e4f(calendar, year, month, day);\n}\nfunction $082daba6c2a83229$var$isLeapYear(year) {\n    return (14 + 11 * year) % 30 < 11;\n}\nclass $082daba6c2a83229$export$2066795aadd37bfc {\n    fromJulianDay(jd) {\n        return $082daba6c2a83229$var$julianDayToIslamic(this, $082daba6c2a83229$var$CIVIL_EPOC, jd);\n    }\n    toJulianDay(date) {\n        return $082daba6c2a83229$var$islamicToJulianDay($082daba6c2a83229$var$CIVIL_EPOC, date.year, date.month, date.day);\n    }\n    getDaysInMonth(date) {\n        let length = 29 + date.month % 2;\n        if (date.month === 12 && $082daba6c2a83229$var$isLeapYear(date.year)) length++;\n        return length;\n    }\n    getMonthsInYear() {\n        return 12;\n    }\n    getDaysInYear(date) {\n        return $082daba6c2a83229$var$isLeapYear(date.year) ? 355 : 354;\n    }\n    getYearsInEra() {\n        return 9999;\n    }\n    getEras() {\n        return [\n            'AH'\n        ];\n    }\n    constructor(){\n        this.identifier = 'islamic-civil';\n    }\n}\nclass $082daba6c2a83229$export$37f0887f2f9d22f7 extends $082daba6c2a83229$export$2066795aadd37bfc {\n    fromJulianDay(jd) {\n        return $082daba6c2a83229$var$julianDayToIslamic(this, $082daba6c2a83229$var$ASTRONOMICAL_EPOC, jd);\n    }\n    toJulianDay(date) {\n        return $082daba6c2a83229$var$islamicToJulianDay($082daba6c2a83229$var$ASTRONOMICAL_EPOC, date.year, date.month, date.day);\n    }\n    constructor(...args){\n        super(...args);\n        this.identifier = 'islamic-tbla';\n    }\n}\n// Generated by scripts/generate-umalqura.js\nconst $082daba6c2a83229$var$UMALQURA_DATA = 'qgpUDckO1AbqBmwDrQpVBakGkgepC9QF2gpcBS0NlQZKB1QLagutBa4ETwoXBYsGpQbVCtYCWwmdBE0KJg2VDawFtgm6AlsKKwWVCsoG6Qr0AnYJtgJWCcoKpAvSC9kF3AJtCU0FpQpSC6ULtAW2CVcFlwJLBaMGUgdlC2oFqworBZUMSg2lDcoF1gpXCasESwmlClILagt1BXYCtwhbBFUFqQW0BdoJ3QRuAjYJqgpUDbIN1QXaAlsJqwRVCkkLZAtxC7QFtQpVCiUNkg7JDtQG6QprCasEkwpJDaQNsg25CroEWworBZUKKgtVC1wFvQQ9Ah0JlQpKC1oLbQW2AjsJmwRVBqkGVAdqC2wFrQpVBSkLkgupC9QF2gpaBasKlQVJB2QHqgu1BbYCVgpNDiULUgtqC60FrgIvCZcESwalBqwG1gpdBZ0ETQoWDZUNqgW1BdoCWwmtBJUFygbkBuoK9QS2AlYJqgpUC9IL2QXqAm0JrQSVCkoLpQuyBbUJ1gSXCkcFkwZJB1ULagVrCisFiwpGDaMNygXWCtsEawJLCaUKUgtpC3UFdgG3CFsCKwVlBbQF2gntBG0BtgimClINqQ3UBdoKWwmrBFMGKQdiB6kLsgW1ClUFJQuSDckO0gbpCmsFqwRVCikNVA2qDbUJugQ7CpsETQqqCtUK2gJdCV4ELgqaDFUNsga5BroEXQotBZUKUguoC7QLuQXaAloJSgukDdEO6AZqC20FNQWVBkoNqA3UDdoGWwWdAisGFQtKC5ULqgWuCi4JjwwnBZUGqgbWCl0FnQI=';\nlet $082daba6c2a83229$var$UMALQURA_MONTHLENGTH;\nlet $082daba6c2a83229$var$UMALQURA_YEAR_START_TABLE;\nfunction $082daba6c2a83229$var$umalquraYearStart(year) {\n    return $082daba6c2a83229$var$UMALQURA_START_DAYS + $082daba6c2a83229$var$UMALQURA_YEAR_START_TABLE[year - $082daba6c2a83229$var$UMALQURA_YEAR_START];\n}\nfunction $082daba6c2a83229$var$umalquraMonthLength(year, month) {\n    let idx = year - $082daba6c2a83229$var$UMALQURA_YEAR_START;\n    let mask = 1 << 11 - (month - 1);\n    if (($082daba6c2a83229$var$UMALQURA_MONTHLENGTH[idx] & mask) === 0) return 29;\n    else return 30;\n}\nfunction $082daba6c2a83229$var$umalquraMonthStart(year, month) {\n    let day = $082daba6c2a83229$var$umalquraYearStart(year);\n    for(let i = 1; i < month; i++)day += $082daba6c2a83229$var$umalquraMonthLength(year, i);\n    return day;\n}\nfunction $082daba6c2a83229$var$umalquraYearLength(year) {\n    return $082daba6c2a83229$var$UMALQURA_YEAR_START_TABLE[year + 1 - $082daba6c2a83229$var$UMALQURA_YEAR_START] - $082daba6c2a83229$var$UMALQURA_YEAR_START_TABLE[year - $082daba6c2a83229$var$UMALQURA_YEAR_START];\n}\nclass $082daba6c2a83229$export$5baab4758c231076 extends $082daba6c2a83229$export$2066795aadd37bfc {\n    fromJulianDay(jd) {\n        let days = jd - $082daba6c2a83229$var$CIVIL_EPOC;\n        let startDays = $082daba6c2a83229$var$umalquraYearStart($082daba6c2a83229$var$UMALQURA_YEAR_START);\n        let endDays = $082daba6c2a83229$var$umalquraYearStart($082daba6c2a83229$var$UMALQURA_YEAR_END);\n        if (days < startDays || days > endDays) return super.fromJulianDay(jd);\n        else {\n            let y = $082daba6c2a83229$var$UMALQURA_YEAR_START - 1;\n            let m = 1;\n            let d = 1;\n            while(d > 0){\n                y++;\n                d = days - $082daba6c2a83229$var$umalquraYearStart(y) + 1;\n                let yearLength = $082daba6c2a83229$var$umalquraYearLength(y);\n                if (d === yearLength) {\n                    m = 12;\n                    break;\n                } else if (d < yearLength) {\n                    let monthLength = $082daba6c2a83229$var$umalquraMonthLength(y, m);\n                    m = 1;\n                    while(d > monthLength){\n                        d -= monthLength;\n                        m++;\n                        monthLength = $082daba6c2a83229$var$umalquraMonthLength(y, m);\n                    }\n                    break;\n                }\n            }\n            return new $418a5bbf7b2f3448$export$99faa760c7908e4f(this, y, m, days - $082daba6c2a83229$var$umalquraMonthStart(y, m) + 1);\n        }\n    }\n    toJulianDay(date) {\n        if (date.year < $082daba6c2a83229$var$UMALQURA_YEAR_START || date.year > $082daba6c2a83229$var$UMALQURA_YEAR_END) return super.toJulianDay(date);\n        return $082daba6c2a83229$var$CIVIL_EPOC + $082daba6c2a83229$var$umalquraMonthStart(date.year, date.month) + (date.day - 1);\n    }\n    getDaysInMonth(date) {\n        if (date.year < $082daba6c2a83229$var$UMALQURA_YEAR_START || date.year > $082daba6c2a83229$var$UMALQURA_YEAR_END) return super.getDaysInMonth(date);\n        return $082daba6c2a83229$var$umalquraMonthLength(date.year, date.month);\n    }\n    getDaysInYear(date) {\n        if (date.year < $082daba6c2a83229$var$UMALQURA_YEAR_START || date.year > $082daba6c2a83229$var$UMALQURA_YEAR_END) return super.getDaysInYear(date);\n        return $082daba6c2a83229$var$umalquraYearLength(date.year);\n    }\n    constructor(){\n        super();\n        this.identifier = 'islamic-umalqura';\n        if (!$082daba6c2a83229$var$UMALQURA_MONTHLENGTH) $082daba6c2a83229$var$UMALQURA_MONTHLENGTH = new Uint16Array(Uint8Array.from(atob($082daba6c2a83229$var$UMALQURA_DATA), (c)=>c.charCodeAt(0)\n        ).buffer);\n        if (!$082daba6c2a83229$var$UMALQURA_YEAR_START_TABLE) {\n            $082daba6c2a83229$var$UMALQURA_YEAR_START_TABLE = new Uint32Array($082daba6c2a83229$var$UMALQURA_YEAR_END - $082daba6c2a83229$var$UMALQURA_YEAR_START + 1);\n            let yearStart = 0;\n            for(let year = $082daba6c2a83229$var$UMALQURA_YEAR_START; year <= $082daba6c2a83229$var$UMALQURA_YEAR_END; year++){\n                $082daba6c2a83229$var$UMALQURA_YEAR_START_TABLE[year - $082daba6c2a83229$var$UMALQURA_YEAR_START] = yearStart;\n                for(let i = 1; i <= 12; i++)yearStart += $082daba6c2a83229$var$umalquraMonthLength(year, i);\n            }\n        }\n    }\n}\n\n\n\n\nconst $e047ddb73bf46f97$var$HEBREW_EPOCH = 347997;\n// Hebrew date calculations are performed in terms of days, hours, and\n// \"parts\" (or halakim), which are 1/1080 of an hour, or 3 1/3 seconds.\nconst $e047ddb73bf46f97$var$HOUR_PARTS = 1080;\nconst $e047ddb73bf46f97$var$DAY_PARTS = 24 * $e047ddb73bf46f97$var$HOUR_PARTS;\n// An approximate value for the length of a lunar month.\n// It is used to calculate the approximate year and month of a given\n// absolute date.\nconst $e047ddb73bf46f97$var$MONTH_DAYS = 29;\nconst $e047ddb73bf46f97$var$MONTH_FRACT = 12 * $e047ddb73bf46f97$var$HOUR_PARTS + 793;\nconst $e047ddb73bf46f97$var$MONTH_PARTS = $e047ddb73bf46f97$var$MONTH_DAYS * $e047ddb73bf46f97$var$DAY_PARTS + $e047ddb73bf46f97$var$MONTH_FRACT;\nfunction $e047ddb73bf46f97$var$isLeapYear(year) {\n    return $6a413dc772e69324$export$842a2cf37af977e1(year * 7 + 1, 19) < 7;\n}\n// Test for delay of start of new year and to avoid\n// Sunday, Wednesday, and Friday as start of the new year.\nfunction $e047ddb73bf46f97$var$hebrewDelay1(year) {\n    let months = Math.floor((235 * year - 234) / 19);\n    let parts = 12084 + 13753 * months;\n    let day = months * 29 + Math.floor(parts / 25920);\n    if ($6a413dc772e69324$export$842a2cf37af977e1(3 * (day + 1), 7) < 3) day += 1;\n    return day;\n}\n// Check for delay in start of new year due to length of adjacent years\nfunction $e047ddb73bf46f97$var$hebrewDelay2(year) {\n    let last = $e047ddb73bf46f97$var$hebrewDelay1(year - 1);\n    let present = $e047ddb73bf46f97$var$hebrewDelay1(year);\n    let next = $e047ddb73bf46f97$var$hebrewDelay1(year + 1);\n    if (next - present === 356) return 2;\n    if (present - last === 382) return 1;\n    return 0;\n}\nfunction $e047ddb73bf46f97$var$startOfYear(year) {\n    return $e047ddb73bf46f97$var$hebrewDelay1(year) + $e047ddb73bf46f97$var$hebrewDelay2(year);\n}\nfunction $e047ddb73bf46f97$var$getDaysInYear(year) {\n    return $e047ddb73bf46f97$var$startOfYear(year + 1) - $e047ddb73bf46f97$var$startOfYear(year);\n}\nfunction $e047ddb73bf46f97$var$getYearType(year) {\n    let yearLength = $e047ddb73bf46f97$var$getDaysInYear(year);\n    if (yearLength > 380) yearLength -= 30; // Subtract length of leap month.\n    switch(yearLength){\n        case 353:\n            return 0; // deficient\n        case 354:\n            return 1; // normal\n        case 355:\n            return 2; // complete\n    }\n}\nfunction $e047ddb73bf46f97$var$getDaysInMonth(year, month) {\n    // Normalize month numbers from 1 - 13, even on non-leap years\n    if (month >= 6 && !$e047ddb73bf46f97$var$isLeapYear(year)) month++;\n    // First of all, dispose of fixed-length 29 day months\n    if (month === 4 || month === 7 || month === 9 || month === 11 || month === 13) return 29;\n    let yearType = $e047ddb73bf46f97$var$getYearType(year);\n    // If it's Heshvan, days depend on length of year\n    if (month === 2) return yearType === 2 ? 30 : 29;\n    // Similarly, Kislev varies with the length of year\n    if (month === 3) return yearType === 0 ? 29 : 30;\n    // Adar I only exists in leap years\n    if (month === 6) return $e047ddb73bf46f97$var$isLeapYear(year) ? 30 : 0;\n    return 30;\n}\nclass $e047ddb73bf46f97$export$ca405048b8fb5af {\n    fromJulianDay(jd) {\n        let d = jd - $e047ddb73bf46f97$var$HEBREW_EPOCH;\n        let m = d * $e047ddb73bf46f97$var$DAY_PARTS / $e047ddb73bf46f97$var$MONTH_PARTS; // Months (approx)\n        let year = Math.floor((19 * m + 234) / 235) + 1; // Years (approx)\n        let ys = $e047ddb73bf46f97$var$startOfYear(year); // 1st day of year\n        let dayOfYear = Math.floor(d - ys);\n        // Because of the postponement rules, it's possible to guess wrong.  Fix it.\n        while(dayOfYear < 1){\n            year--;\n            ys = $e047ddb73bf46f97$var$startOfYear(year);\n            dayOfYear = Math.floor(d - ys);\n        }\n        // Now figure out which month we're in, and the date within that month\n        let month = 1;\n        let monthStart = 0;\n        while(monthStart < dayOfYear){\n            monthStart += $e047ddb73bf46f97$var$getDaysInMonth(year, month);\n            month++;\n        }\n        month--;\n        monthStart -= $e047ddb73bf46f97$var$getDaysInMonth(year, month);\n        let day = dayOfYear - monthStart;\n        return new $418a5bbf7b2f3448$export$99faa760c7908e4f(this, year, month, day);\n    }\n    toJulianDay(date) {\n        let jd = $e047ddb73bf46f97$var$startOfYear(date.year);\n        for(let month = 1; month < date.month; month++)jd += $e047ddb73bf46f97$var$getDaysInMonth(date.year, month);\n        return jd + date.day + $e047ddb73bf46f97$var$HEBREW_EPOCH;\n    }\n    getDaysInMonth(date) {\n        return $e047ddb73bf46f97$var$getDaysInMonth(date.year, date.month);\n    }\n    getMonthsInYear(date) {\n        return $e047ddb73bf46f97$var$isLeapYear(date.year) ? 13 : 12;\n    }\n    getDaysInYear(date) {\n        return $e047ddb73bf46f97$var$getDaysInYear(date.year);\n    }\n    getYearsInEra() {\n        return 9999;\n    }\n    getEras() {\n        return [\n            'AM'\n        ];\n    }\n    balanceYearMonth(date, previousDate) {\n        // Keep date in the same month when switching between leap years and non leap years\n        if (previousDate.year !== date.year) {\n            if ($e047ddb73bf46f97$var$isLeapYear(previousDate.year) && !$e047ddb73bf46f97$var$isLeapYear(date.year) && previousDate.month > 6) date.month--;\n            else if (!$e047ddb73bf46f97$var$isLeapYear(previousDate.year) && $e047ddb73bf46f97$var$isLeapYear(date.year) && previousDate.month > 6) date.month++;\n        }\n    }\n    constructor(){\n        this.identifier = 'hebrew';\n    }\n}\n\n\n\nconst $aed9e24d29bfb310$var$ETHIOPIC_EPOCH = 1723856;\nconst $aed9e24d29bfb310$var$COPTIC_EPOCH = 1824665;\n// The delta between Amete Alem 1 and Amete Mihret 1\n// AA 5501 = AM 1\nconst $aed9e24d29bfb310$var$AMETE_MIHRET_DELTA = 5500;\nfunction $aed9e24d29bfb310$var$ceToJulianDay(epoch, year, month, day) {\n    return epoch // difference from Julian epoch to 1,1,1\n     + 365 * year // number of days from years\n     + Math.floor(year / 4) // extra day of leap year\n     + 30 * (month - 1) // number of days from months (1 based)\n     + day - 1 // number of days for present month (1 based)\n    ;\n}\nfunction $aed9e24d29bfb310$var$julianDayToCE(calendar, epoch, jd) {\n    let year = Math.floor(4 * (jd - epoch) / 1461);\n    let month = 1 + Math.floor((jd - $aed9e24d29bfb310$var$ceToJulianDay(epoch, year, 1, 1)) / 30);\n    let day = jd + 1 - $aed9e24d29bfb310$var$ceToJulianDay(epoch, year, month, 1);\n    return new $418a5bbf7b2f3448$export$99faa760c7908e4f(calendar, year, month, day);\n}\nfunction $aed9e24d29bfb310$var$getLeapDay(year) {\n    return Math.floor(year % 4 / 3);\n}\nfunction $aed9e24d29bfb310$var$getDaysInMonth(year, month) {\n    // The Ethiopian and Coptic calendars have 13 months, 12 of 30 days each and\n    // an intercalary month at the end of the year of 5 or 6 days, depending whether\n    // the year is a leap year or not. The Leap Year follows the same rules as the\n    // Julian Calendar so that the extra month always has six days in the year before\n    // a Julian Leap Year.\n    if (month % 13 !== 0) // not intercalary month\n    return 30;\n    else // intercalary month 5 days + possible leap day\n    return $aed9e24d29bfb310$var$getLeapDay(year) + 5;\n}\nclass $aed9e24d29bfb310$export$26ba6eab5e20cd7d {\n    fromJulianDay(jd) {\n        let date = $aed9e24d29bfb310$var$julianDayToCE(this, $aed9e24d29bfb310$var$ETHIOPIC_EPOCH, jd);\n        if (date.year > 0) date.era = 'AM';\n        else {\n            date.era = 'AA';\n            date.year += $aed9e24d29bfb310$var$AMETE_MIHRET_DELTA;\n        }\n        return date;\n    }\n    toJulianDay(date) {\n        let year = date.year;\n        if (date.era === 'AA') year -= $aed9e24d29bfb310$var$AMETE_MIHRET_DELTA;\n        return $aed9e24d29bfb310$var$ceToJulianDay($aed9e24d29bfb310$var$ETHIOPIC_EPOCH, year, date.month, date.day);\n    }\n    getDaysInMonth(date) {\n        let year = date.year;\n        if (date.era === 'AA') year -= $aed9e24d29bfb310$var$AMETE_MIHRET_DELTA;\n        return $aed9e24d29bfb310$var$getDaysInMonth(year, date.month);\n    }\n    getMonthsInYear() {\n        return 13;\n    }\n    getDaysInYear(date) {\n        return 365 + $aed9e24d29bfb310$var$getLeapDay(date.year);\n    }\n    getYearsInEra() {\n        return 9999;\n    }\n    getEras() {\n        return [\n            'AA',\n            'AM'\n        ];\n    }\n    constructor(){\n        this.identifier = 'ethiopic';\n    }\n}\nclass $aed9e24d29bfb310$export$d72e0c37005a4914 extends $aed9e24d29bfb310$export$26ba6eab5e20cd7d {\n    fromJulianDay(jd) {\n        let date = $aed9e24d29bfb310$var$julianDayToCE(this, $aed9e24d29bfb310$var$ETHIOPIC_EPOCH, jd);\n        date.era = 'AA';\n        date.year += $aed9e24d29bfb310$var$AMETE_MIHRET_DELTA;\n        return date;\n    }\n    getEras() {\n        return [\n            'AA'\n        ];\n    }\n    constructor(...args){\n        super(...args);\n        this.identifier // also known as 'ethiopic-amete-alem' in ICU\n         = 'ethioaa';\n    }\n}\nclass $aed9e24d29bfb310$export$fe6243cbe1a4b7c1 extends $aed9e24d29bfb310$export$26ba6eab5e20cd7d {\n    fromJulianDay(jd) {\n        let date = $aed9e24d29bfb310$var$julianDayToCE(this, $aed9e24d29bfb310$var$COPTIC_EPOCH, jd);\n        if (date.year <= 0) {\n            date.era = 'BCE';\n            date.year = 1 - date.year;\n        } else date.era = 'CE';\n        return date;\n    }\n    toJulianDay(date) {\n        let year = date.year;\n        if (date.era === 'BCE') year = 1 - year;\n        return $aed9e24d29bfb310$var$ceToJulianDay($aed9e24d29bfb310$var$COPTIC_EPOCH, year, date.month, date.day);\n    }\n    getDaysInMonth(date) {\n        let year = date.year;\n        if (date.era === 'BCE') year = 1 - year;\n        return $aed9e24d29bfb310$var$getDaysInMonth(year, date.month);\n    }\n    getYearsToAdd(date, years) {\n        return date.era === 'BCE' ? -years : years;\n    }\n    getEras() {\n        return [\n            'BCE',\n            'CE'\n        ];\n    }\n    constructor(...args){\n        super(...args);\n        this.identifier = 'coptic';\n    }\n}\n\n\n\n\n\n\n\n\n\n\n\nfunction $dfd4c35de264b327$export$dd0bbc9b26defe37(name) {\n    switch(name){\n        case 'buddhist':\n            return new $16ad4c0fc3e87561$export$42d20a78301dee44();\n        case 'ethiopic':\n            return new $aed9e24d29bfb310$export$26ba6eab5e20cd7d();\n        case 'ethioaa':\n            return new $aed9e24d29bfb310$export$d72e0c37005a4914();\n        case 'coptic':\n            return new $aed9e24d29bfb310$export$fe6243cbe1a4b7c1();\n        case 'hebrew':\n            return new $e047ddb73bf46f97$export$ca405048b8fb5af();\n        case 'indian':\n            return new $3d9dab5cb67ed9b1$export$39f31c639fa15726();\n        case 'islamic-civil':\n            return new $082daba6c2a83229$export$2066795aadd37bfc();\n        case 'islamic-tbla':\n            return new $082daba6c2a83229$export$37f0887f2f9d22f7();\n        case 'islamic-umalqura':\n            return new $082daba6c2a83229$export$5baab4758c231076();\n        case 'japanese':\n            return new $e3160abf84b3082c$export$b746ab2b60cdffbf();\n        case 'persian':\n            return new $ba726df0f17122fc$export$37fccdbfd14c5939();\n        case 'roc':\n            return new $ff4a0e4b9bb267dc$export$65e01080afcb0799();\n        case 'gregory':\n        default:\n            return new $22a507fc519bfd45$export$80ee6245ec4f29ec();\n    }\n}\n\n\n\n\nvar $52d5895097fb3243$exports = {};\n\n\n\nvar $ea6cd4c800b471d1$exports = {};\n\n$parcel$export($ea6cd4c800b471d1$exports, \"DateFormatter\", () => $ea6cd4c800b471d1$export$ad991b66133851cf);\n/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */ let $ea6cd4c800b471d1$var$formatterCache = new Map();\nclass $ea6cd4c800b471d1$export$ad991b66133851cf {\n    format(value) {\n        return this.formatter.format(value);\n    }\n    formatToParts(value) {\n        return this.formatter.formatToParts(value);\n    }\n    formatRange(start, end) {\n        // @ts-ignore\n        if (typeof this.formatter.formatRange === 'function') // @ts-ignore\n        return this.formatter.formatRange(start, end);\n        if (end < start) throw new RangeError('End date must be >= start date');\n        // Very basic fallback for old browsers.\n        return `${this.formatter.format(start)} – ${this.formatter.format(end)}`;\n    }\n    formatRangeToParts(start, end) {\n        // @ts-ignore\n        if (typeof this.formatter.formatRangeToParts === 'function') // @ts-ignore\n        return this.formatter.formatRangeToParts(start, end);\n        if (end < start) throw new RangeError('End date must be >= start date');\n        let startParts = this.formatter.formatToParts(start);\n        let endParts = this.formatter.formatToParts(end);\n        return [\n            ...startParts.map((p)=>({\n                    ...p,\n                    source: 'startRange'\n                })\n            ),\n            {\n                type: 'literal',\n                value: ' – ',\n                source: 'shared'\n            },\n            ...endParts.map((p)=>({\n                    ...p,\n                    source: 'endRange'\n                })\n            )\n        ];\n    }\n    resolvedOptions() {\n        let resolvedOptions = this.formatter.resolvedOptions();\n        if ($ea6cd4c800b471d1$var$hasBuggyResolvedHourCycle()) {\n            if (!this.resolvedHourCycle) this.resolvedHourCycle = $ea6cd4c800b471d1$var$getResolvedHourCycle(resolvedOptions.locale, this.options);\n            resolvedOptions.hourCycle = this.resolvedHourCycle;\n            resolvedOptions.hour12 = this.resolvedHourCycle === 'h11' || this.resolvedHourCycle === 'h12';\n        }\n        return resolvedOptions;\n    }\n    constructor(locale, options = {\n    }){\n        this.formatter = $ea6cd4c800b471d1$var$getCachedDateFormatter(locale, options);\n        this.options = options;\n    }\n}\n// There are multiple bugs involving the hour12 and hourCycle options in various browser engines.\n//   - Chrome [1] (and the ECMA 402 spec [2]) resolve hour12: false in English and other locales to h24 (24:00 - 23:59)\n//     rather than h23 (00:00 - 23:59). Same can happen with hour12: true in French, which Chrome resolves to h11 (00:00 - 11:59)\n//     rather than h12 (12:00 - 11:59).\n//   - WebKit returns an incorrect hourCycle resolved option in the French locale due to incorrect parsing of 'h' literal\n//     in the resolved pattern. It also formats incorrectly when specifying the hourCycle option for the same reason. [3]\n// [1] https://bugs.chromium.org/p/chromium/issues/detail?id=1045791\n// [2] https://github.com/tc39/ecma402/issues/402\n// [3] https://bugs.webkit.org/show_bug.cgi?id=229313\n// https://github.com/unicode-org/cldr/blob/018b55eff7ceb389c7e3fc44e2f657eae3b10b38/common/supplemental/supplementalData.xml#L4774-L4802\nconst $ea6cd4c800b471d1$var$hour12Preferences = {\n    true: {\n        // Only Japanese uses the h11 style for 12 hour time. All others use h12.\n        ja: 'h11'\n    },\n    false: {\n    }\n};\nfunction $ea6cd4c800b471d1$var$getCachedDateFormatter(locale, options = {\n}) {\n    // Work around buggy hour12 behavior in Chrome / ECMA 402 spec by using hourCycle instead.\n    // Only apply the workaround if the issue is detected, because the hourCycle option is buggy in Safari.\n    if (typeof options.hour12 === 'boolean' && $ea6cd4c800b471d1$var$hasBuggyHour12Behavior()) {\n        options = {\n            ...options\n        };\n        let pref = $ea6cd4c800b471d1$var$hour12Preferences[String(options.hour12)][locale.split('-')[0]];\n        let defaultHourCycle = options.hour12 ? 'h12' : 'h23';\n        options.hourCycle = pref !== null && pref !== void 0 ? pref : defaultHourCycle;\n        delete options.hour12;\n    }\n    let cacheKey = locale + (options ? Object.entries(options).sort((a, b)=>a[0] < b[0] ? -1 : 1\n    ).join() : '');\n    if ($ea6cd4c800b471d1$var$formatterCache.has(cacheKey)) return $ea6cd4c800b471d1$var$formatterCache.get(cacheKey);\n    let numberFormatter = new Intl.DateTimeFormat(locale, options);\n    $ea6cd4c800b471d1$var$formatterCache.set(cacheKey, numberFormatter);\n    return numberFormatter;\n}\nlet $ea6cd4c800b471d1$var$_hasBuggyHour12Behavior = null;\nfunction $ea6cd4c800b471d1$var$hasBuggyHour12Behavior() {\n    if ($ea6cd4c800b471d1$var$_hasBuggyHour12Behavior == null) $ea6cd4c800b471d1$var$_hasBuggyHour12Behavior = new Intl.DateTimeFormat('en-US', {\n        hour: 'numeric',\n        hour12: false\n    }).format(new Date(2020, 2, 3, 0)) === '24';\n    return $ea6cd4c800b471d1$var$_hasBuggyHour12Behavior;\n}\nlet $ea6cd4c800b471d1$var$_hasBuggyResolvedHourCycle = null;\nfunction $ea6cd4c800b471d1$var$hasBuggyResolvedHourCycle() {\n    if ($ea6cd4c800b471d1$var$_hasBuggyResolvedHourCycle == null) $ea6cd4c800b471d1$var$_hasBuggyResolvedHourCycle = new Intl.DateTimeFormat('fr', {\n        hour: 'numeric',\n        hour12: false\n    }).resolvedOptions().hourCycle === 'h12';\n    return $ea6cd4c800b471d1$var$_hasBuggyResolvedHourCycle;\n}\nfunction $ea6cd4c800b471d1$var$getResolvedHourCycle(locale, options) {\n    if (!options.timeStyle && !options.hour) return undefined;\n    // Work around buggy results in resolved hourCycle and hour12 options in WebKit.\n    // Format the minimum possible hour and maximum possible hour in a day and parse the results.\n    locale = locale.replace(/(-u-)?-nu-[a-zA-Z0-9]+/, '');\n    locale += (locale.includes('-u-') ? '' : '-u') + '-nu-latn';\n    let formatter = $ea6cd4c800b471d1$var$getCachedDateFormatter(locale, {\n        ...options,\n        timeZone: undefined // use local timezone\n    });\n    let min = parseInt(formatter.formatToParts(new Date(2020, 2, 3, 0)).find((p)=>p.type === 'hour'\n    ).value, 10);\n    let max = parseInt(formatter.formatToParts(new Date(2020, 2, 3, 23)).find((p)=>p.type === 'hour'\n    ).value, 10);\n    if (min === 0 && max === 23) return 'h23';\n    if (min === 24 && max === 23) return 'h24';\n    if (min === 0 && max === 11) return 'h11';\n    if (min === 12 && max === 11) return 'h12';\n    throw new Error('Unexpected hour cycle result');\n}\n\n\n\n\nexport {$22a507fc519bfd45$export$80ee6245ec4f29ec as GregorianCalendar, $e3160abf84b3082c$export$b746ab2b60cdffbf as JapaneseCalendar, $16ad4c0fc3e87561$export$42d20a78301dee44 as BuddhistCalendar, $ff4a0e4b9bb267dc$export$65e01080afcb0799 as TaiwanCalendar, $ba726df0f17122fc$export$37fccdbfd14c5939 as PersianCalendar, $3d9dab5cb67ed9b1$export$39f31c639fa15726 as IndianCalendar, $082daba6c2a83229$export$2066795aadd37bfc as IslamicCivilCalendar, $082daba6c2a83229$export$37f0887f2f9d22f7 as IslamicTabularCalendar, $082daba6c2a83229$export$5baab4758c231076 as IslamicUmalquraCalendar, $e047ddb73bf46f97$export$ca405048b8fb5af as HebrewCalendar, $aed9e24d29bfb310$export$26ba6eab5e20cd7d as EthiopicCalendar, $aed9e24d29bfb310$export$d72e0c37005a4914 as EthiopicAmeteAlemCalendar, $aed9e24d29bfb310$export$fe6243cbe1a4b7c1 as CopticCalendar, $dfd4c35de264b327$export$dd0bbc9b26defe37 as createCalendar, $418a5bbf7b2f3448$export$99faa760c7908e4f as CalendarDate, $418a5bbf7b2f3448$export$680ea196effce5f as Time, $418a5bbf7b2f3448$export$ca871e8dbb80966f as CalendarDateTime, $418a5bbf7b2f3448$export$d3b7288e7994edea as ZonedDateTime, $9ab2a87bc84c0bfa$export$bd4fb2bc8bb06fb as epochFromDate, $9ab2a87bc84c0bfa$export$b4a036af3fc0b032 as toCalendar, $9ab2a87bc84c0bfa$export$59c99f3515d3493f as getTimeZoneOffset, $9ab2a87bc84c0bfa$export$136f38efe7caf549 as possibleAbsolutes, $9ab2a87bc84c0bfa$export$5107c82f94518f5c as toAbsolute, $9ab2a87bc84c0bfa$export$b21e0b124e224484 as toCalendarDateTime, $9ab2a87bc84c0bfa$export$e67a095c620b86fe as toDate, $9ab2a87bc84c0bfa$export$1b96692a1ba042ac as fromAbsolute, $9ab2a87bc84c0bfa$export$e57ff100d91bd4b9 as fromDate, $9ab2a87bc84c0bfa$export$d7f92bcd3596b086 as fromDateToLocal, $9ab2a87bc84c0bfa$export$93522d1a439f3617 as toCalendarDate, $9ab2a87bc84c0bfa$export$6f4d78149f3f53ac as toDateFields, $9ab2a87bc84c0bfa$export$4d0393e732857be5 as toTimeFields, $9ab2a87bc84c0bfa$export$d33f79e3ffc3dc83 as toTime, $9ab2a87bc84c0bfa$export$84c95a83c799e074 as toZoned, $9ab2a87bc84c0bfa$export$538b00033cc11c75 as toTimeZone, $9ab2a87bc84c0bfa$export$83aac07b4c37b25 as zonedToDate, $9ab2a87bc84c0bfa$export$d9b67bc93c097491 as toLocalTimeZone, $571ccebef3ef72f1$export$ea39ec197993aef0 as isSameDay, $571ccebef3ef72f1$export$a18c89cbd24170ff as isSameMonth, $571ccebef3ef72f1$export$a5a3b454ada2268e as startOfMonth, $571ccebef3ef72f1$export$5841f9eb9773f25f as isSameYear, $571ccebef3ef72f1$export$f91e89d3d0406102 as startOfYear, $571ccebef3ef72f1$export$91b62ebf2ba703ee as isEqualDay, $571ccebef3ef72f1$export$5a8da0c44a3afdf2 as isEqualMonth, $571ccebef3ef72f1$export$ea840f5a6dda8147 as isEqualYear, $571ccebef3ef72f1$export$629b0a497aa65267 as isToday, $571ccebef3ef72f1$export$d0bdf45af03a6ea3 as today, $571ccebef3ef72f1$export$2061056d06d7cdf7 as getDayOfWeek, $571ccebef3ef72f1$export$461939dd4422153 as now, $571ccebef3ef72f1$export$68781ddf31c0090f as compareDate, $571ccebef3ef72f1$export$c19a80a9721b80f6 as compareTime, $571ccebef3ef72f1$export$126c91c941de7e as getHoursInDay, $571ccebef3ef72f1$export$aa8b41735afcabd2 as getLocalTimeZone, $571ccebef3ef72f1$export$a2258d9c4118825c as endOfMonth, $571ccebef3ef72f1$export$8b7aa55c66d5569e as endOfYear, $571ccebef3ef72f1$export$5412ac11713b72ad as getMinimumMonthInYear, $571ccebef3ef72f1$export$b2f4953d301981d5 as getMinimumDayInMonth, $571ccebef3ef72f1$export$42c81a444fbfb5d4 as startOfWeek, $571ccebef3ef72f1$export$ef8b6d9133084f4e as endOfWeek, $571ccebef3ef72f1$export$ccc1b2479e7dd654 as getWeeksInMonth, $571ccebef3ef72f1$export$5c333a116e949cdd as minDate, $571ccebef3ef72f1$export$a75f2bff57811055 as maxDate, $571ccebef3ef72f1$export$618d60ea299da42 as isWeekend, $571ccebef3ef72f1$export$ee9d87258e1d19ed as isWeekday, $78b7d46219519df2$export$c9698ec7f05a07e1 as parseTime, $78b7d46219519df2$export$6b862160d295c8e as parseDate, $78b7d46219519df2$export$588937bcd60ade55 as parseDateTime, $78b7d46219519df2$export$fd7893f06e92a6a4 as parseZonedDateTime, $78b7d46219519df2$export$4223de14708adc63 as dateTimeToString, $78b7d46219519df2$export$5adfdab05168c219 as parseAbsolute, $78b7d46219519df2$export$8e384432362ed0f0 as parseAbsoluteToLocal, $78b7d46219519df2$export$f59dee82248f5ad4 as timeToString, $78b7d46219519df2$export$60dfd74aa96791bd as dateToString, $78b7d46219519df2$export$bf79f1ebf4b18792 as zonedDateTimeToString, $ea6cd4c800b471d1$export$ad991b66133851cf as DateFormatter};\n//# sourceMappingURL=module.js.map\n","/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */ let $81812865b3bb9d70$var$formatterCache = new Map();\nlet $81812865b3bb9d70$var$supportsSignDisplay = false;\ntry {\n    // @ts-ignore\n    $81812865b3bb9d70$var$supportsSignDisplay = new Intl.NumberFormat('de-DE', {\n        signDisplay: 'exceptZero'\n    }).resolvedOptions().signDisplay === 'exceptZero';\n// eslint-disable-next-line no-empty\n} catch (e) {\n}\nlet $81812865b3bb9d70$var$supportsUnit = false;\ntry {\n    // @ts-ignore\n    $81812865b3bb9d70$var$supportsUnit = new Intl.NumberFormat('de-DE', {\n        style: 'unit',\n        unit: 'degree'\n    }).resolvedOptions().style === 'unit';\n// eslint-disable-next-line no-empty\n} catch (e1) {\n}\n// Polyfill for units since Safari doesn't support them yet. See https://bugs.webkit.org/show_bug.cgi?id=215438.\n// Currently only polyfilling the unit degree in narrow format for ColorSlider in our supported locales.\n// Values were determined by switching to each locale manually in Chrome.\nconst $81812865b3bb9d70$var$UNITS = {\n    degree: {\n        narrow: {\n            default: '°',\n            'ja-JP': ' 度',\n            'zh-TW': '度',\n            'sl-SI': ' °'\n        }\n    }\n};\nclass $81812865b3bb9d70$export$cc77c4ff7e8673c5 {\n    format(value) {\n        let res = '';\n        if (!$81812865b3bb9d70$var$supportsSignDisplay && this.options.signDisplay != null) res = $81812865b3bb9d70$export$711b50b3c525e0f2(this.numberFormatter, this.options.signDisplay, value);\n        else res = this.numberFormatter.format(value);\n        if (this.options.style === 'unit' && !$81812865b3bb9d70$var$supportsUnit) {\n            var ref;\n            let { unit: unit , unitDisplay: unitDisplay = 'short' , locale: locale  } = this.resolvedOptions();\n            let values = (ref = $81812865b3bb9d70$var$UNITS[unit]) === null || ref === void 0 ? void 0 : ref[unitDisplay];\n            res += values[locale] || values.default;\n        }\n        return res;\n    }\n    formatToParts(value) {\n        // TODO: implement signDisplay for formatToParts\n        // @ts-ignore\n        return this.numberFormatter.formatToParts(value);\n    }\n    resolvedOptions() {\n        let options = this.numberFormatter.resolvedOptions();\n        if (!$81812865b3bb9d70$var$supportsSignDisplay && this.options.signDisplay != null) options = {\n            ...options,\n            signDisplay: this.options.signDisplay\n        };\n        if (!$81812865b3bb9d70$var$supportsUnit && this.options.style === 'unit') options = {\n            ...options,\n            style: 'unit',\n            unit: this.options.unit,\n            unitDisplay: this.options.unitDisplay\n        };\n        return options;\n    }\n    constructor(locale, options = {\n    }){\n        this.numberFormatter = $81812865b3bb9d70$var$getCachedNumberFormatter(locale, options);\n        this.options = options;\n    }\n}\nfunction $81812865b3bb9d70$var$getCachedNumberFormatter(locale, options = {\n}) {\n    let { numberingSystem: numberingSystem  } = options;\n    if (numberingSystem && locale.indexOf('-u-nu-') === -1) locale = `${locale}-u-nu-${numberingSystem}`;\n    if (options.style === 'unit' && !$81812865b3bb9d70$var$supportsUnit) {\n        var ref;\n        let { unit: unit , unitDisplay: unitDisplay = 'short'  } = options;\n        if (!unit) throw new Error('unit option must be provided with style: \"unit\"');\n        if (!((ref = $81812865b3bb9d70$var$UNITS[unit]) === null || ref === void 0 ? void 0 : ref[unitDisplay])) throw new Error(`Unsupported unit ${unit} with unitDisplay = ${unitDisplay}`);\n        options = {\n            ...options,\n            style: 'decimal'\n        };\n    }\n    let cacheKey = locale + (options ? Object.entries(options).sort((a, b)=>a[0] < b[0] ? -1 : 1\n    ).join() : '');\n    if ($81812865b3bb9d70$var$formatterCache.has(cacheKey)) return $81812865b3bb9d70$var$formatterCache.get(cacheKey);\n    let numberFormatter = new Intl.NumberFormat(locale, options);\n    $81812865b3bb9d70$var$formatterCache.set(cacheKey, numberFormatter);\n    return numberFormatter;\n}\nfunction $81812865b3bb9d70$export$711b50b3c525e0f2(numberFormat, signDisplay, num) {\n    if (signDisplay === 'auto') return numberFormat.format(num);\n    else if (signDisplay === 'never') return numberFormat.format(Math.abs(num));\n    else {\n        let needsPositiveSign = false;\n        if (signDisplay === 'always') needsPositiveSign = num > 0 || Object.is(num, 0);\n        else if (signDisplay === 'exceptZero') {\n            if (Object.is(num, -0) || Object.is(num, 0)) num = Math.abs(num);\n            else needsPositiveSign = num > 0;\n        }\n        if (needsPositiveSign) {\n            let negative = numberFormat.format(-num);\n            let noSign = numberFormat.format(num);\n            // ignore RTL/LTR marker character\n            let minus = negative.replace(noSign, '').replace(/\\u200e|\\u061C/, '');\n            if ([\n                ...minus\n            ].length !== 1) console.warn('@react-aria/i18n polyfill for NumberFormat signDisplay: Unsupported case');\n            let positive = negative.replace(noSign, '!!!').replace(minus, '+').replace('!!!', noSign);\n            return positive;\n        } else return numberFormat.format(num);\n    }\n}\n\n\nconst $ad41ad2a9f71fc3e$var$CURRENCY_SIGN_REGEX = new RegExp('^.*\\\\(.*\\\\).*$');\nconst $ad41ad2a9f71fc3e$var$NUMBERING_SYSTEMS = [\n    'latn',\n    'arab',\n    'hanidec'\n];\nclass $ad41ad2a9f71fc3e$export$cd11ab140839f11d {\n    /**\n   * Parses the given string to a number. Returns NaN if a valid number could not be parsed.\n   */ parse(value) {\n        return $ad41ad2a9f71fc3e$var$getNumberParserImpl(this.locale, this.options, value).parse(value);\n    }\n    /**\n   * Returns whether the given string could potentially be a valid number. This should be used to\n   * validate user input as the user types. If a `minValue` or `maxValue` is provided, the validity\n   * of the minus/plus sign characters can be checked.\n   */ isValidPartialNumber(value, minValue, maxValue) {\n        return $ad41ad2a9f71fc3e$var$getNumberParserImpl(this.locale, this.options, value).isValidPartialNumber(value, minValue, maxValue);\n    }\n    /**\n   * Returns a numbering system for which the given string is valid in the current locale.\n   * If no numbering system could be detected, the default numbering system for the current\n   * locale is returned.\n   */ getNumberingSystem(value) {\n        return $ad41ad2a9f71fc3e$var$getNumberParserImpl(this.locale, this.options, value).options.numberingSystem;\n    }\n    constructor(locale, options = {\n    }){\n        this.locale = locale;\n        this.options = options;\n    }\n}\nconst $ad41ad2a9f71fc3e$var$numberParserCache = new Map();\nfunction $ad41ad2a9f71fc3e$var$getNumberParserImpl(locale, options, value) {\n    // First try the default numbering system for the provided locale\n    let defaultParser = $ad41ad2a9f71fc3e$var$getCachedNumberParser(locale, options);\n    // If that doesn't match, and the locale doesn't include a hard coded numbering system,\n    // try each of the other supported numbering systems until we find one that matches.\n    if (!locale.includes('-nu-') && !defaultParser.isValidPartialNumber(value)) {\n        for (let numberingSystem of $ad41ad2a9f71fc3e$var$NUMBERING_SYSTEMS)if (numberingSystem !== defaultParser.options.numberingSystem) {\n            let parser = $ad41ad2a9f71fc3e$var$getCachedNumberParser(locale + (locale.includes('-u-') ? '-nu-' : '-u-nu-') + numberingSystem, options);\n            if (parser.isValidPartialNumber(value)) return parser;\n        }\n    }\n    return defaultParser;\n}\nfunction $ad41ad2a9f71fc3e$var$getCachedNumberParser(locale, options) {\n    let cacheKey = locale + (options ? Object.entries(options).sort((a, b)=>a[0] < b[0] ? -1 : 1\n    ).join() : '');\n    let parser = $ad41ad2a9f71fc3e$var$numberParserCache.get(cacheKey);\n    if (!parser) {\n        parser = new $ad41ad2a9f71fc3e$var$NumberParserImpl(locale, options);\n        $ad41ad2a9f71fc3e$var$numberParserCache.set(cacheKey, parser);\n    }\n    return parser;\n}\n// The actual number parser implementation. Instances of this class are cached\n// based on the locale, options, and detected numbering system.\nclass $ad41ad2a9f71fc3e$var$NumberParserImpl {\n    parse(value) {\n        // to parse the number, we need to remove anything that isn't actually part of the number, for example we want '-10.40' not '-10.40 USD'\n        let fullySanitizedValue = this.sanitize(value);\n        // Remove group characters, and replace decimal points and numerals with ASCII values.\n        fullySanitizedValue = $ad41ad2a9f71fc3e$var$replaceAll(fullySanitizedValue, this.symbols.group, '').replace(this.symbols.decimal, '.').replace(this.symbols.minusSign, '-').replace(this.symbols.numeral, this.symbols.index);\n        let newValue = fullySanitizedValue ? +fullySanitizedValue : NaN;\n        if (isNaN(newValue)) return NaN;\n        // accounting will always be stripped to a positive number, so if it's accounting and has a () around everything, then we need to make it negative again\n        if (this.options.currencySign === 'accounting' && $ad41ad2a9f71fc3e$var$CURRENCY_SIGN_REGEX.test(value)) newValue = -1 * newValue;\n        // when reading the number, if it's a percent, then it should be interpreted as being divided by 100\n        if (this.options.style === 'percent') {\n            newValue /= 100;\n            var _maximumFractionDigits;\n            // after dividing to get the percent value, javascript may get .0210999999 instead of .0211, so fix the number of fraction digits\n            newValue = +newValue.toFixed(((_maximumFractionDigits = this.options.maximumFractionDigits) !== null && _maximumFractionDigits !== void 0 ? _maximumFractionDigits : 0) + 2);\n        }\n        return newValue;\n    }\n    sanitize(value) {\n        // Remove literals and whitespace, which are allowed anywhere in the string\n        value = value.replace(this.symbols.literals, '');\n        // Replace the ASCII minus sign with the minus sign used in the current locale\n        // so that both are allowed in case the user's keyboard doesn't have the locale's minus sign.\n        value = value.replace('-', this.symbols.minusSign);\n        // In arab numeral system, their decimal character is 1643, but most keyboards don't type that\n        // instead they use the , (44) character or apparently the (1548) character.\n        if (this.options.numberingSystem === 'arab') {\n            value = value.replace(',', this.symbols.decimal);\n            value = value.replace(String.fromCharCode(1548), this.symbols.decimal);\n            value = $ad41ad2a9f71fc3e$var$replaceAll(value, '.', this.symbols.group);\n        }\n        // fr-FR group character is char code 8239, but that's not a key on the french keyboard,\n        // so allow 'period' as a group char and replace it with a space\n        if (this.options.locale === 'fr-FR') value = $ad41ad2a9f71fc3e$var$replaceAll(value, '.', String.fromCharCode(8239));\n        return value;\n    }\n    isValidPartialNumber(value, minValue = -Infinity, maxValue = Infinity) {\n        value = this.sanitize(value);\n        // Remove minus or plus sign, which must be at the start of the string.\n        if (value.startsWith(this.symbols.minusSign) && minValue < 0) value = value.slice(this.symbols.minusSign.length);\n        else if (this.symbols.plusSign && value.startsWith(this.symbols.plusSign) && maxValue > 0) value = value.slice(this.symbols.plusSign.length);\n        // Numbers cannot start with a group separator\n        if (value.startsWith(this.symbols.group)) return false;\n        // Remove numerals, groups, and decimals\n        value = $ad41ad2a9f71fc3e$var$replaceAll(value, this.symbols.group, '').replace(this.symbols.numeral, '').replace(this.symbols.decimal, '');\n        // The number is valid if there are no remaining characters\n        return value.length === 0;\n    }\n    constructor(locale, options = {\n    }){\n        this.formatter = new Intl.NumberFormat(locale, options);\n        this.options = this.formatter.resolvedOptions();\n        this.symbols = $ad41ad2a9f71fc3e$var$getSymbols(this.formatter, this.options, options);\n    }\n}\nconst $ad41ad2a9f71fc3e$var$nonLiteralParts = new Set([\n    'decimal',\n    'fraction',\n    'integer',\n    'minusSign',\n    'plusSign',\n    'group'\n]);\nfunction $ad41ad2a9f71fc3e$var$getSymbols(formatter, intlOptions, originalOptions) {\n    var ref, ref1, ref2, ref3;\n    // Note: some locale's don't add a group symbol until there is a ten thousands place\n    let allParts = formatter.formatToParts(-10000.111);\n    let posAllParts = formatter.formatToParts(10000.111);\n    let singularParts = formatter.formatToParts(1);\n    var ref4;\n    let minusSign = (ref4 = (ref = allParts.find((p)=>p.type === 'minusSign'\n    )) === null || ref === void 0 ? void 0 : ref.value) !== null && ref4 !== void 0 ? ref4 : '-';\n    let plusSign = (ref1 = posAllParts.find((p)=>p.type === 'plusSign'\n    )) === null || ref1 === void 0 ? void 0 : ref1.value;\n    // Safari does not support the signDisplay option, but our number parser polyfills it.\n    // If no plus sign was returned, but the original options contained signDisplay, default to the '+' character.\n    // @ts-ignore\n    if (!plusSign && ((originalOptions === null || originalOptions === void 0 ? void 0 : originalOptions.signDisplay) === 'exceptZero' || (originalOptions === null || originalOptions === void 0 ? void 0 : originalOptions.signDisplay) === 'always')) plusSign = '+';\n    let decimal = (ref2 = allParts.find((p)=>p.type === 'decimal'\n    )) === null || ref2 === void 0 ? void 0 : ref2.value;\n    let group = (ref3 = allParts.find((p)=>p.type === 'group'\n    )) === null || ref3 === void 0 ? void 0 : ref3.value;\n    // this set is also for a regex, it's all literals that might be in the string we want to eventually parse that\n    // don't contribute to the numerical value\n    let pluralLiterals = allParts.filter((p)=>!$ad41ad2a9f71fc3e$var$nonLiteralParts.has(p.type)\n    ).map((p)=>$ad41ad2a9f71fc3e$var$escapeRegex(p.value)\n    );\n    let singularLiterals = singularParts.filter((p)=>!$ad41ad2a9f71fc3e$var$nonLiteralParts.has(p.type)\n    ).map((p)=>$ad41ad2a9f71fc3e$var$escapeRegex(p.value)\n    );\n    let sortedLiterals = [\n        ...new Set([\n            ...singularLiterals,\n            ...pluralLiterals\n        ])\n    ].sort((a, b)=>b.length - a.length\n    );\n    let literals = new RegExp(`${sortedLiterals.join('|')}|[\\\\p{White_Space}]`, 'gu');\n    // These are for replacing non-latn characters with the latn equivalent\n    let numerals = [\n        ...new Intl.NumberFormat(intlOptions.locale, {\n            useGrouping: false\n        }).format(9876543210)\n    ].reverse();\n    let indexes = new Map(numerals.map((d, i)=>[\n            d,\n            i\n        ]\n    ));\n    let numeral = new RegExp(`[${numerals.join('')}]`, 'g');\n    let index = (d)=>String(indexes.get(d))\n    ;\n    return {\n        minusSign: minusSign,\n        plusSign: plusSign,\n        decimal: decimal,\n        group: group,\n        literals: literals,\n        numeral: numeral,\n        index: index\n    };\n}\nfunction $ad41ad2a9f71fc3e$var$replaceAll(str, find, replace) {\n    // @ts-ignore\n    if (str.replaceAll) // @ts-ignore\n    return str.replaceAll(find, replace);\n    return str.split(find).join(replace);\n}\nfunction $ad41ad2a9f71fc3e$var$escapeRegex(string) {\n    return string.replace(/[-/\\\\^$*+?.()|[\\]{}]/g, '\\\\$&');\n}\n\n\n\n\nexport {$81812865b3bb9d70$export$cc77c4ff7e8673c5 as NumberFormatter, $ad41ad2a9f71fc3e$export$cd11ab140839f11d as NumberParser};\n//# sourceMappingURL=module.js.map\n","import $iFADg$react, {useContext as $iFADg$useContext, useState as $iFADg$useState, useEffect as $iFADg$useEffect, useMemo as $iFADg$useMemo, useCallback as $iFADg$useCallback, useRef as $iFADg$useRef} from \"react\";\nimport {useIsSSR as $iFADg$useIsSSR} from \"@react-aria/ssr\";\nimport {MessageDictionary as $iFADg$MessageDictionary, MessageFormatter as $iFADg$MessageFormatter} from \"@internationalized/message\";\nimport {DateFormatter as $iFADg$DateFormatter} from \"@internationalized/date\";\nimport {NumberFormatter as $iFADg$NumberFormatter} from \"@internationalized/number\";\n\nfunction $parcel$export(e, n, v, s) {\n  Object.defineProperty(e, n, {get: v, set: s, enumerable: true, configurable: true});\n}\nvar $18f2051aff69b9bf$exports = {};\n\n$parcel$export($18f2051aff69b9bf$exports, \"I18nProvider\", () => $18f2051aff69b9bf$export$a54013f0d02a8f82);\n$parcel$export($18f2051aff69b9bf$exports, \"useLocale\", () => $18f2051aff69b9bf$export$43bb16f9c6d9e3f7);\n/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */ // https://en.wikipedia.org/wiki/Right-to-left\nconst $148a7a147e38ea7f$var$RTL_SCRIPTS = new Set([\n    'Arab',\n    'Syrc',\n    'Samr',\n    'Mand',\n    'Thaa',\n    'Mend',\n    'Nkoo',\n    'Adlm',\n    'Rohg',\n    'Hebr'\n]);\nconst $148a7a147e38ea7f$var$RTL_LANGS = new Set([\n    'ae',\n    'ar',\n    'arc',\n    'bcc',\n    'bqi',\n    'ckb',\n    'dv',\n    'fa',\n    'glk',\n    'he',\n    'ku',\n    'mzn',\n    'nqo',\n    'pnb',\n    'ps',\n    'sd',\n    'ug',\n    'ur',\n    'yi'\n]);\nfunction $148a7a147e38ea7f$export$702d680b21cbd764(locale) {\n    // If the Intl.Locale API is available, use it to get the script for the locale.\n    // This is more accurate than guessing by language, since languages can be written in multiple scripts.\n    // @ts-ignore\n    if (Intl.Locale) {\n        // @ts-ignore\n        let script = new Intl.Locale(locale).maximize().script;\n        return $148a7a147e38ea7f$var$RTL_SCRIPTS.has(script);\n    }\n    // If not, just guess by the language (first part of the locale)\n    let lang = locale.split('-')[0];\n    return $148a7a147e38ea7f$var$RTL_LANGS.has(lang);\n}\n\n\n\n\n\nfunction $1e5a04cdaf7d1af8$export$f09106e7c6677ec5() {\n    // @ts-ignore\n    let locale = typeof navigator !== 'undefined' && (navigator.language || navigator.userLanguage) || 'en-US';\n    return {\n        locale: locale,\n        direction: $148a7a147e38ea7f$export$702d680b21cbd764(locale) ? 'rtl' : 'ltr'\n    };\n}\nlet $1e5a04cdaf7d1af8$var$currentLocale = $1e5a04cdaf7d1af8$export$f09106e7c6677ec5();\nlet $1e5a04cdaf7d1af8$var$listeners = new Set();\nfunction $1e5a04cdaf7d1af8$var$updateLocale() {\n    $1e5a04cdaf7d1af8$var$currentLocale = $1e5a04cdaf7d1af8$export$f09106e7c6677ec5();\n    for (let listener of $1e5a04cdaf7d1af8$var$listeners)listener($1e5a04cdaf7d1af8$var$currentLocale);\n}\nfunction $1e5a04cdaf7d1af8$export$188ec29ebc2bdc3a() {\n    let isSSR = $iFADg$useIsSSR();\n    let [defaultLocale, setDefaultLocale] = $iFADg$useState($1e5a04cdaf7d1af8$var$currentLocale);\n    $iFADg$useEffect(()=>{\n        if ($1e5a04cdaf7d1af8$var$listeners.size === 0) window.addEventListener('languagechange', $1e5a04cdaf7d1af8$var$updateLocale);\n        $1e5a04cdaf7d1af8$var$listeners.add(setDefaultLocale);\n        return ()=>{\n            $1e5a04cdaf7d1af8$var$listeners.delete(setDefaultLocale);\n            if ($1e5a04cdaf7d1af8$var$listeners.size === 0) window.removeEventListener('languagechange', $1e5a04cdaf7d1af8$var$updateLocale);\n        };\n    }, []);\n    // We cannot determine the browser's language on the server, so default to\n    // en-US. This will be updated after hydration on the client to the correct value.\n    if (isSSR) return {\n        locale: 'en-US',\n        direction: 'ltr'\n    };\n    return defaultLocale;\n}\n\n\n\nconst $18f2051aff69b9bf$var$I18nContext = /*#__PURE__*/ $iFADg$react.createContext(null);\nfunction $18f2051aff69b9bf$export$a54013f0d02a8f82(props) {\n    let { locale: locale , children: children  } = props;\n    let defaultLocale = $1e5a04cdaf7d1af8$export$188ec29ebc2bdc3a();\n    let value = locale ? {\n        locale: locale,\n        direction: $148a7a147e38ea7f$export$702d680b21cbd764(locale) ? 'rtl' : 'ltr'\n    } : defaultLocale;\n    return(/*#__PURE__*/ $iFADg$react.createElement($18f2051aff69b9bf$var$I18nContext.Provider, {\n        value: value\n    }, children));\n}\nfunction $18f2051aff69b9bf$export$43bb16f9c6d9e3f7() {\n    let defaultLocale = $1e5a04cdaf7d1af8$export$188ec29ebc2bdc3a();\n    let context = $iFADg$useContext($18f2051aff69b9bf$var$I18nContext);\n    return context || defaultLocale;\n}\n\n\nvar $321bc95feeb923dd$exports = {};\n\n$parcel$export($321bc95feeb923dd$exports, \"useMessageFormatter\", () => $321bc95feeb923dd$export$ec23bf898b1eed85);\n\n\n\nconst $321bc95feeb923dd$var$cache = new WeakMap();\nfunction $321bc95feeb923dd$var$getCachedDictionary(strings) {\n    let dictionary = $321bc95feeb923dd$var$cache.get(strings);\n    if (!dictionary) {\n        dictionary = new $iFADg$MessageDictionary(strings);\n        $321bc95feeb923dd$var$cache.set(strings, dictionary);\n    }\n    return dictionary;\n}\nfunction $321bc95feeb923dd$export$ec23bf898b1eed85(strings) {\n    let { locale: locale  } = $18f2051aff69b9bf$export$43bb16f9c6d9e3f7();\n    let dictionary = $iFADg$useMemo(()=>$321bc95feeb923dd$var$getCachedDictionary(strings)\n    , [\n        strings\n    ]);\n    let formatter = $iFADg$useMemo(()=>new $iFADg$MessageFormatter(locale, dictionary)\n    , [\n        locale,\n        dictionary\n    ]);\n    return $iFADg$useCallback((key, variables)=>formatter.format(key, variables)\n    , [\n        formatter\n    ]);\n}\n\n\nvar $896ba0a80a8f4d36$exports = {};\n\n$parcel$export($896ba0a80a8f4d36$exports, \"useDateFormatter\", () => $896ba0a80a8f4d36$export$85fd5fdf27bacc79);\n\n\n\nfunction $896ba0a80a8f4d36$export$85fd5fdf27bacc79(options) {\n    // Reuse last options object if it is shallowly equal, which allows the useMemo result to also be reused.\n    let lastOptions = $iFADg$useRef(null);\n    if (options && lastOptions.current && $896ba0a80a8f4d36$var$isEqual(options, lastOptions.current)) options = lastOptions.current;\n    lastOptions.current = options;\n    let { locale: locale  } = $18f2051aff69b9bf$export$43bb16f9c6d9e3f7();\n    return $iFADg$useMemo(()=>new $iFADg$DateFormatter(locale, options)\n    , [\n        locale,\n        options\n    ]);\n}\nfunction $896ba0a80a8f4d36$var$isEqual(a, b) {\n    if (a === b) return true;\n    let aKeys = Object.keys(a);\n    let bKeys = Object.keys(b);\n    if (aKeys.length !== bKeys.length) return false;\n    for (let key of aKeys){\n        if (b[key] !== a[key]) return false;\n    }\n    return true;\n}\n\n\nvar $a916eb452884faea$exports = {};\n\n$parcel$export($a916eb452884faea$exports, \"useNumberFormatter\", () => $a916eb452884faea$export$b7a616150fdb9f44);\n\n\n\nfunction $a916eb452884faea$export$b7a616150fdb9f44(options = {\n}) {\n    let { locale: locale  } = $18f2051aff69b9bf$export$43bb16f9c6d9e3f7();\n    return $iFADg$useMemo(()=>new $iFADg$NumberFormatter(locale, options)\n    , [\n        locale,\n        options\n    ]);\n}\n\n\nvar $325a3faab7a68acd$exports = {};\n\n$parcel$export($325a3faab7a68acd$exports, \"useCollator\", () => $325a3faab7a68acd$export$a16aca283550c30d);\n\nlet $325a3faab7a68acd$var$cache = new Map();\nfunction $325a3faab7a68acd$export$a16aca283550c30d(options) {\n    let { locale: locale  } = $18f2051aff69b9bf$export$43bb16f9c6d9e3f7();\n    let cacheKey = locale + (options ? Object.entries(options).sort((a, b)=>a[0] < b[0] ? -1 : 1\n    ).join() : '');\n    if ($325a3faab7a68acd$var$cache.has(cacheKey)) return $325a3faab7a68acd$var$cache.get(cacheKey);\n    let formatter = new Intl.Collator(locale, options);\n    $325a3faab7a68acd$var$cache.set(cacheKey, formatter);\n    return formatter;\n}\n\n\nvar $bb77f239b46e8c72$exports = {};\n\n$parcel$export($bb77f239b46e8c72$exports, \"useFilter\", () => $bb77f239b46e8c72$export$3274cf84b703fff);\n\nfunction $bb77f239b46e8c72$export$3274cf84b703fff(options) {\n    let collator = $325a3faab7a68acd$export$a16aca283550c30d({\n        usage: 'search',\n        ...options\n    });\n    // TODO(later): these methods don't currently support the ignorePunctuation option.\n    return {\n        startsWith (string, substring) {\n            if (substring.length === 0) return true;\n            // Normalize both strings so we can slice safely\n            // TODO: take into account the ignorePunctuation option as well...\n            string = string.normalize('NFC');\n            substring = substring.normalize('NFC');\n            return collator.compare(string.slice(0, substring.length), substring) === 0;\n        },\n        endsWith (string, substring) {\n            if (substring.length === 0) return true;\n            string = string.normalize('NFC');\n            substring = substring.normalize('NFC');\n            return collator.compare(string.slice(-substring.length), substring) === 0;\n        },\n        contains (string, substring) {\n            if (substring.length === 0) return true;\n            string = string.normalize('NFC');\n            substring = substring.normalize('NFC');\n            let scan = 0;\n            let sliceLen = substring.length;\n            for(; scan + sliceLen <= string.length; scan++){\n                let slice = string.slice(scan, scan + sliceLen);\n                if (collator.compare(substring, slice) === 0) return true;\n            }\n            return false;\n        }\n    };\n}\n\n\n\n\nexport {$18f2051aff69b9bf$export$a54013f0d02a8f82 as I18nProvider, $18f2051aff69b9bf$export$43bb16f9c6d9e3f7 as useLocale, $321bc95feeb923dd$export$ec23bf898b1eed85 as useMessageFormatter, $896ba0a80a8f4d36$export$85fd5fdf27bacc79 as useDateFormatter, $a916eb452884faea$export$b7a616150fdb9f44 as useNumberFormatter, $325a3faab7a68acd$export$a16aca283550c30d as useCollator, $bb77f239b46e8c72$export$3274cf84b703fff as useFilter};\n//# sourceMappingURL=module.js.map\n","function _interopRequireDefault(obj) {\n  return obj && obj.__esModule ? obj : {\n    \"default\": obj\n  };\n}\n\nmodule.exports = _interopRequireDefault, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","\"use strict\";\n\nexports.__esModule = true;\nexports.default = camelize;\nvar rHyphen = /-(.)/g;\n\nfunction camelize(string) {\n  return string.replace(rHyphen, function (_, chr) {\n    return chr.toUpperCase();\n  });\n}\n\nmodule.exports = exports[\"default\"];","\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nexports.__esModule = true;\nexports.default = camelizeStyleName;\n\nvar _camelize = _interopRequireDefault(require(\"./camelize\"));\n\n/**\n * Copyright 2014-2015, Facebook, Inc.\n * All rights reserved.\n * https://github.com/facebook/react/blob/2aeb8a2a6beb00617a4217f7f8284924fa2ad819/src/vendor/core/camelizeStyleName.js\n */\nvar msPattern = /^-ms-/;\n\nfunction camelizeStyleName(string) {\n  return (0, _camelize.default)(string.replace(msPattern, 'ms-'));\n}\n\nmodule.exports = exports[\"default\"];","\"use strict\";\n\nexports.__esModule = true;\nexports.default = hyphenate;\nvar rUpper = /([A-Z])/g;\n\nfunction hyphenate(string) {\n  return string.replace(rUpper, '-$1').toLowerCase();\n}\n\nmodule.exports = exports[\"default\"];","\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nexports.__esModule = true;\nexports.default = hyphenateStyleName;\n\nvar _hyphenate = _interopRequireDefault(require(\"./hyphenate\"));\n\n/**\n * Copyright 2013-2014, Facebook, Inc.\n * All rights reserved.\n * https://github.com/facebook/react/blob/2aeb8a2a6beb00617a4217f7f8284924fa2ad819/src/vendor/core/hyphenateStyleName.js\n */\nvar msPattern = /^ms-/;\n\nfunction hyphenateStyleName(string) {\n  return (0, _hyphenate.default)(string).replace(msPattern, '-ms-');\n}\n\nmodule.exports = exports[\"default\"];","\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nexports.__esModule = true;\nexports.default = _getComputedStyle;\n\nvar _camelizeStyle = _interopRequireDefault(require(\"../util/camelizeStyle\"));\n\nvar rposition = /^(top|right|bottom|left)$/;\nvar rnumnonpx = /^([+-]?(?:\\d*\\.|)\\d+(?:[eE][+-]?\\d+|))(?!px)[a-z%]+$/i;\n\nfunction _getComputedStyle(node) {\n  if (!node) throw new TypeError('No Element passed to `getComputedStyle()`');\n  var doc = node.ownerDocument;\n  return 'defaultView' in doc ? doc.defaultView.opener ? node.ownerDocument.defaultView.getComputedStyle(node, null) : window.getComputedStyle(node, null) : {\n    //ie 8 \"magic\" from: https://github.com/jquery/jquery/blob/1.11-stable/src/css/curCSS.js#L72\n    getPropertyValue: function getPropertyValue(prop) {\n      var style = node.style;\n      prop = (0, _camelizeStyle.default)(prop);\n      if (prop == 'float') prop = 'styleFloat';\n      var current = node.currentStyle[prop] || null;\n      if (current == null && style && style[prop]) current = style[prop];\n\n      if (rnumnonpx.test(current) && !rposition.test(prop)) {\n        // Remember the original values\n        var left = style.left;\n        var runStyle = node.runtimeStyle;\n        var rsLeft = runStyle && runStyle.left; // Put in the new values to get a computed value out\n\n        if (rsLeft) runStyle.left = node.currentStyle.left;\n        style.left = prop === 'fontSize' ? '1em' : current;\n        current = style.pixelLeft + 'px'; // Revert the changed values\n\n        style.left = left;\n        if (rsLeft) runStyle.left = rsLeft;\n      }\n\n      return current;\n    }\n  };\n}\n\nmodule.exports = exports[\"default\"];","\"use strict\";\n\nexports.__esModule = true;\nexports.default = removeStyle;\n\nfunction removeStyle(node, key) {\n  return 'removeProperty' in node.style ? node.style.removeProperty(key) : node.style.removeAttribute(key);\n}\n\nmodule.exports = exports[\"default\"];","\"use strict\";\n\nexports.__esModule = true;\nexports.default = void 0;\n\nvar _default = !!(typeof window !== 'undefined' && window.document && window.document.createElement);\n\nexports.default = _default;\nmodule.exports = exports[\"default\"];","\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nexports.__esModule = true;\nexports.default = exports.animationEnd = exports.animationDelay = exports.animationTiming = exports.animationDuration = exports.animationName = exports.transitionEnd = exports.transitionDuration = exports.transitionDelay = exports.transitionTiming = exports.transitionProperty = exports.transform = void 0;\n\nvar _inDOM = _interopRequireDefault(require(\"../util/inDOM\"));\n\nvar transform = 'transform';\nexports.transform = transform;\nvar prefix, transitionEnd, animationEnd;\nexports.animationEnd = animationEnd;\nexports.transitionEnd = transitionEnd;\nvar transitionProperty, transitionDuration, transitionTiming, transitionDelay;\nexports.transitionDelay = transitionDelay;\nexports.transitionTiming = transitionTiming;\nexports.transitionDuration = transitionDuration;\nexports.transitionProperty = transitionProperty;\nvar animationName, animationDuration, animationTiming, animationDelay;\nexports.animationDelay = animationDelay;\nexports.animationTiming = animationTiming;\nexports.animationDuration = animationDuration;\nexports.animationName = animationName;\n\nif (_inDOM.default) {\n  var _getTransitionPropert = getTransitionProperties();\n\n  prefix = _getTransitionPropert.prefix;\n  exports.transitionEnd = transitionEnd = _getTransitionPropert.transitionEnd;\n  exports.animationEnd = animationEnd = _getTransitionPropert.animationEnd;\n  exports.transform = transform = prefix + \"-\" + transform;\n  exports.transitionProperty = transitionProperty = prefix + \"-transition-property\";\n  exports.transitionDuration = transitionDuration = prefix + \"-transition-duration\";\n  exports.transitionDelay = transitionDelay = prefix + \"-transition-delay\";\n  exports.transitionTiming = transitionTiming = prefix + \"-transition-timing-function\";\n  exports.animationName = animationName = prefix + \"-animation-name\";\n  exports.animationDuration = animationDuration = prefix + \"-animation-duration\";\n  exports.animationTiming = animationTiming = prefix + \"-animation-delay\";\n  exports.animationDelay = animationDelay = prefix + \"-animation-timing-function\";\n}\n\nvar _default = {\n  transform: transform,\n  end: transitionEnd,\n  property: transitionProperty,\n  timing: transitionTiming,\n  delay: transitionDelay,\n  duration: transitionDuration\n};\nexports.default = _default;\n\nfunction getTransitionProperties() {\n  var style = document.createElement('div').style;\n  var vendorMap = {\n    O: function O(e) {\n      return \"o\" + e.toLowerCase();\n    },\n    Moz: function Moz(e) {\n      return e.toLowerCase();\n    },\n    Webkit: function Webkit(e) {\n      return \"webkit\" + e;\n    },\n    ms: function ms(e) {\n      return \"MS\" + e;\n    }\n  };\n  var vendors = Object.keys(vendorMap);\n  var transitionEnd, animationEnd;\n  var prefix = '';\n\n  for (var i = 0; i < vendors.length; i++) {\n    var vendor = vendors[i];\n\n    if (vendor + \"TransitionProperty\" in style) {\n      prefix = \"-\" + vendor.toLowerCase();\n      transitionEnd = vendorMap[vendor]('TransitionEnd');\n      animationEnd = vendorMap[vendor]('AnimationEnd');\n      break;\n    }\n  }\n\n  if (!transitionEnd && 'transitionProperty' in style) transitionEnd = 'transitionend';\n  if (!animationEnd && 'animationName' in style) animationEnd = 'animationend';\n  style = null;\n  return {\n    animationEnd: animationEnd,\n    transitionEnd: transitionEnd,\n    prefix: prefix\n  };\n}","\"use strict\";\n\nexports.__esModule = true;\nexports.default = isTransform;\nvar supportedTransforms = /^((translate|rotate|scale)(X|Y|Z|3d)?|matrix(3d)?|perspective|skew(X|Y)?)$/i;\n\nfunction isTransform(property) {\n  return !!(property && supportedTransforms.test(property));\n}\n\nmodule.exports = exports[\"default\"];","\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nexports.__esModule = true;\nexports.default = style;\n\nvar _camelizeStyle = _interopRequireDefault(require(\"../util/camelizeStyle\"));\n\nvar _hyphenateStyle = _interopRequireDefault(require(\"../util/hyphenateStyle\"));\n\nvar _getComputedStyle2 = _interopRequireDefault(require(\"./getComputedStyle\"));\n\nvar _removeStyle = _interopRequireDefault(require(\"./removeStyle\"));\n\nvar _properties = require(\"../transition/properties\");\n\nvar _isTransform = _interopRequireDefault(require(\"../transition/isTransform\"));\n\nfunction style(node, property, value) {\n  var css = '';\n  var transforms = '';\n  var props = property;\n\n  if (typeof property === 'string') {\n    if (value === undefined) {\n      return node.style[(0, _camelizeStyle.default)(property)] || (0, _getComputedStyle2.default)(node).getPropertyValue((0, _hyphenateStyle.default)(property));\n    } else {\n      (props = {})[property] = value;\n    }\n  }\n\n  Object.keys(props).forEach(function (key) {\n    var value = props[key];\n\n    if (!value && value !== 0) {\n      (0, _removeStyle.default)(node, (0, _hyphenateStyle.default)(key));\n    } else if ((0, _isTransform.default)(key)) {\n      transforms += key + \"(\" + value + \") \";\n    } else {\n      css += (0, _hyphenateStyle.default)(key) + \": \" + value + \";\";\n    }\n  });\n\n  if (transforms) {\n    css += _properties.transform + \": \" + transforms + \";\";\n  }\n\n  node.style.cssText += ';' + css;\n}\n\nmodule.exports = exports[\"default\"];","\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nexports.__esModule = true;\nexports.default = void 0;\n\nvar _inDOM = _interopRequireDefault(require(\"../util/inDOM\"));\n\nvar _default = function () {\n  // HTML DOM and SVG DOM may have different support levels,\n  // so we need to check on context instead of a document root element.\n  return _inDOM.default ? function (context, node) {\n    if (context.contains) {\n      return context.contains(node);\n    } else if (context.compareDocumentPosition) {\n      return context === node || !!(context.compareDocumentPosition(node) & 16);\n    } else {\n      return fallback(context, node);\n    }\n  } : fallback;\n}();\n\nexports.default = _default;\n\nfunction fallback(context, node) {\n  if (node) do {\n    if (node === context) return true;\n  } while (node = node.parentNode);\n  return false;\n}\n\nmodule.exports = exports[\"default\"];","\"use strict\";\n\nexports.__esModule = true;\nexports.default = getWindow;\n\nfunction getWindow(node) {\n  return node === node.window ? node : node.nodeType === 9 ? node.defaultView || node.parentWindow : false;\n}\n\nmodule.exports = exports[\"default\"];","\"use strict\";\n\nexports.__esModule = true;\nexports.default = ownerDocument;\n\nfunction ownerDocument(node) {\n  return node && node.ownerDocument || document;\n}\n\nmodule.exports = exports[\"default\"];","\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nexports.__esModule = true;\nexports.default = offset;\n\nvar _contains = _interopRequireDefault(require(\"./contains\"));\n\nvar _isWindow = _interopRequireDefault(require(\"./isWindow\"));\n\nvar _ownerDocument = _interopRequireDefault(require(\"../ownerDocument\"));\n\nfunction offset(node) {\n  var doc = (0, _ownerDocument.default)(node),\n      win = (0, _isWindow.default)(doc),\n      docElem = doc && doc.documentElement,\n      box = {\n    top: 0,\n    left: 0,\n    height: 0,\n    width: 0\n  };\n  if (!doc) return; // Make sure it's not a disconnected DOM node\n\n  if (!(0, _contains.default)(docElem, node)) return box;\n  if (node.getBoundingClientRect !== undefined) box = node.getBoundingClientRect(); // IE8 getBoundingClientRect doesn't support width & height\n\n  box = {\n    top: box.top + (win.pageYOffset || docElem.scrollTop) - (docElem.clientTop || 0),\n    left: box.left + (win.pageXOffset || docElem.scrollLeft) - (docElem.clientLeft || 0),\n    width: (box.width == null ? node.offsetWidth : box.width) || 0,\n    height: (box.height == null ? node.offsetHeight : box.height) || 0\n  };\n  return box;\n}\n\nmodule.exports = exports[\"default\"];","function _extends() {\n  module.exports = _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  }, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;\n  return _extends.apply(this, arguments);\n}\n\nmodule.exports = _extends, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nexports.__esModule = true;\nexports.default = offsetParent;\n\nvar _ownerDocument = _interopRequireDefault(require(\"../ownerDocument\"));\n\nvar _style = _interopRequireDefault(require(\"../style\"));\n\nfunction nodeName(node) {\n  return node.nodeName && node.nodeName.toLowerCase();\n}\n\nfunction offsetParent(node) {\n  var doc = (0, _ownerDocument.default)(node),\n      offsetParent = node && node.offsetParent;\n\n  while (offsetParent && nodeName(node) !== 'html' && (0, _style.default)(offsetParent, 'position') === 'static') {\n    offsetParent = offsetParent.offsetParent;\n  }\n\n  return offsetParent || doc.documentElement;\n}\n\nmodule.exports = exports[\"default\"];","\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nexports.__esModule = true;\nexports.default = scrollTop;\n\nvar _isWindow = _interopRequireDefault(require(\"./isWindow\"));\n\nfunction scrollTop(node, val) {\n  var win = (0, _isWindow.default)(node);\n  if (val === undefined) return win ? 'pageYOffset' in win ? win.pageYOffset : win.document.documentElement.scrollTop : node.scrollTop;\n  if (win) win.scrollTo('pageXOffset' in win ? win.pageXOffset : win.document.documentElement.scrollLeft, val);else node.scrollTop = val;\n}\n\nmodule.exports = exports[\"default\"];","\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nexports.__esModule = true;\nexports.default = scrollTop;\n\nvar _isWindow = _interopRequireDefault(require(\"./isWindow\"));\n\nfunction scrollTop(node, val) {\n  var win = (0, _isWindow.default)(node);\n  if (val === undefined) return win ? 'pageXOffset' in win ? win.pageXOffset : win.document.documentElement.scrollLeft : node.scrollLeft;\n  if (win) win.scrollTo(val, 'pageYOffset' in win ? win.pageYOffset : win.document.documentElement.scrollTop);else node.scrollLeft = val;\n}\n\nmodule.exports = exports[\"default\"];","\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nexports.__esModule = true;\nexports.default = position;\n\nvar _extends2 = _interopRequireDefault(require(\"@babel/runtime/helpers/extends\"));\n\nvar _offset = _interopRequireDefault(require(\"./offset\"));\n\nvar _offsetParent = _interopRequireDefault(require(\"./offsetParent\"));\n\nvar _scrollTop = _interopRequireDefault(require(\"./scrollTop\"));\n\nvar _scrollLeft = _interopRequireDefault(require(\"./scrollLeft\"));\n\nvar _style = _interopRequireDefault(require(\"../style\"));\n\nfunction nodeName(node) {\n  return node.nodeName && node.nodeName.toLowerCase();\n}\n\nfunction position(node, offsetParent) {\n  var parentOffset = {\n    top: 0,\n    left: 0\n  },\n      offset; // Fixed elements are offset from window (parentOffset = {top:0, left: 0},\n  // because it is its only offset parent\n\n  if ((0, _style.default)(node, 'position') === 'fixed') {\n    offset = node.getBoundingClientRect();\n  } else {\n    offsetParent = offsetParent || (0, _offsetParent.default)(node);\n    offset = (0, _offset.default)(node);\n    if (nodeName(offsetParent) !== 'html') parentOffset = (0, _offset.default)(offsetParent);\n    parentOffset.top += parseInt((0, _style.default)(offsetParent, 'borderTopWidth'), 10) - (0, _scrollTop.default)(offsetParent) || 0;\n    parentOffset.left += parseInt((0, _style.default)(offsetParent, 'borderLeftWidth'), 10) - (0, _scrollLeft.default)(offsetParent) || 0;\n  } // Subtract parent offsets and node margins\n\n\n  return (0, _extends2.default)({}, offset, {\n    top: offset.top - parentOffset.top - (parseInt((0, _style.default)(node, 'marginTop'), 10) || 0),\n    left: offset.left - parentOffset.left - (parseInt((0, _style.default)(node, 'marginLeft'), 10) || 0)\n  });\n}\n\nmodule.exports = exports[\"default\"];","import $k7QOs$react, {useState as $k7QOs$useState, useCallback as $k7QOs$useCallback, useRef as $k7QOs$useRef, useEffect as $k7QOs$useEffect, useContext as $k7QOs$useContext, useMemo as $k7QOs$useMemo} from \"react\";\nimport {useLayoutEffect as $k7QOs$useLayoutEffect, useId as $k7QOs$useId, isIOS as $k7QOs$isIOS, chain as $k7QOs$chain, getScrollParent as $k7QOs$getScrollParent, useLabels as $k7QOs$useLabels} from \"@react-aria/utils\";\nimport {useLocale as $k7QOs$useLocale, useMessageFormatter as $k7QOs$useMessageFormatter} from \"@react-aria/i18n\";\nimport $k7QOs$domhelpersstyle from \"dom-helpers/style\";\nimport $k7QOs$domhelpersqueryoffset from \"dom-helpers/query/offset\";\nimport $k7QOs$domhelpersqueryposition from \"dom-helpers/query/position\";\nimport $k7QOs$domhelpersqueryscrollLeft from \"dom-helpers/query/scrollLeft\";\nimport $k7QOs$domhelpersqueryscrollTop from \"dom-helpers/query/scrollTop\";\nimport $k7QOs$domhelpersownerDocument from \"dom-helpers/ownerDocument\";\nimport {useInteractOutside as $k7QOs$useInteractOutside, useFocusWithin as $k7QOs$useFocusWithin} from \"@react-aria/interactions\";\nimport $k7QOs$reactdom from \"react-dom\";\nimport {VisuallyHidden as $k7QOs$VisuallyHidden} from \"@react-aria/visually-hidden\";\n\nfunction $parcel$export(e, n, v, s) {\n  Object.defineProperty(e, n, {get: v, set: s, enumerable: true, configurable: true});\n}\nfunction $parcel$interopDefault(a) {\n  return a && a.__esModule ? a.default : a;\n}\nvar $2a41e45df1593e64$exports = {};\n\n$parcel$export($2a41e45df1593e64$exports, \"useOverlayPosition\", () => $2a41e45df1593e64$export$d39e1813b3bdd0e1);\n\n\n\n\n\n\nconst $edcf132a9284368a$var$AXIS = {\n    top: 'top',\n    bottom: 'top',\n    left: 'left',\n    right: 'left'\n};\nconst $edcf132a9284368a$var$FLIPPED_DIRECTION = {\n    top: 'bottom',\n    bottom: 'top',\n    left: 'right',\n    right: 'left'\n};\nconst $edcf132a9284368a$var$CROSS_AXIS = {\n    top: 'left',\n    left: 'top'\n};\nconst $edcf132a9284368a$var$AXIS_SIZE = {\n    top: 'height',\n    left: 'width'\n};\nconst $edcf132a9284368a$var$PARSED_PLACEMENT_CACHE = {\n};\n// @ts-ignore\nlet $edcf132a9284368a$var$visualViewport = typeof window !== 'undefined' && window.visualViewport;\nfunction $edcf132a9284368a$var$getContainerDimensions(containerNode) {\n    let width = 0, height = 0, top = 0, left = 0;\n    let scroll = {\n    };\n    if (containerNode.tagName === 'BODY') {\n        var ref;\n        width = (ref = $edcf132a9284368a$var$visualViewport === null || $edcf132a9284368a$var$visualViewport === void 0 ? void 0 : $edcf132a9284368a$var$visualViewport.width) !== null && ref !== void 0 ? ref : document.documentElement.clientWidth;\n        var ref1;\n        height = (ref1 = $edcf132a9284368a$var$visualViewport === null || $edcf132a9284368a$var$visualViewport === void 0 ? void 0 : $edcf132a9284368a$var$visualViewport.height) !== null && ref1 !== void 0 ? ref1 : document.documentElement.clientHeight;\n        scroll.top = $k7QOs$domhelpersqueryscrollTop($k7QOs$domhelpersownerDocument(containerNode).documentElement) || $k7QOs$domhelpersqueryscrollTop(containerNode);\n        scroll.left = $k7QOs$domhelpersqueryscrollLeft($k7QOs$domhelpersownerDocument(containerNode).documentElement) || $k7QOs$domhelpersqueryscrollLeft(containerNode);\n    } else {\n        ({ width: width , height: height , top: top , left: left  } = $k7QOs$domhelpersqueryoffset(containerNode));\n        scroll.top = $k7QOs$domhelpersqueryscrollTop(containerNode);\n        scroll.left = $k7QOs$domhelpersqueryscrollLeft(containerNode);\n    }\n    return {\n        width: width,\n        height: height,\n        scroll: scroll,\n        top: top,\n        left: left\n    };\n}\nfunction $edcf132a9284368a$var$getScroll(node) {\n    return {\n        top: node.scrollTop,\n        left: node.scrollLeft,\n        width: node.scrollWidth,\n        height: node.scrollHeight\n    };\n}\nfunction $edcf132a9284368a$var$getDelta(axis, offset, size, containerDimensions, padding) {\n    let containerScroll = containerDimensions.scroll[axis];\n    let containerHeight = containerDimensions[$edcf132a9284368a$var$AXIS_SIZE[axis]];\n    let startEdgeOffset = offset - padding - containerScroll;\n    let endEdgeOffset = offset + padding - containerScroll + size;\n    if (startEdgeOffset < 0) return -startEdgeOffset;\n    else if (endEdgeOffset > containerHeight) return Math.max(containerHeight - endEdgeOffset, -startEdgeOffset);\n    else return 0;\n}\nfunction $edcf132a9284368a$var$getMargins(node) {\n    let style = window.getComputedStyle(node);\n    return {\n        top: parseInt(style.marginTop, 10) || 0,\n        bottom: parseInt(style.marginBottom, 10) || 0,\n        left: parseInt(style.marginLeft, 10) || 0,\n        right: parseInt(style.marginRight, 10) || 0\n    };\n}\nfunction $edcf132a9284368a$var$parsePlacement(input) {\n    if ($edcf132a9284368a$var$PARSED_PLACEMENT_CACHE[input]) return $edcf132a9284368a$var$PARSED_PLACEMENT_CACHE[input];\n    let [placement, crossPlacement] = input.split(' ');\n    let axis = $edcf132a9284368a$var$AXIS[placement] || 'right';\n    let crossAxis = $edcf132a9284368a$var$CROSS_AXIS[axis];\n    if (!$edcf132a9284368a$var$AXIS[crossPlacement]) crossPlacement = 'center';\n    let size = $edcf132a9284368a$var$AXIS_SIZE[axis];\n    let crossSize = $edcf132a9284368a$var$AXIS_SIZE[crossAxis];\n    $edcf132a9284368a$var$PARSED_PLACEMENT_CACHE[input] = {\n        placement: placement,\n        crossPlacement: crossPlacement,\n        axis: axis,\n        crossAxis: crossAxis,\n        size: size,\n        crossSize: crossSize\n    };\n    return $edcf132a9284368a$var$PARSED_PLACEMENT_CACHE[input];\n}\nfunction $edcf132a9284368a$var$computePosition(childOffset, boundaryDimensions, overlaySize, placementInfo, offset, crossOffset, containerOffsetWithBoundary, isContainerPositioned) {\n    let { placement: placement , crossPlacement: crossPlacement , axis: axis , crossAxis: crossAxis , size: size , crossSize: crossSize  } = placementInfo;\n    let position = {\n    };\n    // button position\n    position[crossAxis] = childOffset[crossAxis];\n    if (crossPlacement === 'center') //  + (button size / 2) - (overlay size / 2)\n    // at this point the overlay center should match the button center\n    position[crossAxis] += (childOffset[crossSize] - overlaySize[crossSize]) / 2;\n    else if (crossPlacement !== crossAxis) //  + (button size) - (overlay size)\n    // at this point the overlay bottom should match the button bottom\n    position[crossAxis] += childOffset[crossSize] - overlaySize[crossSize];\n     /* else {\n    the overlay top should match the button top\n  } */ \n    // add the crossOffset from props\n    position[crossAxis] += crossOffset;\n    // this is button center position - the overlay size + half of the button to align bottom of overlay with button center\n    let minViablePosition = childOffset[crossAxis] + childOffset[crossSize] / 2 - overlaySize[crossSize];\n    // this is button position of center, aligns top of overlay with button center\n    let maxViablePosition = childOffset[crossAxis] + childOffset[crossSize] / 2;\n    // clamp it into the range of the min/max positions\n    position[crossAxis] = Math.min(Math.max(minViablePosition, position[crossAxis]), maxViablePosition);\n    // Floor these so the position isn't placed on a partial pixel, only whole pixels. Shouldn't matter if it was floored or ceiled, so chose one.\n    if (placement === axis) {\n        // If the container is positioned (non-static), then we use the container's actual\n        // height, as `bottom` will be relative to this height.  But if the container is static,\n        // then it can only be the `document.body`, and `bottom` will be relative to _its_\n        // container, which should be as large as boundaryDimensions.\n        const containerHeight = isContainerPositioned ? containerOffsetWithBoundary[size] : boundaryDimensions[size];\n        position[$edcf132a9284368a$var$FLIPPED_DIRECTION[axis]] = Math.floor(containerHeight - childOffset[axis] + offset);\n    } else position[axis] = Math.floor(childOffset[axis] + childOffset[size] + offset);\n    return position;\n}\nfunction $edcf132a9284368a$var$getMaxHeight(position, boundaryDimensions, containerOffsetWithBoundary, childOffset, margins, padding) {\n    return position.top != null ? Math.max(0, boundaryDimensions.height + boundaryDimensions.top + boundaryDimensions.scroll.top - (containerOffsetWithBoundary.top + position.top) - (margins.top + margins.bottom + padding) // save additional space for margin and padding\n    ) : Math.max(0, childOffset.top + containerOffsetWithBoundary.top - (boundaryDimensions.top + boundaryDimensions.scroll.top) - (margins.top + margins.bottom + padding) // save additional space for margin and padding\n    );\n}\nfunction $edcf132a9284368a$var$getAvailableSpace(boundaryDimensions, containerOffsetWithBoundary, childOffset, margins, padding, placementInfo) {\n    let { placement: placement , axis: axis , size: size  } = placementInfo;\n    if (placement === axis) return Math.max(0, childOffset[axis] - boundaryDimensions[axis] - boundaryDimensions.scroll[axis] + containerOffsetWithBoundary[axis] - margins[axis] - margins[$edcf132a9284368a$var$FLIPPED_DIRECTION[axis]] - padding);\n    return Math.max(0, boundaryDimensions[size] + boundaryDimensions[axis] + boundaryDimensions.scroll[axis] - containerOffsetWithBoundary[axis] - childOffset[axis] - childOffset[size] - margins[axis] - margins[$edcf132a9284368a$var$FLIPPED_DIRECTION[axis]] - padding);\n}\nfunction $edcf132a9284368a$export$6839422d1f33cee9(placementInput, childOffset, overlaySize, scrollSize, margins, padding, flip, boundaryDimensions, containerOffsetWithBoundary, offset, crossOffset, isContainerPositioned, userSetMaxHeight) {\n    let placementInfo = $edcf132a9284368a$var$parsePlacement(placementInput);\n    let { size: size , crossAxis: crossAxis , crossSize: crossSize , placement: placement , crossPlacement: crossPlacement  } = placementInfo;\n    let position = $edcf132a9284368a$var$computePosition(childOffset, boundaryDimensions, overlaySize, placementInfo, offset, crossOffset, containerOffsetWithBoundary, isContainerPositioned);\n    let normalizedOffset = offset;\n    let space = $edcf132a9284368a$var$getAvailableSpace(boundaryDimensions, containerOffsetWithBoundary, childOffset, margins, padding + offset, placementInfo);\n    // Check if the scroll size of the overlay is greater than the available space to determine if we need to flip\n    if (flip && scrollSize[size] > space) {\n        let flippedPlacementInfo = $edcf132a9284368a$var$parsePlacement(`${$edcf132a9284368a$var$FLIPPED_DIRECTION[placement]} ${crossPlacement}`);\n        let flippedPosition = $edcf132a9284368a$var$computePosition(childOffset, boundaryDimensions, overlaySize, flippedPlacementInfo, offset, crossOffset, containerOffsetWithBoundary, isContainerPositioned);\n        let flippedSpace = $edcf132a9284368a$var$getAvailableSpace(boundaryDimensions, containerOffsetWithBoundary, childOffset, margins, padding + offset, flippedPlacementInfo);\n        // If the available space for the flipped position is greater than the original available space, flip.\n        if (flippedSpace > space) {\n            placementInfo = flippedPlacementInfo;\n            position = flippedPosition;\n            normalizedOffset = offset;\n        }\n    }\n    let delta = $edcf132a9284368a$var$getDelta(crossAxis, position[crossAxis], overlaySize[crossSize], boundaryDimensions, padding);\n    position[crossAxis] += delta;\n    let maxHeight = $edcf132a9284368a$var$getMaxHeight(position, boundaryDimensions, containerOffsetWithBoundary, childOffset, margins, padding);\n    if (userSetMaxHeight && userSetMaxHeight < maxHeight) maxHeight = userSetMaxHeight;\n    overlaySize.height = Math.min(overlaySize.height, maxHeight);\n    position = $edcf132a9284368a$var$computePosition(childOffset, boundaryDimensions, overlaySize, placementInfo, normalizedOffset, crossOffset, containerOffsetWithBoundary, isContainerPositioned);\n    delta = $edcf132a9284368a$var$getDelta(crossAxis, position[crossAxis], overlaySize[crossSize], boundaryDimensions, padding);\n    position[crossAxis] += delta;\n    let arrowPosition = {\n    };\n    arrowPosition[crossAxis] = childOffset[crossAxis] - position[crossAxis] + childOffset[crossSize] / 2;\n    return {\n        position: position,\n        maxHeight: maxHeight,\n        arrowOffsetLeft: arrowPosition.left,\n        arrowOffsetTop: arrowPosition.top,\n        placement: placementInfo.placement\n    };\n}\nfunction $edcf132a9284368a$export$b3ceb0cbf1056d98(opts) {\n    let { placement: placement , targetNode: targetNode , overlayNode: overlayNode , scrollNode: scrollNode , padding: padding , shouldFlip: shouldFlip , boundaryElement: boundaryElement , offset: offset , crossOffset: crossOffset , maxHeight: maxHeight  } = opts;\n    let container = overlayNode.offsetParent || document.body;\n    let isBodyContainer = container.tagName === 'BODY';\n    const containerPositionStyle = window.getComputedStyle(container).position;\n    let isContainerPositioned = !!containerPositionStyle && containerPositionStyle !== 'static';\n    let childOffset = isBodyContainer ? $k7QOs$domhelpersqueryoffset(targetNode) : $k7QOs$domhelpersqueryposition(targetNode, container);\n    if (!isBodyContainer) {\n        childOffset.top += parseInt($k7QOs$domhelpersstyle(targetNode, 'marginTop'), 10) || 0;\n        childOffset.left += parseInt($k7QOs$domhelpersstyle(targetNode, 'marginLeft'), 10) || 0;\n    }\n    let overlaySize = $k7QOs$domhelpersqueryoffset(overlayNode);\n    let margins = $edcf132a9284368a$var$getMargins(overlayNode);\n    overlaySize.width += margins.left + margins.right;\n    overlaySize.height += margins.top + margins.bottom;\n    let scrollSize = $edcf132a9284368a$var$getScroll(scrollNode);\n    let boundaryDimensions = $edcf132a9284368a$var$getContainerDimensions(boundaryElement);\n    let containerOffsetWithBoundary = boundaryElement.tagName === 'BODY' ? $k7QOs$domhelpersqueryoffset(container) : $k7QOs$domhelpersqueryposition(container, boundaryElement);\n    return $edcf132a9284368a$export$6839422d1f33cee9(placement, childOffset, overlaySize, scrollSize, margins, padding, shouldFlip, boundaryDimensions, containerOffsetWithBoundary, offset, crossOffset, isContainerPositioned, maxHeight);\n}\n\n\n\n\nconst $dd149f63282afbbf$export$f6211563215e3b37 = new WeakMap();\nfunction $dd149f63282afbbf$export$18fc8428861184da(opts) {\n    let { triggerRef: triggerRef , isOpen: isOpen , onClose: onClose  } = opts;\n    $k7QOs$useEffect(()=>{\n        if (!isOpen) return;\n        let onScroll = (e)=>{\n            // Ignore if scrolling an scrollable region outside the trigger's tree.\n            let target = e.target;\n            // window is not a Node and doesn't have contain, but window contains everything\n            if (!triggerRef.current || target instanceof Node && !target.contains(triggerRef.current)) return;\n            let onCloseHandler = onClose || $dd149f63282afbbf$export$f6211563215e3b37.get(triggerRef.current);\n            if (onCloseHandler) onCloseHandler();\n        };\n        window.addEventListener('scroll', onScroll, true);\n        return ()=>{\n            window.removeEventListener('scroll', onScroll, true);\n        };\n    }, [\n        isOpen,\n        onClose,\n        triggerRef\n    ]);\n}\n\n\n\n\n// @ts-ignore\nlet $2a41e45df1593e64$var$visualViewport = typeof window !== 'undefined' && window.visualViewport;\nfunction $2a41e45df1593e64$export$d39e1813b3bdd0e1(props) {\n    let { direction: direction  } = $k7QOs$useLocale();\n    let { targetRef: targetRef , overlayRef: overlayRef , scrollRef: scrollRef = overlayRef , placement: placement = 'bottom' , containerPadding: containerPadding = 12 , shouldFlip: shouldFlip = true , boundaryElement: boundaryElement = typeof document !== 'undefined' ? document.body : null , offset: offset = 0 , crossOffset: crossOffset = 0 , shouldUpdatePosition: shouldUpdatePosition = true , isOpen: isOpen = true , onClose: onClose , maxHeight: maxHeight  } = props;\n    let [position, setPosition] = $k7QOs$useState({\n        position: {\n        },\n        arrowOffsetLeft: undefined,\n        arrowOffsetTop: undefined,\n        maxHeight: undefined,\n        placement: undefined\n    });\n    let deps = [\n        shouldUpdatePosition,\n        placement,\n        overlayRef.current,\n        targetRef.current,\n        scrollRef.current,\n        containerPadding,\n        shouldFlip,\n        boundaryElement,\n        offset,\n        crossOffset,\n        isOpen,\n        direction,\n        maxHeight\n    ];\n    let updatePosition = $k7QOs$useCallback(()=>{\n        if (shouldUpdatePosition === false || !isOpen || !overlayRef.current || !targetRef.current || !scrollRef.current || !boundaryElement) return;\n        setPosition($edcf132a9284368a$export$b3ceb0cbf1056d98({\n            placement: $2a41e45df1593e64$var$translateRTL(placement, direction),\n            overlayNode: overlayRef.current,\n            targetNode: targetRef.current,\n            scrollNode: scrollRef.current,\n            padding: containerPadding,\n            shouldFlip: shouldFlip,\n            boundaryElement: boundaryElement,\n            offset: offset,\n            crossOffset: crossOffset,\n            maxHeight: maxHeight\n        }));\n    }, deps);\n    // Update position when anything changes\n    $k7QOs$useLayoutEffect(updatePosition, deps);\n    // Update position on window resize\n    $2a41e45df1593e64$var$useResize(updatePosition);\n    // Reposition the overlay and do not close on scroll while the visual viewport is resizing.\n    // This will ensure that overlays adjust their positioning when the iOS virtual keyboard appears.\n    let isResizing = $k7QOs$useRef(false);\n    $k7QOs$useLayoutEffect(()=>{\n        let timeout;\n        let onResize = ()=>{\n            isResizing.current = true;\n            clearTimeout(timeout);\n            timeout = setTimeout(()=>{\n                isResizing.current = false;\n            }, 500);\n            updatePosition();\n        };\n        $2a41e45df1593e64$var$visualViewport === null || $2a41e45df1593e64$var$visualViewport === void 0 ? void 0 : $2a41e45df1593e64$var$visualViewport.addEventListener('resize', onResize);\n        return ()=>{\n            $2a41e45df1593e64$var$visualViewport === null || $2a41e45df1593e64$var$visualViewport === void 0 ? void 0 : $2a41e45df1593e64$var$visualViewport.removeEventListener('resize', onResize);\n        };\n    }, [\n        updatePosition\n    ]);\n    let close = $k7QOs$useCallback(()=>{\n        if (!isResizing.current) onClose();\n    }, [\n        onClose,\n        isResizing\n    ]);\n    // When scrolling a parent scrollable region of the trigger (other than the body),\n    // we hide the popover. Otherwise, its position would be incorrect.\n    $dd149f63282afbbf$export$18fc8428861184da({\n        triggerRef: targetRef,\n        isOpen: isOpen,\n        onClose: onClose ? close : undefined\n    });\n    return {\n        overlayProps: {\n            style: {\n                position: 'absolute',\n                zIndex: 100000,\n                ...position.position,\n                maxHeight: position.maxHeight\n            }\n        },\n        placement: position.placement,\n        arrowProps: {\n            style: {\n                left: position.arrowOffsetLeft,\n                top: position.arrowOffsetTop\n            }\n        },\n        updatePosition: updatePosition\n    };\n}\nfunction $2a41e45df1593e64$var$useResize(onResize) {\n    $k7QOs$useLayoutEffect(()=>{\n        window.addEventListener('resize', onResize, false);\n        return ()=>{\n            window.removeEventListener('resize', onResize, false);\n        };\n    }, [\n        onResize\n    ]);\n}\nfunction $2a41e45df1593e64$var$translateRTL(position, direction) {\n    if (direction === 'rtl') return position.replace('start', 'right').replace('end', 'left');\n    return position.replace('start', 'left').replace('end', 'right');\n}\n\n\nvar $a11501f3d1d39e6c$exports = {};\n\n$parcel$export($a11501f3d1d39e6c$exports, \"useOverlay\", () => $a11501f3d1d39e6c$export$ea8f71083e90600f);\n\n\nconst $a11501f3d1d39e6c$var$visibleOverlays = [];\nfunction $a11501f3d1d39e6c$export$ea8f71083e90600f(props, ref) {\n    let { onClose: onClose , shouldCloseOnBlur: shouldCloseOnBlur , isOpen: isOpen , isDismissable: isDismissable = false , isKeyboardDismissDisabled: isKeyboardDismissDisabled = false , shouldCloseOnInteractOutside: shouldCloseOnInteractOutside  } = props;\n    // Add the overlay ref to the stack of visible overlays on mount, and remove on unmount.\n    $k7QOs$useEffect(()=>{\n        if (isOpen) $a11501f3d1d39e6c$var$visibleOverlays.push(ref);\n        return ()=>{\n            let index = $a11501f3d1d39e6c$var$visibleOverlays.indexOf(ref);\n            if (index >= 0) $a11501f3d1d39e6c$var$visibleOverlays.splice(index, 1);\n        };\n    }, [\n        isOpen,\n        ref\n    ]);\n    // Only hide the overlay when it is the topmost visible overlay in the stack.\n    let onHide = ()=>{\n        if ($a11501f3d1d39e6c$var$visibleOverlays[$a11501f3d1d39e6c$var$visibleOverlays.length - 1] === ref && onClose) onClose();\n    };\n    let onInteractOutsideStart = (e)=>{\n        if (!shouldCloseOnInteractOutside || shouldCloseOnInteractOutside(e.target)) {\n            if ($a11501f3d1d39e6c$var$visibleOverlays[$a11501f3d1d39e6c$var$visibleOverlays.length - 1] === ref) {\n                e.stopPropagation();\n                e.preventDefault();\n            }\n        }\n    };\n    let onInteractOutside = (e)=>{\n        if (!shouldCloseOnInteractOutside || shouldCloseOnInteractOutside(e.target)) {\n            if ($a11501f3d1d39e6c$var$visibleOverlays[$a11501f3d1d39e6c$var$visibleOverlays.length - 1] === ref) {\n                e.stopPropagation();\n                e.preventDefault();\n            }\n            onHide();\n        }\n    };\n    // Handle the escape key\n    let onKeyDown = (e)=>{\n        if (e.key === 'Escape' && !isKeyboardDismissDisabled) {\n            e.preventDefault();\n            onHide();\n        }\n    };\n    // Handle clicking outside the overlay to close it\n    $k7QOs$useInteractOutside({\n        ref: ref,\n        onInteractOutside: isDismissable ? onInteractOutside : null,\n        onInteractOutsideStart: onInteractOutsideStart\n    });\n    let { focusWithinProps: focusWithinProps  } = $k7QOs$useFocusWithin({\n        isDisabled: !shouldCloseOnBlur,\n        onBlurWithin: (e)=>{\n            if (!shouldCloseOnInteractOutside || shouldCloseOnInteractOutside(e.relatedTarget)) onClose();\n        }\n    });\n    let onPointerDownUnderlay = (e)=>{\n        // fixes a firefox issue that starts text selection https://bugzilla.mozilla.org/show_bug.cgi?id=1675846\n        if (e.target === e.currentTarget) e.preventDefault();\n    };\n    return {\n        overlayProps: {\n            onKeyDown: onKeyDown,\n            ...focusWithinProps\n        },\n        underlayProps: {\n            onPointerDown: onPointerDownUnderlay\n        }\n    };\n}\n\n\nvar $628037886ba31236$exports = {};\n\n$parcel$export($628037886ba31236$exports, \"useOverlayTrigger\", () => $628037886ba31236$export$f9d5c8beee7d008d);\n\n\n\nfunction $628037886ba31236$export$f9d5c8beee7d008d(props, state, ref) {\n    let { type: type  } = props;\n    let { isOpen: isOpen  } = state;\n    // Backward compatibility. Share state close function with useOverlayPosition so it can close on scroll\n    // without forcing users to pass onClose.\n    $k7QOs$useEffect(()=>{\n        if (ref && ref.current) $dd149f63282afbbf$export$f6211563215e3b37.set(ref.current, state.close);\n    });\n    // Aria 1.1 supports multiple values for aria-haspopup other than just menus.\n    // https://www.w3.org/TR/wai-aria-1.1/#aria-haspopup\n    // However, we only add it for menus for now because screen readers often\n    // announce it as a menu even for other values.\n    let ariaHasPopup = undefined;\n    if (type === 'menu') ariaHasPopup = true;\n    else if (type === 'listbox') ariaHasPopup = 'listbox';\n    let overlayId = $k7QOs$useId();\n    return {\n        triggerProps: {\n            'aria-haspopup': ariaHasPopup,\n            'aria-expanded': isOpen,\n            'aria-controls': isOpen ? overlayId : null\n        },\n        overlayProps: {\n            id: overlayId\n        }\n    };\n}\n\n\nvar $49c51c25361d4cd2$exports = {};\n\n$parcel$export($49c51c25361d4cd2$exports, \"usePreventScroll\", () => $49c51c25361d4cd2$export$ee0f7cc6afcd1c18);\n\n// @ts-ignore\nconst $49c51c25361d4cd2$var$visualViewport = typeof window !== 'undefined' && window.visualViewport;\n// HTML input types that do not cause the software keyboard to appear.\nconst $49c51c25361d4cd2$var$nonTextInputTypes = new Set([\n    'checkbox',\n    'radio',\n    'range',\n    'color',\n    'file',\n    'image',\n    'button',\n    'submit',\n    'reset'\n]);\nfunction $49c51c25361d4cd2$export$ee0f7cc6afcd1c18(options = {\n}) {\n    let { isDisabled: isDisabled  } = options;\n    $k7QOs$useLayoutEffect(()=>{\n        if (isDisabled) return;\n        if ($k7QOs$isIOS()) return $49c51c25361d4cd2$var$preventScrollMobileSafari();\n        else return $49c51c25361d4cd2$var$preventScrollStandard();\n    }, [\n        isDisabled\n    ]);\n}\n// For most browsers, all we need to do is set `overflow: hidden` on the root element, and\n// add some padding to prevent the page from shifting when the scrollbar is hidden.\nfunction $49c51c25361d4cd2$var$preventScrollStandard() {\n    return $k7QOs$chain($49c51c25361d4cd2$var$setStyle(document.documentElement, 'paddingRight', `${window.innerWidth - document.documentElement.clientWidth}px`), $49c51c25361d4cd2$var$setStyle(document.documentElement, 'overflow', 'hidden'));\n}\n// Mobile Safari is a whole different beast. Even with overflow: hidden,\n// it still scrolls the page in many situations:\n//\n// 1. When the bottom toolbar and address bar are collapsed, page scrolling is always allowed.\n// 2. When the keyboard is visible, the viewport does not resize. Instead, the keyboard covers part of\n//    it, so it becomes scrollable.\n// 3. When tapping on an input, the page always scrolls so that the input is centered in the visual viewport.\n//    This may cause even fixed position elements to scroll off the screen.\n// 4. When using the next/previous buttons in the keyboard to navigate between inputs, the whole page always\n//    scrolls, even if the input is inside a nested scrollable element that could be scrolled instead.\n//\n// In order to work around these cases, and prevent scrolling without jankiness, we do a few things:\n//\n// 1. Prevent default on `touchmove` events that are not in a scrollable element. This prevents touch scrolling\n//    on the window.\n// 2. Prevent default on `touchmove` events inside a scrollable element when the scroll position is at the\n//    top or bottom. This avoids the whole page scrolling instead, but does prevent overscrolling.\n// 3. Prevent default on `touchend` events on input elements and handle focusing the element ourselves.\n// 4. When focusing an input, apply a transform to trick Safari into thinking the input is at the top\n//    of the page, which prevents it from scrolling the page. After the input is focused, scroll the element\n//    into view ourselves, without scrolling the whole page.\n// 5. Offset the body by the scroll position using a negative margin and scroll to the top. This should appear the\n//    same visually, but makes the actual scroll position always zero. This is required to make all of the\n//    above work or Safari will still try to scroll the page when focusing an input.\n// 6. As a last resort, handle window scroll events, and scroll back to the top. This can happen when attempting\n//    to navigate to an input with the next/previous buttons that's outside a modal.\nfunction $49c51c25361d4cd2$var$preventScrollMobileSafari() {\n    let scrollable;\n    let lastY = 0;\n    let onTouchStart = (e)=>{\n        // Store the nearest scrollable parent element from the element that the user touched.\n        scrollable = $k7QOs$getScrollParent(e.target);\n        if (scrollable === document.documentElement && scrollable === document.body) return;\n        lastY = e.changedTouches[0].pageY;\n    };\n    let onTouchMove = (e)=>{\n        // Prevent scrolling the window.\n        if (scrollable === document.documentElement || scrollable === document.body) {\n            e.preventDefault();\n            return;\n        }\n        // Prevent scrolling up when at the top and scrolling down when at the bottom\n        // of a nested scrollable area, otherwise mobile Safari will start scrolling\n        // the window instead. Unfortunately, this disables bounce scrolling when at\n        // the top but it's the best we can do.\n        let y = e.changedTouches[0].pageY;\n        let scrollTop = scrollable.scrollTop;\n        let bottom = scrollable.scrollHeight - scrollable.clientHeight;\n        if (scrollTop <= 0 && y > lastY || scrollTop >= bottom && y < lastY) e.preventDefault();\n        lastY = y;\n    };\n    let onTouchEnd = (e)=>{\n        let target = e.target;\n        if (target instanceof HTMLInputElement && !$49c51c25361d4cd2$var$nonTextInputTypes.has(target.type)) {\n            e.preventDefault();\n            // Apply a transform to trick Safari into thinking the input is at the top of the page\n            // so it doesn't try to scroll it into view. When tapping on an input, this needs to\n            // be done before the \"focus\" event, so we have to focus the element ourselves.\n            target.style.transform = 'translateY(-2000px)';\n            target.focus();\n            requestAnimationFrame(()=>{\n                target.style.transform = '';\n            });\n        }\n    };\n    let onFocus = (e)=>{\n        let target = e.target;\n        if (target instanceof HTMLInputElement && !$49c51c25361d4cd2$var$nonTextInputTypes.has(target.type)) {\n            // Transform also needs to be applied in the focus event in cases where focus moves\n            // other than tapping on an input directly, e.g. the next/previous buttons in the\n            // software keyboard. In these cases, it seems applying the transform in the focus event\n            // is good enough, whereas when tapping an input, it must be done before the focus event. 🤷‍♂️\n            target.style.transform = 'translateY(-2000px)';\n            requestAnimationFrame(()=>{\n                target.style.transform = '';\n                // This will have prevented the browser from scrolling the focused element into view,\n                // so we need to do this ourselves in a way that doesn't cause the whole page to scroll.\n                if ($49c51c25361d4cd2$var$visualViewport) {\n                    if ($49c51c25361d4cd2$var$visualViewport.height < window.innerHeight) // If the keyboard is already visible, do this after one additional frame\n                    // to wait for the transform to be removed.\n                    requestAnimationFrame(()=>{\n                        $49c51c25361d4cd2$var$scrollIntoView(target);\n                    });\n                    else // Otherwise, wait for the visual viewport to resize before scrolling so we can\n                    // measure the correct position to scroll to.\n                    $49c51c25361d4cd2$var$visualViewport.addEventListener('resize', ()=>$49c51c25361d4cd2$var$scrollIntoView(target)\n                    , {\n                        once: true\n                    });\n                }\n            });\n        }\n    };\n    let onWindowScroll = ()=>{\n        // Last resort. If the window scrolled, scroll it back to the top.\n        // It should always be at the top because the body will have a negative margin (see below).\n        window.scrollTo(0, 0);\n    };\n    // Record the original scroll position so we can restore it.\n    // Then apply a negative margin to the body to offset it by the scroll position. This will\n    // enable us to scroll the window to the top, which is required for the rest of this to work.\n    let scrollX = window.pageXOffset;\n    let scrollY = window.pageYOffset;\n    let restoreStyles = $k7QOs$chain($49c51c25361d4cd2$var$setStyle(document.documentElement, 'paddingRight', `${window.innerWidth - document.documentElement.clientWidth}px`), $49c51c25361d4cd2$var$setStyle(document.documentElement, 'overflow', 'hidden'), $49c51c25361d4cd2$var$setStyle(document.body, 'marginTop', `-${scrollY}px`));\n    // Scroll to the top. The negative margin on the body will make this appear the same.\n    window.scrollTo(0, 0);\n    let removeEvents = $k7QOs$chain($49c51c25361d4cd2$var$addEvent(document, 'touchstart', onTouchStart, {\n        passive: false,\n        capture: true\n    }), $49c51c25361d4cd2$var$addEvent(document, 'touchmove', onTouchMove, {\n        passive: false,\n        capture: true\n    }), $49c51c25361d4cd2$var$addEvent(document, 'touchend', onTouchEnd, {\n        passive: false,\n        capture: true\n    }), $49c51c25361d4cd2$var$addEvent(document, 'focus', onFocus, true), $49c51c25361d4cd2$var$addEvent(window, 'scroll', onWindowScroll));\n    return ()=>{\n        // Restore styles and scroll the page back to where it was.\n        restoreStyles();\n        removeEvents();\n        window.scrollTo(scrollX, scrollY);\n    };\n}\n// Sets a CSS property on an element, and returns a function to revert it to the previous value.\nfunction $49c51c25361d4cd2$var$setStyle(element, style, value) {\n    let cur = element.style[style];\n    element.style[style] = value;\n    return ()=>{\n        element.style[style] = cur;\n    };\n}\n// Adds an event listener to an element, and returns a function to remove it.\nfunction $49c51c25361d4cd2$var$addEvent(target, event, handler, options) {\n    target.addEventListener(event, handler, options);\n    return ()=>{\n        target.removeEventListener(event, handler, options);\n    };\n}\nfunction $49c51c25361d4cd2$var$scrollIntoView(target) {\n    // Find the parent scrollable element and adjust the scroll position if the target is not already in view.\n    let scrollable = $k7QOs$getScrollParent(target);\n    if (scrollable !== document.documentElement && scrollable !== document.body) {\n        let scrollableTop = scrollable.getBoundingClientRect().top;\n        let targetTop = target.getBoundingClientRect().top;\n        if (targetTop > scrollableTop + target.clientHeight) scrollable.scrollTop += targetTop - scrollableTop;\n    }\n}\n\n\nvar $f57aed4a881a3485$exports = {};\n\n$parcel$export($f57aed4a881a3485$exports, \"ModalProvider\", () => $f57aed4a881a3485$export$178405afcd8c5eb);\n$parcel$export($f57aed4a881a3485$exports, \"useModalProvider\", () => $f57aed4a881a3485$export$d9aaed4c3ece1bc0);\n$parcel$export($f57aed4a881a3485$exports, \"OverlayProvider\", () => $f57aed4a881a3485$export$bf688221f59024e5);\n$parcel$export($f57aed4a881a3485$exports, \"OverlayContainer\", () => $f57aed4a881a3485$export$b47c3594eab58386);\n$parcel$export($f57aed4a881a3485$exports, \"useModal\", () => $f57aed4a881a3485$export$33ffd74ebf07f060);\n\n\nconst $f57aed4a881a3485$var$Context = /*#__PURE__*/ $k7QOs$react.createContext(null);\nfunction $f57aed4a881a3485$export$178405afcd8c5eb(props) {\n    let { children: children  } = props;\n    let parent = $k7QOs$useContext($f57aed4a881a3485$var$Context);\n    let [modalCount, setModalCount] = $k7QOs$useState(0);\n    let context = $k7QOs$useMemo(()=>({\n            parent: parent,\n            modalCount: modalCount,\n            addModal () {\n                setModalCount((count)=>count + 1\n                );\n                if (parent) parent.addModal();\n            },\n            removeModal () {\n                setModalCount((count)=>count - 1\n                );\n                if (parent) parent.removeModal();\n            }\n        })\n    , [\n        parent,\n        modalCount\n    ]);\n    return(/*#__PURE__*/ $k7QOs$react.createElement($f57aed4a881a3485$var$Context.Provider, {\n        value: context\n    }, children));\n}\nfunction $f57aed4a881a3485$export$d9aaed4c3ece1bc0() {\n    let context = $k7QOs$useContext($f57aed4a881a3485$var$Context);\n    return {\n        modalProviderProps: {\n            'aria-hidden': context && context.modalCount > 0 ? true : null\n        }\n    };\n}\n/**\n * Creates a root node that will be aria-hidden if there are other modals open.\n */ function $f57aed4a881a3485$var$OverlayContainerDOM(props) {\n    let { modalProviderProps: modalProviderProps  } = $f57aed4a881a3485$export$d9aaed4c3ece1bc0();\n    return(/*#__PURE__*/ $k7QOs$react.createElement(\"div\", {\n        \"data-overlay-container\": true,\n        ...props,\n        ...modalProviderProps\n    }));\n}\nfunction $f57aed4a881a3485$export$bf688221f59024e5(props) {\n    return(/*#__PURE__*/ $k7QOs$react.createElement($f57aed4a881a3485$export$178405afcd8c5eb, null, /*#__PURE__*/ $k7QOs$react.createElement($f57aed4a881a3485$var$OverlayContainerDOM, props)));\n}\nfunction $f57aed4a881a3485$export$b47c3594eab58386(props) {\n    let { portalContainer: portalContainer = document.body , ...rest } = props;\n    $k7QOs$react.useEffect(()=>{\n        if (portalContainer.closest('[data-overlay-container]')) throw new Error('An OverlayContainer must not be inside another container. Please change the portalContainer prop.');\n    }, [\n        portalContainer\n    ]);\n    let contents = /*#__PURE__*/ $k7QOs$react.createElement($f57aed4a881a3485$export$bf688221f59024e5, rest);\n    return(/*#__PURE__*/ $k7QOs$reactdom.createPortal(contents, portalContainer));\n}\nfunction $f57aed4a881a3485$export$33ffd74ebf07f060(options) {\n    // Add aria-hidden to all parent providers on mount, and restore on unmount.\n    let context = $k7QOs$useContext($f57aed4a881a3485$var$Context);\n    if (!context) throw new Error('Modal is not contained within a provider');\n    $k7QOs$useEffect(()=>{\n        if ((options === null || options === void 0 ? void 0 : options.isDisabled) || !context || !context.parent) return;\n        // The immediate context is from the provider containing this modal, so we only\n        // want to trigger aria-hidden on its parents not on the modal provider itself.\n        context.parent.addModal();\n        return ()=>{\n            if (context && context.parent) context.parent.removeModal();\n        };\n    }, [\n        context,\n        context.parent,\n        options === null || options === void 0 ? void 0 : options.isDisabled\n    ]);\n    return {\n        modalProps: {\n            'data-ismodal': !(options === null || options === void 0 ? void 0 : options.isDisabled)\n        }\n    };\n}\n\n\nvar $86ea4cb521eb2e37$exports = {};\n\n$parcel$export($86ea4cb521eb2e37$exports, \"DismissButton\", () => $86ea4cb521eb2e37$export$2317d149ed6f78c4);\nvar $61fe14465afefc5e$exports = {};\nvar $773d5888b972f1cf$exports = {};\n$773d5888b972f1cf$exports = JSON.parse(\"{\\\"dismiss\\\":\\\"تجاهل\\\"}\");\n\n\nvar $d11f19852b941573$exports = {};\n$d11f19852b941573$exports = JSON.parse(\"{\\\"dismiss\\\":\\\"Отхвърляне\\\"}\");\n\n\nvar $b983974c2ee1efb3$exports = {};\n$b983974c2ee1efb3$exports = JSON.parse(\"{\\\"dismiss\\\":\\\"Odstranit\\\"}\");\n\n\nvar $5809cc9d4e92de73$exports = {};\n$5809cc9d4e92de73$exports = JSON.parse(\"{\\\"dismiss\\\":\\\"Luk\\\"}\");\n\n\nvar $c68c2e4fc74398d1$exports = {};\n$c68c2e4fc74398d1$exports = JSON.parse(\"{\\\"dismiss\\\":\\\"Schließen\\\"}\");\n\n\nvar $0898b4c153db2b77$exports = {};\n$0898b4c153db2b77$exports = JSON.parse(\"{\\\"dismiss\\\":\\\"Απόρριψη\\\"}\");\n\n\nvar $6d74810286a15183$exports = {};\n$6d74810286a15183$exports = JSON.parse(\"{\\\"dismiss\\\":\\\"Dismiss\\\"}\");\n\n\nvar $309d73dc65f78055$exports = {};\n$309d73dc65f78055$exports = JSON.parse(\"{\\\"dismiss\\\":\\\"Descartar\\\"}\");\n\n\nvar $44ad94f7205cf593$exports = {};\n$44ad94f7205cf593$exports = JSON.parse(\"{\\\"dismiss\\\":\\\"Lõpeta\\\"}\");\n\n\nvar $7c28f5687f0779a9$exports = {};\n$7c28f5687f0779a9$exports = JSON.parse(\"{\\\"dismiss\\\":\\\"Hylkää\\\"}\");\n\n\nvar $e6d75df4b68bd73a$exports = {};\n$e6d75df4b68bd73a$exports = JSON.parse(\"{\\\"dismiss\\\":\\\"Rejeter\\\"}\");\n\n\nvar $87505c9dab186d0f$exports = {};\n$87505c9dab186d0f$exports = JSON.parse(\"{\\\"dismiss\\\":\\\"התעלם\\\"}\");\n\n\nvar $553439c3ffb3e492$exports = {};\n$553439c3ffb3e492$exports = JSON.parse(\"{\\\"dismiss\\\":\\\"Odbaci\\\"}\");\n\n\nvar $74cf411061b983a2$exports = {};\n$74cf411061b983a2$exports = JSON.parse(\"{\\\"dismiss\\\":\\\"Elutasítás\\\"}\");\n\n\nvar $e933f298574dc435$exports = {};\n$e933f298574dc435$exports = JSON.parse(\"{\\\"dismiss\\\":\\\"Ignora\\\"}\");\n\n\nvar $ac91fc9fe02f71f6$exports = {};\n$ac91fc9fe02f71f6$exports = JSON.parse(\"{\\\"dismiss\\\":\\\"閉じる\\\"}\");\n\n\nvar $52b96f86422025af$exports = {};\n$52b96f86422025af$exports = JSON.parse(\"{\\\"dismiss\\\":\\\"무시\\\"}\");\n\n\nvar $c0d724c3e51dafa6$exports = {};\n$c0d724c3e51dafa6$exports = JSON.parse(\"{\\\"dismiss\\\":\\\"Atmesti\\\"}\");\n\n\nvar $c92899672a3fe72e$exports = {};\n$c92899672a3fe72e$exports = JSON.parse(\"{\\\"dismiss\\\":\\\"Nerādīt\\\"}\");\n\n\nvar $9f576b39d8e7a9d6$exports = {};\n$9f576b39d8e7a9d6$exports = JSON.parse(\"{\\\"dismiss\\\":\\\"Lukk\\\"}\");\n\n\nvar $9d025808aeec81a7$exports = {};\n$9d025808aeec81a7$exports = JSON.parse(\"{\\\"dismiss\\\":\\\"Negeren\\\"}\");\n\n\nvar $fce709921e2c0fa6$exports = {};\n$fce709921e2c0fa6$exports = JSON.parse(\"{\\\"dismiss\\\":\\\"Zignoruj\\\"}\");\n\n\nvar $2599cf0c4ab37f59$exports = {};\n$2599cf0c4ab37f59$exports = JSON.parse(\"{\\\"dismiss\\\":\\\"Descartar\\\"}\");\n\n\nvar $3c220ae7ef8a35fd$exports = {};\n$3c220ae7ef8a35fd$exports = JSON.parse(\"{\\\"dismiss\\\":\\\"Dispensar\\\"}\");\n\n\nvar $93562b5094072f54$exports = {};\n$93562b5094072f54$exports = JSON.parse(\"{\\\"dismiss\\\":\\\"Revocare\\\"}\");\n\n\nvar $cd9e2abd0d06c7b4$exports = {};\n$cd9e2abd0d06c7b4$exports = JSON.parse(\"{\\\"dismiss\\\":\\\"Пропустить\\\"}\");\n\n\nvar $45375701f409adf1$exports = {};\n$45375701f409adf1$exports = JSON.parse(\"{\\\"dismiss\\\":\\\"Zrušiť\\\"}\");\n\n\nvar $27fab53a576de9dd$exports = {};\n$27fab53a576de9dd$exports = JSON.parse(\"{\\\"dismiss\\\":\\\"Opusti\\\"}\");\n\n\nvar $4438748d9952e7c7$exports = {};\n$4438748d9952e7c7$exports = JSON.parse(\"{\\\"dismiss\\\":\\\"Odbaci\\\"}\");\n\n\nvar $0936d7347ef4da4c$exports = {};\n$0936d7347ef4da4c$exports = JSON.parse(\"{\\\"dismiss\\\":\\\"Avvisa\\\"}\");\n\n\nvar $29700c92185d38f8$exports = {};\n$29700c92185d38f8$exports = JSON.parse(\"{\\\"dismiss\\\":\\\"Kapat\\\"}\");\n\n\nvar $662ccaf2be4c25b3$exports = {};\n$662ccaf2be4c25b3$exports = JSON.parse(\"{\\\"dismiss\\\":\\\"Скасувати\\\"}\");\n\n\nvar $d80a27deda7cdb3c$exports = {};\n$d80a27deda7cdb3c$exports = JSON.parse(\"{\\\"dismiss\\\":\\\"取消\\\"}\");\n\n\nvar $2b2734393847c884$exports = {};\n$2b2734393847c884$exports = JSON.parse(\"{\\\"dismiss\\\":\\\"關閉\\\"}\");\n\n\n$61fe14465afefc5e$exports = {\n    \"ar-AE\": $773d5888b972f1cf$exports,\n    \"bg-BG\": $d11f19852b941573$exports,\n    \"cs-CZ\": $b983974c2ee1efb3$exports,\n    \"da-DK\": $5809cc9d4e92de73$exports,\n    \"de-DE\": $c68c2e4fc74398d1$exports,\n    \"el-GR\": $0898b4c153db2b77$exports,\n    \"en-US\": $6d74810286a15183$exports,\n    \"es-ES\": $309d73dc65f78055$exports,\n    \"et-EE\": $44ad94f7205cf593$exports,\n    \"fi-FI\": $7c28f5687f0779a9$exports,\n    \"fr-FR\": $e6d75df4b68bd73a$exports,\n    \"he-IL\": $87505c9dab186d0f$exports,\n    \"hr-HR\": $553439c3ffb3e492$exports,\n    \"hu-HU\": $74cf411061b983a2$exports,\n    \"it-IT\": $e933f298574dc435$exports,\n    \"ja-JP\": $ac91fc9fe02f71f6$exports,\n    \"ko-KR\": $52b96f86422025af$exports,\n    \"lt-LT\": $c0d724c3e51dafa6$exports,\n    \"lv-LV\": $c92899672a3fe72e$exports,\n    \"nb-NO\": $9f576b39d8e7a9d6$exports,\n    \"nl-NL\": $9d025808aeec81a7$exports,\n    \"pl-PL\": $fce709921e2c0fa6$exports,\n    \"pt-BR\": $2599cf0c4ab37f59$exports,\n    \"pt-PT\": $3c220ae7ef8a35fd$exports,\n    \"ro-RO\": $93562b5094072f54$exports,\n    \"ru-RU\": $cd9e2abd0d06c7b4$exports,\n    \"sk-SK\": $45375701f409adf1$exports,\n    \"sl-SI\": $27fab53a576de9dd$exports,\n    \"sr-SP\": $4438748d9952e7c7$exports,\n    \"sv-SE\": $0936d7347ef4da4c$exports,\n    \"tr-TR\": $29700c92185d38f8$exports,\n    \"uk-UA\": $662ccaf2be4c25b3$exports,\n    \"zh-CN\": $d80a27deda7cdb3c$exports,\n    \"zh-TW\": $2b2734393847c884$exports\n};\n\n\n\n\n\n\nfunction $86ea4cb521eb2e37$export$2317d149ed6f78c4(props) {\n    let { onDismiss: onDismiss , ...otherProps } = props;\n    let formatMessage = $k7QOs$useMessageFormatter((/*@__PURE__*/$parcel$interopDefault($61fe14465afefc5e$exports)));\n    let labels = $k7QOs$useLabels(otherProps, formatMessage('dismiss'));\n    let onClick = ()=>{\n        if (onDismiss) onDismiss();\n    };\n    return(/*#__PURE__*/ $k7QOs$react.createElement($k7QOs$VisuallyHidden, null, /*#__PURE__*/ $k7QOs$react.createElement(\"button\", {\n        ...labels,\n        tabIndex: -1,\n        onClick: onClick\n    })));\n}\n\n\nvar $5e3802645cc19319$exports = {};\n\n$parcel$export($5e3802645cc19319$exports, \"ariaHideOutside\", () => $5e3802645cc19319$export$1c3ebcada18427bf);\n/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */ // Keeps a ref count of all hidden elements. Added to when hiding an element, and\n// subtracted from when showing it again. When it reaches zero, aria-hidden is removed.\nlet $5e3802645cc19319$var$refCountMap = new WeakMap();\nfunction $5e3802645cc19319$export$1c3ebcada18427bf(targets, root = document.body) {\n    let visibleNodes = new Set(targets);\n    let hiddenNodes = new Set();\n    let walker = document.createTreeWalker(root, NodeFilter.SHOW_ELEMENT, {\n        acceptNode (node) {\n            // If this node is a live announcer, add it to the set of nodes to keep visible.\n            if (node instanceof HTMLElement && node.dataset.liveAnnouncer === 'true') visibleNodes.add(node);\n            // Skip this node and its children if it is one of the target nodes, or a live announcer.\n            // Also skip children of already hidden nodes, as aria-hidden is recursive.\n            if (visibleNodes.has(node) || hiddenNodes.has(node.parentElement)) return NodeFilter.FILTER_REJECT;\n            // VoiceOver on iOS has issues hiding elements with role=\"row\". Hide the cells inside instead.\n            // https://bugs.webkit.org/show_bug.cgi?id=222623\n            if (node instanceof HTMLElement && node.getAttribute('role') === 'row') return NodeFilter.FILTER_SKIP;\n            // Skip this node but continue to children if one of the targets is inside the node.\n            if (targets.some((target)=>node.contains(target)\n            )) return NodeFilter.FILTER_SKIP;\n            return NodeFilter.FILTER_ACCEPT;\n        }\n    });\n    let hide = (node)=>{\n        var ref;\n        let refCount = (ref = $5e3802645cc19319$var$refCountMap.get(node)) !== null && ref !== void 0 ? ref : 0;\n        // If already aria-hidden, and the ref count is zero, then this element\n        // was already hidden and there's nothing for us to do.\n        if (node.getAttribute('aria-hidden') === 'true' && refCount === 0) return;\n        if (refCount === 0) node.setAttribute('aria-hidden', 'true');\n        hiddenNodes.add(node);\n        $5e3802645cc19319$var$refCountMap.set(node, refCount + 1);\n    };\n    let node1 = walker.nextNode();\n    while(node1 != null){\n        hide(node1);\n        node1 = walker.nextNode();\n    }\n    let observer = new MutationObserver((changes)=>{\n        for (let change of changes){\n            if (change.type !== 'childList' || change.addedNodes.length === 0) continue;\n            // If the parent element of the added nodes is not within one of the targets,\n            // and not already inside a hidden node, hide all of the new children.\n            if (![\n                ...visibleNodes,\n                ...hiddenNodes\n            ].some((node)=>node.contains(change.target)\n            )) for (let node2 of change.addedNodes){\n                if (node2 instanceof HTMLElement && node2.dataset.liveAnnouncer === 'true') visibleNodes.add(node2);\n                else if (node2 instanceof Element) hide(node2);\n            }\n        }\n    });\n    observer.observe(root, {\n        childList: true,\n        subtree: true\n    });\n    return ()=>{\n        observer.disconnect();\n        for (let node of hiddenNodes){\n            let count = $5e3802645cc19319$var$refCountMap.get(node);\n            if (count === 1) {\n                node.removeAttribute('aria-hidden');\n                $5e3802645cc19319$var$refCountMap.delete(node);\n            } else $5e3802645cc19319$var$refCountMap.set(node, count - 1);\n        }\n    };\n}\n\n\n\n\nexport {$2a41e45df1593e64$export$d39e1813b3bdd0e1 as useOverlayPosition, $a11501f3d1d39e6c$export$ea8f71083e90600f as useOverlay, $628037886ba31236$export$f9d5c8beee7d008d as useOverlayTrigger, $49c51c25361d4cd2$export$ee0f7cc6afcd1c18 as usePreventScroll, $f57aed4a881a3485$export$178405afcd8c5eb as ModalProvider, $f57aed4a881a3485$export$d9aaed4c3ece1bc0 as useModalProvider, $f57aed4a881a3485$export$bf688221f59024e5 as OverlayProvider, $f57aed4a881a3485$export$b47c3594eab58386 as OverlayContainer, $f57aed4a881a3485$export$33ffd74ebf07f060 as useModal, $86ea4cb521eb2e37$export$2317d149ed6f78c4 as DismissButton, $5e3802645cc19319$export$1c3ebcada18427bf as ariaHideOutside};\n//# sourceMappingURL=module.js.map\n","import {useRef as $dgwbL$useRef, useEffect as $dgwbL$useEffect, useMemo as $dgwbL$useMemo} from \"react\";\nimport {getFocusableTreeWalker as $dgwbL$getFocusableTreeWalker, focusSafely as $dgwbL$focusSafely} from \"@react-aria/focus\";\nimport {focusWithoutScrolling as $dgwbL$focusWithoutScrolling, useEvent as $dgwbL$useEvent, scrollIntoView as $dgwbL$scrollIntoView, mergeProps as $dgwbL$mergeProps, isAppleDevice as $dgwbL$isAppleDevice, isMac as $dgwbL$isMac} from \"@react-aria/utils\";\nimport {useLocale as $dgwbL$useLocale, useCollator as $dgwbL$useCollator} from \"@react-aria/i18n\";\nimport {usePress as $dgwbL$usePress, useLongPress as $dgwbL$useLongPress} from \"@react-aria/interactions\";\n\nfunction $parcel$export(e, n, v, s) {\n  Object.defineProperty(e, n, {get: v, set: s, enumerable: true, configurable: true});\n}\nvar $52ac987c016884e9$exports = {};\n\n$parcel$export($52ac987c016884e9$exports, \"useSelectableCollection\", () => $52ac987c016884e9$export$d6daf82dcd84e87c);\n\n\n\n\n\nfunction $c636d3b6065ca9f6$export$d3e3bd3e26688c04(e) {\n    // Ctrl + Arrow Up/Arrow Down has a system wide meaning on macOS, so use Alt instead.\n    // On Windows and Ubuntu, Alt + Space has a system wide meaning.\n    return $dgwbL$isAppleDevice() ? e.altKey : e.ctrlKey;\n}\nfunction $c636d3b6065ca9f6$export$16792effe837dba3(e) {\n    if ($dgwbL$isMac()) return e.metaKey;\n    return e.ctrlKey;\n}\n\n\n\nvar $a6f03d1cafa48b51$exports = {};\n\n$parcel$export($a6f03d1cafa48b51$exports, \"useTypeSelect\", () => $a6f03d1cafa48b51$export$e32c88dfddc6e1d8);\n\nfunction $a6f03d1cafa48b51$export$e32c88dfddc6e1d8(options) {\n    let { keyboardDelegate: keyboardDelegate , selectionManager: selectionManager , onTypeSelect: onTypeSelect  } = options;\n    let state = $dgwbL$useRef({\n        search: '',\n        timeout: null\n    }).current;\n    let onKeyDown = (e)=>{\n        let character = $a6f03d1cafa48b51$var$getStringForKey(e.key);\n        if (!character || e.ctrlKey || e.metaKey) return;\n        // Do not propagate the Spacebar event if it's meant to be part of the search.\n        // When we time out, the search term becomes empty, hence the check on length.\n        // Trimming is to account for the case of pressing the Spacebar more than once,\n        // which should cycle through the selection/deselection of the focused item.\n        if (character === ' ' && state.search.trim().length > 0) {\n            e.preventDefault();\n            if (!('continuePropagation' in e)) e.stopPropagation();\n        }\n        state.search += character;\n        // Use the delegate to find a key to focus.\n        // Prioritize items after the currently focused item, falling back to searching the whole list.\n        let key = keyboardDelegate.getKeyForSearch(state.search, selectionManager.focusedKey);\n        // If no key found, search from the top.\n        if (key == null) key = keyboardDelegate.getKeyForSearch(state.search);\n        if (key != null) {\n            selectionManager.setFocusedKey(key);\n            if (onTypeSelect) onTypeSelect(key);\n        }\n        clearTimeout(state.timeout);\n        state.timeout = setTimeout(()=>{\n            state.search = '';\n        }, 500);\n    };\n    return {\n        typeSelectProps: {\n            // Using a capturing listener to catch the keydown event before\n            // other hooks in order to handle the Spacebar event.\n            onKeyDownCapture: keyboardDelegate.getKeyForSearch ? onKeyDown : null\n        }\n    };\n}\nfunction $a6f03d1cafa48b51$var$getStringForKey(key) {\n    // If the key is of length 1, it is an ASCII value.\n    // Otherwise, if there are no ASCII characters in the key name,\n    // it is a Unicode character.\n    // See https://www.w3.org/TR/uievents-key/\n    if (key.length === 1 || !/^[A-Z]/i.test(key)) return key;\n    return '';\n}\n\n\nfunction $52ac987c016884e9$export$d6daf82dcd84e87c(options) {\n    let { selectionManager: manager , keyboardDelegate: delegate , ref: ref , autoFocus: autoFocus = false , shouldFocusWrap: shouldFocusWrap = false , disallowEmptySelection: disallowEmptySelection = false , disallowSelectAll: disallowSelectAll = false , selectOnFocus: selectOnFocus = manager.selectionBehavior === 'replace' , disallowTypeAhead: disallowTypeAhead = false , shouldUseVirtualFocus: shouldUseVirtualFocus , allowsTabNavigation: allowsTabNavigation = false , isVirtualized: isVirtualized , scrollRef: // If no scrollRef is provided, assume the collection ref is the scrollable region\n    scrollRef = ref  } = options;\n    let { direction: direction  } = $dgwbL$useLocale();\n    let onKeyDown = (e)=>{\n        // Prevent option + tab from doing anything since it doesn't move focus to the cells, only buttons/checkboxes\n        if (e.altKey && e.key === 'Tab') e.preventDefault();\n        // Keyboard events bubble through portals. Don't handle keyboard events\n        // for elements outside the collection (e.g. menus).\n        if (!ref.current.contains(e.target)) return;\n        const navigateToKey = (key, childFocus)=>{\n            if (key != null) {\n                manager.setFocusedKey(key, childFocus);\n                if (e.shiftKey && manager.selectionMode === 'multiple') manager.extendSelection(key);\n                else if (selectOnFocus && !$c636d3b6065ca9f6$export$d3e3bd3e26688c04(e)) manager.replaceSelection(key);\n            }\n        };\n        switch(e.key){\n            case 'ArrowDown':\n                if (delegate.getKeyBelow) {\n                    var ref4, ref1;\n                    e.preventDefault();\n                    let nextKey = manager.focusedKey != null ? delegate.getKeyBelow(manager.focusedKey) : (ref4 = delegate.getFirstKey) === null || ref4 === void 0 ? void 0 : ref4.call(delegate);\n                    if (nextKey == null && shouldFocusWrap) nextKey = (ref1 = delegate.getFirstKey) === null || ref1 === void 0 ? void 0 : ref1.call(delegate, manager.focusedKey);\n                    navigateToKey(nextKey);\n                }\n                break;\n            case 'ArrowUp':\n                if (delegate.getKeyAbove) {\n                    var ref2, ref3;\n                    e.preventDefault();\n                    let nextKey = manager.focusedKey != null ? delegate.getKeyAbove(manager.focusedKey) : (ref2 = delegate.getLastKey) === null || ref2 === void 0 ? void 0 : ref2.call(delegate);\n                    if (nextKey == null && shouldFocusWrap) nextKey = (ref3 = delegate.getLastKey) === null || ref3 === void 0 ? void 0 : ref3.call(delegate, manager.focusedKey);\n                    navigateToKey(nextKey);\n                }\n                break;\n            case 'ArrowLeft':\n                if (delegate.getKeyLeftOf) {\n                    e.preventDefault();\n                    let nextKey = delegate.getKeyLeftOf(manager.focusedKey);\n                    navigateToKey(nextKey, direction === 'rtl' ? 'first' : 'last');\n                }\n                break;\n            case 'ArrowRight':\n                if (delegate.getKeyRightOf) {\n                    e.preventDefault();\n                    let nextKey = delegate.getKeyRightOf(manager.focusedKey);\n                    navigateToKey(nextKey, direction === 'rtl' ? 'last' : 'first');\n                }\n                break;\n            case 'Home':\n                if (delegate.getFirstKey) {\n                    e.preventDefault();\n                    let firstKey = delegate.getFirstKey(manager.focusedKey, $c636d3b6065ca9f6$export$16792effe837dba3(e));\n                    manager.setFocusedKey(firstKey);\n                    if ($c636d3b6065ca9f6$export$16792effe837dba3(e) && e.shiftKey && manager.selectionMode === 'multiple') manager.extendSelection(firstKey);\n                    else if (selectOnFocus) manager.replaceSelection(firstKey);\n                }\n                break;\n            case 'End':\n                if (delegate.getLastKey) {\n                    e.preventDefault();\n                    let lastKey = delegate.getLastKey(manager.focusedKey, $c636d3b6065ca9f6$export$16792effe837dba3(e));\n                    manager.setFocusedKey(lastKey);\n                    if ($c636d3b6065ca9f6$export$16792effe837dba3(e) && e.shiftKey && manager.selectionMode === 'multiple') manager.extendSelection(lastKey);\n                    else if (selectOnFocus) manager.replaceSelection(lastKey);\n                }\n                break;\n            case 'PageDown':\n                if (delegate.getKeyPageBelow) {\n                    e.preventDefault();\n                    let nextKey = delegate.getKeyPageBelow(manager.focusedKey);\n                    navigateToKey(nextKey);\n                }\n                break;\n            case 'PageUp':\n                if (delegate.getKeyPageAbove) {\n                    e.preventDefault();\n                    let nextKey = delegate.getKeyPageAbove(manager.focusedKey);\n                    navigateToKey(nextKey);\n                }\n                break;\n            case 'a':\n                if ($c636d3b6065ca9f6$export$16792effe837dba3(e) && manager.selectionMode === 'multiple' && disallowSelectAll !== true) {\n                    e.preventDefault();\n                    manager.selectAll();\n                }\n                break;\n            case 'Escape':\n                e.preventDefault();\n                if (!disallowEmptySelection) manager.clearSelection();\n                break;\n            case 'Tab':\n                if (!allowsTabNavigation) {\n                    // There may be elements that are \"tabbable\" inside a collection (e.g. in a grid cell).\n                    // However, collections should be treated as a single tab stop, with arrow key navigation internally.\n                    // We don't control the rendering of these, so we can't override the tabIndex to prevent tabbing.\n                    // Instead, we handle the Tab key, and move focus manually to the first/last tabbable element\n                    // in the collection, so that the browser default behavior will apply starting from that element\n                    // rather than the currently focused one.\n                    if (e.shiftKey) ref.current.focus();\n                    else {\n                        let walker = $dgwbL$getFocusableTreeWalker(ref.current, {\n                            tabbable: true\n                        });\n                        let next;\n                        let last;\n                        do {\n                            last = walker.lastChild();\n                            if (last) next = last;\n                        }while (last)\n                        if (next && !next.contains(document.activeElement)) $dgwbL$focusWithoutScrolling(next);\n                    }\n                    break;\n                }\n        }\n    };\n    // Store the scroll position so we can restore it later.\n    let scrollPos = $dgwbL$useRef({\n        top: 0,\n        left: 0\n    });\n    $dgwbL$useEvent(scrollRef, 'scroll', isVirtualized ? null : ()=>{\n        scrollPos.current = {\n            top: scrollRef.current.scrollTop,\n            left: scrollRef.current.scrollLeft\n        };\n    });\n    let onFocus = (e)=>{\n        if (manager.isFocused) {\n            // If a focus event bubbled through a portal, reset focus state.\n            if (!e.currentTarget.contains(e.target)) manager.setFocused(false);\n            return;\n        }\n        // Focus events can bubble through portals. Ignore these events.\n        if (!e.currentTarget.contains(e.target)) return;\n        manager.setFocused(true);\n        if (manager.focusedKey == null) {\n            let navigateToFirstKey = (key)=>{\n                if (key != null) {\n                    manager.setFocusedKey(key);\n                    if (selectOnFocus) manager.replaceSelection(key);\n                }\n            };\n            // If the user hasn't yet interacted with the collection, there will be no focusedKey set.\n            // Attempt to detect whether the user is tabbing forward or backward into the collection\n            // and either focus the first or last item accordingly.\n            let relatedTarget = e.relatedTarget;\n            var _lastSelectedKey, _firstSelectedKey;\n            if (relatedTarget && e.currentTarget.compareDocumentPosition(relatedTarget) & Node.DOCUMENT_POSITION_FOLLOWING) navigateToFirstKey((_lastSelectedKey = manager.lastSelectedKey) !== null && _lastSelectedKey !== void 0 ? _lastSelectedKey : delegate.getLastKey());\n            else navigateToFirstKey((_firstSelectedKey = manager.firstSelectedKey) !== null && _firstSelectedKey !== void 0 ? _firstSelectedKey : delegate.getFirstKey());\n        } else if (!isVirtualized) {\n            // Restore the scroll position to what it was before.\n            scrollRef.current.scrollTop = scrollPos.current.top;\n            scrollRef.current.scrollLeft = scrollPos.current.left;\n            // Refocus and scroll the focused item into view if it exists within the scrollable region.\n            let element = scrollRef.current.querySelector(`[data-key=\"${manager.focusedKey}\"]`);\n            if (element) {\n                // This prevents a flash of focus on the first/last element in the collection\n                $dgwbL$focusWithoutScrolling(element);\n                $dgwbL$scrollIntoView(scrollRef.current, element);\n            }\n        }\n    };\n    let onBlur = (e)=>{\n        // Don't set blurred and then focused again if moving focus within the collection.\n        if (!e.currentTarget.contains(e.relatedTarget)) manager.setFocused(false);\n    };\n    const autoFocusRef = $dgwbL$useRef(autoFocus);\n    $dgwbL$useEffect(()=>{\n        if (autoFocusRef.current) {\n            let focusedKey = null;\n            // Check focus strategy to determine which item to focus\n            if (autoFocus === 'first') focusedKey = delegate.getFirstKey();\n            if (autoFocus === 'last') focusedKey = delegate.getLastKey();\n            // If there are any selected keys, make the first one the new focus target\n            let selectedKeys = manager.selectedKeys;\n            if (selectedKeys.size) focusedKey = selectedKeys.values().next().value;\n            manager.setFocused(true);\n            manager.setFocusedKey(focusedKey);\n            // If no default focus key is selected, focus the collection itself.\n            if (focusedKey == null && !shouldUseVirtualFocus) $dgwbL$focusSafely(ref.current);\n        }\n        autoFocusRef.current = false;\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n    }, []);\n    // If not virtualized, scroll the focused element into view when the focusedKey changes.\n    // When virtualized, Virtualizer handles this internally.\n    $dgwbL$useEffect(()=>{\n        if (!isVirtualized && manager.focusedKey && (scrollRef === null || scrollRef === void 0 ? void 0 : scrollRef.current)) {\n            let element = scrollRef.current.querySelector(`[data-key=\"${manager.focusedKey}\"]`);\n            if (element) $dgwbL$scrollIntoView(scrollRef.current, element);\n        }\n    }, [\n        isVirtualized,\n        scrollRef,\n        manager.focusedKey\n    ]);\n    let handlers = {\n        onKeyDown: onKeyDown,\n        onFocus: onFocus,\n        onBlur: onBlur,\n        onMouseDown (e) {\n            // Ignore events that bubbled through portals.\n            if (e.currentTarget.contains(e.target)) // Prevent focus going to the collection when clicking on the scrollbar.\n            e.preventDefault();\n        }\n    };\n    let { typeSelectProps: typeSelectProps  } = $a6f03d1cafa48b51$export$e32c88dfddc6e1d8({\n        keyboardDelegate: delegate,\n        selectionManager: manager\n    });\n    if (!disallowTypeAhead) handlers = $dgwbL$mergeProps(typeSelectProps, handlers);\n    // If nothing is focused within the collection, make the collection itself tabbable.\n    // This will be marshalled to either the first or last item depending on where focus came from.\n    // If using virtual focus, don't set a tabIndex at all so that VoiceOver on iOS 14 doesn't try\n    // to move real DOM focus to the element anyway.\n    let tabIndex;\n    if (!shouldUseVirtualFocus) tabIndex = manager.focusedKey == null ? 0 : -1;\n    return {\n        collectionProps: {\n            ...handlers,\n            tabIndex: tabIndex\n        }\n    };\n}\n\n\nvar $5ec5a493f6042709$exports = {};\n\n$parcel$export($5ec5a493f6042709$exports, \"useSelectableItem\", () => $5ec5a493f6042709$export$ecf600387e221c37);\n\n\n\n\n\nfunction $5ec5a493f6042709$export$ecf600387e221c37(options) {\n    let { selectionManager: manager , key: key , ref: ref , shouldSelectOnPressUp: shouldSelectOnPressUp , isVirtualized: isVirtualized , shouldUseVirtualFocus: shouldUseVirtualFocus , focus: focus , isDisabled: isDisabled , onAction: onAction  } = options;\n    let onSelect = (e)=>{\n        if (e.pointerType === 'keyboard' && $c636d3b6065ca9f6$export$d3e3bd3e26688c04(e)) manager.toggleSelection(key);\n        else {\n            if (manager.selectionMode === 'none') return;\n            if (manager.selectionMode === 'single') {\n                if (manager.isSelected(key) && !manager.disallowEmptySelection) manager.toggleSelection(key);\n                else manager.replaceSelection(key);\n            } else if (e && e.shiftKey) manager.extendSelection(key);\n            else if (manager.selectionBehavior === 'toggle' || e && ($c636d3b6065ca9f6$export$16792effe837dba3(e) || e.pointerType === 'touch' || e.pointerType === 'virtual')) // if touch or virtual (VO) then we just want to toggle, otherwise it's impossible to multi select because they don't have modifier keys\n            manager.toggleSelection(key);\n            else manager.replaceSelection(key);\n        }\n    };\n    // Focus the associated DOM node when this item becomes the focusedKey\n    let isFocused = key === manager.focusedKey;\n    $dgwbL$useEffect(()=>{\n        if (isFocused && manager.isFocused && !shouldUseVirtualFocus && document.activeElement !== ref.current) {\n            if (focus) focus();\n            else $dgwbL$focusSafely(ref.current);\n        }\n    }, [\n        ref,\n        isFocused,\n        manager.focusedKey,\n        manager.childFocusStrategy,\n        manager.isFocused,\n        shouldUseVirtualFocus\n    ]);\n    // Set tabIndex to 0 if the element is focused, or -1 otherwise so that only the last focused\n    // item is tabbable.  If using virtual focus, don't set a tabIndex at all so that VoiceOver\n    // on iOS 14 doesn't try to move real DOM focus to the item anyway.\n    let itemProps = {\n    };\n    if (!shouldUseVirtualFocus) itemProps = {\n        tabIndex: isFocused ? 0 : -1,\n        onFocus (e) {\n            if (e.target === ref.current) manager.setFocusedKey(key);\n        }\n    };\n    let modality = $dgwbL$useRef(null);\n    let hasPrimaryAction = onAction && manager.selectionMode === 'none';\n    let hasSecondaryAction = onAction && manager.selectionMode !== 'none' && manager.selectionBehavior === 'replace';\n    let allowsSelection = !isDisabled && manager.canSelectItem(key);\n    // By default, selection occurs on pointer down. This can be strange if selecting an\n    // item causes the UI to disappear immediately (e.g. menus).\n    // If shouldSelectOnPressUp is true, we use onPressUp instead of onPressStart.\n    // onPress requires a pointer down event on the same element as pointer up. For menus,\n    // we want to be able to have the pointer down on the trigger that opens the menu and\n    // the pointer up on the menu item rather than requiring a separate press.\n    // For keyboard events, selection still occurs on key down.\n    let itemPressProps = {\n    };\n    if (shouldSelectOnPressUp) {\n        itemPressProps.onPressStart = (e)=>{\n            modality.current = e.pointerType;\n            if (e.pointerType === 'keyboard') onSelect(e);\n        };\n        itemPressProps.onPressUp = (e)=>{\n            if (e.pointerType !== 'keyboard') onSelect(e);\n        };\n        itemPressProps.onPress = hasPrimaryAction ? ()=>onAction()\n         : null;\n    } else {\n        // On touch, it feels strange to select on touch down, so we special case this.\n        itemPressProps.onPressStart = (e)=>{\n            modality.current = e.pointerType;\n            if (e.pointerType !== 'touch' && e.pointerType !== 'virtual') onSelect(e);\n        };\n        itemPressProps.onPress = (e)=>{\n            if (e.pointerType === 'touch' || e.pointerType === 'virtual' || hasPrimaryAction) {\n                // Single tap on touch with selectionBehavior = 'replace' performs an action, i.e. navigation.\n                // Also perform action on press up when selectionMode = 'none'.\n                if (hasPrimaryAction || hasSecondaryAction) onAction();\n                else onSelect(e);\n            }\n        };\n    }\n    if (!isVirtualized) itemProps['data-key'] = key;\n    itemPressProps.preventFocusOnPress = shouldUseVirtualFocus;\n    let { pressProps: pressProps , isPressed: isPressed  } = $dgwbL$usePress(itemPressProps);\n    // Double clicking with a mouse with selectionBehavior = 'replace' performs an action.\n    let onDoubleClick = hasSecondaryAction ? (e)=>{\n        if (modality.current === 'mouse') {\n            e.stopPropagation();\n            e.preventDefault();\n            onAction();\n        }\n    } : undefined;\n    // Long pressing an item with touch when selectionBehavior = 'replace' switches the selection behavior\n    // to 'toggle'. This changes the single tap behavior from performing an action (i.e. navigating) to\n    // selecting, and may toggle the appearance of a UI affordance like checkboxes on each item.\n    // TODO: what about when drag and drop is also enabled??\n    let { longPressProps: longPressProps  } = $dgwbL$useLongPress({\n        isDisabled: !hasSecondaryAction,\n        onLongPress (e) {\n            if (e.pointerType === 'touch') {\n                onSelect(e);\n                manager.setSelectionBehavior('toggle');\n            }\n        }\n    });\n    // Pressing the Enter key with selectionBehavior = 'replace' performs an action (i.e. navigation).\n    let onKeyUp = hasSecondaryAction ? (e)=>{\n        if (e.key === 'Enter') onAction();\n    } : undefined;\n    return {\n        itemProps: $dgwbL$mergeProps(itemProps, allowsSelection || hasPrimaryAction ? pressProps : {\n        }, hasSecondaryAction ? longPressProps : {\n        }, {\n            onKeyUp: onKeyUp,\n            onDoubleClick: onDoubleClick\n        }),\n        isPressed: isPressed\n    };\n}\n\n\nvar $38e0ab555fbd8768$exports = {};\n\n$parcel$export($38e0ab555fbd8768$exports, \"useSelectableList\", () => $38e0ab555fbd8768$export$b95089534ab7c1fd);\n\nvar $8dd8d9b0d53d6ca8$exports = {};\n\n$parcel$export($8dd8d9b0d53d6ca8$exports, \"ListKeyboardDelegate\", () => $8dd8d9b0d53d6ca8$export$a05409b8bb224a5a);\nclass $8dd8d9b0d53d6ca8$export$a05409b8bb224a5a {\n    getKeyBelow(key) {\n        key = this.collection.getKeyAfter(key);\n        while(key != null){\n            let item = this.collection.getItem(key);\n            if (item.type === 'item' && !this.disabledKeys.has(key)) return key;\n            key = this.collection.getKeyAfter(key);\n        }\n    }\n    getKeyAbove(key) {\n        key = this.collection.getKeyBefore(key);\n        while(key != null){\n            let item = this.collection.getItem(key);\n            if (item.type === 'item' && !this.disabledKeys.has(key)) return key;\n            key = this.collection.getKeyBefore(key);\n        }\n    }\n    getFirstKey() {\n        let key = this.collection.getFirstKey();\n        while(key != null){\n            let item = this.collection.getItem(key);\n            if (item.type === 'item' && !this.disabledKeys.has(key)) return key;\n            key = this.collection.getKeyAfter(key);\n        }\n    }\n    getLastKey() {\n        let key = this.collection.getLastKey();\n        while(key != null){\n            let item = this.collection.getItem(key);\n            if (item.type === 'item' && !this.disabledKeys.has(key)) return key;\n            key = this.collection.getKeyBefore(key);\n        }\n    }\n    getItem(key) {\n        return this.ref.current.querySelector(`[data-key=\"${key}\"]`);\n    }\n    getKeyPageAbove(key) {\n        let menu = this.ref.current;\n        let item = this.getItem(key);\n        if (!item) return null;\n        let pageY = Math.max(0, item.offsetTop + item.offsetHeight - menu.offsetHeight);\n        while(item && item.offsetTop > pageY){\n            key = this.getKeyAbove(key);\n            item = this.getItem(key);\n        }\n        return key;\n    }\n    getKeyPageBelow(key) {\n        let menu = this.ref.current;\n        let item = this.getItem(key);\n        if (!item) return null;\n        let pageY = Math.min(menu.scrollHeight, item.offsetTop - item.offsetHeight + menu.offsetHeight);\n        while(item && item.offsetTop < pageY){\n            key = this.getKeyBelow(key);\n            item = this.getItem(key);\n        }\n        return key;\n    }\n    getKeyForSearch(search, fromKey) {\n        if (!this.collator) return null;\n        let collection = this.collection;\n        let key = fromKey || this.getFirstKey();\n        while(key != null){\n            let item = collection.getItem(key);\n            let substring = item.textValue.slice(0, search.length);\n            if (item.textValue && this.collator.compare(substring, search) === 0) return key;\n            key = this.getKeyBelow(key);\n        }\n        return null;\n    }\n    constructor(collection, disabledKeys, ref, collator){\n        this.collection = collection;\n        this.disabledKeys = disabledKeys;\n        this.ref = ref;\n        this.collator = collator;\n    }\n}\n\n\n\n\nfunction $38e0ab555fbd8768$export$b95089534ab7c1fd(props) {\n    let { selectionManager: selectionManager , collection: collection , disabledKeys: disabledKeys , ref: ref , keyboardDelegate: keyboardDelegate , autoFocus: autoFocus , shouldFocusWrap: shouldFocusWrap , isVirtualized: isVirtualized , disallowEmptySelection: disallowEmptySelection , selectOnFocus: selectOnFocus = false , disallowTypeAhead: disallowTypeAhead , shouldUseVirtualFocus: shouldUseVirtualFocus , allowsTabNavigation: allowsTabNavigation  } = props;\n    // By default, a KeyboardDelegate is provided which uses the DOM to query layout information (e.g. for page up/page down).\n    // When virtualized, the layout object will be passed in as a prop and override this.\n    let collator = $dgwbL$useCollator({\n        usage: 'search',\n        sensitivity: 'base'\n    });\n    let delegate = $dgwbL$useMemo(()=>keyboardDelegate || new $8dd8d9b0d53d6ca8$export$a05409b8bb224a5a(collection, disabledKeys, ref, collator)\n    , [\n        keyboardDelegate,\n        collection,\n        disabledKeys,\n        ref,\n        collator\n    ]);\n    let { collectionProps: collectionProps  } = $52ac987c016884e9$export$d6daf82dcd84e87c({\n        ref: ref,\n        selectionManager: selectionManager,\n        keyboardDelegate: delegate,\n        autoFocus: autoFocus,\n        shouldFocusWrap: shouldFocusWrap,\n        disallowEmptySelection: disallowEmptySelection,\n        selectOnFocus: selectOnFocus,\n        disallowTypeAhead: disallowTypeAhead,\n        shouldUseVirtualFocus: shouldUseVirtualFocus,\n        allowsTabNavigation: allowsTabNavigation,\n        isVirtualized: isVirtualized,\n        scrollRef: ref\n    });\n    return {\n        listProps: collectionProps\n    };\n}\n\n\n\n\n\n\nexport {$52ac987c016884e9$export$d6daf82dcd84e87c as useSelectableCollection, $5ec5a493f6042709$export$ecf600387e221c37 as useSelectableItem, $38e0ab555fbd8768$export$b95089534ab7c1fd as useSelectableList, $8dd8d9b0d53d6ca8$export$a05409b8bb224a5a as ListKeyboardDelegate, $a6f03d1cafa48b51$export$e32c88dfddc6e1d8 as useTypeSelect};\n//# sourceMappingURL=module.js.map\n","import {useId as $lVGRk$useId, mergeProps as $lVGRk$mergeProps, filterDOMProps as $lVGRk$filterDOMProps, useSlotId as $lVGRk$useSlotId} from \"@react-aria/utils\";\nimport {useLongPress as $lVGRk$useLongPress, usePress as $lVGRk$usePress, useHover as $lVGRk$useHover, isFocusVisible as $lVGRk$isFocusVisible} from \"@react-aria/interactions\";\nimport {useMessageFormatter as $lVGRk$useMessageFormatter} from \"@react-aria/i18n\";\nimport {useOverlayTrigger as $lVGRk$useOverlayTrigger} from \"@react-aria/overlays\";\nimport {useSelectableList as $lVGRk$useSelectableList, useSelectableItem as $lVGRk$useSelectableItem} from \"@react-aria/selection\";\nimport {getItemCount as $lVGRk$getItemCount} from \"@react-stately/collections\";\n\nfunction $parcel$interopDefault(a) {\n  return a && a.__esModule ? a.default : a;\n}\nfunction $parcel$export(e, n, v, s) {\n  Object.defineProperty(e, n, {get: v, set: s, enumerable: true, configurable: true});\n}\nvar $235cea8b956832d5$exports = {};\n\n$parcel$export($235cea8b956832d5$exports, \"useMenuTrigger\", () => $235cea8b956832d5$export$dc9c12ed27dd1b49);\nvar $96dc1c2244700b52$exports = {};\nvar $1a8690630e322ec6$exports = {};\n$1a8690630e322ec6$exports = JSON.parse(\"{\\\"longPressMessage\\\":\\\"اضغط مطولاً أو اضغط على Alt + السهم لأسفل لفتح القائمة\\\"}\");\n\n\nvar $fc3ddb23f24e2eea$exports = {};\n$fc3ddb23f24e2eea$exports = JSON.parse(\"{\\\"longPressMessage\\\":\\\"Натиснете продължително или натиснете Alt+ стрелка надолу, за да отворите менюто\\\"}\");\n\n\nvar $eb1dc9b603d71109$exports = {};\n$eb1dc9b603d71109$exports = JSON.parse(\"{\\\"longPressMessage\\\":\\\"Dlouhým stiskem nebo stisknutím kláves Alt + šipka dolů otevřete nabídku\\\"}\");\n\n\nvar $2d95ec734354bc1d$exports = {};\n$2d95ec734354bc1d$exports = JSON.parse(\"{\\\"longPressMessage\\\":\\\"Langt tryk eller tryk på Alt + pil ned for at åbne menuen\\\"}\");\n\n\nvar $e5cd075746034abd$exports = {};\n$e5cd075746034abd$exports = JSON.parse(\"{\\\"longPressMessage\\\":\\\"Drücken Sie lange oder drücken Sie Alt + Nach-unten, um das Menü zu öffnen\\\"}\");\n\n\nvar $74fe177ce68f16a7$exports = {};\n$74fe177ce68f16a7$exports = JSON.parse(\"{\\\"longPressMessage\\\":\\\"Πιέστε παρατεταμένα ή πατήστε Alt + κάτω βέλος για να ανοίξετε το μενού\\\"}\");\n\n\nvar $a59d721fbb9df903$exports = {};\n$a59d721fbb9df903$exports = JSON.parse(\"{\\\"longPressMessage\\\":\\\"Long press or press Alt + ArrowDown to open menu\\\"}\");\n\n\nvar $617e1630a7dd16ea$exports = {};\n$617e1630a7dd16ea$exports = JSON.parse(\"{\\\"longPressMessage\\\":\\\"Mantenga pulsado o pulse Alt + flecha abajo para abrir el menú\\\"}\");\n\n\nvar $3218d8c72495e96b$exports = {};\n$3218d8c72495e96b$exports = JSON.parse(\"{\\\"longPressMessage\\\":\\\"Menüü avamiseks vajutage pikalt või vajutage klahve Alt + allanool\\\"}\");\n\n\nvar $f2f412c97ede0995$exports = {};\n$f2f412c97ede0995$exports = JSON.parse(\"{\\\"longPressMessage\\\":\\\"Avaa valikko painamalla pohjassa tai näppäinyhdistelmällä Alt + Alanuoli\\\"}\");\n\n\nvar $7640150678ab200d$exports = {};\n$7640150678ab200d$exports = JSON.parse(\"{\\\"longPressMessage\\\":\\\"Appuyez de manière prolongée ou appuyez sur Alt + Flèche vers le bas pour ouvrir le menu.\\\"}\");\n\n\nvar $84c642b6d2ee0f06$exports = {};\n$84c642b6d2ee0f06$exports = JSON.parse(\"{\\\"longPressMessage\\\":\\\"לחץ לחיצה ארוכה או הקש Alt + ArrowDown כדי לפתוח את התפריט\\\"}\");\n\n\nvar $57727cf256b928dd$exports = {};\n$57727cf256b928dd$exports = JSON.parse(\"{\\\"longPressMessage\\\":\\\"Dugo pritisnite ili pritisnite Alt + strelicu prema dolje za otvaranje izbornika\\\"}\");\n\n\nvar $05114af5675ffd82$exports = {};\n$05114af5675ffd82$exports = JSON.parse(\"{\\\"longPressMessage\\\":\\\"Nyomja meg hosszan, vagy nyomja meg az Alt + lefele nyíl gombot a menü megnyitásához\\\"}\");\n\n\nvar $38a13f141610baa6$exports = {};\n$38a13f141610baa6$exports = JSON.parse(\"{\\\"longPressMessage\\\":\\\"Premere a lungo o premere Alt + Freccia giù per aprire il menu\\\"}\");\n\n\nvar $02ea00ed085de6ca$exports = {};\n$02ea00ed085de6ca$exports = JSON.parse(\"{\\\"longPressMessage\\\":\\\"長押しまたは Alt+下矢印キーでメニューを開く\\\"}\");\n\n\nvar $220ff1248b85a717$exports = {};\n$220ff1248b85a717$exports = JSON.parse(\"{\\\"longPressMessage\\\":\\\"길게 누르거나 Alt + 아래쪽 화살표를 눌러 메뉴 열기\\\"}\");\n\n\nvar $bf5ad8f2c050e288$exports = {};\n$bf5ad8f2c050e288$exports = JSON.parse(\"{\\\"longPressMessage\\\":\\\"Norėdami atidaryti meniu, nuspaudę palaikykite arba paspauskite „Alt + ArrowDown“.\\\"}\");\n\n\nvar $f3bc8e284003309a$exports = {};\n$f3bc8e284003309a$exports = JSON.parse(\"{\\\"longPressMessage\\\":\\\"Lai atvērtu izvēlni, turiet nospiestu vai nospiediet taustiņu kombināciju Alt + lejupvērstā bultiņa\\\"}\");\n\n\nvar $7cb4a85cce2978c1$exports = {};\n$7cb4a85cce2978c1$exports = JSON.parse(\"{\\\"longPressMessage\\\":\\\"Langt trykk eller trykk Alt + PilNed for å åpne menyen\\\"}\");\n\n\nvar $4bbc2c2d2f167f68$exports = {};\n$4bbc2c2d2f167f68$exports = JSON.parse(\"{\\\"longPressMessage\\\":\\\"Druk lang op Alt + pijl-omlaag of druk op Alt om het menu te openen\\\"}\");\n\n\nvar $ed008113cc0b674e$exports = {};\n$ed008113cc0b674e$exports = JSON.parse(\"{\\\"longPressMessage\\\":\\\"Naciśnij i przytrzymaj lub naciśnij klawisze Alt + Strzałka w dół, aby otworzyć menu\\\"}\");\n\n\nvar $62bfb2a2daab045d$exports = {};\n$62bfb2a2daab045d$exports = JSON.parse(\"{\\\"longPressMessage\\\":\\\"Pressione e segure ou pressione Alt + Seta para baixo para abrir o menu\\\"}\");\n\n\nvar $856d8cc1d19b4c06$exports = {};\n$856d8cc1d19b4c06$exports = JSON.parse(\"{\\\"longPressMessage\\\":\\\"Prima continuamente ou prima Alt + Seta Para Baixo para abrir o menu\\\"}\");\n\n\nvar $a46dcfaf580fda03$exports = {};\n$a46dcfaf580fda03$exports = JSON.parse(\"{\\\"longPressMessage\\\":\\\"Apăsați lung sau apăsați pe Alt + săgeată în jos pentru a deschide meniul\\\"}\");\n\n\nvar $d919ca79cce015eb$exports = {};\n$d919ca79cce015eb$exports = JSON.parse(\"{\\\"longPressMessage\\\":\\\"Нажмите и удерживайте или нажмите Alt + Стрелка вниз, чтобы открыть меню\\\"}\");\n\n\nvar $dcee2f03ab5d79f4$exports = {};\n$dcee2f03ab5d79f4$exports = JSON.parse(\"{\\\"longPressMessage\\\":\\\"Ponuku otvoríte dlhým stlačením alebo stlačením klávesu Alt + klávesu so šípkou nadol\\\"}\");\n\n\nvar $ec308c4d4a31d7ef$exports = {};\n$ec308c4d4a31d7ef$exports = JSON.parse(\"{\\\"longPressMessage\\\":\\\"Za odprtje menija pritisnite in držite gumb ali pritisnite Alt+puščica navzdol\\\"}\");\n\n\nvar $639001ec689e223b$exports = {};\n$639001ec689e223b$exports = JSON.parse(\"{\\\"longPressMessage\\\":\\\"Dugo pritisnite ili pritisnite Alt + strelicu prema dole da otvorite meni\\\"}\");\n\n\nvar $37090bf5b661009a$exports = {};\n$37090bf5b661009a$exports = JSON.parse(\"{\\\"longPressMessage\\\":\\\"Håll nedtryckt eller tryck på Alt + pil nedåt för att öppna menyn\\\"}\");\n\n\nvar $4ca70371ce142708$exports = {};\n$4ca70371ce142708$exports = JSON.parse(\"{\\\"longPressMessage\\\":\\\"Menüyü açmak için uzun basın veya Alt + Aşağı Ok tuşuna basın\\\"}\");\n\n\nvar $772cc5075c4120ad$exports = {};\n$772cc5075c4120ad$exports = JSON.parse(\"{\\\"longPressMessage\\\":\\\"Довго або звичайно натисніть комбінацію клавіш Alt і стрілка вниз, щоб відкрити меню\\\"}\");\n\n\nvar $a280148193f17e0f$exports = {};\n$a280148193f17e0f$exports = JSON.parse(\"{\\\"longPressMessage\\\":\\\"长按或按 Alt + 向下方向键以打开菜单\\\"}\");\n\n\nvar $08dca4706d9e39f3$exports = {};\n$08dca4706d9e39f3$exports = JSON.parse(\"{\\\"longPressMessage\\\":\\\"長按或按 Alt+向下鍵以開啟功能表\\\"}\");\n\n\n$96dc1c2244700b52$exports = {\n    \"ar-AE\": $1a8690630e322ec6$exports,\n    \"bg-BG\": $fc3ddb23f24e2eea$exports,\n    \"cs-CZ\": $eb1dc9b603d71109$exports,\n    \"da-DK\": $2d95ec734354bc1d$exports,\n    \"de-DE\": $e5cd075746034abd$exports,\n    \"el-GR\": $74fe177ce68f16a7$exports,\n    \"en-US\": $a59d721fbb9df903$exports,\n    \"es-ES\": $617e1630a7dd16ea$exports,\n    \"et-EE\": $3218d8c72495e96b$exports,\n    \"fi-FI\": $f2f412c97ede0995$exports,\n    \"fr-FR\": $7640150678ab200d$exports,\n    \"he-IL\": $84c642b6d2ee0f06$exports,\n    \"hr-HR\": $57727cf256b928dd$exports,\n    \"hu-HU\": $05114af5675ffd82$exports,\n    \"it-IT\": $38a13f141610baa6$exports,\n    \"ja-JP\": $02ea00ed085de6ca$exports,\n    \"ko-KR\": $220ff1248b85a717$exports,\n    \"lt-LT\": $bf5ad8f2c050e288$exports,\n    \"lv-LV\": $f3bc8e284003309a$exports,\n    \"nb-NO\": $7cb4a85cce2978c1$exports,\n    \"nl-NL\": $4bbc2c2d2f167f68$exports,\n    \"pl-PL\": $ed008113cc0b674e$exports,\n    \"pt-BR\": $62bfb2a2daab045d$exports,\n    \"pt-PT\": $856d8cc1d19b4c06$exports,\n    \"ro-RO\": $a46dcfaf580fda03$exports,\n    \"ru-RU\": $d919ca79cce015eb$exports,\n    \"sk-SK\": $dcee2f03ab5d79f4$exports,\n    \"sl-SI\": $ec308c4d4a31d7ef$exports,\n    \"sr-SP\": $639001ec689e223b$exports,\n    \"sv-SE\": $37090bf5b661009a$exports,\n    \"tr-TR\": $4ca70371ce142708$exports,\n    \"uk-UA\": $772cc5075c4120ad$exports,\n    \"zh-CN\": $a280148193f17e0f$exports,\n    \"zh-TW\": $08dca4706d9e39f3$exports\n};\n\n\n\n\n\n\nfunction $235cea8b956832d5$export$dc9c12ed27dd1b49(props, state, ref) {\n    let { type: type = 'menu' , isDisabled: isDisabled , trigger: trigger = 'press'  } = props;\n    let menuTriggerId = $lVGRk$useId();\n    let { triggerProps: triggerProps , overlayProps: overlayProps  } = $lVGRk$useOverlayTrigger({\n        type: type\n    }, state, ref);\n    let onKeyDown = (e)=>{\n        if (isDisabled) return;\n        if (trigger === 'longPress' && !e.altKey) return;\n        if (ref && ref.current) switch(e.key){\n            case 'Enter':\n            case ' ':\n                if (trigger === 'longPress') return;\n            // fallthrough\n            case 'ArrowDown':\n                // Stop propagation, unless it would already be handled by useKeyboard.\n                if (!('continuePropagation' in e)) e.stopPropagation();\n                e.preventDefault();\n                state.toggle('first');\n                break;\n            case 'ArrowUp':\n                if (!('continuePropagation' in e)) e.stopPropagation();\n                e.preventDefault();\n                state.toggle('last');\n                break;\n        }\n    };\n    let formatMessage = $lVGRk$useMessageFormatter((/*@__PURE__*/$parcel$interopDefault($96dc1c2244700b52$exports)));\n    let { longPressProps: longPressProps  } = $lVGRk$useLongPress({\n        accessibilityDescription: formatMessage('longPressMessage'),\n        onLongPressStart () {\n            state.close();\n        },\n        onLongPress () {\n            state.open('first');\n        }\n    });\n    let pressProps = {\n        onPressStart (e) {\n            // For consistency with native, open the menu on mouse/key down, but touch up.\n            if (e.pointerType !== 'touch' && e.pointerType !== 'keyboard' && !isDisabled) // If opened with a screen reader, auto focus the first item.\n            // Otherwise, the menu itself will be focused.\n            state.toggle(e.pointerType === 'virtual' ? 'first' : null);\n        },\n        onPress (e) {\n            if (e.pointerType === 'touch' && !isDisabled) state.toggle();\n        }\n    };\n    triggerProps = $lVGRk$mergeProps(triggerProps, trigger === 'press' ? pressProps : longPressProps);\n    return {\n        menuTriggerProps: {\n            ...triggerProps,\n            id: menuTriggerId,\n            onKeyDown: onKeyDown\n        },\n        menuProps: {\n            ...overlayProps,\n            'aria-labelledby': menuTriggerId\n        }\n    };\n}\n\n\nvar $9e81e1e13d86f3bd$exports = {};\n\n$parcel$export($9e81e1e13d86f3bd$exports, \"useMenu\", () => $9e81e1e13d86f3bd$export$38eaa17faae8f579);\n\n\nfunction $9e81e1e13d86f3bd$export$38eaa17faae8f579(props, state, ref) {\n    let { shouldFocusWrap: shouldFocusWrap = true , ...otherProps } = props;\n    if (!props['aria-label'] && !props['aria-labelledby']) console.warn('An aria-label or aria-labelledby prop is required for accessibility.');\n    let domProps = $lVGRk$filterDOMProps(props, {\n        labelable: true\n    });\n    let { listProps: listProps  } = $lVGRk$useSelectableList({\n        ...otherProps,\n        ref: ref,\n        selectionManager: state.selectionManager,\n        collection: state.collection,\n        disabledKeys: state.disabledKeys,\n        shouldFocusWrap: shouldFocusWrap\n    });\n    return {\n        menuProps: $lVGRk$mergeProps(domProps, {\n            role: 'menu',\n            ...listProps\n        })\n    };\n}\n\n\nvar $c5d816999d2ff723$exports = {};\n\n$parcel$export($c5d816999d2ff723$exports, \"useMenuItem\", () => $c5d816999d2ff723$export$9d32628fc2aea7da);\n\n\n\n\nfunction $c5d816999d2ff723$export$9d32628fc2aea7da(props, state, ref) {\n    let { isSelected: isSelected , isDisabled: isDisabled , key: key , onClose: onClose , closeOnSelect: closeOnSelect , isVirtualized: isVirtualized , onAction: onAction  } = props;\n    let role = 'menuitem';\n    if (state.selectionManager.selectionMode === 'single') role = 'menuitemradio';\n    else if (state.selectionManager.selectionMode === 'multiple') role = 'menuitemcheckbox';\n    let labelId = $lVGRk$useSlotId();\n    let descriptionId = $lVGRk$useSlotId();\n    let keyboardId = $lVGRk$useSlotId();\n    let ariaProps = {\n        'aria-disabled': isDisabled,\n        role: role,\n        'aria-label': props['aria-label'],\n        'aria-labelledby': labelId,\n        'aria-describedby': [\n            descriptionId,\n            keyboardId\n        ].filter(Boolean).join(' ') || undefined\n    };\n    if (state.selectionManager.selectionMode !== 'none') ariaProps['aria-checked'] = isSelected;\n    if (isVirtualized) {\n        ariaProps['aria-posinset'] = state.collection.getItem(key).index;\n        ariaProps['aria-setsize'] = $lVGRk$getItemCount(state.collection);\n    }\n    let onKeyDown = (e)=>{\n        // Ignore repeating events, which may have started on the menu trigger before moving\n        // focus to the menu item. We want to wait for a second complete key press sequence.\n        if (e.repeat) return;\n        switch(e.key){\n            case ' ':\n                if (!isDisabled && state.selectionManager.selectionMode === 'none' && closeOnSelect !== false && onClose) onClose();\n                break;\n            case 'Enter':\n                // The Enter key should always close on select, except if overridden.\n                if (!isDisabled && closeOnSelect !== false && onClose) onClose();\n                break;\n        }\n    };\n    let onPressStart = (e)=>{\n        if (e.pointerType === 'keyboard' && onAction) onAction(key);\n    };\n    let onPressUp = (e)=>{\n        if (e.pointerType !== 'keyboard') {\n            if (onAction) onAction(key);\n            // Pressing a menu item should close by default in single selection mode but not multiple\n            // selection mode, except if overridden by the closeOnSelect prop.\n            if (onClose && (closeOnSelect !== null && closeOnSelect !== void 0 ? closeOnSelect : state.selectionManager.selectionMode !== 'multiple')) onClose();\n        }\n    };\n    let { itemProps: itemProps  } = $lVGRk$useSelectableItem({\n        selectionManager: state.selectionManager,\n        key: key,\n        ref: ref,\n        shouldSelectOnPressUp: true\n    });\n    let { pressProps: pressProps  } = $lVGRk$usePress({\n        onPressStart: onPressStart,\n        onPressUp: onPressUp,\n        isDisabled: isDisabled\n    });\n    let { hoverProps: hoverProps  } = $lVGRk$useHover({\n        isDisabled: isDisabled,\n        onHoverStart () {\n            if (!$lVGRk$isFocusVisible()) {\n                state.selectionManager.setFocused(true);\n                state.selectionManager.setFocusedKey(key);\n            }\n        }\n    });\n    return {\n        menuItemProps: {\n            ...ariaProps,\n            ...$lVGRk$mergeProps(itemProps, pressProps, hoverProps, {\n                onKeyDown: onKeyDown\n            })\n        },\n        labelProps: {\n            id: labelId\n        },\n        descriptionProps: {\n            id: descriptionId\n        },\n        keyboardShortcutProps: {\n            id: keyboardId\n        }\n    };\n}\n\n\nvar $2e6444d9033828ce$exports = {};\n\n$parcel$export($2e6444d9033828ce$exports, \"useMenuSection\", () => $2e6444d9033828ce$export$73f7a44322579622);\n\nfunction $2e6444d9033828ce$export$73f7a44322579622(props) {\n    let { heading: heading , 'aria-label': ariaLabel  } = props;\n    let headingId = $lVGRk$useId();\n    return {\n        itemProps: {\n            role: 'presentation'\n        },\n        headingProps: heading ? {\n            // Techincally, menus cannot contain headings according to ARIA.\n            // We hide the heading from assistive technology, and only use it\n            // as a label for the nested group.\n            id: headingId,\n            'aria-hidden': true\n        } : {\n        },\n        groupProps: {\n            role: 'group',\n            'aria-label': ariaLabel,\n            'aria-labelledby': heading ? headingId : undefined\n        }\n    };\n}\n\n\n\n\nexport {$235cea8b956832d5$export$dc9c12ed27dd1b49 as useMenuTrigger, $9e81e1e13d86f3bd$export$38eaa17faae8f579 as useMenu, $c5d816999d2ff723$export$9d32628fc2aea7da as useMenuItem, $2e6444d9033828ce$export$73f7a44322579622 as useMenuSection};\n//# sourceMappingURL=module.js.map\n","import {useIsSSR} from '@react-aria/ssr';\n\nconst MOBILE_SCREEN_WIDTH = 700;\n\nexport function useIsMobileDevice(): boolean {\n  const isSSR = useIsSSR();\n  if (isSSR || typeof window === 'undefined') {\n    return false;\n  }\n\n  return window.screen.width <= MOBILE_SCREEN_WIDTH;\n}\n","export const popoverStyle =\n  'bg-paper shadow-lg ring-1 ring-black ring-opacity-5 focus:outline-none rounded overflow-hidden';\n","import {HTMLMotionProps} from 'framer-motion';\n\nexport const PopoverAnimation: HTMLMotionProps<'div'> = {\n  initial: {opacity: 0, y: 5},\n  animate: {opacity: 1, y: 0},\n  exit: {opacity: 0, y: 5},\n  transition: {type: 'tween', duration: 0.125},\n};\n","import React, {useContext} from 'react';\nimport clsx from 'clsx';\nimport {ModalProviderProps, OverlayContainer} from '@react-aria/overlays';\nimport {OverlayPositionContext} from './overlay-position-context';\n\ninterface Props extends ModalProviderProps {\n  type: 'modal' | 'tray' | 'popover';\n}\n\nexport function Overlay(props: Props) {\n  const {children, className, type, ...otherProps} = props;\n  const contextValue = useContext(OverlayPositionContext);\n\n  let zIndex: string;\n  if (type === 'modal') {\n    zIndex = 'z-modal';\n  } else if (type === 'popover') {\n    zIndex = 'z-popover';\n  } else {\n    zIndex = 'z-tray';\n  }\n\n  return (\n    <OverlayContainer\n      className={clsx(\n        'isolate absolute top-0 left-0',\n        type !== 'popover' && 'w-full h-full',\n        zIndex,\n        className\n      )}\n      portalContainer={contextValue?.portalContainer?.current!}\n      {...otherProps}\n    >\n      {children}\n    </OverlayContainer>\n  );\n}\n","import React, {CSSProperties, ReactNode} from 'react';\nimport clsx from 'clsx';\nimport {PlacementAxis} from '@react-types/overlays';\nimport {m} from 'framer-motion';\nimport {\n  OverlayProps,\n  useModal,\n  useOverlay,\n  usePreventScroll,\n} from '@react-aria/overlays';\nimport {mergeProps, useObjectRef} from '@react-aria/utils';\nimport {popoverStyle} from './popover-style';\nimport {PopoverAnimation} from './popover-animation';\nimport {Overlay} from '../overlay';\n\nexport interface PopoverProps extends OverlayProps {\n  children: ReactNode;\n  style?: CSSProperties;\n  hideArrow?: boolean;\n  isNonModal?: boolean;\n  preventScroll?: boolean;\n}\n\nexport const Popover = React.forwardRef<HTMLDivElement, PopoverProps>(\n  (props, ref) => {\n    const {\n      children,\n      onClose,\n      isOpen,\n      shouldCloseOnBlur,\n      hideArrow,\n      isKeyboardDismissDisabled,\n      isNonModal,\n      isDismissable = true,\n      preventScroll = true,\n      ...otherProps\n    } = props;\n    usePreventScroll({isDisabled: !preventScroll});\n    return (\n      <Overlay type=\"popover\">\n        <PopoverWrapper\n          {...otherProps}\n          ref={ref}\n          shouldCloseOnBlur={shouldCloseOnBlur}\n          isKeyboardDismissDisabled={isKeyboardDismissDisabled}\n          hideArrow={hideArrow}\n          isNonModal={isNonModal}\n          isDismissable={isDismissable}\n          isOpen={isOpen}\n          onClose={onClose}\n        >\n          {children}\n        </PopoverWrapper>\n      </Overlay>\n    );\n  }\n);\n\nconst PopoverWrapper = React.forwardRef<HTMLDivElement, PopoverProps>(\n  (props, ref) => {\n    const {\n      children,\n      isOpen,\n      onClose,\n      hideArrow,\n      shouldCloseOnBlur,\n      isKeyboardDismissDisabled,\n      isNonModal,\n      isDismissable,\n      ...otherProps\n    } = props;\n\n    const objRef = useObjectRef(ref);\n\n    // Handle interacting outside the dialog and pressing\n    // the Escape key to close the modal.\n    const {overlayProps} = useOverlay(\n      {...props, isDismissable: isDismissable && isOpen},\n      objRef\n    );\n\n    // Hide content outside the modal from screen readers.\n    const {modalProps} = useModal({\n      isDisabled: isNonModal,\n    });\n\n    return (\n      // @ts-ignore\n      <m.div\n        ref={objRef}\n        {...PopoverAnimation}\n        {...mergeProps(otherProps, overlayProps, modalProps)}\n        className={popoverStyle}\n        role=\"presentation\"\n      >\n        {children}\n        {hideArrow ? null : <Arrow popoverPlacement=\"bottom\" />}\n      </m.div>\n    );\n  }\n);\n\ntype ArrowProps = {\n  popoverPlacement: PlacementAxis;\n};\nfunction Arrow({popoverPlacement}: ArrowProps) {\n  const className = clsx(\n    'absolute fill-background',\n    popoverPlacement === 'top' && '-translate-x-1/2 left-1/2',\n    popoverPlacement === 'bottom' && '-translate-x-1/2 left-1/2 rotate-180',\n    popoverPlacement === 'left' && '-translate-y-1/2 top-1/2 rotate-90',\n    popoverPlacement === 'right' && '-translate-y-1/2 top-1/2 -rotate-90'\n  );\n\n  return (\n    <svg\n      className={className}\n      width=\"16\"\n      height=\"8\"\n      viewBox=\"0 0 30 10\"\n      preserveAspectRatio=\"none\"\n    >\n      <polygon points=\"0,0 30,0 15,10\" />\n    </svg>\n  );\n}\n","import React, {HTMLAttributes, useContext} from 'react';\nimport {FocusStrategy} from '@react-types/shared';\n\nexport interface MenuContextValue extends HTMLAttributes<HTMLElement> {\n  onClose?: () => void;\n  closeOnSelect?: boolean;\n  shouldFocusWrap?: boolean;\n  autoFocus?: boolean | FocusStrategy;\n}\n\nexport const MenuContext = React.createContext<MenuContextValue>(null!);\n\nexport function useMenuContext(): MenuContextValue {\n  return useContext(MenuContext);\n}\n","import {m} from 'framer-motion';\n\ninterface UnderlayProps {\n  disableInitialTransition?: boolean;\n  position?: 'fixed' | 'absolute';\n}\nexport function Underlay({disableInitialTransition, position}: UnderlayProps) {\n  return (\n    <m.div\n      className={`w-full h-full bg-black/30 ${\n        position || 'absolute'\n      } top-0 left-0 z-10`}\n      aria-hidden\n      initial={{opacity: disableInitialTransition ? 1 : 0}}\n      animate={{opacity: 1}}\n      exit={{opacity: 0}}\n      transition={{duration: 0.3}}\n    />\n  );\n}\n","import React, {\n  ForwardedRef,\n  forwardRef,\n  HTMLAttributes,\n  ReactElement,\n  ReactNode,\n  useEffect,\n  useRef,\n  useState,\n} from 'react';\nimport {OverlayProps} from '@react-types/overlays';\nimport {m} from 'framer-motion';\nimport {mergeProps, useViewportSize} from '@react-aria/utils';\nimport {useModal, useOverlay, usePreventScroll} from '@react-aria/overlays';\nimport {Underlay} from './modal/underlay';\nimport {Overlay} from './overlay';\n\nexport interface TrayProps extends OverlayProps {\n  children: ReactElement;\n  isOpen?: boolean;\n  onClose?: () => void;\n  shouldCloseOnBlur?: boolean;\n  isFixedHeight?: boolean;\n  isNonModal?: boolean;\n}\n\nexport function Tray(props: TrayProps) {\n  const {children, isOpen, onClose, isFixedHeight, isNonModal, ...otherProps} =\n    props;\n  const domRef = useRef<HTMLDivElement>(null);\n\n  const {overlayProps, underlayProps} = useOverlay(\n    {...props, isDismissable: true},\n    domRef\n  );\n\n  return (\n    <Overlay type=\"tray\" {...otherProps}>\n      <Underlay {...underlayProps} />\n      <TrayWrapper\n        onClose={onClose}\n        ref={domRef}\n        overlayProps={overlayProps}\n        isFixedHeight={isFixedHeight}\n        isNonModal={isNonModal}\n      >\n        {children}\n      </TrayWrapper>\n    </Overlay>\n  );\n}\n\ninterface TrayWrapperProps extends HTMLAttributes<HTMLElement> {\n  children: ReactNode;\n  isOpen?: boolean;\n  onClose?: () => void;\n  isFixedHeight?: boolean;\n  isNonModal?: boolean;\n  overlayProps: HTMLAttributes<HTMLElement>;\n}\n\nconst TrayWrapper = forwardRef(\n  (props: TrayWrapperProps, ref: ForwardedRef<HTMLDivElement>) => {\n    const {\n      children,\n      isOpen,\n      isFixedHeight,\n      isNonModal,\n      overlayProps,\n      ...otherProps\n    } = props;\n    usePreventScroll();\n    const {modalProps} = useModal({\n      isDisabled: isNonModal,\n    });\n\n    // We need to measure the window's height in JS rather than using percentages in CSS\n    // so that contents (e.g. menu) can inherit the max-height properly. Using percentages\n    // does not work properly because there is nothing to base the percentage on.\n    // We cannot use vh units because mobile browsers adjust the window height dynamically\n    // when the address bar/bottom toolbars show and hide on scroll and vh units are fixed.\n    // Also, the visual viewport is smaller than the layout viewport when the virtual keyboard\n    // is up, so use the VisualViewport API to ensure the tray is displayed above the keyboard.\n    const viewport = useViewportSize();\n    const [height, setHeight] = useState(viewport.height);\n    const timeoutRef = useRef<any>();\n\n    useEffect(() => {\n      clearTimeout(timeoutRef.current);\n\n      // When the height is decreasing, and the keyboard is visible\n      // (visual viewport smaller than layout viewport), delay setting\n      // the new max height until after the animation is complete\n      // so that there isn't an empty space under the tray briefly.\n      if (viewport.height < height && viewport.height < window.innerHeight) {\n        timeoutRef.current = setTimeout(() => {\n          setHeight(viewport.height);\n        }, 500);\n      } else {\n        setHeight(viewport.height);\n      }\n    }, [height, viewport.height]);\n\n    const style: React.CSSProperties = {\n      maxHeight: `${viewport.height - 64}px`,\n    };\n    const domProps = mergeProps(otherProps, overlayProps, {style});\n\n    return (\n      <m.div\n        initial={{opacity: 0, y: '100%'}}\n        animate={{opacity: 1, y: 0}}\n        exit={{opacity: 0, y: '100%'}}\n        transition={{type: 'tween', duration: 0.2}}\n        className=\"absolute bottom-0 left-0 w-full z-20\"\n      >\n        <div\n          {...domProps}\n          {...modalProps}\n          className=\"max-w-375 w-full pb-safe-area mx-auto bg-paper rounded shadow-lg\"\n          ref={ref}\n        >\n          {children}\n        </div>\n      </m.div>\n    );\n  }\n);\n","function t(t){return t.split(\"-\")[0]}function e(t){return t.split(\"-\")[1]}function n(e){return[\"top\",\"bottom\"].includes(t(e))?\"x\":\"y\"}function r(t){return\"y\"===t?\"height\":\"width\"}function i(i,o,l){let{reference:a,floating:s}=i;const c=a.x+a.width/2-s.width/2,f=a.y+a.height/2-s.height/2,u=n(o),m=r(u),g=a[m]/2-s[m]/2,d=\"x\"===u;let p;switch(t(o)){case\"top\":p={x:c,y:a.y-s.height};break;case\"bottom\":p={x:c,y:a.y+a.height};break;case\"right\":p={x:a.x+a.width,y:f};break;case\"left\":p={x:a.x-s.width,y:f};break;default:p={x:a.x,y:a.y}}switch(e(o)){case\"start\":p[u]-=g*(l&&d?-1:1);break;case\"end\":p[u]+=g*(l&&d?-1:1)}return p}const o=async(t,e,n)=>{const{placement:r=\"bottom\",strategy:o=\"absolute\",middleware:l=[],platform:a}=n,s=await(null==a.isRTL?void 0:a.isRTL(e));let c=await a.getElementRects({reference:t,floating:e,strategy:o}),{x:f,y:u}=i(c,r,s),m=r,g={};for(let n=0;n<l.length;n++){const{name:d,fn:p}=l[n],{x:h,y:y,data:x,reset:w}=await p({x:f,y:u,initialPlacement:r,placement:m,strategy:o,middlewareData:g,rects:c,platform:a,elements:{reference:t,floating:e}});f=null!=h?h:f,u=null!=y?y:u,g={...g,[d]:{...g[d],...x}},w&&(\"object\"==typeof w&&(w.placement&&(m=w.placement),w.rects&&(c=!0===w.rects?await a.getElementRects({reference:t,floating:e,strategy:o}):w.rects),({x:f,y:u}=i(c,m,s))),n=-1)}return{x:f,y:u,placement:m,strategy:o,middlewareData:g}};function l(t){return\"number\"!=typeof t?function(t){return{top:0,right:0,bottom:0,left:0,...t}}(t):{top:t,right:t,bottom:t,left:t}}function a(t){return{...t,top:t.y,left:t.x,right:t.x+t.width,bottom:t.y+t.height}}async function s(t,e){var n;void 0===e&&(e={});const{x:r,y:i,platform:o,rects:s,elements:c,strategy:f}=t,{boundary:u=\"clippingAncestors\",rootBoundary:m=\"viewport\",elementContext:g=\"floating\",altBoundary:d=!1,padding:p=0}=e,h=l(p),y=c[d?\"floating\"===g?\"reference\":\"floating\":g],x=a(await o.getClippingRect({element:null==(n=await(null==o.isElement?void 0:o.isElement(y)))||n?y:y.contextElement||await(null==o.getDocumentElement?void 0:o.getDocumentElement(c.floating)),boundary:u,rootBoundary:m})),w=a(o.convertOffsetParentRelativeRectToViewportRelativeRect?await o.convertOffsetParentRelativeRectToViewportRelativeRect({rect:\"floating\"===g?{...s.floating,x:r,y:i}:s.reference,offsetParent:await(null==o.getOffsetParent?void 0:o.getOffsetParent(c.floating)),strategy:f}):s[g]);return{top:x.top-w.top+h.top,bottom:w.bottom-x.bottom+h.bottom,left:x.left-w.left+h.left,right:w.right-x.right+h.right}}const c=Math.min,f=Math.max;function u(t,e,n){return f(t,c(e,n))}const m=t=>({name:\"arrow\",options:t,async fn(e){const{element:i,padding:o=0}=null!=t?t:{},{x:a,y:s,placement:c,rects:f,platform:m}=e;if(null==i)return{};const g=l(o),d={x:a,y:s},p=n(c),h=r(p),y=await m.getDimensions(i),x=\"y\"===p?\"top\":\"left\",w=\"y\"===p?\"bottom\":\"right\",v=f.reference[h]+f.reference[p]-d[p]-f.floating[h],b=d[p]-f.reference[p],R=await(null==m.getOffsetParent?void 0:m.getOffsetParent(i)),A=R?\"y\"===p?R.clientHeight||0:R.clientWidth||0:0,P=v/2-b/2,T=g[x],O=A-y[h]-g[w],D=A/2-y[h]/2+P,L=u(T,D,O);return{data:{[p]:L,centerOffset:D-L}}}}),g={left:\"right\",right:\"left\",bottom:\"top\",top:\"bottom\"};function d(t){return t.replace(/left|right|bottom|top/g,(t=>g[t]))}function p(t,i,o){void 0===o&&(o=!1);const l=e(t),a=n(t),s=r(a);let c=\"x\"===a?l===(o?\"end\":\"start\")?\"right\":\"left\":\"start\"===l?\"bottom\":\"top\";return i.reference[s]>i.floating[s]&&(c=d(c)),{main:c,cross:d(c)}}const h={start:\"end\",end:\"start\"};function y(t){return t.replace(/start|end/g,(t=>h[t]))}const x=[\"top\",\"right\",\"bottom\",\"left\"],w=x.reduce(((t,e)=>t.concat(e,e+\"-start\",e+\"-end\")),[]);const v=function(n){return void 0===n&&(n={}),{name:\"autoPlacement\",options:n,async fn(r){var i,o,l,a,c;const{x:f,y:u,rects:m,middlewareData:g,placement:d,platform:h,elements:x}=r,{alignment:v=null,allowedPlacements:b=w,autoAlignment:R=!0,...A}=n,P=function(n,r,i){return(n?[...i.filter((t=>e(t)===n)),...i.filter((t=>e(t)!==n))]:i.filter((e=>t(e)===e))).filter((t=>!n||e(t)===n||!!r&&y(t)!==t))}(v,R,b),T=await s(r,A),O=null!=(i=null==(o=g.autoPlacement)?void 0:o.index)?i:0,D=P[O];if(null==D)return{};const{main:L,cross:k}=p(D,m,await(null==h.isRTL?void 0:h.isRTL(x.floating)));if(d!==D)return{x:f,y:u,reset:{placement:P[0]}};const E=[T[t(D)],T[L],T[k]],C=[...null!=(l=null==(a=g.autoPlacement)?void 0:a.overflows)?l:[],{placement:D,overflows:E}],B=P[O+1];if(B)return{data:{index:O+1,overflows:C},reset:{placement:B}};const H=C.slice().sort(((t,e)=>t.overflows[0]-e.overflows[0])),V=null==(c=H.find((t=>{let{overflows:e}=t;return e.every((t=>t<=0))})))?void 0:c.placement,F=null!=V?V:H[0].placement;return F!==d?{data:{index:O+1,overflows:C},reset:{placement:F}}:{}}}};const b=function(e){return void 0===e&&(e={}),{name:\"flip\",options:e,async fn(n){var r;const{placement:i,middlewareData:o,rects:l,initialPlacement:a,platform:c,elements:f}=n,{mainAxis:u=!0,crossAxis:m=!0,fallbackPlacements:g,fallbackStrategy:h=\"bestFit\",flipAlignment:x=!0,...w}=e,v=t(i),b=g||(v===a||!x?[d(a)]:function(t){const e=d(t);return[y(t),e,y(e)]}(a)),R=[a,...b],A=await s(n,w),P=[];let T=(null==(r=o.flip)?void 0:r.overflows)||[];if(u&&P.push(A[v]),m){const{main:t,cross:e}=p(i,l,await(null==c.isRTL?void 0:c.isRTL(f.floating)));P.push(A[t],A[e])}if(T=[...T,{placement:i,overflows:P}],!P.every((t=>t<=0))){var O,D;const t=(null!=(O=null==(D=o.flip)?void 0:D.index)?O:0)+1,e=R[t];if(e)return{data:{index:t,overflows:T},reset:{placement:e}};let n=\"bottom\";switch(h){case\"bestFit\":{var L;const t=null==(L=T.slice().sort(((t,e)=>t.overflows.filter((t=>t>0)).reduce(((t,e)=>t+e),0)-e.overflows.filter((t=>t>0)).reduce(((t,e)=>t+e),0)))[0])?void 0:L.placement;t&&(n=t);break}case\"initialPlacement\":n=a}if(i!==n)return{reset:{placement:n}}}return{}}}};function R(t,e){return{top:t.top-e.height,right:t.right-e.width,bottom:t.bottom-e.height,left:t.left-e.width}}function A(t){return x.some((e=>t[e]>=0))}const P=function(t){let{strategy:e=\"referenceHidden\",...n}=void 0===t?{}:t;return{name:\"hide\",async fn(t){const{rects:r}=t;switch(e){case\"referenceHidden\":{const e=R(await s(t,{...n,elementContext:\"reference\"}),r.reference);return{data:{referenceHiddenOffsets:e,referenceHidden:A(e)}}}case\"escaped\":{const e=R(await s(t,{...n,altBoundary:!0}),r.floating);return{data:{escapedOffsets:e,escaped:A(e)}}}default:return{}}}}};const T=function(r){return void 0===r&&(r=0),{name:\"offset\",options:r,async fn(i){const{x:o,y:l,placement:a,rects:s,platform:c,elements:f}=i,u=function(r,i,o,l){void 0===l&&(l=!1);const a=t(r),s=e(r),c=\"x\"===n(r),f=[\"left\",\"top\"].includes(a)?-1:1,u=l&&c?-1:1,m=\"function\"==typeof o?o({...i,placement:r}):o,g=\"number\"==typeof m;let{mainAxis:d,crossAxis:p,alignmentAxis:h}=g?{mainAxis:m,crossAxis:0,alignmentAxis:null}:{mainAxis:0,crossAxis:0,alignmentAxis:null,...m};return s&&\"number\"==typeof h&&(p=\"end\"===s?-1*h:h),c?{x:p*u,y:d*f}:{x:d*f,y:p*u}}(a,s,r,await(null==c.isRTL?void 0:c.isRTL(f.floating)));return{x:o+u.x,y:l+u.y,data:u}}}};function O(t){return\"x\"===t?\"y\":\"x\"}const D=function(e){return void 0===e&&(e={}),{name:\"shift\",options:e,async fn(r){const{x:i,y:o,placement:l}=r,{mainAxis:a=!0,crossAxis:c=!1,limiter:f={fn:t=>{let{x:e,y:n}=t;return{x:e,y:n}}},...m}=e,g={x:i,y:o},d=await s(r,m),p=n(t(l)),h=O(p);let y=g[p],x=g[h];if(a){const t=\"y\"===p?\"bottom\":\"right\";y=u(y+d[\"y\"===p?\"top\":\"left\"],y,y-d[t])}if(c){const t=\"y\"===h?\"bottom\":\"right\";x=u(x+d[\"y\"===h?\"top\":\"left\"],x,x-d[t])}const w=f.fn({...r,[p]:y,[h]:x});return{...w,data:{x:w.x-i,y:w.y-o}}}}},L=function(e){return void 0===e&&(e={}),{options:e,fn(r){const{x:i,y:o,placement:l,rects:a,middlewareData:s}=r,{offset:c=0,mainAxis:f=!0,crossAxis:u=!0}=e,m={x:i,y:o},g=n(l),d=O(g);let p=m[g],h=m[d];const y=\"function\"==typeof c?c({...a,placement:l}):c,x=\"number\"==typeof y?{mainAxis:y,crossAxis:0}:{mainAxis:0,crossAxis:0,...y};if(f){const t=\"y\"===g?\"height\":\"width\",e=a.reference[g]-a.floating[t]+x.mainAxis,n=a.reference[g]+a.reference[t]-x.mainAxis;p<e?p=e:p>n&&(p=n)}if(u){var w,v,b,R;const e=\"y\"===g?\"width\":\"height\",n=[\"top\",\"left\"].includes(t(l)),r=a.reference[d]-a.floating[e]+(n&&null!=(w=null==(v=s.offset)?void 0:v[d])?w:0)+(n?0:x.crossAxis),i=a.reference[d]+a.reference[e]+(n?0:null!=(b=null==(R=s.offset)?void 0:R[d])?b:0)-(n?x.crossAxis:0);h<r?h=r:h>i&&(h=i)}return{[g]:p,[d]:h}}}},k=function(n){return void 0===n&&(n={}),{name:\"size\",options:n,async fn(r){const{placement:i,rects:o,platform:l,elements:a}=r,{apply:c,...u}=n,m=await s(r,u),g=t(i),d=e(i);let p,h;\"top\"===g||\"bottom\"===g?(p=g,h=d===(await(null==l.isRTL?void 0:l.isRTL(a.floating))?\"start\":\"end\")?\"left\":\"right\"):(h=g,p=\"end\"===d?\"top\":\"bottom\");const y=f(m.left,0),x=f(m.right,0),w=f(m.top,0),v=f(m.bottom,0),b={height:o.floating.height-([\"left\",\"right\"].includes(i)?2*(0!==w||0!==v?w+v:f(m.top,m.bottom)):m[p]),width:o.floating.width-([\"top\",\"bottom\"].includes(i)?2*(0!==y||0!==x?y+x:f(m.left,m.right)):m[h])},R=await l.getDimensions(a.floating);null==c||c({...b,...o});const A=await l.getDimensions(a.floating);return R.width!==A.width||R.height!==A.height?{reset:{rects:!0}}:{}}}},E=function(e){return void 0===e&&(e={}),{name:\"inline\",options:e,async fn(r){var i;const{placement:o,elements:s,rects:u,platform:m,strategy:g}=r,{padding:d=2,x:p,y:h}=e,y=a(m.convertOffsetParentRelativeRectToViewportRelativeRect?await m.convertOffsetParentRelativeRectToViewportRelativeRect({rect:u.reference,offsetParent:await(null==m.getOffsetParent?void 0:m.getOffsetParent(s.floating)),strategy:g}):u.reference),x=null!=(i=await(null==m.getClientRects?void 0:m.getClientRects(s.reference)))?i:[],w=l(d);const v=await m.getElementRects({reference:{getBoundingClientRect:function(){var e;if(2===x.length&&x[0].left>x[1].right&&null!=p&&null!=h)return null!=(e=x.find((t=>p>t.left-w.left&&p<t.right+w.right&&h>t.top-w.top&&h<t.bottom+w.bottom)))?e:y;if(x.length>=2){if(\"x\"===n(o)){const e=x[0],n=x[x.length-1],r=\"top\"===t(o),i=e.top,l=n.bottom,a=r?e.left:n.left,s=r?e.right:n.right;return{top:i,bottom:l,left:a,right:s,width:s-a,height:l-i,x:a,y:i}}const e=\"left\"===t(o),r=f(...x.map((t=>t.right))),i=c(...x.map((t=>t.left))),l=x.filter((t=>e?t.left===i:t.right===r)),a=l[0].top,s=l[l.length-1].bottom;return{top:a,bottom:s,left:i,right:r,width:r-i,height:s-a,x:i,y:a}}return y}},floating:s.floating,strategy:g});return u.reference.x!==v.reference.x||u.reference.y!==v.reference.y||u.reference.width!==v.reference.width||u.reference.height!==v.reference.height?{reset:{rects:v}}:{}}}};export{m as arrow,v as autoPlacement,o as computePosition,s as detectOverflow,b as flip,P as hide,E as inline,L as limitShift,T as offset,a as rectToClientRect,D as shift,k as size};\n","import{rectToClientRect as t,computePosition as e}from\"@floating-ui/core\";export{arrow,autoPlacement,detectOverflow,flip,hide,inline,limitShift,offset,shift,size}from\"@floating-ui/core\";function n(t){return\"[object Window]\"===(null==t?void 0:t.toString())}function o(t){if(null==t)return window;if(!n(t)){const e=t.ownerDocument;return e&&e.defaultView||window}return t}function i(t){return o(t).getComputedStyle(t)}function r(t){return n(t)?\"\":t?(t.nodeName||\"\").toLowerCase():\"\"}function l(t){return t instanceof o(t).HTMLElement}function c(t){return t instanceof o(t).Element}function f(t){return t instanceof o(t).ShadowRoot||t instanceof ShadowRoot}function s(t){const{overflow:e,overflowX:n,overflowY:o}=i(t);return/auto|scroll|overlay|hidden/.test(e+o+n)}function u(t){return[\"table\",\"td\",\"th\"].includes(r(t))}function h(t){const e=navigator.userAgent.toLowerCase().includes(\"firefox\"),n=i(t);return\"none\"!==n.transform||\"none\"!==n.perspective||\"paint\"===n.contain||[\"transform\",\"perspective\"].includes(n.willChange)||e&&\"filter\"===n.willChange||e&&!!n.filter&&\"none\"!==n.filter}const d=Math.min,a=Math.max,g=Math.round;function p(t,e){void 0===e&&(e=!1);const n=t.getBoundingClientRect();let o=1,i=1;return e&&l(t)&&(o=t.offsetWidth>0&&g(n.width)/t.offsetWidth||1,i=t.offsetHeight>0&&g(n.height)/t.offsetHeight||1),{width:n.width/o,height:n.height/i,top:n.top/i,right:n.right/o,bottom:n.bottom/i,left:n.left/o,x:n.left/o,y:n.top/i}}function m(t){return(e=t,(e instanceof o(e).Node?t.ownerDocument:t.document)||window.document).documentElement;var e}function w(t){return n(t)?{scrollLeft:t.pageXOffset,scrollTop:t.pageYOffset}:{scrollLeft:t.scrollLeft,scrollTop:t.scrollTop}}function y(t){return p(m(t)).left+w(t).scrollLeft}function v(t,e,n){const o=l(e),i=m(e),c=p(t,o&&function(t){const e=p(t);return g(e.width)!==t.offsetWidth||g(e.height)!==t.offsetHeight}(e));let f={scrollLeft:0,scrollTop:0};const u={x:0,y:0};if(o||!o&&\"fixed\"!==n)if((\"body\"!==r(e)||s(i))&&(f=w(e)),l(e)){const t=p(e,!0);u.x=t.x+e.clientLeft,u.y=t.y+e.clientTop}else i&&(u.x=y(i));return{x:c.left+f.scrollLeft-u.x,y:c.top+f.scrollTop-u.y,width:c.width,height:c.height}}function x(t){return\"html\"===r(t)?t:t.assignedSlot||t.parentNode||(f(t)?t.host:null)||m(t)}function b(t){return l(t)&&\"fixed\"!==getComputedStyle(t).position?t.offsetParent:null}function L(t){const e=o(t);let n=b(t);for(;n&&u(n)&&\"static\"===getComputedStyle(n).position;)n=b(n);return n&&(\"html\"===r(n)||\"body\"===r(n)&&\"static\"===getComputedStyle(n).position&&!h(n))?e:n||function(t){let e=x(t);for(f(e)&&(e=e.host);l(e)&&![\"html\",\"body\"].includes(r(e));){if(h(e))return e;e=e.parentNode}return null}(t)||e}function R(t){if(l(t))return{width:t.offsetWidth,height:t.offsetHeight};const e=p(t);return{width:e.width,height:e.height}}function T(t){const e=x(t);return[\"html\",\"body\",\"#document\"].includes(r(e))?t.ownerDocument.body:l(e)&&s(e)?e:T(e)}function W(t,e){var n;void 0===e&&(e=[]);const i=T(t),r=i===(null==(n=t.ownerDocument)?void 0:n.body),l=o(i),c=r?[l].concat(l.visualViewport||[],s(i)?i:[]):i,f=e.concat(c);return r?f:f.concat(W(x(c)))}function C(e,n){return\"viewport\"===n?t(function(t){const e=o(t),n=m(t),i=e.visualViewport;let r=n.clientWidth,l=n.clientHeight,c=0,f=0;return i&&(r=i.width,l=i.height,Math.abs(e.innerWidth/i.scale-i.width)<.01&&(c=i.offsetLeft,f=i.offsetTop)),{width:r,height:l,x:c,y:f}}(e)):c(n)?function(t){const e=p(t),n=e.top+t.clientTop,o=e.left+t.clientLeft;return{top:n,left:o,x:o,y:n,right:o+t.clientWidth,bottom:n+t.clientHeight,width:t.clientWidth,height:t.clientHeight}}(n):t(function(t){var e;const n=m(t),o=w(t),r=null==(e=t.ownerDocument)?void 0:e.body,l=a(n.scrollWidth,n.clientWidth,r?r.scrollWidth:0,r?r.clientWidth:0),c=a(n.scrollHeight,n.clientHeight,r?r.scrollHeight:0,r?r.clientHeight:0);let f=-o.scrollLeft+y(t);const s=-o.scrollTop;return\"rtl\"===i(r||n).direction&&(f+=a(n.clientWidth,r?r.clientWidth:0)-l),{width:l,height:c,x:f,y:s}}(m(e)))}function E(t){const e=W(t),n=[\"absolute\",\"fixed\"].includes(i(t).position)&&l(t)?L(t):t;return c(n)?e.filter((t=>c(t)&&function(t,e){const n=null==e.getRootNode?void 0:e.getRootNode();if(t.contains(e))return!0;if(n&&f(n)){let n=e;do{if(n&&t===n)return!0;n=n.parentNode||n.host}while(n)}return!1}(t,n)&&\"body\"!==r(t))):[]}const H={getClippingRect:function(t){let{element:e,boundary:n,rootBoundary:o}=t;const i=[...\"clippingAncestors\"===n?E(e):[].concat(n),o],r=i[0],l=i.reduce(((t,n)=>{const o=C(e,n);return t.top=a(o.top,t.top),t.right=d(o.right,t.right),t.bottom=d(o.bottom,t.bottom),t.left=a(o.left,t.left),t}),C(e,r));return{width:l.right-l.left,height:l.bottom-l.top,x:l.left,y:l.top}},convertOffsetParentRelativeRectToViewportRelativeRect:function(t){let{rect:e,offsetParent:n,strategy:o}=t;const i=l(n),c=m(n);if(n===c)return e;let f={scrollLeft:0,scrollTop:0};const u={x:0,y:0};if((i||!i&&\"fixed\"!==o)&&((\"body\"!==r(n)||s(c))&&(f=w(n)),l(n))){const t=p(n,!0);u.x=t.x+n.clientLeft,u.y=t.y+n.clientTop}return{...e,x:e.x-f.scrollLeft+u.x,y:e.y-f.scrollTop+u.y}},isElement:c,getDimensions:R,getOffsetParent:L,getDocumentElement:m,getElementRects:t=>{let{reference:e,floating:n,strategy:o}=t;return{reference:v(e,L(n),o),floating:{...R(n),x:0,y:0}}},getClientRects:t=>Array.from(t.getClientRects()),isRTL:t=>\"rtl\"===i(t).direction};function S(t,e,n,o){void 0===o&&(o={});const{ancestorScroll:i=!0,ancestorResize:r=!0,elementResize:l=!0,animationFrame:f=!1}=o;let s=!1;const u=i&&!f,h=r&&!f,d=l&&!f,a=u||h?[...c(t)?W(t):[],...W(e)]:[];a.forEach((t=>{u&&t.addEventListener(\"scroll\",n,{passive:!0}),h&&t.addEventListener(\"resize\",n)}));let g,m=null;d&&(m=new ResizeObserver(n),c(t)&&m.observe(t),m.observe(e));let w=f?p(t):null;return f&&function e(){if(s)return;const o=p(t);!w||o.x===w.x&&o.y===w.y&&o.width===w.width&&o.height===w.height||n();w=o,g=requestAnimationFrame(e)}(),()=>{var t;s=!0,a.forEach((t=>{u&&t.removeEventListener(\"scroll\",n),h&&t.removeEventListener(\"resize\",n)})),null==(t=m)||t.disconnect(),m=null,f&&cancelAnimationFrame(g)}}const D=(t,n,o)=>e(t,n,{platform:H,...o});export{S as autoUpdate,D as computePosition,W as getOverflowAncestors};\n","import { computePosition, arrow as arrow$1 } from '@floating-ui/dom';\nexport { autoPlacement, autoUpdate, detectOverflow, flip, getOverflowAncestors, hide, inline, limitShift, offset, shift, size } from '@floating-ui/dom';\nimport { useLayoutEffect, useEffect, useRef, useState, useCallback, useMemo } from 'react';\n\nvar index = typeof document !== 'undefined' ? useLayoutEffect : useEffect;\n\n// Fork of `fast-deep-equal` that only does the comparisons we need and compares\n// functions\nfunction deepEqual(a, b) {\n  if (a === b) {\n    return true;\n  }\n\n  if (typeof a !== typeof b) {\n    return false;\n  }\n\n  if (typeof a === 'function' && a.toString() === b.toString()) {\n    return true;\n  }\n\n  let length, i, keys;\n\n  if (a && b && typeof a == 'object') {\n    if (Array.isArray(a)) {\n      length = a.length;\n      if (length != b.length) return false;\n\n      for (i = length; i-- !== 0;) {\n        if (!deepEqual(a[i], b[i])) {\n          return false;\n        }\n      }\n\n      return true;\n    }\n\n    keys = Object.keys(a);\n    length = keys.length;\n\n    if (length !== Object.keys(b).length) {\n      return false;\n    }\n\n    for (i = length; i-- !== 0;) {\n      if (!Object.prototype.hasOwnProperty.call(b, keys[i])) {\n        return false;\n      }\n    }\n\n    for (i = length; i-- !== 0;) {\n      const key = keys[i];\n\n      if (key === '_owner' && a.$$typeof) {\n        continue;\n      }\n\n      if (!deepEqual(a[key], b[key])) {\n        return false;\n      }\n    }\n\n    return true;\n  }\n\n  return a !== a && b !== b;\n}\n\nfunction useFloating(_temp) {\n  let {\n    middleware,\n    placement = 'bottom',\n    strategy = 'absolute'\n  } = _temp === void 0 ? {} : _temp;\n  const reference = useRef(null);\n  const floating = useRef(null);\n  const [data, setData] = useState({\n    // Setting these to `null` will allow the consumer to determine if\n    // `computePosition()` has run yet\n    x: null,\n    y: null,\n    strategy,\n    placement,\n    middlewareData: {}\n  });\n  const [latestMiddleware, setLatestMiddleware] = useState(middleware);\n\n  if (!deepEqual(latestMiddleware == null ? void 0 : latestMiddleware.map(_ref => {\n    let {\n      options\n    } = _ref;\n    return options;\n  }), middleware == null ? void 0 : middleware.map(_ref2 => {\n    let {\n      options\n    } = _ref2;\n    return options;\n  }))) {\n    setLatestMiddleware(middleware);\n  }\n\n  const isMountedRef = useRef(true);\n  index(() => {\n    isMountedRef.current = true;\n    return () => {\n      isMountedRef.current = false;\n    };\n  }, []);\n  const update = useCallback(() => {\n    if (!reference.current || !floating.current) {\n      return;\n    }\n\n    computePosition(reference.current, floating.current, {\n      middleware: latestMiddleware,\n      placement,\n      strategy\n    }).then(data => {\n      if (isMountedRef.current) {\n        setData(data);\n      }\n    });\n  }, [latestMiddleware, placement, strategy]);\n  index(update, [update]);\n  const setReference = useCallback(node => {\n    reference.current = node;\n    update();\n  }, [update]);\n  const setFloating = useCallback(node => {\n    floating.current = node;\n    update();\n  }, [update]);\n  const refs = useMemo(() => ({\n    reference,\n    floating\n  }), []);\n  return useMemo(() => ({ ...data,\n    update,\n    refs,\n    reference: setReference,\n    floating: setFloating\n  }), [data, update, refs, setReference, setFloating]);\n}\nconst arrow = options => {\n  const {\n    element,\n    padding\n  } = options;\n\n  function isRef(value) {\n    return Object.prototype.hasOwnProperty.call(value, 'current');\n  }\n\n  return {\n    name: 'arrow',\n    options,\n\n    fn(args) {\n      if (isRef(element)) {\n        if (element.current != null) {\n          return arrow$1({\n            element: element.current,\n            padding\n          }).fn(args);\n        }\n\n        return {};\n      } else if (element) {\n        return arrow$1({\n          element,\n          padding\n        }).fn(args);\n      }\n\n      return {};\n    }\n\n  };\n};\n\nexport { arrow, useFloating };\n","import {\n  flip,\n  offset as offsetMiddleware,\n  shift,\n  useFloating,\n} from \"@floating-ui/react-dom\";\nimport { MutableRefObject } from \"react\";\n\ninterface Props {\n  shouldFlip?: boolean;\n  containerPadding?: number;\n  offset?: number;\n  crossOffset?: number;\n}\nexport function useOverlayPosition({\n  shouldFlip = true,\n  offset = 5,\n  containerPadding = 16,\n}: Props) {\n  const { x, y, reference, floating, strategy, refs } = useFloating({\n    placement: \"bottom\",\n    middleware: [\n      offsetMiddleware(offset),\n      flip({\n        padding: containerPadding,\n        crossAxis: shouldFlip,\n        mainAxis: shouldFlip,\n      }),\n      shift({ padding: containerPadding }),\n    ],\n  });\n  return {\n    triggerRef: reference,\n    triggerObjRef: refs.reference as MutableRefObject<HTMLElement | null>,\n    overlayRef: floating,\n    overlayObjRef: refs.floating,\n    objRefs: refs,\n    positionStyle: {\n      position: strategy,\n      top: y ?? \"\",\n      left: x ?? \"\",\n    },\n  };\n}\n","import React, {ReactElement} from 'react';\nimport {MenuTriggerProps} from '@react-types/menu';\nimport {FocusScope} from '@react-aria/focus';\nimport {AnimatePresence} from 'framer-motion';\nimport {useMenuTriggerState} from '@react-stately/menu';\nimport {useMenuTrigger} from '@react-aria/menu';\nimport {DismissButton} from '@react-aria/overlays';\nimport {useIsMobileDevice} from '../../../utils/hooks/is-mobile-device';\nimport {Popover} from '../../overlays/popover/popover';\nimport {MenuContext, MenuContextValue} from './menu-context';\nimport {Tray} from '../../overlays/tray';\nimport {useOverlayPosition} from '../../overlays/use-overlay-position';\n\ninterface Props extends MenuTriggerProps {\n  children: ReactElement[];\n}\nexport function MenuTrigger(props: Props) {\n  const {children, closeOnSelect, shouldFlip = true} = props;\n\n  const [menuTrigger, menu] = React.Children.toArray(children);\n  const state = useMenuTriggerState(props);\n\n  const {triggerRef, overlayRef, positionStyle, triggerObjRef} =\n    useOverlayPosition({shouldFlip});\n\n  const {menuTriggerProps, menuProps} = useMenuTrigger(\n    {},\n    state,\n    triggerObjRef\n  );\n\n  const isMobile = useIsMobileDevice();\n\n  const menuContext: MenuContextValue = {\n    ...menuProps,\n    onClose: state.close,\n    closeOnSelect,\n    autoFocus: state.focusStrategy || true,\n  };\n\n  const contents = (\n    <FocusScope restoreFocus contain={isMobile}>\n      <DismissButton onDismiss={state.close} />\n      {menu}\n      <DismissButton onDismiss={state.close} />\n    </FocusScope>\n  );\n\n  // On small screen devices, the menu is rendered in a tray, otherwise a popover.\n  let overlay: ReactElement;\n  if (isMobile) {\n    overlay = (\n      <Tray isOpen={state.isOpen} onClose={state.close}>\n        {contents}\n      </Tray>\n    );\n  } else {\n    overlay = (\n      <Popover\n        isOpen={state.isOpen}\n        style={positionStyle}\n        ref={overlayRef}\n        hideArrow\n        onClose={state.close}\n        shouldCloseOnBlur\n      >\n        {contents}\n      </Popover>\n    );\n  }\n\n  return (\n    <>\n      {menuTrigger &&\n        React.cloneElement(menuTrigger as ReactElement, {\n          ...menuTriggerProps,\n          ref: triggerRef,\n          isPressed: state.isOpen,\n        })}\n      <AnimatePresence>\n        {state.isOpen && (\n          <MenuContext.Provider value={menuContext}>\n            {overlay}\n          </MenuContext.Provider>\n        )}\n      </AnimatePresence>\n    </>\n  );\n}\n","import {useRef as $f0goU$useRef, useState as $f0goU$useState, useMemo as $f0goU$useMemo} from \"react\";\nimport {useControlledState as $f0goU$useControlledState} from \"@react-stately/utils\";\n\nfunction $parcel$export(e, n, v, s) {\n  Object.defineProperty(e, n, {get: v, set: s, enumerable: true, configurable: true});\n}\nvar $ec35bdc00c823be9$exports = {};\n\n$parcel$export($ec35bdc00c823be9$exports, \"useMultipleSelectionState\", () => $ec35bdc00c823be9$export$253fe78d46329472);\n\nclass $84eb7a4250035b1f$export$52baac22726c72bf extends Set {\n    constructor(keys, anchorKey, currentKey){\n        super(keys);\n        if (keys instanceof $84eb7a4250035b1f$export$52baac22726c72bf) {\n            this.anchorKey = anchorKey || keys.anchorKey;\n            this.currentKey = currentKey || keys.currentKey;\n        } else {\n            this.anchorKey = anchorKey;\n            this.currentKey = currentKey;\n        }\n    }\n}\n\n\n\nfunction $ec35bdc00c823be9$var$equalSets(setA, setB) {\n    if (setA.size !== setB.size) return false;\n    for (let item of setA){\n        if (!setB.has(item)) return false;\n    }\n    return true;\n}\nfunction $ec35bdc00c823be9$export$253fe78d46329472(props) {\n    let { selectionMode: selectionMode = 'none' , disallowEmptySelection: disallowEmptySelection , allowDuplicateSelectionEvents: allowDuplicateSelectionEvents  } = props;\n    // We want synchronous updates to `isFocused` and `focusedKey` after their setters are called.\n    // But we also need to trigger a react re-render. So, we have both a ref (sync) and state (async).\n    let isFocusedRef = $f0goU$useRef(false);\n    let [, setFocused] = $f0goU$useState(false);\n    let focusedKeyRef = $f0goU$useRef(null);\n    let childFocusStrategyRef = $f0goU$useRef(null);\n    let [, setFocusedKey] = $f0goU$useState(null);\n    let selectedKeysProp = $f0goU$useMemo(()=>$ec35bdc00c823be9$var$convertSelection(props.selectedKeys)\n    , [\n        props.selectedKeys\n    ]);\n    let defaultSelectedKeys = $f0goU$useMemo(()=>$ec35bdc00c823be9$var$convertSelection(props.defaultSelectedKeys, new $84eb7a4250035b1f$export$52baac22726c72bf())\n    , [\n        props.defaultSelectedKeys\n    ]);\n    let [selectedKeys, setSelectedKeys] = $f0goU$useControlledState(selectedKeysProp, defaultSelectedKeys, props.onSelectionChange);\n    let disabledKeysProp = $f0goU$useMemo(()=>props.disabledKeys ? new Set(props.disabledKeys) : new Set()\n    , [\n        props.disabledKeys\n    ]);\n    let [selectionBehavior, setSelectionBehavior] = $f0goU$useState(props.selectionBehavior || 'toggle');\n    // If the selectionBehavior prop is set to replace, but the current state is toggle (e.g. due to long press\n    // to enter selection mode on touch), and the selection becomes empty, reset the selection behavior.\n    if (props.selectionBehavior === 'replace' && selectionBehavior === 'toggle' && typeof selectedKeys === 'object' && selectedKeys.size === 0) setSelectionBehavior('replace');\n    return {\n        selectionMode: selectionMode,\n        disallowEmptySelection: disallowEmptySelection,\n        selectionBehavior: selectionBehavior,\n        setSelectionBehavior: setSelectionBehavior,\n        get isFocused () {\n            return isFocusedRef.current;\n        },\n        setFocused (f) {\n            isFocusedRef.current = f;\n            setFocused(f);\n        },\n        get focusedKey () {\n            return focusedKeyRef.current;\n        },\n        get childFocusStrategy () {\n            return childFocusStrategyRef.current;\n        },\n        setFocusedKey (k, childFocusStrategy = 'first') {\n            focusedKeyRef.current = k;\n            childFocusStrategyRef.current = childFocusStrategy;\n            setFocusedKey(k);\n        },\n        selectedKeys: selectedKeys,\n        setSelectedKeys (keys) {\n            if (allowDuplicateSelectionEvents || !$ec35bdc00c823be9$var$equalSets(keys, selectedKeys)) setSelectedKeys(keys);\n        },\n        disabledKeys: disabledKeysProp\n    };\n}\nfunction $ec35bdc00c823be9$var$convertSelection(selection, defaultValue) {\n    if (!selection) return defaultValue;\n    return selection === 'all' ? 'all' : new $84eb7a4250035b1f$export$52baac22726c72bf(selection);\n}\n\n\nvar $1c74ece56c82b9c4$exports = {};\n\n$parcel$export($1c74ece56c82b9c4$exports, \"SelectionManager\", () => $1c74ece56c82b9c4$export$6c8a5aaad13c9852);\n\nclass $1c74ece56c82b9c4$export$6c8a5aaad13c9852 {\n    /**\n   * The type of selection that is allowed in the collection.\n   */ get selectionMode() {\n        return this.state.selectionMode;\n    }\n    /**\n   * Whether the collection allows empty selection.\n   */ get disallowEmptySelection() {\n        return this.state.disallowEmptySelection;\n    }\n    /**\n   * The selection behavior for the collection.\n   */ get selectionBehavior() {\n        return this.state.selectionBehavior;\n    }\n    /**\n   * Sets the selection behavior for the collection.\n   */ setSelectionBehavior(selectionBehavior) {\n        this.state.setSelectionBehavior(selectionBehavior);\n    }\n    /**\n   * Whether the collection is currently focused.\n   */ get isFocused() {\n        return this.state.isFocused;\n    }\n    /**\n   * Sets whether the collection is focused.\n   */ setFocused(isFocused) {\n        this.state.setFocused(isFocused);\n    }\n    /**\n   * The current focused key in the collection.\n   */ get focusedKey() {\n        return this.state.focusedKey;\n    }\n    /** Whether the first or last child of the focused key should receive focus. */ get childFocusStrategy() {\n        return this.state.childFocusStrategy;\n    }\n    /**\n   * Sets the focused key.\n   */ setFocusedKey(key, childFocusStrategy) {\n        this.state.setFocusedKey(key, childFocusStrategy);\n    }\n    /**\n   * The currently selected keys in the collection.\n   */ get selectedKeys() {\n        return this.state.selectedKeys === 'all' ? new Set(this.getSelectAllKeys()) : this.state.selectedKeys;\n    }\n    /**\n   * The raw selection value for the collection.\n   * Either 'all' for select all, or a set of keys.\n   */ get rawSelection() {\n        return this.state.selectedKeys;\n    }\n    /**\n   * Returns whether a key is selected.\n   */ isSelected(key) {\n        if (this.state.selectionMode === 'none') return false;\n        key = this.getKey(key);\n        return this.state.selectedKeys === 'all' ? !this.state.disabledKeys.has(key) : this.state.selectedKeys.has(key);\n    }\n    /**\n   * Whether the selection is empty.\n   */ get isEmpty() {\n        return this.state.selectedKeys !== 'all' && this.state.selectedKeys.size === 0;\n    }\n    /**\n   * Whether all items in the collection are selected.\n   */ get isSelectAll() {\n        if (this.isEmpty) return false;\n        if (this.state.selectedKeys === 'all') return true;\n        if (this._isSelectAll != null) return this._isSelectAll;\n        let allKeys = this.getSelectAllKeys();\n        let selectedKeys = this.state.selectedKeys;\n        this._isSelectAll = allKeys.every((k)=>selectedKeys.has(k)\n        );\n        return this._isSelectAll;\n    }\n    get firstSelectedKey() {\n        let first = null;\n        for (let key of this.state.selectedKeys){\n            let item = this.collection.getItem(key);\n            if (!first || (item === null || item === void 0 ? void 0 : item.index) < first.index) first = item;\n        }\n        return first === null || first === void 0 ? void 0 : first.key;\n    }\n    get lastSelectedKey() {\n        let last = null;\n        for (let key of this.state.selectedKeys){\n            let item = this.collection.getItem(key);\n            if (!last || (item === null || item === void 0 ? void 0 : item.index) > last.index) last = item;\n        }\n        return last === null || last === void 0 ? void 0 : last.key;\n    }\n    /**\n   * Extends the selection to the given key.\n   */ extendSelection(toKey) {\n        if (this.selectionMode === 'none') return;\n        if (this.selectionMode === 'single') {\n            this.replaceSelection(toKey);\n            return;\n        }\n        toKey = this.getKey(toKey);\n        let selection;\n        // Only select the one key if coming from a select all.\n        if (this.state.selectedKeys === 'all') selection = new $84eb7a4250035b1f$export$52baac22726c72bf([\n            toKey\n        ], toKey, toKey);\n        else {\n            let selectedKeys = this.state.selectedKeys;\n            let anchorKey = selectedKeys.anchorKey || toKey;\n            selection = new $84eb7a4250035b1f$export$52baac22726c72bf(selectedKeys, anchorKey, toKey);\n            for (let key of this.getKeyRange(anchorKey, selectedKeys.currentKey || toKey))selection.delete(key);\n            for (let key1 of this.getKeyRange(toKey, anchorKey))if (!this.state.disabledKeys.has(key1)) selection.add(key1);\n        }\n        this.state.setSelectedKeys(selection);\n    }\n    getKeyRange(from, to) {\n        let fromItem = this.collection.getItem(from);\n        let toItem = this.collection.getItem(to);\n        if (fromItem && toItem) {\n            if (fromItem.index <= toItem.index) return this.getKeyRangeInternal(from, to);\n            return this.getKeyRangeInternal(to, from);\n        }\n        return [];\n    }\n    getKeyRangeInternal(from, to) {\n        let keys = [];\n        let key = from;\n        while(key){\n            let item = this.collection.getItem(key);\n            if (item && item.type === 'item' || item.type === 'cell' && this.allowsCellSelection) keys.push(key);\n            if (key === to) return keys;\n            key = this.collection.getKeyAfter(key);\n        }\n        return [];\n    }\n    getKey(key) {\n        let item = this.collection.getItem(key);\n        if (!item) // ¯\\_(ツ)_/¯\n        return key;\n        // If cell selection is allowed, just return the key.\n        if (item.type === 'cell' && this.allowsCellSelection) return key;\n        // Find a parent item to select\n        while(item.type !== 'item' && item.parentKey != null)item = this.collection.getItem(item.parentKey);\n        if (!item || item.type !== 'item') return null;\n        return item.key;\n    }\n    /**\n   * Toggles whether the given key is selected.\n   */ toggleSelection(key) {\n        if (this.selectionMode === 'none') return;\n        if (this.selectionMode === 'single' && !this.isSelected(key)) {\n            this.replaceSelection(key);\n            return;\n        }\n        key = this.getKey(key);\n        if (key == null) return;\n        let keys = new $84eb7a4250035b1f$export$52baac22726c72bf(this.state.selectedKeys === 'all' ? this.getSelectAllKeys() : this.state.selectedKeys);\n        if (keys.has(key)) keys.delete(key);\n        else {\n            keys.add(key);\n            keys.anchorKey = key;\n            keys.currentKey = key;\n        }\n        if (this.disallowEmptySelection && keys.size === 0) return;\n        this.state.setSelectedKeys(keys);\n    }\n    /**\n   * Replaces the selection with only the given key.\n   */ replaceSelection(key) {\n        if (this.selectionMode === 'none') return;\n        key = this.getKey(key);\n        if (key == null) return;\n        this.state.setSelectedKeys(new $84eb7a4250035b1f$export$52baac22726c72bf([\n            key\n        ], key, key));\n    }\n    /**\n   * Replaces the selection with the given keys.\n   */ setSelectedKeys(keys) {\n        if (this.selectionMode === 'none') return;\n        let selection = new $84eb7a4250035b1f$export$52baac22726c72bf();\n        for (let key of keys){\n            key = this.getKey(key);\n            if (key != null) {\n                selection.add(key);\n                if (this.selectionMode === 'single') break;\n            }\n        }\n        this.state.setSelectedKeys(selection);\n    }\n    getSelectAllKeys() {\n        let keys = [];\n        let addKeys = (key)=>{\n            while(key){\n                if (!this.state.disabledKeys.has(key)) {\n                    let item = this.collection.getItem(key);\n                    if (item.type === 'item') keys.push(key);\n                    // Add child keys. If cell selection is allowed, then include item children too.\n                    if (item.hasChildNodes && (this.allowsCellSelection || item.type !== 'item')) addKeys([\n                        ...item.childNodes\n                    ][0].key);\n                }\n                key = this.collection.getKeyAfter(key);\n            }\n        };\n        addKeys(this.collection.getFirstKey());\n        return keys;\n    }\n    /**\n   * Selects all items in the collection.\n   */ selectAll() {\n        if (this.selectionMode === 'multiple') this.state.setSelectedKeys('all');\n    }\n    /**\n   * Removes all keys from the selection.\n   */ clearSelection() {\n        if (!this.disallowEmptySelection && (this.state.selectedKeys === 'all' || this.state.selectedKeys.size > 0)) this.state.setSelectedKeys(new $84eb7a4250035b1f$export$52baac22726c72bf());\n    }\n    /**\n   * Toggles between select all and an empty selection.\n   */ toggleSelectAll() {\n        if (this.isSelectAll) this.clearSelection();\n        else this.selectAll();\n    }\n    select(key, e) {\n        if (this.selectionMode === 'none') return;\n        if (this.selectionMode === 'single') {\n            if (this.isSelected(key) && !this.disallowEmptySelection) this.toggleSelection(key);\n            else this.replaceSelection(key);\n        } else if (this.selectionBehavior === 'toggle' || e && (e.pointerType === 'touch' || e.pointerType === 'virtual')) // if touch or virtual (VO) then we just want to toggle, otherwise it's impossible to multi select because they don't have modifier keys\n        this.toggleSelection(key);\n        else this.replaceSelection(key);\n    }\n    /**\n   * Returns whether the current selection is equal to the given selection.\n   */ isSelectionEqual(selection) {\n        if (selection === this.state.selectedKeys) return true;\n        // Check if the set of keys match.\n        let selectedKeys = this.selectedKeys;\n        if (selection.size !== selectedKeys.size) return false;\n        for (let key of selection){\n            if (!selectedKeys.has(key)) return false;\n        }\n        for (let key2 of selectedKeys){\n            if (!selection.has(key2)) return false;\n        }\n        return true;\n    }\n    canSelectItem(key) {\n        if (this.state.selectionMode === 'none' || this.state.disabledKeys.has(key)) return false;\n        let item = this.collection.getItem(key);\n        if (!item || item.type === 'cell' && !this.allowsCellSelection) return false;\n        return true;\n    }\n    constructor(collection, state, options){\n        this.collection = collection;\n        this.state = state;\n        var ref;\n        this.allowsCellSelection = (ref = options === null || options === void 0 ? void 0 : options.allowsCellSelection) !== null && ref !== void 0 ? ref : false;\n        this._isSelectAll = null;\n    }\n}\n\n\nvar $8702775bc7287a50$exports = {};\n\n\n\n\nexport {$ec35bdc00c823be9$export$253fe78d46329472 as useMultipleSelectionState, $1c74ece56c82b9c4$export$6c8a5aaad13c9852 as SelectionManager};\n//# sourceMappingURL=module.js.map\n","import {useMemo as $9TXm6$useMemo, useEffect as $9TXm6$useEffect} from \"react\";\nimport {useMultipleSelectionState as $9TXm6$useMultipleSelectionState, SelectionManager as $9TXm6$SelectionManager} from \"@react-stately/selection\";\nimport {useCollection as $9TXm6$useCollection} from \"@react-stately/collections\";\nimport {useControlledState as $9TXm6$useControlledState} from \"@react-stately/utils\";\n\nfunction $parcel$export(e, n, v, s) {\n  Object.defineProperty(e, n, {get: v, set: s, enumerable: true, configurable: true});\n}\nvar $36d99f0640511db5$exports = {};\n\n$parcel$export($36d99f0640511db5$exports, \"useTreeState\", () => $36d99f0640511db5$export$728d6ba534403756);\n\n\nvar tmp = Symbol.iterator;\nclass $c8161626733397a0$export$863faf230ee2118a {\n    *[tmp]() {\n        yield* this.iterable;\n    }\n    get size() {\n        return this.keyMap.size;\n    }\n    getKeys() {\n        return this.keyMap.keys();\n    }\n    getKeyBefore(key) {\n        let node = this.keyMap.get(key);\n        return node ? node.prevKey : null;\n    }\n    getKeyAfter(key) {\n        let node = this.keyMap.get(key);\n        return node ? node.nextKey : null;\n    }\n    getFirstKey() {\n        return this.firstKey;\n    }\n    getLastKey() {\n        return this.lastKey;\n    }\n    getItem(key) {\n        return this.keyMap.get(key);\n    }\n    at(idx) {\n        const keys = [\n            ...this.getKeys()\n        ];\n        return this.getItem(keys[idx]);\n    }\n    constructor(nodes, { expandedKeys: expandedKeys  } = {\n    }){\n        this.keyMap = new Map();\n        this.iterable = nodes;\n        expandedKeys = expandedKeys || new Set();\n        let visit = (node)=>{\n            this.keyMap.set(node.key, node);\n            if (node.childNodes && (node.type === 'section' || expandedKeys.has(node.key))) for (let child of node.childNodes)visit(child);\n        };\n        for (let node2 of nodes)visit(node2);\n        let last;\n        let index = 0;\n        for (let [key, node1] of this.keyMap){\n            if (last) {\n                last.nextKey = key;\n                node1.prevKey = last.key;\n            } else {\n                this.firstKey = key;\n                node1.prevKey = undefined;\n            }\n            if (node1.type === 'item') node1.index = index++;\n            last = node1;\n            // Set nextKey as undefined since this might be the last node\n            // If it isn't the last node, last.nextKey will properly set at start of new loop\n            last.nextKey = undefined;\n        }\n        this.lastKey = last === null || last === void 0 ? void 0 : last.key;\n    }\n}\n\n\n\n\nfunction $36d99f0640511db5$export$728d6ba534403756(props) {\n    let [expandedKeys, setExpandedKeys] = $9TXm6$useControlledState(props.expandedKeys ? new Set(props.expandedKeys) : undefined, props.defaultExpandedKeys ? new Set(props.defaultExpandedKeys) : new Set(), props.onExpandedChange);\n    let selectionState = $9TXm6$useMultipleSelectionState(props);\n    let disabledKeys = $9TXm6$useMemo(()=>props.disabledKeys ? new Set(props.disabledKeys) : new Set()\n    , [\n        props.disabledKeys\n    ]);\n    let tree = $9TXm6$useCollection(props, (nodes)=>new $c8161626733397a0$export$863faf230ee2118a(nodes, {\n            expandedKeys: expandedKeys\n        })\n    , null, [\n        expandedKeys\n    ]);\n    // Reset focused key if that item is deleted from the collection.\n    $9TXm6$useEffect(()=>{\n        if (selectionState.focusedKey != null && !tree.getItem(selectionState.focusedKey)) selectionState.setFocusedKey(null);\n    }, [\n        tree,\n        selectionState.focusedKey\n    ]);\n    let onToggle = (key)=>{\n        setExpandedKeys($36d99f0640511db5$var$toggleKey(expandedKeys, key));\n    };\n    return {\n        collection: tree,\n        expandedKeys: expandedKeys,\n        disabledKeys: disabledKeys,\n        toggleKey: onToggle,\n        selectionManager: new $9TXm6$SelectionManager(tree, selectionState)\n    };\n}\nfunction $36d99f0640511db5$var$toggleKey(set, key) {\n    let res = new Set(set);\n    if (res.has(key)) res.delete(key);\n    else res.add(key);\n    return res;\n}\n\n\n\n\nexport {$36d99f0640511db5$export$728d6ba534403756 as useTreeState};\n//# sourceMappingURL=module.js.map\n","import clsx from 'clsx';\n\nexport function listboxWrapperStyle(className?: string): string {\n  return clsx(\n    'p-4 overflow-y-auto text-base sm:text-sm outline-none max-h-inherit',\n    className\n  );\n}\n\ninterface Props {\n  isFocused: boolean;\n  isSelected: boolean;\n  isDisabled: boolean;\n  isHovered: boolean;\n}\nexport function listboxItemStyle({\n  isFocused,\n  isSelected,\n  isDisabled,\n  isHovered,\n}: Props): string {\n  let action: string = '';\n  if (isDisabled) {\n    action = 'text-disabled pointer-events-none';\n  } else if (isSelected) {\n    if (isHovered || isFocused) {\n      action = 'bg-primary/focus';\n    } else {\n      action = 'bg-primary/selected';\n    }\n  } else if (isFocused) {\n    action = 'bg-focus';\n  } else if (isHovered) {\n    action = 'bg-hover';\n  }\n\n  return clsx(\n    'px-16 py-8 text-sm truncate select-none outline-none rounded cursor-pointer flex items-center gap-16',\n    action\n  );\n}\n\nexport const listboxItemIconStyle = 'icon-md text-muted';\n","import {Node} from '@react-types/shared';\nimport React, {Key, ReactElement, ReactNode, useRef} from 'react';\nimport {useMenuItem} from '@react-aria/menu';\nimport {useFocusRing} from '@react-aria/focus';\nimport {useHover} from '@react-aria/interactions';\nimport {TreeState} from '@react-stately/tree';\nimport {mergeProps} from '@react-aria/utils';\nimport {\n  listboxItemIconStyle,\n  listboxItemStyle,\n} from '../../inputs/listbox/listbox-style';\nimport {useMenuContext} from './menu-context';\n\ninterface MenuItemProps<T> {\n  item: Node<T>;\n  state: TreeState<T>;\n  onAction?: (key: Key) => void;\n}\nexport function MenuItem<T>(props: MenuItemProps<T>) {\n  const {item, state, onAction} = props;\n  const {onClose, closeOnSelect} = useMenuContext();\n\n  let startIcon: ReactElement | null;\n  let endIcon: ReactElement | null;\n  let label: ReactNode;\n  const {rendered, key} = item;\n  if (Array.isArray(rendered)) {\n    [startIcon = null, label, endIcon = null] = rendered;\n  } else {\n    label = rendered;\n  }\n\n  const isSelected = state.selectionManager.isSelected(key);\n  const isDisabled = state.disabledKeys.has(key);\n\n  const ref = useRef<HTMLLIElement>(null);\n  // eslint-disable-next-line @typescript-eslint/no-unused-vars\n  const {menuItemProps, labelProps, descriptionProps, keyboardShortcutProps} =\n    useMenuItem(\n      {\n        isSelected,\n        isDisabled,\n        'aria-label': item['aria-label'],\n        key,\n        onClose,\n        closeOnSelect,\n        onAction,\n      },\n      state,\n      ref\n    );\n  const {hoverProps, isHovered} = useHover({isDisabled});\n  const {focusProps, isFocusVisible} = useFocusRing();\n  const className = listboxItemStyle({\n    isFocused: isFocusVisible,\n    isSelected,\n    isDisabled,\n    isHovered,\n  });\n\n  return (\n    <li\n      className={className}\n      {...mergeProps(menuItemProps, hoverProps, focusProps)}\n      ref={ref}\n    >\n      {startIcon &&\n        React.cloneElement(startIcon, {className: listboxItemIconStyle})}\n      <div {...labelProps}>{label}</div>\n      {endIcon}\n    </li>\n  );\n}\n","import {\n  AriaLabelingProps,\n  CollectionBase,\n  DOMProps,\n  FocusStrategy,\n  MultipleSelection,\n} from '@react-types/shared';\nimport React, {Key, useContext, useRef} from 'react';\nimport {mergeProps} from '@react-aria/utils';\nimport {useTreeState} from '@react-stately/tree';\nimport {useMenu} from '@react-aria/menu';\nimport {MenuContext} from './menu-context';\nimport {MenuItem} from './menu-item';\nimport {listboxWrapperStyle} from '../../inputs/listbox/listbox-style';\n\nexport interface MenuProps<T> extends CollectionBase<T>, MultipleSelection {\n  /** Where the focus should be set. */\n  autoFocus?: boolean | FocusStrategy;\n  /** Whether keyboard navigation is circular. */\n  shouldFocusWrap?: boolean;\n  /** Handler that is called when an item is selected. */\n  onAction?: (key: Key) => void;\n}\n\ninterface Props<T> extends MenuProps<T>, DOMProps, AriaLabelingProps {}\nexport function Menu<T extends object>(props: Props<T>) {\n  const className = listboxWrapperStyle();\n  const contextProps = useContext(MenuContext);\n  const menuRef = useRef<HTMLUListElement>(null);\n  const mergedProps = {\n    ...mergeProps(contextProps, props),\n  };\n  const state = useTreeState(mergedProps);\n  const {menuProps} = useMenu(mergedProps, state, menuRef);\n\n  return (\n    <ul ref={menuRef} className={className} {...menuProps}>\n      {[...state.collection].map(item => {\n        let menuItem = (\n          <MenuItem\n            key={item.key}\n            item={item}\n            state={state}\n            onAction={mergedProps.onAction}\n          />\n        );\n\n        if (item.wrapper) {\n          menuItem = item.wrapper(menuItem);\n        }\n\n        return menuItem;\n      })}\n    </ul>\n  );\n}\n","import {Item} from '@react-stately/collections';\nimport React, {ReactElement} from 'react';\nimport type {MenubarItemProps} from './toolbar-item';\nimport {MenuTrigger} from '../../../common/ui/navigation/menu/menu-trigger';\nimport {Menu} from '../../../common/ui/navigation/menu/menu';\n\ninterface DropdownButtonProps extends MenubarItemProps {\n  button: ReactElement;\n}\n\nexport function DropdownButton({item, button}: DropdownButtonProps) {\n  const menuItems = item.menuItems!;\n  return (\n    <MenuTrigger>\n      {button}\n      <Menu\n        onAction={label => {\n          const menuItem = menuItems.find(i => i.label === label);\n          menuItem?.action();\n        }}\n        items={menuItems}\n      >\n        {menuItem => <Item key={menuItem.label}>{menuItem.label}</Item>}\n      </Menu>\n    </MenuTrigger>\n  );\n}\n","import React, {forwardRef, ReactElement} from 'react';\nimport clsx from 'clsx';\nimport {ButtonSize, getButtonSizeStyle, getIconSizeStyle} from './button-size';\nimport {ButtonBase, ButtonBaseProps} from './button-base';\n\ninterface Props extends ButtonBaseProps {\n  children: ReactElement;\n  padding?: string;\n  size?: ButtonSize;\n  equalWidth?: boolean;\n}\n\nexport const IconButton = forwardRef<HTMLButtonElement, Props>(\n  (\n    {\n      children,\n      size,\n      variant = 'text',\n      radius = 'rounded-full',\n      className,\n      padding,\n      equalWidth = true,\n      ...other\n    },\n    ref\n  ) => {\n    const mergedClassName = clsx(\n      getButtonSizeStyle(size, {padding, equalWidth}),\n      className\n    );\n    const iconClass = clsx(children.props.className, getIconSizeStyle(size));\n\n    return (\n      <ButtonBase\n        {...other}\n        ref={ref}\n        radius={radius}\n        variant={variant}\n        className={mergedClassName}\n      >\n        {React.cloneElement(children, {className: iconClass})}\n      </ButtonBase>\n    );\n  }\n);\n","import React, {ComponentType, ReactElement, SVGProps} from 'react';\nimport clsx from 'clsx';\nimport {createSvgIconFromTree, IconTree} from '../common/icons/create-svg-icon';\n\ninterface MixedIconProps {\n  icon: ReactElement<{className: string}> | IconTree[] | string | ComponentType;\n  className?: string;\n}\nfunction _MixedIcon({icon, className}: MixedIconProps) {\n  let iconEl: ReactElement;\n  // Regular JSX element\n  if (React.isValidElement(icon)) {\n    iconEl = React.cloneElement(icon, {\n      className: 'svg-iconEl',\n    });\n\n    // url for external icon\n  } else if (typeof icon === 'string') {\n    iconEl = <img className=\"w-font h-font\" src={icon} alt=\"\" />;\n\n    // Icon tree object\n  } else if (Array.isArray(icon)) {\n    iconEl = React.createElement(createSvgIconFromTree(icon));\n\n    // Component type\n  } else {\n    iconEl = React.createElement<SVGProps<SVGSVGElement>>(icon);\n  }\n  return <span className={clsx(className, 'leading-none')}>{iconEl}</span>;\n}\n\nexport const MixedIcon = React.memo(_MixedIcon);\n","import React, {forwardRef} from 'react';\nimport {FormattedMessage} from 'react-intl';\nimport {Button, ButtonProps} from '../../../common/ui/buttons/button';\nimport type {MenubarItemProps} from './toolbar-item';\nimport {DropdownButton} from './dropdown-button';\nimport {IconButton} from '../../../common/ui/buttons/icon-button';\nimport {state} from '../../../state/utils';\nimport {MixedIcon} from '../../mixed-icon';\n\nexport function ToolbarButton({item}: MenubarItemProps) {\n  const button = item.label ? (\n    <ButtonWithLabel item={item} />\n  ) : (\n    <IconOnlyButton item={item} />\n  );\n\n  if (item.menuItems) {\n    return <DropdownButton item={item} button={button} />;\n  }\n  return React.cloneElement<ButtonProps>(button, {\n    onPress: () => {\n      item.action?.(state().editor);\n    },\n  });\n}\n\nconst IconOnlyButton = forwardRef<HTMLButtonElement, MenubarItemProps>(\n  ({item, ...other}, ref) => {\n    return (\n      <IconButton ref={ref} radius=\"rounded-full\" size=\"sm\" {...other}>\n        <MixedIcon icon={item.icon!} />\n      </IconButton>\n    );\n  }\n);\n\nconst ButtonWithLabel = forwardRef<HTMLButtonElement, MenubarItemProps>(\n  ({item, ...other}, ref) => (\n    <Button\n      ref={ref}\n      radius=\"rounded-full\"\n      size=\"xs\"\n      color=\"primary\"\n      startIcon={<MixedIcon icon={item.icon!} />}\n      {...other}\n    >\n      <Label item={item} />\n    </Button>\n  )\n);\n\nfunction Label({item}: MenubarItemProps) {\n  if (!item.label) return null;\n  if (typeof item.label === 'string') {\n    return <>{item.label}</>;\n  }\n  return <FormattedMessage {...item.label} />;\n}\n","import React from 'react';\nimport clsx from 'clsx';\nimport {ButtonColor, Variant} from './get-shared-button-style';\nimport {ButtonProps} from './button';\nimport {ButtonSize} from './button-size';\n\ninterface Props {\n  children: React.ReactNode[];\n  color?: ButtonColor;\n  variant?: Variant;\n  size?: ButtonSize;\n  radius?:\n    | 'rounded-none'\n    | 'rounded'\n    | 'rounded-sm'\n    | 'rounded-md'\n    | 'rounded-lg'\n    | 'rounded-full';\n  className?: string;\n  value?: any;\n  onChange?: (newValue: any) => void;\n  multiple?: boolean;\n}\n\nexport function ButtonGroup({\n  children,\n  color,\n  variant,\n  radius,\n  size,\n  className,\n  value,\n  onChange,\n  multiple,\n}: Props) {\n  const isActive = (childValue: any): boolean => {\n    // assume that button group is not used as a toggle group, if there is no value given\n    if (value === undefined) return false;\n    if (multiple) {\n      return (value as any[]).includes(childValue);\n    }\n    return childValue === value;\n  };\n\n  const toggleMultipleValue = (childValue: any) => {\n    const newValue = [...value];\n    const childIndex = value.indexOf(childValue);\n    if (childIndex > -1) {\n      newValue.splice(childIndex, 1);\n    } else {\n      newValue.push(childValue);\n    }\n    return newValue;\n  };\n\n  const buttons = React.Children.map(children, (button, i) => {\n    if (React.isValidElement(button)) {\n      const active = isActive(button.props.value);\n      const adjustedColor = active ? 'primary' : color;\n      return React.cloneElement<ButtonProps>(button, {\n        color: active ? 'primary' : color,\n        variant,\n        size,\n        radius: null,\n        ...button.props,\n        onPress: e => {\n          if (button.props.onPress) {\n            button.props.onPress(e);\n          }\n          if (!onChange) return;\n          if (multiple) {\n            onChange?.(toggleMultipleValue(button.props.value));\n          } else {\n            onChange?.(button.props.value);\n          }\n        },\n        className: clsx(\n          button.props.className,\n          // borders are hidden via negative margin, make sure both are visible for active item\n          active ? 'z-20' : 'z-10',\n          getStyle(i, children, radius, adjustedColor)\n        ),\n      });\n    }\n  });\n  return (\n    <div className={clsx(radius, 'inline-flex isolate', className)}>\n      {buttons}\n    </div>\n  );\n}\n\nfunction getStyle(\n  i: number,\n  children: Props['children'],\n  radius: Props['radius'],\n  color?: ButtonColor\n): string {\n  // first\n  if (i === 0) {\n    return clsx(\n      radius,\n      'rounded-tr-none rounded-br-none',\n      !color && 'border-r-transparent disabled:border-r-transparent'\n    );\n  }\n  // last\n  if (i === children.length - 1) {\n    return clsx(radius, 'rounded-tl-none rounded-bl-none -ml-1');\n  }\n  return clsx(\n    'rounded-none -ml-1',\n    !color && 'border-r-transparent disabled:border-r-transparent'\n  );\n}\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const UndoIcon = createSvgIcon(\n  <path d=\"M12.5 8c-2.65 0-5.05.99-6.9 2.6L2 7v9h9l-3.62-3.62c1.39-1.16 3.16-1.88 5.12-1.88 3.54 0 6.55 2.31 7.6 5.5l2.37-.78C21.08 11.03 17.15 8 12.5 8z\" />\n, 'UndoOutlined');\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const RedoIcon = createSvgIcon(\n  <path d=\"M18.4 10.6C16.55 8.99 14.15 8 11.5 8c-4.65 0-8.58 3.03-9.96 7.22L3.9 16c1.05-3.19 4.05-5.5 7.6-5.5 1.95 0 3.73.72 5.12 1.88L13 16h9V7l-3.6 3.6z\" />\n, 'RedoOutlined');\n","import React from 'react';\nimport {useStore} from '../../../state/store';\nimport {ButtonGroup} from '../../../common/ui/buttons/button-group';\nimport {IconButton} from '../../../common/ui/buttons/icon-button';\nimport {tools} from '../../../state/utils';\nimport {UndoIcon} from '../../../common/icons/material/Undo';\nimport {RedoIcon} from '../../../common/icons/material/Redo';\n\nexport function UndoRedoBtns() {\n  const canUndo = useStore(s => s.history.canUndo);\n  const canRedo = useStore(s => s.history.canRedo);\n\n  return (\n    <ButtonGroup variant=\"outline\">\n      <IconButton\n        equalWidth={false}\n        size=\"xs\"\n        padding=\"pl-12 pr-10\"\n        radius=\"rounded-full\"\n        isDisabled={!canUndo}\n        onPress={() => {\n          tools().history.undo();\n        }}\n      >\n        <UndoIcon />\n      </IconButton>\n      <IconButton\n        equalWidth={false}\n        padding=\"pl-10 pr-12\"\n        size=\"xs\"\n        radius=\"rounded-full\"\n        isDisabled={!canRedo}\n        onPress={() => {\n          tools().history.redo();\n        }}\n      >\n        <RedoIcon />\n      </IconButton>\n    </ButtonGroup>\n  );\n}\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const RemoveIcon = createSvgIcon(\n  <path d=\"M19 13H5v-2h14v2z\" />\n, 'RemoveOutlined');\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const AddIcon = createSvgIcon(\n  <path d=\"M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z\" />\n, 'AddOutlined');\n","import React from 'react';\nimport {useStore} from '../../../state/store';\nimport {IconButton} from '../../../common/ui/buttons/icon-button';\nimport {RemoveIcon} from '../../../common/icons/material/Remove';\nimport {AddIcon} from '../../../common/icons/material/Add';\nimport {tools} from '../../../state/utils';\n\nexport function ZoomWidget() {\n  const zoom = useStore(s => s.zoom) || 1;\n  const allowUserZoom =\n    useStore(s => s.config.tools?.zoom?.allowUserZoom) ?? true;\n\n  if (!allowUserZoom) {\n    return null;\n  }\n\n  return (\n    <div className=\"flex items-center select-none\">\n      <IconButton\n        size=\"sm\"\n        isDisabled={!tools().zoom?.canZoomOut()}\n        onPress={() => {\n          tools().zoom.zoomOut(tools().zoom.step);\n        }}\n      >\n        <RemoveIcon />\n      </IconButton>\n      <div className=\"w-[4ch] text-sm text-center\">\n        {Math.round(zoom * 100)}%\n      </div>\n      <IconButton\n        size=\"sm\"\n        isDisabled={!tools().zoom?.canZoomIn()}\n        onPress={() => {\n          tools().zoom.zoomIn(tools().zoom.step);\n        }}\n      >\n        <AddIcon />\n      </IconButton>\n    </div>\n  );\n}\n","import React from 'react';\nimport {ToolbarItemConfig} from '../../../config/default-config';\nimport {ToolbarButton} from './toolbar-button';\nimport {UndoRedoBtns} from './undo-redo-btns';\nimport {ZoomWidget} from './zoom-widget';\nimport {assetUrl} from '../../../utils/asset-url';\n\nexport interface MenubarItemProps {\n  item: ToolbarItemConfig;\n}\n\nexport function ToolbarItem({item}: MenubarItemProps) {\n  switch (item.type) {\n    case 'undoWidget':\n      return <UndoRedoBtns />;\n    case 'zoomWidget':\n      return <ZoomWidget />;\n    case 'button':\n      return <ToolbarButton item={item} />;\n    case 'image':\n      return (\n        <img className=\"h-30 object-cover\" src={assetUrl(item.src)} alt=\"\" />\n      );\n    default:\n      return null;\n  }\n}\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const CloseIcon = createSvgIcon(\n  <path d=\"M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12 19 6.41z\" />\n, 'CloseOutlined');\n","import {state} from '../state/utils';\nimport {useStore} from '../state/store';\nimport {EditorMode} from '../config/editor-mode';\n\nexport function useEditorMode() {\n  let isModal = useStore(s => s.config.ui?.mode === EditorMode.OVERLAY);\n  const {width} = useStore(s => s.stageSize);\n  const isMobile = width <= 700;\n  if (isMobile && state().config.ui?.forceOverlayModeOnMobile) {\n    isModal = true;\n  }\n  return {isModal, isMobile};\n}\n","import {m} from 'framer-motion';\nimport React from 'react';\nimport {useStore} from '../../state/store';\nimport {toolbarAnimation, toolbarStyle} from './toolbar-style';\nimport {ToolbarItemConfig} from '../../config/default-config';\nimport {ToolbarItem} from './toolbar-item/toolbar-item';\nimport {IconButton} from '../../common/ui/buttons/icon-button';\nimport {state} from '../../state/utils';\nimport {CloseIcon} from '../../common/icons/material/Close';\nimport {useEditorMode} from '../editor-mode';\n\nexport function MainToolbar() {\n  const {isModal, isMobile} = useEditorMode();\n  const allowEditorClose = useStore(s => s.config.ui?.allowEditorClose) ?? true;\n  const items = useStore(s => s.config.ui?.menubar?.items) || [];\n  const leftItems: ToolbarItemConfig[] = [];\n  const centerItems: ToolbarItemConfig[] = [];\n  const rightItems: ToolbarItemConfig[] = [];\n\n  items\n    .filter(\n      item => (!isMobile && !item.mobileOnly) || (isMobile && !item.desktopOnly)\n    )\n    .forEach(item => {\n      if (item.align === 'left') {\n        leftItems.push(item);\n      } else if (item.align === 'right') {\n        rightItems.push(item);\n      } else {\n        centerItems.push(item);\n      }\n    });\n\n  const closeButton = isModal && isMobile && allowEditorClose && (\n    <IconButton\n      size=\"sm\"\n      className=\"ml-10\"\n      onPress={() => {\n        state().editor.close();\n      }}\n    >\n      <CloseIcon />\n    </IconButton>\n  );\n\n  return (\n    <m.div className={toolbarStyle} {...toolbarAnimation}>\n      <div className=\"mr-auto\">\n        {leftItems.map((item, i) => (\n          // eslint-disable-next-line react/no-array-index-key\n          <ToolbarItem item={item} key={i} />\n        ))}\n      </div>\n      <div className=\"flex items-center gap-10\">\n        {centerItems.map((item, i) => (\n          // eslint-disable-next-line react/no-array-index-key\n          <ToolbarItem item={item} key={i} />\n        ))}\n      </div>\n      <div className=\"ml-auto flex items-center gap-8\">\n        {rightItems.map((item, i) => (\n          // eslint-disable-next-line react/no-array-index-key\n          <ToolbarItem item={item} key={i} />\n        ))}\n      </div>\n      {closeButton}\n    </m.div>\n  );\n}\n","import {InteractableEvent} from '../interactable-event';\nimport {InteractableAction} from './interactable-action';\nimport {InteractableRect} from '../interactable-rect';\nimport {calcNewSizeFromAspectRatio} from '../utils/calc-new-size-from-aspect-ratio';\n\nexport type CornerHandlePosition =\n  | 'top-left'\n  | 'top-right'\n  | 'bottom-left'\n  | 'bottom-right'\n  | null;\n\nexport class ResizeAction implements InteractableAction {\n  callbackName = 'onResize' as const;\n  private resizeDir: CornerHandlePosition = null;\n\n  matches(e: PointerEvent) {\n    const target = e.target as HTMLElement;\n    if (target.dataset.position) {\n      this.resizeDir = target.dataset.position as CornerHandlePosition;\n      return true;\n    }\n    return false;\n  }\n\n  execute(e: InteractableEvent, rect: InteractableRect) {\n    if (rect) {\n      return this.resizeUsingRect(e, rect);\n    }\n    return this.resizeUsingEvent(e);\n  }\n\n  onPointerUp() {\n    this.resizeDir = null;\n  }\n\n  private resizeUsingEvent(e: InteractableEvent): InteractableRect {\n    const prevRect = {...e.currentRect};\n    const newRect = {...e.currentRect};\n    const ratio = e.aspectRatio;\n\n    if (this.resizeDir === 'top-right') {\n      newRect.width = Math.floor(newRect.width + e.deltaX);\n      if (ratio) {\n        newRect.height = Math.floor(newRect.width / ratio);\n      } else {\n        newRect.height = Math.floor(newRect.height - e.deltaY);\n      }\n      newRect.top = Math.floor(\n        newRect.top + (prevRect.height - newRect.height)\n      );\n    } else if (this.resizeDir === 'bottom-right') {\n      newRect.width = Math.floor(newRect.width + e.deltaX);\n      if (ratio) {\n        newRect.height = Math.floor(newRect.width / ratio);\n      } else {\n        newRect.height = Math.floor(newRect.height + e.deltaY);\n      }\n    } else if (this.resizeDir === 'top-left') {\n      newRect.width = Math.floor(newRect.width - e.deltaX);\n      if (ratio) {\n        newRect.height = Math.floor(newRect.width / ratio);\n      } else {\n        newRect.height = Math.floor(newRect.height - e.deltaY);\n      }\n      newRect.left = Math.floor(\n        newRect.left + (prevRect.width - newRect.width)\n      );\n      newRect.top = Math.floor(\n        newRect.top + (prevRect.height - newRect.height)\n      );\n    } else if (this.resizeDir === 'bottom-left') {\n      newRect.width = Math.floor(newRect.width - e.deltaX);\n      if (ratio) {\n        newRect.height = Math.floor(newRect.width / ratio);\n      } else {\n        newRect.height = Math.floor(newRect.height + e.deltaY);\n      }\n      newRect.left = Math.floor(\n        newRect.left + (prevRect.width - newRect.width)\n      );\n    }\n    return newRect;\n  }\n\n  resizeUsingRect(\n    e: InteractableEvent,\n    newRect: InteractableRect\n  ): InteractableRect {\n    const currentRect = {\n      ...e.currentRect,\n      ...newRect,\n    };\n    if (e.aspectRatio) {\n      const size = calcNewSizeFromAspectRatio(\n        e.aspectRatio,\n        currentRect.width,\n        currentRect.height\n      );\n      currentRect.width = size.width;\n      currentRect.height = size.height;\n    }\n    return currentRect;\n  }\n}\n","import {useControlledState as $k3hqg$useControlledState, clamp as $k3hqg$clamp, snapValueToStep as $k3hqg$snapValueToStep} from \"@react-stately/utils\";\nimport {NumberFormatter as $k3hqg$NumberFormatter, NumberParser as $k3hqg$NumberParser} from \"@internationalized/number\";\nimport {useState as $k3hqg$useState, useMemo as $k3hqg$useMemo, useCallback as $k3hqg$useCallback, useEffect as $k3hqg$useEffect, useRef as $k3hqg$useRef} from \"react\";\n\nfunction $parcel$export(e, n, v, s) {\n  Object.defineProperty(e, n, {get: v, set: s, enumerable: true, configurable: true});\n}\nvar $9f327308a7d514e5$exports = {};\n\n$parcel$export($9f327308a7d514e5$exports, \"useNumberFieldState\", () => $9f327308a7d514e5$export$7f629e9dc1ecf37c);\n\n\n\nfunction $9f327308a7d514e5$export$7f629e9dc1ecf37c(props) {\n    let { minValue: minValue , maxValue: maxValue , step: step , formatOptions: formatOptions , value: value1 , defaultValue: defaultValue , onChange: onChange , locale: locale , isDisabled: isDisabled , isReadOnly: isReadOnly  } = props;\n    let [numberValue, setNumberValue] = $k3hqg$useControlledState(value1, isNaN(defaultValue) ? NaN : defaultValue, onChange);\n    let [inputValue, setInputValue] = $k3hqg$useState(()=>isNaN(numberValue) ? '' : new $k3hqg$NumberFormatter(locale, formatOptions).format(numberValue)\n    );\n    let numberParser = $k3hqg$useMemo(()=>new $k3hqg$NumberParser(locale, formatOptions)\n    , [\n        locale,\n        formatOptions\n    ]);\n    let numberingSystem = $k3hqg$useMemo(()=>numberParser.getNumberingSystem(inputValue)\n    , [\n        numberParser,\n        inputValue\n    ]);\n    let formatter = $k3hqg$useMemo(()=>new $k3hqg$NumberFormatter(locale, {\n            ...formatOptions,\n            numberingSystem: numberingSystem\n        })\n    , [\n        locale,\n        formatOptions,\n        numberingSystem\n    ]);\n    let intlOptions = $k3hqg$useMemo(()=>formatter.resolvedOptions()\n    , [\n        formatter\n    ]);\n    let format = $k3hqg$useCallback((value)=>isNaN(value) ? '' : formatter.format(value)\n    , [\n        formatter\n    ]);\n    let clampStep = !isNaN(step) ? step : 1;\n    if (intlOptions.style === 'percent' && isNaN(step)) clampStep = 0.01;\n    // Update the input value when the number value or format options change. This is done\n    // in a useEffect so that the controlled behavior is correct and we only update the\n    // textfield after prop changes.\n    $k3hqg$useEffect(()=>{\n        setInputValue(format(numberValue));\n    }, [\n        numberValue,\n        locale,\n        formatOptions\n    ]);\n    // Store last parsed value in a ref so it can be used by increment/decrement below\n    let parsedValue = $k3hqg$useMemo(()=>numberParser.parse(inputValue)\n    , [\n        numberParser,\n        inputValue\n    ]);\n    let parsed = $k3hqg$useRef(0);\n    parsed.current = parsedValue;\n    let commit = ()=>{\n        // Set to empty state if input value is empty\n        if (!inputValue.length) {\n            setNumberValue(NaN);\n            setInputValue(value1 === undefined ? '' : format(numberValue));\n            return;\n        }\n        // if it failed to parse, then reset input to formatted version of current number\n        if (isNaN(parsed.current)) {\n            setInputValue(format(numberValue));\n            return;\n        }\n        // Clamp to min and max, round to the nearest step, and round to specified number of digits\n        let clampedValue;\n        if (isNaN(step)) clampedValue = $k3hqg$clamp(parsed.current, minValue, maxValue);\n        else clampedValue = $k3hqg$snapValueToStep(parsed.current, minValue, maxValue, step);\n        clampedValue = numberParser.parse(format(clampedValue));\n        setNumberValue(clampedValue);\n        // in a controlled state, the numberValue won't change, so we won't go back to our old input without help\n        setInputValue(format(value1 === undefined ? clampedValue : numberValue));\n    };\n    let safeNextStep = (operation, minMax)=>{\n        let prev = parsed.current;\n        if (isNaN(prev)) {\n            // if the input is empty, start from the min/max value when incrementing/decrementing,\n            // or zero if there is no min/max value defined.\n            let newValue = isNaN(minMax) ? 0 : minMax;\n            return $k3hqg$snapValueToStep(newValue, minValue, maxValue, clampStep);\n        } else {\n            // otherwise, first snap the current value to the nearest step. if it moves in the direction\n            // we're going, use that value, otherwise add the step and snap that value.\n            let newValue = $k3hqg$snapValueToStep(prev, minValue, maxValue, clampStep);\n            if (operation === '+' && newValue > prev || operation === '-' && newValue < prev) return newValue;\n            return $k3hqg$snapValueToStep($9f327308a7d514e5$var$handleDecimalOperation(operation, prev, clampStep), minValue, maxValue, clampStep);\n        }\n    };\n    let increment = ()=>{\n        let newValue = safeNextStep('+', minValue);\n        // if we've arrived at the same value that was previously in the state, the\n        // input value should be updated to match\n        // ex type 4, press increment, highlight the number in the input, type 4 again, press increment\n        // you'd be at 5, then incrementing to 5 again, so no re-render would happen and 4 would be left in the input\n        if (newValue === numberValue) setInputValue(format(newValue));\n        setNumberValue(newValue);\n    };\n    let decrement = ()=>{\n        let newValue = safeNextStep('-', maxValue);\n        if (newValue === numberValue) setInputValue(format(newValue));\n        setNumberValue(newValue);\n    };\n    let incrementToMax = ()=>{\n        if (maxValue != null) setNumberValue($k3hqg$snapValueToStep(maxValue, minValue, maxValue, clampStep));\n    };\n    let decrementToMin = ()=>{\n        if (minValue != null) setNumberValue(minValue);\n    };\n    let canIncrement = $k3hqg$useMemo(()=>!isDisabled && !isReadOnly && (isNaN(parsedValue) || isNaN(maxValue) || $k3hqg$snapValueToStep(parsedValue, minValue, maxValue, clampStep) > parsedValue || $9f327308a7d514e5$var$handleDecimalOperation('+', parsedValue, clampStep) <= maxValue)\n    , [\n        isDisabled,\n        isReadOnly,\n        minValue,\n        maxValue,\n        clampStep,\n        parsedValue\n    ]);\n    let canDecrement = $k3hqg$useMemo(()=>!isDisabled && !isReadOnly && (isNaN(parsedValue) || isNaN(minValue) || $k3hqg$snapValueToStep(parsedValue, minValue, maxValue, clampStep) < parsedValue || $9f327308a7d514e5$var$handleDecimalOperation('-', parsedValue, clampStep) >= minValue)\n    , [\n        isDisabled,\n        isReadOnly,\n        minValue,\n        maxValue,\n        clampStep,\n        parsedValue\n    ]);\n    let validate = (value)=>numberParser.isValidPartialNumber(value, minValue, maxValue)\n    ;\n    return {\n        validate: validate,\n        increment: increment,\n        incrementToMax: incrementToMax,\n        decrement: decrement,\n        decrementToMin: decrementToMin,\n        canIncrement: canIncrement,\n        canDecrement: canDecrement,\n        minValue: minValue,\n        maxValue: maxValue,\n        numberValue: parsedValue,\n        setInputValue: setInputValue,\n        inputValue: inputValue,\n        commit: commit\n    };\n}\nfunction $9f327308a7d514e5$var$handleDecimalOperation(operator, value1, value2) {\n    let result = operator === '+' ? value1 + value2 : value1 - value2;\n    // Check if we have decimals\n    if (value1 % 1 !== 0 || value2 % 1 !== 0) {\n        const value1Decimal = value1.toString().split('.');\n        const value2Decimal = value2.toString().split('.');\n        const value1DecimalLength = value1Decimal[1] && value1Decimal[1].length || 0;\n        const value2DecimalLength = value2Decimal[1] && value2Decimal[1].length || 0;\n        const multiplier = Math.pow(10, Math.max(value1DecimalLength, value2DecimalLength));\n        // Transform the decimals to integers based on the precision\n        value1 = Math.round(value1 * multiplier);\n        value2 = Math.round(value2 * multiplier);\n        // Perform the operation on integers values to make sure we don't get a fancy decimal value\n        result = operator === '+' ? value1 + value2 : value1 - value2;\n        // Transform the integer result back to decimal\n        result /= multiplier;\n    }\n    return result;\n}\n\n\n\n\nexport {$9f327308a7d514e5$export$7f629e9dc1ecf37c as useNumberFieldState};\n//# sourceMappingURL=module.js.map\n","import {useSlotId as $crOtA$useSlotId, mergeProps as $crOtA$mergeProps, useId as $crOtA$useId, useLabels as $crOtA$useLabels} from \"@react-aria/utils\";\n\nfunction $parcel$export(e, n, v, s) {\n  Object.defineProperty(e, n, {get: v, set: s, enumerable: true, configurable: true});\n}\nvar $8f1f06f2efd295ee$exports = {};\n\n$parcel$export($8f1f06f2efd295ee$exports, \"useField\", () => $8f1f06f2efd295ee$export$294aa081a6c6f55d);\nvar $6f8f5e0de5a77844$exports = {};\n\n$parcel$export($6f8f5e0de5a77844$exports, \"useLabel\", () => $6f8f5e0de5a77844$export$8467354a121f1b9f);\n\nfunction $6f8f5e0de5a77844$export$8467354a121f1b9f(props) {\n    let { id: id , label: label , 'aria-labelledby': ariaLabelledby , 'aria-label': ariaLabel , labelElementType: labelElementType = 'label'  } = props;\n    id = $crOtA$useId(id);\n    let labelId = $crOtA$useId();\n    let labelProps = {\n    };\n    if (label) {\n        ariaLabelledby = ariaLabelledby ? `${ariaLabelledby} ${labelId}` : labelId;\n        labelProps = {\n            id: labelId,\n            htmlFor: labelElementType === 'label' ? id : undefined\n        };\n    } else if (!ariaLabelledby && !ariaLabel) console.warn('If you do not provide a visible label, you must specify an aria-label or aria-labelledby attribute for accessibility');\n    let fieldProps = $crOtA$useLabels({\n        id: id,\n        'aria-label': ariaLabel,\n        'aria-labelledby': ariaLabelledby\n    });\n    return {\n        labelProps: labelProps,\n        fieldProps: fieldProps\n    };\n}\n\n\n\nfunction $8f1f06f2efd295ee$export$294aa081a6c6f55d(props) {\n    let { description: description , errorMessage: errorMessage , validationState: validationState  } = props;\n    let { labelProps: labelProps , fieldProps: fieldProps  } = $6f8f5e0de5a77844$export$8467354a121f1b9f(props);\n    let descriptionId = $crOtA$useSlotId([\n        Boolean(description),\n        Boolean(errorMessage),\n        validationState\n    ]);\n    let errorMessageId = $crOtA$useSlotId([\n        Boolean(description),\n        Boolean(errorMessage),\n        validationState\n    ]);\n    fieldProps = $crOtA$mergeProps(fieldProps, {\n        'aria-describedby': [\n            descriptionId,\n            // Use aria-describedby for error message because aria-errormessage is unsupported using VoiceOver or NVDA. See https://github.com/adobe/react-spectrum/issues/1346#issuecomment-740136268\n            errorMessageId,\n            props['aria-describedby']\n        ].filter(Boolean).join(' ') || undefined\n    });\n    return {\n        labelProps: labelProps,\n        fieldProps: fieldProps,\n        descriptionProps: {\n            id: descriptionId\n        },\n        errorMessageProps: {\n            id: errorMessageId\n        }\n    };\n}\n\n\n\n\n\nexport {$8f1f06f2efd295ee$export$294aa081a6c6f55d as useField, $6f8f5e0de5a77844$export$8467354a121f1b9f as useLabel};\n//# sourceMappingURL=module.js.map\n","import {filterDOMProps as $aywJT$filterDOMProps, mergeProps as $aywJT$mergeProps} from \"@react-aria/utils\";\nimport {useField as $aywJT$useField} from \"@react-aria/label\";\nimport {useFocusable as $aywJT$useFocusable} from \"@react-aria/focus\";\nimport {useRef as $aywJT$useRef, useEffect as $aywJT$useEffect} from \"react\";\n\nfunction $parcel$export(e, n, v, s) {\n  Object.defineProperty(e, n, {get: v, set: s, enumerable: true, configurable: true});\n}\nvar $13fe50aacf882d03$exports = {};\n\n$parcel$export($13fe50aacf882d03$exports, \"useTextField\", () => $13fe50aacf882d03$export$712718f7aec83d5);\n\n\n\nfunction $13fe50aacf882d03$export$712718f7aec83d5(props, ref) {\n    let { inputElementType: inputElementType = 'input' , isDisabled: isDisabled = false , isRequired: isRequired = false , isReadOnly: isReadOnly = false , validationState: validationState , type: type = 'text' , onChange: onChange = ()=>{\n    }  } = props;\n    let { focusableProps: focusableProps  } = $aywJT$useFocusable(props, ref);\n    let { labelProps: labelProps , fieldProps: fieldProps , descriptionProps: descriptionProps , errorMessageProps: errorMessageProps  } = $aywJT$useField(props);\n    let domProps = $aywJT$filterDOMProps(props, {\n        labelable: true\n    });\n    const inputOnlyProps = {\n        type: type,\n        pattern: props.pattern\n    };\n    return {\n        labelProps: labelProps,\n        inputProps: $aywJT$mergeProps(domProps, inputElementType === 'input' && inputOnlyProps, {\n            disabled: isDisabled,\n            readOnly: isReadOnly,\n            'aria-required': isRequired || undefined,\n            'aria-invalid': validationState === 'invalid' || undefined,\n            'aria-errormessage': props['aria-errormessage'],\n            'aria-activedescendant': props['aria-activedescendant'],\n            'aria-autocomplete': props['aria-autocomplete'],\n            'aria-haspopup': props['aria-haspopup'],\n            value: props.value,\n            defaultValue: props.value ? undefined : props.defaultValue,\n            onChange: (e)=>onChange(e.target.value)\n            ,\n            autoComplete: props.autoComplete,\n            maxLength: props.maxLength,\n            minLength: props.minLength,\n            name: props.name,\n            placeholder: props.placeholder,\n            inputMode: props.inputMode,\n            // Clipboard events\n            onCopy: props.onCopy,\n            onCut: props.onCut,\n            onPaste: props.onPaste,\n            // Composition events\n            onCompositionEnd: props.onCompositionEnd,\n            onCompositionStart: props.onCompositionStart,\n            onCompositionUpdate: props.onCompositionUpdate,\n            // Selection events\n            onSelect: props.onSelect,\n            // Input events\n            onBeforeInput: props.onBeforeInput,\n            onInput: props.onInput,\n            ...focusableProps,\n            ...fieldProps\n        }),\n        descriptionProps: descriptionProps,\n        errorMessageProps: errorMessageProps\n    };\n}\n\n\nvar $58c0262056d833d5$exports = {};\n\n$parcel$export($58c0262056d833d5$exports, \"useFormattedTextField\", () => $58c0262056d833d5$export$4f384c9210e583c3);\n\n\n\nfunction $58c0262056d833d5$var$supportsNativeBeforeInputEvent() {\n    return typeof window !== 'undefined' && window.InputEvent && // @ts-ignore\n    typeof InputEvent.prototype.getTargetRanges === 'function';\n}\nfunction $58c0262056d833d5$export$4f384c9210e583c3(props, state1, inputRef) {\n    let stateRef = $aywJT$useRef(state1);\n    stateRef.current = state1;\n    // All browsers implement the 'beforeinput' event natively except Firefox\n    // (currently behind a flag as of Firefox 84). React's polyfill does not\n    // run in all cases that the native event fires, e.g. when deleting text.\n    // Use the native event if available so that we can prevent invalid deletions.\n    // We do not attempt to polyfill this in Firefox since it would be very complicated,\n    // the benefit of doing so is fairly minor, and it's going to be natively supported soon.\n    $aywJT$useEffect(()=>{\n        if (!$58c0262056d833d5$var$supportsNativeBeforeInputEvent()) return;\n        let input = inputRef.current;\n        let onBeforeInput = (e)=>{\n            let state = stateRef.current;\n            // Compute the next value of the input if the event is allowed to proceed.\n            // See https://www.w3.org/TR/input-events-2/#interface-InputEvent-Attributes for a full list of input types.\n            let nextValue;\n            switch(e.inputType){\n                case 'historyUndo':\n                case 'historyRedo':\n                    // Explicitly allow undo/redo. e.data is null in this case, but there's no need to validate,\n                    // because presumably the input would have already been validated previously.\n                    return;\n                case 'deleteContent':\n                case 'deleteByCut':\n                case 'deleteByDrag':\n                    nextValue = input.value.slice(0, input.selectionStart) + input.value.slice(input.selectionEnd);\n                    break;\n                case 'deleteContentForward':\n                    // This is potentially incorrect, since the browser may actually delete more than a single UTF-16\n                    // character. In reality, a full Unicode grapheme cluster consisting of multiple UTF-16 characters\n                    // or code points may be deleted. However, in our currently supported locales, there are no such cases.\n                    // If we support additional locales in the future, this may need to change.\n                    nextValue = input.selectionEnd === input.selectionStart ? input.value.slice(0, input.selectionStart) + input.value.slice(input.selectionEnd + 1) : input.value.slice(0, input.selectionStart) + input.value.slice(input.selectionEnd);\n                    break;\n                case 'deleteContentBackward':\n                    nextValue = input.selectionEnd === input.selectionStart ? input.value.slice(0, input.selectionStart - 1) + input.value.slice(input.selectionStart) : input.value.slice(0, input.selectionStart) + input.value.slice(input.selectionEnd);\n                    break;\n                case 'deleteSoftLineBackward':\n                case 'deleteHardLineBackward':\n                    nextValue = input.value.slice(input.selectionStart);\n                    break;\n                default:\n                    if (e.data != null) nextValue = input.value.slice(0, input.selectionStart) + e.data + input.value.slice(input.selectionEnd);\n                    break;\n            }\n            // If we did not compute a value, or the new value is invalid, prevent the event\n            // so that the browser does not update the input text, move the selection, or add to\n            // the undo/redo stack.\n            if (nextValue == null || !state.validate(nextValue)) e.preventDefault();\n        };\n        input.addEventListener('beforeinput', onBeforeInput, false);\n        return ()=>{\n            input.removeEventListener('beforeinput', onBeforeInput, false);\n        };\n    }, [\n        inputRef,\n        stateRef\n    ]);\n    let onBeforeInput1 = !$58c0262056d833d5$var$supportsNativeBeforeInputEvent() ? (e)=>{\n        let nextValue = e.target.value.slice(0, e.target.selectionStart) + e.data + e.target.value.slice(e.target.selectionEnd);\n        if (!state1.validate(nextValue)) e.preventDefault();\n    } : null;\n    let { labelProps: labelProps , inputProps: textFieldProps , descriptionProps: descriptionProps , errorMessageProps: errorMessageProps  } = $13fe50aacf882d03$export$712718f7aec83d5(props, inputRef);\n    let compositionStartState = $aywJT$useRef(null);\n    return {\n        inputProps: $aywJT$mergeProps(textFieldProps, {\n            onBeforeInput: onBeforeInput1,\n            onCompositionStart () {\n                // Chrome does not implement Input Events Level 2, which specifies the insertFromComposition\n                // and deleteByComposition inputType values for the beforeinput event. These are meant to occur\n                // at the end of a composition (e.g. Pinyin IME, Android auto correct, etc.), and crucially, are\n                // cancelable. The insertCompositionText and deleteCompositionText input types are not cancelable,\n                // nor would we want to cancel them because the input from the user is incomplete at that point.\n                // In Safari, insertFromComposition/deleteFromComposition will fire, however, allowing us to cancel\n                // the final composition result if it is invalid. As a fallback for Chrome and Firefox, which either\n                // don't support Input Events Level 2, or beforeinput at all, we store the state of the input when\n                // the compositionstart event fires, and undo the changes in compositionend (below) if it is invalid.\n                // Unfortunately, this messes up the undo/redo stack, but until insertFromComposition/deleteByComposition\n                // are implemented, there is no other way to prevent composed input.\n                // See https://bugs.chromium.org/p/chromium/issues/detail?id=1022204\n                let { value: value , selectionStart: selectionStart , selectionEnd: selectionEnd  } = inputRef.current;\n                compositionStartState.current = {\n                    value: value,\n                    selectionStart: selectionStart,\n                    selectionEnd: selectionEnd\n                };\n            },\n            onCompositionEnd () {\n                if (!state1.validate(inputRef.current.value)) {\n                    // Restore the input value in the DOM immediately so we can synchronously update the selection position.\n                    // But also update the value in React state as well so it is correct for future updates.\n                    let { value: value , selectionStart: selectionStart , selectionEnd: selectionEnd  } = compositionStartState.current;\n                    inputRef.current.value = value;\n                    inputRef.current.setSelectionRange(selectionStart, selectionEnd);\n                    state1.setInputValue(value);\n                }\n            }\n        }),\n        labelProps: labelProps,\n        descriptionProps: descriptionProps,\n        errorMessageProps: errorMessageProps\n    };\n}\n\n\n\n\nexport {$13fe50aacf882d03$export$712718f7aec83d5 as useTextField, $58c0262056d833d5$export$4f384c9210e583c3 as useFormattedTextField};\n//# sourceMappingURL=module.js.map\n","import $icz4I$react, {useState as $icz4I$useState, useImperativeHandle as $icz4I$useImperativeHandle, Fragment as $icz4I$Fragment} from \"react\";\nimport $icz4I$reactdom from \"react-dom\";\nimport {VisuallyHidden as $icz4I$VisuallyHidden} from \"@react-aria/visually-hidden\";\n\nfunction $parcel$export(e, n, v, s) {\n  Object.defineProperty(e, n, {get: v, set: s, enumerable: true, configurable: true});\n}\nvar $9694eec57086f168$exports = {};\n\n$parcel$export($9694eec57086f168$exports, \"announce\", () => $9694eec57086f168$export$a9b970dcc4ae71a9);\n$parcel$export($9694eec57086f168$exports, \"clearAnnouncer\", () => $9694eec57086f168$export$d10ae4f68404609a);\n$parcel$export($9694eec57086f168$exports, \"destroyAnnouncer\", () => $9694eec57086f168$export$d8686216b8b81b2f);\n\n\n\n/* Inspired by https://github.com/AlmeroSteyn/react-aria-live */ const $9694eec57086f168$var$LIVEREGION_TIMEOUT_DELAY = 7000;\nlet $9694eec57086f168$var$liveRegionAnnouncer = /*#__PURE__*/ $icz4I$react.createRef();\nlet $9694eec57086f168$var$node = null;\nlet $9694eec57086f168$var$messageId = 0;\nfunction $9694eec57086f168$export$a9b970dcc4ae71a9(message, assertiveness = 'assertive', timeout = $9694eec57086f168$var$LIVEREGION_TIMEOUT_DELAY) {\n    $9694eec57086f168$var$ensureInstance((announcer)=>announcer.announce(message, assertiveness, timeout)\n    );\n}\nfunction $9694eec57086f168$export$d10ae4f68404609a(assertiveness) {\n    $9694eec57086f168$var$ensureInstance((announcer)=>announcer.clear(assertiveness)\n    );\n}\nfunction $9694eec57086f168$export$d8686216b8b81b2f() {\n    if ($9694eec57086f168$var$liveRegionAnnouncer.current) {\n        $icz4I$reactdom.unmountComponentAtNode($9694eec57086f168$var$node);\n        document.body.removeChild($9694eec57086f168$var$node);\n        $9694eec57086f168$var$node = null;\n    }\n}\n/**\n * Ensures we only have one instance of the announcer so that we don't have elements competing.\n */ function $9694eec57086f168$var$ensureInstance(callback) {\n    if (!$9694eec57086f168$var$liveRegionAnnouncer.current) {\n        $9694eec57086f168$var$node = document.createElement('div');\n        $9694eec57086f168$var$node.dataset.liveAnnouncer = 'true';\n        document.body.prepend($9694eec57086f168$var$node);\n        $icz4I$reactdom.render(/*#__PURE__*/ $icz4I$react.createElement($9694eec57086f168$var$LiveRegionAnnouncer, {\n            ref: $9694eec57086f168$var$liveRegionAnnouncer\n        }), $9694eec57086f168$var$node, ()=>callback($9694eec57086f168$var$liveRegionAnnouncer.current)\n        );\n    } else callback($9694eec57086f168$var$liveRegionAnnouncer.current);\n}\nconst $9694eec57086f168$var$LiveRegionAnnouncer = /*#__PURE__*/ $icz4I$react.forwardRef((_, ref)=>{\n    let [assertiveMessages, setAssertiveMessages] = $icz4I$useState([]);\n    let [politeMessages, setPoliteMessages] = $icz4I$useState([]);\n    let clear = (assertiveness)=>{\n        if (!assertiveness || assertiveness === 'assertive') setAssertiveMessages([]);\n        if (!assertiveness || assertiveness === 'polite') setPoliteMessages([]);\n    };\n    let $9694eec57086f168$export$a9b970dcc4ae71a9 = (message1, assertiveness = 'assertive', timeout = $9694eec57086f168$var$LIVEREGION_TIMEOUT_DELAY)=>{\n        let id = $9694eec57086f168$var$messageId++;\n        if (assertiveness === 'assertive') setAssertiveMessages((messages)=>[\n                ...messages,\n                {\n                    id: id,\n                    text: message1\n                }\n            ]\n        );\n        else setPoliteMessages((messages)=>[\n                ...messages,\n                {\n                    id: id,\n                    text: message1\n                }\n            ]\n        );\n        if (message1 !== '') setTimeout(()=>{\n            if (assertiveness === 'assertive') setAssertiveMessages((messages)=>messages.filter((message)=>message.id !== id\n                )\n            );\n            else setPoliteMessages((messages)=>messages.filter((message)=>message.id !== id\n                )\n            );\n        }, timeout);\n    };\n    $icz4I$useImperativeHandle(ref, ()=>({\n            announce: $9694eec57086f168$export$a9b970dcc4ae71a9,\n            clear: clear\n        })\n    );\n    return(/*#__PURE__*/ $icz4I$react.createElement($icz4I$Fragment, null, /*#__PURE__*/ $icz4I$react.createElement($9694eec57086f168$var$MessageBlock, {\n        \"aria-live\": \"assertive\"\n    }, assertiveMessages.map((message)=>/*#__PURE__*/ $icz4I$react.createElement(\"div\", {\n            key: message.id\n        }, message.text)\n    )), /*#__PURE__*/ $icz4I$react.createElement($9694eec57086f168$var$MessageBlock, {\n        \"aria-live\": \"polite\"\n    }, politeMessages.map((message)=>/*#__PURE__*/ $icz4I$react.createElement(\"div\", {\n            key: message.id\n        }, message.text)\n    ))));\n});\nfunction $9694eec57086f168$var$MessageBlock({ children: children , 'aria-live': ariaLive  }) {\n    return(/*#__PURE__*/ $icz4I$react.createElement($icz4I$VisuallyHidden, {\n        role: \"log\",\n        \"aria-live\": ariaLive,\n        \"aria-relevant\": \"additions\"\n    }, children));\n}\n\n\n\n\nexport {$9694eec57086f168$export$a9b970dcc4ae71a9 as announce, $9694eec57086f168$export$d10ae4f68404609a as clearAnnouncer, $9694eec57086f168$export$d8686216b8b81b2f as destroyAnnouncer};\n//# sourceMappingURL=module.js.map\n","import {announce as $915Kq$announce} from \"@react-aria/live-announcer\";\nimport {useRef as $915Kq$useRef, useEffect as $915Kq$useEffect, useCallback as $915Kq$useCallback} from \"react\";\nimport {useGlobalListeners as $915Kq$useGlobalListeners} from \"@react-aria/utils\";\nimport {useMessageFormatter as $915Kq$useMessageFormatter} from \"@react-aria/i18n\";\n\nfunction $parcel$interopDefault(a) {\n  return a && a.__esModule ? a.default : a;\n}\nfunction $parcel$export(e, n, v, s) {\n  Object.defineProperty(e, n, {get: v, set: s, enumerable: true, configurable: true});\n}\nvar $7fc2c1269c209e7a$exports = {};\n\n$parcel$export($7fc2c1269c209e7a$exports, \"useSpinButton\", () => $7fc2c1269c209e7a$export$e908e06f4b8e3402);\n\n\nvar $340b38cae631a990$exports = {};\nvar $b9502ca1ed2a658b$exports = {};\n$b9502ca1ed2a658b$exports = JSON.parse(\"{\\\"Empty\\\":\\\"فارغ\\\"}\");\n\n\nvar $f5536daa79264fee$exports = {};\n$f5536daa79264fee$exports = JSON.parse(\"{\\\"Empty\\\":\\\"Изпразни\\\"}\");\n\n\nvar $cf7f4a4198f8a132$exports = {};\n$cf7f4a4198f8a132$exports = JSON.parse(\"{\\\"Empty\\\":\\\"Prázdné\\\"}\");\n\n\nvar $a125126b72296152$exports = {};\n$a125126b72296152$exports = JSON.parse(\"{\\\"Empty\\\":\\\"Tom\\\"}\");\n\n\nvar $14e8c357b1f6a729$exports = {};\n$14e8c357b1f6a729$exports = JSON.parse(\"{\\\"Empty\\\":\\\"Leer\\\"}\");\n\n\nvar $80806430c53bf3df$exports = {};\n$80806430c53bf3df$exports = JSON.parse(\"{\\\"Empty\\\":\\\"Άδειο\\\"}\");\n\n\nvar $9da37b54727bdc96$exports = {};\n$9da37b54727bdc96$exports = JSON.parse(\"{\\\"Empty\\\":\\\"Empty\\\"}\");\n\n\nvar $4858ca7e134011e0$exports = {};\n$4858ca7e134011e0$exports = JSON.parse(\"{\\\"Empty\\\":\\\"Vacío\\\"}\");\n\n\nvar $84ca1479916e1b99$exports = {};\n$84ca1479916e1b99$exports = JSON.parse(\"{\\\"Empty\\\":\\\"Tühjenda\\\"}\");\n\n\nvar $93f5a002624d1f4c$exports = {};\n$93f5a002624d1f4c$exports = JSON.parse(\"{\\\"Empty\\\":\\\"Tyhjä\\\"}\");\n\n\nvar $aed3a2b812f0d51c$exports = {};\n$aed3a2b812f0d51c$exports = JSON.parse(\"{\\\"Empty\\\":\\\"Vide\\\"}\");\n\n\nvar $dee73af7873d6102$exports = {};\n$dee73af7873d6102$exports = JSON.parse(\"{\\\"Empty\\\":\\\"ריק\\\"}\");\n\n\nvar $7eb77a2dda24ed8e$exports = {};\n$7eb77a2dda24ed8e$exports = JSON.parse(\"{\\\"Empty\\\":\\\"Prazno\\\"}\");\n\n\nvar $3226a172ca65c1f5$exports = {};\n$3226a172ca65c1f5$exports = JSON.parse(\"{\\\"Empty\\\":\\\"Üres\\\"}\");\n\n\nvar $2b2ffbc3f0ade025$exports = {};\n$2b2ffbc3f0ade025$exports = JSON.parse(\"{\\\"Empty\\\":\\\"Vuoto\\\"}\");\n\n\nvar $e9c8e101022d809a$exports = {};\n$e9c8e101022d809a$exports = JSON.parse(\"{\\\"Empty\\\":\\\"空\\\"}\");\n\n\nvar $63f4629129a8bd6a$exports = {};\n$63f4629129a8bd6a$exports = JSON.parse(\"{\\\"Empty\\\":\\\"비어 있음\\\"}\");\n\n\nvar $047e27ea7822a64e$exports = {};\n$047e27ea7822a64e$exports = JSON.parse(\"{\\\"Empty\\\":\\\"Tuščias\\\"}\");\n\n\nvar $4f52beb8d7a97f37$exports = {};\n$4f52beb8d7a97f37$exports = JSON.parse(\"{\\\"Empty\\\":\\\"Tukšs\\\"}\");\n\n\nvar $e239fc54935fc6fe$exports = {};\n$e239fc54935fc6fe$exports = JSON.parse(\"{\\\"Empty\\\":\\\"Tom\\\"}\");\n\n\nvar $ff50d75ac63d2fe2$exports = {};\n$ff50d75ac63d2fe2$exports = JSON.parse(\"{\\\"Empty\\\":\\\"Leeg\\\"}\");\n\n\nvar $cb34519c43c80fbd$exports = {};\n$cb34519c43c80fbd$exports = JSON.parse(\"{\\\"Empty\\\":\\\"Pusty\\\"}\");\n\n\nvar $6335d0590d9b3b46$exports = {};\n$6335d0590d9b3b46$exports = JSON.parse(\"{\\\"Empty\\\":\\\"Vazio\\\"}\");\n\n\nvar $b352cf5a7254cc64$exports = {};\n$b352cf5a7254cc64$exports = JSON.parse(\"{\\\"Empty\\\":\\\"Vazio\\\"}\");\n\n\nvar $0421d1820ca63df4$exports = {};\n$0421d1820ca63df4$exports = JSON.parse(\"{\\\"Empty\\\":\\\"Gol\\\"}\");\n\n\nvar $cd59ecc168767389$exports = {};\n$cd59ecc168767389$exports = JSON.parse(\"{\\\"Empty\\\":\\\"Не заполнено\\\"}\");\n\n\nvar $73864cfe6f4130a9$exports = {};\n$73864cfe6f4130a9$exports = JSON.parse(\"{\\\"Empty\\\":\\\"Prázdne\\\"}\");\n\n\nvar $85a540e317a6ade4$exports = {};\n$85a540e317a6ade4$exports = JSON.parse(\"{\\\"Empty\\\":\\\"Prazen\\\"}\");\n\n\nvar $42d477601e71a1b4$exports = {};\n$42d477601e71a1b4$exports = JSON.parse(\"{\\\"Empty\\\":\\\"Prazno\\\"}\");\n\n\nvar $a8d88b556f2ce245$exports = {};\n$a8d88b556f2ce245$exports = JSON.parse(\"{\\\"Empty\\\":\\\"Tomt\\\"}\");\n\n\nvar $ab8e9d7da7315d53$exports = {};\n$ab8e9d7da7315d53$exports = JSON.parse(\"{\\\"Empty\\\":\\\"Boş\\\"}\");\n\n\nvar $73c9a5841c568e45$exports = {};\n$73c9a5841c568e45$exports = JSON.parse(\"{\\\"Empty\\\":\\\"Пусто\\\"}\");\n\n\nvar $35b700e586161794$exports = {};\n$35b700e586161794$exports = JSON.parse(\"{\\\"Empty\\\":\\\"空\\\"}\");\n\n\nvar $53ac17eac2b15927$exports = {};\n$53ac17eac2b15927$exports = JSON.parse(\"{\\\"Empty\\\":\\\"空白\\\"}\");\n\n\n$340b38cae631a990$exports = {\n    \"ar-AE\": $b9502ca1ed2a658b$exports,\n    \"bg-BG\": $f5536daa79264fee$exports,\n    \"cs-CZ\": $cf7f4a4198f8a132$exports,\n    \"da-DK\": $a125126b72296152$exports,\n    \"de-DE\": $14e8c357b1f6a729$exports,\n    \"el-GR\": $80806430c53bf3df$exports,\n    \"en-US\": $9da37b54727bdc96$exports,\n    \"es-ES\": $4858ca7e134011e0$exports,\n    \"et-EE\": $84ca1479916e1b99$exports,\n    \"fi-FI\": $93f5a002624d1f4c$exports,\n    \"fr-FR\": $aed3a2b812f0d51c$exports,\n    \"he-IL\": $dee73af7873d6102$exports,\n    \"hr-HR\": $7eb77a2dda24ed8e$exports,\n    \"hu-HU\": $3226a172ca65c1f5$exports,\n    \"it-IT\": $2b2ffbc3f0ade025$exports,\n    \"ja-JP\": $e9c8e101022d809a$exports,\n    \"ko-KR\": $63f4629129a8bd6a$exports,\n    \"lt-LT\": $047e27ea7822a64e$exports,\n    \"lv-LV\": $4f52beb8d7a97f37$exports,\n    \"nb-NO\": $e239fc54935fc6fe$exports,\n    \"nl-NL\": $ff50d75ac63d2fe2$exports,\n    \"pl-PL\": $cb34519c43c80fbd$exports,\n    \"pt-BR\": $6335d0590d9b3b46$exports,\n    \"pt-PT\": $b352cf5a7254cc64$exports,\n    \"ro-RO\": $0421d1820ca63df4$exports,\n    \"ru-RU\": $cd59ecc168767389$exports,\n    \"sk-SK\": $73864cfe6f4130a9$exports,\n    \"sl-SI\": $85a540e317a6ade4$exports,\n    \"sr-SP\": $42d477601e71a1b4$exports,\n    \"sv-SE\": $a8d88b556f2ce245$exports,\n    \"tr-TR\": $ab8e9d7da7315d53$exports,\n    \"uk-UA\": $73c9a5841c568e45$exports,\n    \"zh-CN\": $35b700e586161794$exports,\n    \"zh-TW\": $53ac17eac2b15927$exports\n};\n\n\n\n\nfunction $7fc2c1269c209e7a$export$e908e06f4b8e3402(props) {\n    const _async = $915Kq$useRef();\n    let { value: value , textValue: textValue , minValue: minValue , maxValue: maxValue , isDisabled: isDisabled , isReadOnly: isReadOnly , isRequired: isRequired , onIncrement: onIncrement , onIncrementPage: onIncrementPage , onDecrement: onDecrement , onDecrementPage: onDecrementPage , onDecrementToMin: onDecrementToMin , onIncrementToMax: onIncrementToMax  } = props;\n    const formatMessage = $915Kq$useMessageFormatter((/*@__PURE__*/$parcel$interopDefault($340b38cae631a990$exports)));\n    const propsRef = $915Kq$useRef(props);\n    propsRef.current = props;\n    const clearAsync = ()=>clearTimeout(_async.current)\n    ;\n    // eslint-disable-next-line arrow-body-style\n    $915Kq$useEffect(()=>{\n        return ()=>clearAsync()\n        ;\n    }, []);\n    let onKeyDown = (e)=>{\n        if (e.ctrlKey || e.metaKey || e.shiftKey || e.altKey || isReadOnly) return;\n        switch(e.key){\n            case 'PageUp':\n                if (onIncrementPage) {\n                    e.preventDefault();\n                    onIncrementPage();\n                    break;\n                }\n            // fallthrough!\n            case 'ArrowUp':\n            case 'Up':\n                if (onIncrement) {\n                    e.preventDefault();\n                    onIncrement();\n                }\n                break;\n            case 'PageDown':\n                if (onDecrementPage) {\n                    e.preventDefault();\n                    onDecrementPage();\n                    break;\n                }\n            // fallthrough\n            case 'ArrowDown':\n            case 'Down':\n                if (onDecrement) {\n                    e.preventDefault();\n                    onDecrement();\n                }\n                break;\n            case 'Home':\n                if (onDecrementToMin) {\n                    e.preventDefault();\n                    onDecrementToMin();\n                }\n                break;\n            case 'End':\n                if (onIncrementToMax) {\n                    e.preventDefault();\n                    onIncrementToMax();\n                }\n                break;\n        }\n    };\n    let isFocused = $915Kq$useRef(false);\n    let onFocus = ()=>{\n        isFocused.current = true;\n    };\n    let onBlur = ()=>{\n        isFocused.current = false;\n    };\n    // Replace Unicode hyphen-minus (U+002D) with minus sign (U+2212).\n    // This ensures that macOS VoiceOver announces it as \"minus\" even with other characters between the minus sign\n    // and the number (e.g. currency symbol). Otherwise it announces nothing because it assumes the character is a hyphen.\n    // In addition, replace the empty string with the word \"Empty\" so that iOS VoiceOver does not read \"50%\" for an empty field.\n    textValue = textValue === '' ? formatMessage('Empty') : (textValue || `${value}`).replace('-', '\\u2212');\n    $915Kq$useEffect(()=>{\n        if (isFocused.current) $915Kq$announce(textValue, 'assertive');\n    }, [\n        textValue\n    ]);\n    const onIncrementPressStart = $915Kq$useCallback((initialStepDelay)=>{\n        clearAsync();\n        propsRef.current.onIncrement();\n        // Start spinning after initial delay\n        _async.current = window.setTimeout(()=>{\n            if (isNaN(maxValue) || isNaN(value) || value < maxValue) onIncrementPressStart(60);\n        }, initialStepDelay);\n    }, [\n        onIncrement,\n        maxValue,\n        value\n    ]);\n    const onDecrementPressStart = $915Kq$useCallback((initialStepDelay)=>{\n        clearAsync();\n        propsRef.current.onDecrement();\n        // Start spinning after initial delay\n        _async.current = window.setTimeout(()=>{\n            if (isNaN(minValue) || isNaN(value) || value > minValue) onDecrementPressStart(60);\n        }, initialStepDelay);\n    }, [\n        onDecrement,\n        minValue,\n        value\n    ]);\n    let cancelContextMenu = (e)=>{\n        e.preventDefault();\n    };\n    let { addGlobalListener: addGlobalListener , removeAllGlobalListeners: removeAllGlobalListeners  } = $915Kq$useGlobalListeners();\n    return {\n        spinButtonProps: {\n            role: 'spinbutton',\n            'aria-valuenow': !isNaN(value) ? value : null,\n            'aria-valuetext': textValue,\n            'aria-valuemin': minValue,\n            'aria-valuemax': maxValue,\n            'aria-disabled': isDisabled || null,\n            'aria-readonly': isReadOnly || null,\n            'aria-required': isRequired || null,\n            onKeyDown: onKeyDown,\n            onFocus: onFocus,\n            onBlur: onBlur\n        },\n        incrementButtonProps: {\n            onPressStart: ()=>{\n                onIncrementPressStart(400);\n                addGlobalListener(window, 'contextmenu', cancelContextMenu);\n            },\n            onPressEnd: ()=>{\n                clearAsync();\n                removeAllGlobalListeners();\n            },\n            onFocus: onFocus,\n            onBlur: onBlur\n        },\n        decrementButtonProps: {\n            onPressStart: ()=>{\n                onDecrementPressStart(400);\n                addGlobalListener(window, 'contextmenu', cancelContextMenu);\n            },\n            onPressEnd: ()=>{\n                clearAsync();\n                removeAllGlobalListeners();\n            },\n            onFocus: onFocus,\n            onBlur: onBlur\n        }\n    };\n}\n\n\n\n\nexport {$7fc2c1269c209e7a$export$e908e06f4b8e3402 as useSpinButton};\n//# sourceMappingURL=module.js.map\n","import {useId as $1eWaC$useId, isIPhone as $1eWaC$isIPhone, isAndroid as $1eWaC$isAndroid, filterDOMProps as $1eWaC$filterDOMProps, mergeProps as $1eWaC$mergeProps, isIOS as $1eWaC$isIOS} from \"@react-aria/utils\";\nimport {useState as $1eWaC$useState, useCallback as $1eWaC$useCallback, useMemo as $1eWaC$useMemo} from \"react\";\nimport {useFocus as $1eWaC$useFocus, useFocusWithin as $1eWaC$useFocusWithin, useScrollWheel as $1eWaC$useScrollWheel} from \"@react-aria/interactions\";\nimport {useFormattedTextField as $1eWaC$useFormattedTextField} from \"@react-aria/textfield\";\nimport {useMessageFormatter as $1eWaC$useMessageFormatter, useNumberFormatter as $1eWaC$useNumberFormatter} from \"@react-aria/i18n\";\nimport {useSpinButton as $1eWaC$useSpinButton} from \"@react-aria/spinbutton\";\n\nfunction $parcel$interopDefault(a) {\n  return a && a.__esModule ? a.default : a;\n}\nfunction $parcel$export(e, n, v, s) {\n  Object.defineProperty(e, n, {get: v, set: s, enumerable: true, configurable: true});\n}\nvar $cf0c3bd5e1672ec9$exports = {};\n\n$parcel$export($cf0c3bd5e1672ec9$exports, \"useNumberField\", () => $cf0c3bd5e1672ec9$export$23f548e970bdf099);\n\n\nvar $2dbd11b99107b9a3$exports = {};\nvar $6549386043ae9318$exports = {};\n$6549386043ae9318$exports = JSON.parse(\"{\\\"decrease\\\":\\\"خفض {fieldLabel}\\\",\\\"increase\\\":\\\"زيادة {fieldLabel}\\\",\\\"numberField\\\":\\\"حقل رقمي\\\"}\");\n\n\nvar $e76bce23c5e8423e$exports = {};\n$e76bce23c5e8423e$exports = JSON.parse(\"{\\\"decrease\\\":\\\"Намаляване {fieldLabel}\\\",\\\"increase\\\":\\\"Усилване {fieldLabel}\\\",\\\"numberField\\\":\\\"Номер на полето\\\"}\");\n\n\nvar $6129a2a27a7967ba$exports = {};\n$6129a2a27a7967ba$exports = JSON.parse(\"{\\\"decrease\\\":\\\"Snížit {fieldLabel}\\\",\\\"increase\\\":\\\"Zvýšit {fieldLabel}\\\",\\\"numberField\\\":\\\"Číselné pole\\\"}\");\n\n\nvar $52dac2657f2e7b91$exports = {};\n$52dac2657f2e7b91$exports = JSON.parse(\"{\\\"decrease\\\":\\\"Reducer {fieldLabel}\\\",\\\"increase\\\":\\\"Øg {fieldLabel}\\\",\\\"numberField\\\":\\\"Talfelt\\\"}\");\n\n\nvar $2d5c0936198b9a1d$exports = {};\n$2d5c0936198b9a1d$exports = JSON.parse(\"{\\\"decrease\\\":\\\"{fieldLabel} verringern\\\",\\\"increase\\\":\\\"{fieldLabel} erhöhen\\\",\\\"numberField\\\":\\\"Nummernfeld\\\"}\");\n\n\nvar $037bbc3daaf1c938$exports = {};\n$037bbc3daaf1c938$exports = JSON.parse(\"{\\\"decrease\\\":\\\"Μείωση {fieldLabel}\\\",\\\"increase\\\":\\\"Αύξηση {fieldLabel}\\\",\\\"numberField\\\":\\\"Πεδίο αριθμού\\\"}\");\n\n\nvar $6f0e76066d1c5161$exports = {};\n$6f0e76066d1c5161$exports = JSON.parse(\"{\\\"decrease\\\":\\\"Decrease {fieldLabel}\\\",\\\"increase\\\":\\\"Increase {fieldLabel}\\\",\\\"numberField\\\":\\\"Number field\\\"}\");\n\n\nvar $ae410a5d2bee905f$exports = {};\n$ae410a5d2bee905f$exports = JSON.parse(\"{\\\"decrease\\\":\\\"Reducir {fieldLabel}\\\",\\\"increase\\\":\\\"Aumentar {fieldLabel}\\\",\\\"numberField\\\":\\\"Campo de número\\\"}\");\n\n\nvar $ba7e088ac7327440$exports = {};\n$ba7e088ac7327440$exports = JSON.parse(\"{\\\"decrease\\\":\\\"Vähenda {fieldLabel}\\\",\\\"increase\\\":\\\"Suurenda {fieldLabel}\\\",\\\"numberField\\\":\\\"Numbri väli\\\"}\");\n\n\nvar $16b3c05b733de903$exports = {};\n$16b3c05b733de903$exports = JSON.parse(\"{\\\"decrease\\\":\\\"Vähennä {fieldLabel}\\\",\\\"increase\\\":\\\"Lisää {fieldLabel}\\\",\\\"numberField\\\":\\\"Numerokenttä\\\"}\");\n\n\nvar $e8b2524c965f690e$exports = {};\n$e8b2524c965f690e$exports = JSON.parse(\"{\\\"decrease\\\":\\\"Diminuer {fieldLabel}\\\",\\\"increase\\\":\\\"Augmenter {fieldLabel}\\\",\\\"numberField\\\":\\\"Champ de nombre\\\"}\");\n\n\nvar $a6493a4a0eba3e94$exports = {};\n$a6493a4a0eba3e94$exports = JSON.parse(\"{\\\"decrease\\\":\\\"הקטן {fieldLabel}\\\",\\\"increase\\\":\\\"הגדל {fieldLabel}\\\",\\\"numberField\\\":\\\"שדה מספר\\\"}\");\n\n\nvar $fc83409ad17dbb8e$exports = {};\n$fc83409ad17dbb8e$exports = JSON.parse(\"{\\\"decrease\\\":\\\"Smanji {fieldLabel}\\\",\\\"increase\\\":\\\"Povećaj {fieldLabel}\\\",\\\"numberField\\\":\\\"Polje broja\\\"}\");\n\n\nvar $7fbda66289952e59$exports = {};\n$7fbda66289952e59$exports = JSON.parse(\"{\\\"decrease\\\":\\\"{fieldLabel} csökkentése\\\",\\\"increase\\\":\\\"{fieldLabel} növelése\\\",\\\"numberField\\\":\\\"Számmező\\\"}\");\n\n\nvar $0ca9c2faa64e1737$exports = {};\n$0ca9c2faa64e1737$exports = JSON.parse(\"{\\\"decrease\\\":\\\"Riduci {fieldLabel}\\\",\\\"increase\\\":\\\"Aumenta {fieldLabel}\\\",\\\"numberField\\\":\\\"Campo numero\\\"}\");\n\n\nvar $40b39fb57e4e01eb$exports = {};\n$40b39fb57e4e01eb$exports = JSON.parse(\"{\\\"decrease\\\":\\\"{fieldLabel}を縮小\\\",\\\"increase\\\":\\\"{fieldLabel}を拡大\\\",\\\"numberField\\\":\\\"数値フィールド\\\"}\");\n\n\nvar $eb43f79428829329$exports = {};\n$eb43f79428829329$exports = JSON.parse(\"{\\\"decrease\\\":\\\"{fieldLabel} 감소\\\",\\\"increase\\\":\\\"{fieldLabel} 증가\\\",\\\"numberField\\\":\\\"번호 필드\\\"}\");\n\n\nvar $8716579631e81e6b$exports = {};\n$8716579631e81e6b$exports = JSON.parse(\"{\\\"decrease\\\":\\\"Sumažinti {fieldLabel}\\\",\\\"increase\\\":\\\"Padidinti {fieldLabel}\\\",\\\"numberField\\\":\\\"Numerio laukas\\\"}\");\n\n\nvar $fb4343b9e8e55d54$exports = {};\n$fb4343b9e8e55d54$exports = JSON.parse(\"{\\\"decrease\\\":\\\"Samazināšana {fieldLabel}\\\",\\\"increase\\\":\\\"Palielināšana {fieldLabel}\\\",\\\"numberField\\\":\\\"Skaitļu lauks\\\"}\");\n\n\nvar $e1efff358f8fa070$exports = {};\n$e1efff358f8fa070$exports = JSON.parse(\"{\\\"decrease\\\":\\\"Reduser {fieldLabel}\\\",\\\"increase\\\":\\\"Øk {fieldLabel}\\\",\\\"numberField\\\":\\\"Tallfelt\\\"}\");\n\n\nvar $78c91c3ffeb5bcda$exports = {};\n$78c91c3ffeb5bcda$exports = JSON.parse(\"{\\\"decrease\\\":\\\"{fieldLabel} verlagen\\\",\\\"increase\\\":\\\"{fieldLabel} verhogen\\\",\\\"numberField\\\":\\\"Getalveld\\\"}\");\n\n\nvar $847dfd0520968639$exports = {};\n$847dfd0520968639$exports = JSON.parse(\"{\\\"decrease\\\":\\\"Zmniejsz {fieldLabel}\\\",\\\"increase\\\":\\\"Zwiększ {fieldLabel}\\\",\\\"numberField\\\":\\\"Pole numeru\\\"}\");\n\n\nvar $f4204c08266aeca6$exports = {};\n$f4204c08266aeca6$exports = JSON.parse(\"{\\\"decrease\\\":\\\"Diminuir {fieldLabel}\\\",\\\"increase\\\":\\\"Aumentar {fieldLabel}\\\",\\\"numberField\\\":\\\"Campo de número\\\"}\");\n\n\nvar $d500387cf5000fdc$exports = {};\n$d500387cf5000fdc$exports = JSON.parse(\"{\\\"decrease\\\":\\\"Diminuir {fieldLabel}\\\",\\\"increase\\\":\\\"Aumentar {fieldLabel}\\\",\\\"numberField\\\":\\\"Campo numérico\\\"}\");\n\n\nvar $ab2719432eedc1bf$exports = {};\n$ab2719432eedc1bf$exports = JSON.parse(\"{\\\"decrease\\\":\\\"Scădere {fieldLabel}\\\",\\\"increase\\\":\\\"Creștere {fieldLabel}\\\",\\\"numberField\\\":\\\"Câmp numeric\\\"}\");\n\n\nvar $4bf211274c587106$exports = {};\n$4bf211274c587106$exports = JSON.parse(\"{\\\"decrease\\\":\\\"Уменьшение {fieldLabel}\\\",\\\"increase\\\":\\\"Увеличение {fieldLabel}\\\",\\\"numberField\\\":\\\"Числовое поле\\\"}\");\n\n\nvar $5951afc4ac07f078$exports = {};\n$5951afc4ac07f078$exports = JSON.parse(\"{\\\"decrease\\\":\\\"Znížiť {fieldLabel}\\\",\\\"increase\\\":\\\"Zvýšiť {fieldLabel}\\\",\\\"numberField\\\":\\\"Číselné pole\\\"}\");\n\n\nvar $1340581fca173f3e$exports = {};\n$1340581fca173f3e$exports = JSON.parse(\"{\\\"decrease\\\":\\\"Upadati {fieldLabel}\\\",\\\"increase\\\":\\\"Povečajte {fieldLabel}\\\",\\\"numberField\\\":\\\"Številčno polje\\\"}\");\n\n\nvar $2b759d676253b2c8$exports = {};\n$2b759d676253b2c8$exports = JSON.parse(\"{\\\"decrease\\\":\\\"Decrease {fieldLabel}\\\",\\\"increase\\\":\\\"Increase {fieldLabel}\\\",\\\"numberField\\\":\\\"Number field\\\"}\");\n\n\nvar $b0c674a42fff90cb$exports = {};\n$b0c674a42fff90cb$exports = JSON.parse(\"{\\\"decrease\\\":\\\"Minska {fieldLabel}\\\",\\\"increase\\\":\\\"Öka {fieldLabel}\\\",\\\"numberField\\\":\\\"Nummerfält\\\"}\");\n\n\nvar $76371f1c7f27bc91$exports = {};\n$76371f1c7f27bc91$exports = JSON.parse(\"{\\\"decrease\\\":\\\"{fieldLabel} azalt\\\",\\\"increase\\\":\\\"{fieldLabel} arttır\\\",\\\"numberField\\\":\\\"Sayı alanı\\\"}\");\n\n\nvar $361acbd473fb967c$exports = {};\n$361acbd473fb967c$exports = JSON.parse(\"{\\\"decrease\\\":\\\"Зменшити {fieldLabel}\\\",\\\"increase\\\":\\\"Збільшити {fieldLabel}\\\",\\\"numberField\\\":\\\"Поле номера\\\"}\");\n\n\nvar $208c820c7d7354a7$exports = {};\n$208c820c7d7354a7$exports = JSON.parse(\"{\\\"decrease\\\":\\\"降低 {fieldLabel}\\\",\\\"increase\\\":\\\"提高 {fieldLabel}\\\",\\\"numberField\\\":\\\"数字字段\\\"}\");\n\n\nvar $e03c2cf780f9cea4$exports = {};\n$e03c2cf780f9cea4$exports = JSON.parse(\"{\\\"decrease\\\":\\\"縮小 {fieldLabel}\\\",\\\"increase\\\":\\\"放大 {fieldLabel}\\\",\\\"numberField\\\":\\\"數字欄位\\\"}\");\n\n\n$2dbd11b99107b9a3$exports = {\n    \"ar-AE\": $6549386043ae9318$exports,\n    \"bg-BG\": $e76bce23c5e8423e$exports,\n    \"cs-CZ\": $6129a2a27a7967ba$exports,\n    \"da-DK\": $52dac2657f2e7b91$exports,\n    \"de-DE\": $2d5c0936198b9a1d$exports,\n    \"el-GR\": $037bbc3daaf1c938$exports,\n    \"en-US\": $6f0e76066d1c5161$exports,\n    \"es-ES\": $ae410a5d2bee905f$exports,\n    \"et-EE\": $ba7e088ac7327440$exports,\n    \"fi-FI\": $16b3c05b733de903$exports,\n    \"fr-FR\": $e8b2524c965f690e$exports,\n    \"he-IL\": $a6493a4a0eba3e94$exports,\n    \"hr-HR\": $fc83409ad17dbb8e$exports,\n    \"hu-HU\": $7fbda66289952e59$exports,\n    \"it-IT\": $0ca9c2faa64e1737$exports,\n    \"ja-JP\": $40b39fb57e4e01eb$exports,\n    \"ko-KR\": $eb43f79428829329$exports,\n    \"lt-LT\": $8716579631e81e6b$exports,\n    \"lv-LV\": $fb4343b9e8e55d54$exports,\n    \"nb-NO\": $e1efff358f8fa070$exports,\n    \"nl-NL\": $78c91c3ffeb5bcda$exports,\n    \"pl-PL\": $847dfd0520968639$exports,\n    \"pt-BR\": $f4204c08266aeca6$exports,\n    \"pt-PT\": $d500387cf5000fdc$exports,\n    \"ro-RO\": $ab2719432eedc1bf$exports,\n    \"ru-RU\": $4bf211274c587106$exports,\n    \"sk-SK\": $5951afc4ac07f078$exports,\n    \"sl-SI\": $1340581fca173f3e$exports,\n    \"sr-SP\": $2b759d676253b2c8$exports,\n    \"sv-SE\": $b0c674a42fff90cb$exports,\n    \"tr-TR\": $76371f1c7f27bc91$exports,\n    \"uk-UA\": $361acbd473fb967c$exports,\n    \"zh-CN\": $208c820c7d7354a7$exports,\n    \"zh-TW\": $e03c2cf780f9cea4$exports\n};\n\n\n\n\n\n\n\nfunction $cf0c3bd5e1672ec9$export$23f548e970bdf099(props, state, inputRef) {\n    let { id: id , decrementAriaLabel: decrementAriaLabel , incrementAriaLabel: incrementAriaLabel , isDisabled: isDisabled , isReadOnly: isReadOnly , isRequired: isRequired , minValue: minValue , maxValue: maxValue , autoFocus: autoFocus , validationState: validationState , label: label , formatOptions: formatOptions , onBlur: onBlur , onFocus: onFocus , onFocusChange: onFocusChange , onKeyDown: onKeyDown , onKeyUp: onKeyUp , description: description , errorMessage: errorMessage  } = props;\n    let { increment: increment , incrementToMax: incrementToMax , decrement: decrement , decrementToMin: decrementToMin , numberValue: numberValue , commit: commit  } = state;\n    const formatMessage = $1eWaC$useMessageFormatter((/*@__PURE__*/$parcel$interopDefault($2dbd11b99107b9a3$exports)));\n    let inputId = $1eWaC$useId(id);\n    let { focusProps: focusProps  } = $1eWaC$useFocus({\n        onBlur: ()=>{\n            // Set input value to normalized valid value\n            commit();\n        }\n    });\n    let { spinButtonProps: spinButtonProps , incrementButtonProps: incButtonProps , decrementButtonProps: decButtonProps  } = $1eWaC$useSpinButton({\n        isDisabled: isDisabled,\n        isReadOnly: isReadOnly,\n        isRequired: isRequired,\n        maxValue: maxValue,\n        minValue: minValue,\n        onIncrement: increment,\n        onIncrementToMax: incrementToMax,\n        onDecrement: decrement,\n        onDecrementToMin: decrementToMin,\n        value: numberValue,\n        textValue: state.inputValue\n    });\n    let [focusWithin, setFocusWithin] = $1eWaC$useState(false);\n    let { focusWithinProps: focusWithinProps  } = $1eWaC$useFocusWithin({\n        isDisabled: isDisabled,\n        onFocusWithinChange: setFocusWithin\n    });\n    let onWheel = $1eWaC$useCallback((e)=>{\n        // if on a trackpad, users can scroll in both X and Y at once, check the magnitude of the change\n        // if it's mostly in the X direction, then just return, the user probably doesn't mean to inc/dec\n        // this isn't perfect, events come in fast with small deltas and a part of the scroll may give a false indication\n        // especially if the user is scrolling near 45deg\n        if (Math.abs(e.deltaY) <= Math.abs(e.deltaX)) return;\n        if (e.deltaY > 0) increment();\n        else if (e.deltaY < 0) decrement();\n    }, [\n        decrement,\n        increment\n    ]);\n    // If the input isn't supposed to receive input, disable scrolling.\n    let scrollingDisabled = isDisabled || isReadOnly || !focusWithin;\n    $1eWaC$useScrollWheel({\n        onScroll: onWheel,\n        isDisabled: scrollingDisabled\n    }, inputRef);\n    // The inputMode attribute influences the software keyboard that is shown on touch devices.\n    // Browsers and operating systems are quite inconsistent about what keys are available, however.\n    // We choose between numeric and decimal based on whether we allow negative and fractional numbers,\n    // and based on testing on various devices to determine what keys are available in each inputMode.\n    let numberFormatter = $1eWaC$useNumberFormatter(formatOptions);\n    let intlOptions = $1eWaC$useMemo(()=>numberFormatter.resolvedOptions()\n    , [\n        numberFormatter\n    ]);\n    let hasDecimals = intlOptions.maximumFractionDigits > 0;\n    let hasNegative = isNaN(state.minValue) || state.minValue < 0;\n    let inputMode = 'numeric';\n    if ($1eWaC$isIPhone()) {\n        // iPhone doesn't have a minus sign in either numeric or decimal.\n        // Note this is only for iPhone, not iPad, which always has both\n        // minus and decimal in numeric.\n        if (hasNegative) inputMode = 'text';\n        else if (hasDecimals) inputMode = 'decimal';\n    } else if ($1eWaC$isAndroid()) {\n        // Android numeric has both a decimal point and minus key.\n        // decimal does not have a minus key.\n        if (hasNegative) inputMode = 'numeric';\n        else if (hasDecimals) inputMode = 'decimal';\n    }\n    let onChange = (value)=>{\n        state.setInputValue(value);\n    };\n    let domProps = $1eWaC$filterDOMProps(props);\n    let { labelProps: labelProps , inputProps: textFieldProps , descriptionProps: descriptionProps , errorMessageProps: errorMessageProps  } = $1eWaC$useFormattedTextField({\n        ...domProps,\n        label: label,\n        autoFocus: autoFocus,\n        isDisabled: isDisabled,\n        isReadOnly: isReadOnly,\n        isRequired: isRequired,\n        validationState: validationState,\n        value: state.inputValue,\n        autoComplete: 'off',\n        'aria-label': props['aria-label'] || null,\n        'aria-labelledby': props['aria-labelledby'] || null,\n        id: inputId,\n        type: 'text',\n        inputMode: inputMode,\n        onChange: onChange,\n        onBlur: onBlur,\n        onFocus: onFocus,\n        onFocusChange: onFocusChange,\n        onKeyDown: onKeyDown,\n        onKeyUp: onKeyUp,\n        description: description,\n        errorMessage: errorMessage\n    }, state, inputRef);\n    let inputProps = $1eWaC$mergeProps(spinButtonProps, textFieldProps, focusProps, {\n        // override the spinbutton role, we can't focus a spin button with VO\n        role: null,\n        // ignore aria-roledescription on iOS so that required state will announce when it is present\n        'aria-roledescription': !$1eWaC$isIOS() ? formatMessage('numberField') : null,\n        'aria-valuemax': null,\n        'aria-valuemin': null,\n        'aria-valuenow': null,\n        'aria-valuetext': null,\n        autoCorrect: 'off',\n        spellCheck: 'false'\n    });\n    let onButtonPressStart = (e)=>{\n        // If focus is already on the input, keep it there so we don't hide the\n        // software keyboard when tapping the increment/decrement buttons.\n        if (document.activeElement === inputRef.current) return;\n        // Otherwise, when using a mouse, move focus to the input.\n        // On touch, or with a screen reader, focus the button so that the software\n        // keyboard does not appear and the screen reader cursor is not moved off the button.\n        if (e.pointerType === 'mouse') inputRef.current.focus();\n        else e.target.focus();\n    };\n    // Determine the label for the increment and decrement buttons. There are 4 cases:\n    //\n    // 1. With a visible label that is a string: aria-label: `Increase ${props.label}`\n    // 2. With a visible label that is JSX: aria-label: 'Increase', aria-labelledby: '${incrementId} ${labelId}'\n    // 3. With an aria-label: aria-label: `Increase ${props['aria-label']}`\n    // 4. With an aria-labelledby: aria-label: 'Increase', aria-labelledby: `${incrementId} ${props['aria-labelledby']}`\n    //\n    // (1) and (2) could possibly be combined and both use aria-labelledby. However, placing the label in\n    // the aria-label string rather than using aria-labelledby gives more flexibility to translators to change\n    // the order or add additional words around the label if needed.\n    let fieldLabel = props['aria-label'] || (typeof props.label === 'string' ? props.label : '');\n    let ariaLabelledby;\n    if (!fieldLabel) ariaLabelledby = props.label != null ? labelProps.id : props['aria-labelledby'];\n    let incrementId = $1eWaC$useId();\n    let decrementId = $1eWaC$useId();\n    let incrementButtonProps = $1eWaC$mergeProps(incButtonProps, {\n        'aria-label': incrementAriaLabel || formatMessage('increase', {\n            fieldLabel: fieldLabel\n        }).trim(),\n        id: ariaLabelledby && !incrementAriaLabel ? incrementId : null,\n        'aria-labelledby': ariaLabelledby && !incrementAriaLabel ? `${incrementId} ${ariaLabelledby}` : null,\n        'aria-controls': inputId,\n        excludeFromTabOrder: true,\n        preventFocusOnPress: true,\n        allowFocusWhenDisabled: true,\n        isDisabled: !state.canIncrement,\n        onPressStart: onButtonPressStart\n    });\n    let decrementButtonProps = $1eWaC$mergeProps(decButtonProps, {\n        'aria-label': decrementAriaLabel || formatMessage('decrease', {\n            fieldLabel: fieldLabel\n        }).trim(),\n        id: ariaLabelledby && !decrementAriaLabel ? decrementId : null,\n        'aria-labelledby': ariaLabelledby && !decrementAriaLabel ? `${decrementId} ${ariaLabelledby}` : null,\n        'aria-controls': inputId,\n        excludeFromTabOrder: true,\n        preventFocusOnPress: true,\n        allowFocusWhenDisabled: true,\n        isDisabled: !state.canDecrement,\n        onPressStart: onButtonPressStart\n    });\n    return {\n        groupProps: {\n            role: 'group',\n            'aria-disabled': isDisabled,\n            'aria-invalid': validationState === 'invalid' ? 'true' : undefined,\n            ...focusWithinProps\n        },\n        labelProps: labelProps,\n        inputProps: inputProps,\n        incrementButtonProps: incrementButtonProps,\n        decrementButtonProps: decrementButtonProps,\n        errorMessageProps: errorMessageProps,\n        descriptionProps: descriptionProps\n    };\n}\n\n\n\n\nexport {$cf0c3bd5e1672ec9$export$23f548e970bdf099 as useNumberField};\n//# sourceMappingURL=module.js.map\n","import clsx from 'clsx';\nimport {InputSize} from './input-size';\nimport {CommonInputFieldProps} from './input-field-props';\nimport {getIconSizeStyle} from '../../buttons/button-size';\n\nexport function inputFieldStyle(props: CommonInputFieldProps): {\n  label: string;\n  input: string;\n  wrapper: string;\n  adornment: string;\n  size: {font: string; height: string};\n} {\n  const {\n    size = 'md',\n    startAdornment,\n    endAdornment,\n    className,\n    inline,\n  } = {...props};\n  const sizeClass = inputSizeClass(size);\n\n  return {\n    label: clsx(\n      'block capitalize text-left',\n      sizeClass.font,\n      inline ? 'mr-16' : 'mb-4'\n    ),\n    input: clsx(\n      'text-left relative focus:ring focus:ring-primary/focus focus:border-primary/60 block w-full bg-transparent border rounded focus:outline-none shadow-sm appearance-none transition-shadow',\n      sizeClass.font,\n      sizeClass.height,\n      startAdornment ? 'pl-36' : 'pl-12',\n      endAdornment ? 'pr-36' : 'pr-12'\n    ),\n    adornment: getIconSizeStyle(size),\n    wrapper: clsx(className, sizeClass.font, {\n      'flex items-center': inline,\n    }),\n    size: sizeClass,\n  };\n}\n\nexport const DEFAULT_INPUT_FONT_SIZE = 'text-base';\n\nfunction inputSizeClass(size?: InputSize) {\n  switch (size) {\n    case 'xs':\n      return {font: 'text-xs', height: 'h-30'};\n    case 'sm':\n      return {font: 'text-sm', height: 'h-36'};\n    case 'lg':\n      return {font: 'text-lg', height: 'h-50'};\n    case 'xl':\n      return {font: 'text-xl', height: 'h-60'};\n    default:\n      return {font: DEFAULT_INPUT_FONT_SIZE, height: 'h-42'};\n  }\n}\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const KeyboardArrowUpIcon = createSvgIcon(\n  <path d=\"M7.41 15.41 12 10.83l4.59 4.58L18 14l-6-6-6 6 1.41 1.41z\" />\n, 'KeyboardArrowUpOutlined');\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const KeyboardArrowDownIcon = createSvgIcon(\n  <path d=\"M7.41 8.59 12 13.17l4.59-4.58L18 10l-6 6-6-6 1.41-1.41z\" />\n, 'KeyboardArrowDownOutlined');\n","import React, {ReactElement, useRef} from 'react';\nimport clsx from 'clsx';\nimport {useLocale} from '@react-aria/i18n';\nimport {useNumberFieldState} from '@react-stately/numberfield';\nimport {useNumberField} from '@react-aria/numberfield';\nimport {AriaNumberFieldProps} from '@react-types/numberfield';\nimport {CommonInputFieldProps} from './input-field-props';\nimport {inputFieldStyle} from './input-field-style';\nimport {IconButton} from '../../buttons/icon-button';\nimport {KeyboardArrowUpIcon} from '../../../icons/material/KeyboardArrowUp';\nimport {KeyboardArrowDownIcon} from '../../../icons/material/KeyboardArrowDown';\n\ninterface Props extends AriaNumberFieldProps, CommonInputFieldProps {}\nexport function NumberField(props: Props) {\n  const {label} = props;\n  const {locale} = useLocale();\n  const style = inputFieldStyle(props);\n  const state = useNumberFieldState({\n    ...props,\n    locale,\n  });\n  const inputRef = useRef<HTMLInputElement>(null);\n  const {\n    labelProps,\n    groupProps,\n    inputProps,\n    incrementButtonProps,\n    decrementButtonProps,\n  } = useNumberField(props, state, inputRef);\n\n  return (\n    <div className={style.wrapper}>\n      {label && (\n        // eslint-disable-next-line jsx-a11y/label-has-associated-control\n        <label className={style.label} {...labelProps}>\n          {label}\n        </label>\n      )}\n      <div className=\"relative\" {...groupProps}>\n        <input className={style.input} {...inputProps} ref={inputRef} />\n        <div className=\"absolute top-0 right-0 h-full flex flex-col items-center justify-center\">\n          <StepButton className=\"border-b\" {...incrementButtonProps}>\n            <KeyboardArrowUpIcon />\n          </StepButton>\n          <StepButton {...decrementButtonProps}>\n            <KeyboardArrowDownIcon />\n          </StepButton>\n        </div>\n      </div>\n    </div>\n  );\n}\n\ninterface StepButtonProps {\n  children: ReactElement;\n  className?: string;\n}\nfunction StepButton({children, className, ...other}: StepButtonProps) {\n  const mergedClassName = clsx(\n    className,\n    'flex flex-auto items-center border-l px-2 disabled:text-disabled'\n  );\n  return (\n    <IconButton\n      variant={null}\n      radius=\"rounded-none\"\n      className={mergedClassName}\n      {...other}\n    >\n      {children}\n    </IconButton>\n  );\n}\n","import React, {useEffect, useState} from 'react';\nimport {FormattedMessage} from 'react-intl';\nimport {useStore} from '../../../../state/store';\nimport {InteractableRect} from '../../../../common/ui/interactions/interactable-rect';\nimport {ResizeAction} from '../../../../common/ui/interactions/actions/resize-action';\nimport {NumberField} from '../../../../common/ui/inputs/input-field/number-field';\nimport {state, tools} from '../../../../state/utils';\n\nexport function CropInputFields() {\n  const width = useStore(s => s.crop.zoneRect?.width) || 1;\n  const height = useStore(s => s.crop.zoneRect?.height) || 1;\n\n  const [formVal, setFormVal] = useState({width, height});\n\n  // update inputs whenever cropzone size is changed via drag and drop\n  useEffect(() => {\n    const newWidth = Math.round(width / state().zoom);\n    const newHeight = Math.round(height / state().zoom);\n    setFormVal({width: newWidth, height: newHeight});\n  }, [width, height]);\n\n  const onInputChange = (value: number, dimension: 'width' | 'height') => {\n    const newValue = {\n      ...formVal,\n      // only allow numbers in input\n      [dimension]: value,\n    };\n    setFormVal(newValue);\n    onBlurAndSubmit(newValue);\n  };\n\n  const onBlurAndSubmit = (newValue?: {width: number; height: number}) => {\n    const value = newValue || formVal;\n    resizeCropzone(value.width, value.height);\n  };\n\n  return (\n    <form\n      className=\"flex items-center gap-12\"\n      onSubmit={e => {\n        e.preventDefault();\n        onBlurAndSubmit();\n      }}\n    >\n      <NumberField\n        size=\"xs\"\n        aria-label=\"Crop width\"\n        endAdornment={\n          <div className=\"text-muted font-bold text-xs\">\n            <FormattedMessage\n              defaultMessage=\"W\"\n              description=\"Width shorthand\"\n            />\n          </div>\n        }\n        minValue={1}\n        className=\"w-80\"\n        value={formVal.width}\n        formatOptions={{useGrouping: false}}\n        onChange={value => {\n          onInputChange(value, 'width');\n        }}\n      />\n      <NumberField\n        size=\"xs\"\n        aria-label=\"Crop height\"\n        endAdornment={\n          <div className=\"text-muted font-bold text-xs\">\n            <FormattedMessage\n              defaultMessage=\"H\"\n              description=\"Height shorthand\"\n            />\n          </div>\n        }\n        minValue={1}\n        className=\"w-80\"\n        value={formVal.height}\n        formatOptions={{useGrouping: false}}\n        onChange={value => {\n          onInputChange(value, 'height');\n        }}\n      />\n      <button type=\"submit\" className=\"hidden\">\n        <FormattedMessage defaultMessage=\"Resize\" />\n      </button>\n    </form>\n  );\n}\n\nfunction resizeCropzone(width: number, height: number) {\n  const interactable = tools().crop.zone;\n  if (!state().crop.zoneRect || !interactable) return;\n  const newRect: InteractableRect = {\n    ...state().crop.zoneRect!,\n    width: Math.round(Math.min(state().original.width, width) * state().zoom),\n    height: Math.round(\n      Math.min(state().original.height, height) * state().zoom\n    ),\n  };\n  const resizeAction = interactable.config.actions.find(\n    a => a instanceof ResizeAction\n  );\n  if (\n    (resizeAction && newRect.width !== interactable.currentRect.width) ||\n    newRect.height !== interactable.currentRect.height\n  ) {\n    interactable.executeAction(resizeAction!, {} as any, newRect);\n  }\n}\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const CheckIcon = createSvgIcon(\n  <path d=\"M9 16.17 4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41L9 16.17z\" />\n, 'CheckOutlined');\n","import React from 'react';\nimport {m} from 'framer-motion';\nimport {FormattedMessage} from 'react-intl';\nimport {useStore} from '../../state/store';\nimport {IconButton} from '../../common/ui/buttons/icon-button';\nimport {ToolName} from '../../tools/tool-name';\nimport {CropInputFields} from '../../tools/crop/ui/crop-nav/crop-input-fields';\nimport {toolbarAnimation, toolbarStyle} from './toolbar-style';\nimport {state} from '../../state/utils';\nimport {Button} from '../../common/ui/buttons/button';\nimport {CloseIcon} from '../../common/icons/material/Close';\nimport {CheckIcon} from '../../common/icons/material/Check';\nimport {useEditorMode} from '../editor-mode';\n\nexport function ActiveToolbar() {\n  const activeTool = useStore(s => s.activeTool);\n  return (\n    <m.div className={toolbarStyle} {...toolbarAnimation}>\n      <CancelButton />\n      {getToolName(activeTool)}\n      <ApplyButton />\n    </m.div>\n  );\n}\n\nfunction CancelButton() {\n  const {isMobile} = useEditorMode();\n  const isDirty = useStore(s => s.dirty);\n  if (isMobile) {\n    return (\n      <IconButton\n        size=\"sm\"\n        onPress={() => {\n          state().cancelChanges();\n        }}\n      >\n        <CloseIcon />\n      </IconButton>\n    );\n  }\n  return (\n    <Button\n      variant=\"outline\"\n      size=\"xs\"\n      startIcon={<CloseIcon />}\n      radius=\"rounded-full\"\n      onPress={() => {\n        state().cancelChanges();\n      }}\n    >\n      {isDirty ? (\n        <FormattedMessage defaultMessage=\"Cancel\" />\n      ) : (\n        <FormattedMessage defaultMessage=\"Close\" />\n      )}\n    </Button>\n  );\n}\n\nfunction getToolName(toolName: ToolName | null) {\n  const defaultCmp = <div className=\"capitalize text-sm\">{toolName}</div>;\n  switch (toolName) {\n    case ToolName.CROP: {\n      const allowCustom = state().config.tools?.crop?.allowCustomRatio ?? true;\n      if (allowCustom) {\n        return <CropInputFields />;\n      }\n      return defaultCmp;\n    }\n    default:\n      return defaultCmp;\n  }\n}\n\nfunction ApplyButton() {\n  const {isMobile} = useEditorMode();\n  const isDirty = useStore(s => s.dirty);\n  if (isMobile) {\n    return (\n      <IconButton\n        size=\"sm\"\n        isDisabled={!isDirty}\n        onPress={() => {\n          state().applyChanges();\n        }}\n      >\n        <CheckIcon />\n      </IconButton>\n    );\n  }\n  return (\n    <Button\n      variant=\"flat\"\n      color=\"primary\"\n      size=\"xs\"\n      isDisabled={!isDirty}\n      startIcon={<CheckIcon />}\n      radius=\"rounded-full\"\n      onPress={() => {\n        state().applyChanges();\n      }}\n    >\n      <FormattedMessage defaultMessage=\"Apply\" />\n    </Button>\n  );\n}\n","import {AnimatePresence} from 'framer-motion';\nimport {useStore} from '../../state/store';\nimport {MainToolbar} from './main-toolbar';\nimport {ActiveToolbar} from './active-toolbar';\n\nexport function ToolbarContainer() {\n  const activeTool = useStore(s => s.activeTool);\n\n  return (\n    <AnimatePresence initial={false}>\n      {activeTool ? (\n        <ActiveToolbar key=\"activeToolbar\" />\n      ) : (\n        <MainToolbar key=\"mainToolbar\" />\n      )}\n    </AnimatePresence>\n  );\n}\n","import React, {useEffect, useState} from 'react';\nimport {AnimatePresence, m} from 'framer-motion';\nimport {defineMessages, FormattedMessage} from 'react-intl';\nimport {useStore} from '../../state/store';\nimport {LoadingType} from '../../state/editor-state';\n\nconst messages = defineMessages({\n  newCanvas: {defaultMessage: 'Loading Canvas'},\n  mainImage: {defaultMessage: 'Loading Image'},\n  state: {defaultMessage: 'Loading State'},\n  merge: {defaultMessage: 'Processing Image'},\n});\n\nexport function LoadingIndicator() {\n  const [activeLoadState, setActiveLoadState] =\n    useState<LoadingType | false>(false);\n\n  useEffect(() => {\n    useStore.subscribe(\n      s => s.loading,\n      loadState => {\n        if (loadState) {\n          setActiveLoadState(loadState);\n        }\n      }\n    );\n  }, []);\n\n  return (\n    <AnimatePresence>\n      {activeLoadState && (\n        <m.div\n          initial={{y: '60%', opacity: 0}}\n          animate={{y: 0, opacity: 1}}\n          exit={{y: '-60%', opacity: 0}}\n          transition={{type: 'tween', duration: 0.3}}\n          onAnimationComplete={() => {\n            setTimeout(() => {\n              setActiveLoadState(false);\n            }, 400);\n          }}\n          className=\"absolute z-loading-indicator inset-0 m-auto p-6 w-144 h-32 text-center text-sm bg-paper rounded-full shadow-lg\"\n        >\n          <FormattedMessage {...messages[activeLoadState]} />\n        </m.div>\n      )}\n    </AnimatePresence>\n  );\n}\n","function clamp(v, min, max) {\n  return Math.max(min, Math.min(v, max));\n}\nconst V = {\n  toVector(v, fallback) {\n    if (v === undefined) v = fallback;\n    return Array.isArray(v) ? v : [v, v];\n  },\n\n  add(v1, v2) {\n    return [v1[0] + v2[0], v1[1] + v2[1]];\n  },\n\n  sub(v1, v2) {\n    return [v1[0] - v2[0], v1[1] - v2[1]];\n  },\n\n  addTo(v1, v2) {\n    v1[0] += v2[0];\n    v1[1] += v2[1];\n  },\n\n  subTo(v1, v2) {\n    v1[0] -= v2[0];\n    v1[1] -= v2[1];\n  }\n\n};\n\nfunction rubberband(distance, dimension, constant) {\n  if (dimension === 0 || Math.abs(dimension) === Infinity) return Math.pow(distance, constant * 5);\n  return distance * dimension * constant / (dimension + constant * distance);\n}\n\nfunction rubberbandIfOutOfBounds(position, min, max, constant = 0.15) {\n  if (constant === 0) return clamp(position, min, max);\n  if (position < min) return -rubberband(min - position, max - min, constant) + min;\n  if (position > max) return +rubberband(position - max, max - min, constant) + max;\n  return position;\n}\nfunction computeRubberband(bounds, [Vx, Vy], [Rx, Ry]) {\n  const [[X0, X1], [Y0, Y1]] = bounds;\n  return [rubberbandIfOutOfBounds(Vx, X0, X1, Rx), rubberbandIfOutOfBounds(Vy, Y0, Y1, Ry)];\n}\n\nexport { V, computeRubberband as c, rubberbandIfOutOfBounds as r };\n","import { V, c as computeRubberband } from './maths-b2a210f4.esm.js';\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 ownKeys(object, enumerableOnly) {\n  var keys = Object.keys(object);\n\n  if (Object.getOwnPropertySymbols) {\n    var symbols = Object.getOwnPropertySymbols(object);\n    enumerableOnly && (symbols = symbols.filter(function (sym) {\n      return Object.getOwnPropertyDescriptor(object, sym).enumerable;\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 = null != arguments[i] ? arguments[i] : {};\n    i % 2 ? ownKeys(Object(source), !0).forEach(function (key) {\n      _defineProperty(target, key, source[key]);\n    }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) {\n      Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n    });\n  }\n\n  return target;\n}\n\nconst EVENT_TYPE_MAP = {\n  pointer: {\n    start: 'down',\n    change: 'move',\n    end: 'up'\n  },\n  mouse: {\n    start: 'down',\n    change: 'move',\n    end: 'up'\n  },\n  touch: {\n    start: 'start',\n    change: 'move',\n    end: 'end'\n  },\n  gesture: {\n    start: 'start',\n    change: 'change',\n    end: 'end'\n  }\n};\n\nfunction capitalize(string) {\n  if (!string) return '';\n  return string[0].toUpperCase() + string.slice(1);\n}\n\nfunction toHandlerProp(device, action = '', capture = false) {\n  const deviceProps = EVENT_TYPE_MAP[device];\n  const actionKey = deviceProps ? deviceProps[action] || action : action;\n  return 'on' + capitalize(device) + capitalize(actionKey) + (capture ? 'Capture' : '');\n}\nconst pointerCaptureEvents = ['gotpointercapture', 'lostpointercapture'];\nfunction parseProp(prop) {\n  let eventKey = prop.substring(2).toLowerCase();\n  const passive = !!~eventKey.indexOf('passive');\n  if (passive) eventKey = eventKey.replace('passive', '');\n  const captureKey = pointerCaptureEvents.includes(eventKey) ? 'capturecapture' : 'capture';\n  const capture = !!~eventKey.indexOf(captureKey);\n  if (capture) eventKey = eventKey.replace('capture', '');\n  return {\n    device: eventKey,\n    capture,\n    passive\n  };\n}\nfunction toDomEventType(device, action = '') {\n  const deviceProps = EVENT_TYPE_MAP[device];\n  const actionKey = deviceProps ? deviceProps[action] || action : action;\n  return device + actionKey;\n}\nfunction isTouch(event) {\n  return 'touches' in event;\n}\n\nfunction getCurrentTargetTouchList(event) {\n  return Array.from(event.touches).filter(e => {\n    var _event$currentTarget, _event$currentTarget$;\n\n    return e.target === event.currentTarget || ((_event$currentTarget = event.currentTarget) === null || _event$currentTarget === void 0 ? void 0 : (_event$currentTarget$ = _event$currentTarget.contains) === null || _event$currentTarget$ === void 0 ? void 0 : _event$currentTarget$.call(_event$currentTarget, e.target));\n  });\n}\n\nfunction getTouchList(event) {\n  return event.type === 'touchend' || event.type === 'touchcancel' ? event.changedTouches : event.targetTouches;\n}\n\nfunction getValueEvent(event) {\n  return isTouch(event) ? getTouchList(event)[0] : event;\n}\n\nfunction distanceAngle(P1, P2) {\n  const dx = P2.clientX - P1.clientX;\n  const dy = P2.clientY - P1.clientY;\n  const cx = (P2.clientX + P1.clientX) / 2;\n  const cy = (P2.clientY + P1.clientY) / 2;\n  const distance = Math.hypot(dx, dy);\n  const angle = -(Math.atan2(dx, dy) * 180) / Math.PI;\n  const origin = [cx, cy];\n  return {\n    angle,\n    distance,\n    origin\n  };\n}\nfunction touchIds(event) {\n  return getCurrentTargetTouchList(event).map(touch => touch.identifier);\n}\nfunction touchDistanceAngle(event, ids) {\n  const [P1, P2] = Array.from(event.touches).filter(touch => ids.includes(touch.identifier));\n  return distanceAngle(P1, P2);\n}\nfunction pointerId(event) {\n  const valueEvent = getValueEvent(event);\n  return isTouch(event) ? valueEvent.identifier : valueEvent.pointerId;\n}\nfunction pointerValues(event) {\n  const valueEvent = getValueEvent(event);\n  return [valueEvent.clientX, valueEvent.clientY];\n}\nconst LINE_HEIGHT = 40;\nconst PAGE_HEIGHT = 800;\nfunction wheelValues(event) {\n  let {\n    deltaX,\n    deltaY,\n    deltaMode\n  } = event;\n\n  if (deltaMode === 1) {\n    deltaX *= LINE_HEIGHT;\n    deltaY *= LINE_HEIGHT;\n  } else if (deltaMode === 2) {\n    deltaX *= PAGE_HEIGHT;\n    deltaY *= PAGE_HEIGHT;\n  }\n\n  return [deltaX, deltaY];\n}\nfunction scrollValues(event) {\n  var _ref, _ref2;\n\n  const {\n    scrollX,\n    scrollY,\n    scrollLeft,\n    scrollTop\n  } = event.currentTarget;\n  return [(_ref = scrollX !== null && scrollX !== void 0 ? scrollX : scrollLeft) !== null && _ref !== void 0 ? _ref : 0, (_ref2 = scrollY !== null && scrollY !== void 0 ? scrollY : scrollTop) !== null && _ref2 !== void 0 ? _ref2 : 0];\n}\nfunction getEventDetails(event) {\n  const payload = {};\n  if ('buttons' in event) payload.buttons = event.buttons;\n\n  if ('shiftKey' in event) {\n    const {\n      shiftKey,\n      altKey,\n      metaKey,\n      ctrlKey\n    } = event;\n    Object.assign(payload, {\n      shiftKey,\n      altKey,\n      metaKey,\n      ctrlKey\n    });\n  }\n\n  return payload;\n}\n\nfunction call(v, ...args) {\n  if (typeof v === 'function') {\n    return v(...args);\n  } else {\n    return v;\n  }\n}\nfunction noop() {}\nfunction chain(...fns) {\n  if (fns.length === 0) return noop;\n  if (fns.length === 1) return fns[0];\n  return function () {\n    let result;\n\n    for (const fn of fns) {\n      result = fn.apply(this, arguments) || result;\n    }\n\n    return result;\n  };\n}\nfunction assignDefault(value, fallback) {\n  return Object.assign({}, fallback, value || {});\n}\n\nconst BEFORE_LAST_KINEMATICS_DELAY = 32;\nclass Engine {\n  constructor(ctrl, args, key) {\n    this.ctrl = ctrl;\n    this.args = args;\n    this.key = key;\n\n    if (!this.state) {\n      this.state = {};\n      this.computeValues([0, 0]);\n      this.computeInitial();\n      if (this.init) this.init();\n      this.reset();\n    }\n  }\n\n  get state() {\n    return this.ctrl.state[this.key];\n  }\n\n  set state(state) {\n    this.ctrl.state[this.key] = state;\n  }\n\n  get shared() {\n    return this.ctrl.state.shared;\n  }\n\n  get eventStore() {\n    return this.ctrl.gestureEventStores[this.key];\n  }\n\n  get timeoutStore() {\n    return this.ctrl.gestureTimeoutStores[this.key];\n  }\n\n  get config() {\n    return this.ctrl.config[this.key];\n  }\n\n  get sharedConfig() {\n    return this.ctrl.config.shared;\n  }\n\n  get handler() {\n    return this.ctrl.handlers[this.key];\n  }\n\n  reset() {\n    const {\n      state,\n      shared,\n      ingKey,\n      args\n    } = this;\n    shared[ingKey] = state._active = state.active = state._blocked = state._force = false;\n    state._step = [false, false];\n    state.intentional = false;\n    state._movement = [0, 0];\n    state._distance = [0, 0];\n    state._direction = [0, 0];\n    state._delta = [0, 0];\n    state._bounds = [[-Infinity, Infinity], [-Infinity, Infinity]];\n    state.args = args;\n    state.axis = undefined;\n    state.memo = undefined;\n    state.elapsedTime = 0;\n    state.direction = [0, 0];\n    state.distance = [0, 0];\n    state.overflow = [0, 0];\n    state._movementBound = [false, false];\n    state.velocity = [0, 0];\n    state.movement = [0, 0];\n    state.delta = [0, 0];\n    state.timeStamp = 0;\n  }\n\n  start(event) {\n    const state = this.state;\n    const config = this.config;\n\n    if (!state._active) {\n      this.reset();\n      this.computeInitial();\n      state._active = true;\n      state.target = event.target;\n      state.currentTarget = event.currentTarget;\n      state.lastOffset = config.from ? call(config.from, state) : state.offset;\n      state.offset = state.lastOffset;\n    }\n\n    state.startTime = state.timeStamp = event.timeStamp;\n  }\n\n  computeValues(values) {\n    const state = this.state;\n    state._values = values;\n    state.values = this.config.transform(values);\n  }\n\n  computeInitial() {\n    const state = this.state;\n    state._initial = state._values;\n    state.initial = state.values;\n  }\n\n  compute(event) {\n    const {\n      state,\n      config,\n      shared\n    } = this;\n    state.args = this.args;\n    let dt = 0;\n\n    if (event) {\n      state.event = event;\n      if (config.preventDefault && event.cancelable) state.event.preventDefault();\n      state.type = event.type;\n      shared.touches = this.ctrl.pointerIds.size || this.ctrl.touchIds.size;\n      shared.locked = !!document.pointerLockElement;\n      Object.assign(shared, getEventDetails(event));\n      shared.down = shared.pressed = shared.buttons % 2 === 1 || shared.touches > 0;\n      dt = event.timeStamp - state.timeStamp;\n      state.timeStamp = event.timeStamp;\n      state.elapsedTime = state.timeStamp - state.startTime;\n    }\n\n    if (state._active) {\n      const _absoluteDelta = state._delta.map(Math.abs);\n\n      V.addTo(state._distance, _absoluteDelta);\n    }\n\n    const [_m0, _m1] = state._movement;\n    const [t0, t1] = config.threshold;\n    const {\n      _step,\n      values\n    } = state;\n\n    if (config.hasCustomTransform) {\n      if (_step[0] === false) _step[0] = Math.abs(_m0) >= t0 && values[0];\n      if (_step[1] === false) _step[1] = Math.abs(_m1) >= t1 && values[1];\n    } else {\n      if (_step[0] === false) _step[0] = Math.abs(_m0) >= t0 && Math.sign(_m0) * t0;\n      if (_step[1] === false) _step[1] = Math.abs(_m1) >= t1 && Math.sign(_m1) * t1;\n    }\n\n    state.intentional = _step[0] !== false || _step[1] !== false;\n    if (!state.intentional) return;\n    const movement = [0, 0];\n\n    if (config.hasCustomTransform) {\n      const [v0, v1] = values;\n      movement[0] = _step[0] !== false ? v0 - _step[0] : 0;\n      movement[1] = _step[1] !== false ? v1 - _step[1] : 0;\n    } else {\n      movement[0] = _step[0] !== false ? _m0 - _step[0] : 0;\n      movement[1] = _step[1] !== false ? _m1 - _step[1] : 0;\n    }\n\n    if (this.intent) this.intent(movement);\n\n    if (state._active && !state._blocked || state.active) {\n      state.first = state._active && !state.active;\n      state.last = !state._active && state.active;\n      state.active = shared[this.ingKey] = state._active;\n\n      if (event) {\n        if (state.first) {\n          if ('bounds' in config) state._bounds = call(config.bounds, state);\n          if (this.setup) this.setup();\n        }\n\n        state.movement = movement;\n        const previousOffset = state.offset;\n        this.computeOffset();\n\n        if (!state.last || dt > BEFORE_LAST_KINEMATICS_DELAY) {\n          state.delta = V.sub(state.offset, previousOffset);\n          const absoluteDelta = state.delta.map(Math.abs);\n          V.addTo(state.distance, absoluteDelta);\n          state.direction = state.delta.map(Math.sign);\n          state._direction = state._delta.map(Math.sign);\n\n          if (!state.first && dt > 0) {\n            state.velocity = [absoluteDelta[0] / dt, absoluteDelta[1] / dt];\n          }\n        }\n      }\n    }\n\n    const [ox, oy] = state.offset;\n    const [[x0, x1], [y0, y1]] = state._bounds;\n    state.overflow = [ox < x0 ? -1 : ox > x1 ? 1 : 0, oy < y0 ? -1 : oy > y1 ? 1 : 0];\n    state._movementBound[0] = state.overflow[0] ? state._movementBound[0] === false ? state._movement[0] : state._movementBound[0] : false;\n    state._movementBound[1] = state.overflow[1] ? state._movementBound[1] === false ? state._movement[1] : state._movementBound[1] : false;\n    const rubberband = state._active ? config.rubberband || [0, 0] : [0, 0];\n    state.offset = computeRubberband(state._bounds, state.offset, rubberband);\n    this.computeMovement();\n  }\n\n  emit() {\n    const state = this.state;\n    const shared = this.shared;\n    const config = this.config;\n    if (!state._active) this.clean();\n    if ((state._blocked || !state.intentional) && !state._force && !config.triggerAllEvents) return;\n    const memo = this.handler(_objectSpread2(_objectSpread2(_objectSpread2({}, shared), state), {}, {\n      [this.aliasKey]: state.values\n    }));\n    if (memo !== undefined) state.memo = memo;\n  }\n\n  clean() {\n    this.eventStore.clean();\n    this.timeoutStore.clean();\n  }\n\n}\n\nfunction selectAxis([dx, dy]) {\n  const d = Math.abs(dx) - Math.abs(dy);\n  if (d > 0) return 'x';\n  if (d < 0) return 'y';\n  return undefined;\n}\n\nfunction restrictVectorToAxis(v, axis) {\n  switch (axis) {\n    case 'x':\n      v[1] = 0;\n      break;\n\n    case 'y':\n      v[0] = 0;\n      break;\n  }\n}\n\nclass CoordinatesEngine extends Engine {\n  constructor(...args) {\n    super(...args);\n\n    _defineProperty(this, \"aliasKey\", 'xy');\n  }\n\n  reset() {\n    super.reset();\n    this.state.axis = undefined;\n  }\n\n  init() {\n    this.state.offset = [0, 0];\n    this.state.lastOffset = [0, 0];\n  }\n\n  computeOffset() {\n    this.state.offset = V.add(this.state.lastOffset, this.state.movement);\n  }\n\n  computeMovement() {\n    this.state.movement = V.sub(this.state.offset, this.state.lastOffset);\n  }\n\n  intent(v) {\n    this.state.axis = this.state.axis || selectAxis(v);\n    this.state._blocked = (this.config.lockDirection || !!this.config.axis) && !this.state.axis || !!this.config.axis && this.config.axis !== this.state.axis;\n    if (this.state._blocked) return;\n\n    if (this.config.axis || this.config.lockDirection) {\n      restrictVectorToAxis(v, this.state.axis);\n    }\n  }\n\n}\n\nconst identity = v => v;\nconst DEFAULT_RUBBERBAND = 0.15;\nconst commonConfigResolver = {\n  enabled(value = true) {\n    return value;\n  },\n\n  preventDefault(value = false) {\n    return value;\n  },\n\n  triggerAllEvents(value = false) {\n    return value;\n  },\n\n  rubberband(value = 0) {\n    switch (value) {\n      case true:\n        return [DEFAULT_RUBBERBAND, DEFAULT_RUBBERBAND];\n\n      case false:\n        return [0, 0];\n\n      default:\n        return V.toVector(value);\n    }\n  },\n\n  from(value) {\n    if (typeof value === 'function') return value;\n    if (value != null) return V.toVector(value);\n  },\n\n  transform(value, _k, config) {\n    const transform = value || config.shared.transform;\n    this.hasCustomTransform = !!transform;\n\n    if (process.env.NODE_ENV === 'development') {\n      const originalTransform = transform || identity;\n      return v => {\n        const r = originalTransform(v);\n\n        if (!isFinite(r[0]) || !isFinite(r[1])) {\n          console.warn(`[@use-gesture]: config.transform() must produce a valid result, but it was: [${r[0]},${[1]}]`);\n        }\n\n        return r;\n      };\n    }\n\n    return transform || identity;\n  },\n\n  threshold(value) {\n    return V.toVector(value, 0);\n  }\n\n};\n\nif (process.env.NODE_ENV === 'development') {\n  Object.assign(commonConfigResolver, {\n    domTarget(value) {\n      if (value !== undefined) {\n        throw Error(`[@use-gesture]: \\`domTarget\\` option has been renamed to \\`target\\`.`);\n      }\n\n      return NaN;\n    },\n\n    lockDirection(value) {\n      if (value !== undefined) {\n        throw Error(`[@use-gesture]: \\`lockDirection\\` option has been merged with \\`axis\\`. Use it as in \\`{ axis: 'lock' }\\``);\n      }\n\n      return NaN;\n    },\n\n    initial(value) {\n      if (value !== undefined) {\n        throw Error(`[@use-gesture]: \\`initial\\` option has been renamed to \\`from\\`.`);\n      }\n\n      return NaN;\n    }\n\n  });\n}\n\nconst coordinatesConfigResolver = _objectSpread2(_objectSpread2({}, commonConfigResolver), {}, {\n  axis(_v, _k, {\n    axis\n  }) {\n    this.lockDirection = axis === 'lock';\n    if (!this.lockDirection) return axis;\n  },\n\n  bounds(value = {}) {\n    if (typeof value === 'function') {\n      return state => coordinatesConfigResolver.bounds(value(state));\n    }\n\n    if ('current' in value) {\n      return () => value.current;\n    }\n\n    if (typeof HTMLElement === 'function' && value instanceof HTMLElement) {\n      return value;\n    }\n\n    const {\n      left = -Infinity,\n      right = Infinity,\n      top = -Infinity,\n      bottom = Infinity\n    } = value;\n    return [[left, right], [top, bottom]];\n  }\n\n});\n\nconst DISPLACEMENT = 10;\nconst KEYS_DELTA_MAP = {\n  ArrowRight: (factor = 1) => [DISPLACEMENT * factor, 0],\n  ArrowLeft: (factor = 1) => [-DISPLACEMENT * factor, 0],\n  ArrowUp: (factor = 1) => [0, -DISPLACEMENT * factor],\n  ArrowDown: (factor = 1) => [0, DISPLACEMENT * factor]\n};\nclass DragEngine extends CoordinatesEngine {\n  constructor(...args) {\n    super(...args);\n\n    _defineProperty(this, \"ingKey\", 'dragging');\n  }\n\n  reset() {\n    super.reset();\n    const state = this.state;\n    state._pointerId = undefined;\n    state._pointerActive = false;\n    state._keyboardActive = false;\n    state._preventScroll = false;\n    state._delayed = false;\n    state.swipe = [0, 0];\n    state.tap = false;\n    state.canceled = false;\n    state.cancel = this.cancel.bind(this);\n  }\n\n  setup() {\n    const state = this.state;\n\n    if (state._bounds instanceof HTMLElement) {\n      const boundRect = state._bounds.getBoundingClientRect();\n\n      const targetRect = state.currentTarget.getBoundingClientRect();\n      const _bounds = {\n        left: boundRect.left - targetRect.left + state.offset[0],\n        right: boundRect.right - targetRect.right + state.offset[0],\n        top: boundRect.top - targetRect.top + state.offset[1],\n        bottom: boundRect.bottom - targetRect.bottom + state.offset[1]\n      };\n      state._bounds = coordinatesConfigResolver.bounds(_bounds);\n    }\n  }\n\n  cancel() {\n    const state = this.state;\n    if (state.canceled) return;\n    state.canceled = true;\n    state._active = false;\n    setTimeout(() => {\n      this.compute();\n      this.emit();\n    }, 0);\n  }\n\n  setActive() {\n    this.state._active = this.state._pointerActive || this.state._keyboardActive;\n  }\n\n  clean() {\n    this.pointerClean();\n    this.state._pointerActive = false;\n    this.state._keyboardActive = false;\n    super.clean();\n  }\n\n  pointerDown(event) {\n    const config = this.config;\n    const state = this.state;\n    if (event.buttons != null && (Array.isArray(config.pointerButtons) ? !config.pointerButtons.includes(event.buttons) : config.pointerButtons !== -1 && config.pointerButtons !== event.buttons)) return;\n    this.ctrl.setEventIds(event);\n\n    if (config.pointerCapture) {\n      event.target.setPointerCapture(event.pointerId);\n    }\n\n    if (state._pointerActive) return;\n    this.start(event);\n    this.setupPointer(event);\n    state._pointerId = pointerId(event);\n    state._pointerActive = true;\n    this.computeValues(pointerValues(event));\n    this.computeInitial();\n\n    if (config.preventScroll) {\n      this.setupScrollPrevention(event);\n    } else if (config.delay > 0) {\n      this.setupDelayTrigger(event);\n    } else {\n      this.startPointerDrag(event);\n    }\n  }\n\n  startPointerDrag(event) {\n    const state = this.state;\n    state._active = true;\n    state._preventScroll = true;\n    state._delayed = false;\n    this.compute(event);\n    this.emit();\n  }\n\n  pointerMove(event) {\n    const state = this.state;\n    const config = this.config;\n    if (!state._pointerActive) return;\n    if (state.type === event.type && event.timeStamp === state.timeStamp) return;\n    const id = pointerId(event);\n    if (state._pointerId && id !== state._pointerId) return;\n\n    const _values = pointerValues(event);\n\n    if (document.pointerLockElement === event.target) {\n      state._delta = [event.movementX, event.movementY];\n    } else {\n      state._delta = V.sub(_values, state._values);\n      this.computeValues(_values);\n    }\n\n    V.addTo(state._movement, state._delta);\n    this.compute(event);\n\n    if (state._delayed) {\n      this.timeoutStore.remove('dragDelay');\n      state.active = false;\n      this.startPointerDrag(event);\n      return;\n    }\n\n    if (config.preventScroll && !state._preventScroll) {\n      if (state.axis) {\n        if (state.axis === config.preventScrollAxis || config.preventScrollAxis === 'xy') {\n          state._active = false;\n          this.clean();\n          return;\n        } else {\n          this.timeoutStore.remove('startPointerDrag');\n          this.startPointerDrag(event);\n          return;\n        }\n      } else {\n        return;\n      }\n    }\n\n    this.emit();\n  }\n\n  pointerUp(event) {\n    this.ctrl.setEventIds(event);\n\n    try {\n      if (this.config.pointerCapture && event.target.hasPointerCapture(event.pointerId)) {\n        ;\n        event.target.releasePointerCapture(event.pointerId);\n      }\n    } catch (_unused) {\n      if (process.env.NODE_ENV === 'development') {\n        console.warn(`[@use-gesture]: If you see this message, it's likely that you're using an outdated version of \\`@react-three/fiber\\`. \\n\\nPlease upgrade to the latest version.`);\n      }\n    }\n\n    const state = this.state;\n    const config = this.config;\n    if (!state._pointerActive) return;\n    const id = pointerId(event);\n    if (state._pointerId && id !== state._pointerId) return;\n    this.state._pointerActive = false;\n    this.setActive();\n    this.compute(event);\n    const [dx, dy] = state._distance;\n    state.tap = dx <= config.tapsThreshold && dy <= config.tapsThreshold;\n\n    if (state.tap && config.filterTaps) {\n      state._force = true;\n    } else {\n      const [dirx, diry] = state.direction;\n      const [vx, vy] = state.velocity;\n      const [mx, my] = state.movement;\n      const [svx, svy] = config.swipe.velocity;\n      const [sx, sy] = config.swipe.distance;\n      const sdt = config.swipe.duration;\n\n      if (state.elapsedTime < sdt) {\n        if (Math.abs(vx) > svx && Math.abs(mx) > sx) state.swipe[0] = dirx;\n        if (Math.abs(vy) > svy && Math.abs(my) > sy) state.swipe[1] = diry;\n      }\n    }\n\n    this.emit();\n  }\n\n  pointerClick(event) {\n    if (!this.state.tap) {\n      event.preventDefault();\n      event.stopPropagation();\n    }\n  }\n\n  setupPointer(event) {\n    const config = this.config;\n    let device = config.device;\n\n    if (process.env.NODE_ENV === 'development') {\n      try {\n        if (device === 'pointer') {\n          const currentTarget = 'uv' in event ? event.sourceEvent.currentTarget : event.currentTarget;\n          const style = window.getComputedStyle(currentTarget);\n\n          if (style.touchAction === 'auto') {\n            console.warn(`[@use-gesture]: The drag target has its \\`touch-action\\` style property set to \\`auto\\`. It is recommended to add \\`touch-action: 'none'\\` so that the drag gesture behaves correctly on touch-enabled devices. For more information read this: https://use-gesture.netlify.app/docs/extras/#touch-action.\\n\\nThis message will only show in development mode. It won't appear in production. If this is intended, you can ignore it.`, currentTarget);\n          }\n        }\n      } catch (_unused2) {}\n    }\n\n    if (config.pointerLock) {\n      event.currentTarget.requestPointerLock();\n    }\n\n    if (!config.pointerCapture) {\n      this.eventStore.add(this.sharedConfig.window, device, 'change', this.pointerMove.bind(this));\n      this.eventStore.add(this.sharedConfig.window, device, 'end', this.pointerUp.bind(this));\n      this.eventStore.add(this.sharedConfig.window, device, 'cancel', this.pointerUp.bind(this));\n    }\n  }\n\n  pointerClean() {\n    if (this.config.pointerLock && document.pointerLockElement === this.state.currentTarget) {\n      document.exitPointerLock();\n    }\n  }\n\n  preventScroll(event) {\n    if (this.state._preventScroll && event.cancelable) {\n      event.preventDefault();\n    }\n  }\n\n  setupScrollPrevention(event) {\n    persistEvent(event);\n    this.eventStore.add(this.sharedConfig.window, 'touch', 'change', this.preventScroll.bind(this), {\n      passive: false\n    });\n    this.eventStore.add(this.sharedConfig.window, 'touch', 'end', this.clean.bind(this), {\n      passive: false\n    });\n    this.eventStore.add(this.sharedConfig.window, 'touch', 'cancel', this.clean.bind(this), {\n      passive: false\n    });\n    this.timeoutStore.add('startPointerDrag', this.startPointerDrag.bind(this), this.config.preventScroll, event);\n  }\n\n  setupDelayTrigger(event) {\n    this.state._delayed = true;\n    this.timeoutStore.add('dragDelay', this.startPointerDrag.bind(this), this.config.delay, event);\n  }\n\n  keyDown(event) {\n    const deltaFn = KEYS_DELTA_MAP[event.key];\n\n    if (deltaFn) {\n      const state = this.state;\n      const factor = event.shiftKey ? 10 : event.altKey ? 0.1 : 1;\n      state._delta = deltaFn(factor);\n      this.start(event);\n      state._keyboardActive = true;\n      V.addTo(state._movement, state._delta);\n      this.compute(event);\n      this.emit();\n    }\n  }\n\n  keyUp(event) {\n    if (!(event.key in KEYS_DELTA_MAP)) return;\n    this.state._keyboardActive = false;\n    this.setActive();\n    this.compute(event);\n    this.emit();\n  }\n\n  bind(bindFunction) {\n    const device = this.config.device;\n    bindFunction(device, 'start', this.pointerDown.bind(this));\n\n    if (this.config.pointerCapture) {\n      bindFunction(device, 'change', this.pointerMove.bind(this));\n      bindFunction(device, 'end', this.pointerUp.bind(this));\n      bindFunction(device, 'cancel', this.pointerUp.bind(this));\n      bindFunction('lostPointerCapture', '', this.pointerUp.bind(this));\n    }\n\n    bindFunction('key', 'down', this.keyDown.bind(this));\n    bindFunction('key', 'up', this.keyUp.bind(this));\n\n    if (this.config.filterTaps) {\n      bindFunction('click', '', this.pointerClick.bind(this), {\n        capture: true,\n        passive: false\n      });\n    }\n  }\n\n}\n\nfunction persistEvent(event) {\n  'persist' in event && typeof event.persist === 'function' && event.persist();\n}\n\nconst isBrowser = typeof window !== 'undefined' && window.document && window.document.createElement;\n\nfunction supportsTouchEvents() {\n  return isBrowser && 'ontouchstart' in window;\n}\n\nfunction isTouchScreen() {\n  return supportsTouchEvents() || isBrowser && window.navigator.maxTouchPoints > 1;\n}\n\nfunction supportsPointerEvents() {\n  return isBrowser && 'onpointerdown' in window;\n}\n\nfunction supportsPointerLock() {\n  return isBrowser && 'exitPointerLock' in window.document;\n}\n\nfunction supportsGestureEvents() {\n  try {\n    return 'constructor' in GestureEvent;\n  } catch (e) {\n    return false;\n  }\n}\n\nconst SUPPORT = {\n  isBrowser,\n  gesture: supportsGestureEvents(),\n  touch: isTouchScreen(),\n  touchscreen: isTouchScreen(),\n  pointer: supportsPointerEvents(),\n  pointerLock: supportsPointerLock()\n};\n\nconst DEFAULT_PREVENT_SCROLL_DELAY = 250;\nconst DEFAULT_DRAG_DELAY = 180;\nconst DEFAULT_SWIPE_VELOCITY = 0.5;\nconst DEFAULT_SWIPE_DISTANCE = 50;\nconst DEFAULT_SWIPE_DURATION = 250;\nconst dragConfigResolver = _objectSpread2(_objectSpread2({}, coordinatesConfigResolver), {}, {\n  pointerLock(_v, _k, {\n    pointer: {\n      lock = false,\n      touch = false\n    } = {}\n  }) {\n    this.useTouch = touch && SUPPORT.touch;\n    return lock && SUPPORT.pointerLock;\n  },\n\n  device(_v, _k) {\n    if (this.useTouch) return 'touch';\n    if (this.pointerLock) return 'mouse';\n    if (SUPPORT.pointer) return 'pointer';\n    if (SUPPORT.touch) return 'touch';\n    return 'mouse';\n  },\n\n  preventScroll(value = false, _k, {\n    preventScrollAxis = 'y'\n  }) {\n    if (preventScrollAxis) this.preventScrollAxis = preventScrollAxis;\n    if (!SUPPORT.touchscreen) return false;\n    if (typeof value === 'number') return value;\n    return value ? DEFAULT_PREVENT_SCROLL_DELAY : false;\n  },\n\n  pointerCapture(_v, _k, {\n    pointer: {\n      capture = true,\n      buttons = 1\n    } = {}\n  }) {\n    this.pointerButtons = buttons;\n    return !this.pointerLock && this.device === 'pointer' && capture;\n  },\n\n  threshold(value, _k, {\n    filterTaps = false,\n    tapsThreshold = 3,\n    axis = undefined\n  }) {\n    const threshold = V.toVector(value, filterTaps ? tapsThreshold : axis ? 1 : 0);\n    this.filterTaps = filterTaps;\n    this.tapsThreshold = tapsThreshold;\n    return threshold;\n  },\n\n  swipe({\n    velocity = DEFAULT_SWIPE_VELOCITY,\n    distance = DEFAULT_SWIPE_DISTANCE,\n    duration = DEFAULT_SWIPE_DURATION\n  } = {}) {\n    return {\n      velocity: this.transform(V.toVector(velocity)),\n      distance: this.transform(V.toVector(distance)),\n      duration\n    };\n  },\n\n  delay(value = 0) {\n    switch (value) {\n      case true:\n        return DEFAULT_DRAG_DELAY;\n\n      case false:\n        return 0;\n\n      default:\n        return value;\n    }\n  }\n\n});\n\nif (process.env.NODE_ENV === 'development') {\n  Object.assign(dragConfigResolver, {\n    useTouch(value) {\n      if (value !== undefined) {\n        throw Error(`[@use-gesture]: \\`useTouch\\` option has been renamed to \\`pointer.touch\\`. Use it as in \\`{ pointer: { touch: true } }\\`.`);\n      }\n\n      return NaN;\n    },\n\n    experimental_preventWindowScrollY(value) {\n      if (value !== undefined) {\n        throw Error(`[@use-gesture]: \\`experimental_preventWindowScrollY\\` option has been renamed to \\`preventScroll\\`.`);\n      }\n\n      return NaN;\n    },\n\n    swipeVelocity(value) {\n      if (value !== undefined) {\n        throw Error(`[@use-gesture]: \\`swipeVelocity\\` option has been renamed to \\`swipe.velocity\\`. Use it as in \\`{ swipe: { velocity: 0.5 } }\\`.`);\n      }\n\n      return NaN;\n    },\n\n    swipeDistance(value) {\n      if (value !== undefined) {\n        throw Error(`[@use-gesture]: \\`swipeDistance\\` option has been renamed to \\`swipe.distance\\`. Use it as in \\`{ swipe: { distance: 50 } }\\`.`);\n      }\n\n      return NaN;\n    },\n\n    swipeDuration(value) {\n      if (value !== undefined) {\n        throw Error(`[@use-gesture]: \\`swipeDuration\\` option has been renamed to \\`swipe.duration\\`. Use it as in \\`{ swipe: { duration: 250 } }\\`.`);\n      }\n\n      return NaN;\n    }\n\n  });\n}\n\nconst SCALE_ANGLE_RATIO_INTENT_DEG = 30;\nconst PINCH_WHEEL_RATIO = 36;\nclass PinchEngine extends Engine {\n  constructor(...args) {\n    super(...args);\n\n    _defineProperty(this, \"ingKey\", 'pinching');\n\n    _defineProperty(this, \"aliasKey\", 'da');\n  }\n\n  init() {\n    this.state.offset = [1, 0];\n    this.state.lastOffset = [1, 0];\n    this.state._pointerEvents = new Map();\n  }\n\n  reset() {\n    super.reset();\n    const state = this.state;\n    state._touchIds = [];\n    state.canceled = false;\n    state.cancel = this.cancel.bind(this);\n    state.turns = 0;\n  }\n\n  computeOffset() {\n    const {\n      type,\n      movement,\n      lastOffset\n    } = this.state;\n\n    if (type === 'wheel') {\n      this.state.offset = V.add(movement, lastOffset);\n    } else {\n      this.state.offset = [(1 + movement[0]) * lastOffset[0], movement[1] + lastOffset[1]];\n    }\n  }\n\n  computeMovement() {\n    const {\n      offset,\n      lastOffset\n    } = this.state;\n    this.state.movement = [offset[0] / lastOffset[0], offset[1] - lastOffset[1]];\n  }\n\n  intent(v) {\n    const state = this.state;\n\n    if (!state.axis) {\n      const axisMovementDifference = Math.abs(v[0]) * SCALE_ANGLE_RATIO_INTENT_DEG - Math.abs(v[1]);\n      if (axisMovementDifference < 0) state.axis = 'angle';else if (axisMovementDifference > 0) state.axis = 'scale';\n    }\n\n    if (this.config.lockDirection) {\n      if (state.axis === 'scale') v[1] = 0;else if (state.axis === 'angle') v[0] = 0;\n    }\n  }\n\n  cancel() {\n    const state = this.state;\n    if (state.canceled) return;\n    setTimeout(() => {\n      state.canceled = true;\n      state._active = false;\n      this.compute();\n      this.emit();\n    }, 0);\n  }\n\n  touchStart(event) {\n    this.ctrl.setEventIds(event);\n    const state = this.state;\n    const ctrlTouchIds = this.ctrl.touchIds;\n\n    if (state._active) {\n      if (state._touchIds.every(id => ctrlTouchIds.has(id))) return;\n    }\n\n    if (ctrlTouchIds.size < 2) return;\n    this.start(event);\n    state._touchIds = Array.from(ctrlTouchIds).slice(0, 2);\n    const payload = touchDistanceAngle(event, state._touchIds);\n    this.pinchStart(event, payload);\n  }\n\n  pointerStart(event) {\n    if (event.buttons != null && event.buttons % 2 !== 1) return;\n    this.ctrl.setEventIds(event);\n    event.target.setPointerCapture(event.pointerId);\n    const state = this.state;\n    const _pointerEvents = state._pointerEvents;\n    const ctrlPointerIds = this.ctrl.pointerIds;\n\n    if (state._active) {\n      if (Array.from(_pointerEvents.keys()).every(id => ctrlPointerIds.has(id))) return;\n    }\n\n    if (_pointerEvents.size < 2) {\n      _pointerEvents.set(event.pointerId, event);\n    }\n\n    if (state._pointerEvents.size < 2) return;\n    this.start(event);\n    const payload = distanceAngle(...Array.from(_pointerEvents.values()));\n    this.pinchStart(event, payload);\n  }\n\n  pinchStart(event, payload) {\n    const state = this.state;\n    state.origin = payload.origin;\n    this.computeValues([payload.distance, payload.angle]);\n    this.computeInitial();\n    this.compute(event);\n    this.emit();\n  }\n\n  touchMove(event) {\n    if (!this.state._active) return;\n    const payload = touchDistanceAngle(event, this.state._touchIds);\n    this.pinchMove(event, payload);\n  }\n\n  pointerMove(event) {\n    const _pointerEvents = this.state._pointerEvents;\n\n    if (_pointerEvents.has(event.pointerId)) {\n      _pointerEvents.set(event.pointerId, event);\n    }\n\n    if (!this.state._active) return;\n    const payload = distanceAngle(...Array.from(_pointerEvents.values()));\n    this.pinchMove(event, payload);\n  }\n\n  pinchMove(event, payload) {\n    const state = this.state;\n    const prev_a = state._values[1];\n    const delta_a = payload.angle - prev_a;\n    let delta_turns = 0;\n    if (Math.abs(delta_a) > 270) delta_turns += Math.sign(delta_a);\n    this.computeValues([payload.distance, payload.angle - 360 * delta_turns]);\n    state.origin = payload.origin;\n    state.turns = delta_turns;\n    state._movement = [state._values[0] / state._initial[0] - 1, state._values[1] - state._initial[1]];\n    this.compute(event);\n    this.emit();\n  }\n\n  touchEnd(event) {\n    this.ctrl.setEventIds(event);\n    if (!this.state._active) return;\n\n    if (this.state._touchIds.some(id => !this.ctrl.touchIds.has(id))) {\n      this.state._active = false;\n      this.compute(event);\n      this.emit();\n    }\n  }\n\n  pointerEnd(event) {\n    const state = this.state;\n    this.ctrl.setEventIds(event);\n\n    try {\n      event.target.releasePointerCapture(event.pointerId);\n    } catch (_unused) {}\n\n    if (state._pointerEvents.has(event.pointerId)) {\n      state._pointerEvents.delete(event.pointerId);\n    }\n\n    if (!state._active) return;\n\n    if (state._pointerEvents.size < 2) {\n      state._active = false;\n      this.compute(event);\n      this.emit();\n    }\n  }\n\n  gestureStart(event) {\n    if (event.cancelable) event.preventDefault();\n    const state = this.state;\n    if (state._active) return;\n    this.start(event);\n    this.computeValues([event.scale, event.rotation]);\n    state.origin = [event.clientX, event.clientY];\n    this.compute(event);\n    this.emit();\n  }\n\n  gestureMove(event) {\n    if (event.cancelable) event.preventDefault();\n    if (!this.state._active) return;\n    const state = this.state;\n    this.computeValues([event.scale, event.rotation]);\n    state.origin = [event.clientX, event.clientY];\n    const _previousMovement = state._movement;\n    state._movement = [event.scale - 1, event.rotation];\n    state._delta = V.sub(state._movement, _previousMovement);\n    this.compute(event);\n    this.emit();\n  }\n\n  gestureEnd(event) {\n    if (!this.state._active) return;\n    this.state._active = false;\n    this.compute(event);\n    this.emit();\n  }\n\n  wheel(event) {\n    if (!event.ctrlKey) return;\n    if (!this.state._active) this.wheelStart(event);else this.wheelChange(event);\n    this.timeoutStore.add('wheelEnd', this.wheelEnd.bind(this));\n  }\n\n  wheelStart(event) {\n    this.start(event);\n    this.wheelChange(event);\n  }\n\n  wheelChange(event) {\n    const isR3f = ('uv' in event);\n\n    if (!isR3f) {\n      if (event.cancelable) {\n        event.preventDefault();\n      }\n\n      if (process.env.NODE_ENV === 'development' && !event.defaultPrevented) {\n        console.warn(`[@use-gesture]: To properly support zoom on trackpads, try using the \\`target\\` option.\\n\\nThis message will only appear in development mode.`);\n      }\n    }\n\n    const state = this.state;\n    state._delta = [-wheelValues(event)[1] / PINCH_WHEEL_RATIO * state.offset[0], 0];\n    V.addTo(state._movement, state._delta);\n    this.state.origin = [event.clientX, event.clientY];\n    this.compute(event);\n    this.emit();\n  }\n\n  wheelEnd() {\n    if (!this.state._active) return;\n    this.state._active = false;\n    this.compute();\n    this.emit();\n  }\n\n  bind(bindFunction) {\n    const device = this.config.device;\n\n    if (!!device) {\n      bindFunction(device, 'start', this[device + 'Start'].bind(this));\n      bindFunction(device, 'change', this[device + 'Move'].bind(this));\n      bindFunction(device, 'end', this[device + 'End'].bind(this));\n      bindFunction(device, 'cancel', this[device + 'End'].bind(this));\n    } else {\n      bindFunction('wheel', '', this.wheel.bind(this), {\n        passive: false\n      });\n    }\n  }\n\n}\n\nconst pinchConfigResolver = _objectSpread2(_objectSpread2({}, commonConfigResolver), {}, {\n  useTouch(_v, _k, {\n    pointer: {\n      touch = false\n    } = {}\n  }) {\n    return touch && SUPPORT.touch;\n  },\n\n  device(_v, _k, config) {\n    const sharedConfig = config.shared;\n    if (sharedConfig.target && !SUPPORT.touch && SUPPORT.gesture) return 'gesture';\n    if (this.useTouch) return 'touch';\n\n    if (SUPPORT.touchscreen) {\n      if (SUPPORT.pointer) return 'pointer';\n      if (SUPPORT.touch) return 'touch';\n    }\n  },\n\n  bounds(_v, _k, {\n    scaleBounds = {},\n    angleBounds = {}\n  }) {\n    const _scaleBounds = state => {\n      const D = assignDefault(call(scaleBounds, state), {\n        min: -Infinity,\n        max: Infinity\n      });\n      return [D.min, D.max];\n    };\n\n    const _angleBounds = state => {\n      const A = assignDefault(call(angleBounds, state), {\n        min: -Infinity,\n        max: Infinity\n      });\n      return [A.min, A.max];\n    };\n\n    if (typeof scaleBounds !== 'function' && typeof angleBounds !== 'function') return [_scaleBounds(), _angleBounds()];\n    return state => [_scaleBounds(state), _angleBounds(state)];\n  },\n\n  threshold(value, _k, config) {\n    this.lockDirection = config.axis === 'lock';\n    const threshold = V.toVector(value, this.lockDirection ? [0.1, 3] : 0);\n    return threshold;\n  }\n\n});\n\nclass MoveEngine extends CoordinatesEngine {\n  constructor(...args) {\n    super(...args);\n\n    _defineProperty(this, \"ingKey\", 'moving');\n  }\n\n  move(event) {\n    if (this.config.mouseOnly && event.pointerType !== 'mouse') return;\n    if (!this.state._active) this.moveStart(event);else this.moveChange(event);\n    this.timeoutStore.add('moveEnd', this.moveEnd.bind(this));\n  }\n\n  moveStart(event) {\n    this.start(event);\n    this.computeValues(pointerValues(event));\n    this.compute(event);\n    this.computeInitial();\n    this.emit();\n  }\n\n  moveChange(event) {\n    if (!this.state._active) return;\n    const values = pointerValues(event);\n    const state = this.state;\n    state._delta = V.sub(values, state._values);\n    V.addTo(state._movement, state._delta);\n    this.computeValues(values);\n    this.compute(event);\n    this.emit();\n  }\n\n  moveEnd(event) {\n    if (!this.state._active) return;\n    this.state._active = false;\n    this.compute(event);\n    this.emit();\n  }\n\n  bind(bindFunction) {\n    bindFunction('pointer', 'change', this.move.bind(this));\n    bindFunction('pointer', 'leave', this.moveEnd.bind(this));\n  }\n\n}\n\nconst moveConfigResolver = _objectSpread2(_objectSpread2({}, coordinatesConfigResolver), {}, {\n  mouseOnly: (value = true) => value\n});\n\nclass ScrollEngine extends CoordinatesEngine {\n  constructor(...args) {\n    super(...args);\n\n    _defineProperty(this, \"ingKey\", 'scrolling');\n  }\n\n  scroll(event) {\n    if (!this.state._active) this.start(event);\n    this.scrollChange(event);\n    this.timeoutStore.add('scrollEnd', this.scrollEnd.bind(this));\n  }\n\n  scrollChange(event) {\n    if (event.cancelable) event.preventDefault();\n    const state = this.state;\n    const values = scrollValues(event);\n    state._delta = V.sub(values, state._values);\n    V.addTo(state._movement, state._delta);\n    this.computeValues(values);\n    this.compute(event);\n    this.emit();\n  }\n\n  scrollEnd() {\n    if (!this.state._active) return;\n    this.state._active = false;\n    this.compute();\n    this.emit();\n  }\n\n  bind(bindFunction) {\n    bindFunction('scroll', '', this.scroll.bind(this));\n  }\n\n}\n\nconst scrollConfigResolver = coordinatesConfigResolver;\n\nclass WheelEngine extends CoordinatesEngine {\n  constructor(...args) {\n    super(...args);\n\n    _defineProperty(this, \"ingKey\", 'wheeling');\n  }\n\n  wheel(event) {\n    if (!this.state._active) this.start(event);\n    this.wheelChange(event);\n    this.timeoutStore.add('wheelEnd', this.wheelEnd.bind(this));\n  }\n\n  wheelChange(event) {\n    const state = this.state;\n    state._delta = wheelValues(event);\n    V.addTo(state._movement, state._delta);\n    const [ox, oy] = state.overflow;\n    const [dx, dy] = state._delta;\n    const [dirx, diry] = state._direction;\n\n    if (ox < 0 && dx > 0 && dirx < 0 || ox > 0 && dx < 0 && dirx > 0) {\n      state._movement[0] = state._movementBound[0];\n    }\n\n    if (oy < 0 && dy > 0 && diry < 0 || oy > 0 && dy < 0 && diry > 0) {\n      state._movement[1] = state._movementBound[1];\n    }\n\n    this.compute(event);\n    this.emit();\n  }\n\n  wheelEnd() {\n    if (!this.state._active) return;\n    this.state._active = false;\n    this.compute();\n    this.emit();\n  }\n\n  bind(bindFunction) {\n    bindFunction('wheel', '', this.wheel.bind(this));\n  }\n\n}\n\nconst wheelConfigResolver = coordinatesConfigResolver;\n\nclass HoverEngine extends CoordinatesEngine {\n  constructor(...args) {\n    super(...args);\n\n    _defineProperty(this, \"ingKey\", 'hovering');\n  }\n\n  enter(event) {\n    if (this.config.mouseOnly && event.pointerType !== 'mouse') return;\n    this.start(event);\n    this.computeValues(pointerValues(event));\n    this.compute(event);\n    this.emit();\n  }\n\n  leave(event) {\n    if (this.config.mouseOnly && event.pointerType !== 'mouse') return;\n    const state = this.state;\n    if (!state._active) return;\n    state._active = false;\n    const values = pointerValues(event);\n    state._movement = state._delta = V.sub(values, state._values);\n    this.computeValues(values);\n    this.compute(event);\n    state.delta = state.movement;\n    this.emit();\n  }\n\n  bind(bindFunction) {\n    bindFunction('pointer', 'enter', this.enter.bind(this));\n    bindFunction('pointer', 'leave', this.leave.bind(this));\n  }\n\n}\n\nconst hoverConfigResolver = _objectSpread2(_objectSpread2({}, coordinatesConfigResolver), {}, {\n  mouseOnly: (value = true) => value\n});\n\nconst EngineMap = new Map();\nconst ConfigResolverMap = new Map();\nfunction registerAction(action) {\n  EngineMap.set(action.key, action.engine);\n  ConfigResolverMap.set(action.key, action.resolver);\n}\nconst dragAction = {\n  key: 'drag',\n  engine: DragEngine,\n  resolver: dragConfigResolver\n};\nconst hoverAction = {\n  key: 'hover',\n  engine: HoverEngine,\n  resolver: hoverConfigResolver\n};\nconst moveAction = {\n  key: 'move',\n  engine: MoveEngine,\n  resolver: moveConfigResolver\n};\nconst pinchAction = {\n  key: 'pinch',\n  engine: PinchEngine,\n  resolver: pinchConfigResolver\n};\nconst scrollAction = {\n  key: 'scroll',\n  engine: ScrollEngine,\n  resolver: scrollConfigResolver\n};\nconst wheelAction = {\n  key: 'wheel',\n  engine: WheelEngine,\n  resolver: wheelConfigResolver\n};\n\nexport { ConfigResolverMap as C, EngineMap as E, SUPPORT as S, _objectSpread2 as _, _defineProperty as a, touchIds as b, chain as c, toHandlerProp as d, dragAction as e, pinchAction as f, hoverAction as h, isTouch as i, moveAction as m, parseProp as p, registerAction as r, scrollAction as s, toDomEventType as t, wheelAction as w };\n","import { S as SUPPORT, C as ConfigResolverMap, _ as _objectSpread2, a as _defineProperty, t as toDomEventType, i as isTouch, b as touchIds, E as EngineMap, c as chain, p as parseProp, d as toHandlerProp } from './actions-5ad85d2f.esm.js';\nimport './maths-b2a210f4.esm.js';\n\nfunction _objectWithoutPropertiesLoose(source, excluded) {\n  if (source == null) return {};\n  var target = {};\n  var sourceKeys = Object.keys(source);\n  var key, i;\n\n  for (i = 0; i < sourceKeys.length; i++) {\n    key = sourceKeys[i];\n    if (excluded.indexOf(key) >= 0) continue;\n    target[key] = source[key];\n  }\n\n  return target;\n}\n\nfunction _objectWithoutProperties(source, excluded) {\n  if (source == null) return {};\n  var target = _objectWithoutPropertiesLoose(source, excluded);\n  var key, i;\n\n  if (Object.getOwnPropertySymbols) {\n    var sourceSymbolKeys = Object.getOwnPropertySymbols(source);\n\n    for (i = 0; i < sourceSymbolKeys.length; i++) {\n      key = sourceSymbolKeys[i];\n      if (excluded.indexOf(key) >= 0) continue;\n      if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue;\n      target[key] = source[key];\n    }\n  }\n\n  return target;\n}\n\nconst sharedConfigResolver = {\n  target(value) {\n    if (value) {\n      return () => 'current' in value ? value.current : value;\n    }\n\n    return undefined;\n  },\n\n  enabled(value = true) {\n    return value;\n  },\n\n  window(value = SUPPORT.isBrowser ? window : undefined) {\n    return value;\n  },\n\n  eventOptions({\n    passive = true,\n    capture = false\n  } = {}) {\n    return {\n      passive,\n      capture\n    };\n  },\n\n  transform(value) {\n    return value;\n  }\n\n};\n\nconst _excluded = [\"target\", \"eventOptions\", \"window\", \"enabled\", \"transform\"];\nfunction resolveWith(config = {}, resolvers) {\n  const result = {};\n\n  for (const [key, resolver] of Object.entries(resolvers)) {\n    switch (typeof resolver) {\n      case 'function':\n        if (process.env.NODE_ENV === 'development') {\n          const r = resolver.call(result, config[key], key, config);\n          if (!Number.isNaN(r)) result[key] = r;\n        } else {\n          result[key] = resolver.call(result, config[key], key, config);\n        }\n\n        break;\n\n      case 'object':\n        result[key] = resolveWith(config[key], resolver);\n        break;\n\n      case 'boolean':\n        if (resolver) result[key] = config[key];\n        break;\n    }\n  }\n\n  return result;\n}\nfunction parse(config, gestureKey) {\n  const _ref = config,\n        {\n    target,\n    eventOptions,\n    window,\n    enabled,\n    transform\n  } = _ref,\n        rest = _objectWithoutProperties(_ref, _excluded);\n\n  const _config = {\n    shared: resolveWith({\n      target,\n      eventOptions,\n      window,\n      enabled,\n      transform\n    }, sharedConfigResolver)\n  };\n\n  if (gestureKey) {\n    const resolver = ConfigResolverMap.get(gestureKey);\n    _config[gestureKey] = resolveWith(_objectSpread2({\n      shared: _config.shared\n    }, rest), resolver);\n  } else {\n    for (const key in rest) {\n      const resolver = ConfigResolverMap.get(key);\n\n      if (resolver) {\n        _config[key] = resolveWith(_objectSpread2({\n          shared: _config.shared\n        }, rest[key]), resolver);\n      } else if (process.env.NODE_ENV === 'development') {\n        if (!['drag', 'pinch', 'scroll', 'wheel', 'move', 'hover'].includes(key)) {\n          if (key === 'domTarget') {\n            throw Error(`[@use-gesture]: \\`domTarget\\` option has been renamed to \\`target\\`.`);\n          }\n\n          console.warn(`[@use-gesture]: Unknown config key \\`${key}\\` was used. Please read the documentation for further information.`);\n        }\n      }\n    }\n  }\n\n  return _config;\n}\n\nclass EventStore {\n  constructor(ctrl) {\n    _defineProperty(this, \"_listeners\", []);\n\n    this._ctrl = ctrl;\n  }\n\n  add(element, device, action, handler, options) {\n    const type = toDomEventType(device, action);\n\n    const eventOptions = _objectSpread2(_objectSpread2({}, this._ctrl.config.shared.eventOptions), options);\n\n    element.addEventListener(type, handler, eventOptions);\n\n    this._listeners.push(() => element.removeEventListener(type, handler, eventOptions));\n  }\n\n  clean() {\n    this._listeners.forEach(remove => remove());\n\n    this._listeners = [];\n  }\n\n}\n\nclass TimeoutStore {\n  constructor() {\n    _defineProperty(this, \"_timeouts\", new Map());\n  }\n\n  add(key, callback, ms = 140, ...args) {\n    this.remove(key);\n\n    this._timeouts.set(key, window.setTimeout(callback, ms, ...args));\n  }\n\n  remove(key) {\n    const timeout = this._timeouts.get(key);\n\n    if (timeout) window.clearTimeout(timeout);\n  }\n\n  clean() {\n    this._timeouts.forEach(timeout => void window.clearTimeout(timeout));\n\n    this._timeouts.clear();\n  }\n\n}\n\nclass Controller {\n  constructor(handlers) {\n    _defineProperty(this, \"gestures\", new Set());\n\n    _defineProperty(this, \"_targetEventStore\", new EventStore(this));\n\n    _defineProperty(this, \"gestureEventStores\", {});\n\n    _defineProperty(this, \"gestureTimeoutStores\", {});\n\n    _defineProperty(this, \"handlers\", {});\n\n    _defineProperty(this, \"config\", {});\n\n    _defineProperty(this, \"pointerIds\", new Set());\n\n    _defineProperty(this, \"touchIds\", new Set());\n\n    _defineProperty(this, \"state\", {\n      shared: {\n        shiftKey: false,\n        metaKey: false,\n        ctrlKey: false,\n        altKey: false\n      }\n    });\n\n    resolveGestures(this, handlers);\n  }\n\n  setEventIds(event) {\n    if (isTouch(event)) {\n      this.touchIds = new Set(touchIds(event));\n    } else if ('pointerId' in event) {\n      if (event.type === 'pointerup' || event.type === 'pointercancel') this.pointerIds.delete(event.pointerId);else if (event.type === 'pointerdown') this.pointerIds.add(event.pointerId);\n    }\n  }\n\n  applyHandlers(handlers, nativeHandlers) {\n    this.handlers = handlers;\n    this.nativeHandlers = nativeHandlers;\n  }\n\n  applyConfig(config, gestureKey) {\n    this.config = parse(config, gestureKey);\n  }\n\n  clean() {\n    this._targetEventStore.clean();\n\n    for (const key of this.gestures) {\n      this.gestureEventStores[key].clean();\n      this.gestureTimeoutStores[key].clean();\n    }\n  }\n\n  effect() {\n    if (this.config.shared.target) this.bind();\n    return () => this._targetEventStore.clean();\n  }\n\n  bind(...args) {\n    const sharedConfig = this.config.shared;\n    const eventOptions = sharedConfig.eventOptions;\n    const props = {};\n    let target;\n\n    if (sharedConfig.target) {\n      target = sharedConfig.target();\n      if (!target) return;\n    }\n\n    const bindFunction = bindToProps(props, eventOptions, !!target);\n\n    if (sharedConfig.enabled) {\n      for (const gestureKey of this.gestures) {\n        if (this.config[gestureKey].enabled) {\n          const Engine = EngineMap.get(gestureKey);\n          new Engine(this, args, gestureKey).bind(bindFunction);\n        }\n      }\n\n      for (const eventKey in this.nativeHandlers) {\n        bindFunction(eventKey, '', event => this.nativeHandlers[eventKey](_objectSpread2(_objectSpread2({}, this.state.shared), {}, {\n          event,\n          args\n        })), undefined, true);\n      }\n    }\n\n    for (const handlerProp in props) {\n      props[handlerProp] = chain(...props[handlerProp]);\n    }\n\n    if (!target) return props;\n\n    for (const handlerProp in props) {\n      const {\n        device,\n        capture,\n        passive\n      } = parseProp(handlerProp);\n\n      this._targetEventStore.add(target, device, '', props[handlerProp], {\n        capture,\n        passive\n      });\n    }\n  }\n\n}\n\nfunction setupGesture(ctrl, gestureKey) {\n  ctrl.gestures.add(gestureKey);\n  ctrl.gestureEventStores[gestureKey] = new EventStore(ctrl);\n  ctrl.gestureTimeoutStores[gestureKey] = new TimeoutStore();\n}\n\nfunction resolveGestures(ctrl, internalHandlers) {\n  if (internalHandlers.drag) setupGesture(ctrl, 'drag');\n  if (internalHandlers.wheel) setupGesture(ctrl, 'wheel');\n  if (internalHandlers.scroll) setupGesture(ctrl, 'scroll');\n  if (internalHandlers.move) setupGesture(ctrl, 'move');\n  if (internalHandlers.pinch) setupGesture(ctrl, 'pinch');\n  if (internalHandlers.hover) setupGesture(ctrl, 'hover');\n}\n\nconst bindToProps = (props, eventOptions, withPassiveOption) => (device, action, handler, options = {}, isNative = false) => {\n  var _options$capture, _options$passive;\n\n  const capture = (_options$capture = options.capture) !== null && _options$capture !== void 0 ? _options$capture : eventOptions.capture;\n  const passive = (_options$passive = options.passive) !== null && _options$passive !== void 0 ? _options$passive : eventOptions.passive;\n  let handlerProp = isNative ? device : toHandlerProp(device, action, capture);\n  if (withPassiveOption && passive) handlerProp += 'Passive';\n  props[handlerProp] = props[handlerProp] || [];\n  props[handlerProp].push(handler);\n};\n\nconst RE_NOT_NATIVE = /^on(Drag|Wheel|Scroll|Move|Pinch|Hover)/;\n\nfunction sortHandlers(_handlers) {\n  const native = {};\n  const handlers = {};\n  const actions = new Set();\n\n  for (let key in _handlers) {\n    if (RE_NOT_NATIVE.test(key)) {\n      actions.add(RegExp.lastMatch);\n      handlers[key] = _handlers[key];\n    } else {\n      native[key] = _handlers[key];\n    }\n  }\n\n  return [handlers, native, actions];\n}\n\nfunction registerGesture(actions, handlers, handlerKey, key, internalHandlers, config) {\n  if (!actions.has(handlerKey)) return;\n\n  if (!EngineMap.has(key)) {\n    if (process.env.NODE_ENV === 'development') {\n      console.warn(`[@use-gesture]: You've created a custom handler that that uses the \\`${key}\\` gesture but isn't properly configured.\\n\\nPlease add \\`${key}Action\\` when creating your handler.`);\n    }\n\n    return;\n  }\n\n  const startKey = handlerKey + 'Start';\n  const endKey = handlerKey + 'End';\n\n  const fn = state => {\n    let memo = undefined;\n    if (state.first && startKey in handlers) handlers[startKey](state);\n    if (handlerKey in handlers) memo = handlers[handlerKey](state);\n    if (state.last && endKey in handlers) handlers[endKey](state);\n    return memo;\n  };\n\n  internalHandlers[key] = fn;\n  config[key] = config[key] || {};\n}\n\nfunction parseMergedHandlers(mergedHandlers, mergedConfig) {\n  const [handlers, nativeHandlers, actions] = sortHandlers(mergedHandlers);\n  const internalHandlers = {};\n  registerGesture(actions, handlers, 'onDrag', 'drag', internalHandlers, mergedConfig);\n  registerGesture(actions, handlers, 'onWheel', 'wheel', internalHandlers, mergedConfig);\n  registerGesture(actions, handlers, 'onScroll', 'scroll', internalHandlers, mergedConfig);\n  registerGesture(actions, handlers, 'onPinch', 'pinch', internalHandlers, mergedConfig);\n  registerGesture(actions, handlers, 'onMove', 'move', internalHandlers, mergedConfig);\n  registerGesture(actions, handlers, 'onHover', 'hover', internalHandlers, mergedConfig);\n  return {\n    handlers: internalHandlers,\n    config: mergedConfig,\n    nativeHandlers\n  };\n}\n\nexport { Controller, parseMergedHandlers };\n","import { registerAction, dragAction, pinchAction, wheelAction, scrollAction, moveAction, hoverAction } from '@use-gesture/core/actions';\nexport * from '@use-gesture/core/actions';\nimport React from 'react';\nimport { Controller, parseMergedHandlers } from '@use-gesture/core';\nexport * from '@use-gesture/core/utils';\nexport * from '@use-gesture/core/types';\n\nfunction useRecognizers(handlers, config = {}, gestureKey, nativeHandlers) {\n  const ctrl = React.useMemo(() => new Controller(handlers), []);\n  ctrl.applyHandlers(handlers, nativeHandlers);\n  ctrl.applyConfig(config, gestureKey);\n  React.useEffect(ctrl.effect.bind(ctrl));\n  React.useEffect(() => {\n    return ctrl.clean.bind(ctrl);\n  }, []);\n\n  if (config.target === undefined) {\n    return ctrl.bind.bind(ctrl);\n  }\n\n  return undefined;\n}\n\nfunction useDrag(handler, config = {}) {\n  registerAction(dragAction);\n  return useRecognizers({\n    drag: handler\n  }, config, 'drag');\n}\n\nfunction usePinch(handler, config = {}) {\n  registerAction(pinchAction);\n  return useRecognizers({\n    pinch: handler\n  }, config, 'pinch');\n}\n\nfunction useWheel(handler, config = {}) {\n  registerAction(wheelAction);\n  return useRecognizers({\n    wheel: handler\n  }, config, 'wheel');\n}\n\nfunction useScroll(handler, config = {}) {\n  registerAction(scrollAction);\n  return useRecognizers({\n    scroll: handler\n  }, config, 'scroll');\n}\n\nfunction useMove(handler, config = {}) {\n  registerAction(moveAction);\n  return useRecognizers({\n    move: handler\n  }, config, 'move');\n}\n\nfunction useHover(handler, config = {}) {\n  registerAction(hoverAction);\n  return useRecognizers({\n    hover: handler\n  }, config, 'hover');\n}\n\nfunction createUseGesture(actions) {\n  actions.forEach(registerAction);\n  return function useGesture(_handlers, _config = {}) {\n    const {\n      handlers,\n      nativeHandlers,\n      config\n    } = parseMergedHandlers(_handlers, _config);\n    return useRecognizers(handlers, config, undefined, nativeHandlers);\n  };\n}\n\nfunction useGesture(handlers, config = {}) {\n  const hook = createUseGesture([dragAction, pinchAction, scrollAction, wheelAction, moveAction, hoverAction]);\n  return hook(handlers, config);\n}\n\nexport { createUseGesture, useDrag, useGesture, useHover, useMove, usePinch, useScroll, useWheel };\n","type Position = 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right';\n\ntype Props = {\n  position: Position;\n  inset?: boolean;\n};\n\nexport function CornerHandle({position, inset = false}: Props) {\n  const className = getPositionClass(position, inset);\n  return (\n    <div\n      data-position={position}\n      className={`border-white absolute w-20 h-20 ${className}`}\n    />\n  );\n}\n\nfunction getPositionClass(position: Position, inset: boolean): string {\n  const left = inset ? 'left-0' : '-left-5';\n  const top = inset ? 'top-0' : '-top-5';\n  const bottom = inset ? 'bottom-0' : '-bottom-5';\n  const right = inset ? 'right-0' : '-right-5';\n  switch (position) {\n    case 'top-left':\n      return `${left} ${top} border-l-4 border-t-4 cursor-nwse-resize`;\n    case 'top-right':\n      return `${right} ${top} border-r-4 border-t-4 cursor-nesw-resize`;\n    case 'bottom-right':\n      return `${right} ${bottom} border-r-4 border-b-4 cursor-se-resize`;\n    case 'bottom-left':\n      return `${left} ${bottom} border-l-4 border-b-4 cursor-sw-resize`;\n    default:\n      return '';\n  }\n}\n","import {MutableRefObject} from 'react';\nimport {CropzoneRefs} from './cropzone-refs';\n\nexport enum MaskPosition {\n  top = 'maskTop',\n  right = 'maskRight',\n  bottom = 'maskBottom',\n  left = 'maskLeft',\n}\n\ntype Props = {\n  position: MaskPosition;\n  refs: MutableRefObject<CropzoneRefs>;\n};\n\nexport function MaskPart({position, refs}: Props) {\n  const className = getClassNameByPosition(position);\n  return (\n    <div\n      className={`cropzone-transition bg-black/50 bottom absolute ${className}`}\n      ref={el => (refs.current[position] = el)}\n    />\n  );\n}\n\nfunction getClassNameByPosition(position: MaskPosition): string {\n  switch (position) {\n    case MaskPosition.top:\n      return 'left-0 top-0';\n    case MaskPosition.bottom:\n      return 'bottom-0 left-0';\n    default:\n      return '';\n  }\n}\n","import {MutableRefObject} from 'react';\nimport clsx from 'clsx';\nimport {CropzoneRefs} from './cropzone-refs';\n\ntype Props = {\n  name: 'lineVer1' | 'lineVer2' | 'lineHor1' | 'lineHor2';\n  refs: MutableRefObject<CropzoneRefs>;\n};\n\nexport function Line({name, refs}: Props) {\n  const className = clsx(\n    'cropzone-transition pointer-events-none absolute left-0 top-0 bg-white/50',\n    name.startsWith('lineHor') ? 'h-px' : 'w-px'\n  );\n  return (\n    <div\n      className={className}\n      ref={el => {\n        refs.current[name] = el;\n      }}\n    />\n  );\n}\n","import {InteractableCallback, InteractableConfig} from './interactable-config';\nimport {InteractableRect} from './interactable-rect';\nimport {InteractableAction} from './actions/interactable-action';\n\nexport class Interactable {\n  private doubleTapTimer: NodeJS.Timeout | null = null;\n  private readonly boundOnPointerDown: (e: PointerEvent) => void;\n  private readonly boundOnPointerUp: (e: PointerEvent) => void;\n\n  constructor(private el: HTMLElement, public config: InteractableConfig) {\n    this.boundOnPointerDown = this.onPointerDown.bind(this);\n    this.boundOnPointerUp = this.onPointerUp.bind(this);\n    el.addEventListener('pointerdown', this.boundOnPointerDown);\n    el.addEventListener('pointerup', this.boundOnPointerUp);\n  }\n\n  currentRect: InteractableRect = {\n    width: 0,\n    height: 0,\n    left: 0,\n    top: 0,\n    angle: 0,\n  };\n  private currentAction?: InteractableAction | null;\n  private initialAspectRatio = 0;\n  private lastPosition: {pageX: number; pageY: number} = {pageX: 0, pageY: 0};\n\n  get aspectRatio(): number | null {\n    if (this.config.maintainInitialAspectRatio) {\n      return this.initialAspectRatio;\n    }\n    if (this.config.aspectRatio) {\n      return this.config.aspectRatio;\n    }\n    return null;\n  }\n\n  setConfig(newConfig: Partial<InteractableConfig>) {\n    this.config = {\n      ...this.config,\n      ...newConfig,\n    };\n  }\n\n  destroy() {\n    this.el.removeEventListener('pointerdown', this.boundOnPointerDown);\n    this.el.removeEventListener('pointerup', this.boundOnPointerUp);\n  }\n\n  private onPointerDown(e: PointerEvent) {\n    e.stopPropagation();\n    e.preventDefault();\n    this.lastPosition = {pageX: e.pageX, pageY: e.pageY};\n    this.el.style.touchAction = 'none';\n    this.el.style.userSelect = 'none';\n    this.syncCurrentRectWithEl(this.el);\n\n    this.currentAction = this.config.actions.find(a => a.matches(e));\n    if (this.currentAction) {\n      this.currentRect = {\n        ...this.currentRect,\n        ...this.currentAction.onPointerDown?.(e),\n      };\n    }\n\n    this.config.listeners.onPointerDown?.({rect: this.currentRect});\n\n    this.el.onpointermove = this.onPointerMove.bind(this);\n    this.el.setPointerCapture(e.pointerId);\n  }\n\n  private onPointerMove(e: PointerEvent) {\n    e.stopPropagation();\n    e.preventDefault();\n\n    if (this.currentAction) {\n      this.executeAction(this.currentAction, e);\n    }\n    this.lastPosition = {pageX: e.pageX, pageY: e.pageY};\n  }\n\n  executeAction(action: InteractableAction, e: PointerEvent, extra?: any) {\n    const prevRect = {...this.currentRect};\n    this.currentRect = action.execute(\n      {\n        deltaX: e.pageX - this.lastPosition.pageX,\n        deltaY: e.pageY - this.lastPosition.pageY,\n        pageX: e.pageX,\n        pageY: e.pageY,\n        aspectRatio: this.aspectRatio,\n        currentRect: this.currentRect,\n      },\n      extra\n    );\n\n    if (this.config.modifiers) {\n      this.currentRect = this.config.modifiers.reduce(\n        (rect, modifier) =>\n          modifier({currentRect: this.currentRect, prevRect}, this.config),\n        this.currentRect\n      );\n    }\n\n    const callback = this.config.listeners[\n      action.callbackName\n    ] as InteractableCallback;\n    const payload = {rect: {...this.currentRect}, prevRect};\n    callback?.(payload);\n  }\n\n  private syncCurrentRectWithEl(el: HTMLElement) {\n    const translateVal = el.style.transform.match(/translate\\((.+?)\\)/)?.[1];\n    const [left = '0', top = '0'] = (translateVal || '').split(',');\n\n    this.currentRect = {\n      // use clientHeight to rotation transform is ignored, it does not include margin\n      width: el.offsetWidth,\n      height: el.offsetHeight,\n      left: parseInt(left, 10),\n      top: parseInt(top, 10),\n      angle: 0,\n    };\n    this.initialAspectRatio = this.currentRect.width / this.currentRect.height;\n  }\n\n  private onPointerUp(e: PointerEvent) {\n    e.stopPropagation();\n    e.preventDefault();\n    const currentTarget = e.currentTarget as HTMLElement;\n    this.currentAction = null;\n    currentTarget.onpointermove = null;\n    currentTarget.releasePointerCapture(e.pointerId);\n    this.config.actions.forEach(a => a.onPointerUp?.(e));\n    this.config.listeners.onPointerUp?.({rect: this.currentRect});\n    this.handleDoubleTap(e);\n  }\n\n  private handleDoubleTap(e: PointerEvent) {\n    if (!this.doubleTapTimer) {\n      this.doubleTapTimer = setTimeout(() => {\n        this.doubleTapTimer = null;\n      }, 300);\n    } else {\n      clearTimeout(this.doubleTapTimer);\n      this.doubleTapTimer = null;\n      this.config.listeners.onDoubleTap?.(e);\n    }\n  }\n}\n","import {InteractableAction} from './interactable-action';\nimport {InteractableEvent} from '../interactable-event';\nimport {InteractableRect} from '../interactable-rect';\n\nexport class MoveAction implements InteractableAction {\n  callbackName = 'onMove' as const;\n\n  // this should persist between pointerup/down\n  lockMovement = false;\n\n  matches(e: PointerEvent) {\n    return !!e.target && !!e.currentTarget && e.target === e.currentTarget;\n  }\n\n  execute(e: InteractableEvent): InteractableRect {\n    if (this.lockMovement) {\n      return e.currentRect;\n    }\n    const newRect = e.currentRect;\n    newRect.left += e.deltaX;\n    newRect.top += e.deltaY;\n    return newRect;\n  }\n}\n","import {InteractableRect} from '../interactable-rect';\nimport {calcNewSizeFromAspectRatio} from '../utils/calc-new-size-from-aspect-ratio';\nimport type {InteractableConfig} from '../interactable-config';\n\ntype Rects = {\n  currentRect: InteractableRect;\n  prevRect: InteractableRect;\n};\n\nexport function constrainWithinBoundary(\n  {currentRect, prevRect}: Rects,\n  {boundaryRect, minWidth, minHeight, aspectRatio}: InteractableConfig\n): InteractableRect {\n  let cr = {...currentRect};\n  const pr = {...prevRect};\n\n  if (boundaryRect) {\n    // hit left boundary\n    if (cr.left < 0) {\n      cr = pr;\n    }\n    // hit top boundary\n    if (cr.top < 0) {\n      cr = pr;\n    }\n    // hit right boundary\n    if (cr.left + cr.width > boundaryRect.width) {\n      cr = pr;\n    }\n    // hit bottom boundary\n    if (cr.top + cr.height > boundaryRect.height) {\n      cr = pr;\n    }\n  }\n\n  if (minWidth || minHeight) {\n    let min: {width: number; height: number};\n    if (aspectRatio) {\n      min = calcNewSizeFromAspectRatio(aspectRatio, minWidth, minHeight);\n    } else {\n      min = {width: minWidth, height: minHeight};\n    }\n\n    // min width\n    if (min.width && cr.width < min.width) {\n      cr.left = pr.left;\n      cr.width = min.width;\n    }\n\n    // min height\n    if (min.height && cr.height < min.height) {\n      cr.top = pr.top;\n      cr.height = min.height;\n    }\n  }\n\n  return cr;\n}\n","import {useEffect, useLayoutEffect, useRef, useState} from 'react';\nimport clsx from 'clsx';\nimport {CornerHandle} from '../../../../objects/ui/corner-handle';\nimport {useStore} from '../../../../state/store';\nimport {MaskPart, MaskPosition} from './mask-part';\nimport {Line} from './cropzone-line';\nimport {Interactable} from '../../../../common/ui/interactions/interactable';\nimport {aspectRatioFromStr} from '../../../../common/ui/interactions/utils/calc-new-size-from-aspect-ratio';\nimport {ResizeAction} from '../../../../common/ui/interactions/actions/resize-action';\nimport {MoveAction} from '../../../../common/ui/interactions/actions/move-action';\nimport {constrainWithinBoundary} from '../../../../common/ui/interactions/modifiers/constrain-within-boundary';\nimport {CropzoneRefs} from './cropzone-refs';\nimport {tools} from '../../../../state/utils';\n\nexport function Cropzone() {\n  const refs = useRef<CropzoneRefs>({} as CropzoneRefs);\n  const [isMoving, setIsMoving] = useState(true);\n  const boundaryRect = useStore(s => s.canvasSize);\n  const controlConfig = useStore(s => s.config.tools?.crop?.cropzone);\n  const defaultRatio =\n    useStore(s => s.config.tools?.crop?.defaultRatio) || null;\n\n  useEffect(() => {\n    if (tools().crop) {\n      tools().crop.zone = new Interactable(refs.current.innerZone!, {\n        actions: [new MoveAction(), new ResizeAction()],\n        modifiers: [constrainWithinBoundary],\n        listeners: {\n          onPointerDown: () => {\n            setIsMoving(true);\n          },\n          onMove: e => {\n            tools().crop.drawZone(e.rect);\n          },\n          onResize: e => {\n            tools().crop.drawZone(e.rect);\n          },\n          onPointerUp: () => {\n            setIsMoving(false);\n          },\n        },\n        minHeight: 50,\n        minWidth: 50,\n        boundaryRect,\n        aspectRatio: aspectRatioFromStr(defaultRatio),\n      });\n    }\n    return () => {\n      tools().crop.zone?.destroy();\n    };\n    // boundary and aspect ratio will be updated by below hook when resetting cropzone\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, []);\n\n  // redraw cropzone if default aspect ratio or canvas size change\n  useLayoutEffect(() => {\n    tools().crop.registerRefs(refs);\n    tools().crop.resetCropzone(defaultRatio);\n  }, [defaultRatio, boundaryRect]);\n\n  const className = clsx(\n    'cropzone absolute z-cropzone isolate left-0 top-0 w-full h-full overflow-hidden',\n    {\n      moving: isMoving,\n    }\n  );\n\n  return (\n    <div\n      className={className}\n      onPointerDown={e => {\n        e.stopPropagation();\n        e.preventDefault();\n      }}\n    >\n      <div\n        className=\"cropzone-transition border-white/50 absolute z-10 left-0 top-0 border\"\n        ref={el => {\n          refs.current.innerZone = el;\n        }}\n      >\n        {!controlConfig?.hideTopLeft && (\n          <CornerHandle position=\"top-left\" inset />\n        )}\n        {!controlConfig?.hideTopRight && (\n          <CornerHandle position=\"top-right\" inset />\n        )}\n        {!controlConfig?.hideBottomLeft && (\n          <CornerHandle position=\"bottom-left\" inset />\n        )}\n        {!controlConfig?.hideBottomRight && (\n          <CornerHandle position=\"bottom-right\" inset />\n        )}\n\n        <Line name=\"lineVer1\" refs={refs} />\n        <Line name=\"lineVer2\" refs={refs} />\n        <Line name=\"lineHor1\" refs={refs} />\n        <Line name=\"lineHor2\" refs={refs} />\n      </div>\n\n      <MaskPart refs={refs} position={MaskPosition.top} />\n      <MaskPart refs={refs} position={MaskPosition.left} />\n      <MaskPart refs={refs} position={MaskPosition.right} />\n      <MaskPart refs={refs} position={MaskPosition.bottom} />\n    </div>\n  );\n}\n","import {InteractableAction} from './interactable-action';\nimport {InteractableEvent} from '../interactable-event';\nimport {InteractableRect} from '../interactable-rect';\n\nexport const ROTATION_HANDLE_CLASS = 'rotation-handle';\n\nexport class RotateAction implements InteractableAction {\n  callbackName = 'onRotate' as const;\n\n  private centerX = 0;\n  private centerY = 0;\n  private startAngle = 0;\n\n  matches(e: PointerEvent) {\n    const target = e.target as HTMLElement;\n    return target.classList.contains(ROTATION_HANDLE_CLASS);\n  }\n\n  onPointerDown(e: PointerEvent) {\n    const currentTarget = e.currentTarget as HTMLElement;\n    const rect = currentTarget.getBoundingClientRect();\n    // store the center as the element has css `transform-origin: center center`\n    this.centerX = rect.left + rect.width / 2;\n    this.centerY = rect.top + rect.height / 2;\n\n    const rotateVal =\n      currentTarget.style.transform.match(/rotate\\((.+?)\\)/)?.[1];\n    const [rotation = '0'] = rotateVal ? rotateVal.split(',') : [];\n    this.startAngle = parseFloat(rotation);\n\n    // get the angle of the element when the drag starts\n    this.startAngle = this.getDragAngle(e);\n    return {angle: this.startAngle};\n  }\n\n  onPointerUp() {\n    this.centerX = 0;\n    this.centerY = 0;\n    this.startAngle = 0;\n  }\n\n  execute(e: InteractableEvent): InteractableRect {\n    const newRect = {...e.currentRect};\n\n    newRect.angle = this.getDragAngle(e);\n    newRect.left += e.deltaX;\n    newRect.top += e.deltaY;\n\n    return newRect;\n  }\n\n  private getDragAngle(e: {pageX: number; pageY: number}) {\n    const center = {\n      x: this.centerX || 0,\n      y: this.centerY || 0,\n    };\n    const angle = Math.atan2(center.y - e.pageY, center.x - e.pageX);\n\n    return angle - (this.startAngle || 0);\n  }\n}\n","import React from 'react';\nimport {createSvgIcon} from '../../common/icons/create-svg-icon';\n\nexport const CustomDuplicateIcon = createSvgIcon(\n  <path d=\"M 7 2 C 6.448 2 6 2.448 6 3 C 6 3.552 6.448 4 7 4 L 20 4 L 20 17 C 20 17.552 20.448 18 21 18 C 21.552 18 22 17.552 22 17 L 22 4 C 22 2.895 21.105 2 20 2 L 7 2 z M 4 6 C 2.895 6 2 6.895 2 8 L 2 20 C 2 21.105 2.895 22 4 22 L 16 22 C 17.105 22 18 21.105 18 20 L 18 8 C 18 6.895 17.105 6 16 6 L 4 6 z M 10 10 C 10.552 10 11 10.448 11 11 L 11 13 L 13 13 C 13.552 13 14 13.448 14 14 C 14 14.552 13.552 15 13 15 L 11 15 L 11 17 C 11 17.552 10.552 18 10 18 C 9.448 18 9 17.552 9 17 L 9 15 L 7 15 C 6.448 15 6 14.552 6 14 C 6 13.448 6.448 13 7 13 L 9 13 L 9 11 C 9 10.448 9.448 10 10 10 z\" />\n);\n","import React from 'react';\nimport {createSvgIcon} from '../../common/icons/create-svg-icon';\n\nexport const CustomFlipIcon = createSvgIcon(\n  <path d=\"M 11 3 L 2 21 L 11 21 L 11 3 z M 13 3 L 13 21 L 22 21 L 13 3 z M 9 11.472656 L 9 19 L 5.2363281 19 L 9 11.472656 z\" />\n);\n","import React from 'react';\nimport {createSvgIcon} from '../../common/icons/create-svg-icon';\n\nexport const CustomFrontSortingIcon = createSvgIcon(\n  <path d=\"M 16.476562 2.4511719 C 16.392047 2.4657656 16.308531 2.5061719 16.238281 2.5761719 L 14.130859 4.6835938 C 13.956859 4.8575938 13.956859 5.1394531 14.130859 5.3144531 L 16.238281 7.4238281 C 16.519281 7.7048281 17 7.5054219 17 7.1074219 L 17 6 L 20 6 L 20 9 A 1.0001 1.0001 0 1 0 22 9 L 22 6 C 22 4.9069372 21.093063 4 20 4 L 17 4 L 17 2.8925781 C 17 2.5940781 16.730109 2.4073906 16.476562 2.4511719 z M 4 5 C 2.9069372 5 2 5.9069372 2 7 L 2 14 C 2 15.093063 2.9069372 16 4 16 L 7 16 L 7 19 C 7 20.105 7.895 21 9 21 L 16 21 C 17.105 21 18 20.105 18 19 L 18 12 C 18 10.895 17.105 10 16 10 L 13 10 L 13 7 C 13 5.9069372 12.093063 5 11 5 L 4 5 z M 4 7 L 11 7 L 11 14 L 4 14 L 4 7 z\" />\n);\n","import React from 'react';\nimport {createSvgIcon} from '../../common/icons/create-svg-icon';\n\nexport const CustomRemoveIcon = createSvgIcon(\n  <path d=\"M 10 2 L 9 3 L 3 3 L 3 5 L 21 5 L 21 3 L 15 3 L 14 2 L 10 2 z M 4.3652344 7 L 5.8925781 20.263672 C 6.0245781 21.253672 6.877 22 7.875 22 L 16.123047 22 C 17.121047 22 17.974422 21.254859 18.107422 20.255859 L 19.634766 7 L 4.3652344 7 z\" />\n);\n","import {Object} from 'fabric/fabric-impl';\nimport React from 'react';\nimport {IconButton} from '../../common/ui/buttons/icon-button';\nimport {useStore} from '../../state/store';\nimport {CustomDuplicateIcon} from '../../ui/icons/duplicate';\nimport {CustomFlipIcon} from '../../ui/icons/flip';\nimport {CustomFrontSortingIcon} from '../../ui/icons/front-sorting';\nimport {CustomRemoveIcon} from '../../ui/icons/remove';\nimport {state, tools} from '../../state/utils';\n\nconst floatingControlsSize = {\n  width: 120,\n  height: 30,\n};\n\nconst controls = [\n  {\n    name: 'Duplicate',\n    icon: CustomDuplicateIcon,\n    onPress: () => {\n      tools().objects.duplicate();\n    },\n  },\n  {\n    name: 'Flip',\n    icon: CustomFlipIcon,\n    onPress: () => {\n      tools().objects.flipHorizontally();\n    },\n  },\n  {\n    name: 'Bring to front',\n    icon: CustomFrontSortingIcon,\n    onPress: () => {\n      tools().objects.bringToFront();\n    },\n  },\n  {\n    name: 'Delete',\n    icon: CustomRemoveIcon,\n    onPress: () => {\n      tools().objects.delete();\n    },\n  },\n];\n\nexport const FloatingObjectControls = React.forwardRef<HTMLDivElement>(\n  (props, ref) => {\n    const isHidden = useStore(s => s.objects.active.isMoving);\n\n    const opacity = isHidden ? 'opacity-0' : 'opacity-100';\n    return (\n      <div\n        ref={ref}\n        className={`${opacity} absolute z-obj-box left-0 top-0 flex items-center text-white bg-controls rounded shadow transition-opacity overflow-hidden`}\n      >\n        {controls.map(control => {\n          const Icon = control.icon;\n          return (\n            <IconButton\n              key={control.name}\n              className=\"w-30 h-30 hover:bg-white/hover\"\n              radius=\"rounded-none\"\n              onPress={control.onPress}\n            >\n              <Icon className=\"icon-sm\" />\n            </IconButton>\n          );\n        })}\n      </div>\n    );\n  }\n);\n\nexport function repositionFloatingControls(\n  obj: Object,\n  el: HTMLElement | null\n) {\n  if (!el) return;\n  const angle = obj.angle || 0;\n  // make sure rotation handle is not covered when it's at the top\n  const floatingControlsTopOffset = angle > 168 && angle < 188 ? -30 : -15;\n  const canvas = state().canvasSize;\n  const stage = state().stageSize;\n  const size = floatingControlsSize;\n\n  // margin between canvas el and wrapper el edges\n  const canvasTopMargin = canvas.top - stage.top;\n  const canvasLeftMargin = canvas.left - stage.left;\n  const canvasRightMargin = stage.width - (canvasLeftMargin + canvas.width);\n  const canvasBottomMargin = stage.height - (canvasTopMargin + canvas.height);\n\n  // floating controls' max boundaries\n  const maxTop = -canvasTopMargin;\n  const maxLeft = -(canvas.left - stage.left);\n  const maxRight = canvas.width - size.width + canvasRightMargin;\n  const maxBottom = canvas.height - size.height + canvasBottomMargin;\n\n  // position floating controls\n  const boundingRect = obj.getBoundingRect();\n  let floatingTop = boundingRect.top - size.height + floatingControlsTopOffset;\n  let floatingLeft =\n    boundingRect.left + boundingRect.width / 2 - size.width / 2;\n\n  floatingTop = Math.min(maxBottom, Math.max(maxTop, floatingTop));\n  floatingLeft = Math.min(maxRight, Math.max(maxLeft, floatingLeft));\n\n  el.style.transform = `translate(${floatingLeft}px, ${floatingTop}px) rotate(0deg)`;\n}\n","import {RefObject} from 'react';\nimport {fabric} from 'fabric';\nimport {InteractableRect} from '../../../common/ui/interactions/interactable-rect';\nimport {repositionFloatingControls} from '../floating-object-controls';\nimport {isText} from '../../utils/is-text';\nimport {ObjectOptions} from '../../object-modified-event';\nimport {state, tools} from '../../../state/utils';\n\nexport function rotateActiveObj(e: {\n  rect: InteractableRect;\n  prevRect?: InteractableRect;\n}) {\n  const obj = tools().objects.getActive();\n  if (!obj) return;\n  const newAngle = fabric.util.radiansToDegrees(e.rect.angle);\n  if (newAngle !== obj.angle) {\n    tools().objects.setValues({angle: newAngle});\n  }\n}\n\nexport function moveActiveObj(e: {\n  rect: InteractableRect;\n  prevRect?: InteractableRect;\n}) {\n  const centerX = e.rect.width / 2;\n  const centerY = e.rect.height / 2;\n  tools().objects.setValues({\n    left: (e.rect.left + centerX) / state().zoom,\n    top: (e.rect.top + centerY) / state().zoom,\n  });\n}\n\nexport function resizeActiveObj(e: {\n  rect: InteractableRect;\n  prevRect?: InteractableRect;\n}) {\n  const obj = tools().objects.getActive();\n  if (!obj) return;\n\n  const newValues: ObjectOptions = {};\n\n  if (isText(obj)) {\n    const delta = e.rect.width - (e.prevRect?.width ?? 0);\n    if (\n      delta > 0 ||\n      (obj.getScaledHeight() >= 20 && obj.getScaledWidth() >= 20)\n    ) {\n      newValues.fontSize = (obj.fontSize || 1) + delta;\n    }\n  } else {\n    if (obj.width) {\n      newValues.scaleX = e.rect.width / state().zoom / obj.width;\n    }\n    if (obj.height) {\n      newValues.scaleY = e.rect.height / state().zoom / obj.height;\n    }\n  }\n  tools().objects.setValues(newValues);\n}\n\nexport function syncBoxPositionWithActiveObj(\n  boxRef: RefObject<HTMLElement>,\n  floatingControlsRef: RefObject<HTMLElement>\n) {\n  const obj = tools().objects.getActive();\n  if (!obj || !boxRef.current) return;\n  const el = boxRef.current;\n\n  // bounding box position\n  const angleRad = fabric.util.degreesToRadians(obj.angle ?? 0);\n  let width = Math.round(obj.getScaledWidth() * state().zoom);\n  let height = Math.round(obj.getScaledHeight() * state().zoom);\n  let left = Math.round((obj.left ?? 0) * state().zoom);\n  let top = Math.round((obj.top ?? 0) * state().zoom);\n\n  const centerX = obj.originX === 'center' ? width / 2 : 0;\n  const centerY = obj.originY === 'center' ? height / 2 : 0;\n\n  if (obj.padding) {\n    width += obj.padding * 2;\n    height += obj.padding * 2;\n    left -= obj.padding;\n    top -= obj.padding;\n  }\n\n  // position bounding box\n  el.style.width = `${width}px`;\n  el.style.height = `${height}px`;\n  el.style.transform = `translate(${left - centerX}px, ${\n    top - centerY\n  }px) rotate(${angleRad}rad)`;\n\n  tools().canvas.render();\n\n  repositionFloatingControls(obj, floatingControlsRef.current);\n}\n\nexport function enableTextEditing() {\n  const obj = tools().objects.getActive();\n  if (isText(obj)) {\n    obj.enterEditing();\n    obj.hiddenTextarea?.focus();\n  }\n}\n","import React from 'react';\nimport {ROTATION_HANDLE_CLASS} from '../../../common/ui/interactions/actions/rotate-action';\n\nexport function RotationControl() {\n  return (\n    <div className=\"absolute -bottom-20 left-1/2 w-2 h-20 bg-white cursor-default -translate-x-1/2\">\n      <div\n        className={`${ROTATION_HANDLE_CLASS} w-18 h-18 absolute -bottom-10 -left-8 bg-white rounded-full cursor-move`}\n      />\n    </div>\n  );\n}\n","import React, {useEffect, useRef} from 'react';\nimport {useStore} from '../../../state/store';\nimport {CornerHandle} from '../corner-handle';\nimport {Interactable} from '../../../common/ui/interactions/interactable';\nimport {MoveAction} from '../../../common/ui/interactions/actions/move-action';\nimport {ResizeAction} from '../../../common/ui/interactions/actions/resize-action';\nimport {RotateAction} from '../../../common/ui/interactions/actions/rotate-action';\nimport {ObjectControlConfig, PixieConfig} from '../../../config/default-config';\nimport {FloatingObjectControls} from '../floating-object-controls';\nimport {\n  enableTextEditing,\n  moveActiveObj,\n  resizeActiveObj,\n  rotateActiveObj,\n  syncBoxPositionWithActiveObj,\n} from './object-box-actions';\nimport {RotationControl} from './ratation-control';\nimport {ObjectModifiedEvent} from '../../object-modified-event';\nimport {fabricCanvas, state, tools} from '../../../state/utils';\n\nexport function ObjectBox() {\n  const boxRef = useRef<HTMLDivElement>(null!);\n  const interactableRef = useRef<Interactable>(null!);\n  const floatingControlsRef = useRef<HTMLDivElement>(null!);\n  const objectControlConfig = useStore(s => s.config.objectControls);\n  const activeObjId = useStore(s => s.objects.active.id);\n  const isEditingText = useStore(s => s.objects.isEditingText);\n  const zoom = useStore(s => s.zoom);\n  const objTypeConfig = getObjTypeConfig();\n\n  useEffect(() => {\n    // wait until fabric is initialized\n    if (!fabricCanvas()) return;\n    state().editor.on('object:modified', (e: ObjectModifiedEvent) => {\n      if (e.sizeOrPositionChanged) {\n        syncBoxPositionWithActiveObj(boxRef, floatingControlsRef);\n      }\n    });\n    interactableRef.current = new Interactable(boxRef.current, {\n      minWidth: 50,\n      minHeight: 50,\n      maintainInitialAspectRatio: true,\n      actions: [new MoveAction(), new ResizeAction(), new RotateAction()],\n      listeners: {\n        onPointerUp: () => {\n          state().objects.setActiveIsMoving(false);\n        },\n        onDoubleTap: () => {\n          enableTextEditing();\n        },\n        onRotate: e => {\n          state().objects.setActiveIsMoving(true);\n          rotateActiveObj(e);\n        },\n        onMove: e => {\n          state().objects.setActiveIsMoving(true);\n          moveActiveObj(e);\n        },\n        onResize: e => {\n          state().objects.setActiveIsMoving(true);\n          resizeActiveObj(e);\n        },\n      },\n    });\n    return () => {\n      interactableRef.current.destroy();\n    };\n  }, []);\n\n  // update interactable config when pixie config changes\n  useEffect(() => {\n    onObjectControlConfigChange(interactableRef.current, objTypeConfig);\n  }, [objectControlConfig]);\n\n  // reposition on when obj is selected/deselected, or zoom or after user is done with editing text\n  useEffect(() => {\n    syncBoxPositionWithActiveObj(boxRef, floatingControlsRef);\n  }, [activeObjId, zoom, isEditingText]);\n\n  const display = activeObjId && !isEditingText ? 'block' : 'hidden';\n\n  return (\n    <div className={display}>\n      <div\n        ref={boxRef}\n        className=\"absolute z-obj-box border-2 border-white shadow-md cursor-move\"\n      >\n        {!objTypeConfig.hideTopLeft && <CornerHandle position=\"top-left\" />}\n        {!objTypeConfig.hideTopRight && <CornerHandle position=\"top-right\" />}\n        {!objTypeConfig.hideBottomLeft && (\n          <CornerHandle position=\"bottom-left\" />\n        )}\n        {!objTypeConfig.hideBottomRight && (\n          <CornerHandle position=\"bottom-right\" />\n        )}\n        {!objTypeConfig.hideRotatingPoint && <RotationControl />}\n      </div>\n      <FloatingObjectControls ref={floatingControlsRef} />\n    </div>\n  );\n}\n\nfunction onObjectControlConfigChange(\n  interactable: Interactable,\n  objTypeConfig: ObjectControlConfig\n): void {\n  // maybe lock movement based on user config\n  const moveAction = interactable.config.actions.find(\n    a => a instanceof MoveAction\n  ) as MoveAction;\n  moveAction.lockMovement = !!objTypeConfig.lockMovement;\n\n  // maybe maintain aspect ratio\n  interactable.setConfig({\n    maintainInitialAspectRatio: !objTypeConfig.unlockAspectRatio,\n  });\n}\n\nfunction getObjTypeConfig(): ObjectControlConfig {\n  const obj = tools().objects.getActive();\n  if (!obj || !obj.name) return {};\n  const userConfig = state().config.objectControls || {};\n  const objName = obj.name as keyof PixieConfig['objectControls'];\n  return {\n    ...userConfig.global,\n    ...(userConfig[objName] as ObjectControlConfig),\n  };\n}\n","import React from 'react';\nimport {Cropzone} from '../../tools/crop/ui/cropzone/cropzone';\nimport {ObjectBox} from '../../objects/ui/object-box/object-box';\nimport {useStore} from '../../state/store';\nimport {ToolName} from '../../tools/tool-name';\n\nexport function StageOverlays() {\n  const cropToolIsActive = useStore(s => s.activeTool === ToolName.CROP);\n  const objIsSelected = useStore(s => s.objects.active.id);\n  return (\n    <div>\n      {cropToolIsActive && <Cropzone />}\n      {objIsSelected && <ObjectBox />}\n    </div>\n  );\n}\n","import React, {useEffect, useRef, useState} from 'react';\nimport {m, Variants} from 'framer-motion';\nimport {\n  createUseGesture,\n  dragAction,\n  FullGestureState,\n  pinchAction,\n} from '@use-gesture/react';\nimport {StageOverlays} from './stage-overlays';\nimport {useStore} from '../../state/store';\nimport {fabricCanvas, tools} from '../../state/utils';\nimport {assetUrl} from '../../utils/asset-url';\n\nconst useGesture = createUseGesture([dragAction, pinchAction]);\n\nexport const CanvasWrapper = React.forwardRef<HTMLCanvasElement>(\n  (props, canvasRef) => {\n    const [isVisible, setIsVisible] = useState(false);\n\n    useEffect(() => {\n      return useStore.subscribe(\n        s => s.loading,\n        loading => {\n          if (!loading) {\n            setIsVisible(true);\n          } else {\n            setIsVisible(false);\n          }\n        }\n      );\n    }, []);\n\n    const variants: Variants = {\n      visible: {\n        opacity: 1,\n        transition: {duration: 0.35, delay: 0.5},\n      },\n      hidden: {opacity: 0, transition: {duration: 0}},\n    };\n\n    return (\n      <PanContainer>\n        <m.div\n          initial={{opacity: 0}}\n          variants={variants}\n          animate={isVisible ? 'visible' : 'hidden'}\n          className=\"relative m-auto\"\n          style={{\n            backgroundImage: `url(${assetUrl('images/empty-canvas-bg.png')})`,\n          }}\n        >\n          <StageOverlays />\n          <canvas ref={canvasRef} />\n        </m.div>\n      </PanContainer>\n    );\n  }\n);\n\ntype PanContainerProps = {\n  children: React.ReactNode;\n};\n\nfunction PanContainer({children}: PanContainerProps) {\n  const ref = useRef<HTMLDivElement>(null!);\n\n  const bind = useGesture({\n    onPinch: e => {\n      if (!tools().zoom.allowUserZoom || !shouldHandleGesture(e)) {\n        return e.cancel();\n      }\n      if (e.direction[0] === 1) {\n        tools().zoom.zoomIn(0.01);\n      } else {\n        tools().zoom.zoomOut(0.01);\n      }\n      e.event.stopPropagation();\n      e.event.preventDefault();\n    },\n    onDrag: e => {\n      if (e.pinching || !shouldHandleGesture(e)) {\n        return e.cancel();\n      }\n      ref.current.scrollLeft -= e.delta[0];\n      ref.current.scrollTop -= e.delta[1];\n    },\n  });\n\n  return (\n    <div\n      ref={ref}\n      className=\"flex items-center justify-center w-full h-full overflow-hidden touch-none\"\n      {...bind()}\n    >\n      {children}\n    </div>\n  );\n}\n\nfunction shouldHandleGesture(\n  e: FullGestureState<'drag'> | FullGestureState<'pinch'>\n): boolean {\n  return !(\n    fabricCanvas().findTarget(e.event, false) || fabricCanvas().isDrawingMode\n  );\n}\n","import React from 'react';\nimport clsx from 'clsx';\n\ntype Props = {\n  actionBtn?: React.ReactNode;\n  children?: React.ReactNode;\n  className?: string;\n};\n\nexport function ToolControlsOverlayWrapper({\n  actionBtn,\n  children,\n  className,\n}: Props) {\n  return (\n    <div className={clsx(className, 'flex gap-16 items-center h-full')}>\n      {actionBtn && <div className=\"flex-shrink-0\">{actionBtn}</div>}\n      <div className=\"w-full flex-auto\">{children}</div>\n      {actionBtn && <div className=\"w-96\" />}\n    </div>\n  );\n}\n","import e,{useRef as r,useMemo as t,useEffect as n,useState as o,useCallback as a,useLayoutEffect as l}from\"react\";function u(){return(u=Object.assign||function(e){for(var r=1;r<arguments.length;r++){var t=arguments[r];for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n])}return e}).apply(this,arguments)}function c(e,r){if(null==e)return{};var t,n,o={},a=Object.keys(e);for(n=0;n<a.length;n++)r.indexOf(t=a[n])>=0||(o[t]=e[t]);return o}function i(e){var t=r(e),n=r(function(e){t.current&&t.current(e)});return t.current=e,n.current}var s=function(e,r,t){return void 0===r&&(r=0),void 0===t&&(t=1),e>t?t:e<r?r:e},f=function(e){return\"touches\"in e},v=function(e){return e&&e.ownerDocument.defaultView||self},d=function(e,r,t){var n=e.getBoundingClientRect(),o=f(r)?function(e,r){for(var t=0;t<e.length;t++)if(e[t].identifier===r)return e[t];return e[0]}(r.touches,t):r;return{left:s((o.pageX-(n.left+v(e).pageXOffset))/n.width),top:s((o.pageY-(n.top+v(e).pageYOffset))/n.height)}},h=function(e){!f(e)&&e.preventDefault()},m=e.memo(function(o){var a=o.onMove,l=o.onKey,s=c(o,[\"onMove\",\"onKey\"]),m=r(null),g=i(a),p=i(l),b=r(null),_=r(!1),x=t(function(){var e=function(e){h(e),(f(e)?e.touches.length>0:e.buttons>0)&&m.current?g(d(m.current,e,b.current)):t(!1)},r=function(){return t(!1)};function t(t){var n=_.current,o=v(m.current),a=t?o.addEventListener:o.removeEventListener;a(n?\"touchmove\":\"mousemove\",e),a(n?\"touchend\":\"mouseup\",r)}return[function(e){var r=e.nativeEvent,n=m.current;if(n&&(h(r),!function(e,r){return r&&!f(e)}(r,_.current)&&n)){if(f(r)){_.current=!0;var o=r.changedTouches||[];o.length&&(b.current=o[0].identifier)}n.focus(),g(d(n,r,b.current)),t(!0)}},function(e){var r=e.which||e.keyCode;r<37||r>40||(e.preventDefault(),p({left:39===r?.05:37===r?-.05:0,top:40===r?.05:38===r?-.05:0}))},t]},[p,g]),C=x[0],E=x[1],H=x[2];return n(function(){return H},[H]),e.createElement(\"div\",u({},s,{onTouchStart:C,onMouseDown:C,className:\"react-colorful__interactive\",ref:m,onKeyDown:E,tabIndex:0,role:\"slider\"}))}),g=function(e){return e.filter(Boolean).join(\" \")},p=function(r){var t=r.color,n=r.left,o=r.top,a=void 0===o?.5:o,l=g([\"react-colorful__pointer\",r.className]);return e.createElement(\"div\",{className:l,style:{top:100*a+\"%\",left:100*n+\"%\"}},e.createElement(\"div\",{className:\"react-colorful__pointer-fill\",style:{backgroundColor:t}}))},b=function(e,r,t){return void 0===r&&(r=0),void 0===t&&(t=Math.pow(10,r)),Math.round(t*e)/t},_={grad:.9,turn:360,rad:360/(2*Math.PI)},x=function(e){return\"#\"===e[0]&&(e=e.substr(1)),e.length<6?{r:parseInt(e[0]+e[0],16),g:parseInt(e[1]+e[1],16),b:parseInt(e[2]+e[2],16),a:1}:{r:parseInt(e.substr(0,2),16),g:parseInt(e.substr(2,2),16),b:parseInt(e.substr(4,2),16),a:1}},C=function(e,r){return void 0===r&&(r=\"deg\"),Number(e)*(_[r]||1)},E=function(e){var r=/hsla?\\(?\\s*(-?\\d*\\.?\\d+)(deg|rad|grad|turn)?[,\\s]+(-?\\d*\\.?\\d+)%?[,\\s]+(-?\\d*\\.?\\d+)%?,?\\s*[/\\s]*(-?\\d*\\.?\\d+)?(%)?\\s*\\)?/i.exec(e);return r?M({h:C(r[1],r[2]),s:Number(r[3]),l:Number(r[4]),a:void 0===r[5]?1:Number(r[5])/(r[6]?100:1)}):{h:0,s:0,v:0,a:1}},H=E,M=function(e){var r=e.s,t=e.l;return{h:e.h,s:(r*=(t<50?t:100-t)/100)>0?2*r/(t+r)*100:0,v:t+r,a:e.a}},N=function(e){var r=e.s,t=e.v,n=e.a,o=(200-r)*t/100;return{h:b(e.h),s:b(o>0&&o<200?r*t/100/(o<=100?o:200-o)*100:0),l:b(o/2),a:b(n,2)}},w=function(e){var r=N(e);return\"hsl(\"+r.h+\", \"+r.s+\"%, \"+r.l+\"%)\"},y=function(e){var r=N(e);return\"hsla(\"+r.h+\", \"+r.s+\"%, \"+r.l+\"%, \"+r.a+\")\"},q=function(e){var r=e.h,t=e.s,n=e.v,o=e.a;r=r/360*6,t/=100,n/=100;var a=Math.floor(r),l=n*(1-t),u=n*(1-(r-a)*t),c=n*(1-(1-r+a)*t),i=a%6;return{r:b(255*[n,u,l,l,c,n][i]),g:b(255*[c,n,n,u,l,l][i]),b:b(255*[l,l,c,n,n,u][i]),a:b(o,2)}},k=function(e){var r=/hsva?\\(?\\s*(-?\\d*\\.?\\d+)(deg|rad|grad|turn)?[,\\s]+(-?\\d*\\.?\\d+)%?[,\\s]+(-?\\d*\\.?\\d+)%?,?\\s*[/\\s]*(-?\\d*\\.?\\d+)?(%)?\\s*\\)?/i.exec(e);return r?D({h:C(r[1],r[2]),s:Number(r[3]),v:Number(r[4]),a:void 0===r[5]?1:Number(r[5])/(r[6]?100:1)}):{h:0,s:0,v:0,a:1}},O=k,I=function(e){var r=/rgba?\\(?\\s*(-?\\d*\\.?\\d+)(%)?[,\\s]+(-?\\d*\\.?\\d+)(%)?[,\\s]+(-?\\d*\\.?\\d+)(%)?,?\\s*[/\\s]*(-?\\d*\\.?\\d+)?(%)?\\s*\\)?/i.exec(e);return r?B({r:Number(r[1])/(r[2]?100/255:1),g:Number(r[3])/(r[4]?100/255:1),b:Number(r[5])/(r[6]?100/255:1),a:void 0===r[7]?1:Number(r[7])/(r[8]?100:1)}):{h:0,s:0,v:0,a:1}},j=I,z=function(e){var r=e.toString(16);return r.length<2?\"0\"+r:r},B=function(e){var r=e.r,t=e.g,n=e.b,o=e.a,a=Math.max(r,t,n),l=a-Math.min(r,t,n),u=l?a===r?(t-n)/l:a===t?2+(n-r)/l:4+(r-t)/l:0;return{h:b(60*(u<0?u+6:u)),s:b(a?l/a*100:0),v:b(a/255*100),a:o}},D=function(e){return{h:b(e.h),s:b(e.s),v:b(e.v),a:b(e.a,2)}},K=e.memo(function(r){var t=r.hue,n=r.onChange,o=g([\"react-colorful__hue\",r.className]);return e.createElement(\"div\",{className:o},e.createElement(m,{onMove:function(e){n({h:360*e.left})},onKey:function(e){n({h:s(t+360*e.left,0,360)})},\"aria-label\":\"Hue\",\"aria-valuetext\":b(t)},e.createElement(p,{className:\"react-colorful__hue-pointer\",left:t/360,color:w({h:t,s:100,v:100,a:1})})))}),L=e.memo(function(r){var t=r.hsva,n=r.onChange,o={backgroundColor:w({h:t.h,s:100,v:100,a:1})};return e.createElement(\"div\",{className:\"react-colorful__saturation\",style:o},e.createElement(m,{onMove:function(e){n({s:100*e.left,v:100-100*e.top})},onKey:function(e){n({s:s(t.s+100*e.left,0,100),v:s(t.v-100*e.top,0,100)})},\"aria-label\":\"Color\",\"aria-valuetext\":\"Saturation \"+b(t.s)+\"%, Brightness \"+b(t.v)+\"%\"},e.createElement(p,{className:\"react-colorful__saturation-pointer\",top:1-t.v/100,left:t.s/100,color:w(t)})))}),A=function(e,r){if(e===r)return!0;for(var t in e)if(e[t]!==r[t])return!1;return!0},S=function(e,r){return e.replace(/\\s/g,\"\")===r.replace(/\\s/g,\"\")};function T(e,t,l){var u=i(l),c=o(function(){return e.toHsva(t)}),s=c[0],f=c[1],v=r({color:t,hsva:s});n(function(){if(!e.equal(t,v.current.color)){var r=e.toHsva(t);v.current={hsva:r,color:t},f(r)}},[t,e]),n(function(){var r;A(s,v.current.hsva)||e.equal(r=e.fromHsva(s),v.current.color)||(v.current={hsva:s,color:r},u(r))},[s,e,u]);var d=a(function(e){f(function(r){return Object.assign({},r,e)})},[]);return[s,d]}var F,P=\"undefined\"!=typeof window?l:n,X=function(){return F||(\"undefined\"!=typeof __webpack_nonce__?__webpack_nonce__:void 0)},Y=function(e){F=e},R=new Map,V=function(e){P(function(){var r=e.current?e.current.ownerDocument:document;if(void 0!==r&&!R.has(r)){var t=r.createElement(\"style\");t.innerHTML='.react-colorful{position:relative;display:flex;flex-direction:column;width:200px;height:200px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:default}.react-colorful__saturation{position:relative;flex-grow:1;border-color:transparent;border-bottom:12px solid #000;border-radius:8px 8px 0 0;background-image:linear-gradient(0deg,#000,transparent),linear-gradient(90deg,#fff,hsla(0,0%,100%,0))}.react-colorful__alpha-gradient,.react-colorful__pointer-fill{content:\"\";position:absolute;left:0;top:0;right:0;bottom:0;pointer-events:none;border-radius:inherit}.react-colorful__alpha-gradient,.react-colorful__saturation{box-shadow:inset 0 0 0 1px rgba(0,0,0,.05)}.react-colorful__alpha,.react-colorful__hue{position:relative;height:24px}.react-colorful__hue{background:linear-gradient(90deg,red 0,#ff0 17%,#0f0 33%,#0ff 50%,#00f 67%,#f0f 83%,red)}.react-colorful__last-control{border-radius:0 0 8px 8px}.react-colorful__interactive{position:absolute;left:0;top:0;right:0;bottom:0;border-radius:inherit;outline:none;touch-action:none}.react-colorful__pointer{position:absolute;z-index:1;box-sizing:border-box;width:28px;height:28px;transform:translate(-50%,-50%);background-color:#fff;border:2px solid #fff;border-radius:50%;box-shadow:0 2px 4px rgba(0,0,0,.2)}.react-colorful__interactive:focus .react-colorful__pointer{transform:translate(-50%,-50%) scale(1.1)}.react-colorful__alpha,.react-colorful__alpha-pointer{background-color:#fff;background-image:url(\\'data:image/svg+xml;charset=utf-8,<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" fill-opacity=\".05\"><path d=\"M8 0h8v8H8zM0 8h8v8H0z\"/></svg>\\')}.react-colorful__saturation-pointer{z-index:3}.react-colorful__hue-pointer{z-index:2}',R.set(r,t);var n=X();n&&t.setAttribute(\"nonce\",n),r.head.appendChild(t)}},[])},$=function(t){var n=t.className,o=t.colorModel,a=t.color,l=void 0===a?o.defaultColor:a,i=t.onChange,s=c(t,[\"className\",\"colorModel\",\"color\",\"onChange\"]),f=r(null);V(f);var v=T(o,l,i),d=v[0],h=v[1],m=g([\"react-colorful\",n]);return e.createElement(\"div\",u({},s,{ref:f,className:m}),e.createElement(L,{hsva:d,onChange:h}),e.createElement(K,{hue:d.h,onChange:h,className:\"react-colorful__last-control\"}))},G={defaultColor:\"000\",toHsva:function(e){return B(x(e))},fromHsva:function(e){return t=(r=q(e)).g,n=r.b,\"#\"+z(r.r)+z(t)+z(n);var r,t,n},equal:function(e,r){return e.toLowerCase()===r.toLowerCase()||A(x(e),x(r))}},J=function(r){return e.createElement($,u({},r,{colorModel:G}))},Q=function(r){var t=r.className,n=r.hsva,o=r.onChange,a={backgroundImage:\"linear-gradient(90deg, \"+y(Object.assign({},n,{a:0}))+\", \"+y(Object.assign({},n,{a:1}))+\")\"},l=g([\"react-colorful__alpha\",t]);return e.createElement(\"div\",{className:l},e.createElement(\"div\",{className:\"react-colorful__alpha-gradient\",style:a}),e.createElement(m,{onMove:function(e){o({a:e.left})},onKey:function(e){o({a:s(n.a+e.left)})},\"aria-label\":\"Alpha\",\"aria-valuetext\":b(100*n.a)+\"%\"},e.createElement(p,{className:\"react-colorful__alpha-pointer\",left:n.a,color:y(n)})))},U=function(t){var n=t.className,o=t.colorModel,a=t.color,l=void 0===a?o.defaultColor:a,i=t.onChange,s=c(t,[\"className\",\"colorModel\",\"color\",\"onChange\"]),f=r(null);V(f);var v=T(o,l,i),d=v[0],h=v[1],m=g([\"react-colorful\",n]);return e.createElement(\"div\",u({},s,{ref:f,className:m}),e.createElement(L,{hsva:d,onChange:h}),e.createElement(K,{hue:d.h,onChange:h}),e.createElement(Q,{hsva:d,onChange:h,className:\"react-colorful__last-control\"}))},W={defaultColor:{h:0,s:0,l:0,a:1},toHsva:M,fromHsva:N,equal:A},Z=function(r){return e.createElement(U,u({},r,{colorModel:W}))},ee={defaultColor:\"hsla(0, 0%, 0%, 1)\",toHsva:E,fromHsva:y,equal:S},re=function(r){return e.createElement(U,u({},r,{colorModel:ee}))},te={defaultColor:{h:0,s:0,l:0},toHsva:function(e){return M({h:e.h,s:e.s,l:e.l,a:1})},fromHsva:function(e){return{h:(r=N(e)).h,s:r.s,l:r.l};var r},equal:A},ne=function(r){return e.createElement($,u({},r,{colorModel:te}))},oe={defaultColor:\"hsl(0, 0%, 0%)\",toHsva:H,fromHsva:w,equal:S},ae=function(r){return e.createElement($,u({},r,{colorModel:oe}))},le={defaultColor:{h:0,s:0,v:0,a:1},toHsva:function(e){return e},fromHsva:D,equal:A},ue=function(r){return e.createElement(U,u({},r,{colorModel:le}))},ce={defaultColor:\"hsva(0, 0%, 0%, 1)\",toHsva:k,fromHsva:function(e){var r=D(e);return\"hsva(\"+r.h+\", \"+r.s+\"%, \"+r.v+\"%, \"+r.a+\")\"},equal:S},ie=function(r){return e.createElement(U,u({},r,{colorModel:ce}))},se={defaultColor:{h:0,s:0,v:0},toHsva:function(e){return{h:e.h,s:e.s,v:e.v,a:1}},fromHsva:function(e){var r=D(e);return{h:r.h,s:r.s,v:r.v}},equal:A},fe=function(r){return e.createElement($,u({},r,{colorModel:se}))},ve={defaultColor:\"hsv(0, 0%, 0%)\",toHsva:O,fromHsva:function(e){var r=D(e);return\"hsv(\"+r.h+\", \"+r.s+\"%, \"+r.v+\"%)\"},equal:S},de=function(r){return e.createElement($,u({},r,{colorModel:ve}))},he={defaultColor:{r:0,g:0,b:0,a:1},toHsva:B,fromHsva:q,equal:A},me=function(r){return e.createElement(U,u({},r,{colorModel:he}))},ge={defaultColor:\"rgba(0, 0, 0, 1)\",toHsva:I,fromHsva:function(e){var r=q(e);return\"rgba(\"+r.r+\", \"+r.g+\", \"+r.b+\", \"+r.a+\")\"},equal:S},pe=function(r){return e.createElement(U,u({},r,{colorModel:ge}))},be={defaultColor:{r:0,g:0,b:0},toHsva:function(e){return B({r:e.r,g:e.g,b:e.b,a:1})},fromHsva:function(e){return{r:(r=q(e)).r,g:r.g,b:r.b};var r},equal:A},_e=function(r){return e.createElement($,u({},r,{colorModel:be}))},xe={defaultColor:\"rgb(0, 0, 0)\",toHsva:j,fromHsva:function(e){var r=q(e);return\"rgb(\"+r.r+\", \"+r.g+\", \"+r.b+\")\"},equal:S},Ce=function(r){return e.createElement($,u({},r,{colorModel:xe}))},Ee=/^#?([0-9A-F]{3,8})$/i,He=function(r){var t=r.color,l=void 0===t?\"\":t,s=r.onChange,f=r.onBlur,v=r.escape,d=r.validate,h=r.format,m=r.process,g=c(r,[\"color\",\"onChange\",\"onBlur\",\"escape\",\"validate\",\"format\",\"process\"]),p=o(function(){return v(l)}),b=p[0],_=p[1],x=i(s),C=i(f),E=a(function(e){var r=v(e.target.value);_(r),d(r)&&x(m?m(r):r)},[v,m,d,x]),H=a(function(e){d(e.target.value)||_(v(l)),C(e)},[l,v,d,C]);return n(function(){_(v(l))},[l,v]),e.createElement(\"input\",u({},g,{value:h?h(b):b,spellCheck:\"false\",onChange:E,onBlur:H}))},Me=function(e){return\"#\"+e},Ne=function(r){var t=r.prefixed,n=r.alpha,o=c(r,[\"prefixed\",\"alpha\"]),l=a(function(e){return e.replace(/([^0-9A-F]+)/gi,\"\").substr(0,n?8:6)},[n]),i=a(function(e){return function(e,r){var t=Ee.exec(e),n=t?t[1].length:0;return 3===n||6===n||!!r&&4===n||!!r&&8===n}(e,n)},[n]);return e.createElement(He,u({},o,{escape:l,format:t?Me:void 0,process:Me,validate:i}))};export{Ne as HexColorInput,J as HexColorPicker,ne as HslColorPicker,ae as HslStringColorPicker,Z as HslaColorPicker,re as HslaStringColorPicker,fe as HsvColorPicker,de as HsvStringColorPicker,ue as HsvaColorPicker,ie as HsvaStringColorPicker,_e as RgbColorPicker,Ce as RgbStringColorPicker,me as RgbaColorPicker,pe as RgbaStringColorPicker,Y as setNonce};\n//# sourceMappingURL=index.module.js.map\n","import React from 'react';\nimport clsx from 'clsx';\nimport {ButtonBase} from '../buttons/button-base';\n\ntype Props = {\n  onChange?: (e: string) => void;\n  selectedColor?: string;\n  colors: string[];\n};\nexport function ColorSwatch({onChange, selectedColor, colors}: Props) {\n  const presetBtns = colors.map(color => {\n    const isSelected = selectedColor === color;\n    return (\n      <ButtonBase\n        key={color}\n        onPress={() => {\n          onChange?.(color);\n        }}\n        className={clsx(\n          'relative block flex-shrink-0 w-26 h-26 border rounded',\n          isSelected && 'shadow-md'\n        )}\n        style={{backgroundColor: color}}\n      >\n        {isSelected && (\n          <span className=\"absolute inset-0 m-auto rounded-full w-8 h-8 bg-white\" />\n        )}\n      </ButtonBase>\n    );\n  });\n\n  return <div className=\"flex gap-6 p-12\">{presetBtns}</div>;\n}\n","import {HexColorPicker} from 'react-colorful';\nimport React from 'react';\nimport {ColorSwatch} from './color-swatch';\n\ntype Props = {\n  onChange?: (e: string) => void;\n  selectedColor?: string;\n  colorPresets?: string[];\n};\nexport function ColorPicker({onChange, selectedColor, colorPresets}: Props) {\n  return (\n    <div className=\"bg-paper rounded shadow-md\">\n      <HexColorPicker className=\"!w-auto\" onChange={onChange} />\n      {colorPresets && (\n        <ColorSwatch\n          colors={colorPresets}\n          onChange={onChange}\n          selectedColor={selectedColor}\n        />\n      )}\n    </div>\n  );\n}\n","import React, {HTMLAttributes} from 'react';\n\nexport interface DialogContextValue extends HTMLAttributes<HTMLElement> {\n  type: 'modal' | 'popover' | 'tray' | 'fullscreen' | 'fullscreenTakeover';\n  isDismissable?: boolean;\n  onClose: () => void;\n  disableInitialTransition?: boolean;\n}\n\nexport const DialogContext = React.createContext<DialogContextValue>(null!);\n","import React, {HTMLAttributes, ReactElement, RefObject} from 'react';\nimport {AnimatePresence} from 'framer-motion';\nimport {AriaButtonProps} from '@react-types/button';\nimport {OverlayTriggerState} from '@react-stately/overlays';\nimport {mergeProps} from '@react-aria/utils';\nimport {DialogContext, DialogContextValue} from '../dialog-context';\nimport {DialogType} from '../dialog/dialog';\n\nexport interface DialogTriggerBaseProps {\n  type: DialogType;\n  state: OverlayTriggerState;\n  isDismissable?: boolean;\n  overlayProps?: HTMLAttributes<HTMLElement>;\n  triggerProps: AriaButtonProps & {ref: RefObject<HTMLElement>};\n  overlay: ReactElement;\n  trigger?: ReactElement;\n  disableInitialTransition?: boolean;\n}\nexport function DialogTriggerBase({\n  state,\n  triggerProps,\n  type,\n  isDismissable,\n  overlay,\n  overlayProps = {},\n  trigger,\n  disableInitialTransition,\n}: DialogTriggerBaseProps) {\n  const context: DialogContextValue = {\n    type,\n    onClose: state.close,\n    isDismissable,\n    disableInitialTransition,\n    ...overlayProps,\n  };\n\n  return (\n    <>\n      {trigger &&\n        React.cloneElement(\n          trigger,\n          mergeProps(\n            {\n              onPress: () => state.toggle(),\n              // TODO: https://github.com/vitejs/vite/issues/5646\n              key: trigger.key || trigger.props.id,\n            },\n            triggerProps\n          )\n        )}\n      <AnimatePresence>\n        {state.isOpen && (\n          <DialogContext.Provider value={context}>\n            {overlay}\n          </DialogContext.Provider>\n        )}\n      </AnimatePresence>\n    </>\n  );\n}\n","import React, { ReactElement, ReactNode, RefObject } from \"react\";\nimport { Placement } from \"@react-types/overlays\";\nimport { OverlayTriggerState } from \"@react-stately/overlays\";\nimport { useOverlayTrigger } from \"@react-aria/overlays\";\nimport { Popover } from \"./popover\";\nimport { DialogTriggerBase } from \"../dialog-trigger/dialog-trigger-base\";\nimport { useOverlayPosition } from \"../use-overlay-position\";\n\nexport interface PopoverTriggerProps {\n  state: OverlayTriggerState;\n  trigger?: ReactElement;\n  targetRef?: RefObject<HTMLElement>;\n  children: ReactNode;\n  hideArrow: boolean | undefined;\n  placement?: Placement;\n  containerPadding?: number;\n  offset?: number;\n  crossOffset?: number;\n  shouldFlip?: boolean;\n}\nexport function PopoverTrigger({\n  state,\n  targetRef,\n  trigger,\n  hideArrow,\n  children,\n  ...props\n}: PopoverTriggerProps) {\n  const { triggerRef, overlayRef, positionStyle, triggerObjRef } =\n    useOverlayPosition(props);\n\n  // Get props for the trigger and overlay. This also handles\n  // hiding the overlay when a parent element of the trigger scrolls\n  // (which invalidates the popover positioning).\n  const { triggerProps, overlayProps } = useOverlayTrigger(\n    { type: \"dialog\" },\n    state,\n    triggerObjRef\n  );\n\n  const overlay = (\n    <Popover\n      style={positionStyle}\n      isOpen={state.isOpen}\n      ref={overlayRef}\n      onClose={state.close}\n      hideArrow={hideArrow}\n    >\n      {children}\n    </Popover>\n  );\n\n  return (\n    <DialogTriggerBase\n      type=\"popover\"\n      state={state}\n      triggerProps={{ ...triggerProps, ref: triggerRef }}\n      overlayProps={overlayProps}\n      overlay={overlay}\n      trigger={trigger}\n    />\n  );\n}\n","import React, {\n  forwardRef,\n  HTMLAttributes,\n  ReactNode,\n  useContext,\n  useRef,\n} from 'react';\nimport {m} from 'framer-motion';\nimport {useModal, useOverlay, usePreventScroll} from '@react-aria/overlays';\nimport {mergeProps} from '@react-aria/utils';\nimport {Underlay} from './underlay';\nimport {DialogContext} from '../dialog-context';\nimport {Overlay} from '../overlay';\n\nexport type ModalType = 'modal' | 'tray' | 'fullscreen' | 'fullscreenTakeover';\n\nexport interface ModalProps {\n  children: ReactNode;\n  isOpen?: boolean;\n  container?: Element;\n  onClose?: () => void;\n  type: ModalType;\n  isDismissable?: boolean;\n}\n\nexport function Modal(props: ModalProps) {\n  const {children, onClose, type, isOpen, isDismissable, ...otherProps} = props;\n  const ref = useRef<HTMLDivElement>(null);\n  const {disableInitialTransition} = useContext(DialogContext);\n\n  // Handle interacting outside the dialog and pressing\n  // the Escape key to close the modal.\n  const {overlayProps, underlayProps} = useOverlay(props, ref);\n\n  return (\n    <Overlay\n      type=\"modal\"\n      {...otherProps}\n      className=\"absolute inset-0 flex items-center justify-center\"\n    >\n      <Underlay\n        disableInitialTransition={disableInitialTransition}\n        key=\"modal-underlay\"\n        {...underlayProps}\n      />\n      <ModalWrapper\n        key=\"modal-wrapper\"\n        onClose={onClose}\n        isOpen={isOpen}\n        type={type}\n        ref={ref}\n        overlayProps={overlayProps}\n      >\n        {children}\n      </ModalWrapper>\n    </Overlay>\n  );\n}\n\ninterface ModalWrapperProps extends HTMLAttributes<HTMLElement> {\n  children: ReactNode;\n  isOpen?: boolean;\n  onClose?: () => void;\n  type: ModalType;\n  overlayProps: HTMLAttributes<HTMLElement>;\n}\nconst ModalWrapper = forwardRef<HTMLDivElement, ModalWrapperProps>(\n  (props, ref) => {\n    const {children, isOpen, type, overlayProps, ...otherProps} = props;\n    const {disableInitialTransition} = useContext(DialogContext);\n\n    usePreventScroll();\n    // Hide content outside the modal from screen readers.\n    const {modalProps} = useModal();\n\n    const animate = {opacity: 1, scale: 1};\n\n    return (\n      <m.div\n        className=\"z-20\"\n        initial={disableInitialTransition ? animate : {opacity: 0, scale: 0.7}}\n        animate={animate}\n        exit={{opacity: 0, scale: 1}}\n      >\n        <div {...mergeProps(otherProps, overlayProps, modalProps)} ref={ref}>\n          {children}\n        </div>\n      </m.div>\n    );\n  }\n);\n","import React, {ReactElement, useRef} from 'react';\nimport {OverlayTriggerState} from '@react-stately/overlays';\nimport {DialogTriggerBase} from '../dialog-trigger/dialog-trigger-base';\nimport {Modal, ModalType} from './modal';\nimport {Tray} from '../tray';\n\ninterface ModalTriggerProps {\n  state: OverlayTriggerState;\n  trigger?: ReactElement;\n  children: ReactElement;\n  type: ModalType;\n  /** Whether a modal type Dialog should be dismissable. */\n  isDismissable: boolean;\n  disableInitialTransition?: boolean;\n}\nexport function ModalTrigger({\n  state,\n  trigger,\n  children,\n  type,\n  isDismissable,\n  disableInitialTransition,\n}: ModalTriggerProps) {\n  const triggerRef = useRef<HTMLElement>(null);\n\n  const renderOverlay = () => {\n    switch (type) {\n      case 'tray':\n        return (\n          <Tray isOpen={state.isOpen} onClose={state.close}>\n            {children}\n          </Tray>\n        );\n      default:\n        return (\n          <Modal\n            isOpen={state.isOpen}\n            isDismissable={isDismissable}\n            onClose={state.close}\n            type={type}\n          >\n            {children}\n          </Modal>\n        );\n    }\n  };\n\n  return (\n    <DialogTriggerBase\n      type={type}\n      state={state}\n      disableInitialTransition={disableInitialTransition}\n      triggerProps={{ref: triggerRef}}\n      isDismissable={isDismissable}\n      overlay={renderOverlay()}\n      trigger={trigger}\n    />\n  );\n}\n","import {useEffect, useState} from 'react';\nimport {useIsSSR} from '@react-aria/ssr';\n\nexport function useMediaQuery(query: string) {\n  const supportsMatchMedia =\n    typeof window !== 'undefined' && typeof window.matchMedia === 'function';\n  const [matches, setMatches] = useState(() =>\n    supportsMatchMedia ? window.matchMedia(query).matches : false\n  );\n\n  useEffect(() => {\n    if (!supportsMatchMedia) {\n      return;\n    }\n\n    const mq = window.matchMedia(query);\n    const onChange = (e: MediaQueryListEvent) => {\n      setMatches(e.matches);\n    };\n\n    mq.addEventListener('change', onChange);\n    return () => {\n      mq.removeEventListener('change', onChange);\n    };\n  }, [supportsMatchMedia, query]);\n\n  // If in SSR, the media query should never match. Once the page hydrates,\n  // this will update and the real value will be returned.\n  const isSSR = useIsSSR();\n  return isSSR ? false : matches;\n}\n","import {useMediaQuery} from './use-media-query';\n\nexport function useIsMobileMediaQuery() {\n  return useMediaQuery('(max-width: 700px)');\n}\n","import React, {ReactElement, RefObject} from 'react';\nimport {Placement} from '@react-types/overlays';\nimport {\n  OverlayTriggerState,\n  useOverlayTriggerState,\n} from '@react-stately/overlays';\nimport {PopoverTrigger} from '../popover/popover-trigger';\nimport {ModalType} from '../modal/modal';\nimport {ModalTrigger} from '../modal/modal-trigger';\nimport {useIsMobileMediaQuery} from '../../../utils/hooks/is-mobile-media-query';\n\ntype Child = ((state: OverlayTriggerState) => ReactElement) | ReactElement;\nexport interface DialogTriggerProps {\n  children: [Child, Child] | Child;\n  type: 'popover' | ModalType;\n  mobileType?: ModalType;\n  hideArrow?: boolean;\n  placement?: Placement;\n  targetRef?: RefObject<HTMLElement>;\n  isDismissable?: boolean;\n  isOpen?: boolean;\n  onClose?: () => void;\n  disableInitialTransition?: boolean;\n}\nexport function DialogTrigger(props: DialogTriggerProps) {\n  let {\n    type = 'modal',\n    isDismissable = true,\n    // eslint-disable-next-line prefer-const\n    mobileType = type === 'popover' ? 'modal' : type,\n  } = props;\n  const {children, hideArrow, targetRef, disableInitialTransition, onClose} =\n    props;\n\n  // On small devices, show a modal or tray instead of a popover.\n  const isMobile = useIsMobileMediaQuery();\n  if (isMobile) {\n    // handle cases where desktop popovers need a close button for the mobile modal view\n    if (type !== 'modal' && mobileType === 'modal') {\n      isDismissable = true;\n    }\n\n    type = mobileType;\n  }\n\n  const state = useOverlayTriggerState({\n    ...props,\n    onOpenChange: isOpen => {\n      if (!isOpen && onClose) {\n        onClose();\n      }\n    },\n  });\n  const {trigger, content} = unwrapChildren(children, state);\n\n  if (type === 'popover') {\n    return (\n      <PopoverTrigger\n        state={state}\n        targetRef={targetRef}\n        trigger={trigger}\n        hideArrow={hideArrow}\n      >\n        {content}\n      </PopoverTrigger>\n    );\n  }\n  return (\n    <ModalTrigger\n      state={state}\n      trigger={trigger}\n      type={type}\n      isDismissable={isDismissable}\n      disableInitialTransition={disableInitialTransition}\n    >\n      {content}\n    </ModalTrigger>\n  );\n}\n\nfunction unwrapChildren(\n  children: DialogTriggerProps['children'],\n  state: OverlayTriggerState\n): {trigger?: ReactElement; content: ReactElement} {\n  if (Array.isArray(children)) {\n    const [trigger, content] = children;\n    return {\n      trigger: typeof trigger === 'function' ? trigger(state) : trigger,\n      content: typeof content === 'function' ? content(state) : content,\n    };\n  }\n  return {\n    content: children as ReactElement,\n  };\n}\n","import {useSlotId as $13nrU$useSlotId, filterDOMProps as $13nrU$filterDOMProps} from \"@react-aria/utils\";\nimport {focusSafely as $13nrU$focusSafely} from \"@react-aria/focus\";\nimport {useEffect as $13nrU$useEffect} from \"react\";\n\nfunction $parcel$export(e, n, v, s) {\n  Object.defineProperty(e, n, {get: v, set: s, enumerable: true, configurable: true});\n}\nvar $3c6c2b36038e497e$exports = {};\n\n$parcel$export($3c6c2b36038e497e$exports, \"useDialog\", () => $3c6c2b36038e497e$export$d55e7ee900f34e93);\n\n\n\nfunction $3c6c2b36038e497e$export$d55e7ee900f34e93(props, ref) {\n    let { role: role = 'dialog'  } = props;\n    let titleId = $13nrU$useSlotId();\n    titleId = props['aria-label'] ? undefined : titleId;\n    // Focus the dialog itself on mount, unless a child element is already focused.\n    $13nrU$useEffect(()=>{\n        if (ref.current && !ref.current.contains(document.activeElement)) {\n            $13nrU$focusSafely(ref.current);\n            // Safari on iOS does not move the VoiceOver cursor to the dialog\n            // or announce that it has opened until it has rendered. A workaround\n            // is to wait for half a second, then blur and re-focus the dialog.\n            let timeout = setTimeout(()=>{\n                if (document.activeElement === ref.current) {\n                    ref.current.blur();\n                    $13nrU$focusSafely(ref.current);\n                }\n            }, 500);\n            return ()=>{\n                clearTimeout(timeout);\n            };\n        }\n    }, [\n        ref\n    ]);\n    // We do not use aria-modal due to a Safari bug which forces the first focusable element to be focused\n    // on mount when inside an iframe, no matter which element we programmatically focus.\n    // See https://bugs.webkit.org/show_bug.cgi?id=211934.\n    // useModal sets aria-hidden on all elements outside the dialog, so the dialog will behave as a modal\n    // even without aria-modal on the dialog itself.\n    return {\n        dialogProps: {\n            ...$13nrU$filterDOMProps(props, {\n                labelable: true\n            }),\n            role: role,\n            tabIndex: -1,\n            'aria-labelledby': props['aria-labelledby'] || titleId\n        },\n        titleProps: {\n            id: titleId\n        }\n    };\n}\n\n\n\n\nexport {$3c6c2b36038e497e$export$d55e7ee900f34e93 as useDialog};\n//# sourceMappingURL=module.js.map\n","import {HTMLAttributes, ReactNode} from 'react';\n\ntype Props = {\n  children: ReactNode;\n  className?: string;\n  titleProps?: HTMLAttributes<HTMLElement>;\n};\nexport function DialogHeader({children, className, titleProps}: Props) {\n  return (\n    <h3 {...titleProps} className={className}>\n      {children}\n    </h3>\n  );\n}\n","import React, {ReactElement, ReactNode, useContext, useRef} from 'react';\nimport {AriaLabelingProps, DOMProps} from '@react-types/shared';\nimport clsx from 'clsx';\nimport {useDialog} from '@react-aria/dialog';\nimport {mergeProps} from '@react-aria/utils';\nimport {FocusScope} from '@react-aria/focus';\nimport {DismissButton} from '@react-aria/overlays';\nimport {DialogContext} from '../dialog-context';\nimport {IconButton} from '../../buttons/icon-button';\nimport {DialogHeader} from './dialog-header';\nimport {CloseIcon} from '../../../icons/material/Close';\n\nexport type DialogType =\n  | 'modal'\n  | 'popover'\n  | 'tray'\n  | 'fullscreen'\n  | 'fullscreenTakeover';\n\nexport interface AriaDialogProps extends DOMProps, AriaLabelingProps {\n  role?: 'dialog' | 'alertdialog';\n}\n\nexport interface DialogProps extends AriaDialogProps {\n  children: ReactNode;\n  size?: 'S' | 'M' | 'L';\n  className?: string;\n}\n\nexport function Dialog(props: DialogProps) {\n  const {type = 'modal', ...contextProps} = useContext(DialogContext);\n  const ref = useRef<HTMLDivElement>(null);\n  const {dialogProps, titleProps} = useDialog(\n    mergeProps(contextProps, props),\n    ref\n  );\n\n  const {children, className} = props;\n\n  // If rendered in a popover or tray there won't be a visible dismiss button,\n  // so we render a hidden one for screen readers.\n  let dismissButton: ReactElement | null = null;\n  if (type === 'popover' || type === 'tray') {\n    dismissButton = <DismissButton onDismiss={contextProps.onClose} />;\n  }\n\n  let hasHeader = false;\n  const dialogChildren = React.Children.map(children, child => {\n    if (React.isValidElement(child) && child.type === DialogHeader) {\n      hasHeader = true;\n      return React.cloneElement(child, {...child.props, titleProps});\n    }\n    return child;\n  });\n\n  // use max-h-inherit so can add scroll to whole popover\n  const mergedClassName = clsx(\n    'bg-paper rounded shadow-lg max-h-inherit max-w-full focus:outline-none',\n    className\n  );\n\n  return (\n    <FocusScope contain restoreFocus>\n      <section {...dialogProps} className={mergedClassName} ref={ref}>\n        {contextProps.isDismissable && hasHeader && (\n          <IconButton aria-label=\"Dismiss\" onPress={contextProps.onClose}>\n            <CloseIcon />\n          </IconButton>\n        )}\n        {dialogChildren}\n        {dismissButton}\n      </section>\n    </FocusScope>\n  );\n}\n","import React, {useState} from 'react';\nimport {ValueBase} from '@react-types/shared';\nimport clsx from 'clsx';\nimport {AriaFieldProps, useField} from '@react-aria/label';\nimport {ColorPicker} from '../common/ui/color-picker/color-picker';\nimport {useStore} from '../state/store';\nimport {inputFieldStyle} from '../common/ui/inputs/input-field/input-field-style';\nimport {CommonInputFieldProps} from '../common/ui/inputs/input-field/input-field-props';\nimport {DialogTrigger} from '../common/ui/overlays/dialog-trigger/dialog-trigger';\nimport {ButtonBase} from '../common/ui/buttons/button-base';\nimport {Dialog} from '../common/ui/overlays/dialog/dialog';\nimport {KeyboardArrowDownIcon} from '../common/icons/material/KeyboardArrowDown';\n\ninterface ColorPickerButtonProps\n  extends AriaFieldProps,\n    ValueBase<string>,\n    CommonInputFieldProps {}\n\nexport function ColorPickerButton(props: ColorPickerButtonProps) {\n  const {label, className, value, onChange, size} = props;\n  const colors = useStore(s => s.config.ui?.colorPresets?.items) || [];\n  const style = inputFieldStyle({size});\n  const [selectedColor, setSelectedColor] = useState(value);\n\n  const {labelProps, fieldProps} = useField({\n    labelElementType: 'span',\n    ...props,\n  });\n\n  const onColorChange = (newColor: string) => {\n    setSelectedColor(newColor);\n    onChange?.(newColor);\n  };\n\n  return (\n    <div className={className}>\n      {label && (\n        <span className={style.label} {...labelProps}>\n          {label}\n        </span>\n      )}\n      <DialogTrigger type=\"popover\" hideArrow>\n        {state => (\n          <ButtonBase\n            className={clsx(style.input, 'inline-flex items-center')}\n            {...fieldProps}\n          >\n            <span\n              className=\"block flex-shrink-0 mr-5 border rounded h-2/4 aspect-square\"\n              style={{backgroundColor: selectedColor}}\n            />\n            <ArrowIcon isActive={state.isOpen} className={style.adornment} />\n          </ButtonBase>\n        )}\n        <Dialog>\n          <ColorPicker\n            onChange={onColorChange}\n            selectedColor={selectedColor}\n            colorPresets={colors}\n          />\n        </Dialog>\n      </DialogTrigger>\n    </div>\n  );\n}\n\ntype ArrowProps = {\n  isActive: boolean;\n  className: string;\n};\n\nexport function ArrowIcon({isActive, className}: ArrowProps) {\n  const rotation = isActive ? 'rotate-180' : 'rotate-0';\n  return (\n    <KeyboardArrowDownIcon\n      className={`transition-transform ml-auto flex-shrink-0 ${rotation} ${className}`}\n    />\n  );\n}\n","import {snapValueToStep as $drHW0$snapValueToStep, clamp as $drHW0$clamp} from \"@react-aria/utils\";\nimport {useControlledState as $drHW0$useControlledState} from \"@react-stately/utils\";\nimport {useState as $drHW0$useState, useRef as $drHW0$useRef} from \"react\";\n\nfunction $parcel$export(e, n, v, s) {\n  Object.defineProperty(e, n, {get: v, set: s, enumerable: true, configurable: true});\n}\nvar $8f011f344c0ccbcc$exports = {};\n\n$parcel$export($8f011f344c0ccbcc$exports, \"useSliderState\", () => $8f011f344c0ccbcc$export$e5fda3247f5d67f9);\n\n\n\nconst $8f011f344c0ccbcc$var$DEFAULT_MIN_VALUE = 0;\nconst $8f011f344c0ccbcc$var$DEFAULT_MAX_VALUE = 100;\nconst $8f011f344c0ccbcc$var$DEFAULT_STEP_VALUE = 1;\nfunction $8f011f344c0ccbcc$export$e5fda3247f5d67f9(props) {\n    const { isDisabled: isDisabled , minValue: minValue = $8f011f344c0ccbcc$var$DEFAULT_MIN_VALUE , maxValue: maxValue = $8f011f344c0ccbcc$var$DEFAULT_MAX_VALUE , numberFormatter: formatter , step: step = $8f011f344c0ccbcc$var$DEFAULT_STEP_VALUE  } = props;\n    var _defaultValue;\n    const [values, setValues] = $drHW0$useControlledState(props.value, (_defaultValue = props.defaultValue) !== null && _defaultValue !== void 0 ? _defaultValue : [\n        minValue\n    ], props.onChange);\n    const [isDraggings, setDraggings] = $drHW0$useState(new Array(values.length).fill(false));\n    const isEditablesRef = $drHW0$useRef(new Array(values.length).fill(true));\n    const [focusedIndex, setFocusedIndex] = $drHW0$useState(undefined);\n    const valuesRef = $drHW0$useRef(null);\n    valuesRef.current = values;\n    const isDraggingsRef = $drHW0$useRef(null);\n    isDraggingsRef.current = isDraggings;\n    function getValuePercent(value) {\n        return (value - minValue) / (maxValue - minValue);\n    }\n    function getThumbMinValue(index) {\n        return index === 0 ? minValue : values[index - 1];\n    }\n    function getThumbMaxValue(index) {\n        return index === values.length - 1 ? maxValue : values[index + 1];\n    }\n    function isThumbEditable(index) {\n        return isEditablesRef.current[index];\n    }\n    function setThumbEditable(index, editable) {\n        isEditablesRef.current[index] = editable;\n    }\n    function updateValue(index, value) {\n        if (isDisabled || !isThumbEditable(index)) return;\n        const thisMin = getThumbMinValue(index);\n        const thisMax = getThumbMaxValue(index);\n        // Round value to multiple of step, clamp value between min and max\n        value = $drHW0$snapValueToStep(value, thisMin, thisMax, step);\n        valuesRef.current = $8f011f344c0ccbcc$var$replaceIndex(valuesRef.current, index, value);\n        setValues(valuesRef.current);\n    }\n    function updateDragging(index, dragging) {\n        if (isDisabled || !isThumbEditable(index)) return;\n        const wasDragging = isDraggingsRef.current[index];\n        isDraggingsRef.current = $8f011f344c0ccbcc$var$replaceIndex(isDraggingsRef.current, index, dragging);\n        setDraggings(isDraggingsRef.current);\n        // Call onChangeEnd if no handles are dragging.\n        if (props.onChangeEnd && wasDragging && !isDraggingsRef.current.some(Boolean)) props.onChangeEnd(valuesRef.current);\n    }\n    function getFormattedValue(value) {\n        return formatter.format(value);\n    }\n    function setThumbPercent(index, percent) {\n        updateValue(index, getPercentValue(percent));\n    }\n    function getRoundedValue(value) {\n        return Math.round((value - minValue) / step) * step + minValue;\n    }\n    function getPercentValue(percent) {\n        const val = percent * (maxValue - minValue) + minValue;\n        return $drHW0$clamp(getRoundedValue(val), minValue, maxValue);\n    }\n    return {\n        values: values,\n        getThumbValue: (index)=>values[index]\n        ,\n        setThumbValue: updateValue,\n        setThumbPercent: setThumbPercent,\n        isThumbDragging: (index)=>isDraggings[index]\n        ,\n        setThumbDragging: updateDragging,\n        focusedThumb: focusedIndex,\n        setFocusedThumb: setFocusedIndex,\n        getThumbPercent: (index)=>getValuePercent(values[index])\n        ,\n        getValuePercent: getValuePercent,\n        getThumbValueLabel: (index)=>getFormattedValue(values[index])\n        ,\n        getFormattedValue: getFormattedValue,\n        getThumbMinValue: getThumbMinValue,\n        getThumbMaxValue: getThumbMaxValue,\n        getPercentValue: getPercentValue,\n        isThumbEditable: isThumbEditable,\n        setThumbEditable: setThumbEditable,\n        step: step\n    };\n}\nfunction $8f011f344c0ccbcc$var$replaceIndex(array, index, value) {\n    if (array[index] === value) return array;\n    return [\n        ...array.slice(0, index),\n        value,\n        ...array.slice(index + 1)\n    ];\n}\n\n\n\n\nexport {$8f011f344c0ccbcc$export$e5fda3247f5d67f9 as useSliderState};\n//# sourceMappingURL=module.js.map\n","import {useGlobalListeners as $axlgK$useGlobalListeners, clamp as $axlgK$clamp, mergeProps as $axlgK$mergeProps, focusWithoutScrolling as $axlgK$focusWithoutScrolling} from \"@react-aria/utils\";\nimport {useRef as $axlgK$useRef, useCallback as $axlgK$useCallback, useEffect as $axlgK$useEffect} from \"react\";\nimport {useMove as $axlgK$useMove, setInteractionModality as $axlgK$setInteractionModality} from \"@react-aria/interactions\";\nimport {useLabel as $axlgK$useLabel} from \"@react-aria/label\";\nimport {useLocale as $axlgK$useLocale} from \"@react-aria/i18n\";\nimport {useFocusable as $axlgK$useFocusable} from \"@react-aria/focus\";\n\nfunction $parcel$export(e, n, v, s) {\n  Object.defineProperty(e, n, {get: v, set: s, enumerable: true, configurable: true});\n}\nvar $330dff91662306eb$exports = {};\n\n$parcel$export($330dff91662306eb$exports, \"useSlider\", () => $330dff91662306eb$export$56b2c08e277f365);\n\nconst $8983e12064147eaf$export$7a8d2b02c9371cbf = new WeakMap();\nfunction $8983e12064147eaf$export$68e648cbec363a18(state, index) {\n    let id = $8983e12064147eaf$export$7a8d2b02c9371cbf.get(state);\n    if (!id) throw new Error('Unknown slider state');\n    return `${id}-${index}`;\n}\n\n\n\n\n\n\nfunction $330dff91662306eb$export$56b2c08e277f365(props, state, trackRef) {\n    let { labelProps: labelProps , fieldProps: fieldProps  } = $axlgK$useLabel(props);\n    let isVertical = props.orientation === 'vertical';\n    var _id;\n    // Attach id of the label to the state so it can be accessed by useSliderThumb.\n    $8983e12064147eaf$export$7a8d2b02c9371cbf.set(state, (_id = labelProps.id) !== null && _id !== void 0 ? _id : fieldProps.id);\n    let { direction: direction  } = $axlgK$useLocale();\n    let { addGlobalListener: addGlobalListener , removeGlobalListener: removeGlobalListener  } = $axlgK$useGlobalListeners();\n    // When the user clicks or drags the track, we want the motion to set and drag the\n    // closest thumb.  Hence we also need to install useMove() on the track element.\n    // Here, we keep track of which index is the \"closest\" to the drag start point.\n    // It is set onMouseDown/onTouchDown; see trackProps below.\n    const realTimeTrackDraggingIndex = $axlgK$useRef(null);\n    const stateRef = $axlgK$useRef(null);\n    stateRef.current = state;\n    const reverseX = direction === 'rtl';\n    const currentPosition = $axlgK$useRef(null);\n    const { moveProps: moveProps  } = $axlgK$useMove({\n        onMoveStart () {\n            currentPosition.current = null;\n        },\n        onMove ({ deltaX: deltaX , deltaY: deltaY  }) {\n            let size = isVertical ? trackRef.current.offsetHeight : trackRef.current.offsetWidth;\n            if (currentPosition.current == null) currentPosition.current = stateRef.current.getThumbPercent(realTimeTrackDraggingIndex.current) * size;\n            let delta = isVertical ? deltaY : deltaX;\n            if (isVertical || reverseX) delta = -delta;\n            currentPosition.current += delta;\n            if (realTimeTrackDraggingIndex.current != null && trackRef.current) {\n                const percent = $axlgK$clamp(currentPosition.current / size, 0, 1);\n                stateRef.current.setThumbPercent(realTimeTrackDraggingIndex.current, percent);\n            }\n        },\n        onMoveEnd () {\n            if (realTimeTrackDraggingIndex.current != null) {\n                stateRef.current.setThumbDragging(realTimeTrackDraggingIndex.current, false);\n                realTimeTrackDraggingIndex.current = null;\n            }\n        }\n    });\n    let currentPointer = $axlgK$useRef(undefined);\n    let onDownTrack = (e, id, clientX, clientY)=>{\n        // We only trigger track-dragging if the user clicks on the track itself and nothing is currently being dragged.\n        if (trackRef.current && !props.isDisabled && state.values.every((_, i)=>!state.isThumbDragging(i)\n        )) {\n            let size = isVertical ? trackRef.current.offsetHeight : trackRef.current.offsetWidth;\n            // Find the closest thumb\n            const trackPosition = trackRef.current.getBoundingClientRect()[isVertical ? 'top' : 'left'];\n            const clickPosition = isVertical ? clientY : clientX;\n            const offset = clickPosition - trackPosition;\n            let percent = offset / size;\n            if (direction === 'rtl' || isVertical) percent = 1 - percent;\n            let value = state.getPercentValue(percent);\n            // to find the closet thumb we split the array based on the first thumb position to the \"right/end\" of the click.\n            let closestThumb;\n            let split = state.values.findIndex((v)=>value - v < 0\n            );\n            if (split === 0) closestThumb = split;\n            else if (split === -1) closestThumb = state.values.length - 1;\n            else {\n                let lastLeft = state.values[split - 1];\n                let firstRight = state.values[split];\n                // Pick the last left/start thumb, unless they are stacked on top of each other, then pick the right/end one\n                if (Math.abs(lastLeft - value) < Math.abs(firstRight - value)) closestThumb = split - 1;\n                else closestThumb = split;\n            }\n            // Confirm that the found closest thumb is editable, not disabled, and move it\n            if (closestThumb >= 0 && state.isThumbEditable(closestThumb)) {\n                // Don't unfocus anything\n                e.preventDefault();\n                realTimeTrackDraggingIndex.current = closestThumb;\n                state.setFocusedThumb(closestThumb);\n                currentPointer.current = id;\n                state.setThumbDragging(realTimeTrackDraggingIndex.current, true);\n                state.setThumbValue(closestThumb, value);\n                addGlobalListener(window, 'mouseup', onUpTrack, false);\n                addGlobalListener(window, 'touchend', onUpTrack, false);\n                addGlobalListener(window, 'pointerup', onUpTrack, false);\n            } else realTimeTrackDraggingIndex.current = null;\n        }\n    };\n    let onUpTrack = (e)=>{\n        var ref;\n        var _pointerId;\n        let id = (_pointerId = e.pointerId) !== null && _pointerId !== void 0 ? _pointerId : (ref = e.changedTouches) === null || ref === void 0 ? void 0 : ref[0].identifier;\n        if (id === currentPointer.current) {\n            if (realTimeTrackDraggingIndex.current != null) {\n                state.setThumbDragging(realTimeTrackDraggingIndex.current, false);\n                realTimeTrackDraggingIndex.current = null;\n            }\n            removeGlobalListener(window, 'mouseup', onUpTrack, false);\n            removeGlobalListener(window, 'touchend', onUpTrack, false);\n            removeGlobalListener(window, 'pointerup', onUpTrack, false);\n        }\n    };\n    if (labelProps.htmlFor) {\n        // Ideally the `for` attribute should point to the first thumb, but VoiceOver on iOS\n        // causes this to override the `aria-labelledby` on the thumb. This causes the first\n        // thumb to only be announced as the slider label rather than its individual name as well.\n        // See https://bugs.webkit.org/show_bug.cgi?id=172464.\n        delete labelProps.htmlFor;\n        labelProps.onClick = ()=>{\n            var // Safari does not focus <input type=\"range\"> elements when clicking on an associated <label>,\n            // so do it manually. In addition, make sure we show the focus ring.\n            ref;\n            (ref = document.getElementById($8983e12064147eaf$export$68e648cbec363a18(state, 0))) === null || ref === void 0 ? void 0 : ref.focus();\n            $axlgK$setInteractionModality('keyboard');\n        };\n    }\n    return {\n        labelProps: labelProps,\n        // The root element of the Slider will have role=\"group\" to group together\n        // all the thumb inputs in the Slider.  The label of the Slider will\n        // be used to label the group.\n        groupProps: {\n            role: 'group',\n            ...fieldProps\n        },\n        trackProps: $axlgK$mergeProps({\n            onMouseDown (e) {\n                if (e.button !== 0 || e.altKey || e.ctrlKey || e.metaKey) return;\n                onDownTrack(e, undefined, e.clientX, e.clientY);\n            },\n            onPointerDown (e) {\n                if (e.pointerType === 'mouse' && (e.button !== 0 || e.altKey || e.ctrlKey || e.metaKey)) return;\n                onDownTrack(e, e.pointerId, e.clientX, e.clientY);\n            },\n            onTouchStart (e) {\n                onDownTrack(e, e.changedTouches[0].identifier, e.changedTouches[0].clientX, e.changedTouches[0].clientY);\n            }\n        }, moveProps),\n        outputProps: {\n            htmlFor: state.values.map((_, index)=>$8983e12064147eaf$export$68e648cbec363a18(state, index)\n            ).join(' '),\n            'aria-live': 'off'\n        }\n    };\n}\n\n\nvar $661f0f6c696c467d$exports = {};\n\n$parcel$export($661f0f6c696c467d$exports, \"useSliderThumb\", () => $661f0f6c696c467d$export$8d15029008292ae);\n\n\n\n\n\n\n\nfunction $661f0f6c696c467d$export$8d15029008292ae(opts, state) {\n    let { index: index , isRequired: isRequired , isDisabled: isDisabled , validationState: validationState , trackRef: trackRef , inputRef: inputRef  } = opts;\n    let isVertical = opts.orientation === 'vertical';\n    let { direction: direction  } = $axlgK$useLocale();\n    let { addGlobalListener: addGlobalListener , removeGlobalListener: removeGlobalListener  } = $axlgK$useGlobalListeners();\n    let labelId = $8983e12064147eaf$export$7a8d2b02c9371cbf.get(state);\n    var ref1;\n    const { labelProps: labelProps , fieldProps: fieldProps  } = $axlgK$useLabel({\n        ...opts,\n        id: $8983e12064147eaf$export$68e648cbec363a18(state, index),\n        'aria-labelledby': `${labelId} ${(ref1 = opts['aria-labelledby']) !== null && ref1 !== void 0 ? ref1 : ''}`.trim()\n    });\n    const value = state.values[index];\n    const focusInput = $axlgK$useCallback(()=>{\n        if (inputRef.current) $axlgK$focusWithoutScrolling(inputRef.current);\n    }, [\n        inputRef\n    ]);\n    const isFocused = state.focusedThumb === index;\n    $axlgK$useEffect(()=>{\n        if (isFocused) focusInput();\n    }, [\n        isFocused,\n        focusInput\n    ]);\n    const stateRef = $axlgK$useRef(null);\n    stateRef.current = state;\n    let reverseX = direction === 'rtl';\n    let currentPosition = $axlgK$useRef(null);\n    let { moveProps: moveProps  } = $axlgK$useMove({\n        onMoveStart () {\n            currentPosition.current = null;\n            state.setThumbDragging(index, true);\n        },\n        onMove ({ deltaX: deltaX , deltaY: deltaY , pointerType: pointerType  }) {\n            let size = isVertical ? trackRef.current.offsetHeight : trackRef.current.offsetWidth;\n            if (currentPosition.current == null) currentPosition.current = stateRef.current.getThumbPercent(index) * size;\n            if (pointerType === 'keyboard') {\n                // (invert left/right according to language direction) + (according to vertical)\n                let delta = ((reverseX ? -deltaX : deltaX) + (isVertical ? -deltaY : -deltaY)) * stateRef.current.step;\n                currentPosition.current += delta * size;\n                stateRef.current.setThumbValue(index, stateRef.current.getThumbValue(index) + delta);\n            } else {\n                let delta = isVertical ? deltaY : deltaX;\n                if (isVertical || reverseX) delta = -delta;\n                currentPosition.current += delta;\n                stateRef.current.setThumbPercent(index, $axlgK$clamp(currentPosition.current / size, 0, 1));\n            }\n        },\n        onMoveEnd () {\n            state.setThumbDragging(index, false);\n        }\n    });\n    // Immediately register editability with the state\n    state.setThumbEditable(index, !isDisabled);\n    const { focusableProps: focusableProps  } = $axlgK$useFocusable($axlgK$mergeProps(opts, {\n        onFocus: ()=>state.setFocusedThumb(index)\n        ,\n        onBlur: ()=>state.setFocusedThumb(undefined)\n    }), inputRef);\n    let currentPointer = $axlgK$useRef(undefined);\n    let onDown = (id)=>{\n        focusInput();\n        currentPointer.current = id;\n        state.setThumbDragging(index, true);\n        addGlobalListener(window, 'mouseup', onUp, false);\n        addGlobalListener(window, 'touchend', onUp, false);\n        addGlobalListener(window, 'pointerup', onUp, false);\n    };\n    let onUp = (e)=>{\n        var ref;\n        var _pointerId;\n        let id = (_pointerId = e.pointerId) !== null && _pointerId !== void 0 ? _pointerId : (ref = e.changedTouches) === null || ref === void 0 ? void 0 : ref[0].identifier;\n        if (id === currentPointer.current) {\n            focusInput();\n            state.setThumbDragging(index, false);\n            removeGlobalListener(window, 'mouseup', onUp, false);\n            removeGlobalListener(window, 'touchend', onUp, false);\n            removeGlobalListener(window, 'pointerup', onUp, false);\n        }\n    };\n    // We install mouse handlers for the drag motion on the thumb div, but\n    // not the key handler for moving the thumb with the slider.  Instead,\n    // we focus the range input, and let the browser handle the keyboard\n    // interactions; we then listen to input's onChange to update state.\n    return {\n        inputProps: $axlgK$mergeProps(focusableProps, fieldProps, {\n            type: 'range',\n            tabIndex: !isDisabled ? 0 : undefined,\n            min: state.getThumbMinValue(index),\n            max: state.getThumbMaxValue(index),\n            step: state.step,\n            value: value,\n            disabled: isDisabled,\n            'aria-orientation': opts.orientation,\n            'aria-valuetext': state.getThumbValueLabel(index),\n            'aria-required': isRequired || undefined,\n            'aria-invalid': validationState === 'invalid' || undefined,\n            'aria-errormessage': opts['aria-errormessage'],\n            onChange: (e)=>{\n                state.setThumbValue(index, parseFloat(e.target.value));\n            }\n        }),\n        thumbProps: !isDisabled ? $axlgK$mergeProps(moveProps, {\n            onMouseDown: (e)=>{\n                if (e.button !== 0 || e.altKey || e.ctrlKey || e.metaKey) return;\n                onDown();\n            },\n            onPointerDown: (e)=>{\n                if (e.button !== 0 || e.altKey || e.ctrlKey || e.metaKey) return;\n                onDown(e.pointerId);\n            },\n            onTouchStart: (e)=>{\n                onDown(e.changedTouches[0].identifier);\n            }\n        }) : {\n        },\n        labelProps: labelProps\n    };\n}\n\n\n\n\nexport {$330dff91662306eb$export$56b2c08e277f365 as useSlider, $661f0f6c696c467d$export$8d15029008292ae as useSliderThumb};\n//# sourceMappingURL=module.js.map\n","import React, {ReactNode, RefObject, useRef} from 'react';\nimport {NumberFormatOptions} from '@internationalized/number';\nimport {AriaSliderProps, AriaSliderThumbProps} from '@react-types/slider';\nimport clsx from 'clsx';\nimport {\n  SliderState,\n  SliderStateOptions,\n  useSliderState,\n} from '@react-stately/slider';\nimport {useNumberFormatter} from '@react-aria/i18n';\nimport {useSlider, useSliderThumb} from '@react-aria/slider';\nimport {useFocusRing} from '@react-aria/focus';\nimport {useHover} from '@react-aria/interactions';\nimport {mergeProps} from '@react-aria/utils';\nimport {VisuallyHidden} from '@react-aria/visually-hidden';\nimport {InputSize} from '../input-field/input-size';\nimport {inputFieldStyle} from '../input-field/input-field-style';\n\nexport interface SliderProps<T = number> extends AriaSliderProps<T> {\n  size?: InputSize;\n  label?: ReactNode;\n  inline?: boolean;\n  className?: string;\n  formatOptions?: NumberFormatOptions;\n  getValueLabel?: (value: T) => string;\n  showValueLabel?: boolean;\n  onChange?: (value: T) => void;\n  onChangeEnd?: (value: T) => void;\n  value?: T;\n  defaultValue?: T;\n}\nexport function Slider(props: SliderProps) {\n  const {\n    size = 'md',\n    onChange,\n    onChangeEnd,\n    value,\n    defaultValue,\n    formatOptions,\n    inline,\n    label,\n    getValueLabel,\n    showValueLabel = !!label,\n    className,\n    isDisabled,\n    ...otherProps\n  } = props;\n\n  const numberFormatter = useNumberFormatter(formatOptions);\n  const style = inputFieldStyle({size});\n  const trackRef = useRef<HTMLDivElement>(null);\n  const sliderStateOptions: SliderStateOptions & AriaSliderProps = {\n    ...otherProps,\n    isDisabled,\n    label,\n    numberFormatter,\n    value: value != null ? [value] : undefined,\n    defaultValue: defaultValue != null ? [defaultValue] : undefined,\n    onChange: v => onChange?.(v[0]),\n    onChangeEnd: v => onChangeEnd?.(v[0]),\n  };\n\n  const state = useSliderState(sliderStateOptions);\n  const {groupProps, trackProps, labelProps, outputProps} = useSlider(\n    sliderStateOptions,\n    state,\n    trackRef\n  );\n\n  const wrapperClassname = clsx('w-full flex-shrink-0 touch-none', className, {\n    'flex items-center': inline,\n  });\n\n  return (\n    <div {...groupProps} className={wrapperClassname}>\n      <div className=\"flex\">\n        {label && (\n          // eslint-disable-next-line jsx-a11y/label-has-associated-control\n          <label className={style.label} {...labelProps}>\n            {label}\n          </label>\n        )}\n        {showValueLabel && (\n          <output {...outputProps} className={clsx(style.label, 'ml-auto')}>\n            {getValueLabel\n              ? getValueLabel(state.values[0])\n              : state.getThumbValueLabel(0)}\n          </output>\n        )}\n      </div>\n      <div {...trackProps} ref={trackRef} className=\"h-30 relative\">\n        <div\n          className={`absolute inset-0 m-auto h-4 rounded ${\n            isDisabled ? 'bg-disabled' : 'bg-primary-light'\n          }`}\n        />\n        <div\n          className={`absolute inset-0 my-auto h-4 rounded ${\n            isDisabled ? 'bg-disabled-fg' : 'bg-primary'\n          }`}\n          style={{width: `${state.getThumbPercent(0) * 100}%`}}\n        />\n        <Thumb\n          index={0}\n          state={state}\n          trackRef={trackRef}\n          isDisabled={isDisabled}\n        />\n      </div>\n    </div>\n  );\n}\n\ninterface ThumbProps extends AriaSliderThumbProps {\n  trackRef: RefObject<HTMLElement>;\n  inputRef?: RefObject<HTMLInputElement>;\n  state: SliderState;\n}\nfunction Thumb(props: ThumbProps) {\n  const {state, trackRef, index, isDisabled} = props;\n  const inputRef = useRef<HTMLInputElement>(null);\n  const {thumbProps, inputProps} = useSliderThumb(\n    {\n      index,\n      trackRef,\n      inputRef,\n    },\n    state\n  );\n\n  const isDragging = state.isThumbDragging(index);\n  const {focusProps, isFocusVisible} = useFocusRing();\n  const {hoverProps, isHovered} = useHover({\n    ...props,\n    isDisabled,\n  });\n\n  const innerClassName = clsx(\n    'rounded-full w-20 h-20 top-1/2 -translate-y-1/2 -translate-x-1/2 absolute inset-0 transition-colors duration-200',\n    {\n      'outline outline-offset-2': isFocusVisible && !isDisabled,\n      'shadow-md': !isDisabled,\n    },\n    thumbColor({isDisabled, isHovered, isDragging})\n  );\n\n  return (\n    <div\n      {...mergeProps(thumbProps, hoverProps)}\n      className={innerClassName}\n      style={{\n        left: `${Math.max(state.getThumbPercent(index) * 100, 0)}%`,\n      }}\n    >\n      <VisuallyHidden>\n        <input ref={inputRef} {...mergeProps(inputProps, focusProps)} />\n      </VisuallyHidden>\n    </div>\n  );\n}\n\ninterface ThumbColorProps {\n  isDisabled?: boolean;\n  isHovered: boolean;\n  isDragging: boolean;\n}\nfunction thumbColor({\n  isDisabled,\n  isHovered,\n  isDragging,\n}: ThumbColorProps): string {\n  if (isDisabled) {\n    return 'bg-slider-disabled cursor-default';\n  }\n  if (isDragging) {\n    return 'bg-primary-dark ring ring-primary-light ring-inset';\n  }\n  if (isHovered) {\n    return 'bg-primary-dark';\n  }\n  return 'bg-primary';\n}\n","import {useMemo as $jmOdw$useMemo, useEffect as $jmOdw$useEffect} from \"react\";\nimport {useMultipleSelectionState as $jmOdw$useMultipleSelectionState, SelectionManager as $jmOdw$SelectionManager} from \"@react-stately/selection\";\nimport {useCollection as $jmOdw$useCollection} from \"@react-stately/collections\";\nimport {useControlledState as $jmOdw$useControlledState} from \"@react-stately/utils\";\n\nfunction $parcel$export(e, n, v, s) {\n  Object.defineProperty(e, n, {get: v, set: s, enumerable: true, configurable: true});\n}\nvar $4b9a49966c91856a$exports = {};\n\n$parcel$export($4b9a49966c91856a$exports, \"useListState\", () => $4b9a49966c91856a$export$2f645645f7bca764);\n\nvar $80be09205507c5ec$exports = {};\n\n$parcel$export($80be09205507c5ec$exports, \"ListCollection\", () => $80be09205507c5ec$export$d085fb9e920b5ca7);\nvar tmp = Symbol.iterator;\nclass $80be09205507c5ec$export$d085fb9e920b5ca7 {\n    *[tmp]() {\n        yield* this.iterable;\n    }\n    get size() {\n        return this.keyMap.size;\n    }\n    getKeys() {\n        return this.keyMap.keys();\n    }\n    getKeyBefore(key) {\n        let node = this.keyMap.get(key);\n        return node ? node.prevKey : null;\n    }\n    getKeyAfter(key) {\n        let node = this.keyMap.get(key);\n        return node ? node.nextKey : null;\n    }\n    getFirstKey() {\n        return this.firstKey;\n    }\n    getLastKey() {\n        return this.lastKey;\n    }\n    getItem(key) {\n        return this.keyMap.get(key);\n    }\n    at(idx) {\n        const keys = [\n            ...this.getKeys()\n        ];\n        return this.getItem(keys[idx]);\n    }\n    constructor(nodes){\n        this.keyMap = new Map();\n        this.iterable = nodes;\n        let visit = (node)=>{\n            this.keyMap.set(node.key, node);\n            if (node.childNodes && node.type === 'section') for (let child of node.childNodes)visit(child);\n        };\n        for (let node2 of nodes)visit(node2);\n        let last;\n        let index = 0;\n        for (let [key, node1] of this.keyMap){\n            if (last) {\n                last.nextKey = key;\n                node1.prevKey = last.key;\n            } else {\n                this.firstKey = key;\n                node1.prevKey = undefined;\n            }\n            if (node1.type === 'item') node1.index = index++;\n            last = node1;\n            // Set nextKey as undefined since this might be the last node\n            // If it isn't the last node, last.nextKey will properly set at start of new loop\n            last.nextKey = undefined;\n        }\n        this.lastKey = last === null || last === void 0 ? void 0 : last.key;\n    }\n}\n\n\n\n\nfunction $4b9a49966c91856a$export$2f645645f7bca764(props) {\n    let { filter: filter  } = props;\n    let selectionState = $jmOdw$useMultipleSelectionState(props);\n    let disabledKeys = $jmOdw$useMemo(()=>props.disabledKeys ? new Set(props.disabledKeys) : new Set()\n    , [\n        props.disabledKeys\n    ]);\n    let factory = (nodes)=>filter ? new $80be09205507c5ec$export$d085fb9e920b5ca7(filter(nodes)) : new $80be09205507c5ec$export$d085fb9e920b5ca7(nodes)\n    ;\n    let context = $jmOdw$useMemo(()=>({\n            suppressTextValueWarning: props.suppressTextValueWarning\n        })\n    , [\n        props.suppressTextValueWarning\n    ]);\n    let collection = $jmOdw$useCollection(props, factory, context, [\n        filter\n    ]);\n    // Reset focused key if that item is deleted from the collection.\n    $jmOdw$useEffect(()=>{\n        if (selectionState.focusedKey != null && !collection.getItem(selectionState.focusedKey)) selectionState.setFocusedKey(null);\n    }, [\n        collection,\n        selectionState.focusedKey\n    ]);\n    return {\n        collection: collection,\n        disabledKeys: disabledKeys,\n        selectionManager: new $jmOdw$SelectionManager(collection, selectionState)\n    };\n}\n\n\nvar $e08e0e9da1306088$exports = {};\n\n$parcel$export($e08e0e9da1306088$exports, \"useSingleSelectListState\", () => $e08e0e9da1306088$export$e7f05e985daf4b5f);\n\n\n\nfunction $e08e0e9da1306088$export$e7f05e985daf4b5f(props) {\n    var _defaultSelectedKey;\n    let [selectedKey, setSelectedKey] = $jmOdw$useControlledState(props.selectedKey, (_defaultSelectedKey = props.defaultSelectedKey) !== null && _defaultSelectedKey !== void 0 ? _defaultSelectedKey : null, props.onSelectionChange);\n    let selectedKeys = $jmOdw$useMemo(()=>selectedKey != null ? [\n            selectedKey\n        ] : []\n    , [\n        selectedKey\n    ]);\n    let { collection: collection , disabledKeys: disabledKeys , selectionManager: selectionManager  } = $4b9a49966c91856a$export$2f645645f7bca764({\n        ...props,\n        selectionMode: 'single',\n        disallowEmptySelection: true,\n        allowDuplicateSelectionEvents: true,\n        selectedKeys: selectedKeys,\n        onSelectionChange: (keys)=>{\n            let key = keys.values().next().value;\n            // Always fire onSelectionChange, even if the key is the same\n            // as the current key (useControlledState does not).\n            if (key === selectedKey && props.onSelectionChange) props.onSelectionChange(key);\n            setSelectedKey(key);\n        }\n    });\n    let selectedItem = selectedKey != null ? collection.getItem(selectedKey) : null;\n    return {\n        collection: collection,\n        disabledKeys: disabledKeys,\n        selectionManager: selectionManager,\n        selectedKey: selectedKey,\n        setSelectedKey: setSelectedKey,\n        selectedItem: selectedItem\n    };\n}\n\n\n\n\n\nexport {$4b9a49966c91856a$export$2f645645f7bca764 as useListState, $e08e0e9da1306088$export$e7f05e985daf4b5f as useSingleSelectListState, $80be09205507c5ec$export$d085fb9e920b5ca7 as ListCollection};\n//# sourceMappingURL=module.js.map\n","import {useMenuTriggerState as $1Y8YR$useMenuTriggerState} from \"@react-stately/menu\";\nimport {useSingleSelectListState as $1Y8YR$useSingleSelectListState} from \"@react-stately/list\";\nimport {useState as $1Y8YR$useState} from \"react\";\n\nfunction $parcel$export(e, n, v, s) {\n  Object.defineProperty(e, n, {get: v, set: s, enumerable: true, configurable: true});\n}\nvar $2cf721c498a73112$exports = {};\n\n$parcel$export($2cf721c498a73112$exports, \"useSelectState\", () => $2cf721c498a73112$export$5159ec8b34d4ec12);\n\n\n\nfunction $2cf721c498a73112$export$5159ec8b34d4ec12(props) {\n    let triggerState = $1Y8YR$useMenuTriggerState(props);\n    let listState = $1Y8YR$useSingleSelectListState({\n        ...props,\n        onSelectionChange: (key)=>{\n            if (props.onSelectionChange != null) props.onSelectionChange(key);\n            triggerState.close();\n        }\n    });\n    let [isFocused, setFocused] = $1Y8YR$useState(false);\n    return {\n        ...listState,\n        ...triggerState,\n        open () {\n            // Don't open if the collection is empty.\n            if (listState.collection.size !== 0) triggerState.open();\n        },\n        toggle (focusStrategy) {\n            if (listState.collection.size !== 0) triggerState.toggle(focusStrategy);\n        },\n        isFocused: isFocused,\n        setFocused: setFocused\n    };\n}\n\n\n\n\nexport {$2cf721c498a73112$export$5159ec8b34d4ec12 as useSelectState};\n//# sourceMappingURL=module.js.map\n","import {filterDOMProps as $9GmRZ$filterDOMProps, mergeProps as $9GmRZ$mergeProps, useId as $9GmRZ$useId, chain as $9GmRZ$chain} from \"@react-aria/utils\";\nimport $9GmRZ$react, {useMemo as $9GmRZ$useMemo} from \"react\";\nimport {ListKeyboardDelegate as $9GmRZ$ListKeyboardDelegate, useTypeSelect as $9GmRZ$useTypeSelect} from \"@react-aria/selection\";\nimport {setInteractionModality as $9GmRZ$setInteractionModality, useInteractionModality as $9GmRZ$useInteractionModality} from \"@react-aria/interactions\";\nimport {useCollator as $9GmRZ$useCollator} from \"@react-aria/i18n\";\nimport {useField as $9GmRZ$useField} from \"@react-aria/label\";\nimport {useMenuTrigger as $9GmRZ$useMenuTrigger} from \"@react-aria/menu\";\nimport {useVisuallyHidden as $9GmRZ$useVisuallyHidden} from \"@react-aria/visually-hidden\";\n\nfunction $parcel$export(e, n, v, s) {\n  Object.defineProperty(e, n, {get: v, set: s, enumerable: true, configurable: true});\n}\nvar $36b2c435d5f32f05$exports = {};\n\n$parcel$export($36b2c435d5f32f05$exports, \"useSelect\", () => $36b2c435d5f32f05$export$e64b2f635402ca43);\n\n\n\n\n\n\n\nfunction $36b2c435d5f32f05$export$e64b2f635402ca43(props, state, ref) {\n    let { keyboardDelegate: keyboardDelegate , isDisabled: isDisabled  } = props;\n    // By default, a KeyboardDelegate is provided which uses the DOM to query layout information (e.g. for page up/page down).\n    // When virtualized, the layout object will be passed in as a prop and override this.\n    let collator = $9GmRZ$useCollator({\n        usage: 'search',\n        sensitivity: 'base'\n    });\n    let delegate = $9GmRZ$useMemo(()=>keyboardDelegate || new $9GmRZ$ListKeyboardDelegate(state.collection, state.disabledKeys, null, collator)\n    , [\n        keyboardDelegate,\n        state.collection,\n        state.disabledKeys,\n        collator\n    ]);\n    let { menuTriggerProps: menuTriggerProps , menuProps: menuProps  } = $9GmRZ$useMenuTrigger({\n        isDisabled: isDisabled,\n        type: 'listbox'\n    }, state, ref);\n    let onKeyDown = (e)=>{\n        switch(e.key){\n            case 'ArrowLeft':\n                {\n                    // prevent scrolling containers\n                    e.preventDefault();\n                    let key = state.selectedKey != null ? delegate.getKeyAbove(state.selectedKey) : delegate.getFirstKey();\n                    if (key) state.setSelectedKey(key);\n                    break;\n                }\n            case 'ArrowRight':\n                {\n                    // prevent scrolling containers\n                    e.preventDefault();\n                    let key = state.selectedKey != null ? delegate.getKeyBelow(state.selectedKey) : delegate.getFirstKey();\n                    if (key) state.setSelectedKey(key);\n                    break;\n                }\n        }\n    };\n    let { typeSelectProps: typeSelectProps  } = $9GmRZ$useTypeSelect({\n        keyboardDelegate: delegate,\n        selectionManager: state.selectionManager,\n        onTypeSelect (key) {\n            state.setSelectedKey(key);\n        }\n    });\n    let { labelProps: labelProps , fieldProps: fieldProps , descriptionProps: descriptionProps , errorMessageProps: errorMessageProps  } = $9GmRZ$useField({\n        ...props,\n        labelElementType: 'span'\n    });\n    typeSelectProps.onKeyDown = typeSelectProps.onKeyDownCapture;\n    delete typeSelectProps.onKeyDownCapture;\n    let domProps = $9GmRZ$filterDOMProps(props, {\n        labelable: true\n    });\n    let triggerProps = $9GmRZ$mergeProps(typeSelectProps, menuTriggerProps, fieldProps);\n    let valueId = $9GmRZ$useId();\n    return {\n        labelProps: {\n            ...labelProps,\n            onClick: ()=>{\n                if (!props.isDisabled) {\n                    ref.current.focus();\n                    // Show the focus ring so the user knows where focus went\n                    $9GmRZ$setInteractionModality('keyboard');\n                }\n            }\n        },\n        triggerProps: $9GmRZ$mergeProps(domProps, {\n            ...triggerProps,\n            onKeyDown: $9GmRZ$chain(triggerProps.onKeyDown, onKeyDown, props.onKeyDown),\n            onKeyUp: props.onKeyUp,\n            'aria-labelledby': [\n                triggerProps['aria-labelledby'],\n                triggerProps['aria-label'] && !triggerProps['aria-labelledby'] ? triggerProps.id : null,\n                valueId\n            ].filter(Boolean).join(' '),\n            onFocus (e) {\n                if (state.isFocused) return;\n                if (props.onFocus) props.onFocus(e);\n                state.setFocused(true);\n            },\n            onBlur (e) {\n                if (state.isOpen) return;\n                if (props.onBlur) props.onBlur(e);\n                state.setFocused(false);\n            }\n        }),\n        valueProps: {\n            id: valueId\n        },\n        menuProps: {\n            ...menuProps,\n            autoFocus: state.focusStrategy || true,\n            shouldSelectOnPressUp: true,\n            shouldFocusOnHover: true,\n            disallowEmptySelection: true,\n            onBlur: (e)=>{\n                if (e.currentTarget.contains(e.relatedTarget)) return;\n                if (props.onBlur) props.onBlur(e);\n                state.setFocused(false);\n            },\n            'aria-labelledby': [\n                fieldProps['aria-labelledby'],\n                triggerProps['aria-label'] && !fieldProps['aria-labelledby'] ? triggerProps.id : null\n            ].filter(Boolean).join(' ')\n        },\n        descriptionProps: descriptionProps,\n        errorMessageProps: errorMessageProps\n    };\n}\n\n\nvar $b6311686a239550d$exports = {};\n\n$parcel$export($b6311686a239550d$exports, \"useHiddenSelect\", () => $b6311686a239550d$export$f809e80f58e251d1);\n$parcel$export($b6311686a239550d$exports, \"HiddenSelect\", () => $b6311686a239550d$export$cbd84cdb2e668835);\n\n\n\nfunction $b6311686a239550d$export$f809e80f58e251d1(props, state, triggerRef) {\n    let { autoComplete: autoComplete , name: name , isDisabled: isDisabled  } = props;\n    let modality = $9GmRZ$useInteractionModality();\n    let { visuallyHiddenProps: visuallyHiddenProps  } = $9GmRZ$useVisuallyHidden();\n    var _selectedKey;\n    // In Safari, the <select> cannot have `display: none` or `hidden` for autofill to work.\n    // In Firefox, there must be a <label> to identify the <select> whereas other browsers\n    // seem to identify it just by surrounding text.\n    // The solution is to use <VisuallyHidden> to hide the elements, which clips the elements to a\n    // 1px rectangle. In addition, we hide from screen readers with aria-hidden, and make the <select>\n    // non tabbable with tabIndex={-1}.\n    //\n    // In mobile browsers, there are next/previous buttons above the software keyboard for navigating\n    // between fields in a form. These only support native form inputs that are tabbable. In order to\n    // support those, an additional hidden input is used to marshall focus to the button. It is tabbable\n    // except when the button is focused, so that shift tab works properly to go to the actual previous\n    // input in the form. Using the <select> for this also works, but Safari on iOS briefly flashes\n    // the native menu on focus, so this isn't ideal. A font-size of 16px or greater is required to\n    // prevent Safari from zooming in on the input when it is focused.\n    //\n    // If the current interaction modality is null, then the user hasn't interacted with the page yet.\n    // In this case, we set the tabIndex to -1 on the input element so that automated accessibility\n    // checkers don't throw false-positives about focusable elements inside an aria-hidden parent.\n    return {\n        containerProps: {\n            ...visuallyHiddenProps,\n            'aria-hidden': true\n        },\n        inputProps: {\n            type: 'text',\n            tabIndex: modality == null || state.isFocused || state.isOpen ? -1 : 0,\n            style: {\n                fontSize: 16\n            },\n            onFocus: ()=>triggerRef.current.focus()\n            ,\n            disabled: isDisabled\n        },\n        selectProps: {\n            tabIndex: -1,\n            autoComplete: autoComplete,\n            disabled: isDisabled,\n            name: name,\n            size: state.collection.size,\n            value: (_selectedKey = state.selectedKey) !== null && _selectedKey !== void 0 ? _selectedKey : '',\n            onChange: (e)=>state.setSelectedKey(e.target.value)\n        }\n    };\n}\nfunction $b6311686a239550d$export$cbd84cdb2e668835(props) {\n    let { state: state , triggerRef: triggerRef , label: label , name: name , isDisabled: isDisabled  } = props;\n    let { containerProps: containerProps , inputProps: inputProps , selectProps: selectProps  } = $b6311686a239550d$export$f809e80f58e251d1(props, state, triggerRef);\n    // If used in a <form>, use a hidden input so the value can be submitted to a server.\n    // If the collection isn't too big, use a hidden <select> element for this so that browser\n    // autofill will work. Otherwise, use an <input type=\"hidden\">.\n    if (state.collection.size <= 300) return(/*#__PURE__*/ $9GmRZ$react.createElement(\"div\", containerProps, /*#__PURE__*/ $9GmRZ$react.createElement(\"input\", inputProps), /*#__PURE__*/ $9GmRZ$react.createElement(\"label\", null, label, /*#__PURE__*/ $9GmRZ$react.createElement(\"select\", selectProps, /*#__PURE__*/ $9GmRZ$react.createElement(\"option\", null), [\n        ...state.collection.getKeys()\n    ].map((key)=>{\n        let item = state.collection.getItem(key);\n        if (item.type === 'item') return(/*#__PURE__*/ $9GmRZ$react.createElement(\"option\", {\n            key: item.key,\n            value: item.key\n        }, item.textValue));\n    })))));\n    else if (name) return(/*#__PURE__*/ $9GmRZ$react.createElement(\"input\", {\n        type: \"hidden\",\n        autoComplete: selectProps.autoComplete,\n        name: name,\n        disabled: isDisabled,\n        value: state.selectedKey\n    }));\n    return null;\n}\n\n\n\n\nexport {$36b2c435d5f32f05$export$e64b2f635402ca43 as useSelect, $b6311686a239550d$export$f809e80f58e251d1 as useHiddenSelect, $b6311686a239550d$export$cbd84cdb2e668835 as HiddenSelect};\n//# sourceMappingURL=module.js.map\n","import React from 'react';\n\ntype AdornmentProps = {\n  children: React.ReactNode;\n  direction: 'start' | 'end';\n};\n\nexport function Adornment({children, direction}: AdornmentProps) {\n  const dirClass = direction === 'start' ? 'left-12' : 'right-12';\n  if (!children) return null;\n  return (\n    <div className={`absolute h-full flex items-center ${dirClass} top-0`}>\n      {children}\n    </div>\n  );\n}\n","import {filterDOMProps as $9XpHW$filterDOMProps, useId as $9XpHW$useId, mergeProps as $9XpHW$mergeProps, useSlotId as $9XpHW$useSlotId, isMac as $9XpHW$isMac, isWebKit as $9XpHW$isWebKit} from \"@react-aria/utils\";\nimport {useFocusWithin as $9XpHW$useFocusWithin, useHover as $9XpHW$useHover, isFocusVisible as $9XpHW$isFocusVisible} from \"@react-aria/interactions\";\nimport {useLabel as $9XpHW$useLabel} from \"@react-aria/label\";\nimport {useSelectableList as $9XpHW$useSelectableList, useSelectableItem as $9XpHW$useSelectableItem} from \"@react-aria/selection\";\nimport {getItemCount as $9XpHW$getItemCount} from \"@react-stately/collections\";\n\nfunction $parcel$export(e, n, v, s) {\n  Object.defineProperty(e, n, {get: v, set: s, enumerable: true, configurable: true});\n}\nvar $4599f731efac101a$exports = {};\n\n$parcel$export($4599f731efac101a$exports, \"useListBox\", () => $4599f731efac101a$export$50eacbbf140a3141);\n\nvar $fc40a93251bc17d1$exports = {};\n\n$parcel$export($fc40a93251bc17d1$exports, \"listData\", () => $fc40a93251bc17d1$export$3585ede4d035bf14);\n$parcel$export($fc40a93251bc17d1$exports, \"getItemId\", () => $fc40a93251bc17d1$export$9145995848b05025);\nconst $fc40a93251bc17d1$export$3585ede4d035bf14 = new WeakMap();\nfunction $fc40a93251bc17d1$var$normalizeKey(key) {\n    if (typeof key === 'string') return key.replace(/\\s*/g, '');\n    return '' + key;\n}\nfunction $fc40a93251bc17d1$export$9145995848b05025(state, itemKey) {\n    let data = $fc40a93251bc17d1$export$3585ede4d035bf14.get(state);\n    if (!data) throw new Error('Unknown list');\n    return `${data.id}-option-${$fc40a93251bc17d1$var$normalizeKey(itemKey)}`;\n}\n\n\n\n\n\n\nfunction $4599f731efac101a$export$50eacbbf140a3141(props, state, ref) {\n    let domProps = $9XpHW$filterDOMProps(props, {\n        labelable: true\n    });\n    let { listProps: listProps  } = $9XpHW$useSelectableList({\n        ...props,\n        ref: ref,\n        selectionManager: state.selectionManager,\n        collection: state.collection,\n        disabledKeys: state.disabledKeys\n    });\n    let { focusWithinProps: focusWithinProps  } = $9XpHW$useFocusWithin({\n        onFocusWithin: props.onFocus,\n        onBlurWithin: props.onBlur,\n        onFocusWithinChange: props.onFocusChange\n    });\n    // Share list id and some props with child options.\n    let id = $9XpHW$useId(props.id);\n    $fc40a93251bc17d1$export$3585ede4d035bf14.set(state, {\n        id: id,\n        shouldUseVirtualFocus: props.shouldUseVirtualFocus,\n        shouldSelectOnPressUp: props.shouldSelectOnPressUp,\n        shouldFocusOnHover: props.shouldFocusOnHover,\n        isVirtualized: props.isVirtualized\n    });\n    let { labelProps: labelProps , fieldProps: fieldProps  } = $9XpHW$useLabel({\n        ...props,\n        id: id,\n        // listbox is not an HTML input element so it\n        // shouldn't be labeled by a <label> element.\n        labelElementType: 'span'\n    });\n    return {\n        labelProps: labelProps,\n        listBoxProps: $9XpHW$mergeProps(domProps, focusWithinProps, state.selectionManager.selectionMode === 'multiple' ? {\n            'aria-multiselectable': 'true'\n        } : {\n        }, {\n            role: 'listbox',\n            ...$9XpHW$mergeProps(fieldProps, listProps)\n        })\n    };\n}\n\n\nvar $320d38f7a0623e79$exports = {};\n\n$parcel$export($320d38f7a0623e79$exports, \"useOption\", () => $320d38f7a0623e79$export$497855f14858aa34);\n\n\n\n\n\nfunction $320d38f7a0623e79$export$497855f14858aa34(props, state, ref) {\n    let { key: key  } = props;\n    let data = $fc40a93251bc17d1$export$3585ede4d035bf14.get(state);\n    var _isDisabled;\n    let isDisabled = (_isDisabled = props.isDisabled) !== null && _isDisabled !== void 0 ? _isDisabled : state.disabledKeys.has(key);\n    var _isSelected;\n    let isSelected = (_isSelected = props.isSelected) !== null && _isSelected !== void 0 ? _isSelected : state.selectionManager.isSelected(key);\n    let isFocused = state.selectionManager.focusedKey === key;\n    var _shouldSelectOnPressUp;\n    let shouldSelectOnPressUp = (_shouldSelectOnPressUp = props.shouldSelectOnPressUp) !== null && _shouldSelectOnPressUp !== void 0 ? _shouldSelectOnPressUp : data.shouldSelectOnPressUp;\n    var _shouldFocusOnHover;\n    let shouldFocusOnHover = (_shouldFocusOnHover = props.shouldFocusOnHover) !== null && _shouldFocusOnHover !== void 0 ? _shouldFocusOnHover : data.shouldFocusOnHover;\n    var _shouldUseVirtualFocus;\n    let shouldUseVirtualFocus = (_shouldUseVirtualFocus = props.shouldUseVirtualFocus) !== null && _shouldUseVirtualFocus !== void 0 ? _shouldUseVirtualFocus : data.shouldUseVirtualFocus;\n    var _isVirtualized;\n    let isVirtualized = (_isVirtualized = props.isVirtualized) !== null && _isVirtualized !== void 0 ? _isVirtualized : data.isVirtualized;\n    let labelId = $9XpHW$useSlotId();\n    let descriptionId = $9XpHW$useSlotId();\n    let optionProps = {\n        role: 'option',\n        'aria-disabled': isDisabled,\n        'aria-selected': state.selectionManager.selectionMode !== 'none' ? isSelected : undefined\n    };\n    // Safari with VoiceOver on macOS misreads options with aria-labelledby or aria-label as simply \"text\".\n    // We should not map slots to the label and description on Safari and instead just have VoiceOver read the textContent.\n    // https://bugs.webkit.org/show_bug.cgi?id=209279\n    if (!($9XpHW$isMac() && $9XpHW$isWebKit())) {\n        optionProps['aria-label'] = props['aria-label'];\n        optionProps['aria-labelledby'] = labelId;\n        optionProps['aria-describedby'] = descriptionId;\n    }\n    if (isVirtualized) {\n        optionProps['aria-posinset'] = state.collection.getItem(key).index + 1;\n        optionProps['aria-setsize'] = $9XpHW$getItemCount(state.collection);\n    }\n    let { itemProps: itemProps , isPressed: isPressed  } = $9XpHW$useSelectableItem({\n        selectionManager: state.selectionManager,\n        key: key,\n        ref: ref,\n        shouldSelectOnPressUp: shouldSelectOnPressUp,\n        isVirtualized: isVirtualized,\n        shouldUseVirtualFocus: shouldUseVirtualFocus,\n        isDisabled: isDisabled\n    });\n    let { hoverProps: hoverProps  } = $9XpHW$useHover({\n        isDisabled: isDisabled || !shouldFocusOnHover,\n        onHoverStart () {\n            if (!$9XpHW$isFocusVisible()) {\n                state.selectionManager.setFocused(true);\n                state.selectionManager.setFocusedKey(key);\n            }\n        }\n    });\n    return {\n        optionProps: {\n            ...optionProps,\n            ...$9XpHW$mergeProps(itemProps, hoverProps),\n            id: $fc40a93251bc17d1$export$9145995848b05025(state, key)\n        },\n        labelProps: {\n            id: labelId\n        },\n        descriptionProps: {\n            id: descriptionId\n        },\n        isFocused: isFocused,\n        isSelected: isSelected,\n        isDisabled: isDisabled,\n        isPressed: isPressed\n    };\n}\n\n\nvar $da55f015385fe4fc$exports = {};\n\n$parcel$export($da55f015385fe4fc$exports, \"useListBoxSection\", () => $da55f015385fe4fc$export$c3f9f39876e4bc7);\n\nfunction $da55f015385fe4fc$export$c3f9f39876e4bc7(props) {\n    let { heading: heading , 'aria-label': ariaLabel  } = props;\n    let headingId = $9XpHW$useId();\n    return {\n        itemProps: {\n            role: 'presentation'\n        },\n        headingProps: heading ? {\n            // Techincally, listbox cannot contain headings according to ARIA.\n            // We hide the heading from assistive technology, and only use it\n            // as a label for the nested group.\n            id: headingId,\n            'aria-hidden': true\n        } : {\n        },\n        groupProps: {\n            role: 'group',\n            'aria-label': ariaLabel,\n            'aria-labelledby': heading ? headingId : undefined\n        }\n    };\n}\n\n\n\n\n\nexport {$4599f731efac101a$export$50eacbbf140a3141 as useListBox, $320d38f7a0623e79$export$497855f14858aa34 as useOption, $da55f015385fe4fc$export$c3f9f39876e4bc7 as useListBoxSection, $fc40a93251bc17d1$export$3585ede4d035bf14 as listData, $fc40a93251bc17d1$export$9145995848b05025 as getItemId};\n//# sourceMappingURL=module.js.map\n","import React, {useRef} from 'react';\nimport {Node} from '@react-types/shared';\nimport {isFocusVisible, useHover} from '@react-aria/interactions';\nimport {useOption} from '@react-aria/listbox';\nimport {ListState} from '@react-stately/list';\nimport {mergeProps} from '@react-aria/utils';\nimport {listboxItemStyle} from './listbox-style';\n\ninterface OptionProps<T> {\n  item: Node<T>;\n  state: ListState<T>;\n}\n\nexport function ListboxOption<T>(props: OptionProps<T>) {\n  const {item, state} = props;\n  const ref = useRef<HTMLLIElement>(null);\n  const {optionProps, isDisabled, isSelected, isFocused} = useOption(\n    {'aria-label': item['aria-label'], key: item.key},\n    state,\n    ref\n  );\n  const {hoverProps, isHovered} = useHover({\n    ...props,\n    isDisabled,\n  });\n  const isKeyboardModality = isFocusVisible();\n\n  const className = listboxItemStyle({\n    isFocused: isFocused && isKeyboardModality,\n    isSelected,\n    isDisabled,\n    isHovered,\n  });\n\n  return (\n    <li\n      className={className}\n      {...mergeProps(optionProps, hoverProps)}\n      ref={ref}\n    >\n      {item.rendered}\n    </li>\n  );\n}\n","import React, {forwardRef} from 'react';\nimport {AriaListBoxOptions, useListBox} from '@react-aria/listbox';\nimport {ListState} from '@react-stately/list';\nimport {useObjectRef} from '@react-aria/utils';\nimport {ListboxOption} from './listbox-option';\nimport {listboxWrapperStyle} from './listbox-style';\n\ninterface ListBoxProps extends AriaListBoxOptions<unknown> {\n  state: ListState<unknown>;\n  className?: string;\n  style?: React.CSSProperties;\n}\nexport const ListBox = forwardRef<HTMLUListElement, ListBoxProps>(\n  ({className, style, ...props}, ref) => {\n    const refObj = useObjectRef(ref);\n    const {state} = props;\n    const {listBoxProps} = useListBox(props, state, refObj);\n    const mergedClassname = listboxWrapperStyle(className);\n    return (\n      <ul\n        className={mergedClassname}\n        style={style}\n        {...listBoxProps}\n        ref={refObj}\n      >\n        {[...state.collection].map(item => (\n          <ListboxOption key={item.key} item={item} state={state} />\n        ))}\n      </ul>\n    );\n  }\n);\n","import React, {ReactElement, useCallback, useRef, useState} from 'react';\nimport {ValueBase} from '@react-types/shared';\nimport {AnimatePresence} from 'framer-motion';\nimport {useSelectState} from '@react-stately/select';\nimport {AriaSelectProps} from '@react-types/select';\nimport {FocusScope} from '@react-aria/focus';\nimport {HiddenSelect, useSelect} from '@react-aria/select';\nimport {DismissButton} from '@react-aria/overlays';\nimport {useButton} from '@react-aria/button';\nimport {useLayoutEffect, useResizeObserver} from '@react-aria/utils';\nimport {inputFieldStyle} from '../input-field/input-field-style';\nimport {CommonInputFieldProps} from '../input-field/input-field-props';\nimport {Adornment} from '../input-field/adornment';\nimport {ListBox} from '../listbox/listbox';\nimport {Popover} from '../../overlays/popover/popover';\nimport {useIsMobileDevice} from '../../../utils/hooks/is-mobile-device';\nimport {Tray} from '../../overlays/tray';\nimport {KeyboardArrowDownIcon} from '../../../icons/material/KeyboardArrowDown';\nimport {useOverlayPosition} from '../../overlays/use-overlay-position';\n\ninterface PickerProps<T>\n  extends AriaSelectProps<T>,\n    ValueBase<any>,\n    CommonInputFieldProps {}\nexport function Picker<T extends object>(props: PickerProps<T>) {\n  const {label, name, value, onChange, isDisabled, autoComplete, shouldFlip} = {\n    ...props,\n  };\n  const style = inputFieldStyle({...props, endAdornment: true});\n  const state = useSelectState<T>({\n    ...props,\n    onSelectionChange: onChange,\n    selectedKey: value,\n  });\n\n  const listboxRef = useRef<HTMLUListElement>(null);\n\n  const {triggerRef, overlayRef, positionStyle, triggerObjRef} =\n    useOverlayPosition({shouldFlip});\n\n  const {\n    labelProps,\n    triggerProps,\n    valueProps,\n    menuProps,\n    // eslint-disable-next-line @typescript-eslint/no-unused-vars\n    descriptionProps,\n    // eslint-disable-next-line @typescript-eslint/no-unused-vars\n    errorMessageProps,\n  } = useSelect(props, state, triggerObjRef);\n\n  const isMobile = useIsMobileDevice();\n\n  const {buttonProps} = useButton(triggerProps, triggerObjRef);\n\n  const listbox = (\n    <FocusScope restoreFocus contain={isMobile}>\n      <DismissButton onDismiss={() => state.close()} />\n      <ListBox\n        {...menuProps}\n        ref={listboxRef}\n        state={state}\n        disallowEmptySelection\n        autoFocus={state.focusStrategy || true}\n        shouldSelectOnPressUp\n      />\n      <DismissButton onDismiss={() => state.close()} />\n    </FocusScope>\n  );\n\n  const [buttonWidth, setButtonWidth] = useState<number | null>(null);\n\n  const onResize = useCallback(() => {\n    if (!isMobile && triggerObjRef.current) {\n      const width = (triggerObjRef.current as HTMLElement).offsetWidth;\n      setButtonWidth(width);\n    }\n  }, [setButtonWidth, isMobile, triggerObjRef]);\n\n  useResizeObserver({\n    ref: triggerObjRef,\n    onResize,\n  });\n\n  useLayoutEffect(onResize, [state.selectedKey, onResize]);\n\n  let overlay: ReactElement;\n  if (isMobile) {\n    overlay = (\n      <Tray isOpen={state.isOpen} onClose={state.close}>\n        {listbox}\n      </Tray>\n    );\n  } else {\n    overlay = (\n      <Popover\n        isOpen={state.isOpen}\n        ref={overlayRef}\n        hideArrow\n        onClose={state.close}\n        shouldCloseOnBlur\n        style={{\n          ...positionStyle,\n          width: `${buttonWidth}px`,\n        }}\n      >\n        {listbox}\n      </Popover>\n    );\n  }\n\n  return (\n    <div className={style.wrapper}>\n      <div {...labelProps} className={style.label}>\n        {label}\n      </div>\n      <HiddenSelect\n        state={state}\n        autoComplete={autoComplete}\n        isDisabled={isDisabled}\n        triggerRef={triggerObjRef}\n        label={label}\n        name={name}\n      />\n      <button\n        type=\"button\"\n        className={style.input}\n        disabled={isDisabled}\n        {...buttonProps}\n        ref={triggerRef}\n      >\n        <span {...valueProps}>{state.selectedItem?.rendered}</span>\n        <Adornment direction=\"end\">\n          <KeyboardArrowDownIcon className=\"text-muted\" />\n        </Adornment>\n      </button>\n      <AnimatePresence>{state.isOpen && overlay}</AnimatePresence>\n    </div>\n  );\n}\n","import {FormattedMessage} from 'react-intl';\nimport {Item} from '@react-stately/collections';\nimport {useStore} from '../../../state/store';\nimport {ToolControlsOverlayWrapper} from '../../../ui/navbar/tool-controls-overlay-wrapper';\nimport {ColorPickerButton} from '../../../ui/color-picker-button';\nimport {FabricFilter} from '../filter-tool';\nimport {Slider} from '../../../common/ui/inputs/slider/slider';\nimport {filterOptionMessages} from '../filter-list';\nimport {state, tools} from '../../../state/utils';\nimport {Picker} from '../../../common/ui/inputs/select/picker';\n\nexport function FilterControls() {\n  const selectedFilter = useStore(s => s.filter.selected);\n  if (!selectedFilter) return null;\n  const options = tools().filter.getByName(selectedFilter).options;\n\n  const applyValue = (optionName: string, value: string | number) => {\n    tools().filter?.applyValue(selectedFilter, optionName, value);\n    state().setDirty(true);\n  };\n\n  const activeFilters = tools().canvas.getMainImage().filters as FabricFilter[];\n  const i = tools().filter.findFilterIndex(selectedFilter, activeFilters);\n  const fabricFilter = activeFilters?.[i];\n\n  if (options) {\n    const controls = Object.entries(options).map(([optionName, config]) => {\n      let component;\n      const value = fabricFilter ? fabricFilter[optionName] : config.current;\n      if (config.type === 'slider') {\n        component = (\n          <Slider\n            label={<FormattedMessage {...filterOptionMessages[optionName]} />}\n            minValue={config.min}\n            maxValue={config.max}\n            step={config.step}\n            defaultValue={value}\n            formatOptions={{style: 'percent'}}\n            size=\"sm\"\n            onChange={newValue => {\n              applyValue(optionName, newValue);\n            }}\n          />\n        );\n      } else if (config.type === 'colorPicker') {\n        component = (\n          <ColorPickerButton\n            label={<FormattedMessage {...filterOptionMessages[optionName]} />}\n            size=\"sm\"\n            className=\"w-full\"\n            defaultValue={value}\n            onChange={newValue => {\n              applyValue(optionName, newValue);\n            }}\n          />\n        );\n      } else if (config.type === 'select') {\n        component = (\n          <Picker\n            size=\"sm\"\n            label={<FormattedMessage {...filterOptionMessages[optionName]} />}\n            defaultValue={value}\n            onChange={newValue => {\n              applyValue(optionName, newValue);\n            }}\n            items={config.available}\n          >\n            {item => (\n              <Item textValue={item.key}>\n                <span className=\"capitalize\">{item.key}</span>\n              </Item>\n            )}\n          </Picker>\n        );\n      }\n\n      return (\n        <div className=\"pb-10\" key={optionName}>\n          {component}\n        </div>\n      );\n    });\n    return (\n      <ToolControlsOverlayWrapper>\n        <div className=\"max-w-240 pt-10 mx-auto\">{controls}</div>\n      </ToolControlsOverlayWrapper>\n    );\n  }\n\n  return null;\n}\n","import {FormattedMessage} from 'react-intl';\nimport {useStore} from '../../../state/store';\nimport {ColorPickerButton} from '../../../ui/color-picker-button';\nimport {ToolControlsOverlayWrapper} from '../../../ui/navbar/tool-controls-overlay-wrapper';\nimport {Slider} from '../../../common/ui/inputs/slider/slider';\nimport {tools} from '../../../state/utils';\n\nexport function ActiveFrameControls() {\n  const activeFrame = useStore(s => s.frame.active);\n\n  const showColorPicker = activeFrame?.mode === 'basic';\n\n  return (\n    <ToolControlsOverlayWrapper className=\"pb-18 pt-6\">\n      <div className=\"max-w-288 m-auto\">\n        {showColorPicker && (\n          <div className=\"mb-16\">\n            <ColorPickerButton\n              size=\"sm\"\n              label={<FormattedMessage defaultMessage=\"Color\" />}\n              value={tools().frame.builder.defaultColor}\n              onChange={newColor => {\n                tools().frame.active.changeColor(newColor);\n              }}\n            />\n          </div>\n        )}\n        <Slider\n          size=\"sm\"\n          label={<FormattedMessage defaultMessage=\"Size\" />}\n          step={1}\n          minValue={tools().frame.active.getMinSize()}\n          maxValue={tools().frame.active.getMaxSize()}\n          defaultValue={tools().frame.active.currentSizeInPercent}\n          getValueLabel={value => {\n            return `${value}%`;\n          }}\n          onChange={value => {\n            tools().frame.resize(value);\n          }}\n        />\n      </div>\n    </ToolControlsOverlayWrapper>\n  );\n}\n","import {useSelectableItem as $G86Z8$useSelectableItem, useSelectableCollection as $G86Z8$useSelectableCollection} from \"@react-aria/selection\";\nimport {getFocusableTreeWalker as $G86Z8$getFocusableTreeWalker} from \"@react-aria/focus\";\nimport {useState as $G86Z8$useState, useMemo as $G86Z8$useMemo} from \"react\";\nimport {useLayoutEffect as $G86Z8$useLayoutEffect, useLabels as $G86Z8$useLabels, mergeProps as $G86Z8$mergeProps, useId as $G86Z8$useId} from \"@react-aria/utils\";\nimport {useLocale as $G86Z8$useLocale} from \"@react-aria/i18n\";\n\nfunction $parcel$export(e, n, v, s) {\n  Object.defineProperty(e, n, {get: v, set: s, enumerable: true, configurable: true});\n}\nvar $fbeca008f459f5aa$exports = {};\n\n$parcel$export($fbeca008f459f5aa$exports, \"useTab\", () => $fbeca008f459f5aa$export$fdf4756d5b8ef90a);\nconst $2bc294289400274c$export$c5f62239608282b6 = new WeakMap();\nfunction $2bc294289400274c$export$567fc7097e064344(state, key, role) {\n    if (typeof key === 'string') key = key.replace(/\\s+/g, '');\n    let baseId = $2bc294289400274c$export$c5f62239608282b6.get(state);\n    return `${baseId}-${role}-${key}`;\n}\n\n\n\nfunction $fbeca008f459f5aa$export$fdf4756d5b8ef90a(props, state, ref) {\n    let { key: key , isDisabled: propsDisabled  } = props;\n    let { selectionManager: manager , selectedKey: selectedKey  } = state;\n    let isSelected = key === selectedKey;\n    let isDisabled = propsDisabled || state.disabledKeys.has(key);\n    let { itemProps: itemProps  } = $G86Z8$useSelectableItem({\n        selectionManager: manager,\n        key: key,\n        ref: ref,\n        isDisabled: isDisabled\n    });\n    let tabId = $2bc294289400274c$export$567fc7097e064344(state, key, 'tab');\n    let tabPanelId = $2bc294289400274c$export$567fc7097e064344(state, key, 'tabpanel');\n    let { tabIndex: tabIndex  } = itemProps;\n    return {\n        tabProps: {\n            ...itemProps,\n            id: tabId,\n            'aria-selected': isSelected,\n            'aria-disabled': isDisabled || undefined,\n            'aria-controls': isSelected ? tabPanelId : undefined,\n            tabIndex: isDisabled ? undefined : tabIndex,\n            role: 'tab'\n        }\n    };\n}\n\n\nvar $bc77009ac794dd15$exports = {};\n\n$parcel$export($bc77009ac794dd15$exports, \"useTabPanel\", () => $bc77009ac794dd15$export$fae0121b5afe572d);\n\n\n\n\nfunction $bc77009ac794dd15$export$fae0121b5afe572d(props, state, ref) {\n    let [tabIndex, setTabIndex] = $G86Z8$useState(0);\n    // The tabpanel should have tabIndex=0 when there are no tabbable elements within it.\n    // Otherwise, tabbing from the focused tab should go directly to the first tabbable element\n    // within the tabpanel.\n    $G86Z8$useLayoutEffect(()=>{\n        if (ref === null || ref === void 0 ? void 0 : ref.current) {\n            let update = ()=>{\n                // Detect if there are any tabbable elements and update the tabIndex accordingly.\n                let walker = $G86Z8$getFocusableTreeWalker(ref.current, {\n                    tabbable: true\n                });\n                setTabIndex(walker.nextNode() ? undefined : 0);\n            };\n            update();\n            // Update when new elements are inserted, or the tabIndex/disabled attribute updates.\n            let observer = new MutationObserver(update);\n            observer.observe(ref.current, {\n                subtree: true,\n                childList: true,\n                attributes: true,\n                attributeFilter: [\n                    'tabIndex',\n                    'disabled'\n                ]\n            });\n            return ()=>{\n                observer.disconnect();\n            };\n        }\n    }, [\n        ref\n    ]);\n    const id = $2bc294289400274c$export$567fc7097e064344(state, state === null || state === void 0 ? void 0 : state.selectedKey, 'tabpanel');\n    const tabPanelProps = $G86Z8$useLabels({\n        ...props,\n        id: id,\n        'aria-labelledby': $2bc294289400274c$export$567fc7097e064344(state, state === null || state === void 0 ? void 0 : state.selectedKey, 'tab')\n    });\n    return {\n        tabPanelProps: $G86Z8$mergeProps(tabPanelProps, {\n            tabIndex: tabIndex,\n            role: 'tabpanel',\n            'aria-describedby': props['aria-describedby'],\n            'aria-details': props['aria-details']\n        })\n    };\n}\n\n\nvar $67cd7a6663dbdf35$exports = {};\n\n$parcel$export($67cd7a6663dbdf35$exports, \"useTabList\", () => $67cd7a6663dbdf35$export$773e389e644c5874);\n\n\n\nclass $d9c38f86f4c836f2$export$15010ca3c1abe90b {\n    getKeyLeftOf(key) {\n        if (this.flipDirection) return this.getNextKey(key);\n        else {\n            if (this.orientation === 'horizontal') return this.getPreviousKey(key);\n            return null;\n        }\n    }\n    getKeyRightOf(key) {\n        if (this.flipDirection) return this.getPreviousKey(key);\n        else {\n            if (this.orientation === 'horizontal') return this.getNextKey(key);\n            return null;\n        }\n    }\n    getKeyAbove(key) {\n        if (this.orientation === 'vertical') return this.getPreviousKey(key);\n        return null;\n    }\n    getKeyBelow(key) {\n        if (this.orientation === 'vertical') return this.getNextKey(key);\n        return null;\n    }\n    getFirstKey() {\n        let key = this.collection.getFirstKey();\n        if (this.disabledKeys.has(key)) key = this.getNextKey(key);\n        return key;\n    }\n    getLastKey() {\n        let key = this.collection.getLastKey();\n        if (this.disabledKeys.has(key)) key = this.getPreviousKey(key);\n        return key;\n    }\n    getNextKey(key) {\n        do {\n            key = this.collection.getKeyAfter(key);\n            if (key == null) key = this.collection.getFirstKey();\n        }while (this.disabledKeys.has(key))\n        return key;\n    }\n    getPreviousKey(key) {\n        do {\n            key = this.collection.getKeyBefore(key);\n            if (key == null) key = this.collection.getLastKey();\n        }while (this.disabledKeys.has(key))\n        return key;\n    }\n    constructor(collection, direction, orientation, disabledKeys = new Set()){\n        this.collection = collection;\n        this.flipDirection = direction === 'rtl' && orientation === 'horizontal';\n        this.orientation = orientation;\n        this.disabledKeys = disabledKeys;\n    }\n}\n\n\n\n\nfunction $67cd7a6663dbdf35$export$773e389e644c5874(props, state, ref) {\n    let { orientation: orientation = 'horizontal' , keyboardActivation: keyboardActivation = 'automatic'  } = props;\n    let { collection: collection , selectionManager: manager , disabledKeys: disabledKeys  } = state;\n    let { direction: direction  } = $G86Z8$useLocale();\n    let delegate = $G86Z8$useMemo(()=>new $d9c38f86f4c836f2$export$15010ca3c1abe90b(collection, direction, orientation, disabledKeys)\n    , [\n        collection,\n        disabledKeys,\n        orientation,\n        direction\n    ]);\n    let { collectionProps: collectionProps  } = $G86Z8$useSelectableCollection({\n        ref: ref,\n        selectionManager: manager,\n        keyboardDelegate: delegate,\n        selectOnFocus: keyboardActivation === 'automatic',\n        disallowEmptySelection: true,\n        scrollRef: ref\n    });\n    // Compute base id for all tabs\n    let tabsId = $G86Z8$useId();\n    $2bc294289400274c$export$c5f62239608282b6.set(state, tabsId);\n    let tabListLabelProps = $G86Z8$useLabels({\n        ...props,\n        id: tabsId\n    });\n    return {\n        tabListProps: {\n            ...$G86Z8$mergeProps(collectionProps, tabListLabelProps),\n            role: 'tablist',\n            'aria-orientation': orientation,\n            tabIndex: undefined\n        }\n    };\n}\n\n\n\n\nexport {$fbeca008f459f5aa$export$fdf4756d5b8ef90a as useTab, $bc77009ac794dd15$export$fae0121b5afe572d as useTabPanel, $67cd7a6663dbdf35$export$773e389e644c5874 as useTabList};\n//# sourceMappingURL=module.js.map\n","import React, {RefObject} from 'react';\nimport {TabListState} from '@react-stately/tabs';\nimport type {TabsProps} from './tabs';\n\ninterface TabsContext<T> {\n  tabProps: TabsProps<T>;\n  tabState: {\n    tabListState: TabListState<T>;\n    selectedTab: HTMLElement;\n  };\n  refs: {\n    tablistRef: RefObject<HTMLDivElement>;\n  };\n}\n\nexport const TabContext = React.createContext<TabsContext<any>>(null!);\n","import React, {useContext, useRef} from 'react';\nimport clsx from 'clsx';\nimport {DOMProps, Node} from '@react-types/shared';\nimport {SingleSelectListState} from '@react-stately/list';\nimport {useTab} from '@react-aria/tabs';\nimport {useHover} from '@react-aria/interactions';\nimport {mergeProps} from '@react-aria/utils';\nimport {FocusRing} from '@react-aria/focus';\nimport {TabContext} from './tabs-context';\n\ninterface TabProps<T> extends DOMProps {\n  item: Node<T>;\n  state: SingleSelectListState<T>;\n  className?: string;\n}\n\nexport function Tab<T>(props: TabProps<T>) {\n  const tabContext = useContext(TabContext);\n  const {item, state, className} = props;\n  const {key, rendered} = item;\n  const isDisabled = state.disabledKeys.has(key);\n  const isSelected = state.selectedKey === key;\n\n  const ref = useRef<HTMLDivElement>(null);\n  const {tabProps} = useTab({key}, state, ref);\n  const {hoverProps, isHovered} = useHover({...props, isDisabled});\n\n  const size = tabContext.tabProps.size;\n  const mergedClassname = clsx(\n    'tracking-wide overflow-hidden capitalize flex-shrink-0 flex items-center outline-none transition-colors',\n    textColor({isDisabled, isHovered, isSelected}),\n    className,\n    {\n      'px-16 h-48': !size || size === 'md',\n      'px-12 h-32': size === 'sm',\n      'cursor-pointer': !isDisabled,\n    }\n  );\n\n  return (\n    <FocusRing focusRingClass=\"ring-2 ring-inset ring-primary-light rounded\">\n      <div\n        className={mergedClassname}\n        {...mergeProps(tabProps, hoverProps)}\n        ref={ref}\n      >\n        {rendered}\n      </div>\n    </FocusRing>\n  );\n}\n\ninterface TextColorProps {\n  isDisabled: boolean;\n  isHovered: boolean;\n  isSelected: boolean;\n}\nfunction textColor({\n  isDisabled,\n  isHovered,\n  isSelected,\n}: TextColorProps): string {\n  if (isDisabled) {\n    return 'text-disabled cursor-default';\n  }\n  if (isSelected) {\n    return 'text-primary';\n  }\n  if (isHovered) {\n    return 'text-main';\n  }\n  return 'text-muted';\n}\n","import React, {Key, useState} from 'react';\nimport {useLayoutEffect} from '@react-aria/utils';\n\ninterface TabLineProps {\n  selectedTab?: HTMLElement;\n  selectedKey?: Key;\n}\n\ninterface TabLineStyle {\n  width?: string;\n  transform?: string;\n}\n\nexport function TabLine(props: TabLineProps) {\n  const {selectedTab, selectedKey} = props;\n\n  const [style, setStyle] = useState<TabLineStyle>({\n    width: undefined,\n    transform: undefined,\n  });\n\n  useLayoutEffect(() => {\n    if (selectedTab) {\n      setStyle({\n        width: `${selectedTab.offsetWidth}px`,\n        transform: `translateX(${selectedTab.offsetLeft}px)`,\n      });\n    }\n  }, [setStyle, selectedTab, selectedKey]);\n\n  return (\n    <div\n      className=\"absolute bottom-0 left-0 h-2 bg-primary transition-all\"\n      role=\"presentation\"\n      style={style}\n    />\n  );\n}\n","import React, {useContext} from 'react';\nimport {DOMProps, ItemElement, StyleProps} from '@react-types/shared';\nimport {useTabList} from '@react-aria/tabs';\nimport clsx from 'clsx';\nimport {TabContext} from './tabs-context';\nimport {Tab} from './tab';\nimport {TabLine} from './tab-line';\n\nexport interface TabListProps<T = object> extends DOMProps, StyleProps {\n  children: (any | ItemElement<T>)[];\n}\nexport function TabList<T>(props: TabListProps<T>) {\n  const tabContext = useContext(TabContext);\n  const {refs, tabState, tabProps} = tabContext;\n  const {selectedTab, tabListState: state} = tabState;\n  const {tablistRef} = refs;\n  const {tabListProps} = useTabList({...tabProps, ...props}, state, tablistRef);\n\n  return (\n    <div\n      className=\"flex relative max-w-full overflow-auto hide-scrollbar\"\n      {...tabListProps}\n      ref={tablistRef}\n    >\n      {[...state.collection].map((item, index) => {\n        return (\n          <Tab\n            className={clsx(\n              index === 0 && 'ml-auto',\n              index === state.collection.size - 1 && 'mr-auto'\n            )}\n            key={item.key}\n            item={item}\n            state={state}\n          />\n        );\n      })}\n      <TabLine selectedTab={selectedTab} />\n    </div>\n  );\n}\n","import {useSingleSelectListState as $a9c3b$useSingleSelectListState} from \"@react-stately/list\";\nimport {useEffect as $a9c3b$useEffect} from \"react\";\n\nfunction $parcel$export(e, n, v, s) {\n  Object.defineProperty(e, n, {get: v, set: s, enumerable: true, configurable: true});\n}\nvar $ead76093e5740fb6$exports = {};\n\n$parcel$export($ead76093e5740fb6$exports, \"useTabListState\", () => $ead76093e5740fb6$export$4ba071daf4e486);\n\n\nfunction $ead76093e5740fb6$export$4ba071daf4e486(props) {\n    let state = $a9c3b$useSingleSelectListState({\n        ...props,\n        suppressTextValueWarning: true\n    });\n    $a9c3b$useEffect(()=>{\n        // Ensure a tab is always selected (in case no selected key was specified or if selected item was deleted from collection)\n        let selectedKey = state.selectedKey;\n        if (state.selectionManager.isEmpty || !state.collection.getItem(selectedKey)) {\n            selectedKey = state.collection.getFirstKey();\n            state.selectionManager.replaceSelection(selectedKey);\n        }\n        if (state.selectionManager.focusedKey == null) state.selectionManager.setFocusedKey(selectedKey);\n    }, [\n        state.selectionManager,\n        state.selectedKey,\n        state.collection\n    ]);\n    return state;\n}\n\n\n\n\nexport {$ead76093e5740fb6$export$4ba071daf4e486 as useTabListState};\n//# sourceMappingURL=module.js.map\n","import {DOMProps, SingleSelection, StyleProps} from '@react-types/shared';\nimport React, {Key, ReactElement, useEffect, useRef, useState} from 'react';\nimport {filterDOMProps} from '@react-aria/utils';\nimport {useTabListState} from '@react-stately/tabs';\nimport clsx from 'clsx';\nimport {TabContext} from './tabs-context';\nimport {TabListProps} from './tab-list';\nimport {TabPanelsProps} from './tab-panels';\n\nexport interface TabsProps<T> extends SingleSelection, DOMProps, StyleProps {\n  children: [ReactElement<TabListProps>, ReactElement<TabPanelsProps>];\n  items?: Iterable<T>;\n  disabledKeys?: Iterable<Key>;\n  size?: 'sm' | 'md';\n  className?: string;\n}\n\nexport function Tabs<T extends object>(props: TabsProps<T>) {\n  const {size = 'md', children, className, ...otherProps} = props;\n\n  const domRef = useRef<HTMLDivElement>(null);\n  const tablistRef = useRef<HTMLDivElement>(null);\n\n  const [selectedTab, setSelectedTab] = useState<HTMLElement>(null!);\n\n  const tabListState = useTabListState({\n    ...props,\n    children: children[0].props.children,\n  });\n\n  useEffect(() => {\n    if (tablistRef.current) {\n      const selectedTabEl = tablistRef.current.querySelector(\n        `[data-key=\"${tabListState?.selectedKey}\"]`\n      );\n\n      if (selectedTabEl != null) {\n        setSelectedTab(selectedTabEl as HTMLElement);\n      }\n    }\n  }, [children, tabListState?.selectedKey, tablistRef]);\n\n  return (\n    <TabContext.Provider\n      value={{\n        tabProps: {...props, size},\n        tabState: {tabListState, selectedTab},\n        refs: {tablistRef},\n      }}\n    >\n      <div\n        className={clsx(className, 'max-w-full overflow-hidden')}\n        {...filterDOMProps(otherProps)}\n        ref={domRef}\n      >\n        {children}\n      </div>\n    </TabContext.Provider>\n  );\n}\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const FormatUnderlinedIcon = createSvgIcon(\n  <path d=\"M12 17c3.31 0 6-2.69 6-6V3h-2.5v8c0 1.93-1.57 3.5-3.5 3.5S8.5 12.93 8.5 11V3H6v8c0 3.31 2.69 6 6 6zm-7 2v2h14v-2H5z\" />\n, 'FormatUnderlinedOutlined');\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const FormatStrikethroughIcon = createSvgIcon(\n  <path d=\"M10 19h4v-3h-4v3zM5 4v3h5v3h4V7h5V4H5zM3 14h18v-2H3v2z\" />\n, 'FormatStrikethroughOutlined');\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const FormatItalicIcon = createSvgIcon(\n  <path d=\"M10 4v3h2.21l-3.42 8H6v3h8v-3h-2.21l3.42-8H18V4h-8z\" />\n, 'FormatItalicOutlined');\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const FormatAlignRightIcon = createSvgIcon(\n  <path d=\"M3 21h18v-2H3v2zm6-4h12v-2H9v2zm-6-4h18v-2H3v2zm6-4h12V7H9v2zM3 3v2h18V3H3z\" />\n, 'FormatAlignRightOutlined');\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const FormatAlignLeftIcon = createSvgIcon(\n  <path d=\"M15 15H3v2h12v-2zm0-8H3v2h12V7zM3 13h18v-2H3v2zm0 8h18v-2H3v2zM3 3v2h18V3H3z\" />\n, 'FormatAlignLeftOutlined');\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const FormatAlignCenterIcon = createSvgIcon(\n  <path d=\"M7 15v2h10v-2H7zm-4 6h18v-2H3v2zm0-8h18v-2H3v2zm4-6v2h10V7H7zM3 3v2h18V3H3z\" />\n, 'FormatAlignCenterOutlined');\n","import React, {useState} from 'react';\nimport {useIntl} from 'react-intl';\nimport {useStore} from '../../../state/store';\nimport {ButtonGroup} from '../../../common/ui/buttons/button-group';\nimport {IconButton} from '../../../common/ui/buttons/icon-button';\nimport {NumberField} from '../../../common/ui/inputs/input-field/number-field';\nimport {state, tools} from '../../../state/utils';\nimport {FormatUnderlinedIcon} from '../../../common/icons/material/FormatUnderlined';\nimport {FormatStrikethroughIcon} from '../../../common/icons/material/FormatStrikethrough';\nimport {FormatItalicIcon} from '../../../common/icons/material/FormatItalic';\nimport {FormatAlignRightIcon} from '../../../common/icons/material/FormatAlignRight';\nimport {FormatAlignLeftIcon} from '../../../common/icons/material/FormatAlignLeft';\nimport {FormatAlignCenterIcon} from '../../../common/icons/material/FormatAlignCenter';\n\nexport function TextStyleTabPanel() {\n  return (\n    <div className=\"flex gap-20 justify-center\">\n      <FontSizeSelector />\n      <StyleSelector />\n      <AlignmentSelector />\n    </div>\n  );\n}\n\nfunction FontSizeSelector() {\n  const fontSize = useStore(s => s.objects.active.editableProps.fontSize) ?? 40;\n  const {formatMessage} = useIntl();\n  return (\n    <NumberField\n      size=\"xs\"\n      aria-label={formatMessage({defaultMessage: 'Font Size'})}\n      minValue={1}\n      maxValue={300}\n      className=\"w-64 flex-shrink-0\"\n      value={fontSize}\n      onChange={value => {\n        tools().objects.setValues({\n          fontSize: value,\n        });\n        state().setDirty(true);\n      }}\n    />\n  );\n}\n\nfunction StyleSelector() {\n  const fontStyle = useStore(s => s.objects.active.editableProps.fontStyle);\n  const underline = useStore(s => s.objects.active.editableProps.underline);\n  const linethrough = useStore(s => s.objects.active.editableProps.linethrough);\n\n  const [styles, setStyles] = useState([\n    fontStyle,\n    underline && 'underline',\n    linethrough && 'linethrough',\n  ]);\n\n  return (\n    <ButtonGroup\n      size=\"xs\"\n      variant=\"outline\"\n      radius=\"rounded\"\n      value={styles}\n      multiple\n      onChange={(newStyles: string[]) => {\n        setStyles(newStyles);\n        tools().objects.setValues({\n          underline: newStyles.includes('underline'),\n          linethrough: newStyles.includes('linethrough'),\n          fontStyle: newStyles.includes('italic') ? 'italic' : '',\n        });\n        state().setDirty(true);\n      }}\n    >\n      <IconButton value=\"underline\">\n        <FormatUnderlinedIcon />\n      </IconButton>\n      <IconButton value=\"linethrough\">\n        <FormatStrikethroughIcon />\n      </IconButton>\n      <IconButton value=\"italic\">\n        <FormatItalicIcon />\n      </IconButton>\n    </ButtonGroup>\n  );\n}\n\nfunction AlignmentSelector() {\n  const textAlign = useStore(s => s.objects.active.editableProps.textAlign);\n  return (\n    <ButtonGroup\n      size=\"xs\"\n      variant=\"outline\"\n      radius=\"rounded\"\n      value={textAlign}\n      onChange={newAlign => {\n        tools().objects.setValues({\n          textAlign: newAlign,\n        });\n        state().setDirty(true);\n      }}\n    >\n      <IconButton value=\"left\">\n        <FormatAlignLeftIcon />\n      </IconButton>\n      <IconButton value=\"center\">\n        <FormatAlignCenterIcon />\n      </IconButton>\n      <IconButton value=\"right\">\n        <FormatAlignRightIcon />\n      </IconButton>\n    </ButtonGroup>\n  );\n}\n","import React, {useContext, useRef} from 'react';\nimport {CollectionChildren, Node} from '@react-types/shared';\nimport {ListCollection} from '@react-stately/list';\nimport {useTabPanel} from '@react-aria/tabs';\nimport {AriaTabPanelProps} from '@react-types/tabs';\nimport {FocusRing} from '@react-aria/focus';\nimport {useCollection} from '@react-stately/collections';\nimport {TabContext} from './tabs-context';\n\nexport interface TabPanelsProps<T = object> extends AriaTabPanelProps {\n  children: CollectionChildren<T>;\n  className?: string;\n}\nexport function TabPanels<T>(props: TabPanelsProps<T>) {\n  const {tabState, tabProps} = useContext(TabContext);\n  const {tabListState} = tabState;\n\n  const factory = (nodes: Iterable<Node<any>>) => new ListCollection(nodes);\n  const collection = useCollection({items: tabProps.items, ...props}, factory, {\n    suppressTextValueWarning: true,\n  });\n  const selectedItem = tabListState\n    ? collection.getItem(tabListState.selectedKey)\n    : null;\n\n  return (\n    <TabPanel {...props} key={tabListState?.selectedKey}>\n      {selectedItem && selectedItem.props.children}\n    </TabPanel>\n  );\n}\n\nfunction TabPanel<T>(props: TabPanelsProps<T>) {\n  const {children, className} = props;\n  const {tabState} = useContext(TabContext);\n  const ref = useRef<HTMLDivElement>(null);\n  const {tabPanelProps} = useTabPanel(props, tabState.tabListState, ref);\n\n  return (\n    <FocusRing focusRingClass=\"outline-primary-light\">\n      <div className={className} {...tabPanelProps} ref={ref}>\n        {children}\n      </div>\n    </FocusRing>\n  );\n}\n","import {IGradientOptions} from 'fabric/fabric-impl';\n\nexport const DEFAULT_GRADIENTS: IGradientOptions[] = [\n  {\n    type: 'linear',\n    coords: {\n      x1: -80,\n      y1: 0,\n      x2: 80,\n      y2: 0,\n    },\n    colorStops: [\n      {color: '#ffe47b', offset: 0},\n      {color: 'rgb(111,154,211)', offset: 1},\n    ],\n  },\n  {\n    type: 'linear',\n    coords: {\n      x1: 0,\n      y1: -120,\n      x2: 0,\n      y2: 120,\n    },\n    colorStops: [\n      {color: '#ff4040', offset: 0},\n      {color: '#e6399b', offset: 1},\n    ],\n  },\n  {\n    type: 'linear',\n    coords: {\n      x1: -90,\n      y1: -90,\n      x2: 90,\n      y2: 90,\n    },\n    colorStops: [\n      {offset: 0, color: 'rgb(166,111,213)'},\n      {offset: 0.5, color: 'rgba(106, 72, 215, 0.5)'},\n      {offset: 1, color: '#200772'},\n    ],\n  },\n  {\n    type: 'radial',\n    coords: {\n      r1: 100,\n      r2: 10,\n      x1: 0,\n      y1: 0,\n      x2: 0,\n      y2: 0,\n    },\n    colorStops: [\n      {offset: 0, color: '#FF4F4F'},\n      {offset: 1, color: 'rgb(255, 239, 64)'},\n    ],\n  },\n  {\n    type: 'radial',\n    coords: {\n      r1: 100,\n      r2: 10,\n      x1: 0,\n      y1: 0,\n      x2: 20,\n      y2: 20,\n    },\n    colorStops: [\n      {offset: 0, color: '#ffe47b'},\n      {offset: 0.5, color: 'rgb(111,154,211)'},\n      {offset: 1, color: 'rgb(166,111,213)'},\n    ],\n  },\n  {\n    type: 'radial',\n    coords: {\n      r1: 50,\n      r2: 80,\n      x1: 45,\n      y1: 45,\n      x2: 52,\n      y2: 50,\n    },\n    colorStops: [\n      {offset: 0, color: 'rgb(155, 237, 0)'},\n      {offset: 1, color: 'rgba(0, 164, 128,0.4)'},\n    ],\n  },\n  {\n    type: 'linear',\n    coords: {\n      x1: -90,\n      y1: -90,\n      x2: 90,\n      y2: 90,\n    },\n    colorStops: [\n      {offset: 0, color: '#9ecb2d'},\n      {offset: 0.5, color: '#72aa00'},\n      {offset: 1, color: '#bfd255'},\n    ],\n  },\n  {\n    type: 'radial',\n    coords: {\n      r1: 100,\n      r2: 50,\n      x1: 30,\n      y1: 0,\n      x2: 0,\n      y2: 0,\n    },\n    colorStops: [\n      {offset: 0, color: '#aebcbf'},\n      {offset: 1, color: '#0a0809'},\n    ],\n  },\n  {\n    type: 'linear',\n    coords: {\n      x1: -80,\n      y1: 0,\n      x2: 80,\n      y2: 0,\n    },\n    colorStops: [\n      {offset: 0, color: '#ffffff'},\n      {offset: 1, color: '#f6f6f6'},\n    ],\n  },\n  {\n    type: 'linear',\n    coords: {\n      x1: 0,\n      y1: -120,\n      x2: 0,\n      y2: 120,\n    },\n    colorStops: [\n      {offset: 0, color: '#fefcea'},\n      {offset: 1, color: '#f1da36'},\n    ],\n  },\n  {\n    type: 'linear',\n    coords: {\n      x1: -90,\n      y1: -90,\n      x2: 90,\n      y2: 90,\n    },\n    colorStops: [\n      {offset: 0, color: 'rgb(166,111,213)'},\n      {offset: 0.5, color: 'rgba(106, 72, 215, 0.5)'},\n      {offset: 1, color: '#ff1a00'},\n    ],\n  },\n  {\n    type: 'linear',\n    coords: {\n      x1: 0,\n      y1: -120,\n      x2: 0,\n      y2: 120,\n    },\n    colorStops: [\n      {offset: 0, color: '#b7deed'},\n      {offset: 1, color: '#21b4e2'},\n    ],\n  },\n  {\n    type: 'linear',\n    coords: {\n      x1: -80,\n      y1: 100,\n      x2: 80,\n      y2: -100,\n    },\n    colorStops: [\n      {offset: 0, color: '#ffe47b'},\n      {offset: 1, color: 'rgb(111,154,211)'},\n    ],\n  },\n];\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const TextureIcon = createSvgIcon(\n  <path d=\"M19.51 3.08 3.08 19.51c.09.34.27.65.51.9.25.24.56.42.9.51L20.93 4.49c-.19-.69-.73-1.23-1.42-1.41zM11.88 3 3 11.88v2.83L14.71 3h-2.83zM5 3c-1.1 0-2 .9-2 2v2l4-4H5zm14 18c.55 0 1.05-.22 1.41-.59.37-.36.59-.86.59-1.41v-2l-4 4h2zm-9.71 0h2.83L21 12.12V9.29L9.29 21z\" />\n, 'TextureOutlined');\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const GradientIcon = createSvgIcon(\n  <path d=\"M11 9h2v2h-2V9zm-2 2h2v2H9v-2zm4 0h2v2h-2v-2zm2-2h2v2h-2V9zM7 9h2v2H7V9zm12-6H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zM9 18H7v-2h2v2zm4 0h-2v-2h2v2zm4 0h-2v-2h2v2zm2-7h-2v2h2v2h-2v-2h-2v2h-2v-2h-2v2H9v-2H7v2H5v-2h2v-2H5V5h14v6z\" />\n, 'GradientOutlined');\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const AddPhotoAlternateIcon = createSvgIcon(\n  <path d=\"M18 20H4V6h9V4H4c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2v-9h-2v9zm-7.79-3.17-1.96-2.36L5.5 18h11l-3.54-4.71zM20 4V1h-2v3h-3c.01.01 0 2 0 2h3v2.99c.01.01 2 0 2 0V6h3V4h-3z\" />\n, 'AddPhotoAlternateOutlined');\n","import React from 'react';\nimport {fabric} from 'fabric';\nimport {Pattern} from 'fabric/fabric-impl';\nimport {FormattedMessage, useIntl} from 'react-intl';\nimport {useStore} from '../../../state/store';\nimport {ColorPickerButton} from '../../../ui/color-picker-button';\nimport {Button} from '../../../common/ui/buttons/button';\nimport {DEFAULT_GRADIENTS} from '../../../config/default-gradients';\nimport {DialogTrigger} from '../../../common/ui/overlays/dialog-trigger/dialog-trigger';\nimport {ButtonBase} from '../../../common/ui/buttons/button-base';\nimport {defaultObjectProps} from '../../../config/default-object-props';\nimport {state, tools} from '../../../state/utils';\nimport {TextureIcon} from '../../../common/icons/material/Texture';\nimport {GradientIcon} from '../../../common/icons/material/Gradient';\nimport {KeyboardArrowDownIcon} from '../../../common/icons/material/KeyboardArrowDown';\nimport {AddPhotoAlternateIcon} from '../../../common/icons/material/AddPhotoAlternate';\nimport {assetUrl} from '../../../utils/asset-url';\nimport {Dialog} from '../../../common/ui/overlays/dialog/dialog';\n\ninterface Props {\n  property: 'fill' | 'backgroundColor';\n}\n\nexport function ColorTabPanel({property}: Props) {\n  const {formatMessage} = useIntl();\n  const currentColor = useStore(s => s.objects.active.editableProps[property]);\n\n  return (\n    <>\n      <ColorPickerButton\n        size=\"xs\"\n        aria-label={formatMessage({defaultMessage: 'Color'})}\n        value={\n          typeof currentColor === 'string'\n            ? currentColor\n            : defaultObjectProps.fill\n        }\n        onChange={newColor => {\n          tools().objects.setValues({[property]: newColor});\n          state().setDirty(true);\n        }}\n      />\n      <FillSelector type=\"gradient\" property={property} />\n      <FillSelector type=\"texture\" property={property} />\n    </>\n  );\n}\n\ninterface FillSelectorProps extends Props {\n  type: 'gradient' | 'texture';\n}\n\nfunction FillSelector({type, property}: FillSelectorProps) {\n  const startIcon = type === 'texture' ? <TextureIcon /> : <GradientIcon />;\n  return (\n    <>\n      <DialogTrigger type=\"popover\">\n        <Button\n          id={`${type}-panel-trigger`}\n          variant=\"outline\"\n          size=\"xs\"\n          startIcon={startIcon}\n          endIcon={<KeyboardArrowDownIcon />}\n        >\n          <span className=\"capitalize\">\n            {type === 'gradient' ? (\n              <FormattedMessage defaultMessage=\"Gradient\" />\n            ) : (\n              <FormattedMessage defaultMessage=\"Texture\" />\n            )}\n          </span>\n        </Button>\n        {dialogState => {\n          return (\n            <Dialog>\n              <div className=\"grid gap-8 grid-cols-5-min-content p-10 bg-paper rounded shadow-md\">\n                <PreviewButtons\n                  property={property}\n                  closeOverlay={dialogState.close}\n                  type={type}\n                />\n              </div>\n            </Dialog>\n          );\n        }}\n      </DialogTrigger>\n    </>\n  );\n}\n\ninterface PreviewButtonsProps extends FillSelectorProps {\n  closeOverlay: () => void;\n}\n\nfunction PreviewButtons({closeOverlay, type, property}: PreviewButtonsProps) {\n  const iterator = Array.from(\n    Array(type === 'gradient' ? DEFAULT_GRADIENTS.length : 28).keys()\n  );\n\n  const previewBtnClass = 'w-56 h-56 bg border shadow-sm hover:scale-110';\n\n  const previewBtns = iterator.map(index => {\n    const previewUrl = assetUrl(`images/${type}s/${index}.png`);\n\n    return (\n      <ButtonBase\n        radius=\"rounded\"\n        className={previewBtnClass}\n        key={index}\n        style={{backgroundImage: `url(${previewUrl})`}}\n        aria-label={`Select ${type} #${index}`}\n        onPress={async () => {\n          closeOverlay();\n          const value =\n            type === 'gradient'\n              ? new fabric.Gradient(DEFAULT_GRADIENTS[index])\n              : await patternFromUrlOrData(previewUrl);\n          tools().objects.setValues({[property]: value});\n          state().setDirty(true);\n        }}\n      />\n    );\n  });\n\n  if (type === 'texture') {\n    previewBtns.unshift(\n      <UploadButton\n        property={property}\n        closeOverlay={closeOverlay}\n        key=\"upload-btn\"\n        className={previewBtnClass}\n      />\n    );\n  }\n\n  return <>{previewBtns}</>;\n}\n\ninterface UploadButtonProps extends Props {\n  className: string;\n  closeOverlay: () => void;\n}\n\nfunction UploadButton({className, closeOverlay, property}: UploadButtonProps) {\n  return (\n    <ButtonBase\n      radius=\"rounded\"\n      className={className}\n      aria-label=\"Upload an image\"\n      onPress={async () => {\n        const file = await tools().import.openUploadWindow();\n        closeOverlay();\n        if (file) {\n          const pattern = await patternFromUrlOrData(await file.data);\n          tools().objects.setValues({[property]: pattern});\n        }\n      }}\n    >\n      <AddPhotoAlternateIcon className=\"icon-md\" />\n    </ButtonBase>\n  );\n}\n\nfunction patternFromUrlOrData(data: string): Promise<Pattern> {\n  return new Promise(resolve => {\n    fabric.util.loadImage(data, img => {\n      const pattern = new fabric.Pattern({\n        source: img,\n        repeat: 'repeat',\n      });\n      resolve(pattern);\n    });\n  });\n}\n","import {useStore} from '../../../state/store';\nimport {Slider} from '../../../common/ui/inputs/slider/slider';\nimport {state, tools} from '../../../state/utils';\n\nexport function OpacityTabPanel() {\n  const opacity = useStore(s => s.objects.active.editableProps.opacity);\n\n  return (\n    <Slider\n      className=\"max-w-240\"\n      aria-label=\"Opacity\"\n      value={opacity}\n      minValue={0.1}\n      step={0.1}\n      maxValue={1}\n      onChange={newOpacity => {\n        tools().objects.setValues({opacity: newOpacity});\n        state().setDirty(true);\n      }}\n    />\n  );\n}\n","import {useIntl} from 'react-intl';\nimport {useStore} from '../../../state/store';\nimport {ColorPickerButton} from '../../../ui/color-picker-button';\nimport {Slider} from '../../../common/ui/inputs/slider/slider';\nimport {state, tools} from '../../../state/utils';\n\nexport function OutlineTabPanel() {\n  const {formatMessage} = useIntl();\n  const outlineColor = useStore(s => s.objects.active.editableProps.stroke);\n  const outlineWidth = useStore(\n    s => s.objects.active.editableProps.strokeWidth\n  );\n\n  return (\n    <>\n      <ColorPickerButton\n        size=\"xs\"\n        value={outlineColor}\n        aria-label={formatMessage({defaultMessage: 'Outline Color'})}\n        onChange={newColor => {\n          tools().objects.setValues({stroke: newColor});\n          state().setDirty(true);\n        }}\n      />\n      <Slider\n        aria-label=\"Outline Width\"\n        className=\"max-w-240\"\n        value={outlineWidth}\n        onChange={newWidth => {\n          tools().objects.setValues({strokeWidth: newWidth});\n          state().setDirty(true);\n        }}\n      />\n    </>\n  );\n}\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const ImageIcon = createSvgIcon(\n  <path 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-2zm-4.86 8.86-3 3.87L9 13.14 6 17h12l-3.86-5.14z\" />\n, 'ImageOutlined');\n","import {Image} from 'fabric/fabric-impl';\nimport {FormattedMessage} from 'react-intl';\nimport {Button} from '../../../common/ui/buttons/button';\nimport {fireObjModifiedEvent} from '../../object-modified-event';\nimport {ImageIcon} from '../../../common/icons/material/Image';\nimport {tools} from '../../../state/utils';\n\nexport function ImageTabPanel() {\n  return (\n    <div>\n      <Button\n        type=\"button\"\n        variant=\"outline\"\n        size=\"xs\"\n        startIcon={<ImageIcon />}\n        radius=\"rounded-full\"\n        onPress={async () => {\n          const file = await tools().import.openUploadWindow();\n          if (file) {\n            const active = tools().objects.getActive();\n            if (active && 'setSrc' in active) {\n              const fileData = await file.data;\n              (active as Image).setSrc(fileData, () => {\n                fireObjModifiedEvent({\n                  src: fileData,\n                });\n                tools().canvas.render();\n              });\n            }\n          }\n        }}\n      >\n        <FormattedMessage defaultMessage=\"Replace Image\" />\n      </Button>\n    </div>\n  );\n}\n","import {fabric} from 'fabric';\nimport React from 'react';\nimport {IShadowOptions, Shadow} from 'fabric/fabric-impl';\nimport {useIntl} from 'react-intl';\nimport {useStore} from '../../../state/store';\nimport {ColorPickerButton} from '../../../ui/color-picker-button';\nimport {Slider} from '../../../common/ui/inputs/slider/slider';\nimport {state, tools} from '../../../state/utils';\n\nconst shadowDefaults = {\n  color: 'rgba(0, 0, 0, 0.6)',\n  blur: 3,\n  offsetX: -1,\n  offsetY: 0,\n};\n\nexport function ShadowTabPanel() {\n  const {formatMessage} = useIntl();\n  const shadow =\n    useStore(s => s.objects.active.editableProps.shadow) || shadowDefaults;\n\n  return (\n    <>\n      <ColorPickerButton\n        value={shadow.color}\n        size=\"xs\"\n        aria-label={formatMessage({defaultMessage: 'Shadow Color'})}\n        onChange={color => {\n          tools().objects.setValues({shadow: modifiedShadow({color})});\n          state().setDirty(true);\n        }}\n      />\n      <Slider\n        aria-label=\"Shadow Blur\"\n        className=\"max-w-240\"\n        defaultValue={shadow.blur}\n        onChange={blur => {\n          tools().objects.setValues({\n            shadow: modifiedShadow({blur}),\n          });\n          state().setDirty(true);\n        }}\n      />\n    </>\n  );\n}\n\nfunction modifiedShadow(options: IShadowOptions) {\n  const current = tools().objects.getActive()?.shadow as Shadow | null;\n  if (current) {\n    Object.entries(options).forEach(([key, val]) => {\n      current[key as keyof IShadowOptions] = val;\n    });\n    return current;\n  }\n  return new fabric.Shadow({\n    ...shadowDefaults,\n    ...options,\n  });\n}\n","import React from 'react';\nimport {Item} from '@react-stately/collections';\nimport {FormattedMessage} from 'react-intl';\nimport {TabList} from '../../../common/ui/tabs/tab-list';\nimport {Tabs} from '../../../common/ui/tabs/tabs';\nimport {TextStyleTabPanel} from './text-style-tab-panel';\nimport {TabPanels} from '../../../common/ui/tabs/tab-panels';\nimport {ColorTabPanel} from './color-tab-panel';\nimport {OpacityTabPanel} from './opacity-tab-panel';\nimport {OutlineTabPanel} from './outline-tab-panel';\nimport {useStore} from '../../../state/store';\nimport {ImageTabPanel} from './image-tab-panel';\nimport {ShadowTabPanel} from './shadow-tab-panel';\n\nexport function ActiveObjectControls() {\n  const active = useStore(s => s.objects.active);\n\n  return (\n    <Tabs size=\"sm\" className=\"pb-18 pt-6\">\n      <TabList>\n        {active.isText && (\n          <Item key=\"font\">\n            <FormattedMessage defaultMessage=\"Font\" />\n          </Item>\n        )}\n        {!active.isImage && (\n          <Item key=\"fill\">\n            <FormattedMessage defaultMessage=\"Color\" />\n          </Item>\n        )}\n        {!active.isImage && (\n          <Item key=\"bgColor\">\n            <FormattedMessage defaultMessage=\"Background\" />\n          </Item>\n        )}\n        {active.isImage && (\n          <Item key=\"image\">\n            <FormattedMessage defaultMessage=\"Image\" />\n          </Item>\n        )}\n        <Item key=\"opacity\">\n          <FormattedMessage defaultMessage=\"Opacity\" />\n        </Item>\n        <Item key=\"outline\">\n          <FormattedMessage defaultMessage=\"Outline\" />\n        </Item>\n        <Item key=\"shadow\">\n          <FormattedMessage defaultMessage=\"Shadow\" />\n        </Item>\n      </TabList>\n      <TabPanels className=\"flex items-center justify-center gap-10 pt-16 h-50 w-full\">\n        <Item key=\"font\">\n          <TextStyleTabPanel />\n        </Item>\n        <Item key=\"fill\">\n          <ColorTabPanel property=\"fill\" />\n        </Item>\n        <Item key=\"bgColor\">\n          <ColorTabPanel property=\"backgroundColor\" />\n        </Item>\n        <Item key=\"image\">\n          <ImageTabPanel />\n        </Item>\n        <Item key=\"opacity\">\n          <OpacityTabPanel />\n        </Item>\n        <Item key=\"outline\">\n          <OutlineTabPanel />\n        </Item>\n        <Item key=\"shadow\">\n          <ShadowTabPanel />\n        </Item>\n      </TabPanels>\n    </Tabs>\n  );\n}\n","import {FormattedMessage} from 'react-intl';\nimport {Button} from '../../../common/ui/buttons/button';\nimport {ActiveObjectControls} from '../../../objects/ui/active-obj-controls/active-object-controls';\nimport {ToolControlsOverlayWrapper} from '../../../ui/navbar/tool-controls-overlay-wrapper';\nimport {state, tools} from '../../../state/utils';\nimport {useIsMobileMediaQuery} from '../../../common/utils/hooks/is-mobile-media-query';\n\nexport function ActiveTextControls() {\n  const isMobile = useIsMobileMediaQuery();\n  const actionBtn = !isMobile && (\n    <Button\n      size=\"sm\"\n      color=\"primary\"\n      variant=\"outline\"\n      onPress={() => {\n        tools().text.add();\n        state().setDirty(true);\n      }}\n    >\n      <FormattedMessage defaultMessage=\"New Text\" />\n    </Button>\n  );\n  return (\n    <ToolControlsOverlayWrapper actionBtn={actionBtn}>\n      <ActiveObjectControls />\n    </ToolControlsOverlayWrapper>\n  );\n}\n","import {AnimatePresence, m} from 'framer-motion';\nimport {FilterControls} from '../../tools/filter/ui/filter-controls';\nimport {useStore} from '../../state/store';\nimport {ActiveFrameControls} from '../../tools/frame/ui/active-frame-controls';\nimport {ActiveTextControls} from '../../tools/text/ui/active-text-controls';\nimport {ActiveObjectControls} from '../../objects/ui/active-obj-controls/active-object-controls';\nimport {ActiveToolOverlay} from '../../state/editor-state';\n\nexport function ToolControlsOverlay() {\n  const activeOverlay = useStore(s => s.activeToolOverlay);\n  const activeObjId = useStore(s => s.objects.active.id);\n  const overlayCmp = getOverlay(activeOverlay, activeObjId);\n\n  return (\n    <div className=\"relative z-tool-overlay text-sm\">\n      <AnimatePresence>\n        {overlayCmp && (\n          <m.div\n            initial={{y: 0, opacity: 0}}\n            animate={{y: '-100%', opacity: 1}}\n            exit={{y: 0, opacity: 0}}\n            transition={{type: 'tween', duration: 0.15}}\n            key=\"tool-controls-overlay\"\n            className=\"absolute inset-x-0 gap-16 px-5vw bg bg-opacity-95 border-t\"\n          >\n            {overlayCmp}\n          </m.div>\n        )}\n      </AnimatePresence>\n    </div>\n  );\n}\n\nfunction getOverlay(\n  activeOverlay: ActiveToolOverlay | null,\n  activeObjId: string | null\n) {\n  switch (activeOverlay) {\n    case ActiveToolOverlay.Filter:\n      return <FilterControls />;\n    case ActiveToolOverlay.Frame:\n      return <ActiveFrameControls />;\n    case ActiveToolOverlay.Text:\n      return activeObjId && <ActiveTextControls />;\n    case ActiveToolOverlay.ActiveObject:\n      return activeObjId && <ActiveObjectControls />;\n    default:\n      return null;\n  }\n}\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const CancelIcon = createSvgIcon(\n  <path d=\"M12 2C6.47 2 2 6.47 2 12s4.47 10 10 10 10-4.47 10-10S17.53 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8zm3.59-13L12 10.59 8.41 7 7 8.41 10.59 12 7 15.59 8.41 17 12 13.41 15.59 17 17 15.59 13.41 12 17 8.41z\" />\n, 'CancelOutlined');\n","import clsx from 'clsx';\nimport {FormattedMessage} from 'react-intl';\nimport {useStore} from '../../../state/store';\nimport {ActiveToolOverlay} from '../../../state/editor-state';\nimport {IconButton} from '../../../common/ui/buttons/icon-button';\nimport {filterNameMessages} from '../filter-list';\nimport {state, tools} from '../../../state/utils';\nimport {assetUrl} from '../../../utils/asset-url';\nimport {CancelIcon} from '../../../common/icons/material/Cancel';\nimport {TuneIcon} from '../../../common/icons/material/Tune';\nimport {ButtonBase} from '../../../common/ui/buttons/button-base';\n\ntype FilterButtonProps = {\n  filter: string;\n};\n\nexport function FilterButton({filter}: FilterButtonProps) {\n  const isActive = useStore(s => s.filter.applied.includes(filter));\n  const hasOptions = tools().filter.hasOptions(filter);\n\n  const className = clsx('block flex-shrink-0 rounded', {\n    'text-primary border-primary': isActive,\n  });\n\n  const msg = filterNameMessages[filter];\n  const content = (\n    <>\n      <div className=\"relative\">\n        <FilterImg filter={filter} />\n        {isActive && <ActiveOverlay filter={filter} hasOptions={hasOptions} />}\n      </div>\n      <div className=\"mt-4 text-center text-xs capitalize\">\n        {msg ? <FormattedMessage {...msg} /> : filter}\n      </div>\n    </>\n  );\n\n  if (isActive && hasOptions) {\n    return <div className={className}>{content}</div>;\n  }\n  return (\n    <ButtonBase\n      className={className}\n      onPress={() => {\n        if (isActive) {\n          tools().filter.remove(filter);\n        } else {\n          tools().filter.apply(filter);\n        }\n      }}\n    >\n      {content}\n    </ButtonBase>\n  );\n}\n\ntype FilterImgProps = {\n  filter: string;\n};\n\nfunction FilterImg({filter}: FilterImgProps) {\n  const isSelected = useStore(s => s.filter.selected === filter);\n  const className = clsx('m-auto w-96 h-56 border rounded object-cover', {\n    shadow: isSelected,\n  });\n  return (\n    <img\n      src={assetUrl(`images/filter/${filter}.jpg`)}\n      className={className}\n      alt=\"\"\n    />\n  );\n}\n\ntype ActiveOverlayProps = {\n  hasOptions: boolean;\n  filter: string;\n};\n\nfunction ActiveOverlay({filter, hasOptions}: ActiveOverlayProps) {\n  const removeBtn = (\n    <IconButton\n      color=\"primary\"\n      size=\"md\"\n      onPress={() => {\n        tools().filter.remove(filter);\n      }}\n    >\n      <CancelIcon />\n    </IconButton>\n  );\n  return (\n    <div className=\"flex items-center justify-center bg-background/70 absolute inset-0 border-2 border-primary rounded\">\n      {hasOptions ? removeBtn : <CancelIcon className=\"svg-icon icon-md\" />}\n      {hasOptions && (\n        <ToggleSettingsButton filter={filter} hasOptions={hasOptions} />\n      )}\n    </div>\n  );\n}\n\ntype ToggleSettingsButtonProps = {\n  hasOptions: boolean;\n  filter: string;\n};\n\nfunction ToggleSettingsButton({filter, hasOptions}: ToggleSettingsButtonProps) {\n  return (\n    <IconButton\n      color=\"primary\"\n      size=\"md\"\n      onPress={() => {\n        if (\n          state().activeToolOverlay === ActiveToolOverlay.Filter &&\n          state().filter.selected === filter\n        ) {\n          state().setActiveTool(state().activeTool, null);\n        } else {\n          state().filter.select(filter, hasOptions);\n        }\n      }}\n    >\n      <TuneIcon />\n    </IconButton>\n  );\n}\n","import React, {forwardRef} from 'react';\nimport clsx from 'clsx';\n\ntype ScrollableListProps = {\n  children: React.ReactNode;\n  className?: string;\n  gap?: string;\n};\n\nexport const ScrollableView = forwardRef<HTMLDivElement, ScrollableListProps>(\n  ({children, className, gap}, ref) => {\n    const extendedChildren = React.Children.map(children, (child, i) => {\n      if (React.isValidElement(child)) {\n        return React.cloneElement(child, {\n          isFirst: i === 0,\n          isLast: React.Children.count(children) === i + 1,\n        });\n      }\n      return child;\n    });\n    return (\n      <div\n        ref={ref}\n        className={`tiny-scrollbar pb-4 overflow-x-auto relative flex items-center ${\n          gap || 'gap-10'\n        } ${className}`}\n      >\n        {extendedChildren}\n      </div>\n    );\n  }\n);\n\ntype ScrollableListItemProps = {\n  children: React.ReactNode;\n  className?: string;\n  isFirst?: boolean;\n  isLast?: boolean;\n};\n\nexport function ScrollableViewItem({\n  isFirst,\n  isLast,\n  children,\n  className,\n}: ScrollableListItemProps) {\n  const mergedClass = clsx(className, 'flex-shrink-0', {\n    'ml-auto': isFirst,\n    'mr-auto': isLast,\n  });\n  return <div className={mergedClass}>{children}</div>;\n}\n","import {useEffect} from 'react';\nimport {useStore} from '../../../state/store';\nimport {FilterButton} from './filter-button';\nimport {\n  ScrollableView,\n  ScrollableViewItem,\n} from '../../../ui/navbar/scrollable-view';\nimport {tools} from '../../../state/utils';\n\nexport function FilterNav() {\n  const filters = useStore(s => s.config.tools?.filter?.items) || [];\n\n  useEffect(() => {\n    tools().filter.syncState();\n  }, []);\n\n  const filterBtns = filters.map(filter => (\n    <ScrollableViewItem key={filter}>\n      <FilterButton filter={filter} />\n    </ScrollableViewItem>\n  ));\n  return <ScrollableView>{filterBtns}</ScrollableView>;\n}\n","import {useControlledState as $lIBue$useControlledState} from \"@react-stately/utils\";\n\nfunction $parcel$export(e, n, v, s) {\n  Object.defineProperty(e, n, {get: v, set: s, enumerable: true, configurable: true});\n}\nvar $5ff2beda28820a2f$exports = {};\n\n$parcel$export($5ff2beda28820a2f$exports, \"useToggleState\", () => $5ff2beda28820a2f$export$8042c6c013fd5226);\n\nfunction $5ff2beda28820a2f$export$8042c6c013fd5226(props = {\n}) {\n    let { isReadOnly: isReadOnly  } = props;\n    // have to provide an empty function so useControlledState doesn't throw a fit\n    // can't use useControlledState's prop calling because we need the event object from the change\n    let [isSelected, setSelected] = $lIBue$useControlledState(props.isSelected, props.defaultSelected || false, props.onChange);\n    function updateSelected(value) {\n        if (!isReadOnly) setSelected(value);\n    }\n    function toggleState() {\n        if (!isReadOnly) setSelected(!isSelected);\n    }\n    return {\n        isSelected: isSelected,\n        setSelected: updateSelected,\n        toggle: toggleState\n    };\n}\n\n\n\n\nexport {$5ff2beda28820a2f$export$8042c6c013fd5226 as useToggleState};\n//# sourceMappingURL=module.js.map\n","import {mergeProps as $dtb0o$mergeProps, filterDOMProps as $dtb0o$filterDOMProps} from \"@react-aria/utils\";\nimport {useFocusable as $dtb0o$useFocusable} from \"@react-aria/focus\";\nimport {usePress as $dtb0o$usePress} from \"@react-aria/interactions\";\n\nfunction $parcel$export(e, n, v, s) {\n  Object.defineProperty(e, n, {get: v, set: s, enumerable: true, configurable: true});\n}\nvar $9f08aaca62c37bf3$exports = {};\n\n$parcel$export($9f08aaca62c37bf3$exports, \"useToggle\", () => $9f08aaca62c37bf3$export$cbe85ee05b554577);\n\n\n\nfunction $9f08aaca62c37bf3$export$cbe85ee05b554577(props, state, ref) {\n    let { isDisabled: isDisabled = false , isRequired: isRequired , isReadOnly: isReadOnly , value: value , name: name , children: children , 'aria-label': ariaLabel , 'aria-labelledby': ariaLabelledby , validationState: validationState = 'valid'  } = props;\n    let onChange = (e)=>{\n        // since we spread props on label, onChange will end up there as well as in here.\n        // so we have to stop propagation at the lowest level that we care about\n        e.stopPropagation();\n        state.setSelected(e.target.checked);\n    };\n    let hasChildren = children != null;\n    let hasAriaLabel = ariaLabel != null || ariaLabelledby != null;\n    if (!hasChildren && !hasAriaLabel) console.warn('If you do not provide children, you must specify an aria-label for accessibility');\n    // This handles focusing the input on pointer down, which Safari does not do by default.\n    let { pressProps: pressProps  } = $dtb0o$usePress({\n        isDisabled: isDisabled\n    });\n    let { focusableProps: focusableProps  } = $dtb0o$useFocusable(props, ref);\n    let interactions = $dtb0o$mergeProps(pressProps, focusableProps);\n    let domProps = $dtb0o$filterDOMProps(props, {\n        labelable: true\n    });\n    return {\n        inputProps: $dtb0o$mergeProps(domProps, {\n            'aria-invalid': validationState === 'invalid' || undefined,\n            'aria-errormessage': props['aria-errormessage'],\n            'aria-controls': props['aria-controls'],\n            'aria-readonly': isReadOnly || undefined,\n            'aria-required': isRequired || undefined,\n            onChange: onChange,\n            disabled: isDisabled,\n            value: value,\n            name: name,\n            type: 'checkbox',\n            ...interactions\n        })\n    };\n}\n\n\n\n\nexport {$9f08aaca62c37bf3$export$cbe85ee05b554577 as useToggle};\n//# sourceMappingURL=module.js.map\n","import {useEffect as $g7Czo$useEffect} from \"react\";\nimport {useToggle as $g7Czo$useToggle} from \"@react-aria/toggle\";\nimport {filterDOMProps as $g7Czo$filterDOMProps, mergeProps as $g7Czo$mergeProps} from \"@react-aria/utils\";\nimport {useLabel as $g7Czo$useLabel} from \"@react-aria/label\";\nimport {useToggleState as $g7Czo$useToggleState} from \"@react-stately/toggle\";\n\nfunction $parcel$export(e, n, v, s) {\n  Object.defineProperty(e, n, {get: v, set: s, enumerable: true, configurable: true});\n}\nvar $fea2f35efc29884c$exports = {};\n\n$parcel$export($fea2f35efc29884c$exports, \"useCheckbox\", () => $fea2f35efc29884c$export$e375f10ce42261c5);\n\n\nfunction $fea2f35efc29884c$export$e375f10ce42261c5(props, state, inputRef) {\n    let { inputProps: inputProps  } = $g7Czo$useToggle(props, state, inputRef);\n    let { isSelected: isSelected  } = state;\n    let { isIndeterminate: isIndeterminate  } = props;\n    $g7Czo$useEffect(()=>{\n        // indeterminate is a property, but it can only be set via javascript\n        // https://css-tricks.com/indeterminate-checkboxes/\n        if (inputRef.current) inputRef.current.indeterminate = isIndeterminate;\n    });\n    return {\n        inputProps: {\n            ...inputProps,\n            checked: isSelected,\n            'aria-checked': isIndeterminate ? 'mixed' : isSelected\n        }\n    };\n}\n\n\nvar $ec288cd435d5d49a$exports = {};\n\n$parcel$export($ec288cd435d5d49a$exports, \"useCheckboxGroup\", () => $ec288cd435d5d49a$export$49ff6f28c54f1cbe);\nconst $61350709ee325005$export$31440636951aa68c = new WeakMap();\n\n\n\n\nfunction $ec288cd435d5d49a$export$49ff6f28c54f1cbe(props, state) {\n    let { isDisabled: isDisabled , name: name  } = props;\n    let { labelProps: labelProps , fieldProps: fieldProps  } = $g7Czo$useLabel({\n        ...props,\n        // Checkbox group is not an HTML input element so it\n        // shouldn't be labeled by a <label> element.\n        labelElementType: 'span'\n    });\n    let domProps = $g7Czo$filterDOMProps(props, {\n        labelable: true\n    });\n    // Pass name prop from group to all items by attaching to the state.\n    $61350709ee325005$export$31440636951aa68c.set(state, name);\n    return {\n        groupProps: $g7Czo$mergeProps(domProps, {\n            role: 'group',\n            'aria-disabled': isDisabled || undefined,\n            ...fieldProps\n        }),\n        labelProps: labelProps\n    };\n}\n\n\nvar $a84307d0769c22d8$exports = {};\n\n$parcel$export($a84307d0769c22d8$exports, \"useCheckboxGroupItem\", () => $a84307d0769c22d8$export$353b32fc6898d37d);\n\n\n\nfunction $a84307d0769c22d8$export$353b32fc6898d37d(props, state, inputRef) {\n    const toggleState = $g7Czo$useToggleState({\n        isReadOnly: props.isReadOnly || state.isReadOnly,\n        isSelected: state.isSelected(props.value),\n        onChange (isSelected) {\n            if (isSelected) state.addValue(props.value);\n            else state.removeValue(props.value);\n            if (props.onChange) props.onChange(isSelected);\n        }\n    });\n    let { inputProps: inputProps  } = $fea2f35efc29884c$export$e375f10ce42261c5({\n        ...props,\n        isReadOnly: props.isReadOnly || state.isReadOnly,\n        isDisabled: props.isDisabled || state.isDisabled,\n        name: props.name || $61350709ee325005$export$31440636951aa68c.get(state)\n    }, toggleState, inputRef);\n    return {\n        inputProps: inputProps\n    };\n}\n\n\n\n\nexport {$fea2f35efc29884c$export$e375f10ce42261c5 as useCheckbox, $ec288cd435d5d49a$export$49ff6f28c54f1cbe as useCheckboxGroup, $a84307d0769c22d8$export$353b32fc6898d37d as useCheckboxGroupItem};\n//# sourceMappingURL=module.js.map\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const CheckBoxOutlineBlankIcon = createSvgIcon(\n  <path 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, 'CheckBoxOutlineBlankOutlined');\n","import {createSvgIcon} from '../../../icons/create-svg-icon';\n\nexport const CheckboxFilledIcon = createSvgIcon(\n  <path d=\"M19 3H5c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.11 0 2-.9 2-2V5c0-1.1-.89-2-2-2zm-9 14-5-5 1.41-1.41L10 14.17l7.59-7.59L19 8l-9 9z\" />,\n  'CheckBox'\n);\n","import {CheckboxGroupState} from '@react-stately/checkbox';\nimport React from 'react';\n\nexport const CheckboxGroupContext = React.createContext<CheckboxGroupState>(\n  null!\n);\n","import React, {useContext, useRef} from 'react';\nimport {AriaCheckboxProps} from '@react-types/checkbox';\nimport clsx from 'clsx';\nimport {useToggleState} from '@react-stately/toggle';\nimport {useCheckbox, useCheckboxGroupItem} from '@react-aria/checkbox';\nimport {useFocusRing} from '@react-aria/focus';\nimport {VisuallyHidden} from '@react-aria/visually-hidden';\nimport {InputSize} from '../input-field/input-size';\nimport {inputFieldStyle} from '../input-field/input-field-style';\nimport {CheckBoxOutlineBlankIcon} from '../../../icons/material/CheckBoxOutlineBlank';\nimport {CheckboxFilledIcon} from './checkbox-icon';\nimport {CheckboxGroupContext} from './checkbox-group-context';\n\nexport interface CheckboxProps extends AriaCheckboxProps {\n  size?: InputSize;\n  className?: string;\n  icon?: React.ComponentType;\n  checkedIcon?: React.ComponentType;\n}\nexport function Checkbox(props: CheckboxProps) {\n  const {children, className, icon, checkedIcon, isDisabled, value} = props;\n  const style = inputFieldStyle({...props, label: children});\n  const Icon = icon || CheckBoxOutlineBlankIcon;\n  const CheckedIcon = checkedIcon || CheckboxFilledIcon;\n\n  const ref = useRef<HTMLInputElement>(null);\n  const {isFocusVisible, focusProps} = useFocusRing();\n\n  // Swap hooks depending on whether this checkbox is inside a CheckboxGroup.\n  // This is a bit unorthodox. Typically, hooks cannot be called in a conditional,\n  // but since the checkbox won't move in and out of a group, it should be safe.\n  const groupState = useContext(CheckboxGroupContext);\n  const {inputProps} = groupState\n    ? // eslint-disable-next-line react-hooks/rules-of-hooks\n      useCheckboxGroupItem(\n        {\n          ...props,\n          // Value is optional for standalone checkboxes, but required for CheckboxGroup items;\n          // it's passed explicitly here to avoid typescript error (requires strictNullChecks disabled).\n          value: value!,\n        },\n        groupState,\n        ref\n      )\n    : // eslint-disable-next-line react-hooks/rules-of-hooks\n      useCheckbox(props, useToggleState(props), ref);\n\n  const mergedClassName = clsx('flex items-center rounded', className, {\n    'outline outline-offset-2': isFocusVisible,\n  });\n\n  const disabledStyle = isDisabled && 'text-disabled';\n\n  return (\n    // eslint-disable-next-line jsx-a11y/label-has-associated-control\n    <label className={mergedClassName}>\n      <VisuallyHidden>\n        <input {...inputProps} {...focusProps} ref={ref} />\n      </VisuallyHidden>\n      {inputProps.checked ? (\n        <CheckedIcon\n          className={clsx(disabledStyle || 'text-primary', style.adornment)}\n        />\n      ) : (\n        <Icon\n          className={clsx(disabledStyle || 'text-muted', style.adornment)}\n        />\n      )}\n      {children && (\n        <div className={clsx('block capitalize ml-6', style.size.font)}>\n          {children}\n        </div>\n      )}\n    </label>\n  );\n}\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const LockIcon = createSvgIcon(\n  <path d=\"M18 8h-1V6c0-2.76-2.24-5-5-5S7 3.24 7 6v2H6c-1.1 0-2 .9-2 2v10c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2V10c0-1.1-.9-2-2-2zM9 6c0-1.66 1.34-3 3-3s3 1.34 3 3v2H9V6zm9 14H6V10h12v10zm-6-3c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2z\" />\n, 'LockOutlined');\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const LockOpenIcon = createSvgIcon(\n  <path d=\"M18 8h-1V6c0-2.76-2.24-5-5-5S7 3.24 7 6h2c0-1.66 1.34-3 3-3s3 1.34 3 3v2H6c-1.1 0-2 .9-2 2v10c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2V10c0-1.1-.9-2-2-2zm0 12H6V10h12v10zm-6-3c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2z\" />\n, 'LockOpenOutlined');\n","import React, {useEffect} from 'react';\nimport {FormattedMessage, useIntl} from 'react-intl';\nimport {Checkbox} from '../../../common/ui/inputs/checkbox/checkbox';\nimport {useStore} from '../../../state/store';\nimport {aspectToHeight, aspectToWidth} from '../clamp-resize-payload';\nimport {NumberField} from '../../../common/ui/inputs/input-field/number-field';\nimport {state} from '../../../state/utils';\nimport {LockIcon} from '../../../common/icons/material/Lock';\nimport {LockOpenIcon} from '../../../common/icons/material/LockOpen';\n\nexport function ResizeNav() {\n  const {formatMessage} = useIntl();\n  const {\n    minWidth = 50,\n    minHeight = 50,\n    maxHeight = 2400,\n    maxWidth = 2400,\n  } = useStore(s => s.config.tools?.resize) || {};\n  const originalSize = useStore(s => s.original);\n  const formVal = useStore(s => s.resize.formValue);\n\n  useEffect(() => {\n    state().resize.setFormValue({...originalSize});\n  }, [originalSize]);\n\n  useEffect(() => {\n    // setting dirty in above useEffect will prevent tool selection after resize\n    state().setDirty(true);\n  }, []);\n\n  const onWidthChange = (newWidth: number) => {\n    const newVal = {...formVal, width: newWidth};\n    if (formVal.maintainAspect) {\n      newVal.height = aspectToHeight(newWidth, formVal.usePercentages);\n    }\n    state().resize.setFormValue(newVal);\n  };\n\n  const onHeightChange = (newHeight: number) => {\n    const newVal = {...formVal, height: newHeight};\n    if (newHeight && formVal.maintainAspect) {\n      newVal.width = aspectToWidth(newHeight, formVal.usePercentages);\n    }\n    state().resize.setFormValue(newVal);\n  };\n\n  const onAspectChange = (isChecked: boolean) => {\n    const newVal = {...formVal, maintainAspect: isChecked};\n    if (isChecked) {\n      newVal.height = aspectToHeight(newVal.width, newVal.usePercentages);\n    }\n    state().resize.setFormValue(newVal);\n  };\n\n  const onSubmit = (e: React.FormEvent<HTMLFormElement>) => {\n    e.preventDefault();\n    state().applyChanges();\n  };\n\n  return (\n    <form\n      className=\"flex items-center justify-center gap-16 w-full\"\n      onSubmit={onSubmit}\n    >\n      <NumberField\n        minValue={minWidth}\n        maxValue={maxWidth}\n        size=\"sm\"\n        className=\"max-w-112\"\n        label=\"Width\"\n        value={formVal.width}\n        onChange={onWidthChange}\n        formatOptions={{\n          useGrouping: false,\n        }}\n      />\n      <div className=\"mt-24\">\n        <Checkbox\n          size=\"md\"\n          isSelected={formVal.maintainAspect}\n          onChange={onAspectChange}\n          aria-label={formatMessage({defaultMessage: 'Maintain aspect ratio'})}\n          checkedIcon={LockIcon}\n          icon={LockOpenIcon}\n        />\n      </div>\n      <NumberField\n        minValue={minHeight}\n        maxValue={maxHeight}\n        size=\"sm\"\n        className=\"max-w-112\"\n        label=\"Height\"\n        value={formVal.height}\n        onChange={onHeightChange}\n        formatOptions={{\n          useGrouping: false,\n        }}\n      />\n      <button type=\"submit\" className=\"hidden\">\n        <FormattedMessage defaultMessage=\"Resize\" />\n      </button>\n    </form>\n  );\n}\n","import clsx from 'clsx';\nimport {\n  aspectRatioFromStr,\n  calcNewSizeFromAspectRatio,\n} from '../../../../common/ui/interactions/utils/calc-new-size-from-aspect-ratio';\nimport {useStore} from '../../../../state/store';\nimport {tools} from '../../../../state/utils';\nimport {\n  ScrollableView,\n  ScrollableViewItem,\n} from '../../../../ui/navbar/scrollable-view';\nimport {ButtonBase} from '../../../../common/ui/buttons/button-base';\n\nexport function CropPresetBtns() {\n  const presets = useStore(s => s.config.tools?.crop?.presets) || [];\n  const selectedRatio = useStore(s => s.crop.selectedAspectRatio);\n  const allowCustomRatio =\n    useStore(s => s.config.tools?.crop?.allowCustomRatio) ?? true;\n\n  const btns = presets\n    .filter(preset => {\n      return preset.ratio || (!preset.ratio && allowCustomRatio);\n    })\n    .map(preset => (\n      <ScrollableViewItem key={preset.ratio || preset.name}>\n        <ButtonBase\n          onPress={() => tools().crop.resetCropzone(preset.ratio)}\n          className=\"flex flex-col items-center justify-between cursor-pointer h-56\"\n        >\n          <PresetPreview preset={preset} selectedRatio={selectedRatio} />\n          <PresetName preset={preset} selectedRatio={selectedRatio} />\n        </ButtonBase>\n      </ScrollableViewItem>\n    ));\n\n  return <ScrollableView gap=\"gap-18\">{btns}</ScrollableView>;\n}\n\ntype PresetProps = {\n  preset: {ratio: string | null; name?: string};\n  selectedRatio: string | null;\n};\n\nfunction PresetPreview({preset, selectedRatio}: PresetProps) {\n  let width = 40;\n  let height = 30;\n  if (preset.ratio) {\n    const ratio = aspectRatioFromStr(preset.ratio);\n    ({width, height} = calcNewSizeFromAspectRatio(ratio, width, height));\n  }\n  const className = clsx('border-2', {\n    'border-dotted': preset.ratio === null,\n    'border-primary': selectedRatio === preset.ratio,\n  });\n  return (\n    <div\n      style={{width: `${width}px`, height: `${height}px`}}\n      className={className}\n    />\n  );\n}\n\nfunction PresetName({preset, selectedRatio}: PresetProps) {\n  const className = clsx('mt-4 text-center text-xs', {\n    'text-primary': selectedRatio === preset.ratio,\n  });\n  return <div className={className}>{preset.name || preset.ratio}</div>;\n}\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const FlipIcon = createSvgIcon(\n  <path 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, 'FlipOutlined');\n","import React from 'react';\nimport {IconButton} from '../../../common/ui/buttons/icon-button';\nimport {state, tools} from '../../../state/utils';\nimport {FlipIcon} from '../../../common/icons/material/Flip';\n\nexport function FlipBtns() {\n  return (\n    <div>\n      <IconButton\n        size=\"sm\"\n        onPress={() => {\n          tools().transform.flip('vertical');\n          state().setDirty(true);\n        }}\n      >\n        <FlipIcon />\n      </IconButton>\n      <IconButton\n        size=\"sm\"\n        onPress={() => {\n          tools().transform.flip('horizontal');\n          state().setDirty(true);\n        }}\n      >\n        <FlipIcon className=\"rotate-90\" />\n      </IconButton>\n    </div>\n  );\n}\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const RotateLeftIcon = createSvgIcon(\n  <path d=\"M7.11 8.53 5.7 7.11C4.8 8.27 4.24 9.61 4.07 11h2.02c.14-.87.49-1.72 1.02-2.47zM6.09 13H4.07c.17 1.39.72 2.73 1.62 3.89l1.41-1.42c-.52-.75-.87-1.59-1.01-2.47zm1.01 5.32c1.16.9 2.51 1.44 3.9 1.61V17.9c-.87-.15-1.71-.49-2.46-1.03L7.1 18.32zM13 4.07V1L8.45 5.55 13 10V6.09c2.84.48 5 2.94 5 5.91s-2.16 5.43-5 5.91v2.02c3.95-.49 7-3.85 7-7.93s-3.05-7.44-7-7.93z\" />\n, 'RotateLeftOutlined');\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const RotateRightIcon = createSvgIcon(\n  <path d=\"M15.55 5.55 11 1v3.07C7.06 4.56 4 7.92 4 12s3.05 7.44 7 7.93v-2.02c-2.84-.48-5-2.94-5-5.91s2.16-5.43 5-5.91V10l4.55-4.45zM19.93 11c-.17-1.39-.72-2.73-1.62-3.89l-1.42 1.42c.54.75.88 1.6 1.02 2.47h2.02zM13 17.9v2.02c1.39-.17 2.74-.71 3.9-1.61l-1.44-1.44c-.75.54-1.59.89-2.46 1.03zm3.89-2.42 1.42 1.41c.9-1.16 1.45-2.5 1.62-3.89h-2.02c-.14.87-.48 1.72-1.02 2.48z\" />\n, 'RotateRightOutlined');\n","import React from 'react';\nimport {IconButton} from '../../../common/ui/buttons/icon-button';\nimport {state, tools} from '../../../state/utils';\nimport {RotateLeftIcon} from '../../../common/icons/material/RotateLeft';\nimport {RotateRightIcon} from '../../../common/icons/material/RotateRight';\n\nexport function RotateBtns() {\n  return (\n    <div>\n      <IconButton\n        size=\"sm\"\n        onPress={() => {\n          tools().transform.rotateLeft();\n          state().setDirty(true);\n        }}\n      >\n        <RotateLeftIcon />\n      </IconButton>\n      <IconButton\n        size=\"sm\"\n        onPress={() => {\n          tools().transform.rotateRight();\n          state().setDirty(true);\n        }}\n      >\n        <RotateRightIcon />\n      </IconButton>\n    </div>\n  );\n}\n","import React, {useRef} from 'react';\nimport {AriaSliderProps} from '@react-types/slider';\nimport {SliderStateOptions, useSliderState} from '@react-stately/slider';\nimport {useSlider} from '@react-aria/slider';\nimport {useNumberFormatter} from '@react-aria/i18n';\nimport {FlipBtns} from './flip-btns';\nimport {RotateBtns} from './rotate-btns';\nimport {state, tools} from '../../../state/utils';\n\nexport function TransformWidget() {\n  return (\n    <div className=\"flex items-center justify-center gap-16\">\n      <FlipBtns />\n      <StraightenSlider />\n      <RotateBtns />\n    </div>\n  );\n}\n\nfunction StraightenSlider() {\n  const numberFormatter = useNumberFormatter();\n  const trackRef = useRef<HTMLDivElement>(null!);\n  const svgRef = useRef<SVGSVGElement>(null!);\n  const sliderStateOptions: SliderStateOptions & AriaSliderProps = {\n    minValue: -45,\n    maxValue: 45,\n    step: 1,\n    label: 'Straighten',\n    numberFormatter,\n    defaultValue: [state().crop.straightenAngle],\n    onChange: (val: number[]) => {\n      const newValue = val[0];\n      tools().transform.straighten(newValue);\n      state().crop.setTransformAngle(newValue);\n      state().setDirty(true);\n      svgRef.current.style.transform = `translateX(${newValue}px)`;\n    },\n  };\n\n  const sliderState = useSliderState(sliderStateOptions);\n  const {groupProps, trackProps, outputProps} = useSlider(\n    sliderStateOptions,\n    sliderState,\n    trackRef\n  );\n\n  return (\n    <div\n      {...groupProps}\n      className=\"flex-auto flex-shrink-0 max-w-320 touch-none isolate\"\n    >\n      <div {...trackProps} ref={trackRef} className=\"h-36 relative\">\n        <output\n          {...outputProps}\n          className=\"absolute left-1/2 top-1/2 w-40 text-center bg -translate-x-1/2 -translate-y-1/2 z-10\"\n        >\n          {sliderState.getThumbValueLabel(0)}°\n        </output>\n        <FreeTransformTrack ref={svgRef} />\n      </div>\n    </div>\n  );\n}\n\nconst FreeTransformTrack = React.forwardRef<SVGSVGElement>((props, ref) => {\n  const numberOfDots = [...Array(80).keys()];\n  const circles = numberOfDots.map(index => {\n    return (\n      <circle\n        key={index}\n        cx={2 + index * 10}\n        cy=\"20\"\n        r={!(index % 5) ? 2 : 0.75}\n      />\n    );\n  });\n\n  return (\n    <div className=\"relative h-full cursor-pointer overflow-hidden\">\n      <svg\n        ref={ref}\n        style={{width: numberOfDots.length * 10}}\n        className=\"absolute -left-80 h-full fill-current\"\n        xmlns=\"http://www.w3.org/2000/svg\"\n        aria-hidden=\"true\"\n        focusable=\"false\"\n      >\n        {circles}\n      </svg>\n    </div>\n  );\n});\n","import React, {useEffect} from 'react';\nimport {CropPresetBtns} from './crop-preset-btns';\nimport {TransformWidget} from '../../../transform/ui/transform-widget';\nimport {state, tools} from '../../../../state/utils';\n\nexport function CropNav() {\n  useEffect(() => {\n    state().setDirty(true);\n    tools().frame.active.hide();\n    return () => {\n      tools().frame.active.show();\n    };\n  }, []);\n\n  return (\n    <div className=\"pb-16\">\n      <div className=\"mb-10\">\n        <TransformWidget />\n      </div>\n      <CropPresetBtns />\n    </div>\n  );\n}\n","import React from 'react';\nimport {createSvgIcon} from '../../common/icons/create-svg-icon';\n\nexport const CustomEllipseIcon = createSvgIcon(\n  <path d=\"M 16 6 C 12.484375 6 9.273438 7.070313 6.90625 8.84375 C 4.539063 10.617188 3 13.15625 3 16 C 3 18.84375 4.539063 21.382813 6.90625 23.15625 C 9.273438 24.929688 12.484375 26 16 26 C 19.515625 26 22.726563 24.929688 25.09375 23.15625 C 27.460938 21.382813 29 18.84375 29 16 C 29 13.15625 27.460938 10.617188 25.09375 8.84375 C 22.726563 7.070313 19.515625 6 16 6 Z M 16 8 C 19.109375 8 21.898438 8.957031 23.875 10.4375 C 25.851563 11.917969 27 13.875 27 16 C 27 18.125 25.851563 20.082031 23.875 21.5625 C 21.898438 23.042969 19.109375 24 16 24 C 12.890625 24 10.101563 23.042969 8.125 21.5625 C 6.148438 20.082031 5 18.125 5 16 C 5 13.875 6.148438 11.917969 8.125 10.4375 C 10.101563 8.957031 12.890625 8 16 8 Z \" />\n);\n","import React from 'react';\nimport {createSvgIcon} from '../../common/icons/create-svg-icon';\n\nexport const CustomCircleIcon = createSvgIcon(\n  <path d=\"M 16 4 C 9.382813 4 4 9.382813 4 16 C 4 22.617188 9.382813 28 16 28 C 22.617188 28 28 22.617188 28 16 C 28 9.382813 22.617188 4 16 4 Z M 16 6 C 21.535156 6 26 10.464844 26 16 C 26 21.535156 21.535156 26 16 26 C 10.464844 26 6 21.535156 6 16 C 6 10.464844 10.464844 6 16 6 Z \" />\n);\n","import React from 'react';\nimport {createSvgIcon} from '../../common/icons/create-svg-icon';\n\nexport const CustomSquareIcon = createSvgIcon(\n  <path d=\"M 3 6 L 3 26 L 29 26 L 29 6 Z M 5 8 L 27 8 L 27 24 L 5 24 Z \" />\n);\n","import React from 'react';\nimport {createSvgIcon} from '../../common/icons/create-svg-icon';\n\nexport const CustomTriangleIcon = createSvgIcon(\n  <path d=\"M 16 4.90625 L 15.125 6.40625 L 4.71875 24.5 L 3.875 26 L 28.125 26 L 27.28125 24.5 L 16.875 6.40625 Z M 16 8.9375 L 24.65625 24 L 7.34375 24 Z \" />\n);\n","import React, {ReactElement} from 'react';\nimport {useStore} from '../../../state/store';\nimport {BasicShape, PathOptions} from '../../../config/default-shapes';\nimport {\n  ScrollableView,\n  ScrollableViewItem,\n} from '../../../ui/navbar/scrollable-view';\nimport {IconButton} from '../../../common/ui/buttons/icon-button';\nimport {CustomEllipseIcon} from '../../../ui/icons/ellipse';\nimport {CustomCircleIcon} from '../../../ui/icons/circle';\nimport {CustomSquareIcon} from '../../../ui/icons/square';\nimport {CustomTriangleIcon} from '../../../ui/icons/triangle';\nimport {state, tools} from '../../../state/utils';\n\nexport function ShapeNav() {\n  const shapes = useStore(s => s.config.tools?.shapes?.items) || [];\n  const shapeBtns = shapes.map(shape => {\n    return (\n      <ScrollableViewItem key={shape.name}>\n        <IconButton\n          variant=\"outline\"\n          radius=\"rounded-2xl\"\n          size=\"xl\"\n          onPress={() => {\n            tools().shape.addBasicShape(shape.name);\n            state().setDirty(true);\n          }}\n        >\n          <ShapeIcon shape={shape} />\n        </IconButton>\n      </ScrollableViewItem>\n    );\n  });\n  return <ScrollableView>{shapeBtns}</ScrollableView>;\n}\n\ntype ShapeIconProps = {\n  shape: BasicShape;\n};\n\nfunction ShapeIcon({shape}: ShapeIconProps) {\n  if (shape.type === 'Path') {\n    return (\n      <svg\n        className=\"m-auto w-36 h-36\"\n        xmlns=\"http://www.w3.org/2000/svg\"\n        viewBox=\"0 -100 512 700\"\n      >\n        <path\n          className=\"fill-transparent stroke-current\"\n          d={(shape.options as PathOptions)?.path}\n          strokeWidth={25}\n        />\n      </svg>\n    );\n  }\n  return React.cloneElement(shapeIconMap[shape.name], {className: 'w-30 h-30'});\n}\n\nconst shapeIconMap: Record<string, ReactElement> = {\n  circle: <CustomCircleIcon viewBox=\"0 0 32 32\" />,\n  square: <CustomSquareIcon viewBox=\"0 0 32 32\" />,\n  triangle: <CustomTriangleIcon viewBox=\"0 0 32 32\" />,\n  ellipse: <CustomEllipseIcon viewBox=\"0 0 32 32\" />,\n};\n","import React from 'react';\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\nfunction _objectWithoutPropertiesLoose(source, excluded) {\n  if (source == null) return {};\n  var target = {};\n  var sourceKeys = Object.keys(source);\n  var key, i;\n\n  for (i = 0; i < sourceKeys.length; i++) {\n    key = sourceKeys[i];\n    if (excluded.indexOf(key) >= 0) continue;\n    target[key] = source[key];\n  }\n\n  return target;\n}\n\nvar props = ['bottom', 'height', 'left', 'right', 'top', 'width'];\n\nvar rectChanged = function rectChanged(a, b) {\n  if (a === void 0) {\n    a = {};\n  }\n\n  if (b === void 0) {\n    b = {};\n  }\n\n  return props.some(function (prop) {\n    return a[prop] !== b[prop];\n  });\n};\n\nvar observedNodes = /*#__PURE__*/new Map();\nvar rafId;\n\nvar run = function run() {\n  var changedStates = [];\n  observedNodes.forEach(function (state, node) {\n    var newRect = node.getBoundingClientRect();\n\n    if (rectChanged(newRect, state.rect)) {\n      state.rect = newRect;\n      changedStates.push(state);\n    }\n  });\n  changedStates.forEach(function (state) {\n    state.callbacks.forEach(function (cb) {\n      return cb(state.rect);\n    });\n  });\n  rafId = window.requestAnimationFrame(run);\n};\n\nfunction observeRect(node, cb) {\n  return {\n    observe: function observe() {\n      var wasEmpty = observedNodes.size === 0;\n\n      if (observedNodes.has(node)) {\n        observedNodes.get(node).callbacks.push(cb);\n      } else {\n        observedNodes.set(node, {\n          rect: undefined,\n          hasRectChanged: false,\n          callbacks: [cb]\n        });\n      }\n\n      if (wasEmpty) run();\n    },\n    unobserve: function unobserve() {\n      var state = observedNodes.get(node);\n\n      if (state) {\n        // Remove the callback\n        var index = state.callbacks.indexOf(cb);\n        if (index >= 0) state.callbacks.splice(index, 1); // Remove the node reference\n\n        if (!state.callbacks.length) observedNodes[\"delete\"](node); // Stop the loop\n\n        if (!observedNodes.size) cancelAnimationFrame(rafId);\n      }\n    }\n  };\n}\n\nvar useIsomorphicLayoutEffect = typeof window !== 'undefined' ? React.useLayoutEffect : React.useEffect;\n\nfunction useRect(nodeRef, initialRect) {\n  if (initialRect === void 0) {\n    initialRect = {\n      width: 0,\n      height: 0\n    };\n  }\n\n  var _React$useState = React.useState(nodeRef.current),\n      element = _React$useState[0],\n      setElement = _React$useState[1];\n\n  var _React$useReducer = React.useReducer(rectReducer, initialRect),\n      rect = _React$useReducer[0],\n      dispatch = _React$useReducer[1];\n\n  var initialRectSet = React.useRef(false);\n  useIsomorphicLayoutEffect(function () {\n    if (nodeRef.current !== element) {\n      setElement(nodeRef.current);\n    }\n  });\n  useIsomorphicLayoutEffect(function () {\n    if (element && !initialRectSet.current) {\n      initialRectSet.current = true;\n\n      var _rect = element.getBoundingClientRect();\n\n      dispatch({\n        rect: _rect\n      });\n    }\n  }, [element]);\n  React.useEffect(function () {\n    if (!element) {\n      return;\n    }\n\n    var observer = observeRect(element, function (rect) {\n      dispatch({\n        rect: rect\n      });\n    });\n    observer.observe();\n    return function () {\n      observer.unobserve();\n    };\n  }, [element]);\n  return rect;\n}\n\nfunction rectReducer(state, action) {\n  var rect = action.rect;\n\n  if (state.height !== rect.height || state.width !== rect.width) {\n    return rect;\n  }\n\n  return state;\n}\n\nvar defaultEstimateSize = function defaultEstimateSize() {\n  return 50;\n};\n\nvar defaultKeyExtractor = function defaultKeyExtractor(index) {\n  return index;\n};\n\nvar defaultMeasureSize = function defaultMeasureSize(el, horizontal) {\n  var key = horizontal ? 'offsetWidth' : 'offsetHeight';\n  return el[key];\n};\n\nvar defaultRangeExtractor = function defaultRangeExtractor(range) {\n  var start = Math.max(range.start - range.overscan, 0);\n  var end = Math.min(range.end + range.overscan, range.size - 1);\n  var arr = [];\n\n  for (var i = start; i <= end; i++) {\n    arr.push(i);\n  }\n\n  return arr;\n};\nfunction useVirtual(_ref) {\n  var _measurements;\n\n  var _ref$size = _ref.size,\n      size = _ref$size === void 0 ? 0 : _ref$size,\n      _ref$estimateSize = _ref.estimateSize,\n      estimateSize = _ref$estimateSize === void 0 ? defaultEstimateSize : _ref$estimateSize,\n      _ref$overscan = _ref.overscan,\n      overscan = _ref$overscan === void 0 ? 1 : _ref$overscan,\n      _ref$paddingStart = _ref.paddingStart,\n      paddingStart = _ref$paddingStart === void 0 ? 0 : _ref$paddingStart,\n      _ref$paddingEnd = _ref.paddingEnd,\n      paddingEnd = _ref$paddingEnd === void 0 ? 0 : _ref$paddingEnd,\n      parentRef = _ref.parentRef,\n      horizontal = _ref.horizontal,\n      scrollToFn = _ref.scrollToFn,\n      useObserver = _ref.useObserver,\n      initialRect = _ref.initialRect,\n      onScrollElement = _ref.onScrollElement,\n      scrollOffsetFn = _ref.scrollOffsetFn,\n      _ref$keyExtractor = _ref.keyExtractor,\n      keyExtractor = _ref$keyExtractor === void 0 ? defaultKeyExtractor : _ref$keyExtractor,\n      _ref$measureSize = _ref.measureSize,\n      measureSize = _ref$measureSize === void 0 ? defaultMeasureSize : _ref$measureSize,\n      _ref$rangeExtractor = _ref.rangeExtractor,\n      rangeExtractor = _ref$rangeExtractor === void 0 ? defaultRangeExtractor : _ref$rangeExtractor;\n  var sizeKey = horizontal ? 'width' : 'height';\n  var scrollKey = horizontal ? 'scrollLeft' : 'scrollTop';\n  var latestRef = React.useRef({\n    scrollOffset: 0,\n    measurements: []\n  });\n\n  var _React$useState = React.useState(0),\n      scrollOffset = _React$useState[0],\n      setScrollOffset = _React$useState[1];\n\n  latestRef.current.scrollOffset = scrollOffset;\n  var useMeasureParent = useObserver || useRect;\n\n  var _useMeasureParent = useMeasureParent(parentRef, initialRect),\n      outerSize = _useMeasureParent[sizeKey];\n\n  latestRef.current.outerSize = outerSize;\n  var defaultScrollToFn = React.useCallback(function (offset) {\n    if (parentRef.current) {\n      parentRef.current[scrollKey] = offset;\n    }\n  }, [parentRef, scrollKey]);\n  var resolvedScrollToFn = scrollToFn || defaultScrollToFn;\n  scrollToFn = React.useCallback(function (offset) {\n    resolvedScrollToFn(offset, defaultScrollToFn);\n  }, [defaultScrollToFn, resolvedScrollToFn]);\n\n  var _React$useState2 = React.useState({}),\n      measuredCache = _React$useState2[0],\n      setMeasuredCache = _React$useState2[1];\n\n  var measure = React.useCallback(function () {\n    return setMeasuredCache({});\n  }, []);\n  var pendingMeasuredCacheIndexesRef = React.useRef([]);\n  var measurements = React.useMemo(function () {\n    var min = pendingMeasuredCacheIndexesRef.current.length > 0 ? Math.min.apply(Math, pendingMeasuredCacheIndexesRef.current) : 0;\n    pendingMeasuredCacheIndexesRef.current = [];\n    var measurements = latestRef.current.measurements.slice(0, min);\n\n    for (var i = min; i < size; i++) {\n      var key = keyExtractor(i);\n      var measuredSize = measuredCache[key];\n\n      var _start = measurements[i - 1] ? measurements[i - 1].end : paddingStart;\n\n      var _size = typeof measuredSize === 'number' ? measuredSize : estimateSize(i);\n\n      var _end = _start + _size;\n\n      measurements[i] = {\n        index: i,\n        start: _start,\n        size: _size,\n        end: _end,\n        key: key\n      };\n    }\n\n    return measurements;\n  }, [estimateSize, measuredCache, paddingStart, size, keyExtractor]);\n  var totalSize = (((_measurements = measurements[size - 1]) == null ? void 0 : _measurements.end) || paddingStart) + paddingEnd;\n  latestRef.current.measurements = measurements;\n  latestRef.current.totalSize = totalSize;\n  var element = onScrollElement ? onScrollElement.current : parentRef.current;\n  var scrollOffsetFnRef = React.useRef(scrollOffsetFn);\n  scrollOffsetFnRef.current = scrollOffsetFn;\n  useIsomorphicLayoutEffect(function () {\n    if (!element) {\n      setScrollOffset(0);\n      return;\n    }\n\n    var onScroll = function onScroll(event) {\n      var offset = scrollOffsetFnRef.current ? scrollOffsetFnRef.current(event) : element[scrollKey];\n      setScrollOffset(offset);\n    };\n\n    onScroll();\n    element.addEventListener('scroll', onScroll, {\n      capture: false,\n      passive: true\n    });\n    return function () {\n      element.removeEventListener('scroll', onScroll);\n    };\n  }, [element, scrollKey]);\n\n  var _calculateRange = calculateRange(latestRef.current),\n      start = _calculateRange.start,\n      end = _calculateRange.end;\n\n  var indexes = React.useMemo(function () {\n    return rangeExtractor({\n      start: start,\n      end: end,\n      overscan: overscan,\n      size: measurements.length\n    });\n  }, [start, end, overscan, measurements.length, rangeExtractor]);\n  var measureSizeRef = React.useRef(measureSize);\n  measureSizeRef.current = measureSize;\n  var virtualItems = React.useMemo(function () {\n    var virtualItems = [];\n\n    var _loop = function _loop(k, len) {\n      var i = indexes[k];\n      var measurement = measurements[i];\n\n      var item = _extends(_extends({}, measurement), {}, {\n        measureRef: function measureRef(el) {\n          if (el) {\n            var measuredSize = measureSizeRef.current(el, horizontal);\n\n            if (measuredSize !== item.size) {\n              var _scrollOffset = latestRef.current.scrollOffset;\n\n              if (item.start < _scrollOffset) {\n                defaultScrollToFn(_scrollOffset + (measuredSize - item.size));\n              }\n\n              pendingMeasuredCacheIndexesRef.current.push(i);\n              setMeasuredCache(function (old) {\n                var _extends2;\n\n                return _extends(_extends({}, old), {}, (_extends2 = {}, _extends2[item.key] = measuredSize, _extends2));\n              });\n            }\n          }\n        }\n      });\n\n      virtualItems.push(item);\n    };\n\n    for (var k = 0, len = indexes.length; k < len; k++) {\n      _loop(k);\n    }\n\n    return virtualItems;\n  }, [indexes, defaultScrollToFn, horizontal, measurements]);\n  var mountedRef = React.useRef(false);\n  useIsomorphicLayoutEffect(function () {\n    if (mountedRef.current) {\n      setMeasuredCache({});\n    }\n\n    mountedRef.current = true;\n  }, [estimateSize]);\n  var scrollToOffset = React.useCallback(function (toOffset, _temp) {\n    var _ref2 = _temp === void 0 ? {} : _temp,\n        _ref2$align = _ref2.align,\n        align = _ref2$align === void 0 ? 'start' : _ref2$align;\n\n    var _latestRef$current = latestRef.current,\n        scrollOffset = _latestRef$current.scrollOffset,\n        outerSize = _latestRef$current.outerSize;\n\n    if (align === 'auto') {\n      if (toOffset <= scrollOffset) {\n        align = 'start';\n      } else if (toOffset >= scrollOffset + outerSize) {\n        align = 'end';\n      } else {\n        align = 'start';\n      }\n    }\n\n    if (align === 'start') {\n      scrollToFn(toOffset);\n    } else if (align === 'end') {\n      scrollToFn(toOffset - outerSize);\n    } else if (align === 'center') {\n      scrollToFn(toOffset - outerSize / 2);\n    }\n  }, [scrollToFn]);\n  var tryScrollToIndex = React.useCallback(function (index, _temp2) {\n    var _ref3 = _temp2 === void 0 ? {} : _temp2,\n        _ref3$align = _ref3.align,\n        align = _ref3$align === void 0 ? 'auto' : _ref3$align,\n        rest = _objectWithoutPropertiesLoose(_ref3, [\"align\"]);\n\n    var _latestRef$current2 = latestRef.current,\n        measurements = _latestRef$current2.measurements,\n        scrollOffset = _latestRef$current2.scrollOffset,\n        outerSize = _latestRef$current2.outerSize;\n    var measurement = measurements[Math.max(0, Math.min(index, size - 1))];\n\n    if (!measurement) {\n      return;\n    }\n\n    if (align === 'auto') {\n      if (measurement.end >= scrollOffset + outerSize) {\n        align = 'end';\n      } else if (measurement.start <= scrollOffset) {\n        align = 'start';\n      } else {\n        return;\n      }\n    }\n\n    var toOffset = align === 'center' ? measurement.start + measurement.size / 2 : align === 'end' ? measurement.end : measurement.start;\n    scrollToOffset(toOffset, _extends({\n      align: align\n    }, rest));\n  }, [scrollToOffset, size]);\n  var scrollToIndex = React.useCallback(function () {\n    for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n      args[_key] = arguments[_key];\n    }\n\n    // We do a double request here because of\n    // dynamic sizes which can cause offset shift\n    // and end up in the wrong spot. Unfortunately,\n    // we can't know about those dynamic sizes until\n    // we try and render them. So double down!\n    tryScrollToIndex.apply(void 0, args);\n    requestAnimationFrame(function () {\n      tryScrollToIndex.apply(void 0, args);\n    });\n  }, [tryScrollToIndex]);\n  return {\n    virtualItems: virtualItems,\n    totalSize: totalSize,\n    scrollToOffset: scrollToOffset,\n    scrollToIndex: scrollToIndex,\n    measure: measure\n  };\n}\n\nvar findNearestBinarySearch = function findNearestBinarySearch(low, high, getCurrentValue, value) {\n  while (low <= high) {\n    var middle = (low + high) / 2 | 0;\n    var currentValue = getCurrentValue(middle);\n\n    if (currentValue < value) {\n      low = middle + 1;\n    } else if (currentValue > value) {\n      high = middle - 1;\n    } else {\n      return middle;\n    }\n  }\n\n  if (low > 0) {\n    return low - 1;\n  } else {\n    return 0;\n  }\n};\n\nfunction calculateRange(_ref4) {\n  var measurements = _ref4.measurements,\n      outerSize = _ref4.outerSize,\n      scrollOffset = _ref4.scrollOffset;\n  var size = measurements.length - 1;\n\n  var getOffset = function getOffset(index) {\n    return measurements[index].start;\n  };\n\n  var start = findNearestBinarySearch(0, size, getOffset, scrollOffset);\n  var end = start;\n\n  while (end < size && measurements[end].end < scrollOffset + outerSize) {\n    end++;\n  }\n\n  return {\n    start: start,\n    end: end\n  };\n}\n\nexport { defaultRangeExtractor, useVirtual };\n//# sourceMappingURL=react-virtual.mjs.map\n","import React, {useCallback, useEffect, useRef} from 'react';\nimport {useVirtual} from 'react-virtual';\nimport clsx from 'clsx';\nimport {StickerCategory} from '../../../../config/default-stickers';\nimport {stickerUrl} from '../../shape-tool';\nimport {Button} from '../../../../common/ui/buttons/button';\nimport {state, tools} from '../../../../state/utils';\nimport {useActiveTheme} from '../../../../utils/init-themes';\n\ntype Props = {\n  category: StickerCategory;\n};\n\nexport function StickerList({category}: Props) {\n  const activeTheme = useActiveTheme();\n  const name = category.name;\n  const iterable = category.list\n    ? category.list\n    : Array.from(Array(category.items).keys());\n\n  const parentRef = useRef<HTMLDivElement>(null);\n\n  const virtualizer = useVirtual({\n    horizontal: true,\n    size: iterable.length,\n    parentRef,\n    estimateSize: useCallback(() => 52, []),\n    overscan: 5,\n  });\n\n  useEffect(() => {\n    virtualizer.scrollToIndex(0);\n    // don't add virtualizer to deps, otherwise there will be infinite rerender\n    // eslint-disable-next-line\n  }, [name]);\n\n  return (\n    <>\n      <div\n        ref={parentRef}\n        className=\"tiny-scrollbar overflow-x-auto overflow-y-hidden\"\n        style={{height: `52px`}}\n      >\n        <div\n          className=\"h-full relative mx-auto\"\n          style={{width: `${virtualizer.totalSize}px`}}\n        >\n          {virtualizer.virtualItems.map(virtualColumn => {\n            const stickerName = `${iterable[virtualColumn.index]}`;\n            return (\n              <div\n                key={virtualColumn.index}\n                className=\"absolute top-0 left-0 h-full\"\n                style={{\n                  width: `${virtualColumn.size}px`,\n                  transform: `translateX(${virtualColumn.start}px)`,\n                }}\n              >\n                <Button\n                  variant=\"outline\"\n                  radius=\"rounded-xl\"\n                  size=\"md\"\n                  equalWidth\n                  onPress={async () => {\n                    await tools().shape.addSticker(category.name, stickerName);\n                    state().setDirty(true);\n                  }}\n                >\n                  <img\n                    className={clsx(\n                      'm-auto m-auto w-28 h-28',\n                      category.invertPreview && activeTheme?.isDark && 'invert'\n                    )}\n                    src={stickerUrl(category, stickerName)}\n                    alt={stickerName}\n                  />\n                </Button>\n              </div>\n            );\n          })}\n        </div>\n      </div>\n    </>\n  );\n}\n","import {useState} from 'react';\nimport {FormattedMessage} from 'react-intl';\nimport {useStore} from '../../../../state/store';\nimport {\n  StickerCategory,\n  StickerCategoryMessages,\n} from '../../../../config/default-stickers';\nimport {ButtonGroup} from '../../../../common/ui/buttons/button-group';\nimport {Button} from '../../../../common/ui/buttons/button';\nimport {StickerList} from './sticker-list';\n\nexport function StickerNav() {\n  const categories = useStore(s => s.config.tools?.stickers?.items) || [];\n  const [selectedCategory, setSelectedCategory] =\n    useState<StickerCategory | null>(categories[0]);\n\n  const categoryBtns = categories.map(category => {\n    const isSelected = selectedCategory === category;\n    const msg = StickerCategoryMessages[category.name];\n    return (\n      <Button\n        key={category.name}\n        size=\"xs\"\n        color={isSelected ? 'primary' : null}\n        value={category}\n      >\n        <span className=\"capitalize\">\n          {msg ? <FormattedMessage {...msg} /> : category.name}\n        </span>\n      </Button>\n    );\n  });\n\n  return (\n    <div className=\"h-92\">\n      <ButtonGroup\n        value={selectedCategory}\n        onChange={newCategory => setSelectedCategory(newCategory)}\n        className=\"mb-10 w-full justify-center\"\n        variant=\"outline\"\n        radius=\"rounded-full\"\n      >\n        {categoryBtns}\n      </ButtonGroup>\n      {selectedCategory && <StickerList category={selectedCategory} />}\n    </div>\n  );\n}\n","import {useEffect} from 'react';\nimport {\n  ScrollableView,\n  ScrollableViewItem,\n} from '../../../ui/navbar/scrollable-view';\nimport {useStore} from '../../../state/store';\nimport {state, tools} from '../../../state/utils';\nimport {assetUrl} from '../../../utils/asset-url';\nimport {CancelIcon} from '../../../common/icons/material/Cancel';\n\nexport function FrameNav() {\n  const frames = useStore(s => s.config.tools?.frame?.items) || [];\n  const activeFrame = useStore(s => s.frame.active);\n\n  // open options' panel if not open already\n  useEffect(() => {\n    if (state().frame.active) {\n      state().frame.showOptionsPanel();\n    }\n  }, []);\n\n  const frameItems = frames.map(frame => {\n    const src = assetUrl(`images/frames/${frame.name}/thumbnail.png`);\n    const isActive = activeFrame?.name === frame.name;\n    const activeClass = isActive ? 'border-primary' : '';\n    return (\n      <ScrollableViewItem key={frame.name}>\n        <button\n          type=\"button\"\n          className={`border-2 overflow-hidden relative rounded border cursor-pointer ${activeClass}`}\n          onClick={() => {\n            state().setDirty(true);\n            if (isActive) {\n              tools().frame.remove();\n            } else {\n              tools().frame.add(frame.name);\n            }\n          }}\n        >\n          {isActive && <ActiveOverlay />}\n          <img\n            draggable=\"false\"\n            className=\"w-64 h-64\"\n            src={src}\n            alt={frame.name}\n          />\n        </button>\n      </ScrollableViewItem>\n    );\n  });\n  return <ScrollableView>{frameItems}</ScrollableView>;\n}\n\nfunction ActiveOverlay() {\n  return (\n    <span className=\"bg-background/70 absolute inset-0 text-primary\">\n      <CancelIcon className=\"svg-icon icon-md absolute inset-0 block m-auto\" />\n    </span>\n  );\n}\n","import {useEffect} from 'react';\nimport clsx from 'clsx';\nimport {\n  ScrollableView,\n  ScrollableViewItem,\n} from '../../../ui/navbar/scrollable-view';\nimport {useStore} from '../../../state/store';\nimport {loadFonts} from '../../../common/ui/font-picker/load-fonts';\nimport {FontFaceConfig} from '../../../common/ui/font-picker/font-face-config';\nimport {state, tools} from '../../../state/utils';\n\nexport function TextNav() {\n  const fonts = useStore(s => s.config.tools?.text?.items);\n\n  // load fonts into dom\n  useEffect(() => {\n    if (fonts) {\n      loadFonts(fonts);\n    }\n  }, [fonts]);\n\n  // add text to canvas on text nav open\n  useEffect(() => {\n    if (!state().objects.active.isText) {\n      tools().text.add();\n      state().setDirty(true);\n    }\n  }, []);\n\n  const fontButtons = (fonts || []).map(fontConfig => {\n    return (\n      <ScrollableViewItem key={fontConfig.family}>\n        <FontButton fontConfig={fontConfig} />\n      </ScrollableViewItem>\n    );\n  });\n\n  return <ScrollableView className=\"pt-6\">{fontButtons}</ScrollableView>;\n}\n\ntype FontButtonProps = {\n  fontConfig: FontFaceConfig;\n};\n\nfunction FontButton({fontConfig}: FontButtonProps) {\n  const selectedFont = useStore(s => s.objects.active.editableProps.fontFamily);\n\n  const className = clsx(\n    'block px-6 w-110 h-68 text-sm bg border rounded-2xl',\n    {\n      'border-primary': selectedFont === fontConfig.family,\n      'text-primary': selectedFont === fontConfig.family,\n    }\n  );\n\n  return (\n    <button\n      type=\"button\"\n      className={className}\n      style={{\n        fontFamily: fontConfig.family,\n        fontWeight: fontConfig.descriptors?.weight || 'normal',\n      }}\n      onClick={async () => {\n        state().setDirty(true);\n        tools().objects.setValues({\n          fontFamily: fontConfig.family,\n        });\n      }}\n    >\n      {fontConfig.family}\n    </button>\n  );\n}\n","import React, {useEffect, useState} from 'react';\nimport {Item} from '@react-stately/collections';\nimport {FormattedMessage} from 'react-intl';\nimport {ColorPickerButton} from '../../../ui/color-picker-button';\nimport {useStore} from '../../../state/store';\nimport {useActiveTheme} from '../../../utils/init-themes';\nimport {tools} from '../../../state/utils';\nimport {assetUrl} from '../../../utils/asset-url';\nimport {\n  ScrollableView,\n  ScrollableViewItem,\n} from '../../../ui/navbar/scrollable-view';\nimport {Picker} from '../../../common/ui/inputs/select/picker';\n\nexport function DrawNav() {\n  useEffect(() => {\n    tools().draw.enable();\n    return () => {\n      tools().draw.disable();\n    };\n  }, []);\n\n  return (\n    <ScrollableView gap=\"gap-16\" className=\"justify-center\">\n      <ScrollableViewItem>\n        <ColorPickerButton\n          size=\"sm\"\n          label={<FormattedMessage defaultMessage=\"Brush Color\" />}\n          value={tools().draw.currentBrush.color}\n          onChange={newColor => {\n            tools().draw.setBrushColor(newColor);\n          }}\n        />\n      </ScrollableViewItem>\n      <ScrollableViewItem>\n        <TypeSelect />\n      </ScrollableViewItem>\n      <ScrollableViewItem>\n        <SizeSelect />\n      </ScrollableViewItem>\n    </ScrollableView>\n  );\n}\n\nfunction SizeSelect() {\n  const sizes = useStore(s => s.config.tools?.draw?.brushSizes) || [];\n  const [selectedSize, setSelectedSize] = useState(\n    tools().draw.currentBrush.width\n  );\n\n  const items = sizes.map(size => {\n    return {key: size, value: size};\n  });\n  return (\n    <Picker\n      items={items}\n      value={selectedSize}\n      onChange={(newValue: number) => {\n        setSelectedSize(newValue);\n        tools().draw.setBrushSize(newValue);\n      }}\n      size=\"sm\"\n      label=\"Brush Size\"\n    >\n      {item => (\n        <Item textValue={`${item.key}`}>\n          <div className=\"flex items-center\">\n            <div\n              className=\"flex-shrink-0 mr-8 border-[3px] rounded-full\"\n              style={{width: `${item.key}px`, height: `${item.key}px`}}\n            />\n            {item.key}\n          </div>\n        </Item>\n      )}\n    </Picker>\n  );\n}\n\nfunction TypeSelect() {\n  const types = useStore(s => s.config.tools?.draw?.brushTypes) || [];\n  const activeTheme = useActiveTheme();\n  const [selectedType, setSelectedType] = useState(\n    tools().draw.currentBrush.type\n  );\n\n  return (\n    <Picker\n      value={selectedType}\n      onChange={(value: string) => {\n        setSelectedType(value);\n        tools().draw.setBrushType(value);\n      }}\n      size=\"sm\"\n      label=\"Brush Type\"\n    >\n      {types.map(type => (\n        <Item key={type} textValue={type}>\n          <div className=\"flex items-center\">\n            <img\n              className=\"flex-shrink-0 mr-8 w-24 h-24\"\n              src={getBrushPreview(type, activeTheme?.isDark)}\n              alt=\"\"\n            />\n            {type}\n          </div>\n        </Item>\n      ))}\n    </Picker>\n  );\n}\n\nfunction getBrushPreview(type: string, isDarkMode = false): string {\n  const name = type.replace('Brush', '').toLowerCase();\n  const dir = isDarkMode ? 'white' : 'black';\n  return assetUrl(`images/brushes/${dir}/${name}.png`);\n}\n","import {useEffect} from 'react';\nimport {useIntl} from 'react-intl';\nimport {useStore} from '../../../state/store';\nimport {Slider} from '../../../common/ui/inputs/slider/slider';\nimport {state, tools} from '../../../state/utils';\n\nexport function CornersNav() {\n  const intl = useIntl();\n  const radius = useStore(s => s.corners.radius);\n\n  useEffect(() => {\n    state().setDirty(true);\n    tools().corners.showPreview();\n    return () => tools().corners.hidePreview();\n  }, []);\n\n  return (\n    <div className=\"max-w-320 mx-auto\">\n      <Slider\n        minValue={1}\n        maxValue={300}\n        label={intl.formatMessage({defaultMessage: 'Radius'})}\n        getValueLabel={value => {\n          return `${value}px`;\n        }}\n        onChange={val => {\n          tools().corners.updatePreview(val);\n          state().corners.setRadius(val);\n        }}\n        value={radius}\n      />\n    </div>\n  );\n}\n","import {HTMLMotionProps} from 'framer-motion';\n\nexport const navbarAnimation: HTMLMotionProps<'div'> = {\n  initial: {y: '130%', opacity: 0},\n  animate: {y: 0, opacity: 1},\n  exit: {\n    y: '130%',\n    opacity: 0,\n    left: '16px',\n    position: 'absolute',\n    overflowY: 'hidden',\n  },\n  transition: {type: 'tween', duration: 0.15},\n};\n","import React from 'react';\nimport {m} from 'framer-motion';\nimport {ToolName} from '../../tools/tool-name';\nimport {FilterNav} from '../../tools/filter/ui/filter-nav';\nimport {ResizeNav} from '../../tools/resize/ui/resize-nav';\nimport {CropNav} from '../../tools/crop/ui/crop-nav/crop-nav';\nimport {ShapeNav} from '../../tools/shapes/ui/shape-nav';\nimport {StickerNav} from '../../tools/shapes/ui/sticker-nav/sticker-nav';\nimport {FrameNav} from '../../tools/frame/ui/frame-nav';\nimport {TextNav} from '../../tools/text/ui/text-nav';\nimport {DrawNav} from '../../tools/draw/ui/draw-nav';\nimport {CornersNav} from '../../tools/corners/ui/corners-nav';\nimport {navbarAnimation} from './navbar-animation';\n\ntype Props = {\n  activeTool: ToolName | null;\n};\n\nexport function ToolControls({activeTool}: Props) {\n  const toolNav = getToolNav(activeTool);\n\n  return (\n    <m.div\n      className=\"relative h-full w-full text-sm bg select-none overflow-hidden\"\n      {...navbarAnimation}\n    >\n      {toolNav}\n    </m.div>\n  );\n}\n\nfunction getToolNav(activeTool: ToolName | null) {\n  switch (activeTool) {\n    case ToolName.FILTER:\n      return <FilterNav />;\n    case ToolName.RESIZE:\n      return <ResizeNav />;\n    case ToolName.CROP:\n      return <CropNav />;\n    case ToolName.DRAW:\n      return <DrawNav />;\n    case ToolName.TEXT:\n      return <TextNav />;\n    case ToolName.SHAPES:\n      return <ShapeNav />;\n    case ToolName.STICKERS:\n      return <StickerNav />;\n    case ToolName.FRAME:\n      return <FrameNav />;\n    case ToolName.CORNERS:\n      return <CornersNav />;\n    default:\n      return null;\n  }\n}\n","import {AnimatePresence, m} from 'framer-motion';\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\nimport {useStore} from '../../state/store';\nimport {NavItem} from '../../config/default-config';\nimport {setActiveTool} from './set-active-tool';\nimport {ToolControls} from './tool-controls';\nimport {ButtonBase} from '../../common/ui/buttons/button-base';\nimport {navbarAnimation} from './navbar-animation';\nimport {navItemMessages} from '../../config/default-nav-items';\nimport {state} from '../../state/utils';\nimport {ScrollableView, ScrollableViewItem} from './scrollable-view';\nimport {MixedIcon} from '../mixed-icon';\n\nexport function Navbar() {\n  const activeTool = useStore(s => s.activeTool);\n  return (\n    <nav className=\"z-navbar min-h-86 flex-shrink-0 px-16 relative overflow-hidden\">\n      <AnimatePresence initial={false}>\n        {activeTool ? (\n          <ToolControls activeTool={activeTool} key=\"tool-controls\" />\n        ) : (\n          <NavItems key=\"nav-items\" />\n        )}\n      </AnimatePresence>\n    </nav>\n  );\n}\n\nfunction NavItems() {\n  const navItems = useStore(s => s.config.ui?.nav?.items) || [];\n  return (\n    <m.div className=\"w-full h-full\" {...navbarAnimation}>\n      <ScrollableView>\n        {navItems.map(item => (\n          <ScrollableViewItem key={item.name}>\n            <ToolButton item={item} />\n          </ScrollableViewItem>\n        ))}\n      </ScrollableView>\n    </m.div>\n  );\n}\n\ntype ToolButtonProps = {\n  item: NavItem;\n};\n\nfunction ToolButton({item}: ToolButtonProps) {\n  const clickHandler = () => {\n    if (typeof item.action === 'string') {\n      setActiveTool(item.action);\n    } else if (typeof item.action === 'function') {\n      item.action(state().editor);\n    }\n  };\n  const msg = navItemMessages[item.name];\n  return (\n    <ButtonBase\n      variant=\"outline\"\n      color=\"paper\"\n      className=\"flex-col flex-shrink-0 w-68 h-68\"\n      radius=\"rounded-2xl\"\n      onPress={clickHandler}\n    >\n      <div className=\"mb-1\">\n        <MixedIcon className=\"icon-md\" icon={item.icon} />\n      </div>\n      <div className=\"mt-6 text-xs capitalize\">\n        {msg ? <FormattedMessage {...msg} /> : item.name}\n      </div>\n    </ButtonBase>\n  );\n}\n","import {FormattedMessage} from 'react-intl';\nimport React from 'react';\nimport {m} from 'framer-motion';\nimport clsx from 'clsx';\nimport {useStore} from '../../../state/store';\nimport {Button} from '../../../common/ui/buttons/button';\nimport {HISTORY_DISPLAY_NAMES} from '../history-display-names';\nimport {popoverStyle} from '../../../common/ui/overlays/popover/popover-style';\nimport {IconButton} from '../../../common/ui/buttons/icon-button';\nimport {PopoverAnimation} from '../../../common/ui/overlays/popover/popover-animation';\nimport {state, tools} from '../../../state/utils';\nimport {CloseIcon} from '../../../common/icons/material/Close';\n\nexport function HistoryPanel() {\n  const items = useStore(s => s.history.items);\n  const pointer = useStore(s => s.history.pointer);\n\n  return (\n    <m.div\n      {...PopoverAnimation}\n      className={`absolute bottom-20 right-20 w-224 max-w-[calc(100%-40px)] max-h-[calc(100%-40px)] ${popoverStyle}`}\n    >\n      <div className=\"p-8 mb-4 bg-alt dark:bg-paper font-medium text-sm border-b flex items-center\">\n        <FormattedMessage defaultMessage=\"History\" />\n        <IconButton\n          className=\"ml-auto flex-shrink-0\"\n          onPress={() => {\n            state().togglePanel('history', false);\n          }}\n        >\n          <CloseIcon />\n        </IconButton>\n      </div>\n      <div className=\"p-8\">\n        {items.map(item => {\n          const isActive = item.id === items[pointer].id;\n          const displayName = HISTORY_DISPLAY_NAMES[item.name];\n          const startIcon =\n            displayName.icon &&\n            React.createElement(displayName.icon, {className: 'icon-sm'});\n          return (\n            <Button\n              onPress={() => {\n                if (isActive) return;\n                tools().history.load(item);\n              }}\n              variant=\"outline\"\n              color={isActive ? 'primary' : null}\n              size=\"sm\"\n              className={clsx('w-full mb-8', isActive && 'pointer-events-none')}\n              justify=\"justify-start\"\n              key={item.id}\n              startIcon={startIcon}\n            >\n              <FormattedMessage {...displayName.name} />\n            </Button>\n          );\n        })}\n      </div>\n    </m.div>\n  );\n}\n","import {ReactNode} from 'react';\n\ntype Props = {\n  children: ReactNode;\n  className?: string;\n};\nexport function DialogBody({children, className}: Props) {\n  return <div className={className}>{children}</div>;\n}\n","import {FormattedMessage} from 'react-intl';\nimport React, {useState} from 'react';\nimport {Button} from '../common/ui/buttons/button';\nimport {useStore} from '../state/store';\nimport {Dialog} from '../common/ui/overlays/dialog/dialog';\nimport {DialogHeader} from '../common/ui/overlays/dialog/dialog-header';\nimport {DialogBody} from '../common/ui/overlays/dialog/dialog-body';\nimport {DialogTrigger} from '../common/ui/overlays/dialog-trigger/dialog-trigger';\nimport {ColorPickerButton} from './color-picker-button';\nimport {NumberField} from '../common/ui/inputs/input-field/number-field';\nimport {state, tools} from '../state/utils';\nimport {fetchStateJsonFromUrl} from '../tools/import/fetch-state-json-from-url';\nimport {assetUrl} from '../utils/asset-url';\n\ntype ActivePanel = 'default' | 'newCanvas';\n\nexport function NewImageDialogTrigger() {\n  const isOpen = useStore(s => s.openPanels.newImage);\n  return (\n    <DialogTrigger\n      isOpen={isOpen}\n      disableInitialTransition\n      type=\"modal\"\n      isDismissable={false}\n    >\n      <NewImageDialog />\n    </DialogTrigger>\n  );\n}\n\nfunction NewImageDialog() {\n  const [activePanel, setActivePanel] = useState<ActivePanel>('default');\n\n  return (\n    <Dialog className=\"p-20 text-center max-w-max\">\n      <DialogHeader className=\"pb-20\">\n        <FormattedMessage defaultMessage=\"Open a photo or design to get started\" />\n      </DialogHeader>\n      <DialogBody>\n        {activePanel === 'default' ? (\n          <DefaultPanel setActivePanel={setActivePanel} />\n        ) : (\n          <NewCanvasPanel setActivePanel={setActivePanel} />\n        )}\n      </DialogBody>\n    </Dialog>\n  );\n}\n\ntype PanelProps = {\n  setActivePanel: (panel: ActivePanel) => void;\n};\n\nfunction DefaultPanel({setActivePanel}: PanelProps) {\n  return (\n    <>\n      <Button\n        className=\"mr-20\"\n        size=\"sm\"\n        variant=\"raised\"\n        color=\"primary\"\n        onPress={() => {\n          tools().import.uploadAndReplaceMainImage();\n        }}\n      >\n        <FormattedMessage defaultMessage=\"Open Photo\" />\n      </Button>\n      <Button\n        variant=\"outline\"\n        size=\"sm\"\n        color=\"primary\"\n        onPress={() => {\n          setActivePanel('newCanvas');\n        }}\n      >\n        <FormattedMessage defaultMessage=\"Create New\" />\n      </Button>\n      <SampleImagesPanel />\n    </>\n  );\n}\n\nfunction SampleImagesPanel() {\n  const sampleImages = useStore(\n    s => s.config.ui?.openImageDialog?.sampleImages\n  );\n  if (!sampleImages?.length) return null;\n  return (\n    <>\n      <div className=\"relative py-20\">\n        <hr className=\"absolute h-1 border-none bg-divider w-full top inset-0 m-auto\" />\n        <span className=\"text-sm bg-paper px-6 relative\">\n          <FormattedMessage defaultMessage=\"or use sample\" />\n        </span>\n      </div>\n      <ul className=\"flex items-center gap-16\">\n        {sampleImages.map(img => (\n          <li className=\"shrink-0\" key={img.url || img.thumbnail}>\n            <button\n              type=\"button\"\n              onClick={async () => {\n                if (typeof img.action === 'function') {\n                  img.action();\n                } else if (img.url.endsWith('.json')) {\n                  await fetchStateJsonFromUrl(assetUrl(img.url));\n                  state().togglePanel('newImage', false);\n                } else {\n                  await tools().import.openBackgroundImage(assetUrl(img.url));\n                  state().togglePanel('newImage', false);\n                }\n              }}\n            >\n              <img\n                className=\"w-80 h-80 rounded overflow-hidden transition-shadow hover:shadow-md\"\n                src={assetUrl(img.thumbnail)}\n                alt=\"\"\n              />\n            </button>\n          </li>\n        ))}\n      </ul>\n    </>\n  );\n}\n\nfunction NewCanvasPanel({setActivePanel}: PanelProps) {\n  const [formVal, setFormVal] = useState<{\n    width: number;\n    height: number;\n    bgColor: string;\n  }>({\n    width: 800,\n    height: 600,\n    bgColor: 'transparent',\n  });\n\n  return (\n    <form\n      onSubmit={e => {\n        e.preventDefault();\n        const {width, height, bgColor} = formVal;\n        if (width && height) {\n          state().setConfig({blankCanvasSize: {width, height}});\n          tools().canvas.openNew(width, height, bgColor);\n          state().togglePanel('newImage', false);\n          tools().history.addInitial();\n        }\n      }}\n    >\n      <NumberField\n        label={<FormattedMessage defaultMessage=\"Width\" />}\n        value={formVal.width}\n        minValue={1}\n        isRequired\n        className=\"mb-16\"\n        onChange={width => {\n          setFormVal({...formVal, width});\n        }}\n      />\n      <NumberField\n        label={<FormattedMessage defaultMessage=\"Height\" />}\n        value={formVal.height}\n        minValue={1}\n        isRequired\n        className=\"mb-16\"\n        onChange={height => {\n          setFormVal({...formVal, height});\n        }}\n      />\n      <ColorPickerButton\n        onChange={newColor => {\n          setFormVal({...formVal, bgColor: newColor});\n        }}\n        className=\"mb-16\"\n        value={formVal.bgColor}\n        label={<FormattedMessage defaultMessage=\"Background color\" />}\n      />\n      <div className=\"text-right\">\n        <Button\n          size=\"sm\"\n          variant=\"text\"\n          className=\"mr-10\"\n          onPress={() => {\n            setActivePanel('default');\n          }}\n        >\n          <FormattedMessage defaultMessage=\"Cancel\" />\n        </Button>\n        <Button size=\"sm\" type=\"submit\" variant=\"raised\" color=\"primary\">\n          <FormattedMessage defaultMessage=\"Create\" />\n        </Button>\n      </div>\n    </form>\n  );\n}\n","import React, {forwardRef, useRef} from 'react';\nimport {AriaTextFieldOptions, useTextField} from '@react-aria/textfield';\nimport {CommonInputFieldProps} from './input-field-props';\nimport {inputFieldStyle} from './input-field-style';\nimport {Adornment} from './adornment';\n\ninterface TextFieldProps\n  extends AriaTextFieldOptions<'input'>,\n    CommonInputFieldProps {}\n\nexport const TextField = forwardRef<HTMLDivElement, TextFieldProps>(\n  (props, ref) => {\n    const style = inputFieldStyle(props);\n    const inputRef = useRef<HTMLInputElement>(null);\n    // eslint-disable-next-line @typescript-eslint/no-unused-vars\n    const {labelProps, inputProps, descriptionProps, errorMessageProps} =\n      useTextField(props, inputRef);\n    const {label, startAdornment, endAdornment} = props;\n\n    return (\n      <div className={style.wrapper} ref={ref}>\n        {label && (\n          // eslint-disable-next-line jsx-a11y/label-has-associated-control\n          <label className={style.label} {...labelProps}>\n            {label}\n          </label>\n        )}\n        <div className=\"relative\">\n          <Adornment direction=\"start\">{startAdornment}</Adornment>\n          <input className={style.input} {...inputProps} />\n          <Adornment direction=\"end\">{endAdornment}</Adornment>\n        </div>\n      </div>\n    );\n  }\n);\n","import {useControlledState as $lfBG4$useControlledState} from \"@react-stately/utils\";\nimport {useMemo as $lfBG4$useMemo, useState as $lfBG4$useState} from \"react\";\n\nfunction $parcel$export(e, n, v, s) {\n  Object.defineProperty(e, n, {get: v, set: s, enumerable: true, configurable: true});\n}\nvar $7641130e45ddf243$exports = {};\n\n$parcel$export($7641130e45ddf243$exports, \"useRadioGroupState\", () => $7641130e45ddf243$export$bca9d026f8e704eb);\n\n\nlet $7641130e45ddf243$var$instance = Math.round(Math.random() * 10000000000);\nlet $7641130e45ddf243$var$i = 0;\nfunction $7641130e45ddf243$export$bca9d026f8e704eb(props) {\n    // Preserved here for backward compatibility. React Aria now generates the name instead of stately.\n    let name = $lfBG4$useMemo(()=>props.name || `radio-group-${$7641130e45ddf243$var$instance}-${++$7641130e45ddf243$var$i}`\n    , [\n        props.name\n    ]);\n    let [selectedValue, setSelected] = $lfBG4$useControlledState(props.value, props.defaultValue, props.onChange);\n    let [lastFocusedValue, setLastFocusedValue] = $lfBG4$useState(null);\n    let setSelectedValue = (value)=>{\n        if (!props.isReadOnly && !props.isDisabled) setSelected(value);\n    };\n    return {\n        name: name,\n        selectedValue: selectedValue,\n        setSelectedValue: setSelectedValue,\n        lastFocusedValue: lastFocusedValue,\n        setLastFocusedValue: setLastFocusedValue,\n        isDisabled: props.isDisabled || false,\n        isReadOnly: props.isReadOnly || false\n    };\n}\n\n\n\n\nexport {$7641130e45ddf243$export$bca9d026f8e704eb as useRadioGroupState};\n//# sourceMappingURL=module.js.map\n","import {mergeProps as $2aKPr$mergeProps, filterDOMProps as $2aKPr$filterDOMProps, useId as $2aKPr$useId} from \"@react-aria/utils\";\nimport {useFocusable as $2aKPr$useFocusable, getFocusableTreeWalker as $2aKPr$getFocusableTreeWalker} from \"@react-aria/focus\";\nimport {usePress as $2aKPr$usePress, useFocusWithin as $2aKPr$useFocusWithin} from \"@react-aria/interactions\";\nimport {useLabel as $2aKPr$useLabel} from \"@react-aria/label\";\nimport {useLocale as $2aKPr$useLocale} from \"@react-aria/i18n\";\n\nfunction $parcel$export(e, n, v, s) {\n  Object.defineProperty(e, n, {get: v, set: s, enumerable: true, configurable: true});\n}\nvar $2cd2cc131ce1e951$exports = {};\n\n$parcel$export($2cd2cc131ce1e951$exports, \"useRadio\", () => $2cd2cc131ce1e951$export$37b0961d2f4751e2);\n\nconst $a249568f27a21ba9$export$3b7b268d09480394 = new WeakMap();\n\n\n\n\nfunction $2cd2cc131ce1e951$export$37b0961d2f4751e2(props, state, ref) {\n    let { value: value , children: children , 'aria-label': ariaLabel , 'aria-labelledby': ariaLabelledby  } = props;\n    const isDisabled = props.isDisabled || state.isDisabled;\n    let hasChildren = children != null;\n    let hasAriaLabel = ariaLabel != null || ariaLabelledby != null;\n    if (!hasChildren && !hasAriaLabel) console.warn('If you do not provide children, you must specify an aria-label for accessibility');\n    let checked = state.selectedValue === value;\n    let onChange = (e)=>{\n        e.stopPropagation();\n        state.setSelectedValue(value);\n    };\n    let { pressProps: pressProps  } = $2aKPr$usePress({\n        isDisabled: isDisabled\n    });\n    let { focusableProps: focusableProps  } = $2aKPr$useFocusable($2aKPr$mergeProps(props, {\n        onFocus: ()=>state.setLastFocusedValue(value)\n    }), ref);\n    let interactions = $2aKPr$mergeProps(pressProps, focusableProps);\n    let domProps = $2aKPr$filterDOMProps(props, {\n        labelable: true\n    });\n    let tabIndex = state.lastFocusedValue === value || state.lastFocusedValue == null ? 0 : -1;\n    if (isDisabled) tabIndex = undefined;\n    return {\n        inputProps: $2aKPr$mergeProps(domProps, {\n            ...interactions,\n            type: 'radio',\n            name: $a249568f27a21ba9$export$3b7b268d09480394.get(state),\n            tabIndex: tabIndex,\n            disabled: isDisabled,\n            checked: checked,\n            value: value,\n            onChange: onChange\n        })\n    };\n}\n\n\nvar $b5bb90da5b40a472$exports = {};\n\n$parcel$export($b5bb90da5b40a472$exports, \"useRadioGroup\", () => $b5bb90da5b40a472$export$62b9571f283ff5c2);\n\n\n\n\n\n\nfunction $b5bb90da5b40a472$export$62b9571f283ff5c2(props, state) {\n    let { name: name , validationState: validationState , isReadOnly: isReadOnly , isRequired: isRequired , isDisabled: isDisabled , orientation: orientation = 'vertical'  } = props;\n    let { direction: direction  } = $2aKPr$useLocale();\n    let { labelProps: labelProps , fieldProps: fieldProps  } = $2aKPr$useLabel({\n        ...props,\n        // Radio group is not an HTML input element so it\n        // shouldn't be labeled by a <label> element.\n        labelElementType: 'span'\n    });\n    let domProps = $2aKPr$filterDOMProps(props, {\n        labelable: true\n    });\n    // When the radio group loses focus, reset the focusable radio to null if\n    // there is no selection. This allows tabbing into the group from either\n    // direction to go to the first or last radio.\n    let { focusWithinProps: focusWithinProps  } = $2aKPr$useFocusWithin({\n        onBlurWithin () {\n            if (!state.selectedValue) state.setLastFocusedValue(null);\n        }\n    });\n    let onKeyDown = (e)=>{\n        let nextDir;\n        switch(e.key){\n            case 'ArrowRight':\n                if (direction === 'rtl' && orientation !== 'vertical') nextDir = 'prev';\n                else nextDir = 'next';\n                break;\n            case 'ArrowLeft':\n                if (direction === 'rtl' && orientation !== 'vertical') nextDir = 'next';\n                else nextDir = 'prev';\n                break;\n            case 'ArrowDown':\n                nextDir = 'next';\n                break;\n            case 'ArrowUp':\n                nextDir = 'prev';\n                break;\n            default:\n                return;\n        }\n        e.preventDefault();\n        let walker = $2aKPr$getFocusableTreeWalker(e.currentTarget, {\n            from: e.target\n        });\n        let nextElem;\n        if (nextDir === 'next') {\n            nextElem = walker.nextNode();\n            if (!nextElem) {\n                walker.currentNode = e.currentTarget;\n                nextElem = walker.firstChild();\n            }\n        } else {\n            nextElem = walker.previousNode();\n            if (!nextElem) {\n                walker.currentNode = e.currentTarget;\n                nextElem = walker.lastChild();\n            }\n        }\n        if (nextElem) {\n            // Call focus on nextElem so that keyboard navigation scrolls the radio into view\n            nextElem.focus();\n            state.setSelectedValue(nextElem.value);\n        }\n    };\n    let groupName = $2aKPr$useId(name);\n    $a249568f27a21ba9$export$3b7b268d09480394.set(state, groupName);\n    return {\n        radioGroupProps: $2aKPr$mergeProps(domProps, {\n            // https://www.w3.org/TR/wai-aria-1.2/#radiogroup\n            role: 'radiogroup',\n            onKeyDown: onKeyDown,\n            'aria-invalid': validationState === 'invalid' || undefined,\n            'aria-errormessage': props['aria-errormessage'],\n            'aria-readonly': isReadOnly || undefined,\n            'aria-required': isRequired || undefined,\n            'aria-disabled': isDisabled || undefined,\n            'aria-orientation': orientation,\n            ...fieldProps,\n            ...focusWithinProps\n        }),\n        labelProps: labelProps\n    };\n}\n\n\n\n\nexport {$2cd2cc131ce1e951$export$37b0961d2f4751e2 as useRadio, $b5bb90da5b40a472$export$62b9571f283ff5c2 as useRadioGroup};\n//# sourceMappingURL=module.js.map\n","import {RadioGroupState} from '@react-stately/radio';\nimport React, {useContext} from 'react';\nimport {InputSize} from '../input-field/input-size';\n\ninterface RadioGroupContext {\n  isEmphasized?: boolean;\n  name?: string;\n  state: RadioGroupState;\n  size?: InputSize;\n}\n\nexport const RadioContext = React.createContext<RadioGroupContext | null>(null);\n\nexport function useRadioProvider(): RadioGroupContext {\n  return useContext(RadioContext)!;\n}\n","import {\n  AriaLabelingProps,\n  AriaValidationProps,\n  DOMProps,\n  InputBase,\n  LabelableProps,\n  Validation,\n  ValueBase,\n} from '@react-types/shared';\nimport {forwardRef, ReactElement} from 'react';\nimport {useRadioGroupState} from '@react-stately/radio';\nimport {useRadioGroup} from '@react-aria/radio';\nimport clsx from 'clsx';\nimport {Orientation} from '../orientation';\nimport {RadioProps} from './radio';\nimport {RadioContext} from './radio-context';\nimport {inputFieldStyle} from '../input-field/input-field-style';\nimport {InputSize} from '../input-field/input-size';\n\ninterface RadioGroupProps\n  extends DOMProps,\n    AriaLabelingProps,\n    AriaValidationProps,\n    ValueBase<string>,\n    InputBase,\n    Validation,\n    LabelableProps {\n  /**\n   * The Radio(s) contained within the RadioGroup.\n   */\n  children: ReactElement<RadioProps> | ReactElement<RadioProps>[];\n  /**\n   * The axis the Radio Button(s) should align with.\n   * @default 'horizontal'\n   */\n  orientation?: Orientation;\n  /**\n   * The name of the RadioGroup, used when submitting an HTML form.\n   * See [MDN](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#name_and_radio_buttons).\n   */\n  name?: string;\n  size?: InputSize;\n  className?: string;\n}\n\nexport const RadioGroup = forwardRef<HTMLDivElement, RadioGroupProps>(\n  (props, ref) => {\n    const style = inputFieldStyle(props);\n    const {\n      label,\n      children,\n      size,\n      className,\n      orientation = 'horizontal',\n    } = props;\n\n    const state = useRadioGroupState(props);\n    const {radioGroupProps, labelProps} = useRadioGroup(props, state);\n\n    return (\n      <div\n        className={clsx('text-left', className)}\n        {...radioGroupProps}\n        ref={ref}\n      >\n        {label && (\n          <span className={style.label} {...labelProps}>\n            {label}\n          </span>\n        )}\n        <div\n          className={clsx(\n            'flex',\n            orientation === 'vertical' ? 'flex-col gap-10' : 'flex-row gap-16'\n          )}\n        >\n          <RadioContext.Provider\n            value={{\n              state,\n              size,\n            }}\n          >\n            {children}\n          </RadioContext.Provider>\n        </div>\n      </div>\n    );\n  }\n);\n","import {AriaLabelingProps, DOMProps, FocusableProps} from '@react-types/shared';\nimport {ReactNode, useRef} from 'react';\nimport {useHover} from '@react-aria/interactions';\nimport {useRadio} from '@react-aria/radio';\nimport {useFocusRing} from '@react-aria/focus';\nimport {VisuallyHidden} from '@react-aria/visually-hidden';\nimport {AnimatePresence, m} from 'framer-motion';\nimport clsx from 'clsx';\nimport {mergeProps} from '@react-aria/utils';\nimport {useRadioProvider} from './radio-context';\nimport {InputSize} from '../input-field/input-size';\n\nexport interface RadioProps\n  extends FocusableProps,\n    DOMProps,\n    AriaLabelingProps {\n  /**\n   * The value of the radio button, used when submitting an HTML form.\n   * See [MDN](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/radio#Value).\n   */\n  value: string;\n  /**\n   * The label for the Radio. Accepts any renderable node.\n   */\n  children?: ReactNode;\n  /**\n   * Whether the radio button is disabled or not.\n   * Shows that a selection exists, but is not available in that circumstance.\n   */\n  isDisabled?: boolean;\n}\n\nexport function Radio(props: RadioProps) {\n  const {isDisabled, children, autoFocus, value} = props;\n  const {hoverProps, isHovered} = useHover({isDisabled});\n  const {isFocusVisible, focusProps} = useFocusRing(props);\n\n  const inputRef = useRef<HTMLInputElement>(null);\n\n  const radioGroupProps = useRadioProvider();\n  const {state, size} = radioGroupProps;\n  const isSelected = state.selectedValue === value;\n\n  const {inputProps} = useRadio(\n    {\n      ...props,\n      ...radioGroupProps,\n      isDisabled,\n    },\n    state,\n    inputRef\n  );\n\n  return (\n    // eslint-disable-next-line jsx-a11y/label-has-associated-control\n    <label\n      className={clsx(\n        'inline-flex gap-8 cursor-pointer select-none items-center whitespace-nowrap align-middle',\n        isDisabled && 'text-disabled pointer-events-none'\n      )}\n      {...hoverProps}\n    >\n      <VisuallyHidden>\n        <input {...mergeProps(inputProps, focusProps)} ref={inputRef} />\n      </VisuallyHidden>\n      <span\n        className={clsx(\n          'block relative shrink-0',\n          circleSize(size),\n          isFocusVisible && 'outline outline-offset-2 rounded-full'\n        )}\n      >\n        <span\n          className={clsx(\n            'absolute left-0 top-o w-full h-full block transition-colors duration-200 border-2 rounded-full',\n            circleColor(isSelected, isHovered, isDisabled)\n          )}\n        />\n        <AnimatePresence>\n          {isSelected && (\n            <m.span\n              key=\"radio-inner\"\n              className={clsx(\n                'rounded-full w-full h-full block left-0 top-o absolute',\n                isHovered ? 'bg-primary-dark' : 'bg-primary'\n              )}\n              initial={{scale: 0.01}}\n              animate={{scale: 0.5}}\n              exit={{scale: 0.01}}\n              transition={{type: 'tween', duration: 0.2}}\n            />\n          )}\n        </AnimatePresence>\n      </span>\n      {children && <span>{children}</span>}\n    </label>\n  );\n}\n\nfunction circleSize(size?: InputSize): string {\n  switch (size) {\n    case 'xs':\n      return 'h-12 w-12';\n    case 'sm':\n      return 'h-16 w-16';\n    case 'lg':\n      return 'h-24 w-24';\n    case 'xl':\n      return 'h-36 w-36';\n    default:\n      return 'h-20 w-20';\n  }\n}\n\nfunction circleColor(\n  isSelected: boolean,\n  isHovered: boolean,\n  isDisabled?: boolean\n): string {\n  if (isDisabled) {\n    return 'border-disabled-fg';\n  }\n  if (isSelected) {\n    return isHovered ? 'border-primary-dark' : 'border-primary';\n  }\n  return isHovered ? 'border-text-main' : 'border-text-muted ';\n}\n","import {FormattedMessage} from 'react-intl';\nimport React, {useState} from 'react';\nimport {useStore} from '../../state/store';\nimport {DialogTrigger} from '../../common/ui/overlays/dialog-trigger/dialog-trigger';\nimport {Dialog} from '../../common/ui/overlays/dialog/dialog';\nimport {DialogBody} from '../../common/ui/overlays/dialog/dialog-body';\nimport {TextField} from '../../common/ui/inputs/input-field/text-field';\nimport {state, tools} from '../../state/utils';\nimport {Slider} from '../../common/ui/inputs/slider/slider';\nimport {Button} from '../../common/ui/buttons/button';\nimport {RadioGroup} from '../../common/ui/inputs/radio-group/radio-group';\nimport {Radio} from '../../common/ui/inputs/radio-group/radio';\n\nexport function ExportDialogTrigger() {\n  const isOpen = useStore(s => s.openPanels.export);\n  return (\n    <DialogTrigger\n      isOpen={isOpen}\n      onClose={() => {\n        state().togglePanel('export', false);\n      }}\n      type=\"modal\"\n    >\n      <ExportDialog />\n    </DialogTrigger>\n  );\n}\n\nfunction ExportDialog() {\n  const [formVal, setFormVal] = useState(() => {\n    return {\n      filename: state().config.tools?.export?.defaultName || 'image',\n      format: state().config.tools?.export?.defaultFormat || 'jpeg',\n      quality: state().config.tools?.export?.defaultQuality || 0.8,\n    };\n  });\n  return (\n    <Dialog className=\"p-20 text-center max-w-max\">\n      <DialogBody>\n        <form\n          onSubmit={e => {\n            e.preventDefault();\n            tools().export.save(\n              formVal.filename,\n              formVal.format,\n              formVal.quality\n            );\n            state().togglePanel('export', false);\n          }}\n        >\n          <TextField\n            isRequired\n            size=\"sm\"\n            label={<FormattedMessage defaultMessage=\"Save As\" />}\n            value={formVal.filename}\n            onChange={filename => {\n              setFormVal({...formVal, filename});\n            }}\n          />\n          <RadioGroup\n            size=\"sm\"\n            className=\"my-20\"\n            aria-label=\"Image format\"\n            value={formVal.format}\n            onChange={format => {\n              setFormVal({...formVal, format: format as any});\n            }}\n          >\n            <Radio value=\"jpeg\">JPEG</Radio>\n            <Radio value=\"png\">PNG</Radio>\n            <Radio value=\"json\">JSON</Radio>\n          </RadioGroup>\n          <Slider\n            size=\"sm\"\n            minValue={0.1}\n            step={0.1}\n            maxValue={1}\n            value={formVal.quality}\n            onChange={quality => {\n              setFormVal({...formVal, quality});\n            }}\n            formatOptions={{style: 'percent'}}\n            label={<FormattedMessage defaultMessage=\"Quality\" />}\n          />\n          <Button\n            variant=\"raised\"\n            color=\"primary\"\n            type=\"submit\"\n            className=\"mt-20 w-full\"\n            size=\"sm\"\n          >\n            <FormattedMessage defaultMessage=\"Save\" />\n          </Button>\n        </form>\n      </DialogBody>\n    </Dialog>\n  );\n}\n","import {FormattedMessage} from 'react-intl';\nimport {m} from 'framer-motion';\nimport clsx from 'clsx';\nimport React from 'react';\nimport {useStore} from '../../state/store';\nimport {PopoverAnimation} from '../../common/ui/overlays/popover/popover-animation';\nimport {popoverStyle} from '../../common/ui/overlays/popover/popover-style';\nimport {IconButton} from '../../common/ui/buttons/icon-button';\nimport {state, tools} from '../../state/utils';\nimport {CloseIcon} from '../../common/icons/material/Close';\nimport {Button} from '../../common/ui/buttons/button';\nimport {OBJ_DISPLAY_NAMES, ObjectName} from '../object-name';\n\nexport function ObjListPanel() {\n  const objects = useStore(s => s.objects.all);\n  const activeId = useStore(s => s.objects.active.id);\n\n  return (\n    <m.div\n      {...PopoverAnimation}\n      className={`absolute bottom-20 right-20 w-224 max-w-[calc(100%-40px)] max-h-[calc(100%-40px)] ${popoverStyle}`}\n    >\n      <div className=\"p-8 mb-4 bg-alt dark:bg-paper font-medium text-sm border-b flex items-center\">\n        <FormattedMessage defaultMessage=\"Objects\" />\n        <IconButton\n          className=\"ml-auto flex-shrink-0\"\n          onPress={() => {\n            state().togglePanel('objects', false);\n          }}\n        >\n          <CloseIcon />\n        </IconButton>\n      </div>\n      <div className=\"p-8\">\n        {objects.map(obj => {\n          const isActive = obj.id === activeId;\n          const objName = obj.name as Exclude<\n            ObjectName,\n            ObjectName.StraightenAnchor\n          >;\n          const displayName = OBJ_DISPLAY_NAMES[objName];\n          const startIcon =\n            displayName.icon &&\n            React.createElement(displayName.icon, {className: 'icon-sm'});\n          return (\n            <Button\n              onPress={() => {\n                if (isActive || !obj.selectable) return;\n                tools().objects.select(obj.id);\n              }}\n              variant=\"outline\"\n              color={isActive ? 'primary' : null}\n              size=\"sm\"\n              className={clsx(\n                'w-full mb-8',\n                (isActive || !obj.selectable) && 'pointer-events-none'\n              )}\n              justify=\"justify-start\"\n              key={obj.id}\n              startIcon={startIcon}\n            >\n              <FormattedMessage {...displayName.name} />\n            </Button>\n          );\n        })}\n      </div>\n    </m.div>\n  );\n}\n","import React from 'react';\nimport {AnimatePresence} from 'framer-motion';\nimport {useStore} from '../state/store';\nimport {HistoryPanel} from '../tools/history/ui/history-panel';\nimport {NewImageDialogTrigger} from './new-image-dialog';\nimport {ExportDialogTrigger} from '../tools/export/export-dialog-trigger';\nimport {ObjListPanel} from '../objects/ui/obj-list-panel';\n\nexport function OverlayPanelContainer() {\n  const historyVisible = useStore(s => s.openPanels.history);\n  const objectsVisible = useStore(s => s.openPanels.objects);\n  return (\n    <div className=\"z-modal\">\n      <AnimatePresence>\n        {historyVisible && <HistoryPanel key=\"historyPanel\" />}\n        {objectsVisible && <ObjListPanel key=\"objListPanel\" />}\n      </AnimatePresence>\n      <NewImageDialogTrigger />\n      <ExportDialogTrigger />\n    </div>\n  );\n}\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const ErrorOutlineIcon = createSvgIcon(\n  <path d=\"M11 15h2v2h-2v-2zm0-8h2v6h-2V7zm.99-5C6.47 2 2 6.48 2 12s4.47 10 9.99 10C17.52 22 22 17.52 22 12S17.52 2 11.99 2zM12 20c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8z\" />\n, 'ErrorOutlineOutlined');\n","import {toast, useToaster} from 'react-hot-toast';\nimport {AnimatePresence, m} from 'framer-motion';\nimport React from 'react';\nimport {FormattedMessage, MessageDescriptor} from 'react-intl';\nimport {IconButton} from '../buttons/icon-button';\nimport {CloseIcon} from '../../icons/material/Close';\nimport {ErrorOutlineIcon} from '../../icons/material/ErrorOutline';\n\nexport function ToastContainer() {\n  const {toasts, handlers} = useToaster({\n    position: 'bottom-center',\n  });\n  const {startPause, endPause} = handlers;\n  return (\n    <div\n      className=\"absolute bottom-10 left-0 right-0 z-toast m-auto px-10\"\n      onMouseEnter={startPause}\n      onMouseLeave={endPause}\n    >\n      <AnimatePresence initial={false}>\n        {toasts\n          .filter(t => t.visible)\n          .map(t => {\n            return (\n              <m.div\n                initial={{opacity: 0, y: 50, scale: 0.3}}\n                animate={{opacity: 1, y: 0, scale: 1}}\n                exit={{opacity: 0, scale: 0.5, transition: {duration: 0.2}}}\n                className=\"relative my-8 mx-auto h-[46px] flex items-center shadow-lg text-base w-min whitespace-nowrap bg-error text-on-error rounded-lg p-10\"\n                key={t.id}\n                {...t.ariaProps}\n              >\n                {t.type === 'error' && (\n                  <ErrorOutlineIcon className=\"svg-icon mr-12 icon-md\" />\n                )}\n                {typeof t.message === 'string' ? (\n                  t.message\n                ) : (\n                  <FormattedMessage {...(t.message as MessageDescriptor)} />\n                )}\n                <IconButton\n                  onPress={() => {\n                    toast.dismiss(t.id);\n                  }}\n                  size=\"sm\"\n                  className=\"ml-12\"\n                >\n                  <CloseIcon />\n                </IconButton>\n              </m.div>\n            );\n          })}\n      </AnimatePresence>\n    </div>\n  );\n}\n","export enum Key {\n  ENTER = 'Enter',\n  SPACE = 'Space',\n  ESCAPE = 'Escape',\n  DELETE = 'Delete',\n  ARROW_UP = 'ArrowUp',\n  ARROW_RIGHT = 'ArrowRight',\n  ARROW_DOWN = 'ArrowDown',\n  ARROW_LEFT = 'ArrowLeft',\n  PAGE_UP = 'PageUp',\n  PAGE_DOWN = 'PageDown',\n  HOME = 'Home',\n  END = 'End',\n  BACKSPACE = 'Backspace',\n  TAB = 'Tab',\n  S = 's',\n  N = 'n',\n  A = 'a',\n  T = 't',\n  B = 'b',\n  C = 'c',\n  O = 'o',\n  P = 'p',\n  R = 'r',\n  F = 'f',\n  Y = 'y',\n  Z = 'z',\n}\n","import {isMac} from '@react-aria/utils';\n\ninterface Event {\n  altKey: boolean;\n  ctrlKey: boolean;\n  metaKey: boolean;\n}\n\nexport function isCtrlKeyPressed(e: Event) {\n  if (isMac()) {\n    return e.metaKey;\n  }\n\n  return e.ctrlKey;\n}\n","import React from 'react';\nimport {Key} from '../common/ui/keycodes.enum';\nimport {isCtrlKeyPressed} from '../common/utils/keybinds/is-ctrl-key-pressed';\nimport {tools} from '../state/utils';\n\nexport function handleCanvasKeydown(e: React.KeyboardEvent) {\n  switch (e.key) {\n    case Key.Z:\n      if (isCtrlKeyPressed(e)) {\n        e.preventDefault();\n        e.stopPropagation();\n        if (e.shiftKey) {\n          tools().history.redo();\n        } else {\n          tools().history.undo();\n        }\n      }\n      break;\n    case Key.ARROW_UP:\n      e.preventDefault();\n      e.stopPropagation();\n      tools().objects.move('up');\n      break;\n    case Key.ARROW_RIGHT:\n      e.preventDefault();\n      e.stopPropagation();\n      tools().objects.move('right');\n      break;\n    case Key.ARROW_DOWN:\n      e.preventDefault();\n      e.stopPropagation();\n      tools().objects.move('down');\n      break;\n    case Key.ARROW_LEFT:\n      e.preventDefault();\n      e.stopPropagation();\n      tools().objects.move('left');\n      break;\n    case Key.DELETE:\n      e.preventDefault();\n      e.stopPropagation();\n      tools().objects.delete();\n      break;\n    default:\n  }\n}\n","import React, {useCallback, useEffect, useRef} from 'react';\nimport {IntlProvider} from 'react-intl';\nimport {domAnimation, LazyMotion, m, Variants} from 'framer-motion';\nimport {DropzoneOptions, useDropzone} from 'react-dropzone';\nimport clsx from 'clsx';\nimport {VisuallyHidden} from '@react-aria/visually-hidden';\nimport {useLayoutEffect} from '@react-aria/utils';\nimport {initTools} from '../tools/init-tools';\nimport {observeSize} from '../common/utils/dom/observe-size';\nimport {getBoundingClientRect} from '../common/utils/dom/get-bounding-client-rect';\nimport {initThemes, useActiveTheme} from '../utils/init-themes';\nimport {OverlayPositionContext} from '../common/ui/overlays/overlay-position-context';\nimport {ToolbarContainer} from './toolbar/toolbar-container';\nimport {LoadingIndicator} from './stage/loading-indicator';\nimport {CanvasWrapper} from './stage/canvas-wrapper';\nimport {ToolControlsOverlay} from './navbar/tool-controls-overlay';\nimport {Navbar} from './navbar/navbar';\nimport {OverlayPanelContainer} from './overlay-panel-container';\nimport {useStore} from '../state/store';\nimport {ToastContainer} from '../common/ui/toast/toast-container';\nimport {state, tools} from '../state/utils';\nimport {UploadedFile} from '../common/uploads/uploaded-file';\nimport {imgContentTypes, stateContentType} from '../tools/import/import-tool';\nimport {buildUploadInputAccept} from '../common/uploads/utils/create-upload-input';\nimport {handleCanvasKeydown} from './handle-canvas-keydown';\nimport {IconButton} from '../common/ui/buttons/icon-button';\nimport {CloseIcon} from '../common/icons/material/Close';\nimport {Underlay} from '../common/ui/overlays/modal/underlay';\nimport {useEditorMode} from './editor-mode';\n\nexport function ImageEditor() {\n  const activeLang = useStore(s => s.config.activeLanguage) || 'en';\n  const languages = useStore(s => s.config.languages);\n  const isVisible = useStore(s => s.config.ui?.visible) ?? true;\n  const navPosition = useStore(s => s.config.ui?.nav?.position) ?? 'bottom';\n  const menuPosition = useStore(s => s.config.ui?.menubar?.position) ?? 'top';\n  const allowEditorClose = useStore(s => s.config.ui?.allowEditorClose) ?? true;\n  const messages = languages?.[activeLang] || {};\n  const activeTheme = useActiveTheme();\n  const rootEl = useRef<HTMLDivElement>(null!);\n  const canvasRef = useRef<HTMLCanvasElement>(null!);\n  const {isModal, isMobile} = useEditorMode();\n\n  const onDrop: DropzoneOptions['onDrop'] = useCallback(files => {\n    if (state().activeTool || state().dirty || !files.length) return;\n    const uploadedFile = new UploadedFile(files[0]);\n    if (state().config.tools?.import?.openDroppedImageAsBackground ?? false) {\n      tools().import.openBackgroundImage(uploadedFile);\n    } else {\n      tools().import.openUploadedFile(uploadedFile);\n    }\n  }, []);\n\n  const {\n    getRootProps,\n    getInputProps,\n    rootRef: stageRef,\n  } = useDropzone({\n    onDrop,\n    accept: buildUploadInputAccept({...imgContentTypes(), ...stateContentType}),\n  });\n\n  useEffect(() => {\n    // editor already booted\n    if (state().fabric) return;\n\n    initTools(canvasRef.current);\n\n    if (state().config.ui?.defaultTool) {\n      state().setActiveTool(state().config.ui?.defaultTool!, null);\n    }\n\n    tools()\n      .canvas.loadInitialContent()\n      .then(() => {\n        state().config.onLoad?.(state().editor);\n      });\n\n    const unobserveStage = observeSize(stageRef.current!, () => {\n      state().setStageSize(getBoundingClientRect(stageRef.current!));\n    });\n    const unobserveCanvas = observeSize(canvasRef.current, () => {\n      state().setCanvasSize(getBoundingClientRect(canvasRef.current));\n    });\n    return () => {\n      unobserveStage();\n      unobserveCanvas();\n    };\n  }, [stageRef]);\n\n  // make sure css variables are added before editor ui is rendered\n  useLayoutEffect(() => {\n    initThemes(rootEl.current, activeTheme);\n  }, [activeTheme]);\n\n  const variants: Variants = {\n    visible: {\n      opacity: 1,\n      scale: 1,\n      display: 'flex',\n    },\n    hidden: {opacity: 0, transitionEnd: {display: 'none'}},\n  };\n\n  const rootClassName = clsx(\n    'pixie-root flex flex-col overflow-hidden bg-background text-main no-tap-highlight w-full h-full',\n    {\n      relative: !isModal,\n      'fixed inset-0 w-full h-full z-20': isModal,\n      'shadow-lg border rounded-md m-auto max-h-[calc(100vh-90px)] max-w-[calc(100vw-90px)]':\n        isModal && !isMobile,\n    }\n  );\n\n  const showCloseIcon = isModal && isVisible && !isMobile && allowEditorClose;\n  const showUnderlay = isModal && isVisible;\n\n  return (\n    <LazyMotion features={domAnimation} strict>\n      {showCloseIcon && (\n        <IconButton\n          className=\"z-20 fixed right-2 top-2 text-white\"\n          size=\"lg\"\n          onPress={() => {\n            state().editor.close();\n          }}\n        >\n          <CloseIcon />\n        </IconButton>\n      )}\n      {showUnderlay && <Underlay position=\"fixed\" disableInitialTransition />}\n      <m.div\n        ref={rootEl}\n        initial={false}\n        variants={variants}\n        animate={isVisible ? 'visible' : 'hidden'}\n        className={rootClassName}\n      >\n        <OverlayPositionContext.Provider\n          value={{\n            boundary: rootEl,\n            portalContainer: rootEl,\n            shouldFlip: false,\n            placement: navPosition === 'bottom' ? 'top' : 'bottom',\n            maxHeight: '400px',\n          }}\n        >\n          <IntlProvider\n            locale={activeLang}\n            defaultLocale=\"en\"\n            messages={messages}\n          >\n            {menuPosition === 'top' && <ToolbarContainer />}\n            {navPosition === 'top' && <Navbar />}\n\n            <main\n              className=\"relative flex-auto my-20 overflow-hidden outline-none\"\n              {...getRootProps({\n                onKeyDownCapture: handleCanvasKeydown,\n              })}\n            >\n              <VisuallyHidden>\n                <input {...getInputProps} />\n              </VisuallyHidden>\n              <LoadingIndicator />\n              <CanvasWrapper ref={canvasRef} />\n            </main>\n            <ToolControlsOverlay />\n            {navPosition === 'bottom' && <Navbar />}\n            {menuPosition === 'bottom' && <ToolbarContainer />}\n            <OverlayPanelContainer />\n            <ToastContainer />\n          </IntlProvider>\n        </OverlayPositionContext.Provider>\n      </m.div>\n    </LazyMotion>\n  );\n}\n","import React from 'react';\nimport ReactDOM from 'react-dom';\nimport {Canvas, IEvent} from 'fabric/fabric-impl';\nimport deepmerge from 'deepmerge';\nimport styleInject from 'style-inject';\nimport NP from 'number-precision';\nimport {init as initSentry} from '@sentry/react';\nimport {BrowserTracing} from '@sentry/tracing';\nimport {\n  DEFAULT_CONFIG,\n  PIXIE_VERSION,\n  PixieConfig,\n} from './config/default-config';\nimport {useStore} from './state/store';\nimport {ObjectModifiedEvent} from './objects/object-modified-event';\nimport {ImageEditor} from './ui/image-editor';\nimport type {Tools} from './tools/init-tools';\nimport {state, tools} from './state/utils';\nimport {EditorState} from './state/editor-state';\nimport {resetEditor} from './utils/reset-editor';\nimport {fetchStateJsonFromUrl} from './tools/import/fetch-state-json-from-url';\nimport {getCurrentCanvasState} from './tools/history/state/get-current-canvas-state';\nimport {SerializedPixieState} from './tools/history/serialized-pixie-state';\nimport {setActiveTool} from './ui/navbar/set-active-tool';\nimport {ToolName} from './tools/tool-name';\nimport {canvasIsEmpty} from './tools/canvas/canvas-is-empty';\nimport css from './styles.css';\nimport {showToast} from './common/ui/toast/show-toast';\n\nNP.enableBoundaryChecking(false);\n\nexport class Pixie {\n  tools: Tools = {} as any;\n  fabric: Canvas | null = null;\n\n  get state() {\n    return state();\n  }\n  get version() {\n    return PIXIE_VERSION;\n  }\n  get defaultConfig() {\n    return DEFAULT_CONFIG;\n  }\n\n  constructor(config: Partial<PixieConfig>) {\n    if (config.sentryDsn) {\n      initSentry({\n        dsn: config.sentryDsn,\n        integrations: [new BrowserTracing()],\n        tracesSampleRate: 1.0,\n      });\n    }\n    this.setConfig(config);\n    if (import.meta.env.PROD) {\n      styleInject(css);\n    }\n    if (!config.selector) {\n      throw new Error('Pixie required \"selector\" option.');\n    }\n    const container = document.querySelector(config.selector);\n    if (!container) {\n      return;\n    }\n    container.classList.add('pi');\n    useStore.setState({editor: this});\n    ReactDOM.render(\n      <React.StrictMode>\n        <ImageEditor />\n      </React.StrictMode>,\n      container\n    );\n  }\n\n  /**\n   * Open editor.\n   */\n  open(config: Partial<PixieConfig> = {}) {\n    if (state().config.ui?.visible) return;\n    this.setConfig(deepmerge(config, {ui: {visible: true}}));\n    requestAnimationFrame(() => {\n      tools().zoom.fitToScreen();\n      tools().history.addInitial();\n      if (canvasIsEmpty() && state().config.ui?.openImageDialog?.show) {\n        this.togglePanel('newImage', true);\n      }\n      state().config.onOpen?.();\n    });\n  }\n\n  /**\n   * Close editor.\n   */\n  close() {\n    if (!state().config.ui?.visible) return;\n    this.setConfig({ui: {visible: false}});\n    state().config.onClose?.();\n  }\n\n  /**\n   * Override editor configuration.\n   */\n  setConfig(config: Partial<PixieConfig>) {\n    state().setConfig(config);\n  }\n\n  /**\n   * Open file upload window and add selected image to canvas.\n   */\n  uploadAndAddImage() {\n    return tools().import.uploadAndAddImage();\n  }\n\n  /**\n   * Open file upload window and replace canvas contents with selected image.\n   */\n  uploadAndReplaceMainImage() {\n    return tools().import.uploadAndReplaceMainImage();\n  }\n\n  /**\n   * Open file upload window and replace canvas contents with selected state file.\n   */\n  uploadAndOpenStateFile() {\n    return tools().import.uploadAndOpenStateFile();\n  }\n\n  /**\n   * Clear current canvas and open a new one at specified size.\n   */\n  newCanvas(width: number, height: number, bgColor?: string) {\n    return tools().canvas.openNew(width, height, bgColor);\n  }\n\n  /**\n   * Get current canvas state as json string.\n   */\n  getState(customProps?: string[]) {\n    return JSON.stringify(getCurrentCanvasState(customProps));\n  }\n\n  /**\n   * Replace current canvas contents with specified pixie state.\n   */\n  setState(data: string | SerializedPixieState) {\n    return tools().import.loadState(data);\n  }\n\n  /**\n   * Replace current canvas contents with pixie state file loaded from specified url.\n   */\n  async setStateFromUrl(url: string) {\n    const stateObj = await fetchStateJsonFromUrl(url);\n    return tools().import.loadState(stateObj);\n  }\n\n  /**\n   * Open specified tool (crop, draw, text etc.)\n   */\n  openTool(name: ToolName) {\n    setActiveTool(name);\n  }\n\n  /**\n   * Apply any pending changes from currently open tool.\n   * This is identical to clicking \"apply\" button in the editor.\n   */\n  applyChanges() {\n    state().applyChanges();\n  }\n\n  /**\n   * Cancel any pending changes from currently open tool.\n   * This is identical to clicking \"cancel\" button in the editor.\n   */\n  cancelChanges() {\n    state().cancelChanges();\n  }\n\n  /**\n   * Fully reset editor state and optionally\n   * override specified configuration.\n   */\n  async resetEditor(config?: PixieConfig) {\n    await resetEditor(config);\n    await tools().canvas.loadInitialContent();\n  }\n\n  /**\n   * Toggle specified floating panel.\n   */\n  togglePanel(name: keyof EditorState['openPanels'], isOpen?: boolean) {\n    state().togglePanel(name, isOpen);\n  }\n\n  /**\n   * Listen to specified canvas event.\n   * (List of all available events can be found in the documentation)\n   */\n  // @ts-ignore\n  on(event: 'object:modified', handler: (e: ObjectModifiedEvent) => void): void;\n  on(event: string, handler: (e: IEvent) => void): void {\n    this.fabric?.on(event, handler);\n  }\n\n  /**\n   * Check if any modifications made to canvas have not been applied yet.\n   */\n  isDirty() {\n    return state().dirty;\n  }\n\n  /**\n   * @hidden\n   */\n  get(name: keyof Tools) {\n    return this.tools[name];\n  }\n\n  /**\n   * Display specified notification message in the editor.\n   */\n  notify(message: string) {\n    return showToast(message);\n  }\n\n  /**\n   * Create a new editor instance.\n   */\n  static init(config: PixieConfig): Promise<Pixie> {\n    return new Promise(resolve => {\n      const userOnLoad = config.onLoad;\n      config.onLoad = (instance: Pixie) => {\n        // call user specified \"onLoad\" function\"\n        userOnLoad?.(instance);\n        resolve(instance);\n      };\n      (() => new this(config))();\n    });\n  }\n}\n"],"names":["index","extendStatics","__assign","__read","isString","__extends","global","__values","isPrimitive","__spread","CoreIntegrations.InboundFilters","CoreIntegrations.FunctionToString","browserInit","b","c","d","e","f","g","h","k","l","m","n","p","q","r","t","v","w","x","y","z","A","reactIsModule","require$$0","SpanClass","__rest","mergeConfig","createFastMemoizeCache","parse","DEFAULT_INTL_CONFIG","invariant","filterProps","getFormatter","formatMessage","CORE_DEFAULT_INTL_CONFIG","IntlProvider","coreFormatMessage","coreCreateIntl","EditorMode","NavPosition","defaultShapes","name","type","options","lockUniScaling","path","strokeWidth","stroke","padding","emoticonsList","defaultStickers","list","thumbnailUrl","items","invertPreview","StickerCategoryMessages","defineMessages","emoticons","defaultMessage","doodles","landmarks","bubbles","transportation","beach","defaultObjectProps","fill","opacity","backgroundColor","BrushTypes","BrushSizes","EditorTheme","DEFAULT_THEMES","LIGHT","colors","DARK","isDark","ToolName","hasOwnProperty","jsxRuntimeModule","jsxRuntime.jsx","jsxRuntime.jsxs","jsxRuntime.Fragment","SvgIcon","forwardRef","props","ref","attr","size","title","className","color","style","children","viewBox","svgProps","computedSize","mergedClassName","displayName","Component","React","memo","data","Tree2Element","createSvgIcon","tree","map","node","i","createElement","tag","key","child","TuneIcon","PhotoSizeSelectLargeIcon","CropIcon","TextFieldsIcon","ExtensionIcon","FaceIcon","FilterFramesIcon","MergeIcon","RoundedCornerIcon","PhotoLibraryIcon","HistoryIcon","StyleIcon","DeleteIcon","DrawIcon","HomeIcon","HISTORY_DISPLAY_NAMES","FILTER","defineMessage","icon","RESIZE","CROP","DRAW","TEXT","SHAPES","STICKERS","FRAME","MERGE","CORNERS","bgImage","overlayImage","initial","loadedState","objectStyle","deletedObject","DEFAULT_NAV_ITEMS","Object","values","toolName","action","editor","tools","merge","apply","navItemMessages","filter","resize","crop","draw","text","shapes","Stickers","frame","corners","FileDownloadIcon","PIXIE_VERSION","packageConfig","version","DEFAULT_CONFIG","selector","textureSize","ui","visible","mode","INLINE","forceOverlayModeOnMobile","activeTheme","themes","allowEditorClose","menubar","align","desktopOnly","togglePanel","label","state","config","showExportPanel","export","save","nav","position","BOTTOM","openImageDialog","show","sampleImages","url","thumbnail","colorPresets","objectDefaults","sticker","undefined","textAlign","underline","linethrough","fontStyle","fontFamily","fontWeight","fontSize","zoom","allowUserZoom","fitImageToScreen","allowCustomRatio","defaultRatio","presets","ratio","defaultText","family","src","descriptors","weight","brushSizes","brushTypes","slice","stickers","import","validImgExtensions","fitOverlayToScreen","openDroppedImageAsBackground","defaultFormat","defaultQuality","defaultName","min","max","default","display_name","useIsomorphicLayoutEffect","L","s","o","X","O","H","u","a","G","W","B","E","R","P","D","string","charAt","toLowerCase","userConfig","currentConfig","merged","deepmerge","replaceDefaultConfigItems","keys","forEach","startsWith","iterablesKey","lowerFirst","replace","createHistorySlice","set","get","history","historySliceDefaults","updatePointerById","id","findIndex","update","pointer","castDraft","canUndo","canRedo","length","reset","ActiveToolOverlay","createFilterSlice","filterSliceDefaults","select","filterName","hasOptions","selected","activeToolOverlay","Filter","dirty","deselect","applied","createCropSlice","cropSliceDefaults","setCropzoneRect","rect","zoneRect","setAspectRatio","selectedAspectRatio","setTransformAngle","angle","straightenAngle","scaledRect","width","Math","ceil","height","left","top","obj","ObjectName","OBJ_DISPLAY_NAMES","Image","DEFAULT_ACTIVE_OBJ_PROPS","isMoving","editableProps","isText","isImage","shadow","blur","offsetX","offsetY","createObjectsSlice","objects","objectsSliceDefaults","setActiveIsMoving","value","active","setIsEditingText","isEditingText","setActive","fabricObjToState","defaultEditableProps","all","createFrameSlice","frameSliceDefaults","showOptionsPanel","activeTool","Frame","createResizeSlice","resizeSliceDefaults","setFormValue","entries","formValue","newSize","oldSize","original","maintainAspect","usePercentages","createCornersSlice","cornerSliceDefaults","setRadius","newRadius","radius","EMPTY_PLAIN_RECT","right","bottom","immer","api","partial","nextState","produce","useStore","create","subscribeWithSelector","fabric","stageSize","canvasSize","loading","openPanels","newImage","setZoom","newZoom","setOriginal","setDirty","isDirty","toggleLoading","isLoading","setStageSize","setCanvasSize","setActiveTool","overlay","setConfig","partialConfig","panelName","isOpen","applyChanges","activeToolName","toolSlice","result","addHistoryItem","cancelChanges","wasDirty","reload","transform","resetStraightenAnchor","isBrowser","clamp","analyse","getAnimatableNone","keyframes","isCSSVariable","scrapeMotionValuesFromProps","supportsPointerEvents","supportsTouchEvents","getComputedStyle","ReactPropTypesSecret","propTypesModule","ownKeys","_defineProperty","_arrayWithHoles","_iterableToArrayLimit","_unsupportedIterableToArray","_nonIterableRest","_arrayLikeToArray","accepts","_slicedToArray","_objectSpread","_excluded","_excluded2","_excluded3","_excluded4","arr","_arrayWithoutHoles","_iterableToArray","_nonIterableSpread","TypeError","iter","Symbol","iterator","Array","from","isArray","minLen","prototype","toString","call","constructor","test","len","arr2","_i","_arr","_n","_d","_s","_e","next","done","push","err","object","enumerableOnly","getOwnPropertySymbols","symbols","sym","getOwnPropertyDescriptor","enumerable","target","arguments","source","getOwnPropertyDescriptors","defineProperties","defineProperty","configurable","writable","excluded","_objectWithoutPropertiesLoose","sourceSymbolKeys","indexOf","propertyIsEnumerable","sourceKeys","Dropzone","_ref","params","_objectWithoutProperties","_useDropzone","useDropzone","open","useImperativeHandle","defaultProps","disabled","getFilesFromEvent","fromEvent","maxSize","Infinity","minSize","multiple","maxFiles","preventDropOnDocument","noClick","noKeyboard","noDrag","noDragEventsBubbling","validator","useFsAccessApi","propTypes","PropTypes","func","accept","oneOfType","arrayOf","bool","number","onFileDialogCancel","onFileDialogOpen","onDragEnter","onDragLeave","onDragOver","onDrop","onDropAccepted","onDropRejected","initialState","isFocused","isFileDialogActive","isDragActive","isDragAccept","isDragReject","draggedFiles","acceptedFiles","fileRejections","_defaultProps$options","onFileDialogOpenCb","useMemo","noop","onFileDialogCancelCb","rootRef","useRef","inputRef","_useReducer","useReducer","reducer","_useReducer2","dispatch","onWindowFocus","setTimeout","current","files","useEffect","canUseFileSystemAccessAPI","window","addEventListener","removeEventListener","dragTargetsRef","onDocumentDrop","event","contains","preventDefault","document","onDocumentDragOver","onDragEnterCb","useCallback","persist","stopPropagation","concat","_toConsumableArray","isEvtWithFiles","Promise","resolve","then","isPropagationStopped","onDragOverCb","hasFiles","dataTransfer","dropEffect","_unused","onDragLeaveCb","targets","targetIdx","splice","setFiles","file","_fileAccepted","fileAccepted","_fileAccepted2","accepted","acceptError","_fileMatchSize","fileMatchSize","_fileMatchSize2","sizeMatch","sizeError","customErrors","errors","TOO_MANY_FILES_REJECTION","onDropCb","openFileDialog","opts","types","filePickerOptionsTypes","showOpenFilePicker","handles","catch","finally","click","onKeyDownCb","isEqualNode","keyCode","onFocusCb","onBlurCb","onClickCb","isIeOrEdge","composeHandler","fn","composeKeyboardHandler","composeDragHandler","getRootProps","_ref2","_ref2$refKey","refKey","role","onKeyDown","onFocus","onBlur","onClick","rest","composeEventHandlers","tabIndex","onInputElementClick","getInputProps","_ref3","_ref3$refKey","onChange","inputProps","display","autoComplete","fileCount","allFilesAccepted","$parcel$export","$cgWTI$react","$cgWTI$useContext","$cgWTI$useMemo","$cgWTI$useState","$cgWTI$useLayoutEffect","$11sjw$useState","$11sjw$useRef","$11sjw$useCallback","$12uGp$react","$12uGp$useRef","$12uGp$useState","$12uGp$useSSRSafeId","$12uGp$useEffect","$12uGp$useCallback","$12uGp$clsx","$103b0e103f1b5952$re_export$clamp","$103b0e103f1b5952$re_export$snapValueToStep","$bx7SL$isIOS","$bx7SL$runAfterTransition","$bx7SL$react","$bx7SL$useContext","$bx7SL$mergeProps","$bx7SL$useSyncRef","$bx7SL$useRef","$bx7SL$useState","$bx7SL$useGlobalListeners","$bx7SL$useMemo","$bx7SL$focusWithoutScrolling","$bx7SL$useEffect","$bx7SL$isMac","$bx7SL$useCallback","$bx7SL$useEvent","$bx7SL$useDescription","$9BxnE$useState","$9BxnE$useFocus","$9BxnE$useMemo","$9BxnE$react","$9BxnE$mergeProps","require$$1","DEFAULT_OBJ_CONFIG","lockScalingFlip","originY","originX","lockMovementX","lockMovementY","borderColor","random","possible","floor","getState","canvasEl","fabricCanvas","Canvas","preserveObjectStacking","selection","renderOnAddRemove","on","randomString","objectControls","controls","maxZoom","minZoom","step","bindMouseWheel","subscribe","fitToScreen","currentZoom","zoomIn","amount","canZoomIn","canZoomOut","zoomOut","NP","round","setDimensions","stageHeight","stageWidth","scale","opt","deltaY","staticObjectConfig","selectable","evented","lockRotation","lockScalingX","lockScalingY","hasControls","hasBorders","hasRotatingPoint","util","loadImage","img","crossOrigin","image","blankCanvasSize","getObjects","response","fetch","json","minWidth","minHeight","applyZoom","resizeHelper","setWidth","setHeight","addMainImage","loadStateName","loadFabricImage","clear","MainImage","add","center","setCoords","onMainImageLoaded","openNew","bgColor","getMainImage","find","render","requestRenderAll","loadInitialContent","stateJson","endsWith","stateObj","fetchStateJsonFromUrl","loadState","canvasIsEmpty","addInitial","remove","Sticker","SIZE_AND_POSITION_PROPS","fire","buildObjModifiedEvent","sizeOrPositionChanged","some","includes","overlayName","getToolForObj","getActiveObject","Text","ActiveObject","Shape","shouldPreventObjDeselect","objIsHandledByActiveTool","deselected","syncObjects","getAll","pixieInternal","getById","isActive","objectOrId","objId","getActive","has","objOrId","setActiveObject","deselectActive","discardActiveObject","setValues","fontChanged","isSvgSticker","forEachObject","selectionStart","selectionEnd","setSelectionStyles","move","direction","canvas","bringToFront","sendToBack","flipHorizontally","flipX","duplicate","clone","clonedObj","delete","setState","DEFAULT_SERIALIZED_EDITOR_STATE","fonts","customProps","toJSON","activeFrame","sizePercent","currentSizeInPercent","activeObjectId","canvasWidth","canvasHeight","getCurrentCanvasState","TEXT_CONTROLS_PADDING","providedConfig","editingBorderColor","itext","IText","autoPositionText","getWidth","getHeight","scaleToWidth","getScaledHeight","scaleToHeight","viewportCenter","intersectsWithObject","offset","newTop","uri","isAbsoluteUrl","baseUrl","promises","fontConfig","loadedFont","loaded","fontFace","FontFace","assetUrl","load","undo","prev","redo","replaceCurrent","createHistoryItem","item","stateUntilPointer","newItems","getUsedFonts","loadFromJSON","point","getPointByOrigin","calcOffset","canMerge","getDataUrl","filterList","fabricType","uses","matrix","distance","brightness","red","green","blue","gamma","noise","blocksize","alpha","available","filterNameMessages","grayscale","blackWhite","sharpen","invert","vintage","polaroid","kodachrome","technicolor","brownie","sepia","removeColor","pixelate","emboss","blendColor","filterOptionMessages","toUpperCase","syncState","getByName","isApplied","newFilter","getImages","filters","applyFilters","findFilterIndex","mainImage","applyValue","optionName","optionValue","fabricFilter","curr","addCustom","editableOptions","initialConfig","imgFilters","ucFirst","createClass","BaseFilter","fromObject","fabricFilters","filterConfig","configMatchesFabricFilter","getByFabricFilter","matrixAreEqual","matrix1","matrix2","getMinWidth","aspectToHeight","getMaxWidth","getMinHeight","aspectToWidth","getMaxHeight","maxWidth","maxHeight","newHeight","hRatio","newWidth","wRatio","payload","clampResizePayload","currentWidth","currentHeight","widthScale","heightScale","scaleX","scaleY","tempScaleX","tempScaleY","tempLeft","tempTop","refs","innerZone","contWidth","contHeight","maskTop","maskLeft","rightLeft","maskRight","maskBottom","horSpace","lineVer1","lineVer2","verSpace","lineHor1","lineHor2","aspectRatio","oldWidth","oldHeight","parts","split","parseInt","boundary","calcNewSizeFromAspectRatio","zone","box","frameName","frameSize","hide","cropX","cropY","drawZone","resetCropzone","aspectRatioStr","boundaryRect","aspectRatioFromStr","newRect","centerWithinBoundary","registerRefs","getShapeByName","shape","addBasicShape","shapeName","fabricShape","Circle","Ellipse","rx","ry","Path","shapeType","addAndPositionShape","addSticker","categoryName","category","cat","stickerUrl","addSvgSticker","addRegularSticker","objectName","loadSVGFromURL","groupSVGElements","stickerName","patternCache","fillParts","part","fillPartWithPattern","StaticCanvas","pattern","Pattern","getElement","repeat","getRetinaScaling","scalePatternToWidth","getScaledWidth","scalePatternToHeight","boundingRectFactor","getBoundingRect","getPartNames","fromURL","getPartUrl","images","patterns","defaultColor","build","createParts","partName","Rect","objectCaching","fullWidth","fullHeight","cornerSize","topLeft","topRight","bottomLeft","bottomRight","sides","is","changeColor","getMinSize","getMaxSize","builder","ActiveFrame","FramePatterns","FrameBuilder","moveTo","calcFrameSizeInPixels","percentage","getActiveFrameConfig","VLineBrush","vLinePatternBrush","PatternBrush","getPatternSrc","patternCanvas","ctx","getContext","strokeStyle","lineWidth","beginPath","lineTo","closePath","HLineBrush","hLinePatternBrush","DiamondBrush","diamondBrush","squareWidth","squareDistance","SquareBrush","squareBrush","fillStyle","fillRect","customBrushes","currentBrush","onPathCreated","Drawing","getPathConfig","enable","isDrawingMode","setBrushType","setBrushSize","disable","off","getBrushType","freeDrawingBrush","applyBrushStyles","brush","getBrushSize","setBrushColor","getBrushColor","staticObjConfig","fullFileName","re","exec","extensionsToMime","md","markdown","mp4","mp3","svg","jpg","png","gif","yaml","yml","fileExtension","extensionFromFilename","relativePath","mime","extension","native","lastModified","cachedData","getFileMime","webkitRelativePath","match","reader","FileReader","readAsText","readAsDataURL","old","querySelector","input","classList","visibility","buildUploadInputAccept","directory","webkitdirectory","body","appendChild","extensions","join","createUploadInput","onchange","fileList","uploads","UploadedFile","_extends","setup","message","toast","error","validations","showToast","validate","initValidations","failed","validation","fails","errorMessage","passes","num","neg","units","exponent","log","Number","pow","unit","toFixed","UploadValidation","prettyBytes","UploadValidator","DEFAULT_MAX_FILE_SIZE_MB","FileSizeValidation","getMaxFileSize","allowedExtensions","getAllowedExtensions","AllowedExtensionsValidation","maxFileSize","convertToBytes","imgExtensions","animate","duration","onComplete","UploadInputType","ImportToolValidator","uploadAndAddImage","openUploadWindow","openUploadedFile","uploadAndReplaceMainImage","openBackgroundImage","uploadAndOpenStateFile","stateContentType","fileData","addImage","resetEditor","JSON","contentTypes","imgContentTypes","fileIsValid","onFileOpen","HTMLImageElement","validExtensions","watermark","lineStyle","strokeLineCap","strokeLineJoin","watermarkText","createGroup","addText","addLines","Group","excludeFromExport","halfWidth","halfHeight","line1","Line","line2","line3","line4","x1","y1","x2","y2","this","b64Data","contentType","sliceSize","byteCharacters","atob","byteArrays","byteNumbers","charCodeAt","byteArray","Uint8Array","Blob","format","quality","exportConfig","getFormat","getQuality","filename","applyWaterMark","getJsonState","saveUrl","method","stringify","onSave","blob","getCanvasBlob","prepareCanvas","toSVG","toDataURL","multiplier","b64toBlob","previewRect","showPreview","updatePreview","clipPath","hidePreview","getPreviewRadius","strokeDashArray","straightenAnchor","StraightenAnchor","rotateLeft","rotateFixed","rotateRight","straighten","degrees","storeObjectsRelationToHelper","newAngle","rotateAngle","getImageScale","transformObjectsBasedOnHelper","flip","prop","currentRotateAngle","rotate","degreesToRadians","cw","ch","iw","ih","dist","sqrt","diagAngle","asin","a1","PI","ang1","abs","ang2","dist1","cos","dist2","relationToCanvas","multiplyTransformMatrices","invertTransform","calcTransformMatrix","newTransform","qrDecompose","flipY","setPositionByOrigin","translateX","translateY","oldHelper","newHelper","initFabric","PixieCanvas","ObjectTool","ZoomTool","HistoryTool","FilterTool","ResizeTool","CropTool","MergeTool","ShapeTool","FrameTool","TextTool","DrawTool","TransformTool","ImportTool","WatermarkTool","ExportTool","CornersTool","el","callback","observer","ResizeObserver","contentRect","observe","unobserve","getBoundingClientRect","isArrayish","swizzle","simpleSwizzleModule","colorStringModule","convert","conversions","route","rootEl","defaultTheme","mergedTheme","setProperty","parseThemeValue","rgb","array","OverlayPositionContext","createContext","toolbarStyle","toolbarAnimation","exit","transition","equalWidth","$6saFI$getInteractionModality","$6saFI$runAfterTransition","$6saFI$focusWithoutScrolling","$6saFI$react","$6saFI$useRef","$6saFI$useContext","$6saFI$useLayoutEffect","$6saFI$useEffect","$6saFI$isFocusVisible","$6saFI$useState","$6saFI$useFocusVisibleListener","$6saFI$useFocus","$6saFI$useFocusWithin","$6saFI$mergeProps","$6saFI$clsx","$6saFI$useSyncRef","$6saFI$useKeyboard","$8mfbS$usePress","$8mfbS$useFocusable","$8mfbS$mergeProps","$8mfbS$filterDOMProps","$8mfbS$chain","variant","outline","contained","ButtonBase","justify","href","isFocusVisible","focusProps","useFocusRing","buttonProps","isPressed","useButton","elementType","Element","mergeProps","clsx","getSharedButtonStyle","Button","startIcon","endIcon","other","getButtonSizeStyle","iconSize","getIconSizeStyle","cloneElement","$dXgez$react","$dXgez$useMemo","$dXgez$useRef","$4oA3P$useControlledState","$aGzji$useOverlayTriggerState","$aGzji$useState","$iFADg$useIsSSR","$iFADg$useState","$iFADg$useEffect","$iFADg$react","$iFADg$useContext","$iFADg$MessageDictionary","$iFADg$useMemo","$iFADg$MessageFormatter","$iFADg$useCallback","$iFADg$useRef","$iFADg$DateFormatter","$iFADg$NumberFormatter","require$$2","require$$3","require$$4","require$$5","require$$6","$k7QOs$useEffect","$k7QOs$useLocale","$k7QOs$useState","$k7QOs$useCallback","$k7QOs$useLayoutEffect","$k7QOs$useRef","$k7QOs$useInteractOutside","$k7QOs$useFocusWithin","$k7QOs$useId","$k7QOs$isIOS","$k7QOs$chain","$k7QOs$getScrollParent","$k7QOs$react","$k7QOs$useContext","$k7QOs$useMemo","$k7QOs$reactdom","$k7QOs$useMessageFormatter","$parcel$interopDefault","$k7QOs$useLabels","$k7QOs$VisuallyHidden","$dgwbL$isAppleDevice","$dgwbL$isMac","$dgwbL$useRef","$dgwbL$useLocale","$dgwbL$getFocusableTreeWalker","$dgwbL$focusWithoutScrolling","$dgwbL$useEvent","$dgwbL$scrollIntoView","$dgwbL$useEffect","$dgwbL$focusSafely","$dgwbL$mergeProps","$dgwbL$usePress","$dgwbL$useLongPress","$dgwbL$useCollator","$dgwbL$useMemo","$lVGRk$useId","$lVGRk$useOverlayTrigger","$lVGRk$useMessageFormatter","$lVGRk$useLongPress","$lVGRk$mergeProps","$lVGRk$filterDOMProps","$lVGRk$useSelectableList","$lVGRk$useSlotId","$lVGRk$getItemCount","$lVGRk$useSelectableItem","$lVGRk$usePress","$lVGRk$useHover","$lVGRk$isFocusVisible","MOBILE_SCREEN_WIDTH","isSSR","useIsSSR","screen","popoverStyle","PopoverAnimation","otherProps","contextValue","useContext","zIndex","OverlayContainer","portalContainer","Popover","onClose","shouldCloseOnBlur","hideArrow","isKeyboardDismissDisabled","isNonModal","isDismissable","preventScroll","isDisabled","PopoverWrapper","objRef","useObjectRef","overlayProps","useOverlay","modalProps","useModal","popoverPlacement","MenuContext","disableInitialTransition","isFixedHeight","domRef","underlayProps","TrayWrapper","viewport","useViewportSize","useState","timeoutRef","innerHeight","domProps","T","computePosition","shouldFlip","containerPadding","reference","floating","strategy","useFloating","placement","middleware","offsetMiddleware","crossAxis","mainAxis","shift","triggerRef","triggerObjRef","overlayRef","overlayObjRef","objRefs","positionStyle","closeOnSelect","menuTrigger","menu","Children","toArray","useMenuTriggerState","useOverlayPosition","menuTriggerProps","menuProps","useMenuTrigger","isMobile","useIsMobileDevice","menuContext","close","autoFocus","focusStrategy","contents","FocusScope","DismissButton","$f0goU$useRef","$f0goU$useState","$f0goU$useMemo","$f0goU$useControlledState","tmp","$9TXm6$useControlledState","$9TXm6$useMultipleSelectionState","$9TXm6$useMemo","$9TXm6$useCollection","$9TXm6$useEffect","$9TXm6$SelectionManager","isSelected","isHovered","listboxItemIconStyle","onAction","useMenuContext","rendered","selectionManager","disabledKeys","menuItemProps","labelProps","descriptionProps","keyboardShortcutProps","useMenuItem","hoverProps","useHover","listboxItemStyle","listboxWrapperStyle","contextProps","menuRef","mergedProps","useTreeState","useMenu","collection","menuItem","wrapper","button","menuItems","Item","IconButton","iconClass","iconEl","isValidElement","createSvgIconFromTree","MixedIcon","_MixedIcon","onPress","IconOnlyButton","ButtonWithLabel","FormattedMessage","childValue","toggleMultipleValue","newValue","childIndex","buttons","adjustedColor","getStyle","UndoIcon","RedoIcon","RemoveIcon","AddIcon","CloseIcon","isModal","OVERLAY","useEditorMode","leftItems","centerItems","rightItems","mobileOnly","closeButton","callbackName","resizeDir","matches","dataset","execute","resizeUsingRect","resizeUsingEvent","onPointerUp","prevRect","currentRect","deltaX","$k3hqg$useControlledState","$k3hqg$useState","$k3hqg$NumberFormatter","$k3hqg$useMemo","$k3hqg$NumberParser","$k3hqg$useCallback","$k3hqg$useEffect","$k3hqg$useRef","$k3hqg$clamp","$k3hqg$snapValueToStep","$crOtA$useId","$crOtA$useLabels","$crOtA$useSlotId","$crOtA$mergeProps","$aywJT$useFocusable","$aywJT$useField","$aywJT$filterDOMProps","$aywJT$mergeProps","$aywJT$useRef","$aywJT$useEffect","$icz4I$react","$icz4I$useState","$icz4I$useImperativeHandle","$icz4I$Fragment","$icz4I$VisuallyHidden","$915Kq$useRef","$915Kq$useMessageFormatter","$915Kq$useEffect","$915Kq$announce","$915Kq$useCallback","$915Kq$useGlobalListeners","$1eWaC$useMessageFormatter","$1eWaC$useId","$1eWaC$useFocus","$1eWaC$useSpinButton","$1eWaC$useState","$1eWaC$useFocusWithin","$1eWaC$useCallback","$1eWaC$useScrollWheel","$1eWaC$useNumberFormatter","$1eWaC$useMemo","$1eWaC$isIPhone","$1eWaC$isAndroid","$1eWaC$filterDOMProps","$1eWaC$useFormattedTextField","$1eWaC$mergeProps","$1eWaC$isIOS","startAdornment","endAdornment","inline","sizeClass","inputSizeClass","font","adornment","DEFAULT_INPUT_FONT_SIZE","KeyboardArrowUpIcon","KeyboardArrowDownIcon","locale","useLocale","inputFieldStyle","useNumberFieldState","groupProps","incrementButtonProps","decrementButtonProps","useNumberField","formVal","setFormVal","onInputChange","dimension","onBlurAndSubmit","useGrouping","interactable","resizeAction","actions","ResizeAction","executeAction","CheckIcon","getToolName","defaultCmp","allowCustom","messages","newCanvas","activeLoadState","setActiveLoadState","V","inset","getPositionClass","MaskPosition","getClassNameByPosition","doubleTapTimer","boundOnPointerDown","boundOnPointerUp","currentAction","initialAspectRatio","lastPosition","pageX","pageY","onPointerDown","bind","maintainInitialAspectRatio","newConfig","destroy","touchAction","userSelect","syncCurrentRectWithEl","listeners","onpointermove","onPointerMove","setPointerCapture","pointerId","extra","modifiers","reduce","modifier","translateVal","offsetWidth","offsetHeight","currentTarget","releasePointerCapture","handleDoubleTap","onDoubleTap","lockMovement","cr","pr","setIsMoving","controlConfig","cropzone","Interactable","MoveAction","constrainWithinBoundary","onMove","onResize","moving","hideTopLeft","hideTopRight","hideBottomLeft","hideBottomRight","ROTATION_HANDLE_CLASS","centerX","centerY","startAngle","rotateVal","rotation","parseFloat","getDragAngle","atan2","CustomDuplicateIcon","CustomFlipIcon","CustomFrontSortingIcon","CustomRemoveIcon","floatingControlsSize","FloatingObjectControls","isHidden","control","Icon","floatingControlsTopOffset","stage","canvasTopMargin","canvasLeftMargin","canvasRightMargin","canvasBottomMargin","maxTop","maxLeft","maxRight","maxBottom","boundingRect","floatingTop","floatingLeft","radiansToDegrees","newValues","delta","boxRef","floatingControlsRef","angleRad","enterEditing","hiddenTextarea","focus","interactableRef","objectControlConfig","activeObjId","objTypeConfig","getObjTypeConfig","RotateAction","onRotate","hideRotatingPoint","moveAction","unlockAspectRatio","objName","cropToolIsActive","objIsSelected","useGesture","createUseGesture","dragAction","pinchAction","CanvasWrapper","canvasRef","isVisible","setIsVisible","variants","delay","hidden","backgroundImage","onPinch","shouldHandleGesture","cancel","onDrag","pinching","scrollLeft","scrollTop","findTarget","actionBtn","selectedColor","presetBtns","HexColorPicker","DialogContext","triggerProps","trigger","context","toggle","targetRef","useOverlayTrigger","ModalWrapper","renderOverlay","query","supportsMatchMedia","matchMedia","setMatches","mq","useMediaQuery","mobileType","useIsMobileMediaQuery","useOverlayTriggerState","onOpenChange","content","unwrapChildren","$13nrU$useSlotId","$13nrU$useEffect","$13nrU$focusSafely","$13nrU$filterDOMProps","titleProps","dialogProps","useDialog","dismissButton","hasHeader","dialogChildren","DialogHeader","setSelectedColor","fieldProps","useField","labelElementType","onColorChange","newColor","$drHW0$useControlledState","$drHW0$useState","$drHW0$useRef","$drHW0$snapValueToStep","$drHW0$clamp","$axlgK$useLabel","$axlgK$useLocale","$axlgK$useGlobalListeners","$axlgK$useRef","$axlgK$useMove","$axlgK$clamp","$axlgK$setInteractionModality","$axlgK$mergeProps","$axlgK$useCallback","$axlgK$focusWithoutScrolling","$axlgK$useEffect","$axlgK$useFocusable","onChangeEnd","defaultValue","formatOptions","getValueLabel","showValueLabel","numberFormatter","useNumberFormatter","trackRef","sliderStateOptions","useSliderState","trackProps","outputProps","useSlider","wrapperClassname","getThumbValueLabel","getThumbPercent","thumbProps","useSliderThumb","isDragging","isThumbDragging","innerClassName","thumbColor","VisuallyHidden","$jmOdw$useMultipleSelectionState","$jmOdw$useMemo","$jmOdw$useCollection","$jmOdw$useEffect","$jmOdw$SelectionManager","$jmOdw$useControlledState","$1Y8YR$useMenuTriggerState","$1Y8YR$useSingleSelectListState","$1Y8YR$useState","$9GmRZ$useCollator","$9GmRZ$useMemo","$9GmRZ$ListKeyboardDelegate","$9GmRZ$useMenuTrigger","$9GmRZ$useTypeSelect","$9GmRZ$useField","$9GmRZ$filterDOMProps","$9GmRZ$mergeProps","$9GmRZ$useId","$9GmRZ$setInteractionModality","$9GmRZ$chain","$9GmRZ$useInteractionModality","$9GmRZ$useVisuallyHidden","$9GmRZ$react","dirClass","$9XpHW$filterDOMProps","$9XpHW$useSelectableList","$9XpHW$useFocusWithin","$9XpHW$useId","$9XpHW$useLabel","$9XpHW$mergeProps","$9XpHW$useSlotId","$9XpHW$isMac","$9XpHW$isWebKit","$9XpHW$getItemCount","$9XpHW$useSelectableItem","$9XpHW$useHover","$9XpHW$isFocusVisible","optionProps","useOption","isKeyboardModality","ListBox","refObj","listBoxProps","useListBox","mergedClassname","useSelectState","onSelectionChange","selectedKey","listboxRef","valueProps","errorMessageProps","useSelect","listbox","buttonWidth","setButtonWidth","HiddenSelect","selectedItem","selectedFilter","activeFilters","component","showColorPicker","$G86Z8$useSelectableItem","$G86Z8$useState","$G86Z8$useLayoutEffect","$G86Z8$getFocusableTreeWalker","$G86Z8$useLabels","$G86Z8$mergeProps","$G86Z8$useLocale","$G86Z8$useMemo","$G86Z8$useSelectableCollection","$G86Z8$useId","TabContext","tabContext","tabProps","useTab","textColor","FocusRing","selectedTab","setStyle","offsetLeft","tabState","tabListState","tablistRef","tabListProps","useTabList","$a9c3b$useSingleSelectListState","$a9c3b$useEffect","setSelectedTab","useTabListState","selectedTabEl","filterDOMProps","FormatUnderlinedIcon","FormatStrikethroughIcon","FormatItalicIcon","FormatAlignRightIcon","FormatAlignLeftIcon","FormatAlignCenterIcon","useIntl","styles","setStyles","newStyles","newAlign","factory","nodes","ListCollection","useCollection","suppressTextValueWarning","getItem","tabPanelProps","useTabPanel","DEFAULT_GRADIENTS","coords","colorStops","r1","r2","TextureIcon","GradientIcon","AddPhotoAlternateIcon","property","currentColor","dialogState","closeOverlay","previewBtnClass","previewBtns","previewUrl","Gradient","patternFromUrlOrData","unshift","newOpacity","outlineColor","outlineWidth","ImageIcon","setSrc","shadowDefaults","modifiedShadow","val","Shadow","activeOverlay","overlayCmp","getOverlay","CancelIcon","msg","ActiveOverlay","removeBtn","ScrollableView","gap","extendedChildren","isFirst","isLast","count","mergedClass","filterBtns","$lIBue$useControlledState","$dtb0o$usePress","$dtb0o$useFocusable","$dtb0o$mergeProps","$dtb0o$filterDOMProps","$g7Czo$useToggle","$g7Czo$useEffect","$g7Czo$useLabel","$g7Czo$filterDOMProps","$g7Czo$mergeProps","$g7Czo$useToggleState","CheckBoxOutlineBlankIcon","CheckboxFilledIcon","CheckboxGroupContext","checkedIcon","CheckedIcon","groupState","useCheckboxGroupItem","useCheckbox","useToggleState","disabledStyle","checked","LockIcon","LockOpenIcon","originalSize","onWidthChange","newVal","onHeightChange","onAspectChange","isChecked","onSubmit","selectedRatio","btns","preset","FlipIcon","RotateLeftIcon","RotateRightIcon","svgRef","minValue","maxValue","sliderState","FreeTransformTrack","numberOfDots","circles","CustomEllipseIcon","CustomCircleIcon","CustomSquareIcon","CustomTriangleIcon","shapeBtns","shapeIconMap","circle","square","triangle","ellipse","useActiveTheme","iterable","parentRef","virtualizer","useVirtual","horizontal","estimateSize","overscan","scrollToIndex","totalSize","virtualItems","virtualColumn","start","categories","selectedCategory","setSelectedCategory","categoryBtns","newCategory","frames","frameItems","activeClass","fontButtons","selectedFont","sizes","selectedSize","setSelectedSize","selectedType","setSelectedType","getBrushPreview","isDarkMode","dir","intl","navbarAnimation","overflowY","toolNav","getToolNav","navItems","clickHandler","activePanel","setActivePanel","TextField","useTextField","$lfBG4$useMemo","$lfBG4$useControlledState","$lfBG4$useState","$2aKPr$usePress","$2aKPr$useFocusable","$2aKPr$mergeProps","$2aKPr$filterDOMProps","$2aKPr$useLocale","$2aKPr$useLabel","$2aKPr$useFocusWithin","$2aKPr$getFocusableTreeWalker","$2aKPr$useId","RadioContext","RadioGroup","orientation","useRadioGroupState","radioGroupProps","useRadioGroup","useRadioProvider","selectedValue","useRadio","circleSize","circleColor","activeId","historyVisible","objectsVisible","ErrorOutlineIcon","toasts","handlers","useToaster","startPause","endPause","ariaProps","dismiss","Key","isMac","metaKey","ctrlKey","Z","isCtrlKeyPressed","shiftKey","ARROW_UP","ARROW_RIGHT","ARROW_DOWN","ARROW_LEFT","DELETE","activeLang","activeLanguage","languages","navPosition","menuPosition","uploadedFile","stageRef","defaultTool","onLoad","unobserveStage","observeSize","unobserveCanvas","transitionEnd","rootClassName","relative","showCloseIcon","showUnderlay","domAnimation","onKeyDownCapture","handleCanvasKeydown","enableBoundaryChecking","sentryDsn","dsn","integrations","BrowserTracing","tracesSampleRate","css","Error","container","defaultConfig","onOpen","setStateFromUrl","openTool","handler","notify","init","userOnLoad","instance"],"mappings":"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AAM,SACN,OAAM,SACL,MAAK,SAAU,MAAK,SACpB,MAAK,SAAU,MAAK,SACpB,MAAK,SAAU,MAAK,SACrB,OAAM,SACN,OAAM,SACN,OAAM,SACN,OAAM,SACN,OAAM,SACN,OAAM,SACN,OAAM,SACN,OAAM,SACN,OAAM,SACN,OAAM,SACN,OAAM,SACN,OAAM,SACN,OAAM,SACN,OAAM,SACN,OAAM,SACN,OAAM,SACN,OAAM,SACN,OAAM,SACN,OAAM,SACN,OAAM,SACN,OAAM,SACN,OAAM,SACL,MAAK,SAAU,MAAK,SACrB,OAAM,SACN,OAAM,SACN,OAAM,SACN,OAAM,SACL,MAAK,SAAU,MAAK,SACrB,OAAM,SACN,OAAM,SACL,MAAK,SAAU,MAAK,SACpB,MAAK,SAAU,MAAK,SACpB,MAAK,SAAU,MAAK,SACpB,MAAK,SAAU,MAAK,SACpB,MAAK,SAAU,MAAK,SACpB,MAAK,SAAU,MAAK,SACpB,MAAK,SAAU,MAAK,SACpB,MAAK,SAAU,MAAK,SACrB,OAAM,SACL,MAAK,SAAU,MAAK,SACpB,MAAK,SAAU,MAAK,SACrB,OAAM,SACN,OAAM,SACN,OAAM,SACN,OAAM,SACL,MAAK,SAAU,MAAK,SACrB,OAAM,SACN,OAAM,SACN,OAAM,SACN,OAAM,SACN,OAAM,SACL,MAAK,SAAU,MAAK,SACrB,OAAM,SACL,MAAK,SAAU,MAAK,SACrB,OAAM,SACN,OAAM,SACN,OAAM,SACN,OAAM,SACL,MAAK,SAAU,MAAK,SACrB,OAAM,SACN,OAAM,SACN,OAAM,SACN,OAAM,SACN,OAAM,SACN,OAAM,SACN,OAAM,SACN,OAAM,SACN,OAAM,SACN,OAAM,SACL,MAAK,SAAU,MAAK,SACrB,OAAM,SACL,MAAK,SAAU,MAAK,SACpB,MAAK,SAAU,MAAK,SACpB,MAAK,SAAU,MAAK,SACrB,OAAM,SACN,OAAM,SACN,OAAM,SACL,MAAK,SAAU,MAAK,SACpB,MAAK,SAAU,MAAK,SACrB,OAAM,SACL,MAAK,SAAU,MAAK,SACpB,MAAK,SAAU,MAAK,SACrB,OAAM,SACN,OAAM,SACN,OAAM,SACN,OAAM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NC,SAAS;AAAA,IACPE,MAAM;AAAA;AAAA,GAGV;AAAA,EACEJ,MAAM;AAAA,EACNC,MAAM;AAAA,EACNC,SAAS;AAAA,IACPE,MAAM;AAAA;AAAA,GAGV;AAAA,EACEJ,MAAM;AAAA,EACNC,MAAM;AAAA,EACNC,SAAS;AAAA,IACPE,MAAM;AAAA;AAAA;MCpFCI,gBAAgB,CAC3B,UACA,QACA,SACA,WACA,SACA,SACA,WACA,WACA,WACA,WACA,WACA,SACA,WACA,YACA,WACA,SACA,UACA,UACA,UACA,QACA,SACA,WACA,eACA,YACA,UACA,SACA,cACA,cACA,cACA,YACA,UACA,YACA,YACA,YACA,UACA,WACA,WACA,WACA,SACA,UACA,UACA,UACA,UACA,UACA,UACA,QACA,eACA,aACA,aACA,kBACA,UACA,SACA,QACA,SACA,SACA,OACA,YACA,QACA,WACA,SACA,WACA,WACA,SACA,UACA,YACA,UACA,QACA,eACA,eACA,eACA,eACA,aACA,UACA,UACA,QACA,WACA,WACA,WACA,WACA,SACA,YACA,UACA,WACA,YACA,YACA,YACA,YACA,YACA,YACA,YACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,SACA,gBACA,cACA,aACA,aACA,WACA,aACA,aACA,aACA,aACA,aACA,aACA,WACA,SACA,OACA,YACA,YACA,UACA,UACA,UACA,UACA,UACA,QACA,cACA,cACA,cACA,YACA,aACA,QACA,SACA,aACA,WACA,UACA,UACA,UACA,UACA,QACA,SACA,YACA,YACA,UACA,UACA,UACA,QACA,UACA,YACA,UACA,UACA,QACA,YACA,SACA,SACA,SACA,SACA,SACA,SACA,OACA,YACA,YACA,YACA,UACA,aACA,aACA,aACA,aACA,aACA,aACA,aACA,WACA,UACA,aACA,aACA,aACA,WACA,UACA,UACA,UACA,UACA,QACA,UACA,YACA,SACA,aACA,WACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,QACA,UACA,WACA,eACA,eACA,eACA,eACA,aACA,e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,KAAK,MAAM;AAGvC,IAAI,4BAA4B;AAChC,4BAA4B,KAAK,MAAM;AAGvC,IAAI,4BAA4B;AAChC,4BAA4B,KAAK,MAAM;AAGvC,IAAI,4BAA4B;AAChC,4BAA4B,KAAK,MAAM;AAGvC,IAAI,4BAA4B;AAChC,4BAA4B,KAAK,MAAM;AAGvC,IAAI,4BAA4B;AAChC,4BAA4B,KAAK,MAAM;AAGvC,IAAI,4BAA4B;AAChC,4BAA4B,KAAK,MAAM;AAGvC,IAAI,4BAA4B;AAChC,4BAA4B,KAAK,MAAM;AAGvC,IAAI,4BAA4B;AAChC,4BAA4B,KAAK,MAAM;AAGvC,IAAI,4BAA4B;AAChC,4BAA4B,KAAK,MAAM;AAGvC,IAAI,4BAA4B;AAChC,4BAA4B,KAAK,MAAM;AAGvC,IAAI,4BAA4B;AAChC,4BAA4B,KAAK,MAAM;AAGvC,IAAI,4BAA4B;AAChC,4BAA4B,KAAK,MAAM;AAGvC,IAAI,4BAA4B;AAChC,4BAA4B,KAAK,MAAM;AAGvC,IAAI,4BAA4B;AAChC,4BAA4B,KAAK,MAAM;AAGvC,IAAI,4BAA4B;AAChC,4BAA4B,KAAK,MAAM;AAGvC,IAAI,4BAA4B;AAChC,4BAA4B,KAAK,MAAM;AAGvC,IAAI,4BAA4B;AAChC,4BAA4B,KAAK,MAAM;AAGvC,IAAI,4BAA4B;AAChC,4BAA4B,KAAK,MAAM;AAGvC,IAAI,4BAA4B;AAChC,4BAA4B,KAAK,MAAM;AAGvC,IAAI,4BAA4B;AAChC,4BAA4B,KAAK,MAAM;AAGvC,IAAI,4BAA4B;AAChC,4BAA4B,KAAK,MAAM;AAGvC,IAAI,4BAA4B;AAChC,4BAA4B,KAAK,MAAM;AAGvC,IAAI,4BAA4B;AAChC,4BAA4B,KAAK,MAAM;AAGvC,IAAI,4BAA4B;AAChC,4BAA4B,KAAK,MAAM;AAGvC,IAAI,4BAA4B;AAChC,4BAA4B,KAAK,MAAM;AAGvC,IAAI,4BAA4B;AAChC,4BAA4B,KAAK,MAAM;AAGvC,IAAI,4BAA4B;AAChC,4BAA4B,KAAK,MAAM;AAGvC,IAAI,4BAA4B;AAChC,4BAA4B,KAAK,MAAM;AAGvC,IAAI,4BAA4B;AAChC,4BAA4B,KAAK,MAAM;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"}