{"version":3,"file":"nivo-annotations.mjs","sources":["../src/props.ts","../src/utils.ts","../src/compute.ts","../src/hooks.ts","../src/AnnotationNote.tsx","../src/AnnotationLink.tsx","../src/CircleAnnotationOutline.tsx","../src/DotAnnotationOutline.tsx","../src/RectAnnotationOutline.tsx","../src/Annotation.tsx","../src/canvas.ts"],"sourcesContent":["export const defaultProps = {\n    dotSize: 4,\n    noteWidth: 120,\n    noteTextOffset: 8,\n    animate: true,\n}\n","import {\n    AnnotationSpec,\n    CircleAnnotationSpec,\n    DotAnnotationSpec,\n    Note,\n    NoteCanvas,\n    NoteSvg,\n    RectAnnotationSpec,\n} from './types'\nimport { isValidElement } from 'react'\n\nexport const isSvgNote = <Datum>(note: Note<Datum>): note is NoteSvg<Datum> => {\n    const noteType = typeof note\n\n    return (\n        isValidElement(note) ||\n        noteType === 'string' ||\n        noteType === 'function' ||\n        noteType === 'object'\n    )\n}\n\nexport const isCanvasNote = <Datum>(note: Note<Datum>): note is NoteCanvas<Datum> => {\n    const noteType = typeof note\n\n    return noteType === 'string' || noteType === 'function'\n}\n\nexport const isCircleAnnotation = <Datum>(\n    annotationSpec: AnnotationSpec<Datum>\n): annotationSpec is CircleAnnotationSpec<Datum> => annotationSpec.type === 'circle'\n\nexport const isDotAnnotation = <Datum>(\n    annotationSpec: AnnotationSpec<Datum>\n): annotationSpec is DotAnnotationSpec<Datum> => annotationSpec.type === 'dot'\n\nexport const isRectAnnotation = <Datum>(\n    annotationSpec: AnnotationSpec<Datum>\n): annotationSpec is RectAnnotationSpec<Datum> => annotationSpec.type === 'rect'\n","import filter from 'lodash/filter.js'\nimport isNumber from 'lodash/isNumber.js'\nimport omit from 'lodash/omit.js'\nimport {\n    radiansToDegrees,\n    normalizeAngleDegrees,\n    degreesToRadians,\n    positionFromAngle,\n} from '@nivo/core'\nimport { defaultProps } from './props'\nimport {\n    AnnotationPositionGetter,\n    AnnotationDimensionsGetter,\n    BoundAnnotation,\n    AnnotationMatcher,\n    AnnotationInstructions,\n} from './types'\nimport { isCircleAnnotation, isRectAnnotation } from './utils'\n\nexport const bindAnnotations = <\n    Datum = {\n        x: number\n        y: number\n    },\n>({\n    data,\n    annotations,\n    getPosition,\n    getDimensions,\n}: {\n    data: readonly Datum[]\n    annotations: readonly AnnotationMatcher<Datum>[]\n    getPosition: AnnotationPositionGetter<Datum>\n    getDimensions: AnnotationDimensionsGetter<Datum>\n}): BoundAnnotation<Datum>[] =>\n    annotations.reduce((acc: BoundAnnotation<Datum>[], annotation) => {\n        const offset = annotation.offset || 0\n\n        return [\n            ...acc,\n            ...filter<Datum>(data, annotation.match).map(datum => {\n                const position = getPosition(datum)\n                const dimensions = getDimensions(datum)\n\n                if (isCircleAnnotation(annotation) || isRectAnnotation(annotation)) {\n                    dimensions.size = dimensions.size + offset * 2\n                    dimensions.width = dimensions.width + offset * 2\n                    dimensions.height = dimensions.height + offset * 2\n                }\n\n                // acc.push({\n                //     ...omit(annotation, ['match', 'offset']),\n                //     ...position,\n                //     ...dimensions,\n                //     size: annotation.size || dimensions.size,\n                //     datum,\n                // } as any)\n                // return [\n                //     ...acc,\n                //     {\n                //         ...omit(annotation, ['match', 'offset']),\n                //         ...position,\n                //         ...dimensions,\n                //         size: annotation.size || dimensions.size,\n                //         datum,\n                //     },\n                // ]\n                return {\n                    ...omit(annotation, ['match', 'offset']),\n                    ...position,\n                    ...dimensions,\n                    size: annotation.size || dimensions.size,\n                    datum,\n                } as Required<BoundAnnotation<Datum>>\n            }),\n        ]\n\n        // return acc\n    }, [])\n\nexport const getLinkAngle = (\n    sourceX: number,\n    sourceY: number,\n    targetX: number,\n    targetY: number\n) => {\n    const angle = Math.atan2(targetY - sourceY, targetX - sourceX)\n\n    return normalizeAngleDegrees(radiansToDegrees(angle))\n}\n\nexport const computeAnnotation = <Datum>(\n    annotation: BoundAnnotation<Datum>\n): AnnotationInstructions => {\n    const {\n        x,\n        y,\n        noteX,\n        noteY,\n        noteWidth = defaultProps.noteWidth,\n        noteTextOffset = defaultProps.noteTextOffset,\n    } = annotation\n\n    let computedNoteX: number\n    let computedNoteY: number\n\n    if (isNumber(noteX)) {\n        computedNoteX = x + noteX\n    } else if (noteX.abs !== undefined) {\n        computedNoteX = noteX.abs\n    } else {\n        throw new Error(`noteX should be either a number or an object containing an 'abs' property`)\n    }\n\n    if (isNumber(noteY)) {\n        computedNoteY = y + noteY\n    } else if (noteY.abs !== undefined) {\n        computedNoteY = noteY.abs\n    } else {\n        throw new Error(`noteY should be either a number or an object containing an 'abs' property`)\n    }\n\n    let computedX = x\n    let computedY = y\n\n    const angle = getLinkAngle(x, y, computedNoteX, computedNoteY)\n\n    if (isCircleAnnotation<Datum>(annotation)) {\n        const position = positionFromAngle(degreesToRadians(angle), annotation.size / 2)\n        computedX += position.x\n        computedY += position.y\n    }\n\n    if (isRectAnnotation<Datum>(annotation)) {\n        const eighth = Math.round((angle + 90) / 45) % 8\n        if (eighth === 0) {\n            computedY -= annotation.height / 2\n        }\n        if (eighth === 1) {\n            computedX += annotation.width / 2\n            computedY -= annotation.height / 2\n        }\n        if (eighth === 2) {\n            computedX += annotation.width / 2\n        }\n        if (eighth === 3) {\n            computedX += annotation.width / 2\n            computedY += annotation.height / 2\n        }\n        if (eighth === 4) {\n            computedY += annotation.height / 2\n        }\n        if (eighth === 5) {\n            computedX -= annotation.width / 2\n            computedY += annotation.height / 2\n        }\n        if (eighth === 6) {\n            computedX -= annotation.width / 2\n        }\n        if (eighth === 7) {\n            computedX -= annotation.width / 2\n            computedY -= annotation.height / 2\n        }\n    }\n\n    let textX = computedNoteX\n    const textY = computedNoteY - noteTextOffset\n\n    let noteLineX = computedNoteX\n    const noteLineY = computedNoteY\n\n    if ((angle + 90) % 360 > 180) {\n        textX -= noteWidth\n        noteLineX -= noteWidth\n    } else {\n        noteLineX += noteWidth\n    }\n\n    return {\n        points: [\n            [computedX, computedY],\n            [computedNoteX, computedNoteY],\n            [noteLineX, noteLineY],\n        ] as [number, number][],\n        text: [textX, textY],\n        angle: angle + 90,\n    }\n}\n","import { useMemo } from 'react'\nimport { bindAnnotations, computeAnnotation } from './compute'\nimport {\n    AnnotationDimensionsGetter,\n    AnnotationMatcher,\n    AnnotationPositionGetter,\n    BoundAnnotation,\n} from './types'\n\n/**\n * Bind annotations to a dataset.\n */\nexport const useAnnotations = <Datum>({\n    data,\n    annotations,\n    getPosition,\n    getDimensions,\n}: {\n    data: readonly Datum[]\n    annotations: readonly AnnotationMatcher<Datum>[]\n    getPosition: AnnotationPositionGetter<Datum>\n    getDimensions: AnnotationDimensionsGetter<Datum>\n}) =>\n    useMemo(\n        () =>\n            bindAnnotations<Datum>({\n                data,\n                annotations,\n                getPosition,\n                getDimensions,\n            }),\n        [data, annotations, getPosition, getDimensions]\n    )\n\nexport const useComputedAnnotations = <Datum>({\n    annotations,\n}: {\n    annotations: readonly BoundAnnotation<Datum>[]\n}) =>\n    useMemo(\n        () =>\n            annotations.map(annotation => ({\n                ...annotation,\n                computed: computeAnnotation<Datum>({\n                    ...annotation,\n                }),\n            })),\n        [annotations]\n    )\n\nexport const useComputedAnnotation = <Datum>(annotation: BoundAnnotation<Datum>) =>\n    useMemo(() => computeAnnotation<Datum>(annotation), [annotation])\n","import { createElement } from 'react'\nimport omit from 'lodash/omit.js'\nimport { useSpring, animated } from '@react-spring/web'\nimport { useMotionConfig } from '@nivo/core'\nimport { useTheme } from '@nivo/theming'\nimport { NoteSvg } from './types'\n\nexport const AnnotationNote = <Datum,>({\n    datum,\n    x,\n    y,\n    note,\n}: {\n    datum: Datum\n    x: number\n    y: number\n    note: NoteSvg<Datum>\n}) => {\n    const theme = useTheme()\n    const { animate, config: springConfig } = useMotionConfig()\n\n    const animatedProps = useSpring({\n        x,\n        y,\n        config: springConfig,\n        immediate: !animate,\n    })\n\n    if (typeof note === 'function') {\n        return createElement(note, { x, y, datum })\n    }\n\n    return (\n        <>\n            {theme.annotations.text.outlineWidth > 0 && (\n                <animated.text\n                    x={animatedProps.x}\n                    y={animatedProps.y}\n                    style={{\n                        ...theme.annotations.text,\n                        strokeLinejoin: 'round',\n                        strokeWidth: theme.annotations.text.outlineWidth * 2,\n                        stroke: theme.annotations.text.outlineColor,\n                    }}\n                >\n                    {note}\n                </animated.text>\n            )}\n            <animated.text\n                x={animatedProps.x}\n                y={animatedProps.y}\n                style={omit(theme.annotations.text, ['outlineWidth', 'outlineColor'])}\n            >\n                {note}\n            </animated.text>\n        </>\n    )\n}\n","import { useMemo } from 'react'\nimport { animated } from '@react-spring/web'\nimport { useAnimatedPath } from '@nivo/core'\nimport { useTheme } from '@nivo/theming'\n\nexport const AnnotationLink = ({\n    points,\n    isOutline = false,\n}: {\n    points: [number, number][]\n    isOutline?: boolean\n}) => {\n    const theme = useTheme()\n\n    const path = useMemo(() => {\n        const [firstPoint, ...otherPoints] = points\n\n        return otherPoints.reduce(\n            (acc, [x, y]) => `${acc} L${x},${y}`,\n            `M${firstPoint[0]},${firstPoint[1]}`\n        )\n    }, [points])\n\n    const animatedPath = useAnimatedPath(path)\n\n    if (isOutline && theme.annotations.link.outlineWidth <= 0) {\n        return null\n    }\n\n    const style = { ...theme.annotations.link }\n    if (isOutline) {\n        style.strokeLinecap = 'square'\n        style.strokeWidth =\n            theme.annotations.link.strokeWidth + theme.annotations.link.outlineWidth * 2\n        style.stroke = theme.annotations.link.outlineColor\n        style.opacity = theme.annotations.link.outlineOpacity\n    }\n\n    return <animated.path fill=\"none\" d={animatedPath} style={style} />\n}\n","import { useSpring, animated } from '@react-spring/web'\nimport { useMotionConfig } from '@nivo/core'\nimport { useTheme } from '@nivo/theming'\n\nexport const CircleAnnotationOutline = ({ x, y, size }: { x: number; y: number; size: number }) => {\n    const theme = useTheme()\n    const { animate, config: springConfig } = useMotionConfig()\n\n    const animatedProps = useSpring({\n        x,\n        y,\n        radius: size / 2,\n        config: springConfig,\n        immediate: !animate,\n    })\n\n    return (\n        <>\n            {theme.annotations.outline.outlineWidth > 0 && (\n                <animated.circle\n                    cx={animatedProps.x}\n                    cy={animatedProps.y}\n                    r={animatedProps.radius}\n                    style={{\n                        ...theme.annotations.outline,\n                        fill: 'none',\n                        strokeWidth:\n                            theme.annotations.outline.strokeWidth +\n                            theme.annotations.outline.outlineWidth * 2,\n                        stroke: theme.annotations.outline.outlineColor,\n                        opacity: theme.annotations.outline.outlineOpacity,\n                    }}\n                />\n            )}\n            <animated.circle\n                cx={animatedProps.x}\n                cy={animatedProps.y}\n                r={animatedProps.radius}\n                style={theme.annotations.outline}\n            />\n        </>\n    )\n}\n","import { useSpring, animated } from '@react-spring/web'\nimport { useMotionConfig } from '@nivo/core'\nimport { useTheme } from '@nivo/theming'\nimport { defaultProps } from './props'\n\nexport const DotAnnotationOutline = ({\n    x,\n    y,\n    size = defaultProps.dotSize,\n}: {\n    x: number\n    y: number\n    size?: number\n}) => {\n    const theme = useTheme()\n    const { animate, config: springConfig } = useMotionConfig()\n\n    const animatedProps = useSpring({\n        x,\n        y,\n        radius: size / 2,\n        config: springConfig,\n        immediate: !animate,\n    })\n\n    return (\n        <>\n            {theme.annotations.outline.outlineWidth > 0 && (\n                <animated.circle\n                    cx={animatedProps.x}\n                    cy={animatedProps.y}\n                    r={animatedProps.radius}\n                    style={{\n                        ...theme.annotations.outline,\n                        fill: 'none',\n                        strokeWidth: theme.annotations.outline.outlineWidth * 2,\n                        stroke: theme.annotations.outline.outlineColor,\n                        opacity: theme.annotations.outline.outlineOpacity,\n                    }}\n                />\n            )}\n            <animated.circle\n                cx={animatedProps.x}\n                cy={animatedProps.y}\n                r={animatedProps.radius}\n                style={theme.annotations.symbol}\n            />\n        </>\n    )\n}\n","import { useSpring, animated } from '@react-spring/web'\nimport { useMotionConfig } from '@nivo/core'\nimport { useTheme } from '@nivo/theming'\n\nexport const RectAnnotationOutline = ({\n    x,\n    y,\n    width,\n    height,\n    borderRadius = 6,\n}: {\n    x: number\n    y: number\n    width: number\n    height: number\n    borderRadius?: number\n}) => {\n    const theme = useTheme()\n    const { animate, config: springConfig } = useMotionConfig()\n\n    const animatedProps = useSpring({\n        x: x - width / 2,\n        y: y - height / 2,\n        width,\n        height,\n        config: springConfig,\n        immediate: !animate,\n    })\n\n    return (\n        <>\n            {theme.annotations.outline.outlineWidth > 0 && (\n                <animated.rect\n                    x={animatedProps.x}\n                    y={animatedProps.y}\n                    rx={borderRadius}\n                    ry={borderRadius}\n                    width={animatedProps.width}\n                    height={animatedProps.height}\n                    style={{\n                        ...theme.annotations.outline,\n                        fill: 'none',\n                        strokeWidth:\n                            theme.annotations.outline.strokeWidth +\n                            theme.annotations.outline.outlineWidth * 2,\n                        stroke: theme.annotations.outline.outlineColor,\n                        opacity: theme.annotations.outline.outlineOpacity,\n                    }}\n                />\n            )}\n            <animated.rect\n                x={animatedProps.x}\n                y={animatedProps.y}\n                rx={borderRadius}\n                ry={borderRadius}\n                width={animatedProps.width}\n                height={animatedProps.height}\n                style={theme.annotations.outline}\n            />\n        </>\n    )\n}\n","import { useComputedAnnotation } from './hooks'\nimport { AnnotationNote } from './AnnotationNote'\nimport { AnnotationLink } from './AnnotationLink'\nimport { CircleAnnotationOutline } from './CircleAnnotationOutline'\nimport { DotAnnotationOutline } from './DotAnnotationOutline'\nimport { RectAnnotationOutline } from './RectAnnotationOutline'\nimport { BoundAnnotation } from './types'\nimport { isCircleAnnotation, isDotAnnotation, isRectAnnotation, isSvgNote } from './utils'\n\nexport const Annotation = <Datum,>(annotation: BoundAnnotation<Datum>) => {\n    const { datum, x, y, note } = annotation\n    const computed = useComputedAnnotation(annotation)\n\n    if (!isSvgNote(note)) {\n        throw new Error('note should be a valid react element')\n    }\n\n    return (\n        <>\n            <AnnotationLink points={computed.points} isOutline={true} />\n            {isCircleAnnotation(annotation) && (\n                <CircleAnnotationOutline x={x} y={y} size={annotation.size} />\n            )}\n            {isDotAnnotation(annotation) && (\n                <DotAnnotationOutline x={x} y={y} size={annotation.size} />\n            )}\n            {isRectAnnotation(annotation) && (\n                <RectAnnotationOutline\n                    x={x}\n                    y={y}\n                    width={annotation.width}\n                    height={annotation.height}\n                    borderRadius={annotation.borderRadius}\n                />\n            )}\n            <AnnotationLink points={computed.points} />\n            <AnnotationNote datum={datum} x={computed.text[0]} y={computed.text[1]} note={note} />\n        </>\n    )\n}\n","import { Theme } from '@nivo/theming'\nimport { ComputedAnnotation } from './types'\nimport { isCanvasNote, isCircleAnnotation, isDotAnnotation, isRectAnnotation } from './utils'\n\nconst drawPoints = (ctx: CanvasRenderingContext2D, points: [number, number][]) => {\n    points.forEach(([x, y], index) => {\n        if (index === 0) {\n            ctx.moveTo(x, y)\n        } else {\n            ctx.lineTo(x, y)\n        }\n    })\n}\n\nexport const renderAnnotationsToCanvas = <Datum>(\n    ctx: CanvasRenderingContext2D,\n    {\n        annotations,\n        theme,\n    }: {\n        annotations: ComputedAnnotation<Datum>[]\n        theme: Theme\n    }\n) => {\n    if (annotations.length === 0) return\n\n    ctx.save()\n    annotations.forEach(annotation => {\n        if (!isCanvasNote(annotation.note)) {\n            throw new Error('note is invalid for canvas implementation')\n        }\n\n        if (theme.annotations.link.outlineWidth > 0) {\n            ctx.lineCap = 'square'\n            ctx.strokeStyle = theme.annotations.link.outlineColor\n            ctx.lineWidth =\n                theme.annotations.link.strokeWidth + theme.annotations.link.outlineWidth * 2\n            ctx.beginPath()\n            drawPoints(ctx, annotation.computed.points)\n            ctx.stroke()\n            ctx.lineCap = 'butt'\n        }\n\n        if (isCircleAnnotation(annotation) && theme.annotations.outline.outlineWidth > 0) {\n            ctx.strokeStyle = theme.annotations.outline.outlineColor\n            ctx.lineWidth =\n                theme.annotations.outline.strokeWidth + theme.annotations.outline.outlineWidth * 2\n            ctx.beginPath()\n            ctx.arc(annotation.x, annotation.y, annotation.size / 2, 0, 2 * Math.PI)\n            ctx.stroke()\n        }\n\n        if (isDotAnnotation(annotation) && theme.annotations.symbol.outlineWidth > 0) {\n            ctx.strokeStyle = theme.annotations.symbol.outlineColor\n            ctx.lineWidth = theme.annotations.symbol.outlineWidth * 2\n            ctx.beginPath()\n            ctx.arc(annotation.x, annotation.y, annotation.size / 2, 0, 2 * Math.PI)\n            ctx.stroke()\n        }\n\n        if (isRectAnnotation(annotation) && theme.annotations.outline.outlineWidth > 0) {\n            ctx.strokeStyle = theme.annotations.outline.outlineColor\n            ctx.lineWidth =\n                theme.annotations.outline.strokeWidth + theme.annotations.outline.outlineWidth * 2\n            ctx.beginPath()\n            ctx.rect(\n                annotation.x - annotation.width / 2,\n                annotation.y - annotation.height / 2,\n                annotation.width,\n                annotation.height\n            )\n            ctx.stroke()\n        }\n\n        ctx.strokeStyle = theme.annotations.link.stroke\n        ctx.lineWidth = theme.annotations.link.strokeWidth\n        ctx.beginPath()\n        drawPoints(ctx, annotation.computed.points)\n        ctx.stroke()\n\n        if (isCircleAnnotation(annotation)) {\n            ctx.strokeStyle = theme.annotations.outline.stroke\n            ctx.lineWidth = theme.annotations.outline.strokeWidth\n            ctx.beginPath()\n            ctx.arc(annotation.x, annotation.y, annotation.size / 2, 0, 2 * Math.PI)\n            ctx.stroke()\n        }\n\n        if (isDotAnnotation(annotation)) {\n            ctx.fillStyle = theme.annotations.symbol.fill\n            ctx.beginPath()\n            ctx.arc(annotation.x, annotation.y, annotation.size / 2, 0, 2 * Math.PI)\n            ctx.fill()\n        }\n\n        if (isRectAnnotation(annotation)) {\n            ctx.strokeStyle = theme.annotations.outline.stroke\n            ctx.lineWidth = theme.annotations.outline.strokeWidth\n            ctx.beginPath()\n            ctx.rect(\n                annotation.x - annotation.width / 2,\n                annotation.y - annotation.height / 2,\n                annotation.width,\n                annotation.height\n            )\n            ctx.stroke()\n        }\n\n        if (typeof annotation.note === 'function') {\n            annotation.note(ctx, {\n                datum: annotation.datum,\n                x: annotation.computed.text[0],\n                y: annotation.computed.text[1],\n                theme,\n            })\n        } else {\n            ctx.font = `${theme.annotations.text.fontSize}px ${theme.annotations.text.fontFamily}`\n            ctx.textAlign = 'left'\n            ctx.textBaseline = 'alphabetic'\n\n            ctx.fillStyle = theme.annotations.text.fill\n            ctx.strokeStyle = theme.annotations.text.outlineColor\n            ctx.lineWidth = theme.annotations.text.outlineWidth * 2\n\n            if (theme.annotations.text.outlineWidth > 0) {\n                ctx.lineJoin = 'round'\n                ctx.strokeText(\n                    annotation.note,\n                    annotation.computed.text[0],\n                    annotation.computed.text[1]\n                )\n                ctx.lineJoin = 'miter'\n            }\n            ctx.fillText(annotation.note, annotation.computed.text[0], annotation.computed.text[1])\n        }\n    })\n    ctx.restore()\n}\n"],"names":["defaultProps","dotSize","noteWidth","noteTextOffset","animate","isSvgNote","note","noteType","isValidElement","isCanvasNote","isCircleAnnotation","annotationSpec","type","isDotAnnotation","isRectAnnotation","bindAnnotations","_ref","data","annotations","getPosition","getDimensions","reduce","acc","annotation","offset","concat","filter","match","map","datum","position","dimensions","size","width","height","_extends","omit","getLinkAngle","sourceX","sourceY","targetX","targetY","angle","Math","atan2","normalizeAngleDegrees","radiansToDegrees","computeAnnotation","computedNoteX","computedNoteY","x","y","noteX","noteY","_annotation$noteWidth","_annotation$noteTextO","isNumber","undefined","abs","Error","computedX","computedY","positionFromAngle","degreesToRadians","eighth","round","textX","noteLineX","points","text","useAnnotations","useMemo","useComputedAnnotations","_ref2","computed","useComputedAnnotation","AnnotationNote","theme","useTheme","_useMotionConfig","useMotionConfig","springConfig","config","animatedProps","useSpring","immediate","createElement","_jsxs","_Fragment","children","outlineWidth","_jsx","animated","style","strokeLinejoin","strokeWidth","stroke","outlineColor","AnnotationLink","_ref$isOutline","isOutline","path","firstPoint","slice","animatedPath","useAnimatedPath","link","strokeLinecap","opacity","outlineOpacity","fill","d","CircleAnnotationOutline","radius","outline","circle","cx","cy","r","DotAnnotationOutline","_ref$size","symbol","RectAnnotationOutline","_ref$borderRadius","borderRadius","rect","rx","ry","Annotation","drawPoints","ctx","forEach","index","moveTo","lineTo","renderAnnotationsToCanvas","length","save","lineCap","strokeStyle","lineWidth","beginPath","arc","PI","fillStyle","font","fontSize","fontFamily","textAlign","textBaseline","lineJoin","strokeText","fillText","restore"],"mappings":"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"}