Esempio n. 1
0
    //-----------------------------------------------------------------
    //! @summary   UIへノーツ情報を反映させる
    //!
    //! @parameter [displayNotes] 表示するノーツ
    //!
    //! @return    なし
    //-----------------------------------------------------------------
    public void DisplayNotes(EditNotesController displayNotes)
    {
        // UIへ情報を反映させる
        if (displayNotes != null)
        {
            // ノーツデータの取得
            PiarhythmDatas.NoteData notesData = displayNotes.GetNotesData();

            // 音階の更新
            m_musicalScaleInputField.text = notesData.m_scale;

            // 開始の拍数を更新
            m_startBeatInputField.text = notesData.m_startBeat.ToString();

            // 音符の長さを更新
            m_noteLengthDropdown.value = notesData.m_noteLength;

            // 色の更新
            if (notesData.m_color == Color.magenta)
            {
                m_colorDropdown.value = 0;
            }
            else if (notesData.m_color == Color.green)
            {
                m_colorDropdown.value = 1;
            }
            else if (notesData.m_color == Color.cyan)
            {
                m_colorDropdown.value = 2;
            }
        }
    }
Esempio n. 2
0
    //-----------------------------------------------------------------
    //! @summary   連結ノーツの生成処理(引数あり)
    //!
    //! @parameter [noteData] 連結させるノーツデータ
    //!
    //! @return    なし
    //-----------------------------------------------------------------
    public void CreateConnectNote(PiarhythmDatas.NoteData noteData)
    {
        // 連結ノーツを生成する
        GameObject connectNote = Instantiate(m_connectNotePrefab);

        // コンポーネントの取得
        ConnectNoteController connectNoteController = connectNote.GetComponent <ConnectNoteController>();

        // NoteManagerを設定する
        connectNoteController.SetNoteManager(this);
        // キャンバスの設定
        connectNoteController.SetCanvas(m_canvas);
        // キーボード情報
        connectNoteController.SetKeyDictionary(m_keyDictionary);
        // OptionSheetControllerを設定する
        connectNoteController.SetOptionSheetController(m_optionSheetController);

        // MusicalScoreの子に設定する
        connectNote.GetComponent <RectTransform>().SetParent(m_musicalScore.GetComponent <RectTransform>());

        // 連結に使用したノーツデータを登録する
        PiarhythmDatas.NoteData nextNoteData = noteData;
        while (nextNoteData != null)
        {
            connectNoteController.AddNoteData(nextNoteData);
            nextNoteData = nextNoteData.m_nextNoteData;
        }

        // 初期化処理
        connectNoteController.Initialize();

        // リストに登録する
        m_notesList.Add(connectNote);
    }
Esempio n. 3
0
    //-----------------------------------------------------------------
    //! @summary   ノーツの移動処理
    //!
    //! @parameter [scale] 音階
    //! @parameter [positionY] Y座標
    //!
    //! @return    なし
    //-----------------------------------------------------------------
    private void MoveEditNotes(string scale, float positionY)
    {
        // ノーツの移動
        m_transform.localPosition = new Vector3(m_transform.localPosition.x, positionY, 0.0f);
        SetNotesScale(scale);

        // 移動制限
        Vector2 offsetMin = m_transform.offsetMin;

        if (offsetMin.y <= 0.0)
        {
            offsetMin.y = 0.0f;
        }
        m_transform.offsetMin = offsetMin;

        // 最新データの作成
        PiarhythmDatas.PositionData positionData = new PiarhythmDatas.PositionData();
        positionData.m_position = m_transform.offsetMin.y;
        positionData.m_lenght   = m_transform.sizeDelta.y;

        // データの更新
        PiarhythmDatas.NoteData notesData = m_optionSheetController.ConvertToNotesData(positionData);
        m_notesData.m_startBeat = notesData.m_startBeat;
        m_notesData.m_scale     = scale;

        // 位置調整
        positionData          = m_optionSheetController.ConvertToPositionData(m_notesData.m_startBeat, m_notesData.m_noteLength);
        m_transform.offsetMin = new Vector2(m_transform.offsetMin.x, positionData.m_position);
        m_transform.offsetMax = new Vector2(m_transform.offsetMax.x, m_transform.offsetMin.y + positionData.m_lenght);
    }
Esempio n. 4
0
    //-----------------------------------------------------------------
    //! @summary   ノーツの生成処理(引数あり)
    //!
    //! @parameter [notesDetas] ノーツデータの配列
    //!
    //! @return    なし
    //-----------------------------------------------------------------
    public void CreateNotes(PiarhythmDatas.NoteData noteData)
    {
        // ノーツを生成する
        GameObject newNotes = Instantiate(m_notesPrefab);

        // コンポーネントの取得
        EditNotesController editNotes = newNotes.GetComponent <EditNotesController>();

        // マネージャーを設定する
        editNotes.SetNotesManager(this);
        // キャンバスの設定
        editNotes.SetCanvas(m_canvas);
        // キーボード情報
        editNotes.SetKeyDictionary(m_keyDictionary);
        // NotesSheetControllerを設定する
        editNotes.SetNotesSheetController(m_notesSheetController);
        // OptionSheetControllerを設定する
        editNotes.SetOptionSheetController(m_optionSheetController);

        // MusicalScoreの子に設定する
        newNotes.GetComponent <RectTransform>().SetParent(m_musicalScore.GetComponent <RectTransform>());

        // 初期化処理
        editNotes.Initialize();

        // ノーツデータを設定する
        editNotes.SetNotesData(noteData);

        // リストに登録する
        m_notesList.Add(newNotes);
    }
Esempio n. 5
0
    //-----------------------------------------------------------------
    //! @summary   ノーツデータを設定する
    //!
    //! @parameter [notesData] 設定するノーツデータ
    //-----------------------------------------------------------------
    public void SetNotesData(PiarhythmDatas.NoteData noteData)
    {
        // データを設定する
        m_notesData = noteData;

        SetNotesScale(m_notesData.m_scale);
        SetNotesStartTime(m_notesData.m_startBeat);
        SetNotesLengthTime(m_notesData.m_noteLength);
        SetNotesColor(m_notesData.m_color);
    }
Esempio n. 6
0
    // メンバ関数の定義 =====================================================
    #region 初期化処理
    //-----------------------------------------------------------------
    //! @summary   初期化処理
    //!
    //! @parameter [void] なし
    //!
    //! @return    なし
    //-----------------------------------------------------------------
    private void Start()
    {
        // コンポーネントの取得
        m_transform = GetComponent <RectTransform>();
        m_image     = GetComponent <Image>();

        // 色の初期化
        // #の色を変化させる
        m_image.color = (m_noteData.m_scale.Contains("#"))
                        ? new UnityEngine.Color(m_noteData.m_color.r * PiarhythmDatas.SHARP_COLOR_PERCENTAGE, m_noteData.m_color.g * PiarhythmDatas.SHARP_COLOR_PERCENTAGE, m_noteData.m_color.b * PiarhythmDatas.SHARP_COLOR_PERCENTAGE, 1.0f)
                        : new UnityEngine.Color(m_noteData.m_color.r, m_noteData.m_color.g, m_noteData.m_color.b, 1.0f);

        // スケールの初期化
        m_transform.localScale = Vector3.one;

        // 音階の設定
        // 座標を設定された音階の位置に移動させる
        m_transform.position = new Vector3(m_keyDictionary[m_noteData.m_scale].position.x, m_transform.position.y, m_transform.position.z);

        float width = m_keyDictionary[m_noteData.m_scale].sizeDelta.x
                      * m_keyDictionary[m_noteData.m_scale].parent.GetComponent <RectTransform>().localScale.x;

        m_transform.sizeDelta = new Vector2(width, m_transform.sizeDelta.y);

        // 手前に持ってくる
        Vector3 position = m_transform.localPosition;

        position.z = 0.0f;
        m_transform.localPosition = position;

        // 開始時間と長さの初期化
        PiarhythmDatas.PositionData positionData = m_musicController.ConvertToPositionData(m_noteData.m_startBeat, m_noteData.m_noteLength);
        Vector2 offsetMin = m_transform.offsetMin;

        offsetMin.y           = positionData.m_position;
        m_transform.offsetMin = offsetMin;
        Vector2 offsetMax = m_transform.offsetMax;

        offsetMax.y           = offsetMin.y + positionData.m_lenght;
        m_transform.offsetMax = offsetMax;

        PiarhythmDatas.NoteData noteData = m_noteData.m_nextNoteData;
        while (noteData != null)
        {
            positionData          = m_musicController.ConvertToPositionData(noteData.m_startBeat, noteData.m_noteLength);
            offsetMax             = m_transform.offsetMax;
            offsetMax.y          += positionData.m_lenght;
            m_transform.offsetMax = offsetMax;

            noteData = noteData.m_nextNoteData;
        }
    }
Esempio n. 7
0
    //-----------------------------------------------------------------
    //! @summary   再生瞬間のノーツの処理
    //!
    //! @parameter [elapsedTime] 経過時間
    //!
    //! @return    なし
    //-----------------------------------------------------------------
    public void PlayMomentEditNotes(float elapsedTime)
    {
        foreach (GameObject notes in m_notesList)
        {
            PiarhythmDatas.NoteData notesData = null;

            // コンポーネントの取得
            if (notes.GetComponent <EditNotesController>())
            {
                EditNotesController editNotesController = notes.GetComponent <EditNotesController>();

                // データの取得
                notesData = editNotesController.GetNotesData();

                // 経過時間が既にノーツの開始時間を過ぎている
                float startTime = m_optionSheetController.GetStartTime(notesData.m_startBeat);
                if (elapsedTime > startTime)
                {
                    // 音をならないようにする
                    editNotesController.SetPlayedFlag(true);
                }
                else
                {
                    editNotesController.SetPlayedFlag(false);
                }
            }
            else
            {
                ConnectNoteController connectNoteController = notes.GetComponent <ConnectNoteController>();

                // データの取得
                notesData = connectNoteController.GetNoteData();

                // 経過時間が既にノーツの開始時間を過ぎている
                float startTime = m_optionSheetController.GetStartTime(notesData.m_startBeat);
                if (elapsedTime > startTime)
                {
                    // 音をならないようにする
                    connectNoteController.SetPlayedFlag(true);
                }
                else
                {
                    connectNoteController.SetPlayedFlag(false);
                }
            }
        }
    }
Esempio n. 8
0
    //-----------------------------------------------------------------
    //! @summary   ノーツの連結を解除
    //!
    //! @parameter [void] なし
    //!
    //! @return    なし
    //-----------------------------------------------------------------
    public void CuttingNote()
    {
        // 選択されているノーツが複数だった場合、処理を終了する
        if (m_selectNotes.Count != 1)
        {
            return;
        }

        // 選択されているノーツが連結ノーツでなければ処理を終了する
        ConnectNoteController connectNoteController = m_selectNotes[0].GetComponent <ConnectNoteController>();

        if (connectNoteController == null)
        {
            return;
        }

        // データを取得する
        PiarhythmDatas.NoteData noteData = connectNoteController.GetNoteData();

        while (noteData != null)
        {
            // 次のノーツを保存しておく
            PiarhythmDatas.NoteData nextNoteData = noteData.m_nextNoteData;

            // 連結を切る
            noteData.m_nextNoteData = null;

            // ノーツを生成する
            CreateNotes(noteData);

            // ノーツの更新をする
            noteData = nextNoteData;
        }

        // リストから削除する
        m_notesList.Remove(m_selectNotes[0]);

        // 削除する
        Destroy(m_selectNotes[0]);

        // リストをクリアする
        m_selectNotes.Clear();

        // UIの表示を更新する
        SetSelectNotes(null);
    }
Esempio n. 9
0
    // メンバ関数の定義 =====================================================
    #region 初期化処理
    //-----------------------------------------------------------------
    //! @summary   初期化処理
    //!
    //! @parameter [void] なし
    //!
    //! @return    なし
    //-----------------------------------------------------------------
    public void Initialize()
    {
        // コンポーネントの取得
        m_transform             = GetComponent <RectTransform>();
        m_glowImage             = GetComponent <GlowImage>();
        m_musicalScoreTransform = m_transform.parent.GetComponent <RectTransform>();
        m_audioSource           = GetComponent <AudioSource>();

        // データの初期化
        m_notesData = ScriptableObject.CreateInstance <PiarhythmDatas.NoteData>();

        // 色の初期化
        PiarhythmDatas.Color colorData = new PiarhythmDatas.Color();
        colorData.r         = Color.green.r;
        colorData.g         = Color.green.g;
        colorData.b         = Color.green.b;
        colorData.a         = Color.green.a;
        m_notesData.m_color = colorData;
        m_glowImage.color   = m_glowImage.glowColor = Color.green;

        // スケールの初期化
        m_transform.localScale = Vector3.one;

        // 音階の設定
        SetNotesScale("C4");

        // 手前に持ってくる
        Vector3 position = m_transform.localPosition;

        position.z = 0.0f;
        m_transform.localPosition = position;

        // 開始時間と長さの初期化
        PiarhythmDatas.PositionData positionData = new PiarhythmDatas.PositionData();
        positionData.m_position = m_transform.offsetMin.y;
        positionData.m_lenght   = m_transform.sizeDelta.y;
        PiarhythmDatas.NoteData notesData = m_optionSheetController.ConvertToNotesData(positionData);
        m_notesData.m_startBeat  = notesData.m_startBeat;
        m_notesData.m_noteLength = 2;
        positionData             = m_optionSheetController.ConvertToPositionData(m_notesData.m_startBeat, m_notesData.m_noteLength);
        m_transform.offsetMin    = new Vector2(m_transform.offsetMin.x, positionData.m_position);
        m_transform.offsetMax    = new Vector2(m_transform.offsetMax.x, m_transform.offsetMin.y + positionData.m_lenght);

        // 光彩を切る
        m_glowImage.glowSize = 0.0f;
    }
Esempio n. 10
0
 //-----------------------------------------------------------------
 //! @summary   連結に使用したノーツデータを保存する
 //!
 //! @parameter [noteData] 保存するノーツデータ
 //!
 //! @return    なし
 //-----------------------------------------------------------------
 public void AddNoteData(PiarhythmDatas.NoteData noteData)
 {
     // 登録する
     m_noteList.Add(noteData);
 }
Esempio n. 11
0
    //-----------------------------------------------------------------
    //! @summary   ノーツの開始座標と長さから開始拍と音符に変換する
    //!
    //! @parameter [positionData] 座標データ
    //!
    //! @return    ノーツデータ
    //-----------------------------------------------------------------
    public PiarhythmDatas.NoteData ConvertToNotesData(PiarhythmDatas.PositionData positionData)
    {
        PiarhythmDatas.NoteData notesData = ScriptableObject.CreateInstance <PiarhythmDatas.NoteData>();
        float elapsedBeat     = 0.0f;
        float elapsedPosition = 0.0f;

        // 所属しているテンポデータを調べる
        PiarhythmDatas.TempoData tempoData = m_tempoDataList[0];
        for (int i = 1; i < m_tempoDataList.Count; ++i)
        {
            // 一拍当たりの時間を求める
            float beatPerTempo = 60.0f / tempoData.m_tempo;
            // 時間を座標に変換する
            float beatPosition = PiarhythmUtility.ConvertTimeToPosition(beatPerTempo, NotesManager.NOTES_SPEED);

            // テンポデータの終了座標を求める
            float endPosition = beatPosition * ((m_tempoDataList[i].m_startMeasure - tempoData.m_startMeasure) * 4) + elapsedPosition;

            if (positionData.m_position >= endPosition)
            {
                // 経過座標を更新する
                elapsedPosition = endPosition;

                // 経過拍数を増やす
                elapsedBeat += (m_tempoDataList[i].m_startMeasure - tempoData.m_startMeasure) * 4;

                // 現在のテンポデータを更新する
                tempoData = m_tempoDataList[i];
            }
            else
            {
                break;
            }
        }

        // 現在のテンポデータから正確な位置を確定させる
        {
            float beatPerTempo = 60.0f / tempoData.m_tempo;
            float beatPosition = PiarhythmUtility.ConvertTimeToPosition(beatPerTempo, NotesManager.NOTES_SPEED);

            // 残りの座標を求める
            float residualPosition = positionData.m_position - elapsedPosition;

            // 残りの拍数を求める
            float residualBeat = residualPosition / beatPosition;

            // 残りの拍数を0.25倍に丸める
            residualBeat = PiarhythmUtility.MRound(residualBeat, 0.25f);

            // 経過拍数に加算する
            elapsedBeat += residualBeat;

            // データを保存する
            notesData.m_startBeat = elapsedBeat;


            // 長さを求める
            float noteLength = positionData.m_lenght / beatPosition;

            // 0.25倍に丸める
            noteLength = PiarhythmUtility.MRound(noteLength, 0.25f);

            // 一番近い長さを元に音符を決める
            if (Mathf.Approximately(noteLength, PiarhythmDatas.NoteTime.WHOLE_NOTE_SEMIBREVE))
            {
                notesData.m_noteLength = 0;
            }
            else if (Mathf.Approximately(noteLength, PiarhythmDatas.NoteTime.HALF_NOTE_MININ))
            {
                notesData.m_noteLength = 1;
            }
            else if (Mathf.Approximately(noteLength, PiarhythmDatas.NoteTime.QUARTER_NOTE_CROCHET))
            {
                notesData.m_noteLength = 2;
            }
            else if (Mathf.Approximately(noteLength, PiarhythmDatas.NoteTime.EIGHTH_NOTE_QUAVER))
            {
                notesData.m_noteLength = 3;
            }
            else if (Mathf.Approximately(noteLength, PiarhythmDatas.NoteTime.SIXTEENTH_NOTE_SEMIQUAVER))
            {
                notesData.m_noteLength = 4;
            }
            else if (Mathf.Approximately(noteLength, PiarhythmDatas.NoteTime.WHOLE_DOTTED_NOTE_SEMIBREVE))
            {
                notesData.m_noteLength = 5;
            }
            else if (Mathf.Approximately(noteLength, PiarhythmDatas.NoteTime.HALF_DOTTED_NOTE_MININ))
            {
                notesData.m_noteLength = 6;
            }
            else if (Mathf.Approximately(noteLength, PiarhythmDatas.NoteTime.QUARTER_DOTTED_NOTE_CROCHET))
            {
                notesData.m_noteLength = 7;
            }
            else if (Mathf.Approximately(noteLength, PiarhythmDatas.NoteTime.EIGHTH_DOTTED_NOTE_QUAVER))
            {
                notesData.m_noteLength = 8;
            }
            else
            {
                notesData.m_noteLength = 2;
            }
        }

        return(notesData);
    }
Esempio n. 12
0
    //-----------------------------------------------------------------
    //! @summary   連結可能か調べる
    //!
    //! @parameter [void] なし
    //!
    //! @return    true :連結可能
    //! @return    false:連結不可
    //-----------------------------------------------------------------
    private bool CheckConnectNote()
    {
        // 二つ以上ノーツが選択されていない
        if (m_selectNotes.Count <= 1)
        {
            return(false);
        }

        PiarhythmDatas.NoteData notesData = m_selectNotes[0].GetComponent <EditNotesController>().GetNotesData();
        string scale = notesData.m_scale;

        PiarhythmDatas.Color color = notesData.m_color;
        float nextStart            = notesData.m_startBeat;

        switch (notesData.m_noteLength)
        {
        case 0:
            nextStart += PiarhythmDatas.NoteTime.WHOLE_NOTE_SEMIBREVE;
            break;

        case 1:
            nextStart += PiarhythmDatas.NoteTime.HALF_NOTE_MININ;
            break;

        case 2:
            nextStart += PiarhythmDatas.NoteTime.QUARTER_NOTE_CROCHET;
            break;

        case 3:
            nextStart += PiarhythmDatas.NoteTime.EIGHTH_NOTE_QUAVER;
            break;

        case 4:
            nextStart += PiarhythmDatas.NoteTime.SIXTEENTH_NOTE_SEMIQUAVER;
            break;

        case 5:
            nextStart += PiarhythmDatas.NoteTime.WHOLE_DOTTED_NOTE_SEMIBREVE;
            break;

        case 6:
            nextStart += PiarhythmDatas.NoteTime.HALF_DOTTED_NOTE_MININ;
            break;

        case 7:
            nextStart += PiarhythmDatas.NoteTime.QUARTER_DOTTED_NOTE_CROCHET;
            break;

        case 8:
            nextStart += PiarhythmDatas.NoteTime.EIGHTH_DOTTED_NOTE_QUAVER;
            break;
        }

        for (int i = 1; i < m_selectNotes.Count; ++i)
        {
            // データを取得する
            notesData = m_selectNotes[i].GetComponent <EditNotesController>().GetNotesData();

            // 音階が一致するか調べる
            if (notesData.m_scale != scale)
            {
                return(false);
            }

            // 次の開始位置を調べる
            if (!Mathf.Approximately(notesData.m_startBeat, nextStart))
            {
                return(false);
            }

            // 色を調べる
            if ((!Mathf.Approximately(notesData.m_color.r, color.r)) &&
                (!Mathf.Approximately(notesData.m_color.g, color.g)) &&
                (!Mathf.Approximately(notesData.m_color.b, color.b)))
            {
                return(false);
            }

            // データを更新する
            switch (notesData.m_noteLength)
            {
            case 0:
                nextStart += PiarhythmDatas.NoteTime.WHOLE_NOTE_SEMIBREVE;
                break;

            case 1:
                nextStart += PiarhythmDatas.NoteTime.HALF_NOTE_MININ;
                break;

            case 2:
                nextStart += PiarhythmDatas.NoteTime.QUARTER_NOTE_CROCHET;
                break;

            case 3:
                nextStart += PiarhythmDatas.NoteTime.EIGHTH_NOTE_QUAVER;
                break;

            case 4:
                nextStart += PiarhythmDatas.NoteTime.SIXTEENTH_NOTE_SEMIQUAVER;
                break;

            case 5:
                nextStart += PiarhythmDatas.NoteTime.WHOLE_DOTTED_NOTE_SEMIBREVE;
                break;

            case 6:
                nextStart += PiarhythmDatas.NoteTime.HALF_DOTTED_NOTE_MININ;
                break;

            case 7:
                nextStart += PiarhythmDatas.NoteTime.QUARTER_DOTTED_NOTE_CROCHET;
                break;

            case 8:
                nextStart += PiarhythmDatas.NoteTime.EIGHTH_DOTTED_NOTE_QUAVER;
                break;
            }
        }

        return(true);
    }
Esempio n. 13
0
    //-----------------------------------------------------------------
    //! @summary   連結ノーツの生成処理
    //!
    //! @parameter [void] なし
    //!
    //! @return    なし
    //-----------------------------------------------------------------
    public void CreateConnectNote()
    {
        // 連結可能か調べる
        if (!CheckConnectNote())
        {
            return;
        }

        // 連結ノーツを生成する
        GameObject connectNote = Instantiate(m_connectNotePrefab);

        // コンポーネントの取得
        ConnectNoteController connectNoteController = connectNote.GetComponent <ConnectNoteController>();

        // NoteManagerを設定する
        connectNoteController.SetNoteManager(this);
        // キャンバスの設定
        connectNoteController.SetCanvas(m_canvas);
        // キーボード情報
        connectNoteController.SetKeyDictionary(m_keyDictionary);
        // ConnectNoteSheetControllerを設定する
        connectNoteController.SetConnectNoteSheetController(m_connectNoteSheetController);
        // OptionSheetControllerを設定する
        connectNoteController.SetOptionSheetController(m_optionSheetController);

        // MusicalScoreの子に設定する
        connectNote.GetComponent <RectTransform>().SetParent(m_musicalScore.GetComponent <RectTransform>());

        // 連結に使用したノーツデータを登録する
        for (int i = 0; i < m_selectNotes.Count; ++i)
        {
            // データを取得する
            PiarhythmDatas.NoteData notesData = m_selectNotes[i].GetComponent <EditNotesController>().GetNotesData();

            // ノーツデータの連結先を更新する
            if (i + 1 < m_selectNotes.Count)
            {
                notesData.m_nextNoteData = m_selectNotes[i + 1].GetComponent <EditNotesController>().GetNotesData();
            }

            // 登録する
            connectNoteController.AddNoteData(notesData);

            // リストから削除する
            m_notesList.Remove(m_selectNotes[i]);

            // ノーツを削除する
            Destroy(m_selectNotes[i]);
        }

        // リストをクリアする
        m_selectNotes.Clear();

        // 初期化処理
        connectNoteController.Initialize();

        // リストに登録する
        m_notesList.Add(connectNote);

        // 生成されたノーツを選択中にする
        SetSelectNotes(connectNote);
    }
Esempio n. 14
0
 //-----------------------------------------------------------------
 //! @summary   ノーツデータを設定する
 //!
 //! @parameter [noteData] 設定するノーツデータ
 //-----------------------------------------------------------------
 public void SetNoteData(PiarhythmDatas.NoteData noteData)
 {
     m_noteData = noteData;
 }