ngx-spine
Version:
[](https://travis-ci.org/PoiScript/ngx-spine)
733 lines • 75.9 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
/******************************************************************************
* Spine Runtimes License Agreement
* Last updated May 1, 2019. Replaces all prior versions.
*
* Copyright (c) 2013-2019, Esoteric Software LLC
*
* Integration of the Spine Runtimes into software or otherwise creating
* derivative works of the Spine Runtimes is permitted under the terms and
* conditions of Section 2 of the Spine Editor License Agreement:
* http://esotericsoftware.com/spine-editor-license
*
* Otherwise, it is permitted to integrate the Spine Runtimes into software
* or otherwise create derivative works of the Spine Runtimes (collectively,
* "Products"), provided that each user of the Products must obtain their own
* Spine Editor license and redistribution of the Products in any form must
* include this license and copyright notice.
*
* THIS SOFTWARE IS PROVIDED BY ESOTERIC SOFTWARE LLC "AS IS" AND ANY EXPRESS
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
* NO EVENT SHALL ESOTERIC SOFTWARE LLC BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, BUSINESS
* INTERRUPTION, OR LOSS OF USE, DATA, OR PROFITS) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*****************************************************************************/
import { Utils, MathUtils } from "./Utils";
import { SpacingMode, RotateMode, PositionMode } from "./PathConstraintData";
import { PathAttachment } from "./attachments/PathAttachment";
var PathConstraint = /** @class */ (function () {
function PathConstraint(data, skeleton) {
this.position = 0;
this.spacing = 0;
this.rotateMix = 0;
this.translateMix = 0;
this.spaces = new Array();
this.positions = new Array();
this.world = new Array();
this.curves = new Array();
this.lengths = new Array();
this.segments = new Array();
this.active = false;
if (data == null)
throw new Error("data cannot be null.");
if (skeleton == null)
throw new Error("skeleton cannot be null.");
this.data = data;
this.bones = new Array();
for (var i = 0, n = data.bones.length; i < n; i++)
this.bones.push(skeleton.findBone(data.bones[i].name));
this.target = skeleton.findSlot(data.target.name);
this.position = data.position;
this.spacing = data.spacing;
this.rotateMix = data.rotateMix;
this.translateMix = data.translateMix;
}
/**
* @return {?}
*/
PathConstraint.prototype.isActive = /**
* @return {?}
*/
function () {
return this.active;
};
/**
* @return {?}
*/
PathConstraint.prototype.apply = /**
* @return {?}
*/
function () {
this.update();
};
/**
* @return {?}
*/
PathConstraint.prototype.update = /**
* @return {?}
*/
function () {
/** @type {?} */
var attachment = this.target.getAttachment();
if (!(attachment instanceof PathAttachment))
return;
/** @type {?} */
var rotateMix = this.rotateMix;
/** @type {?} */
var translateMix = this.translateMix;
/** @type {?} */
var translate = translateMix > 0;
/** @type {?} */
var rotate = rotateMix > 0;
if (!translate && !rotate)
return;
/** @type {?} */
var data = this.data;
/** @type {?} */
var percentSpacing = data.spacingMode == SpacingMode.Percent;
/** @type {?} */
var rotateMode = data.rotateMode;
/** @type {?} */
var tangents = rotateMode == RotateMode.Tangent;
/** @type {?} */
var scale = rotateMode == RotateMode.ChainScale;
/** @type {?} */
var boneCount = this.bones.length;
/** @type {?} */
var spacesCount = tangents ? boneCount : boneCount + 1;
/** @type {?} */
var bones = this.bones;
/** @type {?} */
var spaces = Utils.setArraySize(this.spaces, spacesCount);
/** @type {?} */
var lengths = null;
/** @type {?} */
var spacing = this.spacing;
if (scale || !percentSpacing) {
if (scale)
lengths = Utils.setArraySize(this.lengths, boneCount);
/** @type {?} */
var lengthSpacing = data.spacingMode == SpacingMode.Length;
for (var i = 0, n = spacesCount - 1; i < n;) {
/** @type {?} */
var bone = bones[i];
/** @type {?} */
var setupLength = bone.data.length;
if (setupLength < PathConstraint.epsilon) {
if (scale)
lengths[i] = 0;
spaces[++i] = 0;
}
else if (percentSpacing) {
if (scale) {
/** @type {?} */
var x = setupLength * bone.a;
/** @type {?} */
var y = setupLength * bone.c;
/** @type {?} */
var length_1 = Math.sqrt(x * x + y * y);
lengths[i] = length_1;
}
spaces[++i] = spacing;
}
else {
/** @type {?} */
var x = setupLength * bone.a;
/** @type {?} */
var y = setupLength * bone.c;
/** @type {?} */
var length_2 = Math.sqrt(x * x + y * y);
if (scale)
lengths[i] = length_2;
spaces[++i] =
((lengthSpacing ? setupLength + spacing : spacing) * length_2) /
setupLength;
}
}
}
else {
for (var i = 1; i < spacesCount; i++)
spaces[i] = spacing;
}
/** @type {?} */
var positions = this.computeWorldPositions((/** @type {?} */ (attachment)), spacesCount, tangents, data.positionMode == PositionMode.Percent, percentSpacing);
/** @type {?} */
var boneX = positions[0];
/** @type {?} */
var boneY = positions[1];
/** @type {?} */
var offsetRotation = data.offsetRotation;
/** @type {?} */
var tip = false;
if (offsetRotation == 0)
tip = rotateMode == RotateMode.Chain;
else {
tip = false;
/** @type {?} */
var p = this.target.bone;
offsetRotation *=
p.a * p.d - p.b * p.c > 0 ? MathUtils.degRad : -MathUtils.degRad;
}
for (var i = 0, p = 3; i < boneCount; i++, p += 3) {
/** @type {?} */
var bone = bones[i];
bone.worldX += (boneX - bone.worldX) * translateMix;
bone.worldY += (boneY - bone.worldY) * translateMix;
/** @type {?} */
var x = positions[p];
/** @type {?} */
var y = positions[p + 1];
/** @type {?} */
var dx = x - boneX;
/** @type {?} */
var dy = y - boneY;
if (scale) {
/** @type {?} */
var length_3 = lengths[i];
if (length_3 != 0) {
/** @type {?} */
var s = (Math.sqrt(dx * dx + dy * dy) / length_3 - 1) * rotateMix + 1;
bone.a *= s;
bone.c *= s;
}
}
boneX = x;
boneY = y;
if (rotate) {
/** @type {?} */
var a = bone.a;
/** @type {?} */
var b = bone.b;
/** @type {?} */
var c = bone.c;
/** @type {?} */
var d = bone.d;
/** @type {?} */
var r = 0;
/** @type {?} */
var cos = 0;
/** @type {?} */
var sin = 0;
if (tangents)
r = positions[p - 1];
else if (spaces[i + 1] == 0)
r = positions[p + 2];
else
r = Math.atan2(dy, dx);
r -= Math.atan2(c, a);
if (tip) {
cos = Math.cos(r);
sin = Math.sin(r);
/** @type {?} */
var length_4 = bone.data.length;
boneX += (length_4 * (cos * a - sin * c) - dx) * rotateMix;
boneY += (length_4 * (sin * a + cos * c) - dy) * rotateMix;
}
else {
r += offsetRotation;
}
if (r > MathUtils.PI)
r -= MathUtils.PI2;
else if (r < -MathUtils.PI)
//
r += MathUtils.PI2;
r *= rotateMix;
cos = Math.cos(r);
sin = Math.sin(r);
bone.a = cos * a - sin * c;
bone.b = cos * b - sin * d;
bone.c = sin * a + cos * c;
bone.d = sin * b + cos * d;
}
bone.appliedValid = false;
}
};
/**
* @param {?} path
* @param {?} spacesCount
* @param {?} tangents
* @param {?} percentPosition
* @param {?} percentSpacing
* @return {?}
*/
PathConstraint.prototype.computeWorldPositions = /**
* @param {?} path
* @param {?} spacesCount
* @param {?} tangents
* @param {?} percentPosition
* @param {?} percentSpacing
* @return {?}
*/
function (path, spacesCount, tangents, percentPosition, percentSpacing) {
/** @type {?} */
var target = this.target;
/** @type {?} */
var position = this.position;
/** @type {?} */
var spaces = this.spaces;
/** @type {?} */
var out = Utils.setArraySize(this.positions, spacesCount * 3 + 2);
/** @type {?} */
var world = null;
/** @type {?} */
var closed = path.closed;
/** @type {?} */
var verticesLength = path.worldVerticesLength;
/** @type {?} */
var curveCount = verticesLength / 6;
/** @type {?} */
var prevCurve = PathConstraint.NONE;
if (!path.constantSpeed) {
/** @type {?} */
var lengths = path.lengths;
curveCount -= closed ? 1 : 2;
/** @type {?} */
var pathLength_1 = lengths[curveCount];
if (percentPosition)
position *= pathLength_1;
if (percentSpacing) {
for (var i = 1; i < spacesCount; i++)
spaces[i] *= pathLength_1;
}
world = Utils.setArraySize(this.world, 8);
for (var i = 0, o = 0, curve = 0; i < spacesCount; i++, o += 3) {
/** @type {?} */
var space = spaces[i];
position += space;
/** @type {?} */
var p = position;
if (closed) {
p %= pathLength_1;
if (p < 0)
p += pathLength_1;
curve = 0;
}
else if (p < 0) {
if (prevCurve != PathConstraint.BEFORE) {
prevCurve = PathConstraint.BEFORE;
path.computeWorldVertices(target, 2, 4, world, 0, 2);
}
this.addBeforePosition(p, world, 0, out, o);
continue;
}
else if (p > pathLength_1) {
if (prevCurve != PathConstraint.AFTER) {
prevCurve = PathConstraint.AFTER;
path.computeWorldVertices(target, verticesLength - 6, 4, world, 0, 2);
}
this.addAfterPosition(p - pathLength_1, world, 0, out, o);
continue;
}
// Determine curve containing position.
for (;; curve++) {
/** @type {?} */
var length_5 = lengths[curve];
if (p > length_5)
continue;
if (curve == 0)
p /= length_5;
else {
/** @type {?} */
var prev = lengths[curve - 1];
p = (p - prev) / (length_5 - prev);
}
break;
}
if (curve != prevCurve) {
prevCurve = curve;
if (closed && curve == curveCount) {
path.computeWorldVertices(target, verticesLength - 4, 4, world, 0, 2);
path.computeWorldVertices(target, 0, 4, world, 4, 2);
}
else
path.computeWorldVertices(target, curve * 6 + 2, 8, world, 0, 2);
}
this.addCurvePosition(p, world[0], world[1], world[2], world[3], world[4], world[5], world[6], world[7], out, o, tangents || (i > 0 && space == 0));
}
return out;
}
// World vertices.
if (closed) {
verticesLength += 2;
world = Utils.setArraySize(this.world, verticesLength);
path.computeWorldVertices(target, 2, verticesLength - 4, world, 0, 2);
path.computeWorldVertices(target, 0, 2, world, verticesLength - 4, 2);
world[verticesLength - 2] = world[0];
world[verticesLength - 1] = world[1];
}
else {
curveCount--;
verticesLength -= 4;
world = Utils.setArraySize(this.world, verticesLength);
path.computeWorldVertices(target, 2, verticesLength, world, 0, 2);
}
// Curve lengths.
/** @type {?} */
var curves = Utils.setArraySize(this.curves, curveCount);
/** @type {?} */
var pathLength = 0;
/** @type {?} */
var x1 = world[0];
/** @type {?} */
var y1 = world[1];
/** @type {?} */
var cx1 = 0;
/** @type {?} */
var cy1 = 0;
/** @type {?} */
var cx2 = 0;
/** @type {?} */
var cy2 = 0;
/** @type {?} */
var x2 = 0;
/** @type {?} */
var y2 = 0;
/** @type {?} */
var tmpx = 0;
/** @type {?} */
var tmpy = 0;
/** @type {?} */
var dddfx = 0;
/** @type {?} */
var dddfy = 0;
/** @type {?} */
var ddfx = 0;
/** @type {?} */
var ddfy = 0;
/** @type {?} */
var dfx = 0;
/** @type {?} */
var dfy = 0;
for (var i = 0, w = 2; i < curveCount; i++, w += 6) {
cx1 = world[w];
cy1 = world[w + 1];
cx2 = world[w + 2];
cy2 = world[w + 3];
x2 = world[w + 4];
y2 = world[w + 5];
tmpx = (x1 - cx1 * 2 + cx2) * 0.1875;
tmpy = (y1 - cy1 * 2 + cy2) * 0.1875;
dddfx = ((cx1 - cx2) * 3 - x1 + x2) * 0.09375;
dddfy = ((cy1 - cy2) * 3 - y1 + y2) * 0.09375;
ddfx = tmpx * 2 + dddfx;
ddfy = tmpy * 2 + dddfy;
dfx = (cx1 - x1) * 0.75 + tmpx + dddfx * 0.16666667;
dfy = (cy1 - y1) * 0.75 + tmpy + dddfy * 0.16666667;
pathLength += Math.sqrt(dfx * dfx + dfy * dfy);
dfx += ddfx;
dfy += ddfy;
ddfx += dddfx;
ddfy += dddfy;
pathLength += Math.sqrt(dfx * dfx + dfy * dfy);
dfx += ddfx;
dfy += ddfy;
pathLength += Math.sqrt(dfx * dfx + dfy * dfy);
dfx += ddfx + dddfx;
dfy += ddfy + dddfy;
pathLength += Math.sqrt(dfx * dfx + dfy * dfy);
curves[i] = pathLength;
x1 = x2;
y1 = y2;
}
if (percentPosition)
position *= pathLength;
else
position *= pathLength / path.lengths[curveCount - 1];
if (percentSpacing) {
for (var i = 1; i < spacesCount; i++)
spaces[i] *= pathLength;
}
/** @type {?} */
var segments = this.segments;
/** @type {?} */
var curveLength = 0;
for (var i = 0, o = 0, curve = 0, segment = 0; i < spacesCount; i++, o += 3) {
/** @type {?} */
var space = spaces[i];
position += space;
/** @type {?} */
var p = position;
if (closed) {
p %= pathLength;
if (p < 0)
p += pathLength;
curve = 0;
}
else if (p < 0) {
this.addBeforePosition(p, world, 0, out, o);
continue;
}
else if (p > pathLength) {
this.addAfterPosition(p - pathLength, world, verticesLength - 4, out, o);
continue;
}
// Determine curve containing position.
for (;; curve++) {
/** @type {?} */
var length_6 = curves[curve];
if (p > length_6)
continue;
if (curve == 0)
p /= length_6;
else {
/** @type {?} */
var prev = curves[curve - 1];
p = (p - prev) / (length_6 - prev);
}
break;
}
// Curve segment lengths.
if (curve != prevCurve) {
prevCurve = curve;
/** @type {?} */
var ii = curve * 6;
x1 = world[ii];
y1 = world[ii + 1];
cx1 = world[ii + 2];
cy1 = world[ii + 3];
cx2 = world[ii + 4];
cy2 = world[ii + 5];
x2 = world[ii + 6];
y2 = world[ii + 7];
tmpx = (x1 - cx1 * 2 + cx2) * 0.03;
tmpy = (y1 - cy1 * 2 + cy2) * 0.03;
dddfx = ((cx1 - cx2) * 3 - x1 + x2) * 0.006;
dddfy = ((cy1 - cy2) * 3 - y1 + y2) * 0.006;
ddfx = tmpx * 2 + dddfx;
ddfy = tmpy * 2 + dddfy;
dfx = (cx1 - x1) * 0.3 + tmpx + dddfx * 0.16666667;
dfy = (cy1 - y1) * 0.3 + tmpy + dddfy * 0.16666667;
curveLength = Math.sqrt(dfx * dfx + dfy * dfy);
segments[0] = curveLength;
for (ii = 1; ii < 8; ii++) {
dfx += ddfx;
dfy += ddfy;
ddfx += dddfx;
ddfy += dddfy;
curveLength += Math.sqrt(dfx * dfx + dfy * dfy);
segments[ii] = curveLength;
}
dfx += ddfx;
dfy += ddfy;
curveLength += Math.sqrt(dfx * dfx + dfy * dfy);
segments[8] = curveLength;
dfx += ddfx + dddfx;
dfy += ddfy + dddfy;
curveLength += Math.sqrt(dfx * dfx + dfy * dfy);
segments[9] = curveLength;
segment = 0;
}
// Weight by segment length.
p *= curveLength;
for (;; segment++) {
/** @type {?} */
var length_7 = segments[segment];
if (p > length_7)
continue;
if (segment == 0)
p /= length_7;
else {
/** @type {?} */
var prev = segments[segment - 1];
p = segment + (p - prev) / (length_7 - prev);
}
break;
}
this.addCurvePosition(p * 0.1, x1, y1, cx1, cy1, cx2, cy2, x2, y2, out, o, tangents || (i > 0 && space == 0));
}
return out;
};
/**
* @param {?} p
* @param {?} temp
* @param {?} i
* @param {?} out
* @param {?} o
* @return {?}
*/
PathConstraint.prototype.addBeforePosition = /**
* @param {?} p
* @param {?} temp
* @param {?} i
* @param {?} out
* @param {?} o
* @return {?}
*/
function (p, temp, i, out, o) {
/** @type {?} */
var x1 = temp[i];
/** @type {?} */
var y1 = temp[i + 1];
/** @type {?} */
var dx = temp[i + 2] - x1;
/** @type {?} */
var dy = temp[i + 3] - y1;
/** @type {?} */
var r = Math.atan2(dy, dx);
out[o] = x1 + p * Math.cos(r);
out[o + 1] = y1 + p * Math.sin(r);
out[o + 2] = r;
};
/**
* @param {?} p
* @param {?} temp
* @param {?} i
* @param {?} out
* @param {?} o
* @return {?}
*/
PathConstraint.prototype.addAfterPosition = /**
* @param {?} p
* @param {?} temp
* @param {?} i
* @param {?} out
* @param {?} o
* @return {?}
*/
function (p, temp, i, out, o) {
/** @type {?} */
var x1 = temp[i + 2];
/** @type {?} */
var y1 = temp[i + 3];
/** @type {?} */
var dx = x1 - temp[i];
/** @type {?} */
var dy = y1 - temp[i + 1];
/** @type {?} */
var r = Math.atan2(dy, dx);
out[o] = x1 + p * Math.cos(r);
out[o + 1] = y1 + p * Math.sin(r);
out[o + 2] = r;
};
/**
* @param {?} p
* @param {?} x1
* @param {?} y1
* @param {?} cx1
* @param {?} cy1
* @param {?} cx2
* @param {?} cy2
* @param {?} x2
* @param {?} y2
* @param {?} out
* @param {?} o
* @param {?} tangents
* @return {?}
*/
PathConstraint.prototype.addCurvePosition = /**
* @param {?} p
* @param {?} x1
* @param {?} y1
* @param {?} cx1
* @param {?} cy1
* @param {?} cx2
* @param {?} cy2
* @param {?} x2
* @param {?} y2
* @param {?} out
* @param {?} o
* @param {?} tangents
* @return {?}
*/
function (p, x1, y1, cx1, cy1, cx2, cy2, x2, y2, out, o, tangents) {
if (p == 0 || isNaN(p)) {
out[o] = x1;
out[o + 1] = y1;
out[o + 2] = Math.atan2(cy1 - y1, cx1 - x1);
return;
}
/** @type {?} */
var tt = p * p;
/** @type {?} */
var ttt = tt * p;
/** @type {?} */
var u = 1 - p;
/** @type {?} */
var uu = u * u;
/** @type {?} */
var uuu = uu * u;
/** @type {?} */
var ut = u * p;
/** @type {?} */
var ut3 = ut * 3;
/** @type {?} */
var uut3 = u * ut3;
/** @type {?} */
var utt3 = ut3 * p;
/** @type {?} */
var x = x1 * uuu + cx1 * uut3 + cx2 * utt3 + x2 * ttt;
/** @type {?} */
var y = y1 * uuu + cy1 * uut3 + cy2 * utt3 + y2 * ttt;
out[o] = x;
out[o + 1] = y;
if (tangents) {
if (p < 0.001)
out[o + 2] = Math.atan2(cy1 - y1, cx1 - x1);
else
out[o + 2] = Math.atan2(y - (y1 * uu + cy1 * ut * 2 + cy2 * tt), x - (x1 * uu + cx1 * ut * 2 + cx2 * tt));
}
};
PathConstraint.NONE = -1;
PathConstraint.BEFORE = -2;
PathConstraint.AFTER = -3;
PathConstraint.epsilon = 0.00001;
return PathConstraint;
}());
export { PathConstraint };
if (false) {
/** @type {?} */
PathConstraint.NONE;
/** @type {?} */
PathConstraint.BEFORE;
/** @type {?} */
PathConstraint.AFTER;
/** @type {?} */
PathConstraint.epsilon;
/** @type {?} */
PathConstraint.prototype.data;
/** @type {?} */
PathConstraint.prototype.bones;
/** @type {?} */
PathConstraint.prototype.target;
/** @type {?} */
PathConstraint.prototype.position;
/** @type {?} */
PathConstraint.prototype.spacing;
/** @type {?} */
PathConstraint.prototype.rotateMix;
/** @type {?} */
PathConstraint.prototype.translateMix;
/** @type {?} */
PathConstraint.prototype.spaces;
/** @type {?} */
PathConstraint.prototype.positions;
/** @type {?} */
PathConstraint.prototype.world;
/** @type {?} */
PathConstraint.prototype.curves;
/** @type {?} */
PathConstraint.prototype.lengths;
/** @type {?} */
PathConstraint.prototype.segments;
/** @type {?} */
PathConstraint.prototype.active;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUGF0aENvbnN0cmFpbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZ3gtc3BpbmUvIiwic291cmNlcyI6WyJsaWIvc3BpbmUtdHMvY29yZS9QYXRoQ29uc3RyYWludC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQTZCQSxPQUFPLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUMzQyxPQUFPLEVBRUwsV0FBVyxFQUNYLFVBQVUsRUFDVixZQUFZLEVBQ2IsTUFBTSxzQkFBc0IsQ0FBQztBQUc5QixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFJOUQ7SUFtQkUsd0JBQVksSUFBd0IsRUFBRSxRQUFrQjtRQVh4RCxhQUFRLEdBQUcsQ0FBQyxDQUFDO1FBQ2IsWUFBTyxHQUFHLENBQUMsQ0FBQztRQUNaLGNBQVMsR0FBRyxDQUFDLENBQUM7UUFDZCxpQkFBWSxHQUFHLENBQUMsQ0FBQztRQUNqQixXQUFNLEdBQUcsSUFBSSxLQUFLLEVBQVUsQ0FBQztRQUM3QixjQUFTLEdBQUcsSUFBSSxLQUFLLEVBQVUsQ0FBQztRQUNoQyxVQUFLLEdBQUcsSUFBSSxLQUFLLEVBQVUsQ0FBQztRQUM1QixXQUFNLEdBQUcsSUFBSSxLQUFLLEVBQVUsQ0FBQztRQUM3QixZQUFPLEdBQUcsSUFBSSxLQUFLLEVBQVUsQ0FBQztRQUM5QixhQUFRLEdBQUcsSUFBSSxLQUFLLEVBQVUsQ0FBQztRQUMvQixXQUFNLEdBQUcsS0FBSyxDQUFDO1FBRWIsSUFBSSxJQUFJLElBQUksSUFBSTtZQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsc0JBQXNCLENBQUMsQ0FBQztRQUMxRCxJQUFJLFFBQVEsSUFBSSxJQUFJO1lBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO1FBQ2xFLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ2pCLElBQUksQ0FBQyxL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