text:
use super::graph::{BasicCoverageBlock, BasicCoverageBlockData, CoverageGraph};
use super::spans::CoverageSpan;

use rustc_middle::mir::create_dump_file;
use rustc_middle::mir::generic_graphviz::GraphvizWriter;
use rustc_middle::mir::spanview::{self, SpanViewable};

use rustc_data_structures::fx::FxHashMap;
use rustc_middle::mir::coverage::*;
use rustc_middle::mir::{self, BasicBlock, TerminatorKind};
use rustc_middle::ty::TyCtxt;
use rustc_span::Span;

use std::iter;
use std::lazy::SyncOnceCell;

pub const NESTED_INDENT: &str = "    ";

const RUSTC_COVERAGE_DEBUG_OPTIONS: &str = "RUSTC_COVERAGE_DEBUG_OPTIONS";

pub(super) fn debug_options<'a>() -> &'a DebugOptions {
    static DEBUG_OPTIONS: SyncOnceCell<DebugOptions> = SyncOnceCell::new();

    &DEBUG_OPTIONS.get_or_init(DebugOptions::from_env)
}

/// Parses and maintains coverage-specific debug options captured from the environment variable
/// "RUSTC_COVERAGE_DEBUG_OPTIONS", if set.
#[derive(Debug, Clone)]
pub(super) struct DebugOptions {
    pub allow_unused_expressions: bool,
    counter_format: ExpressionFormat,
}

impl DebugOptions {
    fn from_env() -> Self {
        let mut allow_unused_expressions = true;
        let mut counter_format = ExpressionFormat::default();

        if let Ok(env_debug_options) = std::env::var(RUSTC_COVERAGE_DEBUG_OPTIONS) {
            for setting_str in env_debug_options.replace(" ", "").replace("-", "_").split(',') {
                let (option, value) = match setting_str.split_once('=') {
                    None => (setting_str, None),
                    Some((k, v)) => (k, Some(v)),
                };
                match option {
                    "allow_unused_expressions" => {
                        allow_unused_expressions = bool_option_val(option, value);
                        debug!(
                            "{} env option `allow_unused_expressions` is set to {}",
                            RUSTC_COVERAGE_DEBUG_OPTIONS, allow_unused_expressions
                        );
                    }
                    "counter_format" => {
                        match value {
                            None => {
                                bug!(
                                    "`{}` option in environment variable {} requires one or more \
                                    plus-separated choices (a non-empty subset of \
                                    `id+block+operation`)",
                                    option,
                                    RUSTC_COVERAGE_DEBUG_OPTIONS
                                );
                            }
                            Some(val) => {
                                counter_format = counter_format_option_val(val);
                                debug!(
                                    "{} env option `counter_format` is set to {:?}",
                                    RUSTC_COVERAGE_DEBUG_OPTIONS, counter_format
                                );
                            }
                        };
                    }
                    _ => bug!(
                        "Unsupported setting `{}` in environment variable {}",
                        option,
                        RUSTC_COVERAGE_DEBUG_OPTIONS
                    ),
                };
            }
        }

        Self { allow_unused_expressions, counter_format }
    }
}

fn bool_option_val(option: &str, some_strval: Option<&str>) -> bool {
    if let Some(val) = some_strval {
        if vec!["yes", "y", "on", "true"].contains(&val) {
            true
        } else if vec!["no", "n", "off", "false"].contains(&val) {
            false
        } else {
            bug!(
                "Unsupported value `{}` for option `{}` in environment variable {}",
                option,
                val,
                RUSTC_COVERAGE_DEBUG_OPTIONS
            )
        }
    } else {
        true
    }
}

fn counter_format_option_val(strval: &str) -> ExpressionFormat {
    let mut counter_format = ExpressionFormat { id: false, block: false, operation: false };
    let components = strval.splitn(3, '+');
    for component in components {
        match component {
            "id" => counter_format.id = true,
            "block" => counter_format.block = true,
            "operation" => counter_format.operation = true,
            _ => bug!(
                "Unsupported counter_format choice `{}` in environment variable {}",
                component,
                RUSTC_COVERAGE_DEBUG_OPTIONS
            ),
        }
    }
    counter_format
}

#[derive(Debug, Clone)]
struct ExpressionFormat {
    id: bool,
    block: bool,
    operation: bool,
}

impl Default for ExpressionFormat {
    fn default() -> Self {
        Self { id: false, block: true, operation: true }
    }
}

/// If enabled, this struct maintains a map from `CoverageKind` IDs (as `ExpressionOperandId`) to
/// the `CoverageKind` data and optional label (normally, the counter's associated
/// `BasicCoverageBlock` format string, if any).
///
/// Use `format_counter` to convert one of these `CoverageKind` counters to a debug output string,
/// as directed by the `DebugOptions`. This allows the format of counter labels in logs and dump
/// files (including the `CoverageGraph` graphviz file) to be changed at runtime, via environment
/// variable.
///
/// `DebugCounters` supports a recursive rendering of `Expression` counters, so they can be
/// presented as nested expressions such as `(bcb3 - (bcb0 + bcb1))`.
pub(super) struct DebugCounters {
    some_counters: Option<FxHashMap<ExpressionOperandId, DebugCounter>>,
}

impl DebugCounters {
    pub fn new() -> Self {
        Self { some_counters: None }
    }

    pub fn enable(&mut self) {
        debug_assert!(!self.is_enabled());
        self.some_counters.replace(FxHashMap::default());
    }

    pub fn is_enabled(&self) -> bool {
        self.some_counters.is_some()
    }

    pub fn add_counter(&mut self, counter_kind: &CoverageKind, some_block_label: Option<String>) {
        if let Some(counters) = &mut self.some_counters {
            let id: ExpressionOperandId = match *counter_kind {
                CoverageKind::Counter { id, .. } => id.into(),
                CoverageKind::Expression { id, .. } => id.into(),
                _ => bug!(
                    "the given `CoverageKind` is not an counter or expression: {:?}",
                    counter_kind
                ),
            };
            counters
                .try_insert(id, DebugCounter::new(counter_kind.clone(), some_block_label))
                .expect("attempt to add the same counter_kind to DebugCounters more than once");
        }
    }

    pub fn some_block_label(&self, operand: ExpressionOperandId) -> Option<&String> {
        self.some_counters.as_ref().map_or(None, |counters| {
            counters
                .get(&operand)
                .map_or(None, |debug_counter| debug_counter.some_block_label.as_ref())
        })
    }

    pub fn format_counter(&self, counter_kind: &CoverageKind) -> String {
        match *counter_kind {
            CoverageKind::Counter { .. } => {
                format!("Counter({})", self.format_counter_kind(counter_kind))
            }
            CoverageKind::Expression { .. } => {
                format!("Expression({})", self.format_counter_kind(counter_kind))
            }
            CoverageKind::Unreachable { .. } => "Unreachable".to_owned(),
        }
    }

    fn format_counter_kind(&self, counter_kind: &CoverageKind) -> String {
        let counter_format = &debug_options().counter_format;
        if let CoverageKind::Expression { id, lhs, op, rhs } = *counter_kind {
            if counter_format.operation {
                return format!(
                    "{}{} {} {}",
                    if counter_format.id || self.some_counters.is_none() {
                        format!("#{} = ", id.index())
                    } else {
                        String::new()
                    },
                    self.format_operand(lhs),
                    if op == Op::Add { "+" } else { "-" },
                    self.format_operand(rhs),
                );
            }
        }

        let id: ExpressionOperandId = match *counter_kind {
            CoverageKind::Counter { id, .. } => id.into(),
            CoverageKind::Expression { id, .. } => id.into(),
            _ => {
                bug!("the given `CoverageKind` is not an counter or expression: {:?}", counter_kind)
            }
        };
        if self.some_counters.is_some() && (counter_format.block || !counter_format.id) {
            let counters = self.some_counters.as_ref().unwrap();
            if let Some(DebugCounter { some_block_label: Some(block_label), .. }) =
                counters.get(&id)
            {
                return if counter_format.id {
                    format!("{}#{}", block_label, id.index())
                } else {
                    block_label.to_string()
                };
            }
        }
        format!("#{}", id.index())
    }

    fn format_operand(&self, operand: ExpressionOperandId) -> String {
        if operand.index() == 0 {
            return String::from("0");
        }
        if let Some(counters) = &self.some_counters {
            if let Some(DebugCounter { counter_kind, some_block_label }) = counters.get(&operand) {
                if let CoverageKind::Expression { .. } = counter_kind {
                    if let Some(block_label) = some_block_label {
                        if debug_options().counter_format.block {
                            return format!(
                                "{}:({})",
                                block_label,
                                self.format_counter_kind(counter_kind)
                            );
                        }
                    }
                    return format!("({})", self.format_counter_kind(counter_kind));
                }
                return self.format_counter_kind(counter_kind);
            }
        }
        format!("#{}", operand.index())
    }
}

/// A non-public support class to `DebugCounters`.
#[derive(Debug)]
struct DebugCounter {
    counter_kind: CoverageKind,
    some_block_label: Option<String>,
}

impl DebugCounter {
    fn new(counter_kind: CoverageKind, some_block_label: Option<String>) -> Self {
        Self { counter_kind, some_block_label }
    }
}

/// If enabled, this data structure captures additional debugging information used when generating
/// a Graphviz (.dot file) representation of the `CoverageGraph`, for debugging purposes.
pub(super) struct GraphvizData {
    some_bcb_to_coverage_spans_with_counters:
        Option<FxHashMap<BasicCoverageBlock, Vec<(CoverageSpan, CoverageKind)>>>,
    some_bcb_to_dependency_counters: Option<FxHashMap<BasicCoverageBlock, Vec<CoverageKind>>>,
    some_edge_to_counter: Option<FxHashMap<(BasicCoverageBlock, BasicBlock), CoverageKind>>,
}

impl GraphvizData {
    pub fn new() -> Self {
        Self {
            some_bcb_to_coverage_spans_with_counters: None,
            some_bcb_to_dependency_counters: None,
            some_edge_to_counter: None,
        }
    }

    pub fn enable(&mut self) {
        debug_assert!(!self.is_enabled());
        self.some_bcb_to_coverage_spans_with_counters = Some(FxHashMap::default());
        self.some_bcb_to_dependency_counters = Some(FxHashMap::default());
        self.some_edge_to_counter = Some(FxHashMap::default());
    }

    pub fn is_enabled(&self) -> bool {
        self.some_bcb_to_coverage_spans_with_counters.is_some()
    }

    pub fn add_bcb_coverage_span_with_counter(
        &mut self,
        bcb: BasicCoverageBlock,
        coverage_span: &CoverageSpan,
        counter_kind: &CoverageKind,
    ) {
        if let Some(bcb_to_coverage_spans_with_counters) =
            self.some_bcb_to_coverage_spans_with_counters.as_mut()
        {
            bcb_to_coverage_spans_with_counters
                .entry(bcb)
                .or_insert_with(Vec::new)
                .push((coverage_span.clone(), counter_kind.clone()));
        }
    }

    pub fn get_bcb_coverage_spans_with_counters(
        &self,
        bcb: BasicCoverageBlock,
    ) -> Option<&Vec<(CoverageSpan, CoverageKind)>> {
        if let Some(bcb_to_coverage_spans_with_counters) =
            self.some_bcb_to_coverage_spans_with_counters.as_ref()
        {
            bcb_to_coverage_spans_with_counters.get(&bcb)
        } else {
            None
        }
    }

    pub fn add_bcb_dependency_counter(
        &mut self,
        bcb: BasicCoverageBlock,
        counter_kind: &CoverageKind,
    ) {
        if let Some(bcb_to_dependency_counters) = self.some_bcb_to_dependency_counters.as_mut() {
            bcb_to_dependency_counters
                .entry(bcb)
                .or_insert_with(Vec::new)
                .push(counter_kind.clone());
        }
    }

    pub fn get_bcb_dependency_counters(
        &self,
        bcb: BasicCoverageBlock,
    ) -> Option<&Vec<CoverageKind>> {
        if let Some(bcb_to_dependency_counters) = self.some_bcb_to_dependency_counters.as_ref() {
            bcb_to_dependency_counters.get(&bcb)
        } else {
            None
        }
    }

    pub fn set_edge_counter(
        &mut self,
        from_bcb: BasicCoverageBlock,
        to_bb: BasicBlock,
        counter_kind: &CoverageKind,
    ) {
        if let Some(edge_to_counter) = self.some_edge_to_counter.as_mut() {
            edge_to_counter
                .try_insert((from_bcb, to_bb), counter_kind.clone())
                .expect("invalid attempt to insert more than one edge counter for the same edge");
        }
    }

    pub fn get_edge_counter(
        &self,
        from_bcb: BasicCoverageBlock,
        to_bb: BasicBlock,
    ) -> Option<&CoverageKind> {
        if let Some(edge_to_counter) = self.some_edge_to_counter.as_ref() {
            edge_to_counter.get(&(from_bcb, to_bb))
        } else {
            None
        }
    }
}

/// If enabled, this struct captures additional data used to track whether expressions were used,
/// directly or indirectly, to compute the coverage counts for all `CoverageSpan`s, and any that are
/// _not_ used are retained in the `unused_expressions` Vec, to be included in debug output (logs
/// and/or a `CoverageGraph` graphviz output).
pub(super) struct UsedExpressions {
    some_used_expression_operands:
        Option<FxHashMap<ExpressionOperandId, Vec<InjectedExpressionId>>>,
    some_unused_expressions:
        Option<Vec<(CoverageKind, Option<BasicCoverageBlock>, BasicCoverageBlock)>>,
}

impl UsedExpressions {
    pub fn new() -> Self {
        Self { some_used_expression_operands: None, some_unused_expressions: None }
    }

    pub fn enable(&mut self) {
        debug_assert!(!self.is_enabled());
        self.some_used_expression_operands = Some(FxHashMap::default());
        self.some_unused_expressions = Some(Vec::new());
    }

    pub fn is_enabled(&self) -> bool {
        self.some_used_expression_operands.is_some()
    }

    pub fn add_expression_operands(&mut self, expression: &CoverageKind) {
        if let Some(used_expression_operands) = self.some_used_expression_operands.as_mut() {
            if let CoverageKind::Expression { id, lhs, rhs, .. } = *expression {
                used_expression_operands.entry(lhs).or_insert_with(Vec::new).push(id);
                used_expression_operands.entry(rhs).or_insert_with(Vec::new).push(id);
            }
        }
    }

    pub fn expression_is_used(&self, expression: &CoverageKind) -> bool {
        if let Some(used_expression_operands) = self.some_used_expression_operands.as_ref() {
            used_expression_operands.contains_key(&expression.as_operand_id())
        } else {
            false
        }
    }

    pub fn add_unused_expression_if_not_found(
        &mut self,
        expression: &CoverageKind,
        edge_from_bcb: Option<BasicCoverageBlock>,
        target_bcb: BasicCoverageBlock,
    ) {
        if let Some(used_expression_operands) = self.some_used_expression_operands.as_ref() {
            if !used_expression_operands.contains_key(&expression.as_operand_id()) {
                self.some_unused_expressions.as_mut().unwrap().push((
                    expression.clone(),
                    edge_from_bcb,
                    target_bcb,
                ));
            }
        }
    }

    /// Return the list of unused counters (if any) as a tuple with the counter (`CoverageKind`),
    /// optional `from_bcb` (if it was an edge counter), and `target_bcb`.
    pub fn get_unused_expressions(
        &self,
    ) -> Vec<(CoverageKind, Option<BasicCoverageBlock>, BasicCoverageBlock)> {
        if let Some(unused_expressions) = self.some_unused_expressions.as_ref() {
            unused_expressions.clone()
        } else {
            Vec::new()
        }
    }

    /// If enabled, validate that every BCB or edge counter not directly associated with a coverage
    /// span is at least indirectly associated (it is a dependency of a BCB counter that _is_
    /// associated with a coverage span).
    pub fn validate(
        &mut self,
        bcb_counters_without_direct_coverage_spans: &Vec<(
            Option<BasicCoverageBlock>,
            BasicCoverageBlock,
            CoverageKind,
        )>,
    ) {
        if self.is_enabled() {
            let mut not_validated = bcb_counters_without_direct_coverage_spans
                .iter()
                .map(|(_, _, counter_kind)| counter_kind)
                .collect::<Vec<_>>();
            let mut validating_count = 0;
            while not_validated.len() != validating_count {
                let to_validate = not_validated.split_off(0);
                validating_count = to_validate.len();
                for counter_kind in to_validate {
                    if self.expression_is_used(counter_kind) {
                        self.add_expression_operands(counter_kind);
                    } else {
                        not_validated.push(counter_kind);
                    }
                }
            }
        }
    }

    pub fn alert_on_unused_expressions(&self, debug_counters: &DebugCounters) {
        if let Some(unused_expressions) = self.some_unused_expressions.as_ref() {
            for (counter_kind, edge_from_bcb, target_bcb) in unused_expressions {
                let unused_counter_message = if let Some(from_bcb) = edge_from_bcb.as_ref() {
                    format!(
                        "non-coverage edge counter found without a dependent expression, in \
                        {:?}->{:?}; counter={}",
                        from_bcb,
                        target_bcb,
                        debug_counters.format_counter(&counter_kind),
                    )
                } else {
                    format!(
                        "non-coverage counter found without a dependent expression, in {:?}; \
                        counter={}",
                        target_bcb,
                        debug_counters.format_counter(&counter_kind),
                    )
                };

                if debug_options().allow_unused_expressions {
                    debug!("WARNING: {}", unused_counter_message);
                } else {
                    bug!("{}", unused_counter_message);
                }
            }
        }
    }
}

/// Generates the MIR pass `CoverageSpan`-specific spanview dump file.
pub(super) fn dump_coverage_spanview(
    tcx: TyCtxt<'tcx>,
    mir_body: &mir::Body<'tcx>,
    basic_coverage_blocks: &CoverageGraph,
    pass_name: &str,
    body_span: Span,
    coverage_spans: &Vec<CoverageSpan>,
) {
    let mir_source = mir_body.source;
    let def_id = mir_source.def_id();

    let span_viewables = span_viewables(tcx, mir_body, basic_coverage_blocks, &coverage_spans);
    let mut file = create_dump_file(tcx, "html", None, pass_name, &0, mir_source)
        .expect("Unexpected error creating MIR spanview HTML file");
    let crate_name = tcx.crate_name(def_id.krate);
    let item_name = tcx.def_path(def_id).to_filename_friendly_no_crate();
    let title = format!("{}.{} - Coverage Spans", crate_name, item_name);
    spanview::write_document(tcx, body_span, span_viewables, &title, &mut file)
        .expect("Unexpected IO error dumping coverage spans as HTML");
}

/// Converts the computed `BasicCoverageBlockData`s into `SpanViewable`s.
fn span_viewables(
    tcx: TyCtxt<'tcx>,
    mir_body: &mir::Body<'tcx>,
    basic_coverage_blocks: &CoverageGraph,
    coverage_spans: &Vec<CoverageSpan>,
) -> Vec<SpanViewable> {
    let mut span_viewables = Vec::new();
    for coverage_span in coverage_spans {
        let tooltip = coverage_span.format_coverage_statements(tcx, mir_body);
        let CoverageSpan { span, bcb, .. } = coverage_span;
        let bcb_data = &basic_coverage_blocks[*bcb];
        let id = bcb_data.id();
        let leader_bb = bcb_data.leader_bb();
        span_viewables.push(SpanViewable { bb: leader_bb, span: *span, id, tooltip });
    }
    span_viewables
}

/// Generates the MIR pass coverage-specific graphviz dump file.
pub(super) fn dump_coverage_graphviz(
    tcx: TyCtxt<'tcx>,
    mir_body: &mir::Body<'tcx>,
    pass_name: &str,
    basic_coverage_blocks: &CoverageGraph,
    debug_counters: &DebugCounters,
    graphviz_data: &GraphvizData,
    intermediate_expressions: &Vec<CoverageKind>,
    debug_used_expressions: &UsedExpressions,
) {
    let mir_source = mir_body.source;
    let def_id = mir_source.def_id();
    let node_content = |bcb| {
        bcb_to_string_sections(
            tcx,
            mir_body,
            debug_counters,
            &basic_coverage_blocks[bcb],
            graphviz_data.get_bcb_coverage_spans_with_counters(bcb),
            graphviz_data.get_bcb_dependency_counters(bcb),
            // intermediate_expressions are injected into the mir::START_BLOCK, so
            // include them in the first BCB.
            if bcb.index() == 0 { Some(&intermediate_expressions) } else { None },
        )
    };
    let edge_labels = |from_bcb| {
        let from_bcb_data = &basic_coverage_blocks[from_bcb];
        let from_terminator = from_bcb_data.terminator(mir_body);
        let mut edge_labels = from_terminator.kind.fmt_successor_labels();
        edge_labels.retain(|label| label != "unreachable");
        let edge_counters = from_terminator
            .successors()
            .map(|&successor_bb| graphviz_data.get_edge_counter(from_bcb, successor_bb));
        iter::zip(&edge_labels, edge_counters)
            .map(|(label, some_counter)| {
                if let Some(counter) = some_counter {
                    format!("{}\n{}", label, debug_counters.format_counter(counter))
                } else {
                    label.to_string()
                }
            })
            .collect::<Vec<_>>()
    };
    let graphviz_name = format!("Cov_{}_{}", def_id.krate.index(), def_id.index.index());
    let mut graphviz_writer =
        GraphvizWriter::new(basic_coverage_blocks, &graphviz_name, node_content, edge_labels);
    let unused_expressions = debug_used_expressions.get_unused_expressions();
    if unused_expressions.len() > 0 {
        graphviz_writer.set_graph_label(&format!(
            "Unused expressions:\n  {}",
            unused_expressions
                .as_slice()
                .iter()
                .map(|(counter_kind, edge_from_bcb, target_bcb)| {
                    if let Some(from_bcb) = edge_from_bcb.as_ref() {
                        format!(
                            "{:?}->{:?}: {}",
                            from_bcb,
                            target_bcb,
                            debug_counters.format_counter(&counter_kind),
                        )
                    } else {
                        format!(
                            "{:?}: {}",
                            target_bcb,
                            debug_counters.format_counter(&counter_kind),
                        )
                    }
                })
                .collect::<Vec<_>>()
                .join("\n  ")
        ));
    }
    let mut file = create_dump_file(tcx, "dot", None, pass_name, &0, mir_source)
        .expect("Unexpected error creating BasicCoverageBlock graphviz DOT file");
    graphviz_writer
        .write_graphviz(tcx, &mut file)
        .expect("Unexpected error writing BasicCoverageBlock graphviz DOT file");
}

fn bcb_to_string_sections(
    tcx: TyCtxt<'tcx>,
    mir_body: &mir::Body<'tcx>,
    debug_counters: &DebugCounters,
    bcb_data: &BasicCoverageBlockData,
    some_coverage_spans_with_counters: Option<&Vec<(CoverageSpan, CoverageKind)>>,
    some_dependency_counters: Option<&Vec<CoverageKind>>,
    some_intermediate_expressions: Option<&Vec<CoverageKind>>,
) -> Vec<String> {
    let len = bcb_data.basic_blocks.len();
    let mut sections = Vec::new();
    if let Some(collect_intermediate_expressions) = some_intermediate_expressions {
        sections.push(
            collect_intermediate_expressions
                .iter()
                .map(|expression| {
                    format!("Intermediate {}", debug_counters.format_counter(expression))
                })
                .collect::<Vec<_>>()
                .join("\n"),
        );
    }
    if let Some(coverage_spans_with_counters) = some_coverage_spans_with_counters {
        sections.push(
            coverage_spans_with_counters
                .iter()
                .map(|(covspan, counter)| {
                    format!(
                        "{} at {}",
                        debug_counters.format_counter(counter),
                        covspan.format(tcx, mir_body)
                    )
                })
                .collect::<Vec<_>>()
                .join("\n"),
        );
    }
    if let Some(dependency_counters) = some_dependency_counters {
        sections.push(format!(
            "Non-coverage counters:\n  {}",
            dependency_counters
                .iter()
                .map(|counter| debug_counters.format_counter(counter))
                .collect::<Vec<_>>()
                .join("  \n"),
        ));
    }
    if let Some(counter_kind) = &bcb_data.counter_kind {
        sections.push(format!("{:?}", counter_kind));
    }
    let non_term_blocks = bcb_data.basic_blocks[0..len - 1]
        .iter()
        .map(|&bb| format!("{:?}: {}", bb, term_type(&mir_body[bb].terminator().kind)))
        .collect::<Vec<_>>();
    if non_term_blocks.len() > 0 {
        sections.push(non_term_blocks.join("\n"));
    }
    sections.push(format!(
        "{:?}: {}",
        bcb_data.basic_blocks.last().unwrap(),
        term_type(&bcb_data.terminator(mir_body).kind)
    ));
    sections
}

/// Returns a simple string representation of a `TerminatorKind` variant, independent of any
/// values it might hold.
pub(super) fn term_type(kind: &TerminatorKind<'tcx>) -> &'static str {
    match kind {
        TerminatorKind::Goto { .. } => "Goto",
        TerminatorKind::SwitchInt { .. } => "SwitchInt",
        TerminatorKind::Resume => "Resume",
        TerminatorKind::Abort => "Abort",
        TerminatorKind::Return => "Return",
        TerminatorKind::Unreachable => "Unreachable",
        TerminatorKind::Drop { .. } => "Drop",
        TerminatorKind::DropAndReplace { .. } => "DropAndReplace",
        TerminatorKind::Call { .. } => "Call",
        TerminatorKind::Assert { .. } => "Assert",
        TerminatorKind::Yield { .. } => "Yield",
        TerminatorKind::GeneratorDrop => "GeneratorDrop",
        TerminatorKind::FalseEdge { .. } => "FalseEdge",
        TerminatorKind::FalseUnwind { .. } => "FalseUnwind",
        TerminatorKind::InlineAsm { .. } => "InlineAsm",
    }
}

redpajama_set_name: RedPajamaGithub


At 130 churches plus strong, the Evangelical Lutheran Synod is a large faith organization and the central source of important updates and information for their church members. As a very active ministry, the ELS is constantly on the move around the world, reaching out to people in need, and making a difference through evangelism, charitable resource management, and education.
The Evangelical Lutheran Synod is a faith with deep roots in history, yet is very much a twenty-first century organization. While their ministry activities and mission are dynamic and adaptable, the former ELS website could not effectively keep up with the evolving needs of communication, outreach, and education. The ELS was in need of a vivid, interactive web experience for their members and those seeking to learn about their message and mission.
BolderImage met with the ELS and evaluated their needs for content management, and desires for their new website's look and feel. They needed an updated web presence, yet also needed a framework that would support their tremendous growth and adapt well to their reality as a fluid, modern ministry that is constantly changing.
Keeping all these aspects in mind, BolderImage came up with two possible designs that let any web visitor know that the ELS had truly "come of age" digitally. The perfectly married aesthetic of old and new came together with traditional and modern colors, an unfettered and visually pleasing design, and an easy to use navigation complete with social media badges and confident headers.
A key factor in the successful transformation was addressing the content management challenges as well as the need for site optimization with strategically executed SEO solutions. BolderImage constructed a system to handle the vast number of educational and organization literature, event calendars, announcements, and video. The beauty of the tools designed by BolderImage is their technical sophistication, with a simple to use interface. ELS staff can make any changes they need to their new website at will, and keep all changes in one place.
In addition to their new standard website, the ELS also opted for a bold new mobile website, which logically reflects their role as a ministry on the move.
Other great features of the site include a Lutheran Church Locator where visitors can find an ELS church nearby, a document library, news and blogs.


Do you need a private investigator with the skills to track down evidence hidden in a computer or cellphone to make the case against a cheating spouse, or to solve a criminal investigation? We offer expert services here in Alabama.
Digital forensic evidence is as crucial for a private investigator as DNA testing is for a prosecutor. The scientific precision of forensics can help prove – or disprove – a crime as surely as a genetic match.
Like DNA, the data on electronic devices can answer questions with remarkable certainty. Digital artifacts from messaging, texts and social media can reveal a surprising level of detail about a person's motives and activities, helping to explain covert behavior.
Texts, emails, instant messages, images and video often are associated with metadata – the dates, times and other logged information related to digital activity. By analyzing metadata on cellphones, laptops and other devices, our computer forensics analysts can create detailed timelines of activities, locations and conversations.
Our certified forensic examiners also can recover data from damaged or non-functional devices, even if the information was intentionally deleted or hidden. Our investigators often produce concrete results within a few days – much faster than traditional investigative techniques such as tailing subjects or stakeouts.
To find out how we can help you or to open an investigation immediately, call us at (800) 790-4524. Our representatives are available to help you at all times, 24/7/365.
©2019 Digital Investigations. All Rights Reserved.
Questions? Click to Text Us!


Designed for indoor use, this grenade contains no CFCs, is not a fire hazard and requires minimal decontamination by comparison to smoke, powders, or liquids.
The Aerosol Grenade is most commonly used in tactical situations by Law Enforcement and Corrections and was designed with indoor operations in mind when a non fire-producing delivery system is desired. It is most effective when used in confined areas and close to the target area.
The purpose of the Aerosol Grenade is to minimize the risks to all parties through pain compliance, temporary discomfort and/or incapacitation of potentially violent or dangerous subjects.
The Aerosol Grenade is ideal for cell extractions or barricade situations where the use of pyrotechnic, powder, or liquid devices is not practical or desired. The OC and CS combination provide sufficient effects in confined areas of up to 1,500 square feet. The Aerosol Grenade is not recommended for outdoor use.
Remove affected person from the contaminated area to an open, upwind position.
Blow nose to remove discharge and particulates.
IV.SKIN: Burning sensation on affected skin areas. Redness may occur on fair-skinned individuals.
DO NOT apply creams, salves, oils, lotions or burn cream as they will only trap the agent on the skin.
Flush the subject's skin with large amounts of cool water and expose the subject to fresh air.
Subject should relax and keep calm.
Talking reassuringly to the subject may help to relieve their discomfort and prevent panic.
STEP 6: Exposed foods will absorb CN or CS and should be discarded. CN or CS penetrates many plastics, so wrapped foods will probably be contaminated. Foods in cans may be usable after the outside of the cans have been thoroughly cleaned. Always check with the local health department regarding the sale of merchandise that has been exposed to chemical agents.
NOTE: Rubber gloves and a gauze face mask should be used by personnel during the clean-up stage to prevent the possibility of residual contamination. In heavily contaminated premises, some of the above steps will need to be repeated a number of times to remove lingering traces of CN or CS.


President Donald Trump will hold a campaign rally in Kentucky on Saturday evening as he barnstorms across the nation to help Republicans in key races.Trump will campaign for Rep. Andy Barr (R-KY) at Alumni Coliseum at Eastern Kentucky University (Richmond campus). Stay tuned to Breitbart News for live updates. All times eastern.


text:
Laura Clark
Published: June 13, 2013, 1:10 pm
Tags: Michigan, News, Consumer, Business
Better Business Bureau launches site to educate seniors about scam artists
Council of Better Business Bureaus CEO Carrie A. Hurt: "Awareness and education are the best tools we have in the fight against fraud."
DETROIT, Mich. – The Better Business Bureau and Western Union have teamed up to form a site that could save your life savings from scammers.
Everyone has received at least one of these calls. Someone calling to say that you've won a cruise, won a million dollars, or that a family member is in trouble. But now, the BBB and Western Union have decided to launch a site that will educate seniors, who are particularly vulnerable to these scams, and their families about how to stop scammers from interfering with their lives and stealing their money.
"Scams are a form of financial abuse. Scammers create an expectation of trust that results in financial loss and considerable distress especially to older people who fall victim," said Carrie A. Hurt, president and CEO of the Council of Better Business Bureaus. "Awareness and education are the best tools we have in the fight against fraud."
This effort comes just in time for World Elder Abuse day, which will be celebrated on Saturday, June 15. The Service is called BBB Scam Stopper and is geared particularly toward seniors.
For more information, or to sign up for alerts and weekly emails reporting the latest scams across America, visit these links:
Scam Stopper

redpajama_set_name: RedPajamaCommonCrawl


This particular medicine comes in 6 different sizes and various flavors and is administered orally to cats and dogs. These are chewable tablets which are given to cats and dogs according to their weight, for example, Comfortis for dogs 60 lbs and comfortis for dogs 120 lbs.
Spinosad is from the family of antibacterial medications and contains two important compounds, which are, spinosyn A and spinosyn D respectively. This particular medicine is primarily given to cats and dogs to cure them of fleas and ticks. This medicine also acts as a preventative treatment to the development of fleas in cats and dogs.
However, ensure that you give these chewable tablets to your cat or dog according to how the vet has instructed you to do so as an overdose may be fatal as animals are sensitive.
You can easily buy Comfortis online from Canada Pharmacy.
The active ingredient in this medicine is Spinosad.
Comfortis should be given to your dog and cat according to the dosage prescribed by your doctor. This chewable medicine is given according to the weight of the dog or cat it has to be administered to. You can give Comfortis to your pet with food or without food.
Basically, this medicine has to be given to cats and dogs at monthly intervals. If your pet starts to vomit within 60 minutes of taking comfortis, give them another full dose.
Preferably, Comfortis should be given one month prior to the primary fleas and ticks season.
It is for cats that are older than 14 weeks and weigh 900 grams or more.
Refrain from giving to breeding, breastfeeding and pregnant cats.
Other than an approved label, Comfortis should not be given with any other medication.
Avoid if your dog has a history of epilepsy or seizures.
As this particular medicine is administered to both cats and dogs, the following are the adverse effects that they can experience. Some of the side effects may overlap.
Apart from vomiting, other side effects are considered rare in dogs.


Provided strategy & front-end development via the popular CMS platform known as Wordpress. This website is clean, functional, easy to use, and is aesthetically pleasing.
Scott is an award-winning designer & developer based out of Reno, Nevada (USA), and has over 12 years of professional experience both in corporate and agency environments.
Browse my latest portfolio entries to view my latest work which includes but is not limited to User Experience/Interface Work, Web Design, Front-End Development, and Email Design/Development.
Devoted to creating the best experience by focusing on the end-user first. Scott designs and develops websites that are intuitive, easy-to-use, scale appropriately, and provides users a pleasant, clean, and uncomplicated experience.
Scott's designs are not only highly-polished, but they also look great on multiple device platforms and mediums. With ten plus years designing as a professional (twenty years in web design), Scott's designs are tried and true through simplicity but are highly visually attractive.
Making things work through simplicity. Scott codes by hand with the latest web technologies at his disposal to make your website work smoothly and efficiently on multiple device platforms.
Scott builds powerful and beautiful WordPress websites that are easy to maintain, reliable, and easy to use. Scott builds custom WordPress themes to support most projects. This optimizes speed, is easier to maintain, and reduces the reliance on 3rd party plugins.


I have figured out why I feel so lazy, slothy and such. Typically I would wake up everyday between 6:30 and 8:00 in the morning and get ready for class which started at 8:00 or 9:30 in the morning. Then I would drive to campus and park my car which was followed by a brisk walk to class. Everyday. And then walking from class to class and then back to the parking garage. All that walking burned a lot of calories and kept me from feeling icky.
Since summer started I haven't really been walking all that much. I workout but not enough, especially considering my goals for the summer… So I guess starting tomorrow I will take some long walks, actually ride my bike somewhere and have an adventure. I work Friday through Sunday, so that will get me some real movement. Maybe I will start swimming or something.
I feel really alone right now, and doing any of these things alone just isn't much fun.
My new apartment will be ready in just a week and a day. This is very exciting. I won't actually be able to move in for a few days or weeks after that. I'm getting my floors refinished before I move in. Right now they have the potential to be beautiful but thanks to years of wear and tear, the wood floors don't look so hot.
When I get to Houston I'm going to make a trip to IKEA to figure out a way to make my kitchen work for me. As it is right now there is zero counter top space, as in, there are zero counters. Just a 5 foot wide sink "thing". It seems the sinks from the 20's required drying racks on either side, what? No dishwasher? haha And the wall opposite the sink is totally bare, not a damned thing on it. And really, there isn't room for anything, I believe there is only a few feet between the wall and the sink. Yikes. Only one cook in there at a time.


receive a FREE Copy of this powerful DVD!
The regular price for this DVD is over $8.00 with shipping in the US.
Bulk Discounts are available for sets of 5 and 10 DVDs.
ABR recommends this hard-hitting and powerful film. We strongly encourage that DVDs be purchased in bulk and given away to young people and others. Distribute copies at your church, local high schools, colleges, coffee shops, etc. Help expose the baseless belief system of evolutionary naturalism that has turned the hearts and minds of so many away from the Creator: Jesus Christ.
Visit the ABR Bookstore and place your order today.


text:
Hillary Clinton in a Post-Factual Democracy
By WhskyJack, a Trail Mix Conributor
Barry Ritholtz in his Bloomberg column has a good discussion of the uses and impact of Agnotology. (Agnotology: Culturally constructed ignorance, purposefully created by special interest groups working hard to create confusion and suppress the truth)
He lists a number of examples from Global warming deniers to antivaxers. It also occurred to me that HRC was also a victim. It is why many of her supporters look at those who attack her as if they have a third eye in their forehead.
It is HRC's biggest problem and how you combat it is beyond me. Facts and reason don't seem to work.
As Barry's summation points out facts and truth are important for a Democracy to make good choices. When they are thrown out the window maybe we are screwed.
I'm not sure how to approach this but I will start with these quotes:
"Maybe we can persuade people to change their minds by marshaling facts and making arguments to rebut negative attacks. But that doesn't work for everyone. You can't just talk someone into trusting you. You've got to earn it. So, yes, I could say that I sometimes sound careful with my words is not because I'm hiding something it's just that I'm careful with my words. I believe what you say actually matters. I think that's true life, and that's especially true if you're president." — Hillary Clinton in a speech given June 27th 2016
"Thirdly and perhaps most significantly, we now live in a post-factual democracy. When the facts met the myths they were as useless as bullets bouncing off the bodies of aliens in a HG Wells novel." — Nicholas Barrett, a young British millennial reacting to the insane Brexit vote.
"Fed up millennials speak out," Financial Times, June 24, 2016
Definition: Post-factual democracy, a democracy in which ignorance and irrationality hold sway over facts and reason.
I want to thank Pat for the HRC quote. It helped me pull this together in my mind. Notice that HRC believes that the truth will eventually win, so did many people in the Republican party. But you can see where they are at now. So far Nicholas is right, the stop Trump movement looks like the army against the aliens all of their weapons have proved useless.
Ritholtz: "Democracy is based on the concept of a marketplace of ideas. Supreme Court Justice Oliver Wendell Holmes described the "free trade in ideas" within "the competition of the market." By the time voters head to the polls, the participants will have chewed over the finer points, the details will be well known to all and, for the most part, everyone more or less understands what's at stake.
More Posts by WhskykJack
Note from Craig: WhskyJack could use our help for a worthy cause — School supplies for kids in his neighborhood.
Author whskyjackPosted on July 2, 2016 July 1, 2016
32 thoughts on "Hillary Clinton in a Post-Factual Democracy"
"Agnotology" named after or in honor of vp spiro agnew, jack?
great thread topic. thanks. very timely considering its prevalence amongst the drumpfestation.
is not this condition also a cousin of "disinformation"… about which an interesting note at merriam-webster:
In 1939, a writer describing Nazi intelligence activities noted, "The mood of national suspicion prevalent during the last decade … is well illustrated by General Krivitsky's account of the German 'Disinformation Service,' engaged in manufacturing fake military plans for the express purpose of having them stolen by foreign governments." Although the Nazis were accused of using disinformation back in the 1930s, the noun and the practice are most often associated with the Soviet KGB. Many people think "disinformation" is a literal translation of the Russian "dezinformatsiya," which means "misinformation," a term the KGB allegedly used in the 1950s to name a department created to dispense propaganda.
other than for the purpose of spreading more agno-guano, why are the outrageous outraged gopers calling for recusal of atty gen? loretta lynch in effect has already recused herself by publically declaring the decision will be ultimately made by fbi director comey …a well known and well-respected republican.
I wonder whatever happened to all those Southerners who moved to Brazil after the night they drove old Dixie down……
Jamie44 says:
Speaking of "Post Factual", guy on Twitter seriously pretending to be a Congressman, Steven Smith Rampant racist who retweets every Tea Party thing he can find.
Katherine Graham Cracker says:
Great post Jack
There have been a number of studies at Virgina Tech about why you cannot change people's minds once they believe something is true
And of course Republicans who don't believe facts necessarily have to be true….so much of what is currently wrong with our political system can be laid at the feet of goopers. What have Republicans done that has been of value to this country (excluding Lincoln)
"Get your facts first, then you can distort them." -Twain
Hillary's followers must've been sipping on white lightning because they are blind to the truth.
Willfully ignoring her actions and her ever-changing stance on issues (lies), and to a degree that they would skewer anyone else who did the same is quite sad. We do not need a woman to be POTUS so badly that we need to settle for HRC.
It's time for real change. It's time for Bernie. On to the convention.
can't cash losers tickets at the winners window
check please
jace says:
Hillary was right. There was and continues to be a "vast right wing conspiracy" designed to cast doubt on everything she does, from policy decisions to the color of dress she chooses on any given morning. That the effort has been effective can not be denied. However effectiveness does not constitute accuracy or truth, except for those who choose to believe their own lying eyes and ears.
Bernie LOST. He lost on most votes. He lost on delegates even not counting supers. He lost in all closed primaries. He lost all the states that have majority of electoral votes.
HE LOST
But believe what you want to believe even if not connected to facts in any way shape or form
Jack…. excellent post.
Culturally constructed ignorance… Ritholz has a wonderful way with words. It's always the science stuff that has me shaking my head. Both sides of the aisle seem to hate it… just on different topics.
Flatus says:
I suppose that miserable word is supposed to be pronounced eh-know-tology ?
I still like rectal cranial inversion–easier for we enlisted swine to remember
Speaking of facts, of 158 Trump statements analyzed, 78 percent were false
Here is what Jefferson proposed for education divided by age group and performance. To me, it makes more sense than free college for all which I believe to be an incredible waste of resources. Perhaps it would make sense if students demonstrated their working knowledge of the subjects Jefferson mandated prior to being admitted.
We must simply stop catering to the intellectually lazy and incompetent.
WaPo reporting Hillary was pleased to help the FBI through a 3-1/2 hour interview this morning.
So what if Mr Clinton did talk about the server? What would he say? Tell them to get the damned investigation done? Interview her? Interview me? or Circle 'd', all of the above. Where, anywhere, does it say that a family member cannot talk to a prosecutor? Or the district attorney? Or, gasp, the Attorney General? I suppose there is something about calling for an appointment first.
Flatus
One thing to remember that in the age when Jefferson was recommending that the already educated be even better educated, it was normal to have both indentured servants and apprentices. Even our modern unions have tests and licensing for skilled workers. Mike Rowe of "Somebody's Got To Do It" has a foundation for those wanting to attend technical schools.
My grandson is currently attending Bates College here in Tacoma to get his degrees in welding but also has classes in the basics of math and English. He would have been miserable in a college with all the academic demands. He's truly intelligent, but that would have of absolutely no interest. After two years, he will be joining his brother and apprenticing for a firm in Portland. Because his dad has a good income, he doesn't qualify for grants and the loans would have killed him if his dad hadn't had the good sense to fill up an educational fund for the past 18 years.
These are great, well paying jobs and they can't really be outsourced. It would make sense if this type of education and paid apprenticeships were available and free in all of these necessary skills from agriculture to zoo maintenance. The world really doesn't need another lawyer.
ny times:
"Secretary Clinton gave a voluntary interview this morning about her email arrangements while she was secretary," Nick Merrill, a campaign spokesman, said in a statement. "She is pleased to have had the opportunity to assist the Department of Justice in bringing this review to a conclusion."
The campaign declined to elaborate on the substance of the interview, which lasted about three and a half hours at F.B.I. Headquarters in Washington. Shortly afterward, two black S.U.V.s were seen returning to Mrs. Clinton's house in the capital.
and from
http://www.dailymail.co.uk/news/article-3671543/Hillary-Clinton-gives-voluntary-interview-FBI-long-running-email-scandal-suggesting-probe-possible-secrecy-law-violations-near-end.
It is standard procedure for the FBI to question a person at the center of an investigation last, with all available facts at hand.
'With a person like Secretary Clinton, the FBI probably assumes they are going to get one chance to interview her,' former Justice Department prosecutor David Deitch told the Chicago Tribune in May.
He said it would be difficult 'not only because she is a prominent person, but because she is very busy right now with the presidential campaign,'
Clinton has maintained an openness to speaking with authorities and expressed hope that the matter would conclude quickly.
The Democratic National Convention is just three weeks away. The FBI has insisted there is no timeline to the investigation.
News of the potential interview came on a day when Attorney General Loretta Lynch said she 'fully' expects to accept the recommendation of the career professionals as to how to proceed on the case, although she left herself some wiggle room.
'The recommendations will be reviewed by career supervisors in the Department of Justice and in the FBI, and by the FBI director, and then as is the common process, they present it to me and I fully expect to accept their recommendations,' Lynch said at a panel in Aspen Friday.
xrepublican says:
Ms Clinton is the victim of 25 years of agnotomancy, practiced by demons of darkness and confusion.
Who gives a damn about the ex-Prez bumping into the recused AG ? Friends, we've struck deep into the Silly Season.
horsey at la times
ryan lizza at new Yorker
What was turning into Hillary's finest month was topped off by the long-awaited report by the House Select Committee on Benghazi, which took more than seven hundred days and seven million dollars to reach largely the same conclusions that previous inquiries had arrived at: "no new evidence of culpability or wrongdoing by Hillary Clinton," as theTimes put it.
And then, on Monday, Bill Clinton wandered across the tarmac at Phoenix Sky Harbor International Airport to chat with Attorney General Loretta Lynch.
A Democrat who was briefed on the meeting told me that it was more than a hundred degrees outside and Lynch, who was immediately uncomfortable with the visit, felt that she couldn't shoo the sixty-nine-year-old former President, who has had heart problems in the past, back onto the tarmac. Lynch, according to this person, also insisted that her security detail remain at her side while Clinton was onboard her aircraft so that the ex-President and the Attorney General would not be alone together.
Donald Trump is getting backlash for a tweet that is critical of Hillary Clinton and uses a star resembling the Star of David.
Industry partnerships with community colleges is a different cup of tea. In Ohio when I was a boy the trade unions worked with employers in a successful effort to train entrants into skilled journeymen. Some of these apprenticeships would last a couple of years with the worker taking formal classes at union facilities supported by OJT under the employers' skilled workers. It was very effective without the problems you cited.
Coincidentally, my grandson Adam spent a year in Florida learning welding in a facility run by one of his father's brothers. The outfit made those massive concrete pipes that carry whatever to wherever. It was backbreaking work in the Florida sun with co-workers who were less than personable. He did learn how to weld but he decided it wasn't for him because of the health and injury potential associated with the job.
Now he's working as a laborer for a contractor with short term work at Boeing in Charleston. He's a good kid but his immediate prospects are constrained until he turns 21 because of his being caught buying marijuana. That b-day will be on Dec 27. The type of apprenticeship program I described would be perfect for him.
Elie Wiezel passes away at 87
Star of David in front of stacks of money on the day Elie Wiesel passes away. One thing you can say about the Clintons, they are fortunate in their enemies.
It's a kkklustertrump. deadbeat's presidential campaign makes McGovern's look orderly to the point of being slick.
Thanks for this topic, Jack.
I've used the word agnotology in several venues today, each garnered positive feedback.
Blue Bronc says:
Hopefully, the stupid mj laws will be changed and soon. Tens of thousands of innocent victims of a crazy law will be freed from prison (eventually, it fhey do not die in it).
One of the many things in life I learned, through a lot of close up experience, is firewood. Cutting it, splitting it, stacking it. The only enjoyable thing is burning it to stay warm or cook. And, if it is very nasty mosquito night, wet and smokey. (cough, cough). Most of the kids today do not know what it is like to have fun with a wedge and a 10# maul. And, most of the kids today have indoor plumbing too.
If you did not read it in the WashPo, John Adams was all for July 2 as the day of American history. So in his honor, I salute with American Rye Whiskey.
The NBC Sports Network is broadcasting all the the Tour de France this year. The best sporting show on earth. Great overhead shots of France, with lots of castles, abbys and all the villages.
msnbc interview reported at realclearpolitics
CHUCK TODD: Let me ask you this, your husband made an unannounced visit to the attorney general on the tarmac in Arizona. I'm curious of your initial reaction when you found out the news
HILLARY CLINTON: Well, I learned about it in the news and it was a short, chance meeting at an airport tarmac and on both of their planes, as I understand it, were landing on the same tarmac at about the same time and the Attorney General's husband was there. They said hello. They talked about grandkids, which is very much on our minds these days, golf, their mutual friend and former attorney general Janet Reno. It was purely social. They did not veer off of speaking about those kinds of, you know, very common exchanges.
CHUCK TODD: You didn't view as what he did as inappropriate?
HILLARY CLINTON: Well it was a short, chance meeting that occurred, and they did not discuss the Department of Justice's review. And I know that some, nonetheless have viewed the meeting in a different light, and both the Attorney General and my husband have said they would not do it again, and the bottom line, for me, is I respect the professionalism and integrity of the officials at the Department of Justice handling this process. I was pleased to have a chance to sit down and answer their questions today to try to help to bring this review to a conclusion.
CHUCK TODD: So you don't, do you understand why many in the public, many, some of them are political opponents of yours, some are supporters, who thought that was a bad decision by your husband, that that was a mistake and he should have known better?
HILLARY CLINTON: Well I think, you know, hindsight is 20/20. Both the Attorney General and my husband have said they wouldn't do it again, even though it was from all accounts that I have heard and seen, an exchange of pleasantries. But obviously no one wants to see any untoward conclusions drawn, and they've said, you know, they would not do it again.
so what about janet reno? bill visited her last year at her home and I wonder if there's new news on her well-being.
How many times can the GOP cry "Wolf" before the networks just laugh in their face for the over the top myth making? Probably forever since it means eyeballs, ratings, advertising dollars, and inane commentary that can be run on a continuous loop by no talent news readers who have never seen anything resembling a journalism class.; and in some cases, not even the inside of an English class.
Seen on the streets of New York.
Previous Previous post: Under Other Than Honorable Discharge
Next Next post: Sunday Serendipity


Dr. Jose L. Bacusmo, who is now in his second term of office as VSU President, bared his accomplishments for the Calendar Year 2012. For convenience and easy retention among those who will browse what the VSU President had accomplished, Dr. Bacusmo divided his presentation into four major classifications, namely: instruction, research and extension, administration and finance, and planning and resource generation.
Instruction. Dr. Bacusmo emphasized that his administration fully embraced quality assurance. As such, the University was awarded by the Accrediting Agency of Chartered Colleges and Universities in the Philippines (AACCUP), Inc. with "Qualified for Level IV Accreditation Status" for its Agriculture Program. Moreover, the Education and the Graduate Programs of VSU that were assessed by the AACCUP were awarded "Assessment on-going to Qualify for Level IV" with few areas to be revisited.
The VSU's Department of Development Communication was also awarded Center of Development (COD) by the Commission on Higher Education, the only COD for Development Communication in the Philippines, with the College of Development Communication of UP Los Baños and the Department of Communication Research of the College of Mass Communication of UP Diliman as Centers of Excellence in Development Communication and Communication, respectively, in the entire country.
The College of Agriculture of VSU Main Campus has maintained its reputation as Center of Excellence given by CHED. On the other hand, VSU-Tolosa retained its accolade as Regional NAFES School and its BS in Criminology course has been recognized for offering as a degree program. Dr. Bacusmo also reported that the offering of BS in Meteorology program in VSU Main has been approved by CHED.
He also mentioned that VSU graduates fared well in Licensure Examinations. In fact, two of its graduates made it in the top ten. Jackson Abelardo Bellen placed 3rd in the Agricultural Engineering Licensure Exam and Jefferson T. Cello ranked 10 in the Geodetic Engineering Licensure Exam. Moreover, the performance of VSU graduates in licensure examinations brought honor to the University as most of the Board Examinations taken by the VSU graduates registered much higher institutional passing percentages as compared with the national passing percentages in the following Board Exams: Chemist Licensure Exam – 41.66%; Veterinarian Licensure Exam – 35.29%; Forester Licensure Exam – 62.50%; Agriculturist Licensure Exam – 47.92%; Nursing Licensure Exam – 53.33%; and Licensure Examination for Teachers – 66.67% (Elementary) and 73.68% (Secondary).
The VSU President also revealed that a number of faculty and staff are pursuing graduate studies broken down as follows: (externally-funded) master's degree - 3, and doctoral degree - 4; and (internally-funded) master's degree - 3, and doctoral degree - 9. There are also a total number of 12 faculty members who finished their graduate studies on a scholarship and reinstated to work.
Because of his concern in enhancing access to higher education among VSU students and other stakeholders, Dr. Bacusmo was able to scout benefactors who offered 263 new scholarship slots which the students are now enjoying. He even said that a training-writeshop on developing on-line course materials was also conducted and that the University is now offering the TESDA Skills Training on Welding with the first batch of 20 trainees.
The University did not stop reaching out and connecting with other institutions through internationalization and networking. VSU is continuously exchanging students with the University of Hohenheim, Hiroshima University, and the Tokyo University of Agriculture and Technology. It also entered an academic exchange under the Erasmus Mundus Program in which VSU is one of the only three universities in the Philippines that are able to participate in the program. It also entered a MOA with PhilRice on access to laboratories. Dr. Bacusmo's attendance and active participation to the AAACU Meeting in Seoul Korea paved the way for his election as Second Vice President of the Asian Association of Agricultural Colleges and Universities.
Research and Extension. VSU is very active in terms of research and development planning, monitoring and evaluation. The University has a strong partnership with other national and international funding institutions. Aside from its active participation in the ACIAR and DA planning meetings, it is also involved in conducting annual RDE review.
Dr. Bacusmo said that the University was able to source fund amounting to P26,056,885.82 for research and development in 2012. He added that based on the 2012 In-House Review, there were 39 new projects approved and funded, 20 research projects completed, 24 extension projects implemented, 31 technologies for generation, 22 information for generation, 12 technologies for commercialization, 30 information for dissemination, and 19 technologies for protection.
Some VSU researchers were also involved in workshops and conferences whether as organizers or as participants, such as the 13th International Seminar-Workshop on Tropical Ecology and the Jackfruit FIESTA.
Several faculty researchers and a consortium were also recipients of various awards from the local, national, and international award-making bodies. Among these were: four faculty members garnered UPLB Alumni Awards, ViCARP as Ugnay Award Finalist, RMIS and RACO coordinators awarded by PCAARRD, researchers win awards in PSAS-VC Convention, Pest Management Council of the Philippines (PMCP) Award for Instruction, PMCP Best Poster Award, 2nd Placer in the Philippine Society of Soil Science and Technology, and AFMA Best Paper Awards.
VSU has cemented a strong R&D network leadership and partnership that brought the University the designation as TUKLAS Lunas Center by DOST Health Council, leadership in the Regional Land Use Consortium, leadership in the Regional Climate Change R&D Center, leadership in the Regional GIS Network, leadership in the Task Force on Agriculture Statistics for the Regional Statistics Coordination Committee, and establishment of Innovation Technology Support Office (ITSO) @ VSU.
Administration and Finance. Dr. Bacusmo pointed out that the University has created 52 new plantilla positions through scrap and build scheme. Likewise, a total of 52 academic staff who were on contractual basis were given temporary items. The University also facilitated the conduct of the EHEM training, gender sensitivity training and sexual harassment orientation, and seminar-workshop on harmonized gender development guidelines.
In terms of infrastructure/facility development, the University has initiated the following projects: VSU Casitas expansion and repair, renovation of the Department of Pure and Applied Chemistry Faculty Room, repairs of nine buildings/facilities in relation to accreditation, construction of Lily Pond and Fountain, construction of the viewing pavilion, construction of a 50-meter covered walk, renovation of the 3rd Core Value Cottage, expansion of the OVPRE building, tiling of the ground floor of CCE, renovation of the DASS Faculty Room, renovations of the VSU Hospital, establishment of the VSU Records Office Archive, and renovation of Alumni Heritage House. Moreover, the VSU Hospital has acquired x-ray and other diagnostic equipment.
Planning and Resource Generation. The VSU President also stressed that the Office of the Vice President for Planning and Resource Generation is annually conducting the Income Generating Projects Review to assess how the different IGPs of the University are going on and to thresh out problems and solutions. Dr. Bacusmo also said that the University is doing its best in submitting on time complete Normative Financing Data and proudly revealed that we are the first institution in the country to have its Strategic Performance Management System approved by the Civil Service Commission.
As regards the satellite campuses, VSU-Isabel has been awarded Level I Accreditation Status by the AACCUP for its BSED, BEED, and BS Agribusiness programs. Similarly, the other three satellite campuses went through the Preliminary Survey Visit with their respective programs: VSU-Tolosa for its BSED, BEED and Fisheries; VSU-Alangalang for its BSED, BEED, and BS in Environmental Management; and VSU-Villaba for its BSED, BEED, and BSA. Dr. Bacusmo also reported that the 2012 Grand Alumni Homecoming hosted by Batches '82 and '85 was a resounding success. The activity was hinged on the tagline "MagKiTiPay (Magkita-kita, Magtigum-tigom, Maglipay-lipay) na sab ta sa ViSCA."


With this relationship-based account, qualifying customers enjoy a waived monthly charge and special Club offers, including the ability to earn Arvest Rewards* points, a great offer on an Arvest credit card, free unlimited Online Billpay and more.
No monthly service fee for small business customers with a commercial deposit account of $5,000 (average balance) or more, or $20,000 or more in a commercial loan(s) or a combination of both totaling at least $20,000. $15 per month fee applies to those who do not maintain the above balances.


text:
Audrey Hepburn's Biography!
Audrey Forum.
Favorite Links.
UNICEF.
Filmography.
Gallery 1.
Guest Book.
What's on Sale.
Audrey Chat.
About Audrey Hepburn.
SHORTLY PREFERENCES, TRIVIA ETC.
Audrey Hepburn's height was: 5' 7".
Audrey Hepburn's weight was: 110 p.
Audrey Hepburn's Shoes Size was: 8, 8 1/2.
Eyes:brown.
Hair:brown.
Figure:32-20-35.
Audrey Hepburn's nationality:
Audrey Hepburn was British.British in terms of British laws.In terms of her family heritage she might be considered Dutch/British.Her mother was Dutch and her father Anglo-Irish.There have also been talks about Audrey's Jewish roots.
'Andrea Dotti' (18 January 1969 - 1982) (divorced)
Mel Ferrer (25 September 1954 - 5 December 1968) (divorced)
Trivia :
Audrey Hepburn was a mother for two sons: Sean Ferrer (born 17 January 1960) and Luca Dotti (born 8 February 1970)
Audrey Hepburn was first choice for the lead in A Taste Of Honey (1961)
Chosen by People magazine as one of the 50 Most Beautiful People in the world in 1990.
Chosen by Empire magazine one of the 100 Sexiest Stars in film history in 1995.(#8).
Audrey Hepburn sang "Happy Birthday Mr. President" to J.Kennedy for his last birthday in 1963.
Audrey Hepburn's Biography.
She thought she was just a skinny broad' with size 8
feet and a flat chest but the world loved her style.
She invented a look that revolutionised Hollywood's conventional ideas of beauty and influenced generations of women. But behind the great star was a traumatic upbringing she could never quite forget. Geraldine Bedell discovers a new biography that tells the fascinating story of Audrey Hepburn's rise from wartime waif to celebrated actress and style icon.
It is now more than 40 years since the world first caught sight of Audrey Hepburn. In her ballet pumps, turtleneck, cinched shirts, capri pants and gamine haircut, she erupted into the Hollywood of the Fifties, with its sweater girls with
big hair and big bras, overturning conventional ideas of beauty.
Pamela Clarke Keogh, author of Audrey Style, a new book about Hepburn, believes she influenced not just her own generation of women but those that followed. "She seemed to me the woman who had the most enduring style this century, the most relevant to today. And then when I started talking to people who knew her, it became obvious that the style wasn't merely superficial. It was a reflection of her character. Unlike a lot of stylish people, she had depth." Certainly, in 1990, when Hepburn was already in her 60s People magazine listed her as one of the 50 most beautiful people in the world. In 1996, three years after her death, Harpers & Queen conducted a poll to find the most fascinating women of our time, and she was voted number one.
Born Edda Kathleen van Heemstra Hepburn Ruston in Brussels on May 4, 1929, Audrey was the daughter of a Dutch baroness and an Anglo-Irish businessman. Six years later, her father, a Nazi sympathiser, walked out on his wife and daughter - an event Audrey later called the most traumatic of her life. "You look into your mother's face and it's covered with tears, and you're terrified. You say to yourself, 'What's going to happen to me?' The ground has gone out from under you...He really left. He just went out and never came back."
Audrey and her mother moved to Arnhem, where they spent the war years under Nazi occupation. The family was rumoured to be of part-Jewish ancestry and an uncle and a cousin were executed; the family's ancestral home was confiscated and its bank accounts sequestered.
In the winter of 1945, when Audrey was 15, thousands died in Holland from starvation and tuberculosis. Later, she spoke of eating tulip bulbs and of trying to make bread from grass, of having only water to drink, and of going to bed in the afternoons to conserve her strength. Holland was finally liberated on May 4, 1945 - her 16th birthday. Audrey was then 5ft 6in and weighed six and a half stone; she was suffering from anaemia, jaundice, and asthma. It was never entirely clear whether the slightness of her adult frame was a consequence of the malnutrition she suffered during the war. She implied it was; but it seems at least as likely that she learned to be disciplined about food in those years, and that discipline remained with her. (She did become what she called chubby in London shortly after the war, weighing as much as nine stone five, but it seems that she then simply decided on her ideal weight - just under eight stone - and made sure she stayed there).
Her mother, an undemonstrative woman, channelled her affection into ambition for her daughter; a few months after the liberation, she took Audrey to London, sensing that the opportunities would be better there. The idea was that Audrey - who had had ballet lessons throughout the war, dancing at the end in shoes that were worn to shreds - should become a ballerina. Her mother gave manicures, worked in a flower shop and became a landlady of Mayfair lodgings to pay for lessons. In 1948, Audrey was awarded a modest grant to attend Marie Rambert's ballet school. There she started calling herself Audrey Hepburn. After months of training, Marie Rambert took her aside and told her that although she had great technique and could always teach, she didn't have what it takes to become a prima ballerina. Years later, Audrey told her son Sean that she went home that day and wanted to vanish. PAMELA Clarke Keogh believes Audrey's ballet training was crucial to her success as an actress and her emergence as an icon of style. It taught her discipline, and the paramount importance of silhouette. In her look and movements, she sought simplicity and grace but she knew that achieving such effortless-looking perfection took supreme concentration and control.
Audrey acquired a theatrical agent and began a fledgling career as a chorus girl in slight West End musicals, such as High Button Shoes (1948), Sauce Tartare (1949) and Sauce Piquante (1950). In 1951, she was given one line in a British film, Laughter In Paradise. She must have displayed phenomenal screen presence - on the strength of it she was offered a seven-year contract. She declined to sign - sensibly, as it turned out, because, while making her next British movie in Monte Carlo, she was spotted by the French writer Colette, who decided she would be perfect for the leading role in the Broadway version of her novel, Gigi.
Meanwhile, the London office of Paramount called her agent, asking her to test for the part of an innocent European princess who escapes her minders for a night and meets an American newspaperman, Gregory Peck. Both the director, William Wyler (who was to become a lifelong friend), and the executives at Paramount loved the test. The executives cabled their production chief in London: "Exercise the option on this lady. This test is certainly one of the best ever made in Hollywood, New York, or London."
The film was Roman Holiday, which won her an Oscar for Best Actress. She also played Gigi on Broadway and never again had to struggle for work. At that time her influence on the way other women looked also began. "Thanks to their first glimpse of Audrey Hepburn in Roman Holiday," wrote the New York Times, "half a generation of young females stopped stuffing their bras and teetering on stiletto heels." Hepburn (she was asked to change her name to avoid confusion with Katharine Hepburn, but refused) was utterly different from other successful actresses of the time. Less blatantly sexy than blowsy blondes like Marilyn Monroe or Jayne Mansfield, she was more mysterious and European than some of the breezy Californian girls or the statuesque stars like Lana Turner or Ava Gardner.
After Roman Holiday, she made, in quick succession, Sabrina with Humphrey Bogart and William Holden, Funny Face with Fred Astaire, and Love In The Afternoon with Gary Cooper. Hubert de Givenchy designed her wardrobe for all these films. She became his muse, and he sealed her reputation as a wearer of simple, elegant, but perfect clothes.
Offscreen, in her leggings, black turtlenecks, white shirts tied at the waist, and with her cropped hair and boyish figure, she was clearly an individual. Billy Wilder, who directed her in Sabrina, said: "This girl, single-handedly, may make bosoms a thing of the past." She herself considered she was "just a skinny broad" with a too-prominent collarbone, uneven teeth, size 10 feet and a flat chest.
Keogh believes Audrey's stylishness was largely innate. "She was born with an eye - she was a kind of artist but she also worked with the greatest photographers, make-up artists and hair stylists of her age, so she had great teachers. I think a lot of it was about her background: putting her best face forwards, even though her father had left and she had two really very challenging marriages. Beauty is almost easy; you're either born with it or not. What's really striking about her is that people warmed to her, whether they knew her for 20 years or met her for 10 minutes on a film set. She was very natural and unaffected. What she most enjoyed was to hang out in her garden with her dogs."
AT THE London premiere of Roman Holiday, in July 1953, Audrey met Mel Ferrer. A Princeton-educated producer, actor and director, Ferrer was tall, confident and charismatic. He was also twice divorced, had four children, was 12 years her senior and had a reputation for being stroppy. They appeared together on Broadway the following spring, and married in September.
Ferrer was not easy to live with. Keogh, who suggests Audrey may subconsciously have been looking for a father-figure, thinks "she may eventually have moved beyond his opinionated manner, or grown tired of trying to placate him". The success of her career in comparison with his probably didn't help either. They had a son, Sean, in 1960 and had hoped to have more (Audrey had four miscarriages). But after 13 years of marriage and a decade of rumours that they were on the point of separation, they divorced in 1967.
But Audrey undoubtedly produced her best work in the years of her marriage to Ferrer. She had an extraordinary run of successes: Breakfast At Tiffany's and The Children's Hour (both 1961) Charade (1963), Paris When It Sizzles and My Fair Lady (1964), How To Steal A Million (1966), Wait Until Dark (1967) and Two For The Road (1967). She was 38 when she divorced, and deeply upset by the failure of her marriage. She responded by making a (slightly) raunchier film than usual, Two For The Road with Albert Finney, in which she wore Mary Quant rather than Givenchy - and by striking up an intense relationship with Finney.
He recalls: "With a woman as sexy as Audrey, you sometimes get to the edge where make-believe and reality are blurred - all that staring into each other's eyes. I won't discuss it more because of the degree of intimacy involved. The time I spent with Audrey was one of the closest I've ever had."
In June 1968, Audrey was invited to cruise the Greek islands with a French family. On board, she met Dr Andrea Dotti, a 30-year-old psychiatrist and professor at the University of Rome. Her friends thought the relationship was a mistake, but in January, six months after they met and six weeks after her divorce from Ferrer was finalised, they married.
Conscious of the part her career had played in the breakdown of her first marriage, Audrey applied herself to being a doctor's wife in Rome. And, for a while, she was happy - especially when, four months into the marriage, she became pregnant. Determined not to lose this baby, Audrey took herself off to her 18th century farmhouse in Switzerland to rest out the remainder of her term. Andrea visited at weekends, but he continued to go out during the week in Rome, and was invariably photographed with some actress or countess on his arm.
Their son Luca was born in 1970 and, for a time, Andrea calmed down. But he never really adjusted to not being a bachelor. While Audrey might have been prepared - unhappily - to overlook his infidelities, she found it impossible to do so when they were splashed all over the newspapers. She put up with it for 11 years, for the sake of her sons, but she was being humiliated.
In 1980, at the home of mutual friends in Beverly Hills, she met Robert Wolders, the man she would come to call "my soulmate", with whom she shared the last, happy, 13 years of her life. Wolders, who was Dutch and had spent the war years less than 10 miles from Arnhem, was then recovering from the death of his wife, Merle Oberon, and Audrey had recently started divorce proceedings.
Together, they spent the next decade mostly at Audrey's farmhouse, La Paisible, in Tolchenaz, high above Lake Geneva. She had bought the house in 1965 and it was beautiful - decorated, as one of her friends said, "as she dressed: low-fat" - with an extensive orchard and gardens. Audrey made a brief appearance as an angel in Steven Spielberg's Always, and presented a television series, Gardens Of The World, for American television. After 1988, however, her main role was as a special ambassador for Unicef. The position meant a lot to her, not least because she had been a recipient of United Nations Relief herself after the war. With Wolders, she made 50 humanitarian trips in five years, although she never stayed away from La Paisible for more than two weeks, because she couldn't bear to leave her dogs. Sean and Luca visited regularly, and always came for Christmas. IN NOVEMBER 1992, back from a harrowing trip to Somalia, she felt exhausted and, thinking she might be suffering from a virulent amoebic infection, went to Cedars-Sinai Medical Center in Los Angeles for a full check-up. She had cancer. An operation removed it from her appendix and colon, but in a few days, it had spread to her stomach. She refused chemotherapy.
Audrey Hepburn spent her last month at La Paisible with Wolders, Sean and Luca, and died at 7pm on January 20, 1993. She was 63.
She would have been 72 this May; and although it is almost 50 years since the world first saw her in capri pants and ballet flats, she still affects fashion. American sportswear owes an enormous amount to her; while Manolo Blahnik, who recently recreated the Sabrina heel in honour of her, says: "Like it or not, she will be the most important look of the 20th century."
While puting the biography here I used:
"Audrey Style" by Pamela Clarke Keogh is published by Aurum Press on July 15, price 20. To order "Audrey Style" at the special price of 17 plus 99p UK p&p send a cheque/PO for 17.99 to the Express Bookshop, 250 Western Avenue, London W3 6EE or call 0870 901 9101.
© Express Newspapers Ltd
"Audrey Hepburn's Biography" by Alexander Walker and "Audrey Hepburn's Biography" by Diana Maychick have also been used.
For more on Audrey Hepburn go to "Audrey Hepburn Official Page".


Before we get into the mechanics behind this concept, let me show what "rhythmic feel" sounds like in a rock context. I will do this by breaking down a simple riff and performing it it with different rhythmic feels.
It's very important that you put down your guitar for these demonstrations and just listen for the subtle differences in these examples that I'm going to show you.


text:
Zanzibar and Pemba People's Party (ZPPP) var ett nationalistiskt afrikanskdominerat politiskt parti i Zanzibar. ZPPP styrde tillsammans med Zanzibar Nationalist Party (ZNP) i en koalitionsregering ön från 1961 till 1964. Partiet var det minsta av de tre politiska partierna på ön, ZNP, ZPPP och Afro-Shirazi Party. Genom att bilda en allians med ZNP 1961 tvingade man ASP till opposition. Deras politik var konservativ och hyste inget större agg mot den arabiska eliten, huvudsakligen beroende på att de var baserade på Pemba istället för Zanzibar.

Se även
Revolutionen i Zanzibar

Zanzibars historia
Politik i Zanzibar

redpajama_set_name: RedPajamaWikipedia


The innovative Tampa native, Landis LaPace, was recently called a possible "spitting image of Claude VonStroke" by Thump. LaPace is back with a highly anticipated new EP titled Caffeine and it was released November 13th on Psycho Disco Records. The Atlanta native and disco enthusiast, Treasure Fingers, is the founder of Psycho Disco and claims that the label "skews to the left of house music", which in my eyes means more creativity and innovation…so what's not to love?
Starting off the EP is the title track "Caffeine" which is an energetic house track that'll keep you dancing until your legs give out. The raw edged drums and percussion balance out perfectly with a powerful "in your face" bassline. The deep and dark bass stabs, occasional vinyl scratches and atmospheric background noises are combined with mesmerizing vocals that will give you a never ending rush of energy.
The second track on the EP is titled "Our House" and LaPace brings in some old school acid house vibes with a seductive 303 bassline that would bring a smile to Dj Pierre's face. The 303s lay on top of some heavy low end drums that give you the perfect combination of acid and tech house. To top off the acid trip, he has blessed us with psychedelic vocals that will be stuck in your head for quite some time and there's nothing you can do about it. Label boss, Treasure Fingers, has made some club killing remixes in his time and ends the EP with a juicy remix of "Our House".
Support the artist and the record label by purchasing the EP on Beatport or iTunes. You can stay up to date with Landis LaPace, Treasure Fingers and Psycho Disco Records by accessing the links below, cheers!


I remember Vestal Goodman. That magnificent voice became familiar to me in my teens, and all of us have enjoyed the talent and personality for more than fifty years. I remember those beautiful eyes and that magnetic smile. I remember the vivid colored, designer clothes and the jewelry. From the early years, I remember the long hair, piled high in a hugh nest of curls and from more recent years, the fashionable coiffured style. And all of us remember the trade mark white hankerchief waving from the stage.
More that anything I remember the songs and the testimony. And, I remember the times I was fortunate enough to interview this wonderful lady; this Queen of Gospel Music.
Originally from the Albertville, Alabama-Sand Mountain, Alabama area, Howard and Vestal Goodman began their ministry shortly after their marriage in November of 1949. Vestal, sister of noted tenor singer, "Cat" Freeman remembered with the Statesmen, met Howard during camp meeting services, when he was 25 and she, only 15. They eloped four years later, and as they say, "the rest is history." Fortunately for southern Gospel music, that history included their fifty odd years singing Gospel music.
Some people are just plain special! Such is the case with Sandi Duncan-Clark. I know that many of you are familiar with Sandi through her former reporting with the US Gospel News and now with us right here on the Southern Gospel Music Forum. If you are familiar with her work, you know she is a great journalist! For those of you that have had the opportunity to get to meet Sandi, you also know that she is a great person! Sandi has contributed much to the southern Gospel music industry over the years and some of us decided that it was time we honored her for those contributions!
It all began with John Mills. John is the moderator of all of the discussion lists that are associated with the Southern Gospel Music Forum. John decided that we were going to make February, Sandi Duncan-Clark Month on the email lists! This turned out to be a popular decision as list member after list member wrote about the way Sandi had touched their lives.
I have been going about my business today with a heavy heart. This morning I received a call that Roger Bennett had gone home to be with the Lord. Many people in Southern Gospel Music have passed on, but to this date, no has died that I knew as well as I knew Roger Bennett. Now, I would not say that Roger and I were close friends. However, I have many special memories of Roger Bennett and I want to share them with you.
At a time like this, our minds go to Roger's family. His wife, Debbie and children, Chelsea and Jordan, were his pride and joy! I never had a conversation with Roger when he wasn't talking about his family. Personally, I never met any of them but my thoughts and prayers are with them right now.
Most people in Southern Gospel Music became familiar with Roger Bennett when he joined the Cathedrals in 1979. It was shortly after that, I became familiar with this talented singer and songwriter. I was not very old when I went to see and hear the Cathedrals in New York for the very first time but I will never forget Roger taking the time to talk to an awestruck kid that was a huge fan standing at their product table purchasing music. As time went on, I saw Roger repeat that scene time and time again at product tables from everywhere from the NQC to a small churches.


Tampere University is a merger of the former University of Tampere and the Tampere University of Technology (as of 01/01/2019). This new foundation-based university is also the majority shareholder of Tampere University of Applied Sciences and together these two institutions form a multidisciplinary community in higher education with competitive edges in technology, health and society.
With its seven Faculties and some 19,000 students, Tampere University is the second largest university in Finland. It is Finland's biggest provider of higher education in the field of social sciences and the accompanying administrative sciences. In addition, it has the strongest research capacity on public administration in Finland.
Higher Education Group (HEG) is a teaching and research unit focusing on themes related to governance, management and financing of higher education, research and innovation both at the institutional and system level. HEG is operating within the structure of Faculty of Management and Business, which brings together the disciplines of politics, business, administration, and industrial and information management.
In addition to MARIHE programme HEG offers doctoral education and Finnish non-degree programme as continuing education for administrators and managers working in higher education sector. In addition, HEG offers tailored training for the personnel of higher education sector in Finland and abroad (especially in Sub-Saharan Africa and China).


text:
PREVIEW: That Day We Sang
Lucy Hope recommends a TV Christmas treat
Pride 2014: Lea Delaria Interviewed
Anna Carruthers chats to the Orange Is The New Black star, Pride Marshal and 'Professional Lesbian'
From There To Here: Preview
Joan Davies on the BBC mini-series exploring the aftermath of the '96 IRA bomb
In The Flesh Reviewed: Zombie UK Returns
Gary Ryan takes a personal look and talks to members of the Salford-based show
The Face Reviewed
L'Oréal Blackett is hooked on the new modelling reality show and revels in the …
Manchester: University Challenge Winners Again
For an institution with 25 Nobel prizewinners, brains come as standard
You are here: Manchester Confidential › Entertainment & Sport › Television.
Quantum of Solace (12a)
Do you like it cool, blue-eyed and deadly? Millions did over the weekend, but is the new Bond flick any good? Nicola Mostyn finds out
Published on November 2nd 2008.
SO. What is going on with that title? On first (and second and, indeed, twenty second) hearing, the words Quantum and Solace just don't sound right together. It's like "Exit of Marmalade" or "Brains of Louis Walsh". It just doesn't make sense.
Actually, the title was nabbed from an Ian Fleming short story, and was reputedly suggested by Daniel Craig himself, who wanted to avoid any more predictable Die Till You're Dead-type titles, preferring instead one which sounds like it may have been conceived while stoned or randomly generated by a computer programme.
Still, it grabs the attention and highlights a new phase for the Bond films, one instigated by the introduction of blonde, blue eyed Bond Daniel Craig in 2006's Casino Royale. Directed by Mark Forster (the Kite Runner), Quantum of Solace sees the return of Daniel Craig as 007 and, by now, his dissenters have been silenced. Craig has brought something new to the role of Bond and, in doing so, has driven a change in the films themselves. This is evident from the extremely long and stylish openings credits which play out like a super-cool prog-rock homage delivered by Jack White and Alicia Keyes, the latter which, like Craig as Bond, shouldn't work but really, really does.
The narrative of the film continues on from Casino Royale and there's a real sense of this from the opening scene in which we are landed bang in the middle of a crunching, casualty-ridden car chase. The Bond films may have become cool, but Quantum of Solace has lost none of the trademark aspects of the genre which fans adore so much - there are rooftop chases, murderous grapplings, explosions, shootings and magnificent falls aplenty.
There's still humour, too, but rather than coming from the old-style Bond whose eyebrow was cocked as often as his gun (and something else in his pants), the laughs are now down to M (Judi Dench) who does a magnificent line in wry, black humour.
The glamour and the intrigue are all present and correct too, with some lovely lines conjuring up how we want to believe the world of espionage works (like M demanding "get me the Americans") and a tantalising central plot of an organisation - the Quantum of the title - so secretive and dastardly that even MI6 don't know they exist.
And then there's Bond himself. Having won fans with his steely take in Casino Royale, Craig is, if anything, even colder this time around. Mourning thebetrayal by and the death of the woman he loved, this Bond kills like the trained assassin he is. Ruthlessly with just a touch of nonchalance. As his beautiful ally and partner in vengeance, Camille (Olga Kurylenko), says at one point: "There's something horribly efficient about you." And it's true. Like Javier Bardem's character in No Country For Old Men, this Bond shows that there's something innately chilling about a killer who seems detached from the job in hand.
So, all the ingredients are there to make this an incredibly impressive film. And indeed, almost every aspect of this film was note perfect, with the exception of the plummy redhead given the unlikely task of demanding Bond's return to the UK, a character seemingly crowbarred in just to provide Bond with a shag.
That aside, the film is beautifully choreographed, pacey, stylish, cool and thematically clever. But…there was something lacking. It was partly to do with the secret-organisation plot which delivered less intrigue than it promised. Or more likely it was that at no point did I fear for Bond safety. The main threat to Bond seemed to be that he might lose touch with his own humanity, and while this is a laudable theme, that isn't quite as memorable as watching 007 on a conveyer belt being slowly wheeled towards a gigantic saw or similar.
This is a really enjoyable, well produced film that whizzes by in a whirl of colour and energy and fantastic action, but I could have done with just a little more emotional engagement. You know, just a quantum.
Quantum of Solace is on general release now
AnitaNovember 2nd 2008.
Can't wait to see it ..... the film, not the fat belly.
muck sweaterNovember 2nd 2008.
Craig is boring. the plot is boring. the stunts are boring. the title is boring. the girls are boring. the locations are boring. the cars are boring. the sex is not even there any more. its boring really
professor chucklebuttyNovember 2nd 2008.
You ignorant fools. do you not know your Latin? It means My belly is so fat that I can't bend to tie my shoelace.
andy pNovember 2nd 2008.
Please dont waste your hard earned on this film. Craig has killed the whole essence of Bond which was sexy girls, handsome guys and slick, undemanding movie fare. A far better film is James Mason in The Spy Who Came in From the Cold. What is so wrong here? Where to start - Judy Dench has become haggish and sleepwalks through her role and Craig can convey neither emotion or raw aggression in the way Connery could. The plot is threadbare and dull and the yawnmaking stunts are bolted into the film to draw the 12 year old gawpers into the cinema.Dire. Stupid. The worst Bond and worst Bond film ever made.
Marie Richards
Hi aim the fan with Michael .How can I get article and orig Photo?
rinkydink
Spent!
He's right. The boom started before the bomb (pardon the pun) and it can be argued that similar…
Mark Garner
Good God, how bloody miserable are you? Manchester is streets ahead of Glasgow, Liverpool, Leeds,…


"Having a county representative on the board of the independent review peer panel will help ensure the interests and concerns of our citizens," Alsop wrote in a staff report.
He told The Tribune that the county wants direct input into the committee's discussions, as well as evaluation of its work.
Alsop said the county needs to look for "a pretty specialized seismologist" to represent it. Supervisor Bruce Gibson, a geophysicist by profession, will help in that search.
Approximately 145,000 people live within the Diablo Canyon Emergency Planning Zone.