{"version":3,"file":"MovieClip.mjs","sources":["../../src/animate/MovieClip.ts"],"sourcesContent":["import { Timeline } from './Timeline';\nimport { TweenProps, EaseMethod, getEaseFromConfig, KeyframeData } from './Tween';\nimport { utils } from './utils';\nimport { sound } from './sound';\nimport { AnimateContainer } from './Container';\nimport type { AnimateDisplayObject } from './DisplayObject';\nimport { Ticker } from '@pixi/ticker';\nimport { settings } from '@pixi/settings';\nimport type { Graphics } from '@pixi/graphics';\nimport type { Sprite } from '@pixi/sprite';\nimport type { IDestroyOptions } from '@pixi/display';\nconst SharedTicker = Ticker.shared;\n\nexport interface MovieClipOptions\n{\n    /**\n     * The default playback mode is independent (0). Child movieclips are given a different value as subordinate objects.\n     */\n    mode?: number;\n    /**\n     * The starting frame. Default is 0.\n     */\n    startPosition?: number;\n    /**\n     * If playback is looped. Default is true.\n     */\n    loop?: boolean;\n    /**\n     * The frame labels map - label to frames\n     */\n    labels?: LabelMap;\n    /**\n     * The duration of the clip. If no duration is provided, length is automatically determined.\n     */\n    duration?: number;\n    /**\n     * The framerate to use for an independent mode MovieClip. Default is 24.\n     */\n    framerate?: number;\n}\n\nexport interface FrameLabel\n{\n    label: string;\n    position: number;\n}\n\nexport interface LabelMap\n{\n    [label: string]: number;\n}\n\nexport type FrameAction = (this: MovieClip) => void;\n\ntype TimedChildTimeline = boolean[] & {target?: AnimateDisplayObject};\n\n/**\n * Provide timeline playback of movieclip\n */\nexport class MovieClip extends AnimateContainer\n{\n    /**\n     * The MovieClip will advance independently of its parent, even if its parent is paused.\n     * This is the default mode.\n     */\n    public static readonly INDEPENDENT = 0;\n\n    /**\n     * The MovieClip will only display a single frame (as determined by the startPosition property).\n     */\n    public static readonly SINGLE_FRAME = 1;\n\n    /**\n     * The MovieClip will be advanced only when its parent advances and will be synched to the position of\n     * the parent MovieClip.\n     */\n    public static readonly SYNCHED = 2;\n\n    /**\n     * The default framerate if none is specified or there's not parent clip with a framerate.\n     */\n    public static readonly DEFAULT_FRAMERATE = 24;\n\n    /**\n     * Fast way of checking if a movie clip is actually a movie clip.\n     * Prevents circular references and is faster than instanceof.\n     */\n    public isMovieClip = true;\n\n    /**\n     * Controls how this MovieClip advances its time. Must be one of 0 (INDEPENDENT), 1 (SINGLE_FRAME), or 2 (SYNCHED).\n     * See each constant for a description of the behaviour.\n     */\n    public mode: number;\n\n    /**\n     * Specifies what the first frame to play in this movieclip, or the only frame to display if mode is SINGLE_FRAME.\n     */\n    public startPosition: number;\n\n    /**\n     * Indicates whether this MovieClip should loop when it reaches the end of its timeline.\n     */\n    public loop: boolean;\n\n    /**\n     * The current frame of the movieclip.\n     * @readOnly\n     */\n    public currentFrame: number;\n\n    /**\n     * The collection of private labels\n     */\n    private _labels: FrameLabel[];\n\n    /**\n     * The collection of private labels\n     */\n    private _labelDict: LabelMap;\n\n    /**\n     * If true, this movieclip will animate automatically whenever it is on the stage.\n     */\n    public selfAdvance: boolean;\n\n    /**\n     * If true, the MovieClip's position will not advance when ticked.\n     */\n    public paused: boolean;\n\n    /**\n     * If true, actions in this MovieClip's tweens will be run when the playhead advances.\n     */\n    public actionsEnabled: boolean;\n\n    /**\n     * If true, the MovieClip will automatically be reset to its first frame whenever the timeline adds\n     * it back onto the display list. This only applies to MovieClip instances with mode=INDEPENDENT.\n     * <br><br>\n     * For example, if you had a character animation with a 'body' child MovieClip instance\n     * with different costumes on each frame, you could set body.autoReset = false, so that\n     * you can manually change the frame it is on, without worrying that it will be reset\n     * automatically.\n     */\n    public autoReset: boolean;\n\n    /**\n     * Offset from parent frame for a synched movieclip.\n     */\n    private _synchOffset: number;\n\n    /**\n     * Previous position that this movieclip was stopped on.\n     */\n    private _prevPos: number;\n\n    /**\n     * Note - changed from default: When the MovieClip is framerate independent, this is the time\n     * elapsed from frame 0 in seconds.\n     */\n    private _t: number;\n\n    /**\n     * By default MovieClip instances advance one frame per tick. Specifying a framerate for the MovieClip\n     * will cause it to advance based on elapsed time between ticks as appropriate to maintain the target\n     * framerate.\n     */\n    protected _framerate: number;\n\n    /**\n     * The total time in seconds for the animation. This is changed when setting the framerate.\n     */\n    private _duration: number;\n\n    /**\n     * The total duration in frames for the animation.\n     */\n    private _totalFrames: number;\n\n    /**\n     * Standard tween timelines for all objects. Each element in the _timelines array\n     * is a Timeline object - an array of tweens for one target, in order of occurrence.\n     */\n    protected _timelines: Timeline[];\n\n    /**\n     * Array of child timelines denoting if a child is actively a child of this movieclip\n     * on any given frame. Each element in the _timedChildTimelines is an array with a 'target'\n     * property, and is an array of boolean values indexed by frame.\n     * @private\n     */\n    public _timedChildTimelines: TimedChildTimeline[];\n\n    /**\n     * Array to depth sort timed children\n     */\n    protected _depthSorted: AnimateDisplayObject[];\n\n    /**\n     * Array of frame scripts, indexed by frame.\n     */\n    protected _actions: FrameAction[][];\n\n    /**\n     * Optional callback fired before timeline is updated.\n     * Can be used to clamp or update the currentFrame.\n     * @private\n     */\n    public _beforeUpdate: (target: MovieClip) => (() => void | null);\n\n    /**\n     * Internal property used to control child MovieClips relative to parents.\n     */\n    private parentStartPosition: number;\n\n    /**\n     * @param options - The options object\n     */\n    constructor(options?: MovieClipOptions);\n    /**\n     * @param mode - The playback mode default is independent (0),\n     * @param duration - The duration, if no duration is provided, auto determines length\n     * @param loop - If playback is looped\n     * @param framerate - The framerate to use for independent mode\n     * @param labels - The frame labels map of label to frames\n     */\n    constructor(mode?: number, duration?: number, loop?: boolean, framerate?: number, labels?: LabelMap);\n    constructor(\n        options?: MovieClipOptions | number,\n        duration?: number,\n        loop?: boolean,\n        framerate?: number,\n        labels?: LabelMap\n    )\n    {\n        super();\n\n        // Default options\n        options = options === undefined ? {} : options;\n\n        // Options can also be the mode\n        if (typeof options === 'number')\n        {\n            options = {\n                mode: options || MovieClip.INDEPENDENT,\n                duration: duration || 0,\n                loop: loop === undefined ? true : loop,\n                labels: labels || {},\n                framerate: framerate || 0,\n                startPosition: 0,\n            };\n        }\n        else\n        {\n            // Apply defaults to options\n            options = Object.assign({\n                mode: MovieClip.INDEPENDENT,\n                startPosition: 0,\n                loop: true,\n                labels: {},\n                duration: 0,\n                framerate: 0,\n            }, options);\n        }\n\n        this.mode = options.mode;\n        this.startPosition = options.startPosition;\n        this.loop = !!options.loop;\n        this.currentFrame = 0;\n        this._labels = [];\n        this._labelDict = options.labels;\n\n        if (options.labels)\n        {\n            for (const name in options.labels)\n            {\n                const label = {\n                    label: name,\n                    position: options.labels[name],\n                };\n\n                this._labels.push(label);\n            }\n            this._labels.sort((a, b) => a.position - b.position);\n        }\n\n        this.selfAdvance = true;\n        this.paused = false;\n        this.actionsEnabled = true;\n        this.autoReset = true;\n        this._synchOffset = 0;\n        this._prevPos = -1; // TODO: evaluate using a ._reset Boolean prop instead of -1.\n        this._t = 0;\n        this._framerate = options.framerate;\n        this._duration = 0;\n        this._totalFrames = options.duration;\n        this._timelines = [];\n        this._timedChildTimelines = [];\n        this._depthSorted = [];\n        this._actions = [];\n        this._beforeUpdate = null;\n        this.parentStartPosition = 0;\n\n        if (this.mode === MovieClip.INDEPENDENT)\n        {\n            this._tickListener = this._tickListener.bind(this);\n            this._onAdded = this._onAdded.bind(this);\n            this._onRemoved = this._onRemoved.bind(this);\n            this.on('added', this._onAdded);\n            this.on('removed', this._onRemoved);\n        }\n\n        if (options.framerate)\n        {\n            this.framerate = options.framerate;\n        }\n\n        // save often used methods on the instance so that they can be fetched slightly faster\n        // than if they had to be fetched from the prototype\n        /* eslint-disable no-self-assign */\n        this.advance = this.advance;\n        this._updateTimeline = this._updateTimeline;\n        this._setTimelinePosition = this._setTimelinePosition;\n        this._goto = this._goto;\n        /* eslint-enable no-self-assign */\n    }\n\n    private _onAdded(): void\n    {\n        if (!this._framerate)\n        {\n            this.framerate = this.parentFramerate;\n        }\n        SharedTicker.add(this._tickListener, null);\n    }\n\n    private _tickListener(tickerDeltaTime: number): void\n    {\n        if (this.paused || !this.selfAdvance)\n        {\n            // see if the movieclip needs to be updated even though it isn't animating\n            if (this._prevPos < 0)\n            {\n                this._goto(this.currentFrame);\n            }\n\n            return;\n        }\n        const seconds = tickerDeltaTime / settings.TARGET_FPMS / 1000;\n\n        this.advance(seconds);\n    }\n\n    private _onRemoved(): void\n    {\n        SharedTicker.remove(this._tickListener, null);\n    }\n\n    /**\n     * Returns an array of objects with label and position (aka frame) properties, sorted by position.\n     */\n    public get labels(): FrameLabel[]\n    {\n        return this._labels;\n    }\n\n    /**\n     * Returns a dictionary of labels where key is the label and value is the frame.\n     */\n    public get labelsMap(): LabelMap\n    {\n        return this._labelDict;\n    }\n\n    /**\n     * Returns the name of the label on or immediately before the current frame.\n     */\n    public get currentLabel(): string | null\n    {\n        const labels = this._labels;\n        let current: string = null;\n\n        for (let i = 0, len = labels.length; i < len; ++i)\n        {\n            if (labels[i].position <= this.currentFrame)\n            {\n                current = labels[i].label;\n            }\n            else\n            {\n                break;\n            }\n        }\n\n        return current;\n    }\n\n    /**\n     * When the MovieClip is framerate independent, this is the time elapsed from frame 0 in seconds.\n     */\n    public get elapsedTime(): number\n    {\n        return this._t;\n    }\n\n    public set elapsedTime(value)\n    {\n        this._t = value;\n    }\n\n    /**\n     * By default MovieClip instances advance one frame per tick. Specifying a framerate for the\n     * MovieClip will cause it to advance based on elapsed time between ticks as appropriate to\n     * maintain the target framerate.\n     *\n     * For example, if a MovieClip with a framerate of 10 is placed on a Stage being updated at\n     * 40fps, then the MovieClip advance roughly one frame every 4 ticks. This will not be exact,\n     * because the time between each tick vary slightly between frames.\n     *\n     * This feature is dependent on the tick event object (or an object with an appropriate 'delta' property) being\n     * passed into {{#crossLink 'Stage/update'}}{{/crossLink}}.\n     */\n    public get framerate(): number\n    {\n        return this._framerate;\n    }\n    public set framerate(value)\n    {\n        if (value > 0)\n        {\n            if (this._framerate)\n            {\n                // recalculate time based on difference between new and old framerate:\n                this._t *= this._framerate / value;\n            }\n            else\n            {\n                this._t = this.currentFrame / value;\n            }\n            this._framerate = value;\n            this._duration = value ? this._totalFrames / value : 0;\n        }\n        else\n        {\n            this._t = this._framerate = this._duration = 0;\n        }\n    }\n\n    /**\n     * Get the total number of frames (duration) of this MovieClip\n     */\n    public get totalFrames(): number\n    {\n        return this._totalFrames;\n    }\n\n    /**\n     * Extend the timeline to the last frame.\n     */\n    private _autoExtend(endFrame: number): void\n    {\n        if (this._totalFrames < endFrame)\n        {\n            this._totalFrames = endFrame;\n        }\n    }\n\n    /**\n     * Convert values of properties\n     */\n    private _parseProperties(properties: TweenProps & {t?: string | number; v?: number | boolean}): void\n    {\n        // Convert any string colors to uints\n        if (typeof properties.t === 'string')\n        {\n            properties.t = utils.hexToUint(properties.t);\n        }\n        else if (typeof properties.v === 'number')\n        {\n            properties.v = !!properties.v;\n        }\n    }\n\n    /**\n     * Get a timeline for a child, synced timeline.\n     */\n    private _getChildTimeline(instance: AnimateDisplayObject): Timeline\n    {\n        for (let i = this._timelines.length - 1; i >= 0; --i)\n        {\n            if (this._timelines[i].target === instance)\n            {\n                return this._timelines[i];\n            }\n        }\n        const timeline = Timeline.create(instance);\n\n        this._timelines.push(timeline);\n\n        return timeline;\n    }\n\n    /**\n     * Add mask or masks\n     */\n    public addTimedMask(instance: AnimateDisplayObject, keyframes: {[frame: number]: Graphics | Sprite}): this\n    {\n        for (const i in keyframes)\n        {\n            this.addKeyframe(instance, {\n                m: keyframes[i],\n            }, parseInt(i, 10));\n        }\n\n        // Set the initial position/add\n        this._setTimelinePosition(this.currentFrame, this.currentFrame, true);\n\n        return this;\n    }\n\n    /**\n     * Shortcut alias for `addTimedMask`\n     */\n    public am = this.addTimedMask;\n\n    /**\n     * Shortcut alias for `addTween`\n     */\n    public tw = this.addTween;\n\n    /**\n     * Add a tween to the clip\n     * @param instance - The clip to tween\n     * @param properties - The property or property to tween\n     * @param startFrame - The frame to start tweening\n     * @param duration - Number of frames to tween. If 0, then the properties are set with no tweening.\n     * @param ease - An optional easing function that takes the tween time from 0-1.\n     */\n    public addTween(instance: AnimateDisplayObject,\n        properties: TweenProps,\n        startFrame: number,\n        duration?: number,\n        ease?: EaseMethod): this\n    {\n        const timeline = this._getChildTimeline(instance);\n\n        this._parseProperties(properties);\n        timeline.addTween(properties, startFrame, duration, ease);\n        this._autoExtend(startFrame + duration);\n\n        return this;\n    }\n\n    /**\n     * Add a tween to the clip\n     * @param instance - The clip to tween\n     * @param properties - The property or property to tween\n     * @param startFrame - The frame to start tweening\n     */\n    public addKeyframe(instance: AnimateDisplayObject, properties: KeyframeData, startFrame: number): this\n    {\n        const timeline = this._getChildTimeline(instance);\n        const { tw } = properties;\n\n        // remove tw property just so that it doesn't mess anything up or confuse anyone doing debugging\n        delete properties.tw;\n        this._parseProperties(properties);\n        // add keyframe - note that even if we add a tween immediately afterwards, we want to\n        // add this keyframe in order to make sure the starting properties are set\n        timeline.addKeyframe(properties, startFrame);\n        this._autoExtend(startFrame);\n        // Add a tween if present in the keyframe data\n        if (tw)\n        {\n            this.addTween(instance, tw.p, startFrame, tw.d, getEaseFromConfig(tw.e));\n        }\n\n        return this;\n    }\n\n    /**\n     * Alias for method `addTimedChild`\n     */\n    public at = this.addTimedChild;\n\n    /**\n     * Add a child to show for a certain number of frames before automatic removal.\n     * @param instance - The clip to show\n     * @param startFrame - The starting frame\n     * @param duration - The number of frames to display the child before removing it.\n     * @param keyframes - The collection of static keyframes to add\n     */\n    public addTimedChild(instance: AnimateDisplayObject,\n        startFrame: number,\n        duration?: number,\n        keyframes?: string | {[frame: number]: KeyframeData}): this\n    {\n        if (startFrame === undefined) // jshint ignore:line\n        {\n            startFrame = 0;\n        }\n        if (duration === undefined || duration < 1) // jshint ignore:line\n        {\n            duration = this._totalFrames || 1;\n        }\n\n        // Add the starting offset for synced movie clips\n        if (instance instanceof MovieClip && instance.mode === MovieClip.SYNCHED)\n        {\n            (instance as MovieClip).parentStartPosition = startFrame;\n        }\n\n        // add tweening info about this child's presence on stage\n        // when the child is (re)added, if it has 'autoReset' set to true, then it\n        // should be set back to frame 0\n        let timeline: TimedChildTimeline;\n\n        // get existing timeline\n        for (let i = this._timedChildTimelines.length - 1; i >= 0; --i)\n        {\n            if (this._timedChildTimelines[i].target === instance)\n            {\n                timeline = this._timedChildTimelines[i];\n                break;\n            }\n        }\n        // if there wasn't one, make a new one\n        if (!timeline)\n        {\n            timeline = [];\n            timeline.target = instance;\n            this._timedChildTimelines.push(timeline);\n        }\n\n        // Fill the timeline with keyframe booleans\n        utils.fillFrames(timeline, startFrame, duration);\n\n        // Update the total frames if the instance extends our current\n        // total frames for this movieclip\n        if (this._totalFrames < startFrame + duration)\n        {\n            this._totalFrames = startFrame + duration;\n        }\n\n        // Add the collection of keyframes\n        if (keyframes)\n        {\n            if (typeof keyframes === 'string')\n            {\n                keyframes = utils.deserializeKeyframes(keyframes);\n            }\n            let sequenceUsesSkew = false;\n\n            for (const i in keyframes)\n            {\n                if (keyframes[i].kx || keyframes[i].ky)\n                {\n                    sequenceUsesSkew = true;\n                    break;\n                }\n            }\n            if (sequenceUsesSkew)\n            {\n                for (const i in keyframes)\n                {\n                    if (keyframes[i].r !== undefined)\n                    {\n                        keyframes[i].kx = keyframes[i].kx || keyframes[i].r * -1;\n                        keyframes[i].ky = keyframes[i].ky || keyframes[i].r;\n                        delete keyframes[i].r;\n                    }\n                    if (keyframes[i].tw?.p?.r !== undefined)\n                    {\n                        keyframes[i].tw.p.kx = keyframes[i].tw.p.kx || keyframes[i].tw.p.r * -1;\n                        keyframes[i].tw.p.ky = keyframes[i].tw.p.ky || keyframes[i].tw.p.r;\n                        delete keyframes[i].tw.p.r;\n                    }\n                }\n            }\n            for (const i in keyframes)\n            {\n                this.addKeyframe(instance, keyframes[i], parseInt(i, 10));\n            }\n            this._getChildTimeline(instance)\n                // subtract 1 from duration because we are using 0 based frame indices\n                // and duration is calculated as total frames\n                .extendLastFrame(startFrame + duration - 1);\n        }\n\n        // Set the initial position/add\n        this._setTimelinePosition(startFrame, this.currentFrame, true);\n\n        return this;\n    }\n\n    /**\n     * Short cut for `addAction`\n     */\n    public aa = this.addAction;\n\n    /**\n     * Handle frame actions, callback is bound to the instance of the MovieClip.\n     * @param callback - The clip call on a certain frame\n     * @param startFrame - The starting frame index or label\n     */\n    public addAction(callback: FrameAction, startFrame: number | string): this\n    {\n        if (typeof startFrame === 'string')\n        {\n            const index = this._labelDict[startFrame];\n\n            if (index === undefined)\n            {\n                throw new Error(`The label '${startFrame}' does not exist on this timeline`);\n            }\n            startFrame = index;\n        }\n\n        const actions = this._actions;\n\n        // ensure that the movieclip timeline is long enough to support the target frame\n        if (actions.length <= startFrame)\n        {\n            actions.length = startFrame + 1;\n        }\n        if (this._totalFrames < startFrame)\n        {\n            this._totalFrames = startFrame;\n        }\n        // add the action\n        if (actions[startFrame])\n        {\n            actions[startFrame].push(callback);\n        }\n        else\n        {\n            actions[startFrame] = [callback];\n        }\n\n        return this;\n    }\n\n    /**\n     * Short cut for `playSound`\n     */\n    public ps = this.playSound;\n\n    /**\n     * Handle sounds.\n     * @param alias - The name of the Sound\n     * @param loop - The loop property of the sound\n     */\n    public playSound(alias: string, loop?: boolean): this\n    {\n        sound.emit('play', alias, !!loop, this);\n\n        return this;\n    }\n\n    /**\n     * Sets paused to false.\n     */\n    play(): void\n    {\n        this.paused = false;\n    }\n\n    /**\n     * Sets paused to true.\n     */\n    stop(): void\n    {\n        this.paused = true;\n    }\n\n    /**\n     * Advances this movie clip to the specified position or label and sets paused to false.\n     * @param positionOrLabel - The animation name or frame number to go to.\n     */\n    public gotoAndPlay(positionOrLabel: string | number): void\n    {\n        this.paused = false;\n        this._goto(positionOrLabel);\n    }\n\n    /**\n     * Advances this movie clip to the specified position or label and sets paused to true.\n     * @param positionOrLabel - The animation or frame name to go to.\n     */\n    public gotoAndStop(positionOrLabel: string | number): void\n    {\n        this.paused = true;\n        this._goto(positionOrLabel);\n    }\n\n    /**\n     * Get the close parent with a valid framerate. If no parent, returns the default framerate.\n     */\n    public get parentFramerate(): number\n    {\n        // eslint-disable-next-line @typescript-eslint/no-this-alias\n        let o: MovieClip = this;\n        let fps = o._framerate;\n\n        // eslint-disable-next-line no-unmodified-loop-condition\n        while ((o = o.parent as MovieClip) && !fps)\n        {\n            if (o.mode === MovieClip.INDEPENDENT)\n            {\n                fps = o._framerate;\n            }\n        }\n\n        return fps || MovieClip.DEFAULT_FRAMERATE;\n    }\n\n    /**\n     * Advances the playhead. This occurs automatically each tick by default.\n     * @param time - The amount of time in seconds to advance by. Only applicable if framerate is set.\n     */\n    public advance(time?: number): void\n    {\n        // Handle any other cases where starting to play\n        // and no framerate has been set yet\n        if (!this._framerate)\n        {\n            this.framerate = this.parentFramerate;\n        }\n\n        if (time)\n        {\n            this._t += time;\n        }\n        if (this._t > this._duration)\n        {\n            this._t = this.loop ? this._t % this._duration : this._duration;\n        }\n        // add a tiny amount to account for potential floating point errors\n        this.currentFrame = Math.floor((this._t * this._framerate) + 0.00000001);\n        // final error checking\n        if (this.currentFrame >= this._totalFrames)\n        {\n            this.currentFrame = this._totalFrames - 1;\n        }\n        let afterUpdateOnce;\n\n        if (this._beforeUpdate)\n        {\n            afterUpdateOnce = this._beforeUpdate(this);\n        }\n        // update all tweens & actions in the timeline\n        this._updateTimeline();\n\n        // Do the animator callback here\n        if (afterUpdateOnce)\n        {\n            afterUpdateOnce();\n        }\n    }\n\n    /**\n     * @param positionOrLabel - The animation name or frame number to go to.\n     */\n    protected _goto(positionOrLabel: string | number): void\n    {\n        const pos = typeof positionOrLabel === 'string' ? this._labelDict[positionOrLabel] : positionOrLabel;\n\n        if (pos === undefined) // jshint ignore:line\n        {\n            return;\n        }\n        // prevent _updateTimeline from overwriting the new position because of a reset:\n        this._prevPos = NaN;\n        this.currentFrame = pos;\n\n        // Handle the case where trying to play but haven't\n        // added to the stage yet\n        if (!this._framerate)\n        {\n            this.framerate = this.parentFramerate;\n        }\n\n        // update the elapsed time if a time based movieclip\n        if (this._framerate > 0)\n        {\n            this._t = pos / this._framerate;\n        }\n        else\n        {\n            this._t = 0;\n        }\n        this._updateTimeline();\n    }\n\n    /**\n     * Reset the movieclip to the first frame (without advancing the timeline).\n     */\n    private _reset(): void\n    {\n        this._prevPos = -1;\n        this._t = 0;\n        this.currentFrame = 0;\n    }\n\n    /**\n     * Update timeline position according to playback, performing actions and updating children.\n     * @private\n     */\n    public _updateTimeline(): void\n    {\n        const synched = this.mode !== MovieClip.INDEPENDENT;\n\n        if (synched)\n        {\n            this.currentFrame = this.startPosition + (this.mode === MovieClip.SINGLE_FRAME ? 0 : this._synchOffset);\n            if (this.currentFrame >= this._totalFrames)\n            {\n                this.currentFrame %= this._totalFrames;\n            }\n        }\n\n        if (this._prevPos === this.currentFrame)\n        {\n            return;\n        }\n\n        // update timeline position, ignoring actions if this is a graphic.\n        this._setTimelinePosition(this._prevPos, this.currentFrame, synched ? false : this.actionsEnabled);\n\n        this._prevPos = this.currentFrame;\n    }\n\n    /**\n     * Set the timeline position\n     */\n    protected _setTimelinePosition(startFrame: number, currentFrame: number, doActions: boolean): void\n    {\n        if (startFrame !== currentFrame && doActions)\n        {\n            let startPos: number;\n\n            if (isNaN(startFrame))\n            {\n                startPos = currentFrame;\n            }\n            else\n            {\n                startPos = (startFrame >= this._totalFrames - 1 ? 0 : startFrame + 1);\n            }\n            // generate actionFrames on the way\n            const actionFrames: number[] = [];\n\n            // loop\n            if (currentFrame < startPos)\n            {\n                for (let i = startPos; i < this._actions.length; ++i)\n                {\n                    if (this._actions[i])\n                    {\n                        actionFrames.push(i);\n                    }\n                }\n                for (let i = 0; i <= currentFrame; ++i)\n                {\n                    if (this._actions[i])\n                    {\n                        actionFrames.push(i);\n                    }\n                }\n            }\n            // no loop\n            else\n            {\n                for (let i = startPos; i <= currentFrame; ++i)\n                {\n                    if (this._actions[i])\n                    {\n                        actionFrames.push(i);\n                    }\n                }\n            }\n\n            if (actionFrames.length)\n            {\n                const oldCurrentFrame = this.currentFrame;\n\n                for (let i = 0; i < actionFrames.length; ++i)\n                {\n                    const frame = actionFrames[i];\n\n                    this._setTimelinePosition(frame, frame, true);\n                    // _goto is called OR last frame reached\n                    if (this.currentFrame !== oldCurrentFrame || frame === currentFrame)\n                    {\n                        return;\n                    }\n                    // stop is called\n                    else if (this.paused)\n                    {\n                        this.currentFrame = frame;\n\n                        return;\n                    }\n                }\n            }\n        }\n\n        // handle all tweens\n        const _timelines = this._timelines;\n\n        for (let i = _timelines.length - 1; i >= 0; --i)\n        {\n            const timeline = _timelines[i];\n\n            for (let j = 0, length = timeline.length; j < length; ++j)\n            {\n                const tween = timeline[j];\n\n                // if the tween contains part of the timeline that we are travelling through\n                if (currentFrame >= tween.startFrame && currentFrame <= tween.endFrame)\n                {\n                    // set the position within that tween\n                    // and break the loop to move onto the next timeline\n                    tween.setPosition(currentFrame);\n                    break;\n                }\n            }\n        }\n\n        const timedChildTimelines = this._timedChildTimelines;\n        const depthSorted = this._depthSorted;\n\n        for (let i = 0, length = timedChildTimelines.length; i < length; ++i)\n        {\n            const target = timedChildTimelines[i].target;\n            const shouldBeChild = timedChildTimelines[i][currentFrame];\n\n            // if child should be on stage and is not:\n            if (shouldBeChild)\n            {\n                // Add to the depthSorted object so we can\n                // check that items are property drawn later\n                depthSorted.push(target);\n                if (target.parent !== this)\n                {\n                    // add the target if it's not there already\n                    this.addChild(target);\n                    if (target instanceof MovieClip && target.mode === MovieClip.INDEPENDENT && target.autoReset)\n                    {\n                        target._reset();\n                    }\n                }\n            }\n            else if (!shouldBeChild && target.parent === this)\n            {\n                this.removeChild(target);\n            }\n        }\n\n        // Properly depth sort the children\n        for (let i = 0, length = depthSorted.length; i < length; i++)\n        {\n            const target = depthSorted[i];\n            const currentIndex = this.children.indexOf(target);\n\n            if (currentIndex !== i)\n            {\n                this.addChildAt(target, i);\n            }\n        }\n\n        // Clear the temporary depth sorting array\n        depthSorted.length = 0;\n\n        // go through all children and update synched movieclips that are not single frames\n        const children = this.children;\n\n        for (let i = 0, length = children.length; i < length; ++i)\n        {\n            const child = children[i];\n\n            if (child instanceof MovieClip && child.mode === MovieClip.SYNCHED)\n            {\n                child._synchOffset = currentFrame - child.parentStartPosition;\n                child._updateTimeline();\n            }\n        }\n\n        // handle actions\n        if (doActions && this._actions && this._actions[currentFrame])\n        {\n            const frameActions = this._actions[currentFrame];\n\n            for (let j = 0; j < frameActions.length; ++j)\n            {\n                frameActions[j].call(this);\n            }\n        }\n    }\n\n    destroy(options?: IDestroyOptions | boolean): void\n    {\n        if (this._tickListener)\n        {\n            SharedTicker.remove(this._tickListener, null);\n            this._tickListener = null;\n        }\n        const hiddenChildren = [];\n        const timelines = this._timelines;\n\n        if (timelines)\n        {\n            for (let i = 0; i < timelines.length; i++)\n            {\n                const timeline = timelines[i];\n\n                hiddenChildren.push(timeline.target);\n                timeline.destroy();\n            }\n        }\n        const childTimelines = this._timedChildTimelines;\n\n        if (childTimelines)\n        {\n            for (let i = 0; i < childTimelines.length; i++)\n            {\n                const timeline = childTimelines[i];\n\n                if (hiddenChildren.indexOf(timeline.target) < 0)\n                {\n                    hiddenChildren.push(timeline.target);\n                }\n                timeline.length = 0;\n            }\n        }\n        // Destroy all the children\n        for (let i = 0; i < hiddenChildren.length; i++)\n        {\n            // Don't destroy children in the display list\n            if (this.children.indexOf(hiddenChildren[i]) < 0)\n            {\n                hiddenChildren[i].destroy(options as IDestroyOptions);\n            }\n        }\n        hiddenChildren.length = 0;\n        this._actions = null;\n        this._timelines = null;\n        this._depthSorted = null;\n        this._timedChildTimelines = null;\n        this._beforeUpdate = null;\n        this._labels = null;\n        this._labelDict = null;\n        super.destroy(options as IDestroyOptions);\n    }\n}\n"],"names":[],"mappings":"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"}