{"version":3,"file":"SmoothShader.mjs","sources":["../src/SmoothShader.ts"],"sourcesContent":["import { Program, Shader } from '@pixi/core';\nimport { IGraphicsBatchSettings } from './core/BatchDrawCall';\n\nconst smoothVert = `#version 100\nprecision highp float;\nconst float FILL = 1.0;\nconst float BEVEL = 4.0;\nconst float MITER = 8.0;\nconst float ROUND = 12.0;\nconst float JOINT_CAP_BUTT = 16.0;\nconst float JOINT_CAP_SQUARE = 18.0;\nconst float JOINT_CAP_ROUND = 20.0;\n\nconst float FILL_EXPAND = 24.0;\n\nconst float CAP_BUTT = 1.0;\nconst float CAP_SQUARE = 2.0;\nconst float CAP_ROUND = 3.0;\nconst float CAP_BUTT2 = 4.0;\n\nconst float MITER_LIMIT = 10.0;\n\n// === geom ===\nattribute vec2 aPrev;\nattribute vec2 aPoint1;\nattribute vec2 aPoint2;\nattribute vec2 aNext;\nattribute float aVertexJoint;\nattribute float aTravel;\n\nuniform mat3 projectionMatrix;\nuniform mat3 translationMatrix;\nuniform vec4 tint;\n\nvarying vec4 vLine1;\nvarying vec4 vLine2;\nvarying vec4 vArc;\nvarying float vType;\n\nuniform float resolution;\nuniform float expand;\n\n// === style ===\nattribute float aStyleId;\nattribute vec4 aColor;\n\nvarying float vTextureId;\nvarying vec4 vColor;\nvarying vec2 vTextureCoord;\nvarying vec2 vTravel;\n\nuniform vec2 styleLine[%MAX_STYLES%];\nuniform vec3 styleMatrix[2 * %MAX_STYLES%];\nuniform float styleTextureId[%MAX_STYLES%];\nuniform vec2 samplerSize[%MAX_TEXTURES%];\n\nvec2 doBisect(vec2 norm, float len, vec2 norm2, float len2,\n    float dy, float inner) {\n    vec2 bisect = (norm + norm2) / 2.0;\n    bisect /= dot(norm, bisect);\n    vec2 shift = dy * bisect;\n    if (inner > 0.5) {\n        if (len < len2) {\n            if (abs(dy * (bisect.x * norm.y - bisect.y * norm.x)) > len) {\n                return dy * norm;\n            }\n        } else {\n            if (abs(dy * (bisect.x * norm2.y - bisect.y * norm2.x)) > len2) {\n                return dy * norm;\n            }\n        }\n    }\n    return dy * bisect;\n}\n\nvoid main(void){\n    vec2 pointA = (translationMatrix * vec3(aPoint1, 1.0)).xy;\n    vec2 pointB = (translationMatrix * vec3(aPoint2, 1.0)).xy;\n\n    vec2 xBasis = pointB - pointA;\n    float len = length(xBasis);\n    vec2 forward = xBasis / len;\n    vec2 norm = vec2(forward.y, -forward.x);\n\n    float type = floor(aVertexJoint / 16.0);\n    float vertexNum = aVertexJoint - type * 16.0;\n    float dx = 0.0, dy = 1.0;\n\n    float capType = floor(type / 32.0);\n    type -= capType * 32.0;\n\n    int styleId = int(aStyleId + 0.5);\n    float lineWidth = styleLine[styleId].x;\n    vTextureId = floor(styleTextureId[styleId] / 4.0);\n    float scaleMode = styleTextureId[styleId] - vTextureId * 4.0;\n    float avgScale = 1.0;\n    if (scaleMode > 2.5) {\n        avgScale = length(translationMatrix * vec3(1.0, 0.0, 0.0));\n    } else if (scaleMode > 1.5) {\n        avgScale = length(translationMatrix * vec3(0.0, 1.0, 0.0));\n    } else if (scaleMode > 0.5) {\n        vec2 avgDiag = (translationMatrix * vec3(1.0, 1.0, 0.0)).xy;\n        avgScale = sqrt(dot(avgDiag, avgDiag) * 0.5);\n    }\n    lineWidth *= 0.5 * avgScale;\n    float lineAlignment = 2.0 * styleLine[styleId].y - 1.0;\n    vTextureCoord = vec2(0.0);\n\n    vec2 pos;\n\n    if (capType == CAP_ROUND) {\n        vertexNum += 4.0;\n        type = JOINT_CAP_ROUND;\n        capType = 0.0;\n        lineAlignment = -lineAlignment;\n    }\n\n    vLine1 = vec4(0.0, 10.0, 1.0, 0.0);\n    vLine2 = vec4(0.0, 10.0, 1.0, 0.0);\n    vArc = vec4(0.0);\n    if (type == FILL) {\n        pos = pointA;\n        vType = 0.0;\n        vLine2 = vec4(-2.0, -2.0, -2.0, 0.0);\n        vec2 vTexturePixel;\n        vTexturePixel.x = dot(vec3(aPoint1, 1.0), styleMatrix[styleId * 2]);\n        vTexturePixel.y = dot(vec3(aPoint1, 1.0), styleMatrix[styleId * 2 + 1]);\n        vTextureCoord = vTexturePixel / samplerSize[int(vTextureId)];\n    } else if (type >= FILL_EXPAND && type < FILL_EXPAND + 7.5) {\n        // expand vertices\n        float flags = type - FILL_EXPAND;\n        float flag3 = floor(flags / 4.0);\n        float flag2 = floor((flags - flag3 * 4.0) / 2.0);\n        float flag1 = flags - flag3 * 4.0 - flag2 * 2.0;\n\n        vec2 prev = (translationMatrix * vec3(aPrev, 1.0)).xy;\n\n        if (vertexNum < 0.5) {\n            pos = prev;\n        } else if (vertexNum < 1.5) {\n            pos = pointA;\n        } else {\n            pos = pointB;\n        }\n        float len2 = length(aNext);\n        vec2 bisect = (translationMatrix * vec3(aNext, 0.0)).xy;\n        if (len2 > 0.01) {\n            bisect = normalize(bisect) * len2;\n        }\n\n        vec2 n1 = normalize(vec2(pointA.y - prev.y, -(pointA.x - prev.x)));\n        vec2 n2 = normalize(vec2(pointB.y - pointA.y, -(pointB.x - pointA.x)));\n        vec2 n3 = normalize(vec2(prev.y - pointB.y, -(prev.x - pointB.x)));\n\n        if (n1.x * n2.y - n1.y * n2.x < 0.0) {\n            n1 = -n1;\n            n2 = -n2;\n            n3 = -n3;\n        }\n        pos += bisect * expand;\n\n        vLine1 = vec4(16.0, 16.0, 16.0, -1.0);\n        if (flag1 > 0.5) {\n            vLine1.x = -dot(pos - prev, n1);\n        }\n        if (flag2 > 0.5) {\n            vLine1.y = -dot(pos - pointA, n2);\n        }\n        if (flag3 > 0.5) {\n            vLine1.z = -dot(pos - pointB, n3);\n        }\n        vLine1.xyz *= resolution;\n        vType = 2.0;\n    } else if (type >= BEVEL) {\n        float dy = lineWidth + expand;\n        float shift = lineWidth * lineAlignment;\n        float inner = 0.0;\n        if (vertexNum >= 1.5) {\n            dy = -dy;\n            inner = 1.0;\n        }\n\n        vec2 base, next, xBasis2, bisect;\n        float flag = 0.0;\n        float side2 = 1.0;\n        if (vertexNum < 0.5 || vertexNum > 2.5 && vertexNum < 3.5) {\n            next = (translationMatrix * vec3(aPrev, 1.0)).xy;\n            base = pointA;\n            flag = type - floor(type / 2.0) * 2.0;\n            side2 = -1.0;\n        } else {\n            next = (translationMatrix * vec3(aNext, 1.0)).xy;\n            base = pointB;\n            if (type >= MITER && type < MITER + 3.5) {\n                flag = step(MITER + 1.5, type);\n                // check miter limit here?\n            }\n        }\n        xBasis2 = next - base;\n        float len2 = length(xBasis2);\n        vec2 norm2 = vec2(xBasis2.y, -xBasis2.x) / len2;\n        float D = norm.x * norm2.y - norm.y * norm2.x;\n        if (D < 0.0) {\n            inner = 1.0 - inner;\n        }\n\n        norm2 *= side2;\n\n        float collinear = step(0.0, dot(norm, norm2));\n\n        vType = 0.0;\n        float dy2 = -1000.0;\n\n        if (abs(D) < 0.01 && collinear < 0.5) {\n            if (type >= ROUND && type < ROUND + 1.5) {\n                type = JOINT_CAP_ROUND;\n            }\n            //TODO: BUTT here too\n        }\n\n        vLine1 = vec4(0.0, lineWidth, max(abs(norm.x), abs(norm.y)), min(abs(norm.x), abs(norm.y)));\n        vLine2 = vec4(0.0, lineWidth, max(abs(norm2.x), abs(norm2.y)), min(abs(norm2.x), abs(norm2.y)));\n\n        if (vertexNum < 3.5) {\n            if (abs(D) < 0.01 && collinear < 0.5) {\n                pos = (shift + dy) * norm;\n            } else {\n                if (flag < 0.5 && inner < 0.5) {\n                    pos = (shift + dy) * norm;\n                } else {\n                    pos = doBisect(norm, len, norm2, len2, shift + dy, inner);\n                }\n            }\n            vLine2.y = -1000.0;\n            if (capType >= CAP_BUTT && capType < CAP_ROUND) {\n                float extra = step(CAP_SQUARE, capType) * lineWidth;\n                vec2 back = -forward;\n                if (vertexNum < 0.5 || vertexNum > 2.5) {\n                    pos += back * (expand + extra);\n                    dy2 = expand;\n                } else {\n                    dy2 = dot(pos + base - pointA, back) - extra;\n                }\n            }\n            if (type >= JOINT_CAP_BUTT && type < JOINT_CAP_SQUARE + 0.5) {\n                float extra = step(JOINT_CAP_SQUARE, type) * lineWidth;\n                if (vertexNum < 0.5 || vertexNum > 2.5) {\n                    vLine2.y = dot(pos + base - pointB, forward) - extra;\n                } else {\n                    pos += forward * (expand + extra);\n                    vLine2.y = expand;\n                    if (capType >= CAP_BUTT) {\n                        dy2 -= expand + extra;\n                    }\n                }\n            }\n        } else if (type >= JOINT_CAP_ROUND && type < JOINT_CAP_ROUND + 1.5) {\n            base += shift * norm;\n            if (inner > 0.5) {\n                dy = -dy;\n                inner = 0.0;\n            }\n            vec2 d2 = abs(dy) * forward;\n            if (vertexNum < 4.5) {\n                dy = -dy;\n                pos = dy * norm;\n            } else if (vertexNum < 5.5) {\n                pos = dy * norm;\n            } else if (vertexNum < 6.5) {\n                pos = dy * norm + d2;\n                vArc.x = abs(dy);\n            } else {\n                dy = -dy;\n                pos = dy * norm + d2;\n                vArc.x = abs(dy);\n            }\n            vLine2 = vec4(0.0, lineWidth * 2.0 + 10.0, 1.0  , 0.0); // forget about line2 with type=3\n            vArc.y = dy;\n            vArc.z = 0.0;\n            vArc.w = lineWidth;\n            vType = 3.0;\n        } else if (abs(D) < 0.01 && collinear < 0.5) {\n            pos = dy * norm;\n        } else {\n            if (inner > 0.5) {\n                dy = -dy;\n                inner = 0.0;\n            }\n            float side = sign(dy);\n            vec2 norm3 = normalize(norm + norm2);\n\n            if (type >= MITER && type < MITER + 3.5) {\n                vec2 farVertex = doBisect(norm, len, norm2, len2, shift + dy, 0.0);\n                if (length(farVertex) > abs(shift + dy) * MITER_LIMIT) {\n                    type = BEVEL;\n                }\n            }\n\n            if (vertexNum < 4.5) {\n                pos = doBisect(norm, len, norm2, len2, shift - dy, 1.0);\n            } else if (vertexNum < 5.5) {\n                pos = (shift + dy) * norm;\n            } else if (vertexNum > 7.5) {\n                pos = (shift + dy) * norm2;\n            } else {\n                if (type >= ROUND && type < ROUND + 1.5) {\n                    pos = doBisect(norm, len, norm2, len2, shift + dy, 0.0);\n                    float d2 = abs(shift + dy);\n                    if (length(pos) > abs(shift + dy) * 1.5) {\n                        if (vertexNum < 6.5) {\n                            pos.x = (shift + dy) * norm.x - d2 * norm.y;\n                            pos.y = (shift + dy) * norm.y + d2 * norm.x;\n                        } else {\n                            pos.x = (shift + dy) * norm2.x + d2 * norm2.y;\n                            pos.y = (shift + dy) * norm2.y - d2 * norm2.x;\n                        }\n                    }\n                } else if (type >= MITER && type < MITER + 3.5) {\n                    pos = doBisect(norm, len, norm2, len2, shift + dy, 0.0); //farVertex\n                } else if (type >= BEVEL && type < BEVEL + 1.5) {\n                    float d2 = side / resolution;\n                    if (vertexNum < 6.5) {\n                        pos = (shift + dy) * norm + d2 * norm3;\n                    } else {\n                        pos = (shift + dy) * norm2 + d2 * norm3;\n                    }\n                }\n            }\n\n            if (type >= ROUND && type < ROUND + 1.5) {\n                vArc.x = side * dot(pos, norm3);\n                vArc.y = pos.x * norm3.y - pos.y * norm3.x;\n                vArc.z = dot(norm, norm3) * (lineWidth + side * shift);\n                vArc.w = lineWidth + side * shift;\n                vType = 3.0;\n            } else if (type >= MITER && type < MITER + 3.5) {\n                vType = 1.0;\n            } else if (type >= BEVEL && type < BEVEL + 1.5) {\n                vType = 4.0;\n                vArc.z = dot(norm, norm3) * (lineWidth + side * shift) - side * dot(pos, norm3);\n            }\n\n            dy = side * (dot(pos, norm) - shift);\n            dy2 = side * (dot(pos, norm2) - shift);\n        }\n\n        pos += base;\n        vLine1.xy = vec2(dy, vLine1.y) * resolution;\n        vLine2.xy = vec2(dy2, vLine2.y) * resolution;\n        vArc = vArc * resolution;\n        vTravel = vec2(aTravel * avgScale + dot(pos - pointA, vec2(-norm.y, norm.x)), avgScale);\n    }\n\n    gl_Position = vec4((projectionMatrix * vec3(pos, 1.0)).xy, 0.0, 1.0);\n\n    vColor = aColor * tint;\n}`;\n\nconst precision = `#version 100\n#ifdef GL_FRAGMENT_PRECISION_HIGH\n  precision highp float;\n#else\n  precision mediump float;\n#endif\n`;\n\nconst smoothFrag = `%PRECISION%\nvarying vec4 vColor;\nvarying vec4 vLine1;\nvarying vec4 vLine2;\nvarying vec4 vArc;\nvarying float vType;\nvarying float vTextureId;\nvarying vec2 vTextureCoord;\nvarying vec2 vTravel;\nuniform sampler2D uSamplers[%MAX_TEXTURES%];\n\n%PIXEL_LINE%\n\nvoid main(void){\n    %PIXEL_COVERAGE%\n\n    vec4 texColor;\n    float textureId = floor(vTextureId+0.5);\n    %FOR_LOOP%\n\n    gl_FragColor = vColor * texColor * alpha;\n}\n`;\n\nconst pixelLineFunc = [`\nfloat pixelLine(float x, float A, float B) {\n    return clamp(x + 0.5, 0.0, 1.0);\n}\n`, `\nfloat pixelLine(float x, float A, float B) {\n    float y = abs(x), s = sign(x);\n    if (y * 2.0 < A - B) {\n        return 0.5 + s * y / A;\n    }\n    y -= (A - B) * 0.5;\n    y = max(1.0 - y / B, 0.0);\n    return (1.0 + s * (1.0 - y * y)) * 0.5;\n    //return clamp(x + 0.5, 0.0, 1.0);\n}\n`];\n\nconst pixelCoverage = `float alpha = 1.0;\nif (vType < 0.5) {\n    float left = pixelLine(-vLine1.y - vLine1.x, vLine1.z, vLine1.w);\n    float right = pixelLine(vLine1.y - vLine1.x, vLine1.z, vLine1.w);\n    float near = vLine2.x - 0.5;\n    float far = min(vLine2.x + 0.5, 0.0);\n    float top = vLine2.y - 0.5;\n    float bottom = min(vLine2.y + 0.5, 0.0);\n    alpha = (right - left) * max(bottom - top, 0.0) * max(far - near, 0.0);\n} else if (vType < 1.5) {\n    float a1 = pixelLine(- vLine1.y - vLine1.x, vLine1.z, vLine1.w);\n    float a2 = pixelLine(vLine1.y - vLine1.x, vLine1.z, vLine1.w);\n    float b1 = pixelLine(- vLine2.y - vLine2.x, vLine2.z, vLine2.w);\n    float b2 = pixelLine(vLine2.y - vLine2.x, vLine2.z, vLine2.w);\n    alpha = a2 * b2 - a1 * b1;\n} else if (vType < 2.5) {\n    alpha *= max(min(vLine1.x + 0.5, 1.0), 0.0);\n    alpha *= max(min(vLine1.y + 0.5, 1.0), 0.0);\n    alpha *= max(min(vLine1.z + 0.5, 1.0), 0.0);\n} else if (vType < 3.5) {\n    float a1 = pixelLine(- vLine1.y - vLine1.x, vLine1.z, vLine1.w);\n    float a2 = pixelLine(vLine1.y - vLine1.x, vLine1.z, vLine1.w);\n    float b1 = pixelLine(- vLine2.y - vLine2.x, vLine2.z, vLine2.w);\n    float b2 = pixelLine(vLine2.y - vLine2.x, vLine2.z, vLine2.w);\n    float alpha_miter = a2 * b2 - a1 * b1;\n    float alpha_plane = clamp(vArc.z - vArc.x + 0.5, 0.0, 1.0);\n    float d = length(vArc.xy);\n    float circle_hor = max(min(vArc.w, d + 0.5) - max(-vArc.w, d - 0.5), 0.0);\n    float circle_vert = min(vArc.w * 2.0, 1.0);\n    float alpha_circle = circle_hor * circle_vert;\n    alpha = min(alpha_miter, max(alpha_circle, alpha_plane));\n} else {\n    float a1 = pixelLine(- vLine1.y - vLine1.x, vLine1.z, vLine1.w);\n    float a2 = pixelLine(vLine1.y - vLine1.x, vLine1.z, vLine1.w);\n    float b1 = pixelLine(- vLine2.y - vLine2.x, vLine2.z, vLine2.w);\n    float b2 = pixelLine(vLine2.y - vLine2.x, vLine2.z, vLine2.w);\n    alpha = a2 * b2 - a1 * b1;\n    alpha *= clamp(vArc.z + 0.5, 0.0, 1.0);\n}\n`;\n\n/**\n * @memberof PIXI.smooth\n */\nexport class SmoothGraphicsShader extends Shader\n{\n    settings: IGraphicsBatchSettings;\n\n    constructor(settings: IGraphicsBatchSettings,\n        vert = smoothVert,\n        frag = smoothFrag,\n        uniforms = {})\n    {\n        vert = SmoothGraphicsShader.generateVertexSrc(settings, vert);\n        frag = SmoothGraphicsShader.generateFragmentSrc(settings, frag);\n\n        const { maxStyles, maxTextures } = settings;\n        const sampleValues = new Int32Array(maxTextures);\n\n        for (let i = 0; i < maxTextures; i++)\n        {\n            sampleValues[i] = i;\n        }\n        super(Program.from(vert, frag), (Object as any).assign(uniforms, {\n            styleMatrix: new Float32Array(6 * maxStyles),\n            styleTextureId: new Float32Array(maxStyles),\n            styleLine: new Float32Array(2 * maxStyles),\n            samplerSize: new Float32Array(2 * maxTextures),\n            uSamplers: sampleValues,\n            tint: new Float32Array([1, 1, 1, 1]),\n            resolution: 1,\n            expand: 1,\n        }));\n        this.settings = settings;\n    }\n\n    static generateVertexSrc(settings: IGraphicsBatchSettings, vertexSrc = smoothVert): string\n    {\n        const { maxStyles, maxTextures } = settings;\n\n        vertexSrc = vertexSrc.replace(/%MAX_TEXTURES%/gi, `${maxTextures}`)\n            .replace(/%MAX_STYLES%/gi, `${maxStyles}`);\n\n        return vertexSrc;\n    }\n\n    static generateFragmentSrc(settings: IGraphicsBatchSettings, fragmentSrc = smoothFrag): string\n    {\n        const { maxTextures, pixelLine } = settings;\n\n        fragmentSrc = fragmentSrc.replace(/%PRECISION%/gi, precision)\n            .replace(/%PIXEL_LINE%/gi, pixelLineFunc[pixelLine])\n            .replace(/%PIXEL_COVERAGE%/gi, pixelCoverage)\n            .replace(/%MAX_TEXTURES%/gi, `${maxTextures}`)\n            .replace(/%FOR_LOOP%/gi, this.generateSampleSrc(maxTextures));\n\n        return fragmentSrc;\n    }\n\n    static generateSampleSrc(maxTextures: number): string\n    {\n        let src = '';\n\n        src += '\\n';\n        src += '\\n';\n\n        for (let i = 0; i < maxTextures; i++)\n        {\n            if (i > 0)\n            {\n                src += '\\nelse ';\n            }\n\n            if (i < maxTextures - 1)\n            {\n                src += `if(textureId < ${i}.5)`;\n            }\n\n            src += '\\n{';\n            src += `\\n\\ttexColor = texture2D(uSamplers[${i}], vTextureCoord);`;\n            src += '\\n}';\n        }\n\n        src += '\\n';\n        src += '\\n';\n\n        return src;\n    }\n}\n"],"names":[],"mappings":";;AAGA,MAAM,UAAa,GAAA,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAA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"}