text:
// Copyright 2000-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
package com.intellij.psi.impl.source;

import com.intellij.application.options.CodeStyle;
import com.intellij.formatting.FormatTextRanges;
import com.intellij.formatting.service.ExternalFormatProcessorAdapter;
import com.intellij.formatting.service.FormattingService;
import com.intellij.formatting.service.FormattingServiceUtil;
import com.intellij.lang.ASTNode;
import com.intellij.lang.FileASTNode;
import com.intellij.lang.injection.InjectedLanguageManager;
import com.intellij.model.ModelBranch;
import com.intellij.openapi.Disposable;
import com.intellij.openapi.application.Application;
import com.intellij.openapi.application.ApplicationListener;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.command.CommandProcessor;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.editor.Document;
import com.intellij.openapi.editor.RangeMarker;
import com.intellij.openapi.progress.ProgressManager;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.*;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.pom.PomManager;
import com.intellij.pom.PomModelAspect;
import com.intellij.pom.core.impl.PomModelImpl;
import com.intellij.pom.event.PomModelEvent;
import com.intellij.pom.tree.TreeAspect;
import com.intellij.pom.tree.events.ChangeInfo;
import com.intellij.pom.tree.events.TreeChange;
import com.intellij.pom.tree.events.TreeChangeEvent;
import com.intellij.pom.tree.events.impl.ChangeInfoImpl;
import com.intellij.pom.tree.events.impl.TreeChangeImpl;
import com.intellij.psi.*;
import com.intellij.psi.codeStyle.CodeStyleManager;
import com.intellij.psi.impl.PsiDocumentManagerBase;
import com.intellij.psi.impl.PsiManagerEx;
import com.intellij.psi.impl.file.impl.FileManager;
import com.intellij.psi.impl.source.codeStyle.CodeEditUtil;
import com.intellij.psi.impl.source.codeStyle.IndentHelperImpl;
import com.intellij.psi.impl.source.tree.*;
import com.intellij.util.Function;
import com.intellij.util.SlowOperations;
import com.intellij.util.containers.ContainerUtil;
import com.intellij.util.containers.JBIterable;
import com.intellij.util.containers.MultiMap;
import com.intellij.util.text.CharArrayUtil;
import com.intellij.util.text.TextRangeUtil;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.annotations.TestOnly;

import java.util.*;

public final class PostprocessReformattingAspect implements PomModelAspect {
  private static final Logger LOG = Logger.getInstance(PostprocessReformattingAspect.class);
  private final Project myProject;
  private final NotNullLazyValue<TreeAspect> myTreeAspect;
  private static final Key<Throwable> REFORMAT_ORIGINATOR = Key.create("REFORMAT_ORIGINATOR");
  private static final Key<Boolean> REPARSE_PENDING = Key.create("REPARSE_PENDING");

  private final ThreadLocal<Context> myContext = ThreadLocal.withInitial(Context::new);

  private static final class Holder {
    private static final boolean STORE_REFORMAT_ORIGINATOR_STACKTRACE = ApplicationManager.getApplication().isInternal();
  }

  static final class LangPomModel extends PomModelImpl {
    private final PostprocessReformattingAspect myAspect;

    LangPomModel(@NotNull Project project) {
      super(project);
      myAspect = new PostprocessReformattingAspect(project);
    }

    @Override
    public <T extends PomModelAspect> T getModelAspect(@NotNull Class<T> aClass) {
      //noinspection unchecked
      return myAspect.getClass().equals(aClass) ? (T)myAspect : super.getModelAspect(aClass);
    }

    @Override
    protected void updateDependentAspects(PomModelEvent event) {
      super.updateDependentAspects(event);
      myAspect.update(event);
    }
  }

  public static PostprocessReformattingAspect getInstance(@NotNull Project project) {
    return PomManager.getModel(project).getModelAspect(PostprocessReformattingAspect.class);
  }

  public PostprocessReformattingAspect(@NotNull Project project) {
    myProject = project;
    myTreeAspect = NotNullLazyValue.createValue(() -> TreeAspect.getInstance(myProject));

    ApplicationManager.getApplication().addApplicationListener(new ApplicationListener() {
      @Override
      public void writeActionStarted(@NotNull Object action) {
        CommandProcessor processor = CommandProcessor.getInstance();
        if (processor != null && processor.getCurrentCommandProject() == myProject) {
          incrementPostponedCounter();
        }
      }

      @Override
      public void writeActionFinished(@NotNull Object action) {
        CommandProcessor processor = ApplicationManager.getApplication().getServiceIfCreated(CommandProcessor.class);
        if (processor != null && processor.getCurrentCommandProject() == myProject) {
          decrementPostponedCounter();
        }
      }
    }, project);
  }

  public void disablePostprocessFormattingInside(@NotNull final Runnable runnable) {
    disablePostprocessFormattingInside((NullableComputable<Object>)() -> {
      runnable.run();
      return null;
    });
  }

  public <T> T disablePostprocessFormattingInside(@NotNull Computable<T> computable) {
    try {
      getContext().myDisabledCounter++;
      return computable.compute();
    }
    finally {
      getContext().myDisabledCounter--;
      LOG.assertTrue(getContext().myDisabledCounter > 0 || !isDisabled());
    }
  }

  public void postponeFormattingInside(@NotNull final Runnable runnable) {
    postponeFormattingInside((NullableComputable<Object>)() -> {
      runnable.run();
      return null;
    });
  }

  public <T> T postponeFormattingInside(@NotNull Computable<T> computable) {
    try {
      incrementPostponedCounter();
      return computable.compute();
    }
    finally {
      decrementPostponedCounter();
    }
  }

  private void incrementPostponedCounter() {
    getContext().myPostponedCounter++;
  }

  private void decrementPostponedCounter() {
    Application application = ApplicationManager.getApplication();
    if (--getContext().myPostponedCounter == 0) {
      if (application.isWriteAccessAllowed() || !application.isWriteThread()) {
        doPostponedFormatting();
      }
      else {
        application.runWriteAction((Runnable)this::doPostponedFormatting);
      }
    }
  }

  @Override
  public void update(@NotNull final PomModelEvent event) {
    if (isDisabled() || getContext().myPostponedCounter == 0) return;
    final TreeChangeEvent changeSet = (TreeChangeEvent)event.getChangeSet(myTreeAspect.getValue());
    if (changeSet == null) return;
    final PsiElement psiElement = changeSet.getRootElement().getPsi();
    if (psiElement == null) return;
    PsiFile containingFile = InjectedLanguageManager.getInstance(psiElement.getProject()).getTopLevelFile(psiElement);
    final FileViewProvider viewProvider = containingFile.getViewProvider();

    if (!viewProvider.isEventSystemEnabled() && ModelBranch.getPsiBranch(containingFile) == null) return;
    getContext().myUpdatedProviders.putValue(viewProvider, (FileElement)containingFile.getNode());
    for (final ASTNode node : changeSet.getChangedElements()) {
      final TreeChange treeChange = changeSet.getChangesByElement(node);
      for (final ASTNode affectedChild : treeChange.getAffectedChildren()) {
        if (changeMightBreakPsiTextConsistency(affectedChild)) {
          containingFile.putUserData(REPARSE_PENDING, true);
        }
        else if (leavesEmptyRangeAtEdge((TreeChangeImpl)treeChange, affectedChild) && hasRaiseableEdgeChild(node)) {
          getContext().myRaisingCandidates.putValue(viewProvider, node);
        }

        final ChangeInfo childChange = treeChange.getChangeByChild(affectedChild);
        switch (childChange.getChangeType()) {
          case ChangeInfo.ADD:
          case ChangeInfo.REPLACE:
            postponeFormatting(viewProvider, affectedChild);
            break;
          case ChangeInfo.CONTENTS_CHANGED:
            if (!CodeEditUtil.isNodeGenerated(affectedChild)) {
              ((TreeElement)affectedChild).acceptTree(new RecursiveTreeElementWalkingVisitor() {
                @Override
                protected void visitNode(TreeElement element) {
                  if (CodeEditUtil.isNodeGenerated(element) && CodeEditUtil.isSuspendedNodesReformattingAllowed()) {
                    postponeFormatting(viewProvider, element);
                    return;
                  }
                  super.visitNode(element);
                }
              });
            }
            break;
        }
      }
    }
  }

  private static boolean changeMightBreakPsiTextConsistency(ASTNode child) {
    return TreeUtil.containsOuterLanguageElements(child) || isRightAfterErrorElement(child);
  }

  private static boolean leavesEmptyRangeAtEdge(TreeChangeImpl treeChange, ASTNode child) {
    ChangeInfoImpl info = treeChange.getChangeByChild(child);
    ASTNode newChild = info.getNewChild();
    return (newChild == null || newChild.getTextLength() == 0) && wasEdgeChild(treeChange, info.getOldChildNode());
  }

  private static boolean wasEdgeChild(TreeChangeImpl treeChange, ASTNode oldChild) {
    List<ASTNode> initial = treeChange.getInitialChildren();
    return initial.size() > 0 && (oldChild == initial.get(0) || oldChild == initial.get(initial.size() - 1));
  }

  private static boolean isRightAfterErrorElement(ASTNode _node) {
    Function<ASTNode, ASTNode> prevNode = node -> {
      ASTNode prev = node.getTreePrev();
      return prev != null ? TreeUtil.getLastChild(prev) : node.getTreeParent();
    };
    return JBIterable.generate(_node, prevNode)
      .skip(1)
      .takeWhile(e -> e instanceof PsiWhiteSpace || e.getTextLength() == 0)
      .filter(PsiErrorElement.class)
      .isNotEmpty();
  }

  public void doPostponedFormatting() {
    if (isDisabled()) return;
    try {
      FileViewProvider[] viewProviders = getContext().myUpdatedProviders.keySet().toArray(new FileViewProvider[0]);
      for (final FileViewProvider viewProvider : viewProviders) {
        doPostponedFormatting(viewProvider);
      }
    }
    catch (Exception e) {
      LOG.error(e);
    }
    finally {
      LOG.assertTrue(getContext().myReformatElements.isEmpty(), getContext().myReformatElements);
    }
  }

  public void doPostponedFormatting(@NotNull FileViewProvider viewProvider) {
    if (isDisabled()) return;
    ProgressManager.getInstance().executeNonCancelableSection(() -> {
      try {
        disablePostprocessFormattingInside(() -> doPostponedFormattingInner(viewProvider));
      }
      finally {
        getContext().myUpdatedProviders.remove(viewProvider);
        getContext().myRaisingCandidates.remove(viewProvider);
        getContext().myReformatElements.remove(viewProvider);
        viewProvider.putUserData(REFORMAT_ORIGINATOR, null);
      }
    });
  }

  public boolean isViewProviderLocked(@NotNull FileViewProvider fileViewProvider) {
    return getContext().myReformatElements.containsKey(fileViewProvider);
  }

  public static void assertDocumentChangeIsAllowed(@NotNull PsiFile file) {
    PostprocessReformattingAspect reformattingAspect = getInstance(file.getProject());
    reformattingAspect.assertDocumentChangeIsAllowed(file.getViewProvider());
  }

  /**
   * Checks that view provider doesn't contain any PSI modifications which will be used in postponed formatting and may conflict with
   * changes made to the document.
   *
   * @param viewProvider The view provider to validate.
   * @throws RuntimeException If the assertion fails.
   */
  public void assertDocumentChangeIsAllowed(@NotNull FileViewProvider viewProvider) {
    if (isViewProviderLocked(viewProvider)) {
      Throwable cause = viewProvider.getUserData(REFORMAT_ORIGINATOR);
      @NonNls String message = "Document is locked by write PSI operations. " +
                               "Use PsiDocumentManager.doPostponedOperationsAndUnblockDocument() to commit PSI changes to the document." +
                               "\nUnprocessed elements: " + dumpUnprocessedElements(viewProvider) +
                               (cause == null ? "" : " \nSee cause stacktrace for the reason to lock.");
      throw cause == null ? new RuntimeException(message): new RuntimeException(message, cause);
    }
  }

  private String dumpUnprocessedElements(@NotNull FileViewProvider provider) {
    StringBuilder sb = new StringBuilder();
    int count = 0;
    List<ASTNode> nodes = myContext.get().myReformatElements.get(provider);
    for (ASTNode node : nodes) {
      if (count >= 5) {
        sb.append(" and ").append(nodes.size() - count).append(" more.");
        break;
      }
      if (sb.length() > 0) sb.append(", ");
      sb.append(node.getElementType()).append(node.getTextRange());
      count ++;
    }
    return sb.toString();
  }

  private void postponeFormatting(@NotNull FileViewProvider viewProvider, @NotNull ASTNode child) {
    if (!CodeEditUtil.isNodeGenerated(child) && child.getElementType() != TokenType.WHITE_SPACE) {
      final int oldIndent = CodeEditUtil.getOldIndentation(child);
      LOG.assertTrue(oldIndent >= 0,
                     "for not generated items old indentation must be defined: element=" + child + ", text=" + child.getText());
    }
    List<ASTNode> list = getContext().myReformatElements.get(viewProvider);
    if (list == null) {
      list = new ArrayList<>();
      getContext().myReformatElements.put(viewProvider, list);
      if (Holder.STORE_REFORMAT_ORIGINATOR_STACKTRACE) {
        viewProvider.putUserData(REFORMAT_ORIGINATOR, new Throwable());
      }
    }
    list.add(child);
  }

  private void doPostponedFormattingInner(@NotNull FileViewProvider key) {
    List<ASTNode> astNodes = getContext().myReformatElements.remove(key);
    Document document = key.getDocument();
    // Sort ranges by end offsets so that we won't need any offset adjustment after reformat or reindent
    if (document == null) {
      return;
    }

    VirtualFile virtualFile = key.getVirtualFile();
    if (!virtualFile.isValid()) {
      return;
    }

    PsiManager manager = key.getManager();
    if (manager instanceof PsiManagerEx) {
      FileManager fileManager = ((PsiManagerEx)manager).getFileManager();
      FileViewProvider viewProvider = fileManager.findCachedViewProvider(virtualFile);
      if (viewProvider != key) { // viewProvider was invalidated e.g. due to language level change
        if (viewProvider == null) {
          viewProvider = fileManager.findViewProvider(virtualFile);
        }
        if (viewProvider != null) {
          key = viewProvider;
          astNodes = getContext().myReformatElements.remove(key);
        }
      }
    }

    Collection<Disposable> toDispose = Collections.emptyList();
    try {
      // process all roots in viewProvider to find marked for reformat before elements and create appropriate range markers
      Set<PostprocessFormattingTask> postProcessTasks = new TreeSet<>();
      handleReformatMarkers(key, postProcessTasks);
      toDispose = new ArrayList<>(postProcessTasks);

      // then we create ranges by changed nodes. One per node. There ranges can intersect. Ranges are sorted by end offset.
      if (astNodes != null) {
        createActionsMap(astNodes, key, postProcessTasks);
      }

      while (!postProcessTasks.isEmpty()) {
        // now we have to normalize actions so that they not intersect and ordered in most appropriate way
        // (free reformatting -> reindent -> formatting under reindent)
        List<PostponedAction> normalizedActions = normalizeAndReorderPostponedActions(postProcessTasks, document);
        toDispose.addAll(normalizedActions);

        // only in following loop real changes in document are made
        FileViewProvider viewProvider = key;
        if (!normalizedActions.isEmpty()) {
          CodeStyleManager codeStyleManager = CodeStyleManager.getInstance(manager.getProject());
          for (PostponedAction normalizedAction : normalizedActions) {
            codeStyleManager.runWithDocCommentFormattingDisabled(viewProvider.getPsi(viewProvider.getBaseLanguage()), () -> {
              normalizedAction.execute(viewProvider);
            });
          }
        }
      }
      reparseByTextIfNeeded(key, document);
    }
    finally {
      for (Disposable disposable : toDispose) {
        //noinspection SSBasedInspection
        disposable.dispose();
      }
    }
  }

  private void reparseByTextIfNeeded(@NotNull FileViewProvider viewProvider, @NotNull Document document) {
    if (PsiDocumentManager.getInstance(myProject).isCommitted(document)) {
      Set<PsiFile> rootsToReparse = new HashSet<>();
      for (ASTNode node : myContext.get().myRaisingCandidates.get(viewProvider)) {
        if (hasRaiseableEdgeChild(node)) { // check again because AST might be changed again and there's no need to reparse child now
          ContainerUtil.addIfNotNull(rootsToReparse, SharedImplUtil.getContainingFile(node));
        }
      }

      for (PsiFile file : viewProvider.getAllFiles()) {
        if (file.getUserData(REPARSE_PENDING) != null || rootsToReparse.contains(file)) {
          ((PsiDocumentManagerBase)PsiDocumentManager.getInstance(myProject)).reparseFileFromText((PsiFileImpl)file);
          file.putUserData(REPARSE_PENDING, null);
        }
      }
    }
  }

  private static boolean hasRaiseableEdgeChild(ASTNode node) {
    ASTNode first = node.getFirstChildNode();
    while (first != null && first.getTextLength() == 0) first = first.getTreeNext();

    ASTNode last = node.getLastChildNode();
    while (last != null && last.getTextLength() == 0) last = last.getTreePrev();

    return first == null || last == null || isRaiseable(first) || isRaiseable(last);
  }

  /**
   * @return true if the parser usually avoids placing this kind of node as first/last child (i.e. a whitespace or comment)
   */
  private static boolean isRaiseable(@Nullable ASTNode node) {
    if (node == null) return false;
    PsiElement psi = node.getPsi();
    return psi instanceof PsiWhiteSpace || psi instanceof PsiComment;
  }

  @NotNull
  private List<PostponedAction> normalizeAndReorderPostponedActions(@NotNull Set<PostprocessFormattingTask> rangesToProcess, @NotNull Document document) {
    final List<PostprocessFormattingTask> freeFormattingActions = new ArrayList<>();
    final List<ReindentTask> indentActions = new ArrayList<>();

    PostprocessFormattingTask accumulatedTask = null;
    Iterator<PostprocessFormattingTask> iterator = rangesToProcess.iterator();
    while (iterator.hasNext()) {
      final PostprocessFormattingTask currentTask = iterator.next();
      if (accumulatedTask == null) {
        accumulatedTask = currentTask;
        iterator.remove();
      }
      else if (accumulatedTask.getStartOffset() > currentTask.getEndOffset() ||
               accumulatedTask.getStartOffset() == currentTask.getEndOffset() &&
                !canStickActionsTogether(accumulatedTask, currentTask)) {
        // action can be pushed
        if (accumulatedTask instanceof ReindentTask) {
          indentActions.add((ReindentTask) accumulatedTask);
        }
        else {
          freeFormattingActions.add(accumulatedTask);
        }

        accumulatedTask = currentTask;
        iterator.remove();
      }
      else if (accumulatedTask instanceof ReformatTask && currentTask instanceof ReindentTask) {
        // split accumulated reformat range into two
        if (accumulatedTask.getStartOffset() < currentTask.getStartOffset()) {
          final RangeMarker endOfRange = document.createRangeMarker(accumulatedTask.getStartOffset(), currentTask.getStartOffset());
          // add heading reformat part
          rangesToProcess.add(new ReformatTask(endOfRange));
          // and manage heading whitespace because formatter does not edit it in previous action
          iterator = rangesToProcess.iterator();
          //noinspection StatementWithEmptyBody
          while (iterator.next().getRange() != currentTask.getRange()) ;
        }
        final RangeMarker rangeToProcess = document.createRangeMarker(currentTask.getEndOffset(), accumulatedTask.getEndOffset());
        freeFormattingActions.add(new ReformatWithHeadingWhitespaceTask(rangeToProcess));
        accumulatedTask = currentTask;
        iterator.remove();
      }
      else {
        if (!(accumulatedTask instanceof ReindentTask)) {
          iterator.remove();

          boolean withLeadingWhitespace = accumulatedTask instanceof ReformatWithHeadingWhitespaceTask;
          if (accumulatedTask instanceof ReformatTask &&
              currentTask instanceof ReformatWithHeadingWhitespaceTask &&
              accumulatedTask.getStartOffset() == currentTask.getStartOffset()) {
            withLeadingWhitespace = true;
          }
          else if (accumulatedTask instanceof ReformatWithHeadingWhitespaceTask &&
              currentTask instanceof ReformatTask &&
              accumulatedTask.getStartOffset() < currentTask.getStartOffset()) {
            withLeadingWhitespace = false;
          }
          int newStart = Math.min(accumulatedTask.getStartOffset(), currentTask.getStartOffset());
          int newEnd = Math.max(accumulatedTask.getEndOffset(), currentTask.getEndOffset());
          RangeMarker rangeMarker;

          if (accumulatedTask.getStartOffset() == newStart && accumulatedTask.getEndOffset() == newEnd) {
            rangeMarker = accumulatedTask.getRange();
          }
          else if (currentTask.getStartOffset() == newStart && currentTask.getEndOffset() == newEnd) {
            rangeMarker = currentTask.getRange();
          }
          else {
            rangeMarker = document.createRangeMarker(newStart, newEnd);
          }

          accumulatedTask = withLeadingWhitespace ? new ReformatWithHeadingWhitespaceTask(rangeMarker) : new ReformatTask(rangeMarker);
        }
        else if (currentTask instanceof ReindentTask) {
          iterator.remove();
        } // TODO[ik]: need to be fixed to correctly process indent inside indent
      }
    }
    if (accumulatedTask != null) {
      if (accumulatedTask instanceof ReindentTask) {
        indentActions.add((ReindentTask) accumulatedTask);
      }
      else {
        freeFormattingActions.add(accumulatedTask);
      }
    }

    Collections.reverse(freeFormattingActions);
    Collections.reverse(indentActions);

    List<PostponedAction> result = new ArrayList<>();
    if (!freeFormattingActions.isEmpty()) {
      FormatTextRanges ranges = new FormatTextRanges();
      ranges.setExtendToContext(true);
      for (PostprocessFormattingTask action : freeFormattingActions) {
        TextRange range = TextRange.create(action);
        ranges.add(range, action instanceof ReformatWithHeadingWhitespaceTask);
      }
      result.add(new ReformatRangesAction(ranges));
    }

    if (!indentActions.isEmpty()) {
      ReindentRangesAction reindentRangesAction = new ReindentRangesAction();
      for (ReindentTask action : indentActions) {
        reindentRangesAction.add(action.getRange(), action.getOldIndent());
      }
      result.add(reindentRangesAction);
    }

    return result;
  }

  private static boolean canStickActionsTogether(final PostprocessFormattingTask currentTask,
                                                 final PostprocessFormattingTask nextTask) {
    // empty reformat markers can't be stuck together with any action
    if (nextTask instanceof ReformatWithHeadingWhitespaceTask && nextTask.getStartOffset() == nextTask.getEndOffset()) return false;
    if (currentTask instanceof ReformatWithHeadingWhitespaceTask && currentTask.getStartOffset() == currentTask.getEndOffset()) {
      return false;
    }
    // reindent actions can't be be stuck at all
    return !(currentTask instanceof ReindentTask);
  }

  private static void createActionsMap(@NotNull List<? extends ASTNode> astNodes,
                                       @NotNull FileViewProvider provider,
                                       @NotNull Collection<? super PostprocessFormattingTask> rangesToProcess) {
    final Set<ASTNode> nodesToProcess = new HashSet<>(astNodes);
    final Document document = provider.getDocument();
    if (document == null) {
      return;
    }
    for (final ASTNode node : astNodes) {
      nodesToProcess.remove(node);
      final FileElement fileElement = TreeUtil.getFileElement((TreeElement)node);
      if (fileElement == null || ((PsiFile)fileElement.getPsi()).getViewProvider() != provider) continue;
      final boolean isGenerated = CodeEditUtil.isNodeGenerated(node);

      ((TreeElement)node).acceptTree(new RecursiveTreeElementVisitor() {
        private boolean inGeneratedContext = !isGenerated;

        @Override
        protected boolean visitNode(TreeElement element) {
          if (nodesToProcess.contains(element)) return false;

          final boolean currentNodeGenerated = CodeEditUtil.isNodeGenerated(element);
          CodeEditUtil.setNodeGenerated(element, false);
          if (currentNodeGenerated && !inGeneratedContext) {
            rangesToProcess.add(new ReformatTask(document.createRangeMarker(element.getTextRange())));
            inGeneratedContext = true;
          }
          if (!currentNodeGenerated && inGeneratedContext) {
            if (element.getElementType() == TokenType.WHITE_SPACE) return false;
            int oldIndent = CodeEditUtil.getOldIndentation(element);
            if (oldIndent < 0) {
              LOG.warn("For not generated items old indentation must be defined: element " + element);
              oldIndent = 0;
            }
            CodeEditUtil.setOldIndentation(element, -1);
            for (TextRange indentRange : getEnabledRanges(element.getPsi())) {
              rangesToProcess.add(new ReindentTask(document.createRangeMarker(indentRange), oldIndent));
            }
            inGeneratedContext = false;
          }
          return true;
        }

        private Iterable<TextRange> getEnabledRanges(@NotNull PsiElement element) {
          List<TextRange> disabledRanges = new ArrayList<>();
          for (DisabledIndentRangesProvider rangesProvider : DisabledIndentRangesProvider.EP_NAME.getExtensions()) {
            Collection<TextRange> providedDisabledRanges = rangesProvider.getDisabledIndentRanges(element);
            if (providedDisabledRanges != null) {
              disabledRanges.addAll(providedDisabledRanges);
            }
          }
          return TextRangeUtil.excludeRanges(element.getTextRange(), disabledRanges);
        }

        @Override
        public void visitComposite(CompositeElement composite) {
          boolean oldGeneratedContext = inGeneratedContext;
          super.visitComposite(composite);
          inGeneratedContext = oldGeneratedContext;
        }

        @Override
        public void visitLeaf(LeafElement leaf) {
          boolean oldGeneratedContext = inGeneratedContext;
          super.visitLeaf(leaf);
          inGeneratedContext = oldGeneratedContext;
        }
      });
    }
  }

  private static void handleReformatMarkers(@NotNull final FileViewProvider key, @NotNull final Set<? super PostprocessFormattingTask> rangesToProcess) {
    final Document document = key.getDocument();
    if (document == null) {
      return;
    }
    for (final FileASTNode fileElement : ((AbstractFileViewProvider)key).getKnownTreeRoots()) {
      ((TreeElement) fileElement).acceptTree(new RecursiveTreeElementWalkingVisitor() {
        @Override
        protected void visitNode(TreeElement element) {
          if (CodeEditUtil.isMarkedToReformatBefore(element)) {
            CodeEditUtil.markToReformatBefore(element, false);
            rangesToProcess.add(new ReformatWithHeadingWhitespaceTask(
              document.createRangeMarker(element.getStartOffset(), element.getStartOffset()))
            );
          }
          else if (CodeEditUtil.isMarkedToReformat(element)) {
            CodeEditUtil.markToReformat(element, false);
            rangesToProcess.add(new ReformatWithHeadingWhitespaceTask(
              document.createRangeMarker(element.getStartOffset(), element.getStartOffset() + element.getTextLength()))
            );
          }
          super.visitNode(element);
        }
      });
    }
  }

  private static void adjustIndentationInRange(@NotNull PsiFile file,
                                               @NotNull Document document,
                                               TextRange @NotNull [] indents,
                                               final int indentAdjustment) {
    final CharSequence charsSequence = document.getCharsSequence();
    for (final TextRange indent : indents) {
      final String oldIndentStr = charsSequence.subSequence(indent.getStartOffset() + 1, indent.getEndOffset()).toString();
      final int oldIndent = IndentHelperImpl.getIndent(file, oldIndentStr, true);
      final String newIndentStr = IndentHelperImpl
        .fillIndent(CodeStyle.getIndentOptions(file), Math.max(oldIndent + indentAdjustment, 0));
      document.replaceString(indent.getStartOffset() + 1, indent.getEndOffset(), newIndentStr);
    }
  }

  private static int getNewIndent(@NotNull PsiFile psiFile, final int firstWhitespace) {
    final Document document = psiFile.getViewProvider().getDocument();
    assert document != null;
    final int startOffset = document.getLineStartOffset(document.getLineNumber(firstWhitespace));
    int endOffset = startOffset;
    final CharSequence charsSequence = document.getCharsSequence();
    //noinspection StatementWithEmptyBody
    while (Character.isWhitespace(charsSequence.charAt(endOffset++))) ;
    final String newIndentStr = charsSequence.subSequence(startOffset, endOffset - 1).toString();
    return IndentHelperImpl.getIndent(psiFile, newIndentStr, true);
  }

  public boolean isDisabled() {
    return getContext().myDisabledCounter > 0;
  }

  private abstract static class PostprocessFormattingTask implements Comparable<PostprocessFormattingTask>, Segment, Disposable {
    @NotNull private final RangeMarker myRange;

    PostprocessFormattingTask(@NotNull RangeMarker rangeMarker) {
      myRange = rangeMarker;
    }

    @Override
    public int compareTo(@NotNull PostprocessFormattingTask o) {
      RangeMarker o1 = myRange;
      RangeMarker o2 = o.myRange;
      if (o1.equals(o2)) return 0;
      final int diff = o2.getEndOffset() - o1.getEndOffset();
      if (diff == 0) {
        if (o1.getStartOffset() == o2.getStartOffset()) return 0;
        if (o1.getStartOffset() == o1.getEndOffset()) return -1; // empty ranges first
        if (o2.getStartOffset() == o2.getEndOffset()) return 1; // empty ranges first
        return o1.getStartOffset() - o2.getStartOffset();
      }
      return diff;
    }

    @NotNull
    public RangeMarker getRange() {
      return myRange;
    }

    @Override
    public int getStartOffset() {
      return myRange.getStartOffset();
    }

    @Override
    public int getEndOffset() {
      return myRange.getEndOffset();
    }

    @Override
    public void dispose() {
      if (myRange.isValid()) {
        myRange.dispose();
      }
    }
  }

  private static class ReformatTask extends PostprocessFormattingTask {
    ReformatTask(@NotNull RangeMarker rangeMarker) {
      super(rangeMarker);
    }
  }

  private static class ReformatWithHeadingWhitespaceTask extends PostprocessFormattingTask {
    ReformatWithHeadingWhitespaceTask(@NotNull RangeMarker rangeMarker) {
      super(rangeMarker);
    }
  }

  private static class ReindentTask extends PostprocessFormattingTask {
    private final int myOldIndent;

    ReindentTask(@NotNull RangeMarker rangeMarker, int oldIndent) {
      super(rangeMarker);
      myOldIndent = oldIndent;
    }

    int getOldIndent() {
      return myOldIndent;
    }
  }

  private interface PostponedAction extends Disposable {
    void execute(@NotNull FileViewProvider viewProvider);
  }

  private class ReformatRangesAction implements PostponedAction {
    private final FormatTextRanges myRanges;

    ReformatRangesAction(@NotNull FormatTextRanges ranges) {
      myRanges = ranges;
    }

    @Override
    public void execute(@NotNull FileViewProvider viewProvider) {
      final PsiFile file = viewProvider.getPsi(viewProvider.getBaseLanguage());
      FormattingService formattingService = FormattingServiceUtil.findService(file, false, false);
      commitDocument(viewProvider);
      SlowOperations.allowSlowOperations(() -> formattingService.formatRanges(file, getRanges(formattingService), true));
    }

    private void commitDocument(@NotNull FileViewProvider viewProvider) {
      PsiDocumentManager documentManager = PsiDocumentManager.getInstance(myProject);
      Document document = viewProvider.getDocument();
      assert document != null;
      documentManager.commitDocument(document);
    }

    private FormatTextRanges getRanges(@NotNull FormattingService formattingService) {
      if (formattingService instanceof ExternalFormatProcessorAdapter) {
        return myRanges;
      }
      FormatTextRanges textRanges = myRanges.ensureNonEmpty();
      textRanges.setExtendToContext(true);
      return textRanges;
    }

    @Override
    public void dispose() {
    }
  }

  private static class ReindentRangesAction implements PostponedAction {
    private final List<Pair<Integer, RangeMarker>> myRangesToReindent = new ArrayList<>();

    public void add(@NotNull RangeMarker rangeMarker, int oldIndent) {
      myRangesToReindent.add(new Pair<>(oldIndent, rangeMarker));
    }

    @Override
    public void execute(@NotNull FileViewProvider viewProvider) {
      final Document document = viewProvider.getDocument();
      assert document != null;
      final PsiFile psiFile = viewProvider.getPsi(viewProvider.getBaseLanguage());
      for (Pair<Integer, RangeMarker> integerRangeMarkerPair : myRangesToReindent) {
        RangeMarker marker = integerRangeMarkerPair.second;
        final CharSequence charsSequence = document.getCharsSequence().subSequence(marker.getStartOffset(), marker.getEndOffset());
        final int oldIndent = integerRangeMarkerPair.first;
        final TextRange[] whitespaces = CharArrayUtil.getIndents(charsSequence, marker.getStartOffset());
        final int indentAdjustment = getNewIndent(psiFile, marker.getStartOffset()) - oldIndent;
        if (indentAdjustment != 0) adjustIndentationInRange(psiFile, document, whitespaces, indentAdjustment);
      }
    }

    @Override
    public void dispose() {
      for (Pair<Integer, RangeMarker> pair : myRangesToReindent) {
        RangeMarker marker = pair.second;
        if (marker.isValid()) {
          marker.dispose();
        }
      }
    }
  }

  @TestOnly
  public void clear() {
    getContext().myReformatElements.clear();
  }

  private Context getContext() {
    return myContext.get();
  }

  private static class Context {
    private int myPostponedCounter;
    private int myDisabledCounter;
    private final MultiMap<FileViewProvider, FileElement> myUpdatedProviders = MultiMap.create();
    private final MultiMap<FileViewProvider, ASTNode> myRaisingCandidates = MultiMap.create();
    private final Map<FileViewProvider, List<ASTNode>> myReformatElements = new HashMap<>();
  }
}

redpajama_set_name: RedPajamaGithub


Best know for being the editor for Godey's Lady's Book for half a century, let the sidebar links be your pathway to finding out more about the woman behind Godey's Lady's Book.
Mrs. Hale was an author in her own right. She wrote books on various topics (such as The New Household Receipt Book), as well as children's' books and poems (i.e. Mary had a little lamb). She even included self descriptions (sketches) in some of her books (The Ladies' Wreath and Woman's Record).
Chambers Encyclopedia gives a brief description of some highlights in her life, and the article titled, Mrs. Sarah J. Hale, is a tribute written by Mrs. Lucy E. Sanford shortly after she died.


Challenges and Mindfulness - friend or foe?
Mindfulness has been on my mind. I think what's at the root of much pain and suffering is the inability to apply mindfulness. We have great ideas, good intentions and a kind heart, then when a challenge, obstacle or even something that just does not sit well appears in our life - either an email, a headline, something someone says at work or even someone who cuts us off in traffic - we are thusly challenged. Without mindfulness practice, the challenge is pushed, choked and forced into submission and we plow through it, ignore it, placate to it or act in various unskillful ways... lashing out on facebook, gossiping, and it only progresses from there into self-sabotage and outright hurtfulness. Because, when we aren't able to take that moment to honor the challenge, respect our feelings and pause for just a brief bit and create the necessary gap between the incessant, addictive stream of thinking to access all-to-valuable information we've cut ourselves off from, we miss the opportunity all together.
The corporate world is a veritable minefield of unconsciousness. If you rest on your laurels for a moment too long, you feel the wrath of those who are running from thought to thought, slaves to their monkey mind. But it's not just in corporate America you see unciousness, it's everywhere, even at your local health food store and most certainly at your neighborhood yoga studio.
Mindfulness is a meditation practice however it's important to note there is a difference from the concept and the actual practice of mindfulness during meditation. Mindfulness as a concept is rooted in a foundation of values or emotional intelligence, specifically I mean how you act, what you do... how you do what you do in a skillful way. A way that does not bring harm to others or yourself, a way that you have applied care to your actions and words. A way that is in line with your higher self and truth. The time to practice mindfulness is always. When you are faced with challenges and you apply mindfulness, you will see instant results, but even after the challenging event has passed you will still need to apply mindfulness because the body responds to stress and it's natural to feel deflated post-stress response as the hormones leave the body. Practice mindfulness when this happens, nurture yourself, take a break from toxic people and surround yourself with words and people who lift you up, have good intentions and are also practicing mindfulness. You don't have to be a yogi or practice Eastern philosophic traditions to be kind and considerate with your words and actions as they relate to yourself and to others.. this is mindfulness.


text:
The Toyin Falola Interviews – A Conversation With Professor Olu Obafemi, Part 6
By The Chronicle Last updated Apr 9, 2021 35
Olu Obafemi, African Scholarship, and Social Solutions
As a notable scholar/critic and creative writer, what is the essential scope and focus of your work?
Olu Obafemi
I operate, essentially as a scholar/critic and creative writer. As a scholar, I try to contribute to canon formation for the apprehension and cognition of the works of creative writers in Nigeria, Africa and the world. I investigate the aesthetic and ideological preoccupations of writers of fiction, prose and especially drama. What is the relevance of their works to their immediate society and humanity at large? What propositions can we make to advance the level of their engagement in those issues pertaining to the human condition and the mode of expression they adopt or apply– in terms of technical principles, appreciation, dramaturgy, aesthetic forms and theories that will make their works better accessible to and impactful on their various immediate and enduring audiences. What I do as a creative writer is to apply the medicine I dole out through meta-criticism to other creators—develop a form, whose internal organization, entertainment devices and social relevance carry my ideological vision—my social message. How do I create art that arrests/captivates the attention of my audience, sustains and retains it in an enduring way? If I do doctrinaire art– art that only weaves a design on the consciousness of my audience; art that is mere propaganda or palpably didactic and moralistic, I will certainly lose that audience whose social contract with me goes beyond indoctrination. I know that the situation in which we find ourselves in Nigeria and Africa compels urgent mediation by the artist in terms, not just of depicting and reflecting the decadence and obsolescence in our body politic but offers measures that will reconstruct and recreate the system and bring renewal to our society—our politics, our social economy which is in a state of doldrums. I know that I have proposed an equipoise in technical and ideological terms; I have to covertly, un-obtrusively instruct in the middle of obvious laughter provocation—create an uneasy smile with the 'truth' I am telling. We cannot just entertain as a dominant engagement, without dealing with the issues which repress and burden our society in this age and time, when rocket science requires us to humanize; wear a human face, serve humanity.
What do you foresee as the way out for Africa in the twenty-first century?
There have been loads of impediments and barriers erected on the path to development and fulfilment for Africa in the past through slave trade, imperialism, colonization, even neo-colonization. Even now, the neo-liberal impositions through economic options of neo-capitalism are there in overflowing abundance. That is the whole essence of the so-called Globalization; the nullification of tempo-spatial distances and the conscious shrinking of the world to make the South more easily exploitable. It is not time for lamentation or mourning. It is time to erect the kind of envisioned leadership that will take the continent out of the woods, realizing that Africa is still the continent of the future in terms of the abundant physical and human resources in Africa. It is also time to grow a critical mass that we confront and awaken the predator class to their responsibility in the leadership of rescuing the continent from this present state of comatose that she sprawls in. We have a docile middle class and a drooling, preyed upon masses. The potentials in Africa, tangible and ineffable, is pervasive. That is why the whole world is still courting Africa, in self-interest. We need to bring to power visionary leaders who are patriotic and selfless to turn these favourable realities around to the advantage of Africa. There is a great chance for Africa to still rule the world by first radically transforming itself and reconstructing itself and stopping the mendicancy we display at the shores of those who have raped our continent for centuries.
INTERVIEW ANALYSIS AND REFLECTIONS BY TOYIN FALOLA
Photo: A choice to go to school
The responses elicited from Olufemi Obafemi when asked about the roles of a dramatist or a creative artiste in the development of their immediate society are inspiring. People can quickly identify with a medical doctor's job, but not many individuals know the roles that creative professionals play in society. To many of their audience, dramatists and literary scholars are mere entertainers whose relevance ends with their ability to make them laugh. However, the social and cultural engineering activities that people in the drama or entertainment industry undertake as their responsibility goes beyond their commitment to providing comic relief to the burdened society or interlude to the barrage of social challenges. They have self-assigned to themselves the duty of serving as the society's conscience while also being known as the eyes of their cultural identity, seeing far into the future and making necessary indications to encourage planning and avoid imminent melancholy. Even when their role is primarily unnoticed, they remain dedicated to their profession with a fantastic work ethic. Obafemi belongs to this category, and from his response, one can deduce the assortment of the ideas he has lent to society through his works. A number of these would be extensively discussed in what follows.
Theatre professionals demonstrate their competence when they organize social experiences and convert them to consumable contents that shape people's understanding of the complexity of human existence. Through this, their audience imagines themselves in the work of art they are digesting. This is because society is the minefield where the activities shown in the creation of art are drawn. Since the readers or the audience can easily relate to the issues and ideas discussed, they become active participants in their consuming works. This is where the entertaining characteristic of literary productions emerges. A dramatist who adapts the story of a wife constantly abused by her husband has perhaps done so to achieve any of the following aims. One, the writer exposes the gender inequity inherent in the patriarchal structure of their society. Two, while doing this, the writer captures the repressed aspirations of women in such a society. Equally, the intermittent injection of comic relief into the text entertains the audience while the message is passed across. But for a non-professional, their understanding of the text could have ended in the area of entertainment.
Incidentally, Obafemi is both a literary writer and a scholar critic. More importantly, he has remained successful in the two domains. As a literary critic, Obafemi's cardinal philosophy of evaluating a work of art is to consider its practical import. As an African literary artist or creative writer, the crass obsession with nature does not have a place in African works because writers are meant to address society's ills and bring them to redress. Writers in the continent do not write just for pleasure. They are bound by some social responsibility to reveal what they face as a people and civilization so that their welfare will receive appropriate attention. African countries are ravaged by insecurity, disease, economic degradation, political insincerity, among many other things. Therefore, it is only logical that intellectuals, especially those from the literary sphere, reflect these challenges in their works to be projected to places not imagined. This is what Obafemi has been doing in his criticisms. In other words, it measures the appropriateness of a particular work of art concerning how it can reflect the people's sociopolitical conditions under severe sociopolitical conditions. When books satisfy these preconditions, they would be seen as contextually fitting and socially significant to society.
By investigating writers' works regarding their ideological standings, sociocultural, and sociopolitical exigencies, Obafemi has been recognized as an impartial critic whose judgment of literary material is informed by objective scholarship. To get to this position in academic engagement means one is vast enough in the knowledge of literary theories that are canonized globally. Theories are to literary critics what syringes are to doctors or what gasoline is to every car owner. The former would find it extremely difficult to provide medical services to patients without the mentioned instrument, while the latter would make no observable move without gasoline. Theories are the abstract mechanisms through which literary works are evaluated and appreciated. It is commendable to know that Obafemi has a good mastery of the theories associated with an academic scholarship. He has deployed them in his intellectual examinations and evaluation of the works produced by different scholars. It is also noteworthy that being accustomed to criticism enables one to understand people's political and economic composition, contributing to society's configuration.
Photo: Managing hunger
Critics are, by this profession, expert social scientists who reflect on the emerging discourse available in a text to understudy the society and arrive at informed conclusions about things. Looking at the technical aspect of their works as passively mentioned above, one can ask how they are considered nationally significant to their development. To such curious minds, Obafemi states that their trade is appreciated by individuals who can establish the connection between their works and society. For example, the critic understudies a work of art and brings out society's economic structures responsible for distributing wealth to steer society's trajectory in a specific direction. He looks at the instances of capitalist culture and how it has been the basis of the social relationships between different classes in society. From there, the critic can be predictive of such a society's future, making informed projections about the probable outcome of an excessively capitalist adventure and its disposition to birth an overly chaotic and generally detached society that does not cater to the well-being of an average individual. As consumers of such scholar-critic works, one would understand that the society reflected in the writings is sitting on a keg of gunpowder, waiting for an explosion at the slightest provocation. Such works will become exceptionally informative because they would reveal the oddity involved in the appropriation of any philosophy in the running of society's affairs. Still, they would also show the intricacies of human relationships encouraged by such society's forms of ideas. Whatever the critic shows would become the basis for measuring the society to understand what is most suitable.
As a creative writer, however, the above system's internalization helps create his artistic productions. Obafemi belongs to a school of scholars who appreciates works of art by using a series of theoretical models as a guide, so it becomes relatively significant to use them in his artistic creations. He is aware that the successful sustenance of the audience's attention lies in providing sequential and captivating results because that would be the basis for getting their unalloyed attention. This inevitably places a level of pressure on him and every committed artist like him. For reasons that are not unconnected to their desire to carry the audience along, writers must conduct an accurate feasibility study of their intending audience so that the materials handed down would make maximum impact. For example, suppose one target to write about the moral decadence evident in loose or indecent dressing that has perforated contemporary time's moral architecture; in that case, the most suitable audience for such work is the youth demographic, who are experiencing the process of enculturation. Therefore, it places some responsibility on the writer to consider the age bracket's language peculiarity to achieve the predetermined goals. Informed critics, who are also creative writers, understand their works' enormity in this sense, and they always stand up to the responsibility.
Photo: Poor learning environment
As a result, what the artist is doing is no less than a leader's work because literary works simulate leadership roles in many different ways. For one, the audience whose intention is strictly entertainment would not be forsaken at the behest of others whose concern is didactic or moralistic fervour. Thus, it is incumbent on the dramatist to factor in the audience's concerns so that none of them would have reasons to despise his/her intellectual productions. Apart from the fact that this places much responsibility on the producers of these works, it also brings out their leadership capabilities. This is where Obafemi's message becomes more explicit. The onus of leadership lies in responding to diverse and differing opinions without making either side feel disrespected. Here, the emphasis is mainly on managing diversity and various views, especially about the world's current sociopolitical conditions.
At the intersection between globalization and civilization is the responsibility to update one's attitude to accommodate human society's changing dynamics. Individuals from different sociopolitical backgrounds look up to leadership to provide solutions to their existential challenges and expanding issues. This is one of the numerous lessons that being a dramatist has taught Obafemi. It, therefore, justifies the thematic and ideological focus around which his works are circumscribed. Although it is clear from literary scholars' efforts that behind the production of celebrated works of art is an eternal circle of activities that authors indulge in to bring satisfaction to the audience, it comes at a personal cost.
In most cases, they would have to sacrifice their time and leisure to explore all the possible ways to ensure that their audience is satisfactorily catered for. They view their profession as a means of achieving humanity's ultimate plan, which is to lighten up people's lives through their works. While they are duty-bound to make sure that their audience across every setting is sufficiently catered for, they equally must check that they do not sacrifice truth-telling, originality, and ethics in the process so that the quality of their works would not be questioned. They must understand that beyond their desire to ensure that their audience gets maximum satisfaction is the social responsibility to x-ray what is happening in their society through their creativity. A society that is corrupt to an unimaginable proportion or plagued by insecurity caused by the inability to manage its territorial integrity will not be consummately rebranded as if nothing is wrong with its political system. As much as their profession binds them to reduce the social pressure and burden placed on them, they are equally expected to showcase the environment's downsides through their works.
When asked about the possible solutions out of the woods for Africans, Obafemi is very pragmatic and analytical. Like many African scholars, he traces Africa's underdevelopment to the western imperial system that has erected a barrier to African's access to their potentials. He laments that this wall was laid during slavery and was succeeded by its destructive accomplices like colonization, neocolonialism, and the contemporary neoliberal economy tailored to exploit Africa and Africans. Being trapped in the middle of nowhere is a condition traceable to Africa's recent European relationship. For people whose human capital was extracted for more than four centuries, it is impossible that the consequences would not be subsequently seen in their public life. During slavery, the continent's best hands were forcefully displaced because of the force of expansionist ideologues. Having left their home countries hurriedly, they became outcasts in two different civilizations. Those left behind suffered a psychological backlash from the experience and became incapacitated by their people's forceful extraction. This would be immediately followed by the colonization agenda where the colonial powers indiscriminately seized Africa's political institutions and structures.
The continuation of exploitation during colonialism sent Africa centuries back in the development trajectory. Having their political system controlled by the imperialists meant that their natural resources were taken in overflowing abundance. In the process, their institutions worked essentially for the West, to the misfortune of African countries. The assignment of domination and subjugation was in place with colonial infrastructure as its economic and political life subsumed under a foreign one. Therefore, the combination of slavery and colonialism became so poisonous for the people that it comfortably inhibited them from growing maximally. Consequently, every African country, without exception, became vulnerable to economic and cultural predation because they were exposed to activities that critically challenged them beyond what they could handle.
More than a hundred years of dominance meant that these African countries lost touch with authentic or representational leadership and suffered mainly from the experience. They were neither represented nor given the necessary platform to determine their future. The people's anger was used as a motivation to challenge colonialism's structures to have access to their own natural and human resources without being placed at the subordinate position for which they have been known in recent time. However, the prospect was ominous because it seemed that the colonial powers had mastered the act of infringing upon the people's resources by proxy.
The era of neocolonialism began. During the post-independence period, emerging African leaders became willing collaborators with Western imperialists. They offered themselves as conduits for the continuous exploitation and despoliation of African resources. With a tempting financial and political offer, post-independence African leaders succumbed to the colonial Europeans' pressure and conceded to the unholy demand of sabotaging African development. It was almost unbelievable that the people who should have been the cornerstones of African transformation, despite their awareness of the long-lasting dehumanization that their forebears suffered under the same colonial systems, erected a mercantile political structure in the post-independence period where significant positions and juicy appointments were reserved for the highest bidders. As implied by Obafemi's response, all of this entangled African progress and civilization because it mushroomed into something bigger incapable of being handled without extreme diplomacy. Heightened by globalization's pressure, the African people became lost and were constantly in a state of flux. They did not have a central philosophy with which their civilization can be developed or launched. Indeed, constructing an effective solution becomes part of the problem.
According to Obafemi, what is needed to combat these existential challenges, having understood that the burden of solutions lies with forward-looking individuals, is to develop the right set of leaders who understands the import of shared leadership. Leadership attracts the necessary encomium whenever something is done correctly, just as it receives criticism for a society moving in a purposeless direction. Thus, understanding this places a responsibility on the leaders to develop the right frame of mind to combat the continent's problem. To do this, the class stratification that has become a part of African culture must be carefully and effectively dismantled. The existence of class presupposes that it would be subject to intimidation. The upper-class occupants would find sufficient reason to challenge those in the middle class, who would, in turn, scout the lower class to flex their muscles against. All of these are a means of weakening social infrastructures, which would have a detrimental effect.
As a realist, Obafemi concludes that Africa still has the potential to leapfrog others in the development index if it quickly works towards translating its human and natural potential into tangible results. This can be achieved by having a structured plan towards growth because it is important to define one's trajectory of development against going into the unseen future without active plans. To do this, one needs vision, driven by incurably patriotic sets of leaders who would accept the duty of advancing the society as natural and generous. Leaders who cater more to their elitist group above the vast majority of people would have difficulty transforming humanity into something exceptional. Representational leadership starts from how leaders prioritize the people and how they conduct themselves. The ones who prioritize the people above themselves would consider the masses' welfare as primary and not negotiable. When these leaders occupy the various leadership seats in the continent, they will begin to untangle the colonial and neocolonial web, thereby giving the continent a clear direction.
Photo: Post-COVID home studies
GFA Party Demands a National Conversation About ECOMIG's Presence in The Gambia
Coronavirus: UAE Sends Vaccine Doses and Aid to Gambia
The Toyin Falola Interviews – A Conversation With Professor Olu Obafemi, Part 6 - Gambia.com 2 years ago
[…] post The Toyin Falola Interviews – A Conversation With Professor Olu Obafemi, Part 6 appeared first on The Chronicle […]

redpajama_set_name: RedPajamaCommonCrawl


In 2018 about 9,960 paralegals were employed in Virginia, with most working in the Richmond and Virginia Beach-Norfolk metropolitan areas.1 A wealth of federal and state government agencies with offices in Virginia require the services of paralegals. Virginia paralegal schools offer specialized training with paralegal degree programs that prepare graduates to launch careers in this fast-growing field.
As in most other states, paralegals in Virginia are required by law to work under the supervision of a licensed lawyer and are not permitted to give legal advice to the general public. While the state does not have any specific requirements to practice as a paralegal, the Virginia Alliance of Paralegal Associations does recommend guidelines for employers regarding hiring paralegals, which include completing an ABA-approved paralegal program before being hired. As a result, aspiring paralegals in the state can become more competitive by completing a formal degree program.
Virginia paralegals earn higher than average salaries for the profession, at $51,600 statewide in 2018.1 Paralegals in the northern part of the state, particularly in the Washington-Arlington-Alexandria metro area, earn a significantly higher average, at $68,820 as of 2018.1 With a relatively low state unemployment rate of 2.9% as of March 2019, Virginia provides a strong market for legal professionals.2,3 Paralegal aspirants can find a number of government openings throughout the state, especially near Washington, DC and Hampton Roads. With high salaries and good employment prospects, Virginia is a good place for prospective paralegals to get a paralegal degree and start their careers.
Northern Virginia Community College: An American Bar Association-approved Associate of Applied Science in paralegal studies is offered at Northern Virginia Community College. This 65-credit hour course of study typically takes two years to complete. 33 credit hours are dedicated to major courses. Fundamental paralegal studies courses include Introduction to Law and the Legal Assistant, Family Law, Legal Research, and Legal Writing. The internship course is an elective, but few students forgo the opportunity to obtain hands-on law office experience.
University of Richmond: The University of Richmond offers a Bachelor of Science in Professional Studies – Paralegal Studies as well as an undergraduate Certificate in Applied Studies in Paralegal Studies. The bachelor's degree program requires 120 credit hours to complete, of which 30 credit hours are earned through courses in the paralegal major. Core courses include Introduction to Paralegal Studies, The Judicial System, Legal Research, and Legal Writing. Students who have previously earned college credit may transfer up to 60 credit hours towards the degree program. The undergraduate certificate in paralegal studies requires 21 credit hours to complete. To be eligible for admission to the certificate program, students must already hold a bachelor's degree.
Thomas Nelson Community College: Thomas Nelson Community College (TNCC) offers an Associate of Applied Science in Paralegal Studies that prepares graduates for careers as paralegals and in related legal support roles. The degree requires 66 credit hours to complete. Courses in the paralegal major include Trial Preparation and Discovery Practice; Estate Planning and Probate; Legal Transactions; and Legal Research. A required internship is included in the program curriculum. A legal assistant certificate program is also offered at Thomas Nelson Community College. The certificate program is focused on courses related to legal assisting and requires 30 credit hours to complete. Courses earned from the legal assistant curriculum can be transferred towards the TNCC paralegal studies associate's degree.
Allen, Allen, Allen & Allen, PC, also called The Allen Law Firm, has eight offices across the state of Virginia. A personal injury law firm, The Allen Law Firm has been recognized by US News as a top tier firm and has also been ranked as one of the best places to work in Virginia. The firm has an excellent reputation and provides competitive salaries and benefits to its staff. Albo & Oblon, LLP has five offices in Virginia, from which it provides a full spectrum of legal representation to businesses and individuals. The firm is looking to expand its practice areas, and as a continually growing firm regularly recruits for paralegals. Woods Rogers PLC is one of the largest law firms in Virginia west of Richmond and specializes in business and litigation. Woods Rogers offers paralegals the opportunity to work in a sophisticated office in a local environment that contributes to a high quality of life.
Virginia Alliance of Paralegal Associations – VAPA was established in 1989 and represents over 1,500 paralegals and students of the profession in the state of Virginia.


text:
/*** Autogenerated by WIDL 1.5.25 from include/inputscope.idl - Do not edit ***/

#ifndef __REQUIRED_RPCNDR_H_VERSION__
#define __REQUIRED_RPCNDR_H_VERSION__ 475
#endif

#include <rpc.h>
#include <rpcndr.h>

#ifndef COM_NO_WINDOWS_H
#include <windows.h>
#include <ole2.h>
#endif

#ifndef __inputscope_h__
#define __inputscope_h__

/* Forward declarations */

#ifndef __ITfInputScope_FWD_DEFINED__
#define __ITfInputScope_FWD_DEFINED__
typedef interface ITfInputScope ITfInputScope;
#endif

/* Headers for imported files */

#include <oaidl.h>
#include <ocidl.h>

#ifdef __cplusplus
extern "C" {
#endif

typedef enum __WIDL_inputscope_generated_name_00000000 {
    IS_DEFAULT = 0,
    IS_URL = 1,
    IS_FILE_FULLFILEPATH = 2,
    IS_FILE_FILENAME = 3,
    IS_EMAIL_USERNAME = 4,
    IS_EMAIL_SMTPEMAILADDRESS = 5,
    IS_LOGINNAME = 6,
    IS_PERSONALNAME_FULLNAME = 7,
    IS_PERSONALNAME_PREFIX = 8,
    IS_PERSONALNAME_GIVENNAME = 9,
    IS_PERSONALNAME_MIDDLENAME = 10,
    IS_PERSONALNAME_SURNAME = 11,
    IS_PERSONALNAME_SUFFIX = 12,
    IS_ADDRESS_FULLPOSTALADDRESS = 13,
    IS_ADDRESS_POSTALCODE = 14,
    IS_ADDRESS_STREET = 15,
    IS_ADDRESS_STATEORPROVINCE = 16,
    IS_ADDRESS_CITY = 17,
    IS_ADDRESS_COUNTRYNAME = 18,
    IS_ADDRESS_COUNTRYSHORTNAME = 19,
    IS_CURRENCY_AMOUNTANDSYMBOL = 20,
    IS_CURRENCY_AMOUNT = 21,
    IS_DATE_FULLDATE = 22,
    IS_DATE_MONTH = 23,
    IS_DATE_DAY = 24,
    IS_DATE_YEAR = 25,
    IS_DATE_MONTHNAME = 26,
    IS_DATE_DAYNAME = 27,
    IS_DIGITS = 28,
    IS_NUMBER = 29,
    IS_ONECHAR = 30,
    IS_PASSWORD = 31,
    IS_TELEPHONE_FULLTELEPHONENUMBER = 32,
    IS_TELEPHONE_COUNTRYCODE = 33,
    IS_TELEPHONE_AREACODE = 34,
    IS_TELEPHONE_LOCALNUMBER = 35,
    IS_TIME_FULLTIME = 36,
    IS_TIME_HOUR = 37,
    IS_TIME_MINORSEC = 38,
    IS_NUMBER_FULLWIDTH = 39,
    IS_ALPHANUMERIC_HALFWIDTH = 40,
    IS_ALPHANUMERIC_FULLWIDTH = 41,
    IS_CURRENCY_CHINESE = 42,
    IS_BOPOMOFO = 43,
    IS_HIRAGANA = 44,
    IS_KATAKANA_HALFWIDTH = 45,
    IS_KATAKANA_FULLWIDTH = 46,
    IS_HANJA = 47,
    IS_HANGUL_HALFWIDTH = 48,
    IS_HANGUL_FULLWIDTH = 49,
    IS_SEARCH = 50,
    IS_FORMULA = 51,
    IS_SEARCH_INCREMENTAL = 52,
    IS_CHINESE_HALFWIDTH = 53,
    IS_CHINESE_FULLWIDTH = 54,
    IS_NATIVE_SCRIPT = 55,
    IS_PHRASELIST = -1,
    IS_REGULAREXPRESSION = -2,
    IS_SRGS = -3,
    IS_XML = -4,
    IS_ENUMSTRING = -5
} InputScope;
HRESULT WINAPI SetInputScope(HWND hwnd,InputScope inputscope);
HRESULT WINAPI SetInputScopes(HWND hwnd,const InputScope *pInputScopes,UINT cInputScopes,WCHAR **ppszPhraseList,UINT cPhrases,WCHAR *pszRegExp,WCHAR *pszSRGS);
HRESULT WINAPI SetInputScopeXML(HWND hwnd,WCHAR *pszXML);
DEFINE_GUID(GUID_PROP_INPUTSCOPE,0x1713dd5a,0x68e7,0x4a5b,0x9a,0xf6,0x59,0x2a,0x59,0x5c,0x77,0x8d);
/*****************************************************************************
 * ITfInputScope interface
 */
#ifndef __ITfInputScope_INTERFACE_DEFINED__
#define __ITfInputScope_INTERFACE_DEFINED__

DEFINE_GUID(IID_ITfInputScope, 0xfde1eaee, 0x6924, 0x4cdf, 0x91,0xe7, 0xda,0x38,0xcf,0xf5,0x55,0x9d);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("fde1eaee-6924-4cdf-91e7-da38cff5559d")
ITfInputScope : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetInputScopes(
        InputScope **pprgInputScopes,
        UINT *pcCount) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetPhrase(
        BSTR **ppbstrPhrases,
        UINT *pcCount) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetRegularExpression(
        BSTR *pbstrRegExp) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetSRGS(
        BSTR *pbstrSRGS) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetXML(
        BSTR *pbstrXML) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ITfInputScope, 0xfde1eaee, 0x6924, 0x4cdf, 0x91,0xe7, 0xda,0x38,0xcf,0xf5,0x55,0x9d)
#endif
#else
typedef struct ITfInputScopeVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ITfInputScope* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ITfInputScope* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ITfInputScope* This);

    /*** ITfInputScope methods ***/
    HRESULT (STDMETHODCALLTYPE *GetInputScopes)(
        ITfInputScope* This,
        InputScope **pprgInputScopes,
        UINT *pcCount);

    HRESULT (STDMETHODCALLTYPE *GetPhrase)(
        ITfInputScope* This,
        BSTR **ppbstrPhrases,
        UINT *pcCount);

    HRESULT (STDMETHODCALLTYPE *GetRegularExpression)(
        ITfInputScope* This,
        BSTR *pbstrRegExp);

    HRESULT (STDMETHODCALLTYPE *GetSRGS)(
        ITfInputScope* This,
        BSTR *pbstrSRGS);

    HRESULT (STDMETHODCALLTYPE *GetXML)(
        ITfInputScope* This,
        BSTR *pbstrXML);

    END_INTERFACE
} ITfInputScopeVtbl;
interface ITfInputScope {
    CONST_VTBL ITfInputScopeVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ITfInputScope_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ITfInputScope_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ITfInputScope_Release(This) (This)->lpVtbl->Release(This)
/*** ITfInputScope methods ***/
#define ITfInputScope_GetInputScopes(This,pprgInputScopes,pcCount) (This)->lpVtbl->GetInputScopes(This,pprgInputScopes,pcCount)
#define ITfInputScope_GetPhrase(This,ppbstrPhrases,pcCount) (This)->lpVtbl->GetPhrase(This,ppbstrPhrases,pcCount)
#define ITfInputScope_GetRegularExpression(This,pbstrRegExp) (This)->lpVtbl->GetRegularExpression(This,pbstrRegExp)
#define ITfInputScope_GetSRGS(This,pbstrSRGS) (This)->lpVtbl->GetSRGS(This,pbstrSRGS)
#define ITfInputScope_GetXML(This,pbstrXML) (This)->lpVtbl->GetXML(This,pbstrXML)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ITfInputScope_QueryInterface(ITfInputScope* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ITfInputScope_AddRef(ITfInputScope* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ITfInputScope_Release(ITfInputScope* This) {
    return This->lpVtbl->Release(This);
}
/*** ITfInputScope methods ***/
static FORCEINLINE HRESULT ITfInputScope_GetInputScopes(ITfInputScope* This,InputScope **pprgInputScopes,UINT *pcCount) {
    return This->lpVtbl->GetInputScopes(This,pprgInputScopes,pcCount);
}
static FORCEINLINE HRESULT ITfInputScope_GetPhrase(ITfInputScope* This,BSTR **ppbstrPhrases,UINT *pcCount) {
    return This->lpVtbl->GetPhrase(This,ppbstrPhrases,pcCount);
}
static FORCEINLINE HRESULT ITfInputScope_GetRegularExpression(ITfInputScope* This,BSTR *pbstrRegExp) {
    return This->lpVtbl->GetRegularExpression(This,pbstrRegExp);
}
static FORCEINLINE HRESULT ITfInputScope_GetSRGS(ITfInputScope* This,BSTR *pbstrSRGS) {
    return This->lpVtbl->GetSRGS(This,pbstrSRGS);
}
static FORCEINLINE HRESULT ITfInputScope_GetXML(ITfInputScope* This,BSTR *pbstrXML) {
    return This->lpVtbl->GetXML(This,pbstrXML);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE ITfInputScope_GetInputScopes_Proxy(
    ITfInputScope* This,
    InputScope **pprgInputScopes,
    UINT *pcCount);
void __RPC_STUB ITfInputScope_GetInputScopes_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITfInputScope_GetPhrase_Proxy(
    ITfInputScope* This,
    BSTR **ppbstrPhrases,
    UINT *pcCount);
void __RPC_STUB ITfInputScope_GetPhrase_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITfInputScope_GetRegularExpression_Proxy(
    ITfInputScope* This,
    BSTR *pbstrRegExp);
void __RPC_STUB ITfInputScope_GetRegularExpression_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITfInputScope_GetSRGS_Proxy(
    ITfInputScope* This,
    BSTR *pbstrSRGS);
void __RPC_STUB ITfInputScope_GetSRGS_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITfInputScope_GetXML_Proxy(
    ITfInputScope* This,
    BSTR *pbstrXML);
void __RPC_STUB ITfInputScope_GetXML_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __ITfInputScope_INTERFACE_DEFINED__ */

/* Begin additional prototypes for all interfaces */

ULONG           __RPC_USER BSTR_UserSize     (ULONG *, ULONG, BSTR *);
unsigned char * __RPC_USER BSTR_UserMarshal  (ULONG *, unsigned char *, BSTR *);
unsigned char * __RPC_USER BSTR_UserUnmarshal(ULONG *, unsigned char *, BSTR *);
void            __RPC_USER BSTR_UserFree     (ULONG *, BSTR *);

/* End additional prototypes */

#ifdef __cplusplus
}
#endif

#endif /* __inputscope_h__ */


I took a quick trip to Warri, Delta State for my niece's 5th birthday! Riwo is a big girl now ohhh. I took a trip down memory lane also, take you to my old house, my old church and the market I used to go to.
P:S - My husband was in the same class as you in Primary School. 'lol' Small world.


Clayton Recruitment's specialist Nursing Division is currently recruiting for experienced an experienced Staff Nurse (RGN/RMN) for our clients small to medium sized Nursing Home located in the heart of Cumbria.
This home provides specialist Mental Health Care together with providing a high level of care to service users with physical and or learning disabilities.
Applicants are required to be RGN/RMN trained and will have a genuine interest in working with service users who have learning difficulties. Communication skills are essential, and applicants must be able to work as part of a successful team. Current NMC Registration is paramount.


This KONA is backed by the balance of Hyundai's comprehensive factory warranty coverage and qualifies for wide variety of extended warranty plans designed to fit any driving style or budget.
Nearly New and only 15K this GreenLight Certified Kona features a complete power convenience group, full leather throughout, heated seats, heated steering, power sliding sunroof and of course Hyundai's H-Track AWD. Market Value priced for immediate delivery and ready for all of life's adventures. Come check it out or TEXT 902-200-4475 for more info.


Enjoy upgraded kitchen cabinets, quartz countertops with breakfast bar, tile backsplash, & stainless steel appliances in the kitchen, a warm & inviting marble fireplace in the living room, a quiet & relaxing rear patio, 1st floor master with tray ceiling and huge walk-in closet, 2nd floor loft overlooking the living room and much more! Located in the established community of Bay Shore, just around the corner from the community clubhouse and pool, and only a short drive to beaches, shopping, dining. Call today!
Based on information from #66834004 as of April 17th 2019, 2:05:58 pm.


New commercial development is in the works for The Landing on Lake Wylie. The Lake Wylie area, given its strong economy and local demographic, has several companies looking to develop the area. The recent opening of Publix at the Shoppes at The Landing makes it a hot area.
The Shoppes at the Landing, a major retail hub in the community, is getting three new great businesses. Wylie Commons has broken ground on a property that will include Moe's Southwest Grill, SportClips and TK Nails Spa & Waxing.
The building will total approximately 9,000 square feet, and will be a multi-tenant retail building that is currently seeking two other tenants to stabilize the project and to fill out the area.
The new building will be situated between S.C. 49 and Nautical Drive at the intersections with Bulkhead Way. Moe's Southwest Grill, which will be located at the far left of the project and will include patio space, will neighbor a 1,800 square foot space that would be a great fit for a large business or could be subdivided into smaller spaces. At the opposite end of the project from where Moe's will be situated lies a 1,400 square foot space with a patio that will most likely be another restaurant, coffee shop or cafe.
The entire Wylie Commons project is scheduled to be completed by August 1st with an official opening slated for no later than October 1st. The one and a half acre site will offer 62 parking spaces, which should accommodate the additional retail, dining and business that Wylie Commons is bringing.
For more details on the development at the Shoppes at The Landing, read the article here.
And, be sure to take a look at all of the spectacular residential property available for sale in the Lake Wylie area by clicking the link to our website, or call 803-831-8588.


text:
View source for PR21
← PR21
PR21 was a public relations company in the UK that worked for the tobacco industry. The firm was launched in London in October 2000 by [[Edelman]], one of the world's largest PR companies.<ref>Edelman, [http://www.edelman.com/news/ShowOne.asp?ID=297 Edelman and Zeno Group Announce Expansion in Technology], 17 November 2011, accessed 30 January 2012</ref><ref>[http://www.prweek.com/news/106635/STOP-PRESS-Kaye-launches-rebranded-Rowland-PR-21/?DCMP=ILC-SEARCH STOP PRESS: Kaye launches rebranded Rowland as PR 21], PR Week, 8 September 2000, accessed 30 January 2012</ref> The company's London arm was shut down in March 2004 after losing both major clients and senior staff.<ref>Tom Williams, [http://www.prweek.com/news/204104/PR21-finally-pulls-plug-London-operation/?DCMP=ILC-SEARCH 'PR21 finally pulls plug on London operation'], ''PR Week'', 5 March 2004, accessed 30 January 2012</ref> The company's US arm later changed its name to [http://www.zenogroup.com/#!/content/page/welcome Zeno Group].<ref> ''PR Week'',[http://www.prweek.com/news/224910/News-brief/?DCMP=ILC-SEARCH 'News in brief'], 15 October 2004, accessed 30 January 2012</ref> ==Work for the Tobacco Industry== The [[Tobacco Manufacturers' Association]] (TMA) awarded the PR contract for the [[Tobacco Alliance]] to PR21 in December 2000. Details of its pitch are on the [[Tobacco Retailers Alliance]] page. The team included: *[[Jonathan Hopkins]], who was responsible for planning *[[Joe Brice]], client management *[[Nick Tennant]], media relations The company started the work on 15 January 2001. Its parent company [[Edelman]] had previously had the contract.<ref>TMA, [http://legacy.library.ucsf.edu/tid/why44a99 Tobacco Alliance Account], 19 December 2000, accessed 30 January 2012</ref> Hopkins and Brice attended meetings of the TMA's 'Campaign Group.<ref> TMA, [http://legacy.library.ucsf.edu/tid/ohy44a99 Campaign Group Meeting on 11th January 2001], 11 January 2001, accessed 30 January 2012</ref> == Notes == <references/> [[category:PR Companies]] [[category:Lobbyists and PR People]][[category:Media Strategy]]
Return to PR21.
Retrieved from "https://tobac.tuxic.nl/index.php?title=PR21"


Rods, tubes, posts and similar items could not be coated and cured within the Customer's stringent time/temperature parameters. Powder had to be applied to a pre-heated part, then cured for a few seconds without additional heating, and finally quenched in cold water to conform to the desired line speed and space constraints.
A unique, catalyzed coating that exceeded the process parameters, achieved full cure with 90%less energy, and allowed the Customer to achieve a 10% increase in productivity due to increased line speed. As an added benefit, Patriot Powder Coatings did not clog the Customers dual collector filters.
This entry was posted in GENERAL METAL FABRICATION. Bookmark the permalink.
We are ready to help with your powder coating needs.


text:
Aircision beams old tech into the future
In 1880, Alexander Graham Bell provided the first proof of concept for free-space optics. Using his invention, dubbed the 'photophone', he proved that beams of light could carry voice conversation through free space, aka, the air. In 2019, Eindhoven start-up, Aircision, is ready to add their modifications to bring this technology into the future, specifically for the upcoming roll-out of 5G.
Aircision recently announced plans to test their modification to existing free-space optics (FSO) technology, with the ultimate goal of using their solution to bolster the roll-out of 5G. The Eindhoven-based start-up has big plans to upgrade line-of-sight laser beam technology for next-generation telecommunications. Thanks to a partnership between the high-tech business incubator, HightechXL, and CERN, they're one step closer to putting their product to the test.
FSO is a relatively simple technology. Conceptually, using lasers to send and receive data is like that of optical transmissions using fiber-optic cables. The biggest difference is the medium: air rather than glass. The technology is based on connectivity between FSO units, each consisting of an optical transceiver with a laser transmitter and a receiver to provide bi-directional capability. Current units use a high-power optical source that translates data into laser pulses and sends them through a lens, through the atmosphere to another lens. This lens connects to a high-sensitivity receiver via optical fiber, where the transmitted data can then be processed.
While FSO has been around for quite some time, the technology has never really taken off. Even though light can travel faster through air than glass, the communications infrastructure has centered around more stable options, such as fiber-optic networks and cell towers. This is because, historically, FSO has had some hefty limitations. One of the first drawbacks: in order to successfully relay data, the transmitter and receiver must maintain perfect alignment. If the light beam doesn't reach the receiver, at just the right angle, the information can be lost.
FSO is key to a fast roll-out of 5G, Aircision believes. "It's easy to deploy, has very high bandwidth and doesn't require any additional licenses to operate," commented COO and co-founder, Martijn Boerkamp (on the right). Credit: Aircision
This also means that beam quality is a crucial factor. Typical light beams, known as Gaussian beams, have major issues of degradation, especially over longer distances. The further the light travels, the more the light particles expand out of the central axis, thus resulting in distortion or signal loss. Similarly, when sending data through free space, objects, as well as atmospheric and weather conditions can play an enormous role in signal quality. Beams of light are easily blocked when something passes in front, meaning that fog, mist and even rain can fatally interrupt transmission.
Using axicon lenses helps to create Bessel-like beams. These differ from Gaussian in that they maintain the central axis, which is the strongest part of the beam, and can also reconstruct after an obstruction. The result: a more secure connection between the transmitter and receiver. The problem: Bessel-like light beams don't propagate very far (several meters) and are therefore deemed to be impractical.
Application to 5G
Despite the drawbacks, Aircision proposes to use this centuries-old method as a viable solution for the future information and telecommunications systems. In their claim, they're getting a little boost from a new innovation: the structured laser beam. This Bessel-like beam is almost non-diffractive, and the central axis only diverges slightly (a few millimeters) over a distance of 200 meters. Additionally, structured laser beams can reconstruct after obstruction and can transmit data at speeds similar to those experienced with fiber-optic systems.
Aircision sees an opportunity for using FSO in next-generation telecommunications. The existing infrastructure is adequate for the current standard of 4G, but as 5G comes closer to fruition, it's clear that network capacity will no longer be sufficient. In order to accommodate more users, with multiple devices, expecting faster speeds, there's a dire need for a robust investment into the network infrastructure, but, in terms of time, space, and money, this is going to be very costly.
FSO is key to a fast roll-out of 5G, Aircision believes. "It's easy to deploy, has very high bandwidth and doesn't require any additional licenses to operate," commented COO and co-founder, Martijn Boerkamp, adding, "Construction of new cell towers, or placing new fiber-optics networks is not always feasible, nor is it cost effective. Therefore, FSO has the potential to be really competitive in the coming years."
There is, however, still some work to be done as this system remains largely unproven. Boerkamp: "Theoretically, our beam can exceed the distances required in 5G, yet our team has not tested beyond 200 meters. We're optimizing our optical components to generate a beam that can propagate over the distances required by 5G, as well as to stay within the limits of laser power that we use, from both a cost and safety perspective." Implementation of rooftop FSO testing, in coordination with High Tech Campus Eindhoven, is slated for the summer.
New round of layoffs at Nokia Bell Antwerp
Nokia Bell in Antwerp intends to lay off 104 employees, almost a year after announcing its plan to slash 107…
Imec spots route to beyond-5G front-end technologies
Imec has identified some promising leads for beyond-5G mm-wave front-end technologies. The first functional devices, one type for frequencies above…
"Huawei offers to increase 5G factory capacity in Europe"
Huawei is prepared to increase 5G production capacity in Europe if that helps to assuage fears of spying, the company's…
Multiphysics simulations for 5G RFICs and SoCs
The transition to 5G is exciting but no small task given the degree of complexity at various points in the…


text:
Els Washington Nationals (literalment Nacionals de Washington en català) són un club professional de beisbol estatunidenc de la ciutat de Washington DC que disputa la Lliga Nacional de MLB. La franquícia va tenir la seu a la ciutat canadenca de Montreal durant molts anys amb el nom de Expos de Montreal.

Palmarès
 Campionats de la MLB (1): 2019
 Campionats de la Lliga Nacional (1): 2019
 Campionats de la Divisió Est (5): 1981,2012, 2014, 2016, 2017

Evolució de la franquícia
 Nationals de Washington (2005-present)
 Expos de Montreal (1969-2004)

Colors
Vermell, blau marí, i blanc.

Estadis

 Nationals Park (2008-present)
 RFK Memorial Stadium (2005-2007)
 Estadi Hiram Bithorn (Estadio Hiram Bithorn) (San Juan, Puerto Rico) (2003-2004)
 Estadi Olímpic (Stade olympique) (Mont-real) (1977-2004)
 Parc Jarry (Montreal) (1969-1976)

Números retirats
 Jackie Robinson 42

Referències

Enllaços externs
 Web oficial
 Washington Nationals a espn
 Washington Nationals a FOX Sports

Clubs de beisbol estatunidencs
Clubs de la Major League Baseball
Clubs esportius de Washington DC

redpajama_set_name: RedPajamaWikipedia


They don't call it Rock-tober for nothing!
Oh, no one calls it that?
Rocktober is my favorite month of the year!
It's gorgeous and it's my favorite-which is why I had to ensure that my anniversary would fall in Rock-tober. Spending my anniversary at a secluded bed and breakfast in October for the next 75 years. YES, PLEASE!
yay! its your wedding MONTH!!


old fashioned door bell antique push button online wireless brass doorbells wired lighted doorbell plat.
black furniture living room ideas and white decorating.
deep seat outdoor cushions elegant seating cushion cover cozy for furniture canada patio.
oil rubbed bronze doorbells doorbell turn comes in wired door chime cover utilitech button.
remote control for ceiling fans windward iv in led indoor brushed nickel fan with light kit and hampton bay problems nz.
ring doorbell pro power kit replacement 2 wi fi v2.
cat door window insert ideal pet products authorized retailer for vertical lockable sliding sash.
water proof picture frames outdoor waterproof poster frame weather resistant snap sign for aquarium outdoors.
indoor bike rack pro this wood wooden.
sliding glass door dog insert doors amazon with built in utah.


Christkindlmarkt is located at the Steel Stacks Campus in south bethlehem.
Thought this was a little expensive, but we have friends in from out of town this weekend and it turned out to be a fine way to spend time with them and show them what our area has to offer for the holidays. Ice sculptures were amazing to see. Glass blowers. Enough going on for the kids to be happy while the adults shopped around.


text:
Nigeria Football news / Trending Nigeria sport news
Top Nigeria Football News: Chelsea Star Victor Moses Among Three Strikers On Manchester United's Shopping List – Report
1. Chelsea Star Victor Moses Among Three Strikers On Manchester United's Shopping List – Report
There has been speculation at home and abroad regarding the future of former Nigeria international Victor Moses ahead of the opening of the transfer window.
The Blues number fifteen has made only one start this season and was a surprise omission from the squad against Derby County in the League Cup on Wednesday despite training with the team the previous day.
2. MOSES SIMON: IT'S GOOD TO BE BACK WITH NIGERIA
Moses Simon says its good to be back in the Nigeria national team fold and he is looking forward to the prospect of playing his first competitive Super Eagles match in more than a year.
The 23-year-old winger has struggled with injuries in recent months and famously missed the 2018 World Cup in Russia due to a thigh problem.
3. Nigeria: Knocks for Junior Lokosa Over Trials in Chinese League
The decision by Kano Pillars attacker, Junior Lokosa, who is considered as one of the hottest players in the Nigeria Professional League (NPFL), to seek contract with a Chinese second division club, is not going down well with some football-loving Nigerians.
SCORENigeria reported yesterday that Lokosa and Katsina United midfielder, Destiny Ashadi, will by this weekend, know whether they will sign a contract with the Chinese second division club, Heilongjiang Lava Spring FC.
4. Isaac Success Nominated For Watford's Goal Of The Month, Named In Premier League TOTW
Isaac Success is among the nominees for Watford's Goal of the Month award for October 2018.
Isaac Success
The Super Eagles striker put the icing on the cake by converting a brilliantly executed free-kick routine for Watford's third goal in the 80th minute against Huddersfield Town in a Premier League clash on Saturday.
5. Iwobi, Onazi, Odey, Awaziem headlines Nigerian players on Wednesday duties
The 2018 World Cup star played all 90 minutes for the former Seria A side but was unable to give his team the needed goal to stay in the encounter. Simy Nwankwo has scored two goals for the Italian club this season.
ogenyi onazi
Super Eagles midfielder Alex Iwobi replaced Emile Smith-Rowe in the 73rd minute of Arsenal's 2 – 1 win over Blackpool in the round of 16 of the Carabao Cup on Wednesday night.


text:
FFOS
Privy Council decision between FFOS and EMA deferred
No decision today in the matter between the Fishermen and Friends of the Sea and the Environmental Management Authority.
The matter surrounds the granting of a certificate of environmental clearance to the Ministry of Works And Transport in June 2017.
The C-E-C was granted for the establishment of a 5000-meter highway in the Sangre Grande area.
Fishermen And Friends of The Sea have stated that the E-M-A'S potion to grant the document to the ministry is "unreasonable, illegal, procedurally improper, irrational, null and void and of no effect."
WASA says the Pt Lisas Desalination Plant is back at full production
Officer rewarded for good deed
FFOS commends Massy Stores for plastic bag zero-tolerance policy
The group Fishermen and Friends of the Sea (FFOS) is commending Massy Stores for the move to promote zero tolerance on plastic bags.
FFOS says the decision is going to help significantly with the environment.
The following is a statement issued by the group on Friday.
"Massy Stores must be commended for taking the lead in promoting zero tolerance for plastic bags.
Cap de Ville man charged with firearm, ammunition possession
Search on for teenager abducted in Maraval
FFOS heads to Privy Council as Appeal Court dismisses Cumuto highway appeal
The Court of Appeal has dismissed an appeal brought by the group Fishermen and Friends of the Sea (FFOS), on the construction of the highway from Cumuto to Sangre Grande.
FFOS appealed for leave for judicial review for the grant of a Certificate of Environmental Clearance (CEC) for the construction of the 5000-metre highway along the southern boundary of The Aripo Savannas.
The group maintains that this is an environmentally sensitive area.
FFOS says it is disappointed by today's ruling but is determined to explore all legal means of recourse.
Sheron Sukhdeo shot dead
Homeless man found in abandoned Duncan Street building
FFOS launches legal challenge to certificate allowing construction of Cumuto to Sangre Grande Highway
The group 'Fishermen and Friends of the Sea' (FFOS) is challenging the construction of a highway from Cumuto to Sangre Grande, saying the Certificate of Environemental Clearance
Hike in fuel prices will save government $550 million
Three arrested with firearm, ammunition in Chaguanas


text:
Home / Something To Do / The Classics Come To Life
The Classics Come To Life
Sometimes it's the treasures of yesteryear that keep Hollywood fresh. Such could be the case with the next chapter in the history of Hollywood's cherished Chinese Theatre, which is hosting their first-ever exhibit of memorabilia.
The exhibit, the "Hollywood Legends" collection, includes almost 1,000 costumes from beloved films and television shows, and debuts in Los Angeles September 30 at the Chinese Theatre.
Among the treasures are Marilyn Monroe's gold lame, pleated halter gown from "Gentlemen Prefer Blondes" (1953), Rita Hayworth's black satin ball gown from her "Put The Blame on Mame" number in "Gilda" (1946), Vivian Leigh's green velvet drapery gown from "Gone With the Wind" (1939) and Judy Garland's blue and white gingham pinafore and blouse from "The Wizard of Oz" (1939).
Additionally, there will be props and accessories on display from several famous films.The exhibit, which has traveled to global destinations in Italy, Japan, and Russia, as well as to San Francisco last year, will be in the Chinese Theatre's lobby, and will be open daily during normal operating hours as a free, added attraction for movie ticket holders and VIP tour guests.
The Classics Come To Life Reviewed by #IheartHollywood on September 30, 2011 Rating: 5


Please confirm that the wireless signal has already been linked. A blinking power LED means that there is no link between the receiver and transmitter. Make sure the distance is less than 20 meters and that the receiver and transmitter are not in different rooms. A concrete wall between the transmitter and receiver will block the signal. 2. Please confirm that the TV and other video source devices are turned on. A rapidly blinking source LED on the SWW1800 means there is no signal source. 3. Please confirm that you have switched to the right input source. 4. Please confirm that the output format of the video source device is supported by the SWW1800. A slowly blinking source LED means the SWW1800 does not support the format of the video source connected.


text:
Marcus Miller (* 14. června 1959, Brooklyn, New York) je jazzový hudebník, skladatel, producent a multiinstrumentalista. Proslavil se jako baskytarista, ale hraje také na basklarinet, klávesy, saxofon a kytaru. Příležitostně i zpívá. Během své hudební kariéry spolupracoval s trumpetistou Milesem Davisem, zpěvákem Lutherem Vandrossem či saxofonistou Davidem Sanbornem.

Diskografie

Sólová kariéra - od roku 1982 do současnosti
 1983 Suddenly
 1984 Marcus Miller
 1993 The Sun Don't Lie
 1995 Tales
 1998 Live & More
 2000 Best of '82-'96
 2001 M² (2002 Cena Grammy pro nejlepší soudobé jazzové album)
 2002 The Ozell Tapes
 2005 Silver Rain
 2007 Free
 2008 Marcus
 2008 Thunder (jako SMV, společně s Stanley Clarkem a Victorem Wootenem)
 2010 A Night in Monte Carlo - Live 2009 (Dreyfus Jazz)
 2012 Renaissance
 2015 Afrodeezia

Období s Davidem Sanbornem (1975–2000)
 1977 Lovesongs
 1980 Hideaway
 1980 Voyeur
 1981 As We Speak
 1982 Backstreet
 1984 Straight to the Heart
 1987 Change of Heart
 1988 Close-Up
 1991 Another Hand
 1992 Upfront
 1994 Hearsay
 1995 Pearls
 1996 Songs from the Night Before
 1999 Inside

Období s Milesem Davisem (1980–1990)
 1981 The Man with the Horn
 1981 We Want Miles
 1982 Star People
 1986 Tutu (album)|Tutu
 1987 Music From Siesta
 1989 Amandla (album)|Amandla

Ve skupině The Jamaica Boys (1986–1990)
 1987 The Jamaica Boys
 1989 The Jamaica Boys II: J. Boys

Externí odkazy

Jazzrockoví baskytaristé
Jazzoví baskytaristé
Američtí baskytaristé
Narození v roce 1959
Žijící lidé
Američtí jazzoví hudebníci
Držitelé ceny Grammy
Muži
Narození 14. června