/// <summary>
        ///     Runs the protection pipeline.
        /// </summary>
        /// <param name="pipeline">The protection pipeline.</param>
        /// <param name="context">The context.</param>
        static void RunPipeline(ProtectionPipeline pipeline, ConfuserContext context)
        {
            Func <IList <IDnlibDef> >            getAllDefs    = () => context.Modules.SelectMany(module => module.FindDefinitions()).ToList();
            Func <ModuleDef, IList <IDnlibDef> > getModuleDefs = module => module.FindDefinitions().ToList();

            context.CurrentModuleIndex = -1;

            pipeline.ExecuteStage(PipelineStage.Inspection, Inspection, () => getAllDefs(), context);

            var options   = new ModuleWriterOptionsBase[context.Modules.Count];
            var listeners = new ModuleWriterListener[context.Modules.Count];

            for (int i = 0; i < context.Modules.Count; i++)
            {
                context.CurrentModuleIndex          = i;
                context.CurrentModuleWriterOptions  = null;
                context.CurrentModuleWriterListener = null;

                pipeline.ExecuteStage(PipelineStage.BeginModule, BeginModule, () => getModuleDefs(context.CurrentModule), context);
                pipeline.ExecuteStage(PipelineStage.ProcessModule, ProcessModule, () => getModuleDefs(context.CurrentModule), context);
                pipeline.ExecuteStage(PipelineStage.OptimizeMethods, OptimizeMethods, () => getModuleDefs(context.CurrentModule), context);
                pipeline.ExecuteStage(PipelineStage.EndModule, EndModule, () => getModuleDefs(context.CurrentModule), context);

                options[i]   = context.CurrentModuleWriterOptions;
                listeners[i] = context.CurrentModuleWriterListener;
            }

            for (int i = 0; i < context.Modules.Count; i++)
            {
                context.CurrentModuleIndex          = i;
                context.CurrentModuleWriterOptions  = options[i];
                context.CurrentModuleWriterListener = listeners[i];

                pipeline.ExecuteStage(PipelineStage.WriteModule, WriteModule, () => getModuleDefs(context.CurrentModule), context);

                context.OutputModules[i]            = context.CurrentModuleOutput;
                context.OutputSymbols[i]            = context.CurrentModuleSymbol;
                context.CurrentModuleWriterOptions  = null;
                context.CurrentModuleWriterListener = null;
                context.CurrentModuleOutput         = null;
                context.CurrentModuleSymbol         = null;
            }

            context.CurrentModuleIndex = -1;

            pipeline.ExecuteStage(PipelineStage.Debug, Debug, () => getAllDefs(), context);
            pipeline.ExecuteStage(PipelineStage.Pack, Pack, () => getAllDefs(), context);
            pipeline.ExecuteStage(PipelineStage.SaveModules, SaveModules, () => getAllDefs(), context);

            if (!context.PackerInitiated)
            {
                context.Logger.Info("Done.");
            }
        }
        /// <summary>
        ///     Runs the protection pipeline.
        /// </summary>
        /// <param name="pipeline">The protection pipeline.</param>
        /// <param name="context">The context.</param>
        // Token: 0x0600010B RID: 267 RVA: 0x00009030 File Offset: 0x00007230
        private static void RunPipeline(ProtectionPipeline pipeline, ConfuserContext context)
        {
            Func <IList <IDnlibDef> >            getAllDefs    = () => context.Modules.SelectMany((ModuleDefMD module) => module.FindDefinitions()).ToList <IDnlibDef>();
            Func <ModuleDef, IList <IDnlibDef> > getModuleDefs = (ModuleDef module) => module.FindDefinitions().ToList <IDnlibDef>();

            context.CurrentModuleIndex = -1;
            pipeline.ExecuteStage(PipelineStage.Inspection, new Action <ConfuserContext>(ConfuserEngine.Inspection), () => getAllDefs(), context);
            ModuleWriterOptionsBase[] options   = new ModuleWriterOptionsBase[context.Modules.Count];
            ModuleWriterListener[]    listeners = new ModuleWriterListener[context.Modules.Count];
            for (int i = 0; i < context.Modules.Count; i++)
            {
                context.CurrentModuleIndex          = i;
                context.CurrentModuleWriterOptions  = null;
                context.CurrentModuleWriterListener = null;
                pipeline.ExecuteStage(PipelineStage.BeginModule, new Action <ConfuserContext>(ConfuserEngine.BeginModule), () => getModuleDefs(context.CurrentModule), context);
                pipeline.ExecuteStage(PipelineStage.ProcessModule, new Action <ConfuserContext>(ConfuserEngine.ProcessModule), () => getModuleDefs(context.CurrentModule), context);
                pipeline.ExecuteStage(PipelineStage.OptimizeMethods, new Action <ConfuserContext>(ConfuserEngine.OptimizeMethods), () => getModuleDefs(context.CurrentModule), context);
                pipeline.ExecuteStage(PipelineStage.EndModule, new Action <ConfuserContext>(ConfuserEngine.EndModule), () => getModuleDefs(context.CurrentModule), context);
                options[i]   = context.CurrentModuleWriterOptions;
                listeners[i] = context.CurrentModuleWriterListener;
            }
            for (int j = 0; j < context.Modules.Count; j++)
            {
                context.CurrentModuleIndex          = j;
                context.CurrentModuleWriterOptions  = options[j];
                context.CurrentModuleWriterListener = listeners[j];
                pipeline.ExecuteStage(PipelineStage.WriteModule, new Action <ConfuserContext>(ConfuserEngine.WriteModule), () => getModuleDefs(context.CurrentModule), context);
                context.OutputModules[j]            = context.CurrentModuleOutput;
                context.OutputSymbols[j]            = context.CurrentModuleSymbol;
                context.CurrentModuleWriterOptions  = null;
                context.CurrentModuleWriterListener = null;
                context.CurrentModuleOutput         = null;
                context.CurrentModuleSymbol         = null;
            }
            context.CurrentModuleIndex = -1;
            pipeline.ExecuteStage(PipelineStage.Debug, new Action <ConfuserContext>(ConfuserEngine.Debug), () => getAllDefs(), context);
            pipeline.ExecuteStage(PipelineStage.Pack, new Action <ConfuserContext>(ConfuserEngine.Pack), () => getAllDefs(), context);
            pipeline.ExecuteStage(PipelineStage.SaveModules, new Action <ConfuserContext>(ConfuserEngine.SaveModules), () => getAllDefs(), context);
            if (!context.PackerInitiated)
            {
                context.Logger.Info("Done.");
            }
        }