text:
/*global JSHINT */
/*global decodeBase64Data, embedInSandcastleTemplate */
/*global gallery_demos, has_new_gallery_demos, hello_world_index, VERSION*/ // defined in gallery/gallery-index.js, created by build
/*global sandcastleJsHintOptions*/ // defined by jsHintOptions.js, created by build
require({
  baseUrl: "../../Source",
  packages: [
    {
      name: "dojo",
      location: "../ThirdParty/dojo-release-1.10.4/dojo",
    },
    {
      name: "dijit",
      location: "../ThirdParty/dojo-release-1.10.4/dijit",
    },
    {
      name: "Sandcastle",
      location: "../Apps/Sandcastle",
    },
    {
      name: "CodeMirror",
      location: "../ThirdParty/codemirror-5.52.0",
    },
    {
      name: "ThirdParty",
      location: "../Apps/Sandcastle/ThirdParty",
    },
  ],
}, [
  "CodeMirror/lib/codemirror",
  "dijit/Dialog",
  "dijit/form/Button",
  "dijit/form/Form",
  "dijit/form/Textarea",
  "dijit/layout/ContentPane",
  "dijit/popup",
  "dijit/registry",
  "dijit/TooltipDialog",
  "dojo/_base/fx",
  "dojo/_base/xhr",
  "dojo/dom",
  "dojo/dom-class",
  "dojo/dom-construct",
  "dojo/io-query",
  "dojo/mouse",
  "dojo/on",
  "dojo/parser",
  "dojo/promise/all",
  "dojo/query",
  "dojo/request/script",
  "Sandcastle/LinkButton",
  "ThirdParty/clipboard.min",
  "ThirdParty/pako.min",
  "CodeMirror/addon/hint/show-hint",
  "CodeMirror/addon/hint/javascript-hint",
  "CodeMirror/mode/javascript/javascript",
  "CodeMirror/mode/css/css",
  "CodeMirror/mode/xml/xml",
  "CodeMirror/mode/htmlmixed/htmlmixed",
  "dijit/form/DropDownButton",
  "dijit/form/ToggleButton",
  "dijit/form/DropDownButton",
  "dijit/form/TextBox",
  "dijit/Menu",
  "dijit/MenuBar",
  "dijit/PopupMenuBarItem",
  "dijit/MenuItem",
  "dijit/layout/BorderContainer",
  "dijit/layout/TabContainer",
  "dijit/Toolbar",
  "dijit/ToolbarSeparator",
  "dojo/domReady!",
], function (
  CodeMirror,
  Dialog,
  Button,
  Form,
  TextArea,
  ContentPane,
  popup,
  registry,
  TooltipDialog,
  fx,
  xhr,
  dom,
  domClass,
  domConstruct,
  ioQuery,
  mouse,
  on,
  parser,
  all,
  query,
  dojoscript,
  LinkButton,
  ClipboardJS,
  pako
) {
  "use strict";
  // attach clipboard handling to our Copy button
  const clipboardjs = new ClipboardJS(".copyButton");

  function defined(value) {
    return value !== undefined && value !== null;
  }

  parser.parse();

  fx.fadeOut({
    node: "loading",
    onEnd: function () {
      domConstruct.destroy("loading");
    },
  }).play();

  let numberOfNewConsoleMessages = 0;

  const logOutput = document.getElementById("logOutput");
  function appendConsole(className, message, showConsole) {
    const ele = document.createElement("span");
    ele.className = className;
    ele.textContent = `${message}\n`;
    logOutput.appendChild(ele);
    logOutput.parentNode.scrollTop =
      logOutput.clientHeight + 8 - logOutput.parentNode.clientHeight;
    if (showConsole) {
      hideGallery();
    } else {
      ++numberOfNewConsoleMessages;
      registry
        .byId("logContainer")
        .set("title", `Console (${numberOfNewConsoleMessages})`);
    }
  }

  const URL = window.URL || window.webkitURL;

  function findCssStyle(selectorText) {
    for (
      let iSheets = 0, lenSheets = document.styleSheets.length;
      iSheets < lenSheets;
      ++iSheets
    ) {
      const rules = document.styleSheets[iSheets].cssRules;
      for (
        let iRules = 0, lenRules = rules.length;
        iRules < lenRules;
        ++iRules
      ) {
        if (rules[iRules].selectorText === selectorText) {
          return rules[iRules];
        }
      }
    }
  }

  /* eslint-disable-next-line prefer-const */
  let jsEditor;
  const suggestButton = registry.byId("buttonSuggest");
  let docTimer;
  const docTabs = {};
  const subtabs = {};
  let docError = false;
  const galleryError = false;
  let deferredLoadError = false;
  let galleryTooltipTimer;
  let activeGalleryTooltipDemo;
  const demoTileHeightRule = findCssStyle(".demoTileThumbnail");
  const cesiumContainer = registry.byId("cesiumContainer");
  const docNode = dom.byId("docPopup");
  const docMessage = dom.byId("docPopupMessage");
  const local = {
    docTypes: [],
    headers: "",
    bucketName: "",
    emptyBucket: "",
  };
  const bucketTypes = {};
  const demoTooltips = {};
  const errorLines = [];
  const highlightLines = [];
  let searchTerm = "";
  let searchRegExp;
  let hintTimer;
  const defaultDemo = "Hello World";
  const defaultLabel = "Showcases";
  let currentTab = defaultLabel;
  let newDemo;
  let demoHtml = "";
  let demoCode = "";

  const defaultHtml =
    '\n

\n

Loading...

\n

';

  const galleryErrorMsg = document.createElement("span");
  galleryErrorMsg.className = "galleryError";
  galleryErrorMsg.style.display = "none";
  galleryErrorMsg.textContent = "No demos match your search terms.";

  const bucketFrame = document.getElementById("bucketFrame");
  const bucketPane = registry.byId("bucketPane");
  let bucketWaiting = false;

  xhr
    .get({
      url: "../../Build/Documentation/types.txt",
      handleAs: "json",
      error: function (error) {
        docError = true;
      },
    })
    .then(function (value) {
      local.docTypes = value;
    });

  const decoderSpan = document.createElement("span");
  function encodeHTML(text) {
    decoderSpan.textContent = text;
    text = decoderSpan.innerHTML;
    decoderSpan.innerHTML = "";
    return text;
  }
  function decodeHTML(text) {
    decoderSpan.innerHTML = text;
    text = decoderSpan.textContent;
    decoderSpan.innerHTML = "";
    return text;
  }

  function highlightRun() {
    domClass.add(registry.byId("buttonRun").domNode, "highlightToolbarButton");
  }

  function clearRun() {
    domClass.remove(
      registry.byId("buttonRun").domNode,
      "highlightToolbarButton"
    );
  }

  function openDocTab(title, link) {
    if (!defined(docTabs[title])) {
      docTabs[title] = new ContentPane({
        title: title,
        focused: true,
        content: `<iframe class="fullFrame" src="${link}"></iframe>`,
        closable: true,
        onClose: function () {
          docTabs[this.title] = undefined;
          // Return true to close the tab.
          return true;
        },
      }).placeAt(cesiumContainer);
      // After the iframe loads, re-scroll to selected field.
      docTabs[title].domNode.childNodes[0].onload = function () {
        this.onload = function () {};
        this.src = link;
      };
      cesiumContainer.selectChild(docTabs[title]);
    } else {
      // Tab already exists, but maybe not visible.  Firefox needs the tab to
      // be revealed before a re-scroll can happen.  Chrome works either way.
      cesiumContainer.selectChild(docTabs[title]);
      docTabs[title].domNode.childNodes[0].src = link;
    }
  }

  function showDocPopup() {
    const selectedText = jsEditor.getSelection();
    const lowerText = selectedText.toLowerCase();

    const onDocClick = function () {
      openDocTab(this.textContent, this.href);
      return false;
    };

    docTimer = undefined;
    if (docError && selectedText && selectedText.length < 50) {
      hideGallery();
    } else if (
      lowerText &&
      lowerText in local.docTypes &&
      typeof local.docTypes[lowerText].push === "function"
    ) {
      docMessage.innerHTML = "";
      for (let i = 0, len = local.docTypes[lowerText].length; i < len; ++i) {
        const member = local.docTypes[lowerText][i];
        const ele = document.createElement("a");
        ele.target = "_blank";
        ele.textContent = member
          .replace(".html", "")
          .replace("module-", "")
          .replace("#.", ".")
          .replace("#", ".");
        ele.href = `../../Build/Documentation/${member}`;
        ele.onclick = onDocClick;
        docMessage.appendChild(ele);
      }
      jsEditor.addWidget(jsEditor.getCursor(true), docNode);
      docNode.style.top = `${parseInt(docNode.style.top, 10) - 5}px`;
    }
  }

  function onCursorActivity() {
    docNode.style.left = "-999px";
    if (defined(docTimer)) {
      window.clearTimeout(docTimer);
    }
    docTimer = window.setTimeout(showDocPopup, 500);
  }

  function makeLineLabel(msg, className) {
    const element = document.createElement("abbr");
    element.className = className;
    switch (className) {
      case "hintMarker":
        element.innerHTML = "▲";
        break;
      case "errorMarker":
        element.innerHTML = "×";
        break;
      default:
        element.innerHTML = "▶";
    }
    element.title = msg;
    return element;
  }

  function closeGalleryTooltip() {
    if (defined(activeGalleryTooltipDemo)) {
      popup.close(demoTooltips[activeGalleryTooltipDemo.name]);
      activeGalleryTooltipDemo = undefined;
    }
  }

  function openGalleryTooltip() {
    galleryTooltipTimer = undefined;

    const selectedTabName = registry.byId("innerPanel").selectedChildWidget
      .title;
    let suffix = `${selectedTabName}Demos`;
    if (selectedTabName === "All") {
      suffix = "all";
    } else if (selectedTabName === "Search Results") {
      suffix = "searchDemo";
    }

    if (defined(activeGalleryTooltipDemo)) {
      popup.open({
        popup: demoTooltips[activeGalleryTooltipDemo.name],
        around: dom.byId(activeGalleryTooltipDemo.name + suffix),
        orient: ["above", "below"],
      });
    }
  }

  function scheduleGalleryTooltip(demo) {
    if (demo !== activeGalleryTooltipDemo) {
      activeGalleryTooltipDemo = demo;
      if (defined(galleryTooltipTimer)) {
        window.clearTimeout(galleryTooltipTimer);
      }
      galleryTooltipTimer = window.setTimeout(openGalleryTooltip, 220);
    }
  }

  function scriptLineToEditorLine(line) {
    // editor lines are zero-indexed, plus 3 lines of boilerplate
    return line - 4;
  }

  function clearErrorsAddHints() {
    let line;
    let i;
    let len;
    hintTimer = undefined;
    closeGalleryTooltip();
    jsEditor.clearGutter("hintGutter");
    jsEditor.clearGutter("highlightGutter");
    jsEditor.clearGutter("errorGutter");
    jsEditor.clearGutter("searchGutter");
    while (errorLines.length > 0) {
      line = errorLines.pop();
      jsEditor.removeLineClass(line, "text");
    }
    while (highlightLines.length > 0) {
      line = highlightLines.pop();
      jsEditor.removeLineClass(line, "text");
    }
    const code = jsEditor.getValue();
    if (searchTerm !== "") {
      const codeLines = code.split("\n");
      for (i = 0, len = codeLines.length; i < len; ++i) {
        if (searchRegExp.test(codeLines[i])) {
          line = jsEditor.setGutterMarker(
            i,
            "searchGutter",
            makeLineLabel(`Search: ${searchTerm}`, "searchMarker")
          );
          jsEditor.addLineClass(line, "text", "searchLine");
          errorLines.push(line);
        }
      }
    }
    // make a copy of the options, JSHint modifies the object it's given
    const options = JSON.parse(JSON.stringify(sandcastleJsHintOptions));
    /*eslint-disable new-cap*/
    if (
      !JSHINT(embedInSandcastleTemplate(jsEditor.getValue(), false), options)
    ) {
      const hints = JSHINT.errors;
      for (i = 0, len = hints.length; i < len; ++i) {
        const hint = hints[i];
        if (hint !== null && defined(hint.reason) && hint.line > 0) {
          line = jsEditor.setGutterMarker(
            scriptLineToEditorLine(hint.line),
            "hintGutter",
            makeLineLabel(hint.reason, "hintMarker")
          );
          jsEditor.addLineClass(line, "text", "hintLine");
          errorLines.push(line);
        }
      }
    }
    /*eslint-enable new-cap*/
  }

  function scheduleHint() {
    if (defined(hintTimer)) {
      window.clearTimeout(hintTimer);
    }
    hintTimer = setTimeout(clearErrorsAddHints, 550);
    highlightRun();
  }

  function scheduleHintNoChange() {
    if (defined(hintTimer)) {
      window.clearTimeout(hintTimer);
    }
    hintTimer = setTimeout(clearErrorsAddHints, 550);
  }

  function scrollToLine(lineNumber) {
    if (defined(lineNumber)) {
      jsEditor.setCursor(lineNumber);
      // set selection twice in order to force the editor to scroll
      // to this location if the cursor is already there
      jsEditor.setSelection(
        {
          line: lineNumber - 1,
          ch: 0,
        },
        {
          line: lineNumber - 1,
          ch: 0,
        }
      );
      jsEditor.focus();
      jsEditor.setSelection(
        {
          line: lineNumber,
          ch: 0,
        },
        {
          line: lineNumber,
          ch: 0,
        }
      );
    }
  }

  function highlightLine(lineNum) {
    let line;
    jsEditor.clearGutter("highlightGutter");
    while (highlightLines.length > 0) {
      line = highlightLines.pop();
      jsEditor.removeLineClass(line, "text");
    }
    if (lineNum > 0) {
      lineNum = scriptLineToEditorLine(lineNum);
      line = jsEditor.setGutterMarker(
        lineNum,
        "highlightGutter",
        makeLineLabel("highlighted by demo", "highlightMarker")
      );
      jsEditor.addLineClass(line, "text", "highlightLine");
      highlightLines.push(line);
      scrollToLine(lineNum);
    }
  }

  const tabs = registry.byId("bottomPanel");

  function showGallery() {
    tabs.selectChild(registry.byId("innerPanel"));
  }

  function hideGallery() {
    closeGalleryTooltip();
    tabs.selectChild(registry.byId("logContainer"));
  }

  tabs.watch("selectedChildWidget", function (name, oldValue, newValue) {
    if (newValue === registry.byId("logContainer")) {
      numberOfNewConsoleMessages = 0;
      registry.byId("logContainer").set("title", "Console");
    }
  });

  function registerScroll(demoContainer) {
    if (document.onmousewheel !== undefined) {
      demoContainer.addEventListener(
        "mousewheel",
        function (e) {
          if (defined(e.wheelDelta) && e.wheelDelta) {
            demoContainer.scrollLeft -= (e.wheelDelta * 70) / 120;
          }
        },
        false
      );
    } else {
      demoContainer.addEventListener(
        "DOMMouseScroll",
        function (e) {
          if (defined(e.detail) && e.detail) {
            demoContainer.scrollLeft += (e.detail * 70) / 3;
          }
        },
        false
      );
    }
  }

  CodeMirror.commands.runCesium = function (cm) {
    clearErrorsAddHints();
    clearRun();
    cesiumContainer.selectChild(bucketPane);
    // Check for a race condition in some browsers where the iframe hasn't loaded yet.
    if (bucketFrame.contentWindow.location.href.indexOf("bucket.html") > 0) {
      bucketFrame.contentWindow.location.reload();
    }
  };

  jsEditor = CodeMirror.fromTextArea(document.getElementById("code"), {
    mode: "javascript",
    gutters: ["hintGutter", "errorGutter", "searchGutter", "highlightGutter"],
    lineNumbers: true,
    matchBrackets: true,
    indentUnit: 2,
    viewportMargin: 1300,
    extraKeys: {
      "Ctrl-Space": "autocomplete",
      F8: "runCesium",
      Tab: "indentMore",
      "Shift-Tab": "indentLess",
    },
  });

  jsEditor.on("cursorActivity", onCursorActivity);
  jsEditor.on("change", scheduleHint);

  const htmlEditor = CodeMirror.fromTextArea(
    document.getElementById("htmlBody"),
    {
      mode: "text/html",
      lineNumbers: true,
      matchBrackets: true,
      indentUnit: 2,
      viewportMargin: 1300,
      extraKeys: {
        F8: "runCesium",
        Tab: "indentMore",
        "Shift-Tab": "indentLess",
      },
    }
  );

  window.onbeforeunload = function (e) {
    const htmlText = htmlEditor.getValue().replace(/\s/g, "");
    const jsText = jsEditor.getValue().replace(/\s/g, "");
    if (demoHtml !== htmlText || demoCode !== jsText) {
      return "Be sure to save a copy of any important edits before leaving this page.";
    }
  };

  registry
    .byId("codeContainer")
    .watch("selectedChildWidget", function (name, oldPane, newPane) {
      if (newPane.id === "jsContainer") {
        jsEditor.focus();
      } else if (newPane.id === "htmlContainer") {
        htmlEditor.focus();
      }
    });

  const scriptCodeRegex = /\/\/Sandcastle_Begin\s*([\s\S]*)\/\/Sandcastle_End/;

  function activateBucketScripts(bucketDoc) {
    const headNodes = bucketDoc.head.childNodes;
    let node;
    const nodes = [];
    let i, len;
    for (i = 0, len = headNodes.length; i < len; ++i) {
      node = headNodes[i];
      // header is included in blank frame.
      if (
        node.tagName === "SCRIPT" &&
        node.src.indexOf("Sandcastle-header.js") < 0
      ) {
        nodes.push(node);
      }
    }

    for (i = 0, len = nodes.length; i < len; ++i) {
      bucketDoc.head.removeChild(nodes[i]);
    }

    // Apply user HTML to bucket.
    const htmlElement = bucketDoc.createElement("div");
    htmlElement.innerHTML = htmlEditor.getValue();
    bucketDoc.body.appendChild(htmlElement);

    const onScriptTagError = function () {
      if (bucketFrame.contentDocument === bucketDoc) {
        appendConsole("consoleError", `Error loading ${this.src}`, true);
        appendConsole(
          "consoleError",
          "Make sure Cesium is built, see the Contributor's Guide for details.",
          true
        );
      }
    };

    // Load each script after the previous one has loaded.
    const loadScript = function () {
      if (bucketFrame.contentDocument !== bucketDoc) {
        // A newer reload has happened, abort this.
        return;
      }
      if (nodes.length > 0) {
        while (nodes.length > 0) {
          node = nodes.shift();
          const scriptElement = bucketDoc.createElement("script");
          let hasSrc = false;
          for (
            let j = 0, numAttrs = node.attributes.length;
            j < numAttrs;
            ++j
          ) {
            const name = node.attributes[j].name;
            const val = node.attributes[j].value;
            scriptElement.setAttribute(name, val);
            if (name === "src" && val) {
              hasSrc = true;
            }
          }
          scriptElement.innerHTML = node.innerHTML;
          if (hasSrc) {
            scriptElement.onload = loadScript;
            scriptElement.onerror = onScriptTagError;
            bucketDoc.head.appendChild(scriptElement);
          } else {
            bucketDoc.head.appendChild(scriptElement);
            loadScript();
          }
        }
      } else {
        // Apply user JS to bucket
        const element = bucketDoc.createElement("script");

        // Firefox line numbers are zero-based, not one-based.
        const isFirefox = navigator.userAgent.indexOf("Firefox/") >= 0;

        element.textContent = embedInSandcastleTemplate(
          jsEditor.getValue(),
          isFirefox
        );
        bucketDoc.body.appendChild(element);
      }
    };

    loadScript();
  }

  function applyBucket() {
    if (
      local.emptyBucket &&
      local.bucketName &&
      typeof bucketTypes[local.bucketName] === "string"
    ) {
      bucketWaiting = false;
      const bucketDoc = bucketFrame.contentDocument;
      if (
        local.headers.substring(0, local.emptyBucket.length) !==
        local.emptyBucket
      ) {
        appendConsole(
          "consoleError",
          `Error, first part of ${local.bucketName} must match first part of bucket.html exactly.`,
          true
        );
      } else {
        const bodyAttributes = local.headers.match(/]*?)>/)[1];
        const attributeRegex = /([-a-z_]+)\s*="([^"]*?)"/gi;
        //group 1 attribute name, group 2 attribute value.  Assumes double-quoted attributes.
        let attributeMatch;
        while (
          (attributeMatch = attributeRegex.exec(bodyAttributes)) !== null
        ) {
          const attributeName = attributeMatch[1];
          const attributeValue = attributeMatch[2];
          if (attributeName === "class") {
            bucketDoc.body.className = attributeValue;
          } else {
            bucketDoc.body.setAttribute(attributeName, attributeValue);
          }
        }

        const pos = local.headers.indexOf("");
        const extraHeaders = local.headers.substring(
          local.emptyBucket.length,
          pos
        );
        bucketDoc.head.innerHTML += extraHeaders;
        activateBucketScripts(bucketDoc);
      }
    } else {
      bucketWaiting = true;
    }
  }

  function applyBucketIfWaiting() {
    if (bucketWaiting) {
      applyBucket();
    }
  }

  xhr
    .get({
      url: "templates/bucket.html",
      handleAs: "text",
    })
    .then(function (value) {
      const pos = value.indexOf("");
      local.emptyBucket = value.substring(0, pos);
      applyBucketIfWaiting();
    });

  function loadBucket(bucketName) {
    if (local.bucketName !== bucketName) {
      local.bucketName = bucketName;
      if (defined(bucketTypes[bucketName])) {
        local.headers = bucketTypes[bucketName];
      } else {
        local.headers =
          '';
        xhr
          .get({
            url: `templates/${bucketName}`,
            handleAs: "text",
          })
          .then(function (value) {
            let pos = value.indexOf("", pos);
            bucketTypes[bucketName] = value.substring(0, pos + 1);
            if (local.bucketName === bucketName) {
              local.headers = bucketTypes[bucketName];
            }
            applyBucketIfWaiting();
          });
      }
    }
  }

  let queryObject = {};
  if (window.location.search) {
    queryObject = ioQuery.queryToObject(window.location.search.substring(1));
  }
  if (!defined(queryObject.src)) {
    queryObject.src = `${defaultDemo}.html`;
  }
  if (!defined(queryObject.label)) {
    queryObject.label = defaultLabel;
  }

  function loadFromGallery(demo) {
    deferredLoadError = false;
    document.getElementById("saveAsFile").download = `${demo.name}.html`;
    registry
      .byId("description")
      .set("value", decodeHTML(demo.description).replace(/\\n/g, "\n"));
    registry
      .byId("label")
      .set("value", decodeHTML(demo.label).replace(/\\n/g, "\n"));

    return requestDemo(demo.name).then(function (value) {
      demo.code = value;

      if (typeof demo.bucket === "string") {
        loadBucket(demo.bucket);
      }

      function applyLoadedDemo(code, html) {
        jsEditor.setValue(code);
        jsEditor.clearHistory();
        htmlEditor.setValue(html);
        htmlEditor.clearHistory();
        demoCode = code.replace(/\s/g, "");
        demoHtml = html.replace(/\s/g, "");
        CodeMirror.commands.runCesium(jsEditor);
        clearRun();
      }

      let json, code, html;
      if (defined(queryObject.gist)) {
        dojoscript
          .get(`https://api.github.com/gists/${queryObject.gist}`, {
            jsonp: "callback",
          })
          .then(function (data) {
            const files = data.data.files;
            const code = files["Cesium-Sandcastle.js"].content;
            const htmlFile = files["Cesium-Sandcastle.html"];
            const html = defined(htmlFile) ? htmlFile.content : defaultHtml; // Use the default html for old gists
            applyLoadedDemo(code, html);
          })
          .otherwise(function (error) {
            appendConsole(
              "consoleError",
              `Unable to GET gist from GitHub API. This could be due to too many requests from your IP. Try again in an hour or copy and paste the code from the gist: https://gist.github.com/${queryObject.gist}`,
              true
            );
            console.log(error);
          });
      } else if (defined(queryObject.code)) {
        //The code query parameter is a Base64 encoded JSON string with `code` and `html` properties.
        json = JSON.parse(window.atob(queryObject.code));
        code = json.code;
        html = json.html;

        applyLoadedDemo(code, html);
      } else if (window.location.hash.indexOf("#c=") === 0) {
        const base64String = window.location.hash.substr(3);
        const data = decodeBase64Data(base64String, pako);
        code = data.code;
        html = data.html;

        applyLoadedDemo(code, html);
      } else {
        const parser = new DOMParser();
        const doc = parser.parseFromString(demo.code, "text/html");

        const script = doc.querySelector(
          'script[id="cesium_sandcastle_script"]'
        );
        if (!script) {
          appendConsole(
            "consoleError",
            `Error reading source file: ${demo.name}`,
            true
          );
          return;
        }

        const scriptMatch = scriptCodeRegex.exec(script.textContent);
        if (!scriptMatch) {
          appendConsole(
            "consoleError",
            `Error reading source file: ${demo.name}`,
            true
          );
          return;
        }

        let scriptCode = scriptMatch[1];
        scriptCode = scriptCode.replace(/^ {8}/gm, ""); //Account for Prettier spacing

        let htmlText = "";
        let childIndex = 0;
        let childNode = doc.body.childNodes[childIndex];
        while (
          childIndex < doc.body.childNodes.length &&
          childNode !== script
        ) {
          htmlText +=
            childNode.nodeType === 1
              ? childNode.outerHTML
              : childNode.nodeValue;
          childNode = doc.body.childNodes[++childIndex];
        }
        htmlText = htmlText.replace(/^\s+/, "");

        applyLoadedDemo(scriptCode, htmlText);
      }
    });
  }

  window.addEventListener(
    "popstate",
    function (e) {
      if (e.state && e.state.name && e.state.code) {
        loadFromGallery(e.state);
        document.title = `${e.state.name} - Cesium Sandcastle`;
      }
    },
    false
  );

  window.addEventListener(
    "message",
    function (e) {
      let line;
      // The iframe (bucket.html) sends this message on load.
      // This triggers the code to be injected into the iframe.
      if (e.data === "reload") {
        const bucketDoc = bucketFrame.contentDocument;
        if (!local.bucketName) {
          // Reload fired, bucket not specified yet.
          return;
        }
        if (bucketDoc.body.getAttribute("data-sandcastle-loaded") !== "yes") {
          bucketDoc.body.setAttribute("data-sandcastle-loaded", "yes");
          logOutput.innerHTML = "";
          numberOfNewConsoleMessages = 0;
          registry.byId("logContainer").set("title", "Console");
          // This happens after a Run (F8) reloads bucket.html, to inject the editor code
          // into the iframe, causing the demo to run there.
          applyBucket();
          if (docError) {
            appendConsole(
              "consoleError",
              'Documentation not available.  Please run the "build-docs" build script to generate Cesium documentation.',
              true
            );
            showGallery();
          }
          if (galleryError) {
            appendConsole(
              "consoleError",
              "Error loading gallery, please run the build script.",
              true
            );
          }
          if (deferredLoadError) {
            appendConsole(
              "consoleLog",
              `Unable to load demo named ${queryObject.src.replace(
                ".html",
                ""
              )}. Redirecting to HelloWorld.\n`,
              true
            );
          }
        }
      } else if (defined(e.data.log)) {
        // Console log messages from the iframe display in Sandcastle.
        appendConsole("consoleLog", e.data.log, false);
      } else if (defined(e.data.error)) {
        // Console error messages from the iframe display in Sandcastle
        let errorMsg = e.data.error;
        let lineNumber = e.data.lineNumber;
        if (defined(lineNumber)) {
          errorMsg += " (on line ";

          if (e.data.url) {
            errorMsg += `${lineNumber} of ${e.data.url})`;
          } else {
            lineNumber = scriptLineToEditorLine(lineNumber);
            errorMsg += `${lineNumber + 1})`;
            line = jsEditor.setGutterMarker(
              lineNumber,
              "errorGutter",
              makeLineLabel(e.data.error, "errorMarker")
            );
            jsEditor.addLineClass(line, "text", "errorLine");
            errorLines.push(line);
            scrollToLine(lineNumber);
          }
        }
        appendConsole("consoleError", errorMsg, true);
      } else if (defined(e.data.warn)) {
        // Console warning messages from the iframe display in Sandcastle.
        appendConsole("consoleWarn", e.data.warn, true);
      } else if (defined(e.data.highlight)) {
        // Hovering objects in the embedded Cesium window.
        highlightLine(e.data.highlight);
      }
    },
    true
  );

  registry.byId("jsContainer").on("show", function () {
    suggestButton.set("disabled", false);
    jsEditor.refresh();
  });

  registry.byId("htmlContainer").on("show", function () {
    suggestButton.set("disabled", true);
    htmlEditor.refresh();
  });

  registry.byId("search").on("change", function () {
    searchTerm = this.get("value");
    searchRegExp = new RegExp(searchTerm, "i");
    let numDemosShown = 0;
    if (searchTerm !== "") {
      showSearchContainer();
      const innerPanel = registry.byId("innerPanel");
      innerPanel.selectChild(registry.byId("searchContainer"));
      for (let i = 0; i < gallery_demos.length; i++) {
        const demo = gallery_demos[i];
        const demoName = demo.name;
        if (searchRegExp.test(demoName) || searchRegExp.test(demo.code)) {
          document.getElementById(`${demoName}searchDemo`).style.display =
            "inline-block";
          ++numDemosShown;
        } else {
          document.getElementById(`${demoName}searchDemo`).style.display =
            "none";
        }
      }
    } else {
      hideSearchContainer();
    }

    if (numDemosShown) {
      galleryErrorMsg.style.display = "none";
    } else {
      galleryErrorMsg.style.display = "inline-block";
    }

    showGallery();
    scheduleHintNoChange();
  });

  let searchContainer;

  function hideSearchContainer() {
    if (dom.byId("searchContainer")) {
      const innerPanel = registry.byId("innerPanel");
      innerPanel.removeChild(searchContainer);
    }
  }

  function showSearchContainer() {
    if (!dom.byId("searchContainer")) {
      const innerPanel = registry.byId("innerPanel");
      innerPanel.addChild(searchContainer);
    }
  }

  function getBaseUrl() {
    // omits query string and hash
    return `${location.protocol}//${location.host}${location.pathname}`;
  }

  function makeCompressedBase64String(data) {
    // data stored in the hash as:
    // Base64 encoded, raw DEFLATE compressed JSON array where index 0 is code, index 1 is html
    let jsonString = JSON.stringify(data);
    // we save a few bytes by omitting the leading [" and trailing "] since they are always the same
    jsonString = jsonString.substr(2, jsonString.length - 4);
    let base64String = btoa(
      pako.deflate(jsonString, { raw: true, to: "string", level: 9 })
    );
    base64String = base64String.replace(/\=+$/, ""); // remove padding

    return base64String;
  }

  registry.byId("buttonShareDrop").on("click", function () {
    const code = jsEditor.getValue();
    const html = htmlEditor.getValue();

    const base64String = makeCompressedBase64String([code, html]);

    const shareUrlBox = document.getElementById("shareUrl");
    shareUrlBox.value = `${getBaseUrl()}#c=${base64String}`;
    shareUrlBox.select();
  });

  registry.byId("buttonImport").on("click", function () {
    let gistId = document.getElementById("gistId").value;
    const gistParameter = "&gist=";
    const gistIndex = gistId.indexOf(gistParameter);
    if (gistIndex !== -1) {
      gistId = gistId.substring(gistIndex + gistParameter.length);
    }
    window.location.href = `${getBaseUrl()}?gist=${gistId}`;
  });

  function getPushStateUrl(demo) {
    const obj = {};
    if (demo.name !== defaultDemo) {
      obj.src = `${demo.name}.html`;
    }
    if (currentTab !== defaultLabel) {
      obj.label = currentTab;
    }
    const query = ioQuery.objectToQuery(obj);
    return query === "" ? query : `?${query}`;
  }

  registry.byId("buttonNew").on("click", function () {
    const htmlText = htmlEditor.getValue().replace(/\s/g, "");
    const jsText = jsEditor.getValue().replace(/\s/g, "");
    let confirmChange = true;
    if (demoHtml !== htmlText || demoCode !== jsText) {
      confirmChange = window.confirm(
        "You have unsaved changes. Are you sure you want to navigate away from this demo?"
      );
    }
    if (confirmChange) {
      window.history.pushState(newDemo, newDemo.name, getPushStateUrl(newDemo));
      loadFromGallery(newDemo).then(function () {
        document.title = `${newDemo.name} - Cesium Sandcastle`;
      });
    }
  });
  // Clicking the 'Run' button simply reloads the iframe.
  registry.byId("buttonRun").on("click", function () {
    CodeMirror.commands.runCesium(jsEditor);
  });

  registry.byId("buttonSuggest").on("click", function () {
    CodeMirror.commands.autocomplete(jsEditor);
  });

  function getDemoHtml() {
    return (
      `${
        local.headers
      }\n${htmlEditor.getValue()}\n` +
      `</body>\n` +
      `</html>\n`
    );
  }

  registry.byId("dropDownSaveAs").on("show", function () {
    let currentDemoName = queryObject.src;
    currentDemoName = currentDemoName.replace(".html", "");
    const description = encodeHTML(
      registry.byId("description").get("value").replace(/\n/g, "\\n")
    ).replace(/\"/g, """);
    const label = encodeHTML(
      registry.byId("label").get("value").replace(/\n/g, "\\n")
    ).replace(/\"/g, """);

    let html = getDemoHtml();
    html = html.replace(
      "<title>",
      `<meta name="description" content="${description}">\n    <title>`
    );
    html = html.replace(
      "<title>",
      `<meta name="cesium-sandcastle-labels" content="${label}">\n    <title>`
    );

    const octetBlob = new Blob([html], {
      type: "application/octet-stream",
      endings: "native",
    });
    const octetBlobURL = URL.createObjectURL(octetBlob);
    dom.byId("saveAsFile").href = octetBlobURL;
  });

  registry.byId("buttonNewWindow").on("click", function () {
    //Handle case where demo is in a sub-directory by modifying
    //the demo's HTML to add a base href.
    let baseHref = getBaseUrl();
    const pos = baseHref.lastIndexOf("/");
    baseHref = `${baseHref.substring(0, pos)}/gallery/`;

    const code = jsEditor.getValue();
    const html = htmlEditor.getValue();
    const data = makeCompressedBase64String([code, html, baseHref]);

    let url = getBaseUrl();
    url = `${url.replace("index.html", "")}standalone.html` + `#c=${data}`;

    window.open(url, "_blank");
    window.focus();
  });

  registry.byId("buttonThumbnail").on("change", function (newValue) {
    if (newValue) {
      domClass.add("bucketFrame", "makeThumbnail");
    } else {
      domClass.remove("bucketFrame", "makeThumbnail");
    }
  });

  const demoContainers = query(".demosContainer");
  demoContainers.forEach(function (demoContainer) {
    registerScroll(demoContainer);
  });

  const galleryContainer = registry.byId("innerPanel");
  galleryContainer.demoTileHeightRule = demoTileHeightRule;
  galleryContainer.originalResize = galleryContainer.resize;
  galleryContainer.resize = function (changeSize, resultSize) {
    const newSize = changeSize.h - 88;
    if (newSize < 20) {
      demoTileHeightRule.style.display = "none";
    } else {
      demoTileHeightRule.style.display = "inline";
      demoTileHeightRule.style.height = `${Math.min(newSize, 150)}px`;
    }
    this.originalResize(changeSize, resultSize);
  };

  function requestDemo(name) {
    return xhr.get({
      url: `gallery/${name}.html`,
      handleAs: "text",
      error: function (error) {
        loadFromGallery(gallery_demos[hello_world_index]).then(function () {
          deferredLoadError = true;
        });
      },
    });
  }

  const newInLabel = `New in ${VERSION}`;
  function loadDemoFromFile(demo) {
    return requestDemo(demo.name).then(function (value) {
      // Store the file contents for later searching.
      demo.code = value;

      const parser = new DOMParser();
      const doc = parser.parseFromString(value, "text/html");

      const bucket = doc.body.getAttribute("data-sandcastle-bucket");
      demo.bucket = bucket ? bucket : "bucket-requirejs.html";

      const descriptionMeta = doc.querySelector('meta[name="description"]');
      const description =
        descriptionMeta && descriptionMeta.getAttribute("content");
      demo.description = description ? description : "";

      const labelsMeta = doc.querySelector(
        'meta[name="cesium-sandcastle-labels"]'
      );
      const labels = labelsMeta && labelsMeta.getAttribute("content");
      if (demo.isNew) {
        demo.label = labels ? `${labels},${newInLabel}` : newInLabel;
      } else {
        demo.label = labels ? labels : "";
      }

      // Select the demo to load upon opening based on the query parameter.
      if (defined(queryObject.src)) {
        if (demo.name === queryObject.src.replace(".html", "")) {
          loadFromGallery(demo).then(function () {
            window.history.replaceState(demo, demo.name, getPushStateUrl(demo));
            if (defined(queryObject.gist)) {
              document.title = "Gist Import - Cesium Sandcastle";
            } else {
              document.title = `${demo.name} - Cesium Sandcastle`;
            }
          });
        }
      }

      // Create a tooltip containing the demo's description.
      demoTooltips[demo.name] = new TooltipDialog({
        id: `${demo.name}TooltipDialog`,
        style: "width: 200px; font-size: 12px;",
        content: demo.description.replace(/\\n/g, "
"),
      });

      addFileToTab(demo);
      return demo;
    });
  }

  let loading = true;
  function setSubtab(tabName) {
    currentTab = defined(tabName) && !loading ? tabName : queryObject.label;
    queryObject.label = tabName;
    loading = false;
  }

  function insertSortedById(parentTab, galleryButton) {
    let child;
    for (
      child = parentTab.lastChild;
      child !== null;
      child = child.previousSibling
    ) {
      if (galleryButton.id >= child.id) {
        parentTab.insertBefore(galleryButton, child.nextSibling);
        return;
      }
    }
    parentTab.appendChild(galleryButton);
  }

  function addFileToGallery(demo) {
    const searchDemos = dom.byId("searchDemos");
    insertSortedById(searchDemos, createGalleryButton(demo, "searchDemo"));
    return loadDemoFromFile(demo);
  }

  function onShowCallback() {
    return function () {
      setSubtab(this.title);
    };
  }

  function addFileToTab(demo) {
    if (demo.label !== "") {
      const labels = demo.label.split(",");
      for (let j = 0; j < labels.length; j++) {
        let label = labels[j];
        label = label.trim();
        if (!dom.byId(`${label}Demos`)) {
          const cp = new ContentPane({
            content: `<div id="${label}Container" class="demosContainer"><div class="demos" id="${label}Demos"></div></div>`,
            title: label,
            onShow: onShowCallback(),
          }).placeAt("innerPanel");
          subtabs[label] = cp;
          registerScroll(dom.byId(`${label}Container`));
        }
        const tabName = `${label}Demos`;
        const tab = dom.byId(tabName);
        insertSortedById(tab, createGalleryButton(demo, tabName));
      }
    }
  }

  function createGalleryButton(demo, tabName) {
    let imgSrc = "templates/Gallery_tile.jpg";
    if (defined(demo.img)) {
      imgSrc = `gallery/${demo.img}`;
    }

    const demoLink = document.createElement("a");
    demoLink.id = demo.name + tabName;
    demoLink.className = "linkButton";
    demoLink.href = `gallery/${encodeURIComponent(demo.name)}.html`;

    if (demo.name === "Hello World") {
      newDemo = demo;
    }
    demoLink.onclick = function (e) {
      if (mouse.isMiddle(e)) {
        window.open(`gallery/${demo.name}.html`);
      } else {
        const htmlText = htmlEditor.getValue().replace(/\s/g, "");
        const jsText = jsEditor.getValue().replace(/\s/g, "");
        let confirmChange = true;
        if (demoHtml !== htmlText || demoCode !== jsText) {
          confirmChange = window.confirm(
            "You have unsaved changes. Are you sure you want to navigate away from this demo?"
          );
        }
        if (confirmChange) {
          delete queryObject.gist;
          delete queryObject.code;

          window.history.pushState(demo, demo.name, getPushStateUrl(demo));
          loadFromGallery(demo).then(function () {
            document.title = `${demo.name} - Cesium Sandcastle`;
          });
        }
      }
      e.preventDefault();
    };

    new LinkButton({
      label:
        `<div class="demoTileTitle">${demo.name}</div>` +
        `<img src="${imgSrc}" class="demoTileThumbnail" alt="" onDragStart="return false;" />`,
    }).placeAt(demoLink);

    on(demoLink, "mouseover", function () {
      scheduleGalleryTooltip(demo);
    });

    on(demoLink, "mouseout", function () {
      closeGalleryTooltip();
    });

    return demoLink;
  }

  let promise;
  if (!defined(gallery_demos)) {
    galleryErrorMsg.textContent =
      "No demos found, please run the build script.";
    galleryErrorMsg.style.display = "inline-block";
  } else {
    let label = "Showcases";
    let cp = new ContentPane({
      content:
        '

',
      title: "Showcases",
      onShow: function () {
        setSubtab(this.title);
      },
    }).placeAt("innerPanel");
    subtabs[label] = cp;
    registerScroll(dom.byId("showcasesContainer"));

    if (has_new_gallery_demos) {
      const name = `New in ${VERSION}`;
      subtabs[name] = new ContentPane({
        content: `<div id="${name}Container" class="demosContainer"><div class="demos" id="${name}Demos"></div></div>`,
        title: name,
        onShow: function () {
          setSubtab(this.title);
        },
      }).placeAt("innerPanel");
      registerScroll(dom.byId(`${name}Container`));
    }

    let i;
    const len = gallery_demos.length;

    let queryInGalleryIndex = false;
    const queryName = queryObject.src.replace(".html", "");
    const promises = [];
    for (i = 0; i < len; ++i) {
      promises.push(addFileToGallery(gallery_demos[i]));
    }

    promise = all(promises).then(function (results) {
      const resultsLength = results.length;
      for (i = 0; i < resultsLength; ++i) {
        if (results[i].name === queryName) {
          queryInGalleryIndex = true;
        }
      }

      label = "All";
      cp = new ContentPane({
        content:
          '

',
        title: label,
        onShow: function () {
          setSubtab(this.title);
        },
      }).placeAt("innerPanel");
      subtabs[label] = cp;
      registerScroll(dom.byId("allContainer"));

      const demos = dom.byId("allDemos");
      for (i = 0; i < len; ++i) {
        const demo = gallery_demos[i];
        if (!/Development/i.test(demo.label)) {
          insertSortedById(demos, createGalleryButton(demo, "all"));
        }
      }

      if (!queryInGalleryIndex) {
        const emptyDemo = {
          name: queryName,
          description: "",
        };
        gallery_demos.push(emptyDemo);
        return addFileToGallery(emptyDemo);
      }
    });
  }

  Promise.resolve(promise).then(function () {
    dom.byId("searchDemos").appendChild(galleryErrorMsg);
    searchContainer = registry.byId("searchContainer");

    hideSearchContainer();
    if (defined(subtabs[currentTab])) {
      registry.byId("innerPanel").selectChild(subtabs[currentTab]);
    }
  });
});

redpajama_set_name: RedPajamaGithub


text:
FREE: Alive at Five Announces More Concerts
By Greg Haymes On May 23, 2018
Albany's Alive at Five concert series – which will be held at 5pm on Thursdays at Jennings Landing in the Corning Preserve – continues to dole out band announcements piecemeal for the 2018 summer season. And, of course, the concerts are all FREE.
Here are today's big reveals:
Best known as the guitarist for The Strokes, Albert Hammond, Jr.'s solo career took his music in more eclectic, and more personal, directions. His fourth solo album, Francis Trouble, available now, was created as an homage to the stillborn death of his twin brother.
SIR SLY
Since forming in 2012, Sir Sly have forged their singular sound by drawing upon each member's long-honed musical talents: Landon Jacobs' introspective yet infinitely searching lyricism, Jason Suwito's in-studio ingenuity and Hayden Coplen's sophisticated musicianship and sense of songcraft.
In addition, Mixed Roots have been announced as the opening act for veteran reggae band Third World on Thursday, July 19.
MORE OF THE 2018 ALIVE AT FIVE CONCERT SERIES
June 7: Great White, Joe Mansman & the Midnight Revival Band
June 28: B.B. King Blues Band featuring Tito Jackson, The Age
July 12: Big Daddy Kane, Und3rstanding, DJ Supreme, DJ Trumastr
July 19: Third World, Mixed Roots
July 26: Yonder Mountain String Band
MORE OF TODAY'S NEW CONCERT ANNOUNCEMENTS
NEW CONCERT NEWS
The Egg Announces Another New Concert
MORE OF GREATER NIPPERTOWN'S FREE SUMMER EVENTS FOR 2018
VARIOUS DAYS
BLACK & LATINO GAY PRIDE CELEBRATION @ Washington Park, Albany (Saturday, June 9)
CAPITAL PRIDE FESTIVAL @ Washington Park, Albany (Sunday, June 10)
MORE MUSIC AT MUSIC HAVEN @ Central Park, Schenectady (various days, 7/10-8/19/18)
SCHENECTADY SUMMERNIGHT @ State Street, Schenectady (Friday, July 13)
ROCKIN' ON THE RIVER @ Riverfront Park, Troy (5pm, 6/6-8/8/18
ALIVE AT FIVE @ Jennings Landing, Albany (5pm, 6/7-8/2/18)
CONCERTS AT THE CROSSINGS @ the Crossings of Colonie, Loudonville (6pm, 7/5-8/30/18)
UPBEAT ON THE ROOF CONCERT SERIES @ Skidmore College's Tang Museum, Saratoga Springs (7pm, 7/5-8/30/18)
HARBOR JAM @ Rivers Casino & Resort's Mohawk Harbor Amphitheater, Schenectady (6pm, 6/23-8/11/18)
MUSIC HAVEN @ Central Park, Schenectady (7pm, 7/8-8/12/18)
5/23/18: Today's Top 10 Tips: Wednesday

redpajama_set_name: RedPajamaCommonCrawl


text:
Short Film - Madre
Susan Omand takes the call and watches Rodrigo Sorogoyen's short film Madre (some slight spoilers)...
This short film shows you how little a film-maker needs in the way of lavish locations, action sequences and expensive effects when you have a sharp, intelligent story idea and punchy dialogue delivered by an expert cast to make your film incredibly memorable.
The story is a simple one. A young single mother arrives home to her apartment in Spain with her own mother, when the phone rings. It is her 6-year-old son, who is on holiday with his father in France. After chatting for a few minutes, it transpires that the father is no longer with the boy and the child has, for some unknown reason, been left alone, on an empty beach that he doesn't recognise, in a foreign country. His mobile phone is low on battery, he's on his own and he's petrified.
That's the set up. The fact that we see the story unfold only from the perspective of the young mother, gradually getting more and more frantic but having to sound calm for her son on the phone, is what makes this a richly intense watching experience; any backstory, what happened to the father on this trip, what happens to the boy on the beach, is left entirely up to your own imagination. All you have is this woman, on the phone, to a terrified child. That's why the strength of the writing, the dialogue and its delivery, is vital, because it's the conversations between mother and daughter and mother and son that make this film. Many, many plaudits must go to the small cast of five, even though we only ever see two of them, as all their performances, both on and off screen, are phenomenal. And the directorial choice, whether through artistic reasons or budgetary constraints it matters not, to focus the whole film purely on the apartment gives an added claustrophobia and feeling of enforced limitation to the story which works really well with the subject matter. The icing on the cake though, for me, is that ending. It's brilliant. Completely brilliant. I was left yelling at the screen with both frustration and sheer admiration at what happened and how it was handled.
I do have one tiny criticism of the film but it's purely aesthetic. Whoever decided to "punk up" the credits by making the writing judder, flash and go in and out of focus, obviously didn't take into account that some people actually want to read them without getting a headache. But that's by the bye. If you get the chance to watch this film in full, take it.
Image - Caballo Films


text:
Monday Memo: A Week in Which Streaming Docs Take Charge
by Raphaela Neihausen | Monday, October 10th, 2016
Maybe for the first time since taking over the Monday Memo (over 80 weeks ago now!), the conversation reverberating from the critical community on documentary film this week is overwhelmingly centered around films newly available via streaming platforms (13TH, AMANDA KNOX, AUDRIE & DAISY, and the soon to be released Adam Curtis project HYPERNORMALISATION). Following its world premiere of Ava DuVernay's 13TH at the New York Film Festival on September 30th, the film became available worldwide via Netflix just a just a week later, igniting a firestorm of white hot responses in the press. In reference to 13TH, both Scott Feinberg of The Hollywood Reporter and Kristopher Tapley of Variety asked the question, "Why Not a Documentary for Best Picture?," while others like the Washington Post's Bethonie Butler and Deadline's Pete Hammond lauded the film as "powerful" and "masterful," respectively. Opinions have essentially been unanimously extolling among critics like Nonfics' Daniel Walber, Kenneth Turan of the Los Angeles Times, and The Guardian's Wendy Ide and Charlie Lyne.
As part of the New York Film Festival, 13TH subjects Kevin Gannon, Khalil Gibran Muhammad, Jelani Cobb, Ashley Clark, and Malkia Cyril took part in a panel moderated by Eugene Hernandez, the result of which is now available on the latest episode of The Close-up podcast. the DuVernay herself made the rounds, appearing in conversation with Cara Buckley of The New York Times, Esquire's Corey Atad, Film Comment's Ashley Clark and Juleyka Lantigua-Williams of The Atlantic. Just as DuVernay takes on the US prison system, Sam Barsanti of A.V. Club reports that Jay-Z is producing a six-part documentary series for Spike TV titled TIME: THE KALIEF BROWDER STORY, about the 16-year-old high school kid from New York who was arrested in 2010 for allegedly stealing a backpack and New York's broken criminal justice system. And in the same vein, Anne Thompson list four docs that define the Black Lives Matter movement at IndieWire, while actor and activist Danny Glover shared his six favorite racially conscious documentaries currently streaming with Christopher Campbell of Nonfics.
Stranger Than Fiction, however, remains on the big screen at IFC Center. This week our six film retrospective of the documentary work of Jonathan Demme co-presented by the New York Film Academy continues with THE AGRONOMIST, about the Haitian radio journalist Jean Dominique. Director Jonathan Demme and Radio Haiti-Inter journalist Michele Montas with both be on hand to present the film and participate in a post-screening Q&A. Tickets for the event are available here.
Back on the topic of streaming titles, AMANDA KNOX continues to see its audience grow as its directors, Rod Blackhurst and Brian McGinn, appeared on the latest episode of Pure Nonfiction in conversation with our own Thom Powers. At IndieWire, Anne Thompson delved into the factual particulars of the film, while Variety's Iain Blair parsed out the aural details by speaking with the production's audio team. Michelle Dean, on the other hand, looks at the doc indicts the media, yet "falls into the same ethical quandaries as SERIAL and MAKING A MURDERER" for New Republic. Bonni Cohen, co-director of the Netflix doc AUDRIE AND DAISY, spoke with Christopher Llewellyn Reed for Hammer to Nail, while Tim Adams previewed Adam Curtis' new film HYPERNORMALISATION will have its premiere on BBC iPlayer at 9 pm on October 16th. Gothamist contributor David Colon composed a list of best political docs currently streaming.
Streaming titles may have been the hot topic this week, but there was still a trickle of festival news flowing through over at IDA's blog in the form of Marc Glassman's realization that TIFF had a record number of docs in their lineup this year – 57 titles in total. A handful of reviews of TIFF titles made it to press this past week as well, including Matthew Eng's take on ABACUS: SMALL ENOUGH TO JAIL at Little White Lies, Stuart Klawans' rumination on FIRE AT SEA in Film Comment, my review of JT + THE TENNESSEE KIDS at IONCINEMA, and Liz Nord's feature on THE CINEMA TRAVELLERS over at No Film School. VOYAGE OF TIME also turned up at Doc Soup via Tom Roston and RogerEbert.com thanks to Simon Abrams. And while TIFF is still lingering in the air and NYFF is wrapping up, Basil Tsiokos previewed the doc offerings at the the 24th edition of the Hamptons International Film Festival and the 60th BFI London Film Festival over at What (not) To Doc, while Max Carpenter reflected on this year's Camden International Film Festival at Hyperallergic and Pat Aufderheide pondered the takeaways from Getting Real '16 via the Center For Media & Social Impact.
Surprisingly, the only theatrically released doc to gain any kind of critical traction this past week was Kim A. Snyder's devastating NEWTOWN, having gleaned positive coverage from IndieWire's Matt Brennan, Neil Genzlinger of The New York Times and RogerEbert.com's Matt Zoller Seitz.
Filmmakers still have a chance to sign up for UnionDocs' Images, Sound and Rhythm in Documentary masterclass with David Teague, T. Griffin and Nathan Halpern currently scheduled for Saturday, October 22nd, as well as submit an application to Chicken & Egg Pics' 2017 Accelerator Lab, which opens for submissions tomorrow. And those still trying to sort out the best means of distribution for your projects might want to read Anthony Kaufman's new piece on digital distribution at Filmmaker Magazine.
Signing off this week, I'll leave you with Nick Pinkerton's incisive Film Comment article on the state of film criticism in the era of social media, and its complimentary Film Comment podcast discussion. Until next week, if you have any tips or recommendations for the Memo in the meantime, please contact me via email here, or on Twitter, @Rectangular_Eye.
Tags: 13TH, Adam Curtis, AMANDA KNOX, AUDRIE & DAISY, Ava DuVernay, HYPERNORMALISATION, Jordan M. Smith, Monday Memo


These foxes will warm your heart with their happiness and gratefulness. We adore these 6"x6" boxed framed canvas artwork that works beautifully in a small space on a wall or resting on a shelf. And it must be said, they look super cute together!


iam8bit gives Uncharted: The Nathan Drake Collection the soundtrack set it deserves featuring the music of Greg Edmonson and artwork by W$YK .
Drake is finally coming to vinyl… Nathan Drake that is!
iam8bit, PlayStation, and Naughty Dog are excited to announce that Greg Edmonson'sbeautifully composed scores for the first three Uncharted games are coming to vinyl as part of anUncharted: The Nathan Drake Collection3xLP box set!
We teamed up with the always incredible We Buy Your Kids to design a visually striking vinyl package that incorporates some of our favorite moments and artifacts from the the first three Uncharted games.
These soundtracks have been specifically mastered for vinyl by Telegraph Mastering Studio, and we can't wait for you to hear them like this!
Also available is Uncharted Poster Print from iambit available as a poster or giclée art print limited to just 300.
Pre-orders for the both the Uncharted vinyl soundtrack set and print are now up on iam8bit with orders expected to ship within the first quarter of 2016.


Ryan Leak, pastor and filmmaker from Dallas, TX shares how we can be for our community with one simple question we can start asking those around us on a regular basis. As he reveals a shocking statistic about the miracles of Jesus, we can learn how to be "for" our community and provide ways for our churches to have more content when they leave home.
Join SALT University monthly or annually to enjoy this class!


WEST SILOAM SPRINGS, Okla. (KFSM) — Cherokee Nation Businesses contributed $26,000 to the West Siloam Springs Police Department to help replace the department's outdated communication system.
The department's radios, which haven't been updated or replaced in several years, restricted officers' communication with surrounding law enforcement agencies and other first responders.
"We take great pride in our role as an outstanding community partner," said Shawn Slaton, CEO of Cherokee Nation Businesses.
The new radio system will benefit the town of West Siloam Springs, as well as the surrounding area.
The improved communication capabilities will allow the department to increase its response times and will create a safer working environment for all first responders working or assisting in the surrounding area.
"I would like to thank Cherokee Nation for their most generous donation to the West Siloam Springs Police Department," said Police Chief Larry Barnett.
The tribe and its businesses, including Cherokee Nation Entertainment, CNB's gaming and hospitality arm that operates the Cherokee Casino & Hotel West Siloam Springs, are positive community partners throughout northeast Oklahoma.
The company previously partnered with the town of West Siloam Springs to build a 500,000-gallon water tower and placed more than a mile of water line, allowing its public works department to better serve customers.
Cherokee Nation leaders, as well as executives with CNB and CNE, recently presented Chief Barnett with a check at the West Siloam Springs Police headquarters.


Alana Haim has invited Damon Albarn to collaborate with her and her sisters.
Speaking to the Daily Star, the keyboardist said that Haim, who won the Best International Band prize at the NME Awards 2014 with Austin, Texas earlier this week (February 26), would be keen to work with the Blur and Gorillaz man in the future.
Other big winners at this week's ceremony, which was held at Brixton O2 Academy, included Blondie, Damon Albarn and Lily Allen. Performances came from The Horrors and Drenge plus Metronomy, who opened the show by performing 'Love Letters', from their forthcoming new album of the same name, with MKS. Belle & Sebastian played 'I Want The World To Stop' and 'The Boy With The Arab Strap'.
Arctic Monkeys dominated the NME Awards 2014 with Austin, Texas, however, picking up five awards including Best British Band, Best Live Band and Best Album for 'AM'.
To watch a video interview with Haim discussing meeting Paul McCartney at the NME Awards 2014 with Austin, Texas, click above.


text:
Hezbollah Members Launch Beirut Drug Crackdown
Avinash Tharoor
Hezbollah members preparing for drug raids on March 31 (Source: Twitter)
Dozens of Hezbollah members have taken part in "spontaneous" drug raids in a southern Beirut suburb, but their reasons for doing so are unclear.
Hezbollah is a political party and militant group which maintains significant influence in certain parts of Lebanon, including southern Beirut. It has been referred to as a "state within a state" as it provides social services and amenities – including "policing and judicial activities" – to people in areas it controls. However, it has also been deemed a "terrorist organisation" by several countries, including the US, due to its military wing's conflict with neighbouring Israel – which began during the Israeli occupation of South Lebanon in the 1980s.
On the night of March 31, dozens of armed and masked Hezbollah members in the Beirut municipality of Burj al-Barajneh launched a crackdown on people involved with drugs. According to regional press, the men, dressed in all black, raided warehouses where drugs were being stored, and held people who were allegedly selling or using drugs.
Ali Ammar, a Hezbollah MP in the Lebanese Parliament, claimed that the move was a "spontaneous practice ... [and] display of power" that was undertaken without permission from Hezbollah's chain of command, Al-Arabiya reports.
This raises the question of why these individuals took part in the raids, as they were supposedly not approved by either the national government or Hezbollah; they were vigilante acts committed without legal authority.
Some Burj al-Barajneh residents claim that the drug raids were welcomed by the community, and that they may have been undertaken as a response to locals' frustration with people who sell drugs.
"I wish it happened before," said Hussein Shmeis, a local shopkeeper, "Maybe it was a message for the drug traders - telling them to stop going so far, because [Hezbollah] are on the ground like the Army".
Another local man claimed that local residents had directly petitioned Hezbollah members to clamp down on drug dealing and associated crimes because "the people in Burj al-Barajneh have had enough", the Daily Star, Lebanon's main English-language newspaper, reports.
While it may indeed be the case that local residents called on Hezbollah members to crackdown on the illicit drug trade, the raids may also have been an act of defiance against the Lebanese state – with which Hezbollah has had an unstable relationship.
The move may have been a message to the national government from certain Hezbollah members; a demonstration that they have the power and self-designated authority to take serious policy implementation matters into their own hands. Simultaneously, the Hezbollah members who participated in the raid may have been attempting to instil a notion amongst the public that Hezbollah could succeed where the state fails – as some Burj al-Barajneh residents perceive the state to have been ineffective at addressing drug trafficking,
Indeed, the move prompted anger from state authorities. The Interior Minister, Nouhad Machnouk, denounced the raids - describing them as "a slap in the face of the new presidential term and a challenge to the logic of the state" in a tweet.
"We will take the measures that the law imposes to prevent all ideas of self-security, which are rejected by all Lebanese," he added.
There may be a more clandestine reason for why Hezbollah members took part in the raids; rather than cracking down on drugs in a supposed bid to prevent drug use, the raids may have been part of a wider turf war over the sale of drugs.
Hezbollah has been accused by various US officials, including the Drug Enforcement Administration, of involvement with the illegal trade of fenethylline – commonly referred to by brand-name Captagon.
Additionally, there has been a surge in cannabis production in Lebanon since the outbreak of the civil war in neighbouring Syria, partly due to overstretched security forces' lack of resources. While there is no definitive evidence that Hezbollah is cultivating cannabis, the prime region for the drug's production is the fertile Bekaa Valley, a Hezbollah stronghold.
Hezbollah members' drug crackdown may, therefore, have been part of a power play between rival trafficking groups, rather than the anti-narcotic measure it was presented as. Thus far, there are no reports of what happened to the seized drugs, nor the fate of the people captured in the raids
It remains unclear why members of this secretive group undertook drug raids in March, but it is worth noting that there may be more to the Hezbollah members' actions than a desire for drug prohibition.
29 countries. 49 models of drug decriminalisation. One handy web-tool.
Report: Global Drug Trafficking Market Worth Half a Trillion Dollars
Revealing Trends in Russia's Dark-Web Drug Markets
The routes of cocaine
Sign up to receive the TalkingDrugs newsletter (in English) once every two months
Drugs & Development
Drugs & Race
Women & Drugs
Americas & the Caribbean
EECA


Browse our latest Vauxhall Astra 19 Cdti 16v Sri Cambelt Change ideas in our gallery. All the best tips and trends for Vauxhall Astra 19 Cdti 16v Sri Cambelt Change. Get the latest photos and reviews from the editors of our blog.


text:
Gilbert Italia Gapay (born February 4, 1965) is a retired Philippine Army general who served as the 54th Chief of Staff of the Armed Forces of the Philippines. Prior to his appointment, he served as the 61st Chief of the Army and the commander of the Armor "Pambato" Division.

Early life and education
He was born at La Paz, Tarlac on February 4, 1965, and finished high school at the Ateneo de Manila University (ADMU). He initially entered the Philippine Military Academy (PMA) in 1981, but was subsequently rejected due to being under-aged. He spent a year at the ADMU studying Bachelor of Business Management, before he successfully entered the PMA in 1982 and is a member of the Sinagtala Class of 1986. He graduated at the top of his class (Class Valedictorian), and was awarded 13 awards during his graduation in the military academy, making him the most decorated cadet in the history of the PMA. A record tied to Cadet Eckwood Solomon of Florida, USA, who also graduated in the PMA in 1963 and received 13 awards. Solomon was killed in action (KIA) in Vietnam in 1966 as a young lieutenant in a mine-clearing operation during the Vietnam War.

He is known to be a bright, articulate and a man of action due to his academic achievements. He also completed various training and activities locally and abroad, such as the Scout Ranger Orientation Course, the Basic Aviators Course, Armor Officer Basic Course; the Air Traffic Control Officer Course at the Air University, the Comptroller Officer Basic Course; the Armor Officer Advance Course and Command and General Staff Course at the Armed Forces of the Philippines Command and General Staff College, the Emergency Management Seminar with the Australian Defence Force in Australia, and the Chemical, Biological, Radioactive, and Nuclear (CBRN) Training Seminar at the Canadian Nuclear Safety Commission in Canada. He also holds a Master of Management at the Philippine Christian University in Manila.

Military career
He began his career in the 26th Infantry Battalion, of the 4th Infantry Division, and also led troops during communist insurgents in 1988 at the Agusan Provinces. He also led the 52nd Mechanized Infantry Company of the Light Armor Brigade during the Battle of Camp Abubakar as part of the "All Out War" Operations against the MILF in 2000. He also led the 3rd Mechanized Infantry Battalion on combating communist insurgents in Central Luzon.

He was also a member of a team of AFP Officers under then-AFP Chief General Emmanuel T. Bautista, where he helped conceptualize the Internal Peace and Security Plan "Bayanihan Operations" concept (ISSP), where he made major contributions on combating counterinsurgency through local dialogues, and creating more peaceful communities that allows the AFP and former rebels contribute to the overall local development in the country. He also applied the ISSP Doctrine against communist groups due to the creation of the National Task Force to End Local Communist Armed Conflict.

He commanded various units in the Philippine Army and other AFP units deployed in major areas in Luzon and in Mindanao, primarily specialized in infantry and mechanized cavalry operations. He also led diverse units and was assigned to different areas in the AFP, such as in intelligence, education and training, civil and military operations and joint operations. He became deputy commander of the Eastern Mindanao Command (EastMinCom), based in Davao City; commander of Joint Task Force Haribon which secured Davao City and the rest of Davao region during the 2016 Davao City bombing, and also became the military spokesperson of the martial law implementation in Mindanao. He also served as the Chief of Staff of the Philippine Army in 2016, where he earned his second star (Major General), and commanded the Armor "Pambato" Division (formerly the Mechanized Infantry Division) in 2017. As commander of the Armor Division, he spearheaded the modernization of the army's armor and aviation units, and laid out future acquisition programs for the army's new assets, such as the conversion of 5 M113A2 APCs to self-propelled mortar systems equipped with the Cardom system, and the procurement of the army's Elbit UAVs, and upcoming armor and aviation assets.

He became commander of the Southern Luzon Command (SoLCom) in January 2019, where he earned his third star (Lieutenant General).He was also responsible in the successful launching of the Philippine chairmanship of the ASEAN in Davao City and the successful conduct of high-level ASEAN meetings and major international events. Noteworthy was the "zero incident" of terrorism during his tenure. He also oversaw the 2019 Balikatan exercises as the country's exercise director.

On December 6, 2019, he was named as the new Commanding General of the Philippine Army, where he replaced his classmate, Lieutenant General Macairog Alberto, after reaching his mandatory retirement age at 56. As Chief of the Philippine Army, he oversaw all army operations amidst the COVID-19 Pandemic and spearheaded the army's modernization programs, which delayed and limited the other acquisition programs that were laid out by the Army. Nevertheless, the Army still procured  new and modern assets that is set to upgrade the army's capabilities, such as the GDELS ASCOD Sabrah light tanks, which also includes an armored command vehicle, and an armored recovery vehicle; the Excalibur Army Pandur II tank destroyers and command vehicles, and the Iveco VBTP APCS.

On July 29, 2020, he was named as the new Chairman of the Joint Chiefs, the highest post in the AFP, and took helm on his post on August 3, 2020, replacing his classmate Felimon Santos Jr. Gapay is the 54th AFP Chief of Staff, and the 8th under Duterte's administration since 2016. He earned his fourth star, and was promoted to the rank of General on October 7, 2020. He retired from military service oon February 4, 2021, after reaching the mandatory military retirement age of 56. He was replaced by the Chief of the Philippine Army and Medal of Valor awardee, Lieutenant General Cirilito Sobejana.

Awards and decorations
Left Side:

Right Side:

Badges and Other Awards:
  Scout Ranger Qualification Badge
  AFP Command and General Staff Course Badge
  Special Forces Qualification Badge
  Army Aviation Badge
  AFP Parachutist Badge

Personal life
He has 3 children from his first marriage to the late Stella V. Gapay and 2 children from his second marriage to Virginia R. Gapay.

References

1966 births
Living people
Philippine Army
Philippine Army generals
Chairmen of the Joint Chiefs (Philippines)
People from Manila
Philippine Military Academy alumni
Philippine Christian University alumni
Duterte administration personnel
Philippine Military Academy Class of 1986
Recipients of the Distinguished Service Star
Recipients of the Gold Cross (Philippines)
Recipients of the Military Merit Medal (Philippines)
Recipients of the Philippine Republic Presidential Unit Citation
Recipients of the Philippine Legion of Honor
Recipients of the Outstanding Achievement Medal
Recipients of the Military Civic Action Medal
Recipients of the Military Commendation Medal
Recipients of the Silver Wing Medal

redpajama_set_name: RedPajamaWikipedia


It can be difficult to empathize with a loved one who has hearing loss, especially when your own hearing has no problems. This is why some audiologists can help you step into the shoes of the hearing impaired individual by playing a recording that imitates the hearing experience of the person with hearing loss. This can help you understand what your hearing impaired loved one is going through.
Audiologists can also discuss the various types of hearing devices and why a specific device was chosen for your loved one. Even though there are times when relatives with good intentions bring up the idea of opting for other types of "better" hearing devices when they come across an advertisement, the conversation with the audiologist can help them understand why certain devices may be unsuitable for your loved one's particular hearing loss.
Your loved one can also undergo aural rehabilitation to help equip them with strategies to improve their efficiency of communication as well as working on their listening skills. People who obtain cochlear implants or new hearing devices can encounter long-forgotten sounds that can be overwhelming. These rehabilitation services can help you reacquaint your loved one with the noisy world that we currently live in and help them develop new types of listening abilities.
Other methods such as assistive listening devices like the ones located within televisions, telephones, conference microphones, or personal FM systems can help your loved one gain additional tools to improve their hearing.
Your loved one does not need to depend only on their hearing to communicate. You can also use visual cues to emphasize what is being said. The use of body language, facial expressions, posture and proximity can provide additional clues about the context and tone of the conversation. Your loved one can thereby compensate for their lack of hearing through the use of their eyes.
Hearing impaired individuals can also benefit from speech-reading training that is geared at providing formal instructions regarding the way in which sounds are formulated and what they visually look like on the speaker's lips. This helps a hearing impaired individual distinguish words through lip-reading and enables them to decipher what is being said in a conversation.
When communicating with a loved one with hearing loss, it is primarily important to gain their attention before you say anything to them. It is also important not to yell at them or keep repeating the same thing if you can make out that they can't hear you either way, since this adds to frustration from both sides. Instead, you can try rephrasing what you are trying to say using different words that are easier to understand. Face the hearing impaired person directly and make sure you make eye contact with them before communicating. You can use hand gestures and/or facial expressions to help emphasize what you are attempting to say.
It may be time to rearrange some of the furniture in your home to accommodate your hearing impaired loved one. If certain furniture leaves them with your back turned towards you, it is obvious that effective communication will not be taking place. Make sure that the furniture is arranged in a manner that facilitates conversation and enable each speaker to have a full facial view at all times. You may also choose to change the lighting to provide clearer visual abilities, and you can also add a carpet since they can absorb distracting noise such as the shuffling of feet. Adding a visual alerting device can also help alert your loved one when someone rings the doorbell.
At restaurants you can request your server to provide you and your hearing impaired loved one with a table that is located far from the restaurant kitchen. Make sure you face your hearing impaired loved one directly so sit opposite them at the table to help maximize the flow of conversation.
Proximity can play a factor in maximizing audibility, so attempt to locate yourself between 3-6 feet of the person with hearing loss when you are having a conversation with them. Enunciating your words clearly and slowly can also help facilitate easy conversation. Use fewer words and keep your statements brief and simple when communicating. Refrain from speaking into the ear of the hearing impaired individual since this tends to detract from any visual cues and can further distort speech. Maintaining a positive approach when dealing with your hearing impaired loved one can go a long way in helping them feel at ease and also help you bond with them at a deeper level.


Your donation to STAR✦PAC is an investment in peace action. Our troops and their families have given so much for us and now they need your support. Help us increase our credibility and influence our legislators to keep our soldiers safe.


Summer Gingham is no longer just for picnic tables. I have been wearing gingham on repeat lately! I cannot get enough of this trend! This look is so cute for you to rock this trend for the Fourth of July or just anytime this summer! The best part is this skirt is non-maternity! Don't worry, I'm definitely getting to the point where I'm going to ONLY be able to wear maternity clothing. I think I might have one photo shoot left of non-maternity clothes, but after that… eeeee…. I'm not sure!
If you haven't purchased a basket bag yet, why? You NEED one. I have two now and I wear them all the time! They are neutral and I've found some affordable ones like this Basket Bag and this one that is only ($25!) I also found this clutch on sale, too!
We are so looking for another productive weekend! I believe the nesting phase is starting. However, I don't think it's the nesting that happens RIGHT before the baby is born, but it's time to get stuff done. The kitchen still needs some final touches and then I'll need to decorate. I plan on doing a big reveal post probably in early Fall. (Which isn't that far away, believe it or not!) We have the painter coming this week and I have to make a decision on Baby P's nursery. I HAVE to. I'm going crazy right now over it. You would think the nursery would have been easier than picking the name!
Be sure to check out these other gingham looks!
Shop Lace Up Dresses, White Sleeveless Blouse, Black Chokers, Grey Leggings and more. Get this widget.


What are the Pictures That You Should Avoid Uploading As Your Linkedin Profile DP?
Social networking sites are one of the best platforms that entrepreneurs can use when they are looking to market and advertise their business online. There are various social marketing tools that are available these days. Among them, the most famous ones are facebook, twitter, Instagram, and LinkedIn. However, there are many entrepreneurs who cannot use these social networking platforms efficiently and as a result they are unable to launch a successful marketing campaign.
It is very important to know that you will have to plan and strategize individually for every social networking platform. Yes, this is the secret key to success. Thus, it is certainly your first step to prepare an effective plan. You can prepare the plans all by yourself or you can certainly take it to a professional web developer. These days, preparing an effective social networking plan all by yourself is certainly possible as you can gather valuable information from the Internet.
Today, you will get to know how to prepare a perfect plan for posting the right profile picture for LinkedIn. Yes, the profile picture definitely play a vital role is displaying your personality, appearance, your dedication and seriousness towards work. You must not forget that you are trying to gather business clients and advisors with the help of the LinkedIn platform. So, what types of pictures should you avoid posting on your LinkedIn profile?
Do not upload a picture that is old and outdated. This will certainly create a negative impression in the mind of the people. Thus, if you have an old picture then it is time for you to click a new one. Putting up a new picture will help you to display your personal brand and also your companies.
It is certainly not a bad idea to display your informal look in your personal social networking accounts, but it is certainly a bad idea to display this look in a professional social networking profile that you are maintaining. Many of you have the belief of work hard and party harder, but avoid it when you are interacting within the professional territory. Always remember anything that you display that is not related to work context will elementarily send out a wrong message.
Make sure the picture that you are looking to upload in your LinkedIn profile has got enough light effects. It is certainly a good choice to have natural lighting so that you are able to eliminate unwanted shadows from your face. If you are unable to do it all by yourself then certainly hire the services of a professional photographer.
It is important to display to your clients and associates that are connected to your LinkedIn profile that you are a genuine human being. Uploading a picture having a frown look will certainly display a very wrong message. So, do avoid the cheeky Frown look as a profile picture.
Most of you are caring and lovable towards your pets. However, it is important to know that you are using the LinkedIn profile for sending out a professional message. Thus, having your profile picture with your pet can certainly puncture your professional reputation.


"Emotionally gratifying, it dramatically only crawls along with so many actionless scenes."
Based on Sinclair Lewis' 1925 Pulitzer Prize-winning novel. Lewis saw the film and reportedly was satisfied with it. This story of a dedicated medical researcher trying to find a cure for bubonic plague who is conflicted if his motives are either steeped in self-glory or for humanitarian reasons has been adapted to the screen by playwright Sidney Howard. The black-and-white film is given a shadowy expressionistic F. W. Murnau treatment by director John Ford ("The Searchers"/ "The Long Voyage Home"/"The Grapes of Wrath"). This is not a great film, too patchy, even though the prestigious film was nominated for four Oscars, including Best Picture.
As a gifted medical student Martin Arrowsmith (Ronald Colman) turns down a chance to do research at the McGurk Institute in New York with the noted Professor Max Gottlieb (A.E. Anson) because he wants to marry his sweetheart Leora Tozer (Helen Hayes), a nurse. After opening up a practice the restless doctor forsakes his dream to be a simple country doctor in his rural Minnesota hometown and takes a job with Gottlieb at the research institute, which he thinks is better suited to his inquisitive nature. He does so after he develops a serum for a fatal cow disease and was influenced by the touring Swedish lecturer Gustav Sondelius (Richard Bennett).
At the McGurk, Arrowsmith's pioneering methods bring him welcomed attention. This allows him the opportunity to travel to the West Indies to test out his new serum for the bubonic plague. But he finds undue resistance to his experimental treatment from the white expatriates there who refuse to be inoculated as guinea pigs. Instead he flees with the help of black doctor Oliver Marchand (Clarence Brooks), Harvard-educated, to an isolated island where he gets a chance to inoculate its indigenous population and have an affair with the married Joyce Lanyon (Myrna Loy) who was stuck there because of the quarantine. Leora accompanies him to the contagious area and tragically contacts the disease, leaving him guilt-stricken because she dies alone.
Though it has a few stirring moments and is always dignified in its nobility, it's too chatty and dull. Undoubtedly emotionally gratifying, it dramatically only crawls along with so many actionless scenes. This 108 minute version restores from the cut 89 minute version the role of Myrna Loy as the temptress. Hayes, known as the First Lady of the American Theater, dramatically cuts into the acting honors from the stalwart Colman with her endearing folksy performance.


text:
Q: Error when building for Release: "Manifest references file 'MyProject.exe' which is not part of the payload." I'm having this error when I'm trying to create a Release Build for "MyProject":

Manifest references file 'MyProject.exe' which is not part of the payload.

The error is in Package.appxmanifest file. I don't understand how manifest can reference target executable. It makes no sense at all.
I have no problems in Debug mode. I tried building sample projects i.e UWP app samples in Github in Release and it builds with no error.

redpajama_set_name: RedPajamaStackExchange


Content and product recommendations tools are working through a very limited amount of data, that often segment users into inaccurate groups. The analysis is carried out by manually tracking data and adjusting recommendations accordingly. An irrelevant product or content recommendation is not only a waste of time, it can also have a negative impact on your customers' decision making process which is costly to your business.
Recent trends have shown the potential of machine learning and data science in changing the way businesses interact with their customers, In fact, AI recommender systems have become successful and widely used tools to engage customers. These AI recommender engines take care of the most heavy lifting tasks: to find, extract, sort and make sense of the data, then matching the results with your customers profiles to serve relevant products or content based on real-time online behaviours.
Our experienced data scientists will hand pick the best models for your industry. Working through the existing data you have, to unearth valuable insights. From this, we can see any gaps, and requirements for other external data sources that we gather via our powerful Skim Engine. The more data you have the more accurate your models, and the greater your success. Our managed service model supports you through every stage from MVP to Production and beyond. Get in touch to speak with a data expert today.


text:
abortion health care michele bachmann pt like gandhi or whatever town halls wingnuts
Bachmann Now Ordering People To Starve Themselves
Jim Newell
Bachmann. She got on some conference call last week with 350,000 people, to tell them Facts. Here's the gist, of it, according to the Minnesota Independent: "In response to a caller from Minnesota who wanted to know if there was a plan afoot in Washington to require all medical doctors to perform abortions, Bachmann didn't exactly shoot the suggestion down." But here was her most urgent message for these people about health care reform: "That's really where this battle will be won — on our knees in prayer and fasting," she told the listeners. 'Remember: faith without works is dead. So we're asking you to do all of it: pray, fast, believe, trust the Lord, but also act.'" We agree with Bachmann on this one: all of these folks *should* fast! Fast faster, people! Make it a goal to not eat or drink for TWO WEEKS. Big outer space man will be mad if you don't do this! [Minnesota Independent]


text:
Authorities have failed to give coordinated response to vagaries of weather, alleges Farooq
By Online Desk on February 7, 2019 No Comments
Srinagar: National Conference (NC) President Dr Farooq Abdullah on Thursday decried the incumbent governor administration for its alleged sloppy response to the exigencies arising after recent snowfall in the valley.
Dr Farooq, who represents the Srinagar parliamentary constituency, alleged, that the Governor administration has miserably failed to give a coordinated and effective response to the vagaries of weather this winter. "People are facing problems due to non clearance of snow from roads. The arterials and other interior roads are yet to be cleared of snow," he alleged.
He said that sluggishness and ineptitude that has crept in the state administration is taking its toll on day to day lives of people. "I have been receiving complaints that many farmers who have suffered huge losses to their crops due to the vagaries of weather during the ongoing winter season haven't been compensated," he said.
"Given the fact that meteorological department had issued beforehand weather warning, the Governor administration and divisional administration in particular has failed to come up with an effective operational response to the incessant snowfall," he alleged.
Dr Farooq said that the tall claims of the incumbent administration are deflated by the passive power shut down, blockages of roads and sever inundation problems across the valley.
"I urge the incumbent administration to swiftly mitigate the problems faced by people in wake of the recent snowfall," he said, adding that the administration is duty bound to ensure effective and basic amenities to people.
Dr Farooq said that the recent snowfall has aggravated the power crisis in rural as well as urban areas. "People have been left to fend for themselves. There is no accountability on ground and the laid-back attitude of the incumbent administration is pushing the already aggravated people to wall," he said.


INOVEM Inclusionware™ is a Web 2.0 service that's been designed - from the ground up - to help anyone who needs to involve, consult or collaborate with others to do so quickly, economically and without unnecessary barriers.
Our solutions are used by central and local government, planning authorities, consulting firms, corporates and representative organisations around the UK and US, to empower people to work together better.
• With INOVEM Inclusionware™ solutions, you don't have to follow restrictive pre-set workflows, and you don't have to create a new document every time you want work or consult with someone.
• There's no need for complex IT knowledge or expensive training. Our solutions are easy to manage and use, and users can quickly train each other.
• INOVEM Inclusionware™ solutions blends invisibly into your own identity. We don't just let you put your logo on our software – we create a complete collaborative-consultative environment under your brand.
For those who want to consult the public, involve a community, manage a partnership or just work closely with colleagues, INOVEM Inclusionware™ solutions gives you the place to do it - fast.
What's your inclusion challenge? Browse our solutions to see how INOVEM Inclusionware™ solutions can help you most effectively.
Or, if you already know what kind of INOVEM Inclusionware™ solutions you want, take a look at the advanced features in our individual Products.


This year I have tried to read a little more fluffy contempo romances. I've sometimes felt that I get pigeon holed into reviewing just historical fiction—don't get me wrong, historical fiction is my jam but sometimes I need a break and could go for something a little more modern and different just to keep things interesting.
Romances never seem to get old for me and I think a lot of women would agree. It doesn't matter how cliche or repetitive the romance might seem–theres just something about love and having everything turn out in the end that just makes me happy and gives me hope that romance is still alive n the digital age!
Enter books like The Family Gathering. Sure I feel like I've read similar stories before but I enjoy love in all it's shapes and forms and I never get tired of seeing how individual romances unfold.
When all the Jones siblings gather for a family wedding, the four adults are drawn together for the first time in a way they never were as children. As they struggle to accept each other, warts and all, the true nature and strength of their bond is tested. But all of them come to realize that your family are the people who see you for who you really are and love you anyway. And for Dakota, that truth allows him to find the home and family he's always wanted (summary from Goodreads).
When I read this review pitch, I was intrigued by the 'taming of the shrew' troupe. Don't we always want what we can't have? Dakota sounded kind of like this cocky military guy who loves the female attention he's getting in a small town but yet he can't get the woman he really wants….doesn't this sound like every woman's fantasy? Well it sounded like mine so I was totally in.
I didn't really notice that this book was part of a series, lately I've started reading a few series midway an had good luck with not feeling lost so I figured that would be the case with this one. I don't know that I would recommend starting mid series with this one. There were clearly other plots and references to previous books and characters that I felt a little lost. This is a new author to me and according to some of the other reviews I had read, it sounds like it's pretty typical for this author to carry on multiple story lines throughout multiple books and I would say that I recognized that right away with this one.
But I don't think that took anything away from the story itself because I still liked it but I think that as a new reader, some of the finer nuances of the plot and the characters were lost on me.
I was surprised that this book was actually more about family than about romance. Yes romance is part of the book but really the emphasis is on family and the relationships between the siblings and their parents. the story itself was emotional but again having come in to this series late in the game, some of the emotional impact was less than what other readers might have felt.
I loved how Carr really drove home the small town feel of this book. Having grown up in a small town myself and then as an adult–traveled, gone to college, and lived other places and then moved back to said small town–I think she does a fantastic job at highlighting the difficulties about 'coming home again' and living in a small town and that impact on the characters.
It's hard for me to rate this book because on one hand I enjoyed it and wanted to give it a 4 star review, but I also felt like I was missing so much of the plot which left me wanting to give it a 3 star review. I decided to split the difference and go with 3.5 stars. I think people who have read the other books in the series might rate it a 4 or 5 star review but without having the total understanding of the characters etc I didn't feel as emotionally impacted or connected to the town and characters as I had hoped.


Connect with Yellowstone buds or shake down Yellowstone alumni about working there.
Hang out, meetup, swap stories and reconnect with Yellowstone buds here.
Started by Cass Cox. Last reply by Kari Quaas (Q) May 5, 2016.
Started by John Lattanzio. Last reply by Sunni Apr 22, 2016.
Started by Marissa Johnson. Last reply by Kari Quaas (Q) Feb 15, 2016.
You need to be a member of Yellowstone Employees to add comments!
We are a couple working at the general store at Fishing Bridge. We are so excited! Anyone else on here going to be the same place?
I will be working at Lake Hotel as a room attendant. My son worked at Lake Lodge for two summers in 09 and 10. It is awesome to live there. A job is a job and I believe you get out of it what you put into it. What a great place to be for 5 months. This is my first season there.
Clayton: the best way to put it is that a lot of people do not like the company, but they love their jobs. I do not agree with a lot of things that Xanterra does, but I love what I do, even if the pay is not great, housing is a bit lacking, and the employee dining room is not known for its five star menu. The main thing is that you have an amazing opportunity to work in the world's first national park!
I recently have accepted a job in the Grant Village EDR in Yellowstone, anyone else do this job? I have been getting very interesting info in my research. I have seen personal blogs of people who worked with Xanterra for a summer and loved it, yet if you do a general search you find many people who say it is terrible. However, when I looked up other companies, DNC etc, not much love out there for them either, so I am thinking it may be those who complain, complain the loudest type scenario. Any info would be great, I begin this in the first week of May.
Anybody else going to be in gardiner on may 2nd? Barista at Old Faithful here, my first season and I can't wait!
Roberta: I am coming to Gardner on May 6 and 7. I have a double motel room, with 2 queen beds. Does anyone want to share the expense with me for one or two nights?
Alex; As jobs come open they are posted in the EDR If you see something you would be interested in you will be able to apply.
leaving Boise in a couple day for Gardiner check in on the 1st..anyone need a ride let me know.
Our first time at Yellowstone - myself as a room attendant at the Lake Hotel and my partner in the kitchen. Can anyone tell us about the gym facilities (i.e. weights, classes, machines)? Thanks for the information.
This is going to be my first summer in Yellowstone, I am going to be in Grant for the summer as a server assistant. Is there anyone else with me?


text:
Q: Speed difference between USB and Thunderbolt Ethernet adaptors? Ive just brought a new macbook pro and realised it doens't have an ethernet input. My office doens't have reliable wifi so I need to buy an adapter. Is there a speed difference between a USB to ethernet adapter and a Thunderbold to ethernet adaptor?
http://www.apple.com/uk/shop/product/MC704ZM/A/apple-usb-ethernet-adapter
http://www.apple.com/uk/shop/product/MD463ZM/A/thunderbolt-to-gigabit-ethernet-adapter
I will be checking out large GIT repositories and downloading very large database files so speed is important.

A: Thunderbolt is a lot fast faster. Thunderbolt is Gigabit, USB just 100 MBit.
From your links.

Easily connect your MacBook Air computer to an Ethernet network with the Apple USB Ethernet Adapter. Small and light, it connects to the USB 2.0 port of your MacBook Air and provides an RJ-45 connector that supports 10/100BASE-T performance.
The Apple Thunderbolt to Gigabit Ethernet Adapter lets you easily connect to a high-performance Gigabit Ethernet network. Small and compact, it connects to the Thunderbolt port on your Mac computer and provides an RJ-45 port that supports 10/100/1000BASE-T networks

A: Thunderbolt is a lot fast faster than USB, which does not matter if your NIC is significantly slower than either of those:
Basically you have:

*

*On the computer side:USB2 (up to 480Mbit/sec), or Thunderbolt(up to 10/20/40 Gbit sec. (4096Mbit/sec).

*In the NIC side the speed of the wired interface. The USB one you mentioned is 100mbit/sec, which translated to about 10MB/sec. The one with the Thunderbolt Interface is 1000Mbit/sec, so up to 10 times as fast

If you office has a wired switch which is capable of gigabit speeds then you should get much better performance with the Gbit NIC.


text:
package org.estatio.module.budget.dom.budgetcalculation;

import org.junit.Test;

import org.incode.module.unittestsupport.dom.bean.AbstractBeanPropertiesTest;

import org.estatio.module.asset.dom.Unit;
import org.estatio.module.budget.dom.budget.Budget;
import org.estatio.module.budget.dom.keyitem.KeyItem;
import org.estatio.module.budget.dom.keyitem.PartitioningTableItem;
import org.estatio.module.budget.dom.partioning.PartitionItem;
import org.estatio.module.charge.dom.Charge;

public class BudgetCalculation_Test {

    public static class BeanProperties extends AbstractBeanPropertiesTest {

        @Test
        public void test() {
            final BudgetCalculation pojo = new BudgetCalculation();
            newPojoTester()
                    .withFixture(pojos(PartitionItem.class, PartitionItem.class))
                    .withFixture(pojos(PartitioningTableItem.class, KeyItem.class))
                    .withFixture(pojos(Charge.class, Charge.class))
                    .withFixture(pojos(Unit.class, Unit.class))
                    .withFixture(pojos(Budget.class, Budget.class))
                    .exercise(pojo);
        }

    }
}