Troika: "рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдЦреБрд▓реЗ рдХрд╛рд░реНрдпрдХрд░реНрддрд╛ рдореЙрдбреНрдпреВрд▓ рдЕрдиреБрд░реЛрдз, рдХреБрдЫ рд╡рд╛рдкрд╕ рдирд╣реАрдВ рдЖ рд░рд╣реЗ рд╣реИрдВ" рдЪреЗрддрд╛рд╡рдиреА

рдХреЛ рдирд┐рд░реНрдорд┐рдд 30 рдорд╛рд░реНрдЪ 2021  ┬╖  14рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: protectwise/troika

рдирдорд╕реНрддреЗ, рдореБрдЭреЗ рдЗрд╕ рд╕рдВрджреЗрд╢ рдХреЗ рд╕рд╛рде рдмрдбрд╝реА рдорд╛рддреНрд░рд╛ рдореЗрдВ troika-worker.utils.esm.js рд╕реЗ рдЖрдиреЗ рд╡рд╛рд▓реА рдЪреЗрддрд╛рд╡рдирд┐рдпрд╛рдВ рджрд┐рдЦрд╛рдИ рджреЗ рд░рд╣реА рд╣реИрдВред

Screen Shot 2021-03-29 at 8 19 42 PM

рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╕рдм рдХреБрдЫ рдареАрдХ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ

рдХреЛрдИ рдЙрдкрд╛рдп?

рд╕рднреА 14 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рд╣рдореНрдо, рд╡рд╣ рдЪреЗрддрд╛рд╡рдиреА рддрдм рддрдХ рдЯреНрд░рд┐рдЧрд░ рдирд╣реАрдВ рд╣реЛрддреА рдЬрдм рддрдХ рдХрд┐ > 1000 рдЦреБрд▓реЗ рдХрд╛рд░реНрдпрдХрд░реНрддрд╛ рдЕрдиреБрд░реЛрдз рди рд╣реЛрдВред рдХреНрдпрд╛ рдЖрдкрдХреЗ рдкрд╛рд╕ рдмрд╣реБрдд рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдЯреЗрдХреНрд╕реНрдЯ рдЗрдВрд╕реНрдЯреЗрдВрд╕ рд╣реИрдВ?

рдореИрдВ рдХрд░рддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди 1000 рд╕реЗ рдЕрдзрд┐рдХ рдирд╣реАрдВ (рдХрдо рд╕реЗ рдХрдо рдЬрд╛рдирдмреВрдЭрдХрд░ рдирд╣реАрдВ)

рдХреБрдЫ рд╕реМ рдХреА рддрд░рд╣ рдЕрдзрд┐рдХ

рдпрд╣рд╛рдБ рдореИрдВ рдХреНрдпрд╛ рдкреНрд░рд╕реНрддреБрдд рдХрд░ рд░рд╣рд╛ рд╣реВрдБ

Screen Shot 2021-03-30 at 11 03 39 AM

рд▓реЗрдХрд┐рди рддреЛ рдЖрдк рдХреНрдпрд╛ рдХрд╣ рд░рд╣реЗ рд╣реИрдВ рдХрд┐ рд╢рд╛рдпрдж рдореЗрд░реА рддрд░рдл рдПрдХ рдмрдЧ рд╣реИ рдЬрд╣рд╛рдВ рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЬрд░реВрд░рдд рд╕реЗ рдЬреНрдпрд╛рджрд╛ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рддрд╛ рд╣реВрдВ рдФрд░ рдПрдХ рдмрд╛рд░ рдЬрдм рдореИрдВ 1000 рдХреА рдЧрд┐рдирддреА рдкрд╛рд░ рдХрд░ рд▓реЗрддрд╛ рд╣реВрдВ рддреЛ рдпрд╣ рдПрдХ рддреНрд░реБрдЯрд┐ рдлреЗрдВрдХрдирд╛ рд╢реБрд░реВ рдХрд░ рджреЗрддрд╛ рд╣реИ?

рдореИрдВ рдРрд╕реЗ рдЙрджрд╛рд╣рд░рдг рд╕реНрдерд╛рдкрд┐рдд рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдЬрд┐рдирдореЗрдВ рдХреЛрдИ рд╕рд╛рдордЧреНрд░реА рдирд╣реАрдВ рд╣реИ .visible = false

рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрднреА рднреА рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЙрджрд╛рд╣рд░рдг рдореМрдЬреВрдж рд╣реИ

рдХреНрдпрд╛ рдЖрдк рдЕрдкреНрд░рдпреБрдХреНрдд рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП .visible рдкреНрд░реЛрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдЕрдиреБрд╢рдВрд╕рд╛ рдХрд░реЗрдВрдЧреЗ?

рдЖрд╣, рдпрд╣ рд╕рдордЭрд╛ рд╕рдХрддрд╛ рд╣реИред .sync() рдкрд░ рдХреЛрдИ рднреА рдХреЙрд▓ рдЕрднреА рднреА рдкреГрд╖реНрдарднреВрдорд┐ рдореЗрдВ рдХрд╛рд░реНрдпрдХрд░реНрддрд╛ рдХреЛ рдЬрд╛рд░реА рдХреА рдЬрд╛рдПрдЧреА, рднрд▓реЗ рд╣реА рджреГрд╢реНрдпрдорд╛рди: рдЧрд▓рдд рд╣реЛ, рдФрд░ рд╡реЗ рдвреЗрд░ рд╣реЛ рдЬрд╛рдПрдВрдЧреЗред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдорд╛рдВрдЧ рдкрд░ рд▓реЗрдмрд▓ рдмрдирд╛рдиреЗ/рдирд┐рдкрдЯрд╛рди рдХрд░рдиреЗ рдХрд╛ рд╡рд┐рдХрд▓реНрдк рдЪреБрдиреВрдВрдЧрд╛, рдпрд╛ рдХрдо рд╕реЗ рдХрдо .sync() рдЫрд┐рдкреЗ рд╣реБрдП рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдХреЙрд▓ рдХреЛ рд░реЛрдХреВрдВрдЧрд╛ред рд╡реЗ рдХрд╛рд░реНрдпрдХрд░реНрддрд╛ рдЕрдиреБрд░реЛрдз рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рд╕рднреА рдПрдХ рд╣реА рдХрд╛рд░реНрдпрдХрд░реНрддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ, рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рдпрд╣ рдЫрд┐рдкреЗ рд╣реБрдП рд▓реЗрдмрд▓ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╡реНрдпрд╕реНрдд рд╣реИ рддреЛ рдЗрд╕рд╕реЗ рдЖрдкрдХреЗ рджреГрд╢реНрдпрдорд╛рди рд▓реЛрдЧреЛрдВ рдХреЗ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рджреЗрд░реА рд╣реЛ рд╕рдХрддреА рд╣реИред

рдореИрдВ рдХреБрдЫ рдзрд╛рд░рдгрд╛рдПрдБ рдмрдирд╛ рд░рд╣рд╛ рд╣реВрдБ, рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЖрдкрдХрд╛ рд╕рдЯреАрдХ рд▓реЗрдмрд▓ рд╡реНрдпреВ рдХреЛрдб рдирд╣реАрдВ рджреЗрдЦрд╛ рд╣реИред рдпрд╣ рдЕрднреА рднреА рд╕рдВрднрд╡ рд╣реИ рдХрд┐ рдореЗрд░реЗ рдЕрдВрдд рдореЗрдВ рдПрдХ рдмрдЧ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдПрд▓рдПрдордХреЗ рдЬреЛ рдЖрдкрдХреЛ рдорд┐рд▓ рдЬрд╛рдПред

рдХреЗрд╡рд▓ .sync() рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛ рдЬрдм .visible === true

рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА рдЪреЗрддрд╛рд╡рдирд┐рдпрд╛рдВ рдорд┐рд▓ рд░рд╣реА рд╣реИрдВ

рдЕрдЧрд░ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдореИрдВ рдХреЗрд╡рд▓ рджреГрд╢реНрдпрдорд╛рди рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд▓рд┐рдП рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рддрд╛ рд╣реВрдВ рдФрд░ рдЕрдкреНрд░рдпреБрдХреНрдд рдХреЛ рдирд╖реНрдЯ рдХрд░ рджреЗрддрд╛ рд╣реВрдВ рддреЛ рдЪреЗрддрд╛рд╡рдирд┐рдпрд╛рдВ рджреВрд░ рд╣реЛ рдЬрд╛рддреА рд╣реИрдВ

рд╣рдореНрдо, Text рд╣реА рдХреЗрд╡рд▓ рд╕рд┐рдВрдХ() рдХреЛ onBeforeRender рдореЗрдВ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рджреГрд╢реНрдпрдорд╛рди = рдЧрд▓рдд рд╣реЛрдиреЗ рдкрд░ рдЯреНрд░рд┐рдЧрд░ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдХреНрдпрд╛ рдЖрдкрдХрд╛ рд▓реЗрдмрд▓ рд╡реНрдпреВ рд░реИрдкрд░ рдХреЛрдб рдХрд╣реАрдВ рднреА рдЙрдкрд▓рдмреНрдз рд╣реИ рдЬрд┐рд╕реЗ рдореИрдВ рджреЗрдЦ рд╕рдХрддрд╛ рд╣реВрдВ?

рдпрд╣ рдПрдХ рдмрдВрдж рд╕реНрд░реЛрдд рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИ

рд▓реЗрдХрд┐рди рдпрд╣рд╛рдВ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╡рд░реНрдЧ рд╣реИ, рдЬреЛ рдкрд░реНрдпрд╛рдкреНрдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИ

import {Mesh, MeshBasicMaterial} from "three";
import R from "../../../../../../../../../../resources/Namespace";
import BaseView, {ViewType} from "./BaseView";
import {Text} from "troika-three-text";
import {GeometryInstances} from "../instances/GeometryInstances";
import {MaterialInstances} from "../instances/MaterialInstances";

export enum TextAlign {
    left = "left",
    right = "right",
    center = "center",
    justify = "justify",
}

export enum HorizontalAlign {
    left = "left",
    right = "right",
    center = "center",
}

export enum VerticalAlign {
    top = "top",
    topBaseline = "top-baseline",
    middle = "middle",
    bottomBaseline = "bottom-baseline",
    bottom = "bottom",
}

export interface ILabelData {
    content: string;
    fontFace?: string;
    fontSize?: number;
    alignment?: TextAlign;
    horizontalAlign?: HorizontalAlign;
    verticalAlign?: VerticalAlign;
    color?: string;
    opacity?: number;
    backgroundColor?: string;
    highlightable: boolean;
}

export default class LabelView extends BaseView {
    get viewObject() {
        return this._viewObject as any;
    }

    get content() {
        return this.textMesh.text;
    }

    set content(content: string) {
        if (content !== this.textMesh.text) {
            this.textMesh.text = content;
            this.textMesh.visible = !!content;

            this.syncIfVisible();
        }
    }

    private syncIfVisible() {
        // Better for perf: https://github.com/protectwise/troika/issues/112
        if (this.textMesh?.text && this.textMesh?.visible && this._isVisible) {
            this.textMesh.sync();
        }
    }

    set textAlign(alignment: TextAlign) {
        this.textMesh.textAlign = alignment;
        this.syncIfVisible();
    }

    set horizontalAlign(alignment: HorizontalAlign) {
        this.textMesh.anchorX = alignment;
        this.syncIfVisible();
    }

    set verticalAlign(alignment: VerticalAlign) {
        this.textMesh.anchorY = alignment;
        this.syncIfVisible();
    }

    private backgroundMesh: Mesh | undefined;
    private readonly textMesh: any;
    private readonly foregroundColor: string;
    private highlightable: boolean;

    constructor(labelData: ILabelData) {
        super(ViewType.Label);

        this.foregroundColor = labelData.color || R.colors.elements.labels.foreground;

        this.highlightable = labelData.highlightable;

        if (labelData.backgroundColor) {
            this.textMesh = this.createTextMesh(
                labelData.content,
                labelData.fontFace,
                labelData.fontSize,
                labelData.alignment,
                labelData.horizontalAlign,
                labelData.verticalAlign,
                this.foregroundColor,
                labelData.opacity,
                1);

            this.textMesh.addEventListener("synccomplete", () => {
                if (this.backgroundMesh) {
                    this._viewObject.remove(this.backgroundMesh);
                }

                if (this.textMesh.text) {
                    const bounds = this.textMesh.textRenderInfo.blockBounds;
                    this.backgroundMesh =
                        this.createBackgroundBox(bounds[0], bounds[1], bounds[2], bounds[3], 0);
                    this._viewObject.add(this.backgroundMesh);
                }
            });

        } else {
            this.textMesh = this.createTextMesh(
                labelData.content,
                labelData.fontFace,
                labelData.fontSize,
                labelData.alignment,
                labelData.horizontalAlign,
                labelData.verticalAlign,
                this.foregroundColor,
                labelData.opacity,
                0);
        }

        this.syncIfVisible();

        this._viewObject.add(this.textMesh);
    }

    public onFrameRendered(elapsedTime: number) {
        if (this.highlightable) {
            this.setLabelHighlightState();
        }
    }

    private setLabelHighlightState() {
        const labelMaterial = this.textMesh.material as MeshBasicMaterial;
        if (this._isHighlighted) {
            labelMaterial.color.set(R.colors.elements.labels.highlighted);
        } else {
            labelMaterial.color.set(this.foregroundColor);
        }
    }

    private createTextMesh(content: string,
                           fontFace = R.layout.labels.font_face.regular,
                           fontSize = R.layout.labels.font_size,
                           textAlign = TextAlign.center,
                           horizontalAlign = HorizontalAlign.center,
                           verticalAlign = VerticalAlign.middle,
                           color: string,
                           opacity = 1,
                           zLevel: number) {
        const labelMesh = new Text();

        labelMesh.font = fontFace;
        labelMesh.text = content || "";
        labelMesh.fontSize = fontSize;
        labelMesh.position.z = zLevel;
        labelMesh.color = color;
        labelMesh.textAlign = textAlign;
        labelMesh.anchorX = horizontalAlign;
        labelMesh.anchorY = verticalAlign;

        labelMesh.material.opacity = opacity;
        labelMesh.name = "LabelView";

        return labelMesh;
    }

    private createBackgroundBox(startX: number, startY: number, endX: number, endY: number, zLevel: number) {
        const paddingLeft = 1;
        const paddingRight = 2;
        const paddingTop = 1;
        const paddingBottom = 0;

        const width = Math.abs(startX) + Math.abs(endX) + paddingLeft + paddingRight;
        const height = Math.abs(startY) + Math.abs(endY) + (paddingTop + paddingBottom);

        const geometry = GeometryInstances.getInstance().getPlaneGeometryInstance(width, height);
        const material = MaterialInstances.getInstance().backgroundColorMaterial;
        const mesh = new Mesh(geometry, material);

        const posX = ((startX + endX) / 2) + (paddingLeft / 4);
        const posY = ((startY + endY) / 2) - (paddingBottom);

        // The z level of element in accordance with standards defined in resources
        mesh.position.set(posX, posY, zLevel);
        mesh.name = "LabelBackgroundBox";

        return mesh;
    }
}

рд╣рдореНрдо, рдореЗрд░рд╛ рдХреВрдмрдбрд╝ рд╣реЛрдЧрд╛ рд╕рд┐рдВрдХрдЗрдлрд╡рд┐рдЬрд┐рдмрд▓ () рдХреЛ .visible рдХреЛ рдЧрд▓рдд рдкрд░ рд╕реЗрдЯ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдХрд╣рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИ рдХрд┐ рдмрд┐рдирд╛ рдпрд╣ рдЬрд╛рдиреЗ рдХрд┐ рдЖрдкрдХрд╛ рд╡реНрдпреВ рд╕рд┐рд╕реНрдЯрдо рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рдХреБрдЫ рдФрд░ рдЬреЛ рдореИрдВ рджреЗрдЦ рд░рд╣рд╛ рд╣реВрдВ рд╡рд╣ рдпрд╣ рд╣реИ рдХрд┐ рдЖрдк рдкреНрд░рддреНрдпреЗрдХ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд╕рдВрдкрддреНрддрд┐ рдкрд░рд┐рд╡рд░реНрддрди (рд╕рд╛рдордЧреНрд░реА, рдЯреЗрдХреНрд╕реНрдЯ рдПрд▓рд╛рдЗрди, рдХреНрд╖реИрддрд┐рдЬ рд╕рдВрд░реЗрдЦрдг, рдЖрджрд┐) рдХреЗ рдмрд╛рдж рд╕рд┐рдВрдХ рдЗрдлрд╡рд┐рдЬрд╝рд┐рдмрд▓ рдХреЙрд▓ рдЬрд╛рд░реА рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдЬреЛ рдХрд╛рд░реНрдпрдХрд░реНрддрд╛ рдХреЛ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╕реЗ рдЕрдзрд┐рдХ рдХреЙрд▓ рдЬрд╛рд░реА рдХрд░реЗрдЧрд╛ред рдпрджрд┐ рдЖрдкрдХреЗ рд╡реНрдпреВ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдПрдХ рдЬреАрд╡рдирдЪрдХреНрд░ рд╣реИ рдЬрд╣рд╛рдВ рдЖрдк рд╕рднреА рд╡реНрдпрдХреНрддрд┐рдЧрдд рдЧреБрдгреЛрдВ рдХреЗ рд╕реЗрдЯ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рдПрдХрд▓ рд╕рд┐рдВрдХ рдХреЙрд▓ рдЬрд╛рд░реА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдмрд╣реБрдд рдмреЗрд╣рддрд░ рд╣реЛрдЧрд╛ред

рдЖрдкрдиреЗ рдЬреЛ рд╡рд░реНрдгрди рдХрд┐рдпрд╛ рд╣реИ, рдЙрд╕рд╕реЗ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЪреЗрддрд╛рд╡рдиреА рдЕрдкреЗрдХреНрд╖рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░ рд░рд╣реА рд╣реИ; рдЗрд╕рдиреЗ рдПрдХ рдкреНрд░рджрд░реНрд╢рди рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд╣рд╛рдЗрд▓рд╛рдЗрдЯ рдХрд┐рдпрд╛ред рдореИрдВ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдмрдВрдж рдХрд░ рд░рд╣рд╛ рд╣реВрдБ; рдпрджрд┐ рдЖрдк рдЕрд▓рдЧ рддрд░рд╣ рд╕реЗ рд╡рд┐рд╢реНрд╡рд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рдЦреЛрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рддрдВрддреНрд░ рдорд╣рд╕реВрд╕ рдХрд░реЗрдВред рдзрдиреНрдпрд╡рд╛рдж!

рдмрд╕ рдЗрд╕ рдкрд░ рд╡рд╛рдкрд╕ рдЖ рд░рд╣рд╛ рд╣реВрдБ

рддреЛ рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рдореЗрд░реЗ рджреГрд╢реНрдп рдореЗрдВ рдЖрд╕рд╛рдиреА рд╕реЗ 1000 рд╕реЗ рдЕрдзрд┐рдХ рдЯреЗрдХреНрд╕реНрдЯ рдЗрдВрд╕реНрдЯреЗрдВрд╕ рд╣реИрдВред рд▓реЗрдХрд┐рди рд╡рд╣рд╛рдБ рдмрд╕ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рд╕рднреА рджрд┐рдЦрд╛рдИ рдирд╣реАрдВ рджреЗ рд░рд╣реЗ рд╣реИрдВ

рдЙрдирдореЗрдВ рд╕реЗ рдХрдИ рдмрд╕ рдХреБрдЫ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдорд╛рдЙрд╕-рдУрд╡рд░ рдкрд░ рджрд┐рдЦрд╛рдИ рджреЗрддреЗ рд╣реИрдВ

рддреЛ рдореИрдВ рд╕реЛрдЪ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдпрд╣рд╛рдВ рдЖрдЧреЗ рдмрдврд╝рдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рдХреНрдпрд╛ рд╣реИ:

  1. рдХреЗрд╡рд▓ рджреГрд╢реНрдпрдорд╛рди рдкрд╛рда рдХреЗ рд▓рд┐рдП рдЗрдВрд╕реНрдЯреЗрдВрд╕ рдмрдирд╛рдПрдВ рдФрд░ рдлрд┐рд░ рдЬреИрд╕реЗ рд╣реА рдпрд╣ рдЕрджреГрд╢реНрдп рд╣реЛ рдЬрд╛рдП, рдЕрдирдорд╛рдЙрдВрдЯ рдХрд░реЗрдВ?
  2. рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдереНрд░реАрдЬреЗрдПрд╕ рд╕реАрдПрд╕рдПрд╕ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ?

рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдореИрдВ рдкрд╣рд▓реЗ рд╡рд┐рдХрд▓реНрдк рдХреЗ рд▓рд┐рдП рдЬрд╛рдКрдВрдЧрд╛ред рдореИрдВ рдЧрд▓рдд рд╣реЛ рд╕рдХрддрд╛ рдерд╛ рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдЙрди рд╕рднреА рдЫрд┐рдкреА рд╣реБрдИ рд▓реЗрдмрд▓ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рджреГрд╢реНрдп рдЧреНрд░рд╛рдл рдореЗрдВ рдореМрдЬреВрдж рд╣реЛрдиреЗ рдХрд╛ рдХреЛрдИ рдлрд╛рдпрджрд╛ рд╣реИред

рд╕рдордЭ рд▓рд┐рдпрд╛

рдореБрдЭреЗ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдорд╛рдЙрд╕ рд╣реЛрд╡рд░ рдкрд░ рдЙрдиреНрд╣реЗрдВ рдЬрд▓реНрджреА рд╕реЗ рджрд┐рдЦрд╛рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП

рдХреНрдпрд╛ рдЖрдк рдЙрдкрдпреЛрдЧ рдХреЗ рдмрд╛рдж рдЙрдиреНрд╣реЗрдВ рдирд╖реНрдЯ рдХрд░рдиреЗ рдФрд░ рд╣реЛрд╡рд░ рдкрд░ рдирдП рдмрдирд╛рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрдВрдЧреЗ рдпрд╛ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдЙрдиреНрд╣реЗрдВ рдереНрд░реАрдЬреЗ рджреГрд╢реНрдп рд╕реЗ рд╣рдЯрд╛ рджреЗрдВрдЧреЗ?

рдИрдорд╛рдирджрд╛рд░реА рд╕реЗ рдХрд╣реВрдВ рддреЛ рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рдЕрдВрддрд░ рд╣реЛрдиреЗ рд╡рд╛рд▓рд╛ рд╣реИред рдпрджрд┐ рдЖрдк рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рджреЗрдЦрддреЗ рд╣реИрдВ рддреЛ рд╣реА рдореИрдВ рдкреНрд░рдмрдВрдзрди рдФрд░ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рдЪреАрдЬ рд╕реЗ рд╢реБрд░реВ рдХрд░реВрдВрдЧрд╛ред

рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдореИрдВрдиреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЛ рдмрдирд╛рдиреЗ/рдирд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдХреБрдЫ рдХрд┐рдпрд╛ рд╣реИ, рдФрд░ рдпрд╣ рд╣рдореЗрд╢рд╛ рдореЗрд░реЗ рд▓рд┐рдП рдмрд╣реБрдд рддреЗрдЬрд╝ рд╣реИред

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

arpu picture arpu  ┬╖  43рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

lojjic picture lojjic  ┬╖  11рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

stephencorwin picture stephencorwin  ┬╖  39рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

Ocelyn picture Ocelyn  ┬╖  13рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

drcmda picture drcmda  ┬╖  11рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ