Ejemplo n.º 1
0
        //────────────────────────────────────────
        /// <summary>
        /// 妥当性判定のグローバル設定ファイルの読取り。
        /// </summary>
        /// <param name="sFpatha">絶対ファイルパス</param>
        /// <param name="log_Reports"></param>
        public void LoadFile(
            string sFpatha,
            Log_Reports log_Reports
            )
        {
            Log_Method log_Method = new Log_MethodImpl(0, Log_ReportsImpl.BDebugmode_Static);
            log_Method.BeginMethod(Info_MiddleImpl.Name_Library, this, "LoadFile",log_Reports);
            //
            //

            this.xToConfigurationtree_V.XmlToConfigurationtree(
                sFpatha,
                owner_MemoryApplication,
                log_Reports
                );

            Log_TextIndented_ConfigurationtreeToExpressionImpl pg_ParsingLog = new Log_TextIndented_ConfigurationtreeToExpressionImpl();
            pg_ParsingLog.BEnabled = false;
            this.givechapterandverseToExpression_V.Translate(
                owner_MemoryApplication,
                pg_ParsingLog,
                log_Reports
                );
            if (log_Method.CanInfo() && pg_ParsingLog.BEnabled)
            {
                log_Method.WriteInfo_ToConsole(" d_ParsingLog=" + Environment.NewLine + pg_ParsingLog.ToString());
            }

            //
            //
            log_Method.EndMethod(log_Reports);
        }
Ejemplo n.º 2
0
        //────────────────────────────────────────
        /// <summary>
        /// ファイルパス型変数を登録します。
        /// 
        /// todo:文字列、ファイルパスの区別なく登録したい。
        /// </summary>
        /// <param name="sVariableName"></param>
        /// <param name="e_InitialValue"></param>
        /// <param name="bDuplicatedIsError">既に追加されているものを、更に追加しようとしたときにエラーにするなら真。</param>
        /// <param name="log_Reports"></param>
        public void PutFilepath(
            string sName_Variable,
            Expression_Node_Filepath ec_InitialValue,
            bool bDuplicatedIsError,
            Log_Reports log_Reports
            )
        {
            Log_Method log_Method = new Log_MethodImpl(0, Log_ReportsImpl.BDebugmode_Static);
            log_Method.BeginMethod(Info_MiddleImpl.Name_Library, this, "PutFilepath",log_Reports);
            //
            //

            if (this.dictionaryExpression_Item.ContainsKey(sName_Variable))
            {
                if (bDuplicatedIsError)
                {
                    goto gt_Error_Duplicated;
                }
                else
                {
                    // 上書き
                    string sOldValue = "";
                    if (log_Method.CanInfo())
                    {
                        sOldValue = this.dictionaryExpression_Item[sName_Variable].Execute4_OnExpressionString(EnumHitcount.Unconstraint, log_Reports);
                    }

                    this.dictionaryExpression_Item[sName_Variable] = ec_InitialValue;

                    if (log_Method.CanInfo())
                    {
                        log_Method.WriteInfo_ToConsole("変数[" + sName_Variable + "]は既に[" + sOldValue + "]と定義されていましたが、[" + ec_InitialValue.Execute4_OnExpressionString(EnumHitcount.Unconstraint, log_Reports) + "]で上書きしました。");
                    }
                }
            }
            else
            {
                this.dictionaryExpression_Item.Add(sName_Variable, ec_InitialValue);
            }

            goto gt_EndMethod;
            //
            //
            #region 異常系
            //────────────────────────────────────────
            gt_Error_Duplicated:
            if (log_Reports.CanCreateReport)
            {
                Log_RecordReports r = log_Reports.BeginCreateReport(EnumReport.Error);
                r.SetTitle("▲エラー922!", log_Method);
                r.Message = "変数[" + sName_Variable + "]は既に定義されていますが、さらに定義されました。";
                log_Reports.EndCreateReport();
            }
            goto gt_EndMethod;
            //────────────────────────────────────────
            #endregion
            //
            //
            gt_EndMethod:
            log_Method.EndMethod(log_Reports);
        }
Ejemplo n.º 3
0
        //────────────────────────────────────────
        /// <summary>
        /// デバッグ出力。
        /// </summary>
        public void WriteDebug_ToConsole()
        {
            Log_Method log_Method = new Log_MethodImpl(0);
            Log_Reports d_Logging_Dammy = new Log_ReportsImpl(log_Method);
            log_Method.BeginMethod(Info_MiddleImpl.Name_Library, this, "WriteDebug_ToConsole",d_Logging_Dammy);
            //
            //

            if (log_Method.CanInfo())
            {
                log_Method.WriteInfo_ToConsole("要素数=[" + this.dictionaryExpression_Item.Count + "]");

                // 項目(キーと値)の列挙
                foreach (KeyValuePair<string, Expression_Node_String> kvp in this.dictionaryExpression_Item)
                {
                    if (null == kvp.Value)
                    {
                        log_Method.WriteInfo_ToConsole(" [" + kvp.Key + "]=空っぽ");
                    }
                    else
                    {
                        if (kvp.Value is Expression_Node_Filepath)
                        {
                            // ファイルパス型。
                            // bug: 絶対パスでない場合、空白になるので、SHumanInput で取得することになるはず。
                            log_Method.WriteInfo_ToConsole(" [" + kvp.Key + "]=P型[" + kvp.Value.Execute4_OnExpressionString(EnumHitcount.Unconstraint, d_Logging_Dammy) + "] / SHumanInput=[" + ((Expression_Node_Filepath)kvp.Value).Humaninput + "]");
                        }
                        else
                        {
                            log_Method.WriteInfo_ToConsole(" [" + kvp.Key + "]=[" + kvp.Value.Execute4_OnExpressionString(EnumHitcount.Unconstraint, d_Logging_Dammy) + "]");
                        }
                    }

                }
            }

            //
            //
            log_Method.EndMethod(d_Logging_Dammy);
            d_Logging_Dammy.EndLogging(log_Method);
            if (!d_Logging_Dammy.Successful)
            {
                log_Method.WriteDebug_ToConsole(d_Logging_Dammy.ToText());
            }
        }
Ejemplo n.º 4
0
        /// <summary>
        /// 『レイアウト設定ファイル』をもとに、コントロールを作成し、
        /// フォームと、アプリケーション・モデルにコントロールを動的に追加します。
        /// </summary>
        /// <param name="fo_Config"></param>
        /// <param name="form"></param>
        protected void CreateForm(
            TableUserformconfig fo_Config,
            Form form,
            Log_Reports log_Reports
            )
        {
            Log_Method log_Method = new Log_MethodImpl(0, Log_ReportsImpl.BDebugmode_Static);
            log_Method.BeginMethod(Info_MiddleImpl.Name_Library, this, "CreateForm",log_Reports);
            //
            //

            //this.form_noren = form;

            // レイアウトするロジックを一時停止。(メインフォーム)
            form.SuspendLayout();

            // フォームにステータスバーを付けます。(デバッグモードでのみ) TODO:1回限りであること。
            if (null == statusStrip1 && Log_ReportsImpl.BDebugmode_Static)
            {
                statusStrip1 = new System.Windows.Forms.StatusStrip();

                //
                // statusStrip1
                //
                statusStrip1.Location = new System.Drawing.Point(0, 244);
                statusStrip1.Name = "statusStrip1";
                statusStrip1.Size = new System.Drawing.Size(292, 22);
                statusStrip1.TabIndex = 0;
                statusStrip1.Text = "statusStrip1";

                this.statusStripLabel2 = new System.Windows.Forms.ToolStripStatusLabel();
                this.statusStripLabel2.Name = "toolStripStatusLabel1";
                this.statusStripLabel2.Size = new System.Drawing.Size(114, 17);
                this.statusStripLabel2.Text = "toolStripStatusLabel1";
                this.statusStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
                this.statusStripLabel2});

                form.Controls.Add(statusStrip1);

                // #情報
                if (log_Method.CanInfo())
                {
                    log_Method.WriteInfo_ToConsole("ステータスバーをフォームに追加した。(デバッグモードでのみ)TODO:1回限りであること。");
                }
            }

            //// フォームに「マルチロール_テキストボックス」を付けます。 TODO:1回限りであること。
            //if (null == this.multiroleTextBox)
            //{
            //    this.multiroleTextBox = new System.Windows.Forms.TextBox();
            //    this.multiroleTextBox.Multiline = true;
            //    form.Controls.Add(this.multiroleTextBox);

            //    // #デバッグ
            //    ystem.Console.WriteLine(Info_NorenImpl.LibraryName + ":MoNorenImpl#CreateForm:マルチロール_テキストボックスをフォームに追加した。TODO:1回限りであること。");
            //}

            // 1つ前のコントロールが入っている仕組み。
            List<Usercontrol> list_StackFc = new List<Usercontrol>();
            List<int> nList_StackTree = new List<int>();

            //
            // レコードの並び順は、記述されている順番とします。
            //
            foreach (RecordUserformconfig fo_Record in fo_Config.List_RecordUserformconfig)
            {
                int nCurTree;
                fo_Record.TryGetInt(out nCurTree, NamesFld.S_TREE, true, -1, this.Owner_MemoryApplication, log_Reports);

                //
                //
                // ここで、コントロール(UserControl)を作成。
                // 作成できなかった、または作成しなかった場合はヌル。
                //
                //
                Usercontrol uct = ucontrolCreator1.Create(
                    fo_Record,
                    true,
                    this.Owner_MemoryApplication,
                    log_Reports
                    );

                //.WriteLine(this.GetType().Name + "#CreateForm: (10) この要素=[" + fcUc.ControlCommon.Name + "] curTree=[" + curTree + "]");

                if (log_Reports.Successful)
                {
                    if (null != uct)
                    {
                        string sName_Control;
                        fo_Record.TryGetString(out sName_Control, NamesFld.S_NAME, true, "", this.Owner_MemoryApplication, log_Reports);

                        Expression_Node_StringImpl ec_Str = new Expression_Node_StringImpl(null, fo_Record.Parent_TableUserformconfig.Cur_Configurationtree);
                        ec_Str.AppendTextNode(
                            sName_Control,
                            fo_Record.Parent_TableUserformconfig.Cur_Configurationtree,
                            log_Reports
                            );

                        //
                        //
                        // コントロール名の登録。
                        //
                        //
                        this.Owner_MemoryApplication.MemoryForms.PutUsercontrol(
                            ec_Str,
                            uct,
                            log_Reports
                            );

                        if (uct is UsercontrolWindow)
                        {
                            //
                            // 「ウィンドウ」(別窓)を開けたい場合。
                            //
                            UsercontrolWindow uctWnd = (UsercontrolWindow)uct;

                            //ucWindow.SetupStatusStrip();
                            uctWnd.CustomcontrolWindow1.Show();

                            //.WriteLine(this.GetType().Name + "#CreateForm: (20) 【ウィンドウ追加】トップに、この要素=[" + fcUc.ControlCommon.Name + "]を追加。");
                        }
                        else
                        {

                            if (0 == nList_StackTree.Count)
                            {
                                //
                                // ★追加:   メインフォームのトップに、この要素を追加
                                //
                                form.Controls.Add((Control)uct);

                                // 普通、メインウィンドウもここになる。
                            }
                            else
                            {
                                int nPrevTree = nList_StackTree.Last();

                                if (nPrevTree == nCurTree)
                                {
                                    // 1つ前の要素と ツリー値が同じなら、

                                    // 1つ前の要素をスタックから削除し、
                                    list_StackFc.RemoveAt(list_StackFc.Count - 1);
                                    nList_StackTree.RemoveAt(nList_StackTree.Count - 1);

                                    if (0 != nList_StackTree.Count)
                                    {
                                        nPrevTree = nList_StackTree.Last();

                                        //
                                        // ★追加:   前の要素(スタックの最後の要素)に、この要素を追加。
                                        //
                                        Usercontrol prevUc = list_StackFc.Last();

                                        prevUc.AppendChild(
                                            uct,
                                            log_Reports
                                            );

                                        //.WriteLine(this.GetType().Name + "#CreateForm: (40) 【前の要素に、この要素を追加】 前の要素=[" + prevUc.ControlCommon.Name + "]に、この要素=[" + fcUc.ControlCommon.Name + "]を追加。");
                                    }
                                    else
                                    {
                                        nPrevTree = 0;

                                        //
                                        // ★追加:   メインフォームのトップに、この要素を追加
                                        //
                                        form.Controls.Add((Control)uct);

                                        //.WriteLine(this.GetType().Name + "#CreateForm: (50) 【メインフォームのトップ要素として追加2】 メインフォームのトップに、この要素=[" + fcUc.ControlCommon.Name + "]を追加。");
                                    }
                                }
                                else if (nPrevTree < nCurTree)
                                {
                                    // 1つ前の要素より、大きなtree値を持つなら、

                                    //
                                    // ★追加: 1つ前の要素に、この要素を追加。
                                    //
                                    Usercontrol prevUc = list_StackFc.Last();

                                    prevUc.AppendChild(
                                        uct,
                                        log_Reports
                                        );

                                    //.WriteLine(this.GetType().Name + "#CreateForm: (60) 【前の要素に、この要素を追加】 前の要素=[" + prevUc.ControlCommon.Name + "]に、この要素=[" + fcUc.ControlCommon.Name + "]を追加。");
                                }
                                else
                                {
                                    // 1つ前の要素より、小さなtree値を持つなら、

                                    //
                                    // ★削除:
                                    //   自分より小さなtree値を持つ要素が出てくるまで、
                                    //   前の要素を消す。
                                    //
                                    list_StackFc.RemoveAt(list_StackFc.Count - 1);
                                    nList_StackTree.RemoveAt(nList_StackTree.Count - 1);
                                    //.WriteLine(this.GetType().Name + "#CreateForm: (70) 【前要素削除】 この要素=[" + fcUc.ControlCommon.Name + "]");

                                    //
                                    // foreachループの中で、リストの要素数が変わると、
                                    // foreachループは失敗する。
                                    //
                                    // whileループを使うことにする。
                                    //
                                    while (0 < nList_StackTree.Count)
                                    {
                                        Usercontrol prevUc = list_StackFc.Last();
                                        nPrevTree = nList_StackTree.Last();

                                        if (nCurTree <= nPrevTree)
                                        {
                                            list_StackFc.RemoveAt(list_StackFc.Count - 1);
                                            nList_StackTree.RemoveAt(nList_StackTree.Count - 1);
                                            //.WriteLine(this.GetType().Name + "#CreateForm: (80) 【前要素削除】 この要素=[" + fcUc.ControlCommon.Name + "] 前の要素=[" + prevUc.ControlCommon.Name + "]");
                                        }
                                        else
                                        {
                                            break;
                                        }
                                    }

                                    if (0 == nList_StackTree.Count)
                                    {
                                        // 空っぽになったらループを止める。
                                        // エラー?
                                        nPrevTree = -1;
                                    }
                                    else
                                    {
                                        nPrevTree = nList_StackTree.Last();
                                    }

                                    if (0 == nList_StackTree.Count)
                                    {
                                        //
                                        // ★追加:   メインフォームのトップに、この要素を追加
                                        //
                                        form.Controls.Add((Control)uct);

                                        //.WriteLine(this.GetType().Name + "#CreateForm: (90) 【メインフォームのトップ要素として追加3】 メインフォームのトップに、この要素=[" + fcUc.ControlCommon.Name + "]を追加。");
                                    }
                                    else
                                    {
                                        //
                                        // ★追加: 1つ前の要素に、この要素を追加。
                                        //
                                        Usercontrol prevUc = list_StackFc.Last();

                                        prevUc.AppendChild(
                                            uct,
                                            log_Reports
                                            );

                                        //.WriteLine(this.GetType().Name + "#CreateForm: (100) 【前の要素に、この要素を追加】 前の要素=[" + prevUc.ControlCommon.Name + "]に、この要素=[" + fcUc.ControlCommon.Name + "]を追加。");
                                    }

                                }
                            }
                        }

                    }
                }

                list_StackFc.Add(uct);
                nList_StackTree.Add(nCurTree);
            }

            // レイアウトの一時停止を解除。レイアウト実行の強制はしない。(メインフォーム)
            form.ResumeLayout(false);

            //
            //
            //
            //
            log_Method.EndMethod(log_Reports);
        }
Ejemplo n.º 5
0
        //────────────────────────────────────────
        /// <summary>
        /// デバッグ出力。
        /// </summary>
        public void WriteDebug_ToConsole()
        {
            Log_Method log_Method = new Log_MethodImpl(0);
            Log_Reports log_Reports_ThisMethod = new Log_ReportsImpl(log_Method);
            log_Method.BeginMethod(Info_MiddleImpl.Name_Library, this, "DebugWrite", log_Reports_ThisMethod);

            //
            //

            if (log_Method.CanInfo())
            {
                log_Method.WriteInfo_ToConsole(" ──────────登録関数名一覧");
                foreach (string sKey in this.dictionary_Item.Keys)
                {
                    log_Method.WriteInfo_ToConsole(" key=[" + sKey + "]");
                }
                log_Method.WriteInfo_ToConsole(" ──────────");
            }

            log_Method.EndMethod(log_Reports_ThisMethod);
        }
Ejemplo n.º 6
0
        //────────────────────────────────────────
        /// <summary>
        /// 『ユーザー定義関数設定ファイル(Fnc)』を読み取ります。
        /// </summary>
        public void LoadFile(
            Expression_Node_Filepath filepath_Userfunctionconfig_Expr,
            Log_Reports log_Reports
            )
        {
            Log_Method log_Method = new Log_MethodImpl(0);
            log_Method.BeginMethod(Info_MiddleImpl.Name_Library, this, "LoadFile", log_Reports);

            //
            //

            if (log_Method.CanDebug(1))
            {
                log_Method.WriteDebug_ToConsole(" ユーザー定義関数設定ファイルの読み取り。");
            }

            Configurationtree_Node parent_Conf = new Configurationtree_NodeImpl(NamesNode.S_CODEFILE_FUNCTIONS, filepath_Userfunctionconfig_Expr.Cur_Configuration);//Info_OpyopyoImpl.LibraryName + ":" + this.GetType().Name + ".LoadFile_Fnc"
            Expression_Node_String userfunctionconfig_Expr = new Expression_Node_StringImpl(null, parent_Conf);

            string filepathabsolute = filepath_Userfunctionconfig_Expr.Execute4_OnExpressionString(
                EnumHitcount.Unconstraint, log_Reports);

            if (!log_Reports.Successful)
            {
                goto gt_Error_Fpath;
            }

            if (!System.IO.File.Exists(filepathabsolute))
            {
                goto gt_Error_File;
            }

            XmlDocument xDoc = new XmlDocument();
            Exception err_Excp = null;
            try
            {
                xDoc.Load(filepathabsolute);
            }
            catch (System.IO.IOException ex)
            {
                //
                // エラー。
                err_Excp = ex;
                goto gt_Error_Doc;
            }
            catch (ArgumentException ex)
            {
                //
                // エラー。
                err_Excp = ex;
                goto gt_Error_Doc;
            }
            catch (Exception ex)
            {
                //
                // エラー。
                err_Excp = ex;
                goto gt_Error_Doc;
            }

            XmlElement xRoot = null;
            if (log_Reports.Successful)
            {
                // ルート要素を取得
                xRoot = xDoc.DocumentElement;

                // スクリプトファイルのバージョンチェック。(関数登録ファイル)
                ValuesAttr.Test_Codefileversion(
                    xRoot.GetAttribute(PmNames.S_CODEFILE_VERSION.Name_Attribute),
                    log_Reports,
                    new Configurationtree_NodeImpl(filepathabsolute, null),
                    NamesNode.S_CODEFILE_FUNCTIONS
                    );
            }

            string sErrorElementName = "";
            if (log_Reports.Successful)
            {
                XmlNodeList xTopNL = xRoot.ChildNodes;
                foreach (XmlNode xTopNode in xTopNL)
                {
                    if (XmlNodeType.Element == xTopNode.NodeType)
                    {
                        if (NamesNode.S_COMMON_FUNCTION == xTopNode.Name)
                        {
                            XmlElement x_Cur = (XmlElement)xTopNode;

                            string sNameValue = x_Cur.GetAttribute(PmNames.S_NAME.Name_Attribute);
                            if (log_Method.CanDebug(1))
                            {
                                log_Method.WriteDebug_ToConsole(" ユーザー定義関数の追加を開始:" + sNameValue);
                            }

                            // XToCf
                            XmlToConfigurationtree_C15_Elm xToCf = XmlToConfigurationtree_Collection.GetTranslatorByNodeName(NamesNode.S_COMMON_FUNCTION, log_Reports);
                            xToCf.XmlToConfigurationtree(
                                x_Cur,
                                parent_Conf,
                                this.Owner_MemoryApplication,
                                log_Reports
                                );

                            Configurationtree_Node s_Cur = null;
                            parent_Conf.List_Child.ForEach(delegate(Configurationtree_Node s_Child, ref bool bBreak)
                            {
                                s_Cur = s_Child;
                                bBreak = true;
                            });

                            // SToE
                            Expression_Node_FunctionImpl ec_CommonFunction = new Expression_Node_FunctionImpl(userfunctionconfig_Expr, s_Cur, new List<string>());

                            Log_TextIndented_ConfigurationtreeToExpressionImpl pg_ParsingLog = new Log_TextIndented_ConfigurationtreeToExpressionImpl();
                            pg_ParsingLog.BEnabled = false;
                            ConfigurationtreeToExpression_AbstractImpl.ParseChild_InAnotherLibrary(
                                s_Cur,
                                ec_CommonFunction,
                                this.Owner_MemoryApplication,
                                pg_ParsingLog,
                                log_Reports
                                );
                            if (log_Method.CanInfo() && pg_ParsingLog.BEnabled)
                            {
                                log_Method.WriteInfo_ToConsole(" d_ParsingLog=" + Environment.NewLine + pg_ParsingLog.ToString());
                            }

                            this.Owner_MemoryApplication.MemoryFunctions.AddFunction(sNameValue, ec_CommonFunction, log_Reports);
                        }
                        else
                        {
                            //
                            // エラー。
                            sErrorElementName = xTopNode.Name;
                            goto gt_Error_UndefinedChild;
                        }
                    }
                }
            }

            goto gt_EndMethod;
            //
            //
            #region 異常系
            //────────────────────────────────────────
            gt_Error_Fpath:
            if (log_Reports.CanCreateReport)
            {
                Log_RecordReports r = log_Reports.BeginCreateReport(EnumReport.Error);
                r.SetTitle("▲エラー101!", log_Method);

                Log_TextIndented s = new Log_TextIndentedImpl();
                s.Append("ユーザー定義関数設定ファイルへのパスにエラーがありました。");
                s.Newline();
                s.Newline();

                // ヒント

                r.Message = s.ToString();
                log_Reports.EndCreateReport();
            }
            goto gt_EndMethod;
            //────────────────────────────────────────
            gt_Error_File:
            if (log_Reports.CanCreateReport)
            {
                Log_RecordReports r = log_Reports.BeginCreateReport(EnumReport.Error);
                r.SetTitle("▲エラー102!", log_Method);

                Log_TextIndented s = new Log_TextIndentedImpl();
                s.Append("ユーザー定義関数設定ファイルがありません。");
                s.Newline();
                s.Append("file=[");
                s.Append(filepathabsolute);
                s.Append("]");
                s.Newline();
                s.Newline();

                // ヒント

                r.Message = s.ToString();
                log_Reports.EndCreateReport();
            }
            goto gt_EndMethod;
            //────────────────────────────────────────
            gt_Error_Doc:
            if (log_Reports.CanCreateReport)
            {
                Log_RecordReports r = log_Reports.BeginCreateReport(EnumReport.Error);
                r.SetTitle("▲エラー103!", log_Method);

                StringBuilder s = new StringBuilder();
                s.Append("エラー:" + err_Excp.Message);
                s.Append(Environment.NewLine);
                s.Append(Environment.NewLine);

                s.Append(Log_RecordReportsImpl.ToText_Configuration(filepath_Userfunctionconfig_Expr.Cur_Configuration));

                // ヒント

                r.Message = s.ToString();
                log_Reports.EndCreateReport();
            }
            goto gt_EndMethod;
            //────────────────────────────────────────
            gt_Error_UndefinedChild:
            if (log_Reports.CanCreateReport)
            {
                Log_RecordReports r = log_Reports.BeginCreateReport(EnumReport.Error);
                r.SetTitle("▲エラー104!", log_Method);

                StringBuilder s = new StringBuilder();
                s.Append("未定義の要素:" + sErrorElementName);
                s.Append(Environment.NewLine);
                s.Append(Environment.NewLine);

                // ヒント

                r.Message = s.ToString();
                log_Reports.EndCreateReport();
            }
            goto gt_EndMethod;
            //────────────────────────────────────────
            #endregion
            //
            //
            gt_EndMethod:
            log_Method.EndMethod(log_Reports);
        }