text:
namespace file_util {

namespace {

// Helper for NormalizeFilePath(), defined below.
bool RealPath(const FilePath& path, FilePath* real_path) {
  base::ThreadRestrictions::AssertIOAllowed();  // For realpath().
  FilePath::CharType buf[PATH_MAX];
  if (!realpath(path.value().c_str(), buf))
    return false;

  *real_path = FilePath(buf);
  return true;
}

}  // namespace

#if defined(OS_OPENBSD) || defined(OS_FREEBSD) || \
    (defined(OS_MACOSX) && \
     MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5)
typedef struct stat stat_wrapper_t;
static int CallStat(const char *path, stat_wrapper_t *sb) {
  base::ThreadRestrictions::AssertIOAllowed();
  return stat(path, sb);
}
#else
typedef struct stat64 stat_wrapper_t;
static int CallStat(const char *path, stat_wrapper_t *sb) {
  base::ThreadRestrictions::AssertIOAllowed();
  return stat64(path, sb);
}
#endif

#if defined(GOOGLE_CHROME_BUILD)
static const char* kTempFileName = ".com.google.chrome.XXXXXX";
#else
static const char* kTempFileName = ".org.chromium.XXXXXX";
#endif

bool AbsolutePath(FilePath* path) {
  base::ThreadRestrictions::AssertIOAllowed();  // For realpath().
  char full_path[PATH_MAX];
  if (realpath(path->value().c_str(), full_path) == NULL)
    return false;
  *path = FilePath(full_path);
  return true;
}

int CountFilesCreatedAfter(const FilePath& path,
                           const base::Time& comparison_time) {
  base::ThreadRestrictions::AssertIOAllowed();
  int file_count = 0;

  DIR* dir = opendir(path.value().c_str());
  if (dir) {
#if !defined(OS_LINUX) && !defined(OS_MACOSX) && !defined(OS_FREEBSD) && \
    !defined(OS_OPENBSD) && !defined(OS_SOLARIS)
  #error Port warning: depending on the definition of struct dirent, \
         additional space for pathname may be needed
#endif
    struct dirent ent_buf;
    struct dirent* ent;
    while (readdir_r(dir, &ent_buf, &ent) == 0 && ent) {
      if ((strcmp(ent->d_name, ".") == 0) ||
          (strcmp(ent->d_name, "..") == 0))
        continue;

      stat_wrapper_t st;
      int test = CallStat(path.Append(ent->d_name).value().c_str(), &st);
      if (test != 0) {
        PLOG(ERROR) << "stat64 failed";
        continue;
      }
      // Here, we use Time::TimeT(), which discards microseconds. This
      // means that files which are newer than |comparison_time| may
      // be considered older. If we don't discard microseconds, it
      // introduces another issue. Suppose the following case:
      //
      // 1. Get |comparison_time| by Time::Now() and the value is 10.1 (secs).
      // 2. Create a file and the current time is 10.3 (secs).
      //
      // As POSIX doesn't have microsecond precision for |st_ctime|,
      // the creation time of the file created in the step 2 is 10 and
      // the file is considered older than |comparison_time|. After
      // all, we may have to accept either of the two issues: 1. files
      // which are older than |comparison_time| are considered newer
      // (current implementation) 2. files newer than
      // |comparison_time| are considered older.
      if (static_cast<time_t>(st.st_ctime) >= comparison_time.ToTimeT())
        ++file_count;
    }
    closedir(dir);
  }
  return file_count;
}

// TODO(erikkay): The Windows version of this accepts paths like "foo/bar/*"
// which works both with and without the recursive flag.  I'm not sure we need
// that functionality. If not, remove from file_util_win.cc, otherwise add it
// here.
bool Delete(const FilePath& path, bool recursive) {
  base::ThreadRestrictions::AssertIOAllowed();
  const char* path_str = path.value().c_str();
  stat_wrapper_t file_info;
  int test = CallStat(path_str, &file_info);
  if (test != 0) {
    // The Windows version defines this condition as success.
    bool ret = (errno == ENOENT || errno == ENOTDIR);
    return ret;
  }
  if (!S_ISDIR(file_info.st_mode))
    return (unlink(path_str) == 0);
  if (!recursive)
    return (rmdir(path_str) == 0);

  bool success = true;
  std::stack<std::string> directories;
  directories.push(path.value());
  FileEnumerator traversal(path, true, static_cast<FileEnumerator::FILE_TYPE>(
        FileEnumerator::FILES | FileEnumerator::DIRECTORIES |
        FileEnumerator::SHOW_SYM_LINKS));
  for (FilePath current = traversal.Next(); success && !current.empty();
       current = traversal.Next()) {
    FileEnumerator::FindInfo info;
    traversal.GetFindInfo(&info);

    if (S_ISDIR(info.stat.st_mode))
      directories.push(current.value());
    else
      success = (unlink(current.value().c_str()) == 0);
  }

  while (success && !directories.empty()) {
    FilePath dir = FilePath(directories.top());
    directories.pop();
    success = (rmdir(dir.value().c_str()) == 0);
  }
  return success;
}

bool Move(const FilePath& from_path, const FilePath& to_path) {
  base::ThreadRestrictions::AssertIOAllowed();
  // Windows compatibility: if to_path exists, from_path and to_path
  // must be the same type, either both files, or both directories.
  stat_wrapper_t to_file_info;
  if (CallStat(to_path.value().c_str(), &to_file_info) == 0) {
    stat_wrapper_t from_file_info;
    if (CallStat(from_path.value().c_str(), &from_file_info) == 0) {
      if (S_ISDIR(to_file_info.st_mode) != S_ISDIR(from_file_info.st_mode))
        return false;
    } else {
      return false;
    }
  }

  if (rename(from_path.value().c_str(), to_path.value().c_str()) == 0)
    return true;

  if (!CopyDirectory(from_path, to_path, true))
    return false;

  Delete(from_path, true);
  return true;
}

bool ReplaceFile(const FilePath& from_path, const FilePath& to_path) {
  base::ThreadRestrictions::AssertIOAllowed();
  return (rename(from_path.value().c_str(), to_path.value().c_str()) == 0);
}

bool CopyDirectory(const FilePath& from_path,
                   const FilePath& to_path,
                   bool recursive) {
  base::ThreadRestrictions::AssertIOAllowed();
  // Some old callers of CopyDirectory want it to support wildcards.
  // After some discussion, we decided to fix those callers.
  // Break loudly here if anyone tries to do this.
  // TODO(evanm): remove this once we're sure it's ok.
  DCHECK(to_path.value().find('*') == std::string::npos);
  DCHECK(from_path.value().find('*') == std::string::npos);

  char top_dir[PATH_MAX];
  if (base::strlcpy(top_dir, from_path.value().c_str(),
                    arraysize(top_dir)) >= arraysize(top_dir)) {
    return false;
  }

  // This function does not properly handle destinations within the source
  FilePath real_to_path = to_path;
  if (PathExists(real_to_path)) {
    if (!AbsolutePath(&real_to_path))
      return false;
  } else {
    real_to_path = real_to_path.DirName();
    if (!AbsolutePath(&real_to_path))
      return false;
  }
  FilePath real_from_path = from_path;
  if (!AbsolutePath(&real_from_path))
    return false;
  if (real_to_path.value().size() >= real_from_path.value().size() &&
      real_to_path.value().compare(0, real_from_path.value().size(),
      real_from_path.value()) == 0)
    return false;

  bool success = true;
  FileEnumerator::FILE_TYPE traverse_type =
      static_cast<FileEnumerator::FILE_TYPE>(FileEnumerator::FILES |
      FileEnumerator::SHOW_SYM_LINKS);
  if (recursive)
    traverse_type = static_cast<FileEnumerator::FILE_TYPE>(
        traverse_type | FileEnumerator::DIRECTORIES);
  FileEnumerator traversal(from_path, recursive, traverse_type);

  // We have to mimic windows behavior here. |to_path| may not exist yet,
  // start the loop with |to_path|.
  FileEnumerator::FindInfo info;
  FilePath current = from_path;
  if (stat(from_path.value().c_str(), &info.stat) < 0) {
    LOG(ERROR) << "CopyDirectory() couldn't stat source directory: " <<
        from_path.value() << " errno = " << errno;
    success = false;
  }
  struct stat to_path_stat;
  FilePath from_path_base = from_path;
  if (recursive && stat(to_path.value().c_str(), &to_path_stat) == 0 &&
      S_ISDIR(to_path_stat.st_mode)) {
    // If the destination already exists and is a directory, then the
    // top level of source needs to be copied.
    from_path_base = from_path.DirName();
  }

  // The Windows version of this function assumes that non-recursive calls
  // will always have a directory for from_path.
  DCHECK(recursive || S_ISDIR(info.stat.st_mode));

  while (success && !current.empty()) {
    // current is the source path, including from_path, so paste
    // the suffix after from_path onto to_path to create the target_path.
    std::string suffix(&current.value().c_str()[from_path_base.value().size()]);
    // Strip the leading '/' (if any).
    if (!suffix.empty()) {
      DCHECK_EQ('/', suffix[0]);
      suffix.erase(0, 1);
    }
    const FilePath target_path = to_path.Append(suffix);

    if (S_ISDIR(info.stat.st_mode)) {
      if (mkdir(target_path.value().c_str(), info.stat.st_mode & 01777) != 0 &&
          errno != EEXIST) {
        LOG(ERROR) << "CopyDirectory() couldn't create directory: " <<
            target_path.value() << " errno = " << errno;
        success = false;
      }
    } else if (S_ISREG(info.stat.st_mode)) {
      if (!CopyFile(current, target_path)) {
        LOG(ERROR) << "CopyDirectory() couldn't create file: " <<
            target_path.value();
        success = false;
      }
    } else {
      LOG(WARNING) << "CopyDirectory() skipping non-regular file: " <<
          current.value();
    }

    current = traversal.Next();
    traversal.GetFindInfo(&info);
  }

  return success;
}

bool PathExists(const FilePath& path) {
  base::ThreadRestrictions::AssertIOAllowed();
  return access(path.value().c_str(), F_OK) == 0;
}

bool PathIsWritable(const FilePath& path) {
  base::ThreadRestrictions::AssertIOAllowed();
  return access(path.value().c_str(), W_OK) == 0;
}

bool DirectoryExists(const FilePath& path) {
  base::ThreadRestrictions::AssertIOAllowed();
  stat_wrapper_t file_info;
  if (CallStat(path.value().c_str(), &file_info) == 0)
    return S_ISDIR(file_info.st_mode);
  return false;
}

// TODO(erikkay): implement
#if 0
bool GetFileCreationLocalTimeFromHandle(int fd,
                                        LPSYSTEMTIME creation_time) {
  if (!file_handle)
    return false;

  FILETIME utc_filetime;
  if (!GetFileTime(file_handle, &utc_filetime, NULL, NULL))
    return false;

  FILETIME local_filetime;
  if (!FileTimeToLocalFileTime(&utc_filetime, &local_filetime))
    return false;

  return !!FileTimeToSystemTime(&local_filetime, creation_time);
}

bool GetFileCreationLocalTime(const std::string& filename,
                              LPSYSTEMTIME creation_time) {
  ScopedHandle file_handle(
      CreateFile(filename.c_str(), GENERIC_READ,
                 FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, NULL,
                 OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL));
  return GetFileCreationLocalTimeFromHandle(file_handle.Get(), creation_time);
}
#endif

bool ReadFromFD(int fd, char* buffer, size_t bytes) {
  size_t total_read = 0;
  while (total_read < bytes) {
    ssize_t bytes_read =
        HANDLE_EINTR(read(fd, buffer + total_read, bytes - total_read));
    if (bytes_read <= 0)
      break;
    total_read += bytes_read;
  }
  return total_read == bytes;
}

bool CreateSymbolicLink(const FilePath& target_path,
                        const FilePath& symlink_path) {
  DCHECK(!symlink_path.empty());
  DCHECK(!target_path.empty());
  return ::symlink(target_path.value().c_str(),
                   symlink_path.value().c_str()) != -1;
}

bool ReadSymbolicLink(const FilePath& symlink_path,
                      FilePath* target_path) {
  DCHECK(!symlink_path.empty());
  DCHECK(target_path);
  char buf[PATH_MAX];
  ssize_t count = ::readlink(symlink_path.value().c_str(), buf, arraysize(buf));

  if (count <= 0) {
    target_path->clear();
    return false;
  }

  *target_path = FilePath(FilePath::StringType(buf, count));
  return true;
}

// Creates and opens a temporary file in |directory|, returning the
// file descriptor. |path| is set to the temporary file path.
// This function does NOT unlink() the file.
int CreateAndOpenFdForTemporaryFile(FilePath directory, FilePath* path) {
  base::ThreadRestrictions::AssertIOAllowed();  // For call to mkstemp().
  *path = directory.Append(kTempFileName);
  const std::string& tmpdir_string = path->value();
  // this should be OK since mkstemp just replaces characters in place
  char* buffer = const_cast<char*>(tmpdir_string.c_str());

  return HANDLE_EINTR(mkstemp(buffer));
}

bool CreateTemporaryFile(FilePath* path) {
  base::ThreadRestrictions::AssertIOAllowed();  // For call to close().
  FilePath directory;
  if (!GetTempDir(&directory))
    return false;
  int fd = CreateAndOpenFdForTemporaryFile(directory, path);
  if (fd < 0)
    return false;
  ignore_result(HANDLE_EINTR(close(fd)));
  return true;
}

FILE* CreateAndOpenTemporaryShmemFile(FilePath* path) {
  FilePath directory;
  if (!GetShmemTempDir(&directory))
    return NULL;

  return CreateAndOpenTemporaryFileInDir(directory, path);
}

FILE* CreateAndOpenTemporaryFileInDir(const FilePath& dir, FilePath* path) {
  int fd = CreateAndOpenFdForTemporaryFile(dir, path);
  if (fd < 0)
    return NULL;

  FILE* file = fdopen(fd, "a+");
  if (!file)
    ignore_result(HANDLE_EINTR(close(fd)));
  return file;
}

bool CreateTemporaryFileInDir(const FilePath& dir, FilePath* temp_file) {
  base::ThreadRestrictions::AssertIOAllowed();  // For call to close().
  int fd = CreateAndOpenFdForTemporaryFile(dir, temp_file);
  return ((fd >= 0) && !HANDLE_EINTR(close(fd)));
}

static bool CreateTemporaryDirInDirImpl(const FilePath& base_dir,
                                        const FilePath::StringType& name_tmpl,
                                        FilePath* new_dir) {
  base::ThreadRestrictions::AssertIOAllowed();  // For call to mkdtemp().
  CHECK(name_tmpl.find("XXXXXX") != FilePath::StringType::npos)
    << "Directory name template must contain \"XXXXXX\".";

  FilePath sub_dir = base_dir.Append(name_tmpl);
  std::string sub_dir_string = sub_dir.value();

  // this should be OK since mkdtemp just replaces characters in place
  char* buffer = const_cast<char*>(sub_dir_string.c_str());
  char* dtemp = mkdtemp(buffer);
  if (!dtemp) {
    DPLOG(ERROR) << "mkdtemp";
    return false;
  }
  *new_dir = FilePath(dtemp);
  return true;
}

bool CreateTemporaryDirInDir(const FilePath& base_dir,
                             const FilePath::StringType& prefix,
                             FilePath* new_dir) {
  FilePath::StringType mkdtemp_template = prefix;
  mkdtemp_template.append(FILE_PATH_LITERAL("XXXXXX"));
  return CreateTemporaryDirInDirImpl(base_dir, mkdtemp_template, new_dir);
}

bool CreateNewTempDirectory(const FilePath::StringType& prefix,
                            FilePath* new_temp_path) {
  FilePath tmpdir;
  if (!GetTempDir(&tmpdir))
    return false;

  return CreateTemporaryDirInDirImpl(tmpdir, kTempFileName, new_temp_path);
}

bool CreateDirectory(const FilePath& full_path) {
  base::ThreadRestrictions::AssertIOAllowed();  // For call to mkdir().
  std::vector<FilePath> subpaths;

  // Collect a list of all parent directories.
  FilePath last_path = full_path;
  subpaths.push_back(full_path);
  for (FilePath path = full_path.DirName();
       path.value() != last_path.value(); path = path.DirName()) {
    subpaths.push_back(path);
    last_path = path;
  }

  // Iterate through the parents and create the missing ones.
  for (std::vector<FilePath>::reverse_iterator i = subpaths.rbegin();
       i != subpaths.rend(); ++i) {
    if (DirectoryExists(*i))
      continue;
    if (mkdir(i->value().c_str(), 0700) == 0)
      continue;
    // Mkdir failed, but it might have failed with EEXIST, or some other error
    // due to the the directory appearing out of thin air. This can occur if
    // two processes are trying to create the same file system tree at the same
    // time. Check to see if it exists and make sure it is a directory.
    if (!DirectoryExists(*i))
      return false;
  }
  return true;
}

bool GetFileInfo(const FilePath& file_path, base::PlatformFileInfo* results) {
  stat_wrapper_t file_info;
  if (CallStat(file_path.value().c_str(), &file_info) != 0)
    return false;
  results->is_directory = S_ISDIR(file_info.st_mode);
  results->size = file_info.st_size;
  results->last_modified = base::Time::FromTimeT(file_info.st_mtime);
  results->last_accessed = base::Time::FromTimeT(file_info.st_atime);
  results->creation_time = base::Time::FromTimeT(file_info.st_ctime);
  return true;
}

bool GetInode(const FilePath& path, ino_t* inode) {
  base::ThreadRestrictions::AssertIOAllowed();  // For call to stat().
  struct stat buffer;
  int result = stat(path.value().c_str(), &buffer);
  if (result < 0)
    return false;

  *inode = buffer.st_ino;
  return true;
}

FILE* OpenFile(const std::string& filename, const char* mode) {
  return OpenFile(FilePath(filename), mode);
}

FILE* OpenFile(const FilePath& filename, const char* mode) {
  base::ThreadRestrictions::AssertIOAllowed();
  FILE* result = NULL;
  do {
    result = fopen(filename.value().c_str(), mode);
  } while (!result && errno == EINTR);
  return result;
}

int ReadFile(const FilePath& filename, char* data, int size) {
  base::ThreadRestrictions::AssertIOAllowed();
  int fd = HANDLE_EINTR(open(filename.value().c_str(), O_RDONLY));
  if (fd < 0)
    return -1;

  ssize_t bytes_read = HANDLE_EINTR(read(fd, data, size));
  if (int ret = HANDLE_EINTR(close(fd)) < 0)
    return ret;
  return bytes_read;
}

int WriteFile(const FilePath& filename, const char* data, int size) {
  base::ThreadRestrictions::AssertIOAllowed();
  int fd = HANDLE_EINTR(creat(filename.value().c_str(), 0666));
  if (fd < 0)
    return -1;

  int bytes_written = WriteFileDescriptor(fd, data, size);
  if (int ret = HANDLE_EINTR(close(fd)) < 0)
    return ret;
  return bytes_written;
}

int WriteFileDescriptor(const int fd, const char* data, int size) {
  // Allow for partial writes.
  ssize_t bytes_written_total = 0;
  for (ssize_t bytes_written_partial = 0; bytes_written_total < size;
       bytes_written_total += bytes_written_partial) {
    bytes_written_partial =
        HANDLE_EINTR(write(fd, data + bytes_written_total,
                           size - bytes_written_total));
    if (bytes_written_partial < 0)
      return -1;
  }

  return bytes_written_total;
}

// Gets the current working directory for the process.
bool GetCurrentDirectory(FilePath* dir) {
  // getcwd can return ENOENT, which implies it checks against the disk.
  base::ThreadRestrictions::AssertIOAllowed();

  char system_buffer[PATH_MAX] = "";
  if (!getcwd(system_buffer, sizeof(system_buffer))) {
    NOTREACHED();
    return false;
  }
  *dir = FilePath(system_buffer);
  return true;
}

// Sets the current working directory for the process.
bool SetCurrentDirectory(const FilePath& path) {
  base::ThreadRestrictions::AssertIOAllowed();
  int ret = chdir(path.value().c_str());
  return !ret;
}

///////////////////////////////////////////////
// FileEnumerator

FileEnumerator::FileEnumerator(const FilePath& root_path,
                               bool recursive,
                               FileEnumerator::FILE_TYPE file_type)
    : current_directory_entry_(0),
      root_path_(root_path),
      recursive_(recursive),
      file_type_(file_type) {
  // INCLUDE_DOT_DOT must not be specified if recursive.
  DCHECK(!(recursive && (INCLUDE_DOT_DOT & file_type_)));
  pending_paths_.push(root_path);
}

FileEnumerator::FileEnumerator(const FilePath& root_path,
                               bool recursive,
                               FileEnumerator::FILE_TYPE file_type,
                               const FilePath::StringType& pattern)
    : current_directory_entry_(0),
      root_path_(root_path),
      recursive_(recursive),
      file_type_(file_type),
      pattern_(root_path.Append(pattern).value()) {
  // INCLUDE_DOT_DOT must not be specified if recursive.
  DCHECK(!(recursive && (INCLUDE_DOT_DOT & file_type_)));
  // The Windows version of this code appends the pattern to the root_path,
  // potentially only matching against items in the top-most directory.
  // Do the same here.
  if (pattern.empty())
    pattern_ = FilePath::StringType();
  pending_paths_.push(root_path);
}

FileEnumerator::~FileEnumerator() {
}

FilePath FileEnumerator::Next() {
  ++current_directory_entry_;

  // While we've exhausted the entries in the current directory, do the next
  while (current_directory_entry_ >= directory_entries_.size()) {
    if (pending_paths_.empty())
      return FilePath();

    root_path_ = pending_paths_.top();
    root_path_ = root_path_.StripTrailingSeparators();
    pending_paths_.pop();

    std::vector<DirectoryEntryInfo> entries;
    if (!ReadDirectory(&entries, root_path_, file_type_ & SHOW_SYM_LINKS))
      continue;

    directory_entries_.clear();
    current_directory_entry_ = 0;
    for (std::vector<DirectoryEntryInfo>::const_iterator
        i = entries.begin(); i != entries.end(); ++i) {
      FilePath full_path = root_path_.Append(i->filename);
      if (ShouldSkip(full_path))
        continue;

      if (pattern_.size() &&
          fnmatch(pattern_.c_str(), full_path.value().c_str(), FNM_NOESCAPE))
        continue;

      if (recursive_ && S_ISDIR(i->stat.st_mode))
        pending_paths_.push(full_path);

      if ((S_ISDIR(i->stat.st_mode) && (file_type_ & DIRECTORIES)) ||
          (!S_ISDIR(i->stat.st_mode) && (file_type_ & FILES)))
        directory_entries_.push_back(*i);
    }
  }

  return root_path_.Append(directory_entries_[current_directory_entry_
      ].filename);
}

void FileEnumerator::GetFindInfo(FindInfo* info) {
  DCHECK(info);

  if (current_directory_entry_ >= directory_entries_.size())
    return;

  DirectoryEntryInfo* cur_entry = &directory_entries_[current_directory_entry_];
  memcpy(&(info->stat), &(cur_entry->stat), sizeof(info->stat));
  info->filename.assign(cur_entry->filename.value());
}

bool FileEnumerator::IsDirectory(const FindInfo& info) {
  return S_ISDIR(info.stat.st_mode);
}

// static
FilePath FileEnumerator::GetFilename(const FindInfo& find_info) {
  return FilePath(find_info.filename);
}

bool FileEnumerator::ReadDirectory(std::vector<DirectoryEntryInfo>* entries,
                                   const FilePath& source, bool show_links) {
  base::ThreadRestrictions::AssertIOAllowed();
  DIR* dir = opendir(source.value().c_str());
  if (!dir)
    return false;

#if !defined(OS_LINUX) && !defined(OS_MACOSX) && !defined(OS_FREEBSD) && \
    !defined(OS_OPENBSD) && !defined(OS_SOLARIS)
  #error Port warning: depending on the definition of struct dirent, \
         additional space for pathname may be needed
#endif

  struct dirent dent_buf;
  struct dirent* dent;
  while (readdir_r(dir, &dent_buf, &dent) == 0 && dent) {
    DirectoryEntryInfo info;
    info.filename = FilePath(dent->d_name);

    FilePath full_name = source.Append(dent->d_name);
    int ret;
    if (show_links)
      ret = lstat(full_name.value().c_str(), &info.stat);
    else
      ret = stat(full_name.value().c_str(), &info.stat);
    if (ret < 0) {
      // Print the stat() error message unless it was ENOENT and we're
      // following symlinks.
      if (!(errno == ENOENT && !show_links)) {
        PLOG(ERROR) << "Couldn't stat "
                    << source.Append(dent->d_name).value();
      }
      memset(&info.stat, 0, sizeof(info.stat));
    }
    entries->push_back(info);
  }

  closedir(dir);
  return true;
}

///////////////////////////////////////////////
// MemoryMappedFile

MemoryMappedFile::MemoryMappedFile()
    : file_(base::kInvalidPlatformFileValue),
      data_(NULL),
      length_(0) {
}

bool MemoryMappedFile::MapFileToMemoryInternal() {
  base::ThreadRestrictions::AssertIOAllowed();

  struct stat file_stat;
  if (fstat(file_, &file_stat) == base::kInvalidPlatformFileValue) {
    LOG(ERROR) << "Couldn't fstat " << file_ << ", errno " << errno;
    return false;
  }
  length_ = file_stat.st_size;

  data_ = static_cast<uint8*>(
      mmap(NULL, length_, PROT_READ, MAP_SHARED, file_, 0));
  if (data_ == MAP_FAILED)
    LOG(ERROR) << "Couldn't mmap " << file_ << ", errno " << errno;

  return data_ != MAP_FAILED;
}

void MemoryMappedFile::CloseHandles() {
  base::ThreadRestrictions::AssertIOAllowed();

  if (data_ != NULL)
    munmap(data_, length_);
  if (file_ != base::kInvalidPlatformFileValue)
    ignore_result(HANDLE_EINTR(close(file_)));

  data_ = NULL;
  length_ = 0;
  file_ = base::kInvalidPlatformFileValue;
}

bool HasFileBeenModifiedSince(const FileEnumerator::FindInfo& find_info,
                              const base::Time& cutoff_time) {
  return static_cast<time_t>(find_info.stat.st_mtime) >= cutoff_time.ToTimeT();
}

bool NormalizeFilePath(const FilePath& path, FilePath* normalized_path) {
  FilePath real_path_result;
  if (!RealPath(path, &real_path_result))
    return false;

  // To be consistant with windows, fail if |real_path_result| is a
  // directory.
  stat_wrapper_t file_info;
  if (CallStat(real_path_result.value().c_str(), &file_info) != 0 ||
      S_ISDIR(file_info.st_mode))
    return false;

  *normalized_path = real_path_result;
  return true;
}

#if !defined(OS_MACOSX)
bool GetTempDir(FilePath* path) {
  const char* tmp = getenv("TMPDIR");
  if (tmp)
    *path = FilePath(tmp);
  else
    *path = FilePath("/tmp");
  return true;
}

bool GetShmemTempDir(FilePath* path) {
  *path = FilePath("/dev/shm");
  return true;
}

FilePath GetHomeDir() {
  const char* home_dir = getenv("HOME");
  if (home_dir && home_dir[0])
    return FilePath(home_dir);

  // g_get_home_dir calls getpwent, which can fall through to LDAP calls.
  base::ThreadRestrictions::AssertIOAllowed();

  home_dir = g_get_home_dir();
  if (home_dir && home_dir[0])
    return FilePath(home_dir);

  FilePath rv;
  if (file_util::GetTempDir(&rv))
    return rv;

  // Last resort.
  return FilePath("/tmp");
}

bool CopyFile(const FilePath& from_path, const FilePath& to_path) {
  base::ThreadRestrictions::AssertIOAllowed();
  int infile = HANDLE_EINTR(open(from_path.value().c_str(), O_RDONLY));
  if (infile < 0)
    return false;

  int outfile = HANDLE_EINTR(creat(to_path.value().c_str(), 0666));
  if (outfile < 0) {
    ignore_result(HANDLE_EINTR(close(infile)));
    return false;
  }

  const size_t kBufferSize = 32768;
  std::vector<char> buffer(kBufferSize);
  bool result = true;

  while (result) {
    ssize_t bytes_read = HANDLE_EINTR(read(infile, &buffer[0], buffer.size()));
    if (bytes_read < 0) {
      result = false;
      break;
    }
    if (bytes_read == 0)
      break;
    // Allow for partial writes
    ssize_t bytes_written_per_read = 0;
    do {
      ssize_t bytes_written_partial = HANDLE_EINTR(write(
          outfile,
          &buffer[bytes_written_per_read],
          bytes_read - bytes_written_per_read));
      if (bytes_written_partial < 0) {
        result = false;
        break;
      }
      bytes_written_per_read += bytes_written_partial;
    } while (bytes_written_per_read < bytes_read);
  }

  if (HANDLE_EINTR(close(infile)) < 0)
    result = false;
  if (HANDLE_EINTR(close(outfile)) < 0)
    result = false;

  return result;
}
#endif  // defined(OS_MACOSX)

}  // namespace file_util

redpajama_set_name: RedPajamaGithub


The following Official Record of Chris Shelton is being redistributed by Mugshots.com and is protected by constitutional, publishing, and other legal rights. This Official Record was collected on 4/11/2005. Last updated on 10/11/2013.


Every domestic property in Lincoln will have someone who is responsible for paying council Tax. This is normally the property owner, leaseholder or tenant of the property.
Council Tax is collected and shared between City of Lincoln Council, Lincolnshire County Council and the Police Authority to pay for a wide range of public services.


text:
South Korea And Washington Discuss Nuclear Sharing Amid North Korean Nuclear Buildup
Jen Snow Jan 4, 2023 January 4, 2023 0
With Pyongyang increasing threats of expanding its nuclear arsenal, South Korea confirmed on Tuesday that it's in talks with the U.S. about becoming involved in U.S. nuclear weapons management as a nuclear deterrent to the DPRK. Despite Seoul's confirmation of the talks, President Biden has denied that there is any discussion of sharing nuclear weapons.
South Korea Vows Aggressive Retaliation To North Korea's Military 'Provocations'
Jen Snow Dec 30, 2022 December 30, 2022 0
South Korean President Yoon Suk-yeol has vowed to respond more aggressively to military provocations by North Korea after Pyongyang sent drones into South Korea's airspace earlier this week. Seoul not only revealed a $440 million military spending package in response to the incident but also called for its military to "punish" North Korea for its military actions.
U.S. And South Korea To Increase Anti-Submarine Drills
Jen Snow Nov 30, 2022 November 30, 2022 0
As North Korea announces plans to increase its nuclear weapons cache and tensions rise in the area, the U.S. and South Korea are reportedly planning to increase anti-submarine exercises in 2023. According to the Korea Times last week, the biannual "silent shark" drills will be "bigger than those of the past, given the North heightening tensions with its dozens of missile tests in recent months."
North Korea Flexes Its Muscles And Flies A Ballistic Missile Over Japanese Air Space
Christine Dolan Oct 3, 2022 October 3, 2022 0
North Korea Flexes Its Muscles And Flies A Ballistic Missile Over Japanese Air Space.
A Letter To The Students Of North Korea: Will America Follow Your Country's Lead?
Peter Falkenberg Brown Nov 7, 2021 November 7, 2021 1
Trump Nominated For Nobel Peace Prize
CD Media Staff Sep 9, 2020 September 9, 2020 1
DOD Warns China Over South China Sea
CD Media Staff Jul 3, 2020 July 5, 2020 1
North Korea's Kim Jong Un Reported By Japanese Media To Be In Vegetative State
CD Media Staff Apr 26, 2020 April 26, 2020 0
North Korea's Kim Jong Un Reported By Japanese Media To Be In Vegetative State.
President Trump: The Most Peaceful Man In The World
Taylor Day Jan 15, 2020 January 15, 2020 0
For there to be peace means that there is the possibility of great violence that is restrained. Most people in the Western world aren't confronted with violence. Real violence. Not "misgendering" someone or donning a mask and breaking windows because your candidate didn't win an election. The sort of violence that can either make or destroy entire nations.
Neocon Bolton's Brief NSA Appointment Over
CD Media Staff Sep 11, 2019 September 11, 2019 0
Powered by PenciDesign

redpajama_set_name: RedPajamaCommonCrawl


Subscribe to the NYC DOE School Wellness Weekly newsletter to stay up to date on school wellness-related grants, resources, and news.
2015-17 School Wellness Weekly archive.
As busy New Yorkers, it can be difficult to think/make healthy meals/snacks. A food planner can help you! Please click on the link below to find examples of healthy snacks.
CLICK HERE to view the presentation from the April 2016 meeting on Health and Academic Achievement.


This material has been prepared for general information only, and does not contain, and is not to be taken as containing any securities advice or recommendation on an offer of any investment or an invitation or solicitation to subscribe for or purchase any investment to any person in any state, foreign country or jurisdiction where such offer or solicitation may not lawfully be made.
Before making an investment decision, you should consider whether the investment is appropriate having regard to your investment objectives, financial position and needs, with or without your financial planner. In preparing this material, Schroders did not take into account the particular investment objectives, financial situations or specific needs of any particular investors.
All references to dollars within this material are to Australian dollars unless otherwise stated.
If you have any questions about this material, please contact the Head of Corporate Governance at Schroders on telephone (02) 9210 9200.
Copyright in the material reproduced on these pages is owned by Schroders. The material may be viewed on-line by means of an html web browser and may be reproduced in hard copy only for your personal reference. Except to the extent otherwise permitted by the Copyright Act 1968 (Cth), the material may not otherwise be reproduced or displayed in public and may not be linked to, distributed or transmitted electronically to any other person or incorporated by any means into another document or material, including other websites.
Without limiting the generality of the foregoing, Schroders does not permit reproductions of its material in other websites in conjunction with advertising, trademarks, logos or material of any other person (including competitors, distributors or any other organisation), without prior written permission from Schroders. If you wish to discuss establishment of links with this website or publication of Schroders' material on other websites, please contact Schroders Client Service department on telephone 1300 136471.
The material set out in this website, is made available in good faith by Schroders and has been derived from sources believed to be reliable and accurate. Generally it is not intended to be a complete description of the matters described and Schroders assumes no responsibility for updating any information contained in this material or for correcting any error or omission, which may become apparent after the material, has been issued. Schroders does not give any warranty as to the accuracy, reliability or completeness of this material. Except insofar as liability under any statute cannot be excluded, Schroders and its directors, employees, agents and consultants do not accept any liability (whether arising in contract, or tort or negligence or otherwise) for any error or omission in this material or for any resulting loss or damage (whether direct, indirect, consequential or otherwise) suffered by the recipient of this material or any other person.
You agree to use and link to Schroders website at your own risk. Schroders will not be liable for any loss or damage (whether direct, indirect, consequential or otherwise) from any cause (including negligence) to your systems or website caused by or in connection with the use of or a link to Schroders' website. Any such loss or damage will be your responsibility. Schroders advises you take your own precautions in relation to protecting your systems or website from viruses or malfunction.
Should you leave this site via a link contained within this website, and view content that is not provided by Schroders, you do so at your own risk. The content to which you link will not have been produced, checked for accuracy, or otherwise reviewed by Schroders. Schroders is not responsible for damages or losses caused by any delays, defects or omissions that may exist in the services, information or other content provided in such site, whether direct, indirect, consequential or otherwise. Schroders makes no guarantees or representations as to, and shall have no liability for, any electronic content delivered by any third party.
Investment in any of the managed investment schemes mentioned in the material on this website may only be made on the basis of the application form attached to or accompanied by the current offer document which is available from Schroders, who acts as responsible entity of the managed investment schemes and who receives fees in this capacity.
This website and the information provided on this website is intended for residents of Australia from within Australia and is not intended for any person who is a resident of another country. The offer of units in any Schroders managed investments scheme is available to persons receiving an electronic or hard copy of the relevant offer document in Australia.
Neither Schroders nor any other person guarantees the performance of the managed investment schemes mentioned on this website. Investments in the managed investment scheme are subject to investment risk, which may include loss of income or capital invested. Neither the repayment of capital nor the investment performance of the managed investment schemes is guaranteed by Schroders, or any other companies in the Schroders Group. Past performance is not a reliable indicator of future performance.
The information obtained from MSCI and other data providers, included in reports available from this website, may only be used for your internal use, may not be reproduced or re-disseminated in any form and may not be used to create any financial instruments or products or any indices. The MSCI information and that of other data providers is provided on an "as is" basis and the user of this information assumes the entire risk of any use made of this information. MSCI, each of its affiliates and each other person involved in or related to compiling or creating any MSCI information (collectively, the "MSCI Parties") and other data providers, expressly disclaim all warranties (including, without limitation any warranties of originality, accuracy, completeness, timeliness, non-infringement, merchantability and fitness for a particular purpose) with respect to this information. Without limiting any of the foregoing, in no event shall any MSCI Party or other data provider have any liability for any direct, indirect, special, incidental, punitive, consequential (including, without limitation, lost profits) or any other damages.


text:
Q: Is there a way to print an AttributedString in a JLabel? I have an AttributedString with regular text and some subscripts. I would like to put the text in a JLabel without losing formatting.
Is this possible? And if not, what would be the best alternative?
EDIT: Here is some example code to further explain my question:
import javax.swing.JLabel;
import javax.swing.JFrame;
import java.text.AttributedString;
import java.awt.font.TextAttribute;
public class LabelExample extends JFrame implements Runnable
{
  private JLabel label;
  private AttributedString as;
  public LabelExample()
  {
    as = new AttributedString("Ten to the fifth is 105");
    as.addAttribute(TextAttribute.SUPERSCRIPT, TextAttribute.SUPERSCRIPT_SUPER, 22, 23);
    label = new JLabel(as);
    //the above line doesn't accept AttributedString
    //as a suitable constructor
    this.add(label);
  }
  public void run()
  {
    setSize(500, 500);
    setVisible(true);
  }
  public static void main(String[] args)
  {
    LabelExample e = new LabelExample();
    javax.swing.SwingUtilities.invokeLater(e);
  }
}

A: By overwriting the JLabel so it acts like a JPanel or JComponent and use its paint method. That is obviously not a good idea, just use a JPanel directly. A Graphics2D context knows how to deal with an AttributedString (the character iterator, to be specific).
JLabel knows about HTML rendering directly, maybe this helps you with your specific task as you can easily build an HTML string with superscript tags. I don't know of a comfortable way to convert an AttributedString to HTML.

A: Use my AttributedLabel class.
public class AttributedLabel extends JLabel {

    AttributedString str;

    public AttributedLabel(AttributedString s){
        super(s);
        str = s;
    }

    @Override
    public void paintComponent(Graphics g){
        // Render the string
        g.drawString(as.getIterator(), 0, 0);
    }

}

Hope it helps.

redpajama_set_name: RedPajamaStackExchange


My Mom's birthday is today! I won't give away her age, I know she would not like that. But I will say that she definitely looks younger than she is. I think it's all the playing she did in her preschool classes for all those years of teaching!
As I have mentioned before, Mom has always encouraged my creativity and is pretty crafty herself (in the art way, not the fox way)!
Today, I thought I would showcase a few things she has made for me.
My Mom started scrapbooking after I did, but she jumped in with both feet and loved it! She was inspired to look back at all her years of photos and sort them out into groups of inspiration.
She collected photos of me from all 12 years of school and put together a traditional 'school days' album for me. You only get to see some of the photos - my middle school photos shall never see the light of day!
Once she got the 'traditional' out of her system, she started making mini books.
I wish I had more of my Mom's creations to share, but this is all I have at my house. I know there is a hook-loop wall hanging that used to be in my Dad's office and a macrame wall hanging that used to be in our stairway. I wonder what happened to those...?
It's been a crazy week at work - lots to finish up in the next few weeks before school starts back! Not to mention all the things I still have to finish (and start!) around my house!
In the interest of simplicity, today is now Fill-in-the-blank-Friday!
1. Today for breakfast I ate toasted oatmeal bread with peanut butter and a glass of orange juice. It's pretty much what I have every day. Boring, but keeps me going.
2. My go to/never fail recipe(s) are mostly desserts! I can always make choc-oat chip cookies or schotcharoos (peanut butter rice crispie bars with chocolate on top) with my eyes shut and one arm tied behind my back. As far as regular meals go... probably spaghetti. Since I make huge batches and freeze it, the usual 'making' of spaghetti is boiling noodles and microwaving frozen sauce. EASY!
3. Something I eat that other people think is weird is canned tuna in my macaroni & cheese. Or maybe the way I make sloppy joes (ground beef and gumbo soup - no tomato-based joes for me!).
4. My worst cooking disaster ever was not really mine. I'm super careful and except for the occasional missing spice or overcooked chicken, my food always turns out. My husband got a huge, nasty burn on his finger when he tried to make stir fry and the hot oil spilled over the wok and landed on his fingers!
5. If I could only eat one flavor of ice cream the rest of my life it would be chocolate. Simple & delicious.
6. One food I hate and avoid at all costs is sea food. With the exception of canned tuna (and only one brand), I hate all sea food. This baffles most of my family, who loves the stuff. Bleh!
7. What is your favorite meal? Breakfast, lunch, or dinner? Dinner. I love preparing a meal for another person. It makes me feel really good to have people appreciate what I make.
Now it's your turn to play along! All you have to do is copy the blanks & answer them on your blog, then hop on over to The Little Things We Do & link up so others can read your answers.
I hope everyone has a fabulous weekend, and I hope to be back to regular creating and blogging soon!


Our Decoration department consists of professionals passionate about new decoration and home trends, modern furniture, design and architecture.
Made up of specialists, our team has profound knowledge of the furniture industry and its challenges, and is fully equipped to assist all brands and participants in this sector (interior design brands, furniture, bedding, garden furniture, culinary art, household textiles).
Our team can offer you bespoke services to respond to your every need in order to maximise your brand's exposure through a series of product launches, press events, and accompaniment to public and professional exhibitions.
Organised twice a year (in March/April and then in September/October), our open-day event 'Speed Beauty Shopping' offers brands a unique opportunity for media exposure; a chance to show off your newest products and develop new quality relations with key market leaders.
As well as staying in touch with traditional media (on and offline, TV and radio), professional media (press sector, market and distribution), and the general public (women's interest, men's interest, news, lifestyle, family, health), we are also in contact with influential decoration, design and lifestyle bloggers. We adapt each message and PR activity for each of your different target audiences.
In direct collaboration with Open2Digital, our branch completely dedicated to identity management and digital reputation, are able to develop a strategy to exert your influence on social media.
Thanks to our European teams and our branches based in China, North America and Africa, we have a vast quantity of resources at our disposal to ensure increased brand awareness and media exposure for your products on the foreign market.


text:
Historical Parallels for the Loopholes in the New Sanctions Against Russian Banks: 1914 and 2014
In the wake of the recent events in eastern Ukraine, the EU and the US have announced new sanctions against Russian business interests. The sanctions introduced earlier this year were so-called smart sanctions, targeted at just a handful of named individuals close to the Russian leadership. The sanctions that go into effect today are much broader and target entire sectors of the Russian economy. A number of Russian banks have been targeted by the sanctions, which go into effect today. However, the sanctions contain a number of loopholes regarding the UK subsidiaries of the Russian bank holding companies. Apparently, these UK-registered banks will continue to be able to operate. (See here, here, and here). Moreover, Russia's biggest bank, Sberbank, is exempted from the sanctions.
A columnist for Forbes magazine in the United States had this to say about the UK's approach:
As for the UK's David Cameron, although he likes to sound Churchillian, his core constituency, the London financial district, is undoubtedly already working 24/7 to get round the EU's attempts to isolate Russian banks. (Read full article here).
The loopholes related to Russian banks need to be put into some historical context. Moreover, as I show before here, some of them parallel the loopholes in the sanctions against German banks that the British government imposed in 1914.
Broad sanctions raise deep philosophical questions about whether it is right to harm the economic interests of an entire country for the sake of punishing a few individuals in its political leadership. For much of human history, of course, collective punishment was the norm and was accepted as pretty much legitimate. If Prince A invaded the territories of Prince B, soldiers loyal to Prince B had the right to rape and pillage any peasants or merchants who owed allegiance to Prince A. The same thing went on the high seas in wartime: commercial vessels belonging to private citizens in the enemy country were "fair game" for privateers, at least until the 1850s. The Old Testament, which our ancestors appear to have read a bit too frequently, seems to endorse this collective punishment approach. Indeed, parts of the Old Testament appear to condone genocide and sexual assault in war.
Anyway, the Enlightenment changed how people think about war. It did so by giving us the idea of individualism. Since then, the idea of collective punishment has been tempered by various attempts to distinguish states from citizens, innocents from policymakers, public from private property. Ever since the Enlightenment, this is an issue we've be wrestling with whenever a war is being fought.
Self-interest has also contributed to our increasing desire to distinguish ruler from ruled, enemy government from innocent civilian. The growth of an interconnected world economy over the last few centuries has made it difficult to wage economic warfare against a foreign nation without hurting one's own economy. This interconnectedness is most evident in the realm of finance, where there are long chains of financial obligations linking firms in belligerent and neutral countries..
There is a really interesting historical parallel with the First World War here. Of course, Russia and the West are not at war right now, unlike Germany and Britain in 1914. (The fighting is being done by proxy forces in eastern Ukraine). However, Western government are engaged in a form of economic warfare against Putin's regime that has generated debates that are somewhat reminiscent of those that took place in Britain during the early phases of the First World War.
Following its declaration of war against Germany on 4 August 1914, the British government was confronted with the question of whether it was going to permit commerce with Germany to continue. This question had been discussed by policymakers since 1911. In that year, Britain and Germany had come to the brink of war and had then pulled backed and resolved their dispute, which is who was going to colonize the Moroccans, peacefully. Although war had been avoided, it got people in both the government and the private sector thinking about what war between two economies that were so closely interconnected would mean for banks. Many of the policymakers who thought about this issue had read the works of Norman Angell, who had argued that sustained warfare before major economies would be impossible in the modern world because their economies were so interconnected.
British government had two contradictory sets of precedents it could follow. (These precedents were discussed in a wonderfully detailed history that was produced in early 1912 and which I read in the National Archives in Kew). Here's what the official history said.
In the eighteenth century, Britain had banned virtually all commerce with citizens of enemy states during wartime. During the Napoleonic Wars, Britain had fought a thorough going economic war against France and the other territories controlled by Napoleon. Call this the collective punishment or Old Testament approach to the global economy in wartime. This approach was advocated by Jackie Fisher, the First Lord of the Admiralty.
The other model considered by policymakers was that of the Crimean War of the 1850s, the last major European war. During this conflict, Britain opted not to interfere in trade with Russia or with merchant vessels that belonged to Russian private citizens. That war had been fought on the understanding that the West's grievance was strictly with the Russian state, not individual Russian merchants. British firms had been allowed to trade with Russia, provided they did so through Baltic ports rather than those near the Crimea, where the fighting was.
In my view, and the view of Olive Anderson, the policy taken during the Crimean War reflected the dominance in the 1850s of classical liberal or individualist ideas about laissez-faire, free markets, and the need to distinguish individual citizens from states. The 1850s were the high-water mark for the worldview the great economist Joseph Schumpeter would later call Methodological Individualism. Later on, more collectivist ways of viewing the world (e.g., nationalism) came back into vogue.
As Nicholas Lambert has shown in a recent, brilliant, and comprehensive book, there was lots of bureaucratic infighting in the British government in 1914 over whether to wage a total economic war against the German private sector. In 1914, the British government opted for a policy that was, at least superficially, closer to the eighteenth-century practice of total prohibition than the liberal taken during the Crimean War. The Trading with the Enemy Act announced in September 1914 was part of the British government's strategy for waging economic warfare against Germany, which involved a comprehensive blockade of Germany's coastline. Any British subject who had any commercial dealings, however trifling, with enemy alien firms without the prior consent of the government risked penalties ranging from fines to prison sentences. Sending letters to Germany via neutral countries without authorization from the censors also became illegal. Germans resident in the United Kingdom were interned and their property was entrusted to a Custodian of Enemy Property (There's a great new book on this rather illiberal episode in British history). (See here). Trade with neutral countries such as the Netherlands was subject to controls designed to prevent the transhipment of goods to customers in Germany. British corporations were prohibited from paying dividends to shareholders in Germany, although the British mail censors occasionally permitted needy British citizens to write to a German company with a view to having dividend remitted via the Netherlands.
The British government prosecuted a number of small firms and individuals for the offense of trading with the enemy in Britain. The goods mentioned in many of these indictments were of a non-military character, such as silk. Several owners of small factories in Britain were given prison sentences for trading with the enemy through the Netherlands and neutral countries. These were small-fry businessmen living in places like Manchester though—the politically-connected bankers in London were allowed to continuing dealing with big banks in Germany.
The Trading With The Enemy regulations of September 1914 contained a number of loopholes designed to minimize the impact on important British economic interests, particularly the cotton trade. It should be remembered that at the start of the war, the motto of the British government was "business as usual," and that it was only halfway through that Britain developed a full-fledged command economy with conscription and food rationing and so forth. So the existence of loopholes permitting the continuation of some of the peacetime channels of trade isn't totally surprising. The most visible of these loopholes related to banks.
In the early phases of the war, the London branches of five German banks were even permitted to continue to operate using German managers and clerks, albeit under the supervision of Sir William Plender, the senior partner of Deloitte, an accountancy firm with plenty of expertise in cross-border finance.
The slowness with which branches of German banks were liquidated was extremely controversial, especially after more and more British families received the dreaded telegram from the front announcing the death of one of their menfolk. The decision of the British government to allow the London branches of the German banks to continue operating was denounced in the newspapers owned by Lord Northcliffe, a specialist in vindictive yellow journalism. Northcliffe's editors targeted Plender, presenting him as a traitor.
By 1916, the British public's intensifying hatred of Germany forced the British government o accelerate the liquidation of the London branches of the German banks. However, as late as March 1918, British politicians were still complaining in parliament that the London branches of London branches of Deutsche Bank, the Dresdner Bank, and the Disconto-Gesellschaft were still operating in some fashion. In defending the policy, the Chancellor of the Exchequer, Bonar Law, explained that "these banks are kept going, not for the sake of the German shareholders, but for the sake of British and Allied creditors". This explanation was cold comfort to the widows of British soldiers, so legislation to facilitate the termination of the London operations of these banks was passed in August 1918, when the war was almost over.
The sanctions the EU has imposed on Russia are nicely calibrated to minimize the damage done to political powerful interest groups such as the City of London. It remains to be seen whether public opinion will tolerate the current arrangement.
Tags: economic warfare, EU Sanctions Against Russia, First World War, russian banks, Sberbank


text:
Mini-Cookbook
(Click the image to download from iTunes.)
Peek into the kitchen of Selina Albright, as she shares her favorite recipes and preparation methods, in celebration of the music single "Eat Something" from her March 2017 debut R&B album "Conversations."
DIGITAL DOWNLOAD OF "HOLDING ON"
"HOLDING ON" LYRICS
VERSE ONE:
I wanna run
I saw this path going so differently
Before it had begun
I didn't know
Everything that I build is susceptible to be destroyed
Before my work is done
Can I keep holding on
When my life no longer matters
The nights are getting longer
Cause I don't know if I
Can make it another day
VERSE TWO:
I'm so behind
I can't keep on pushing myself forward to watch them move the line
I gotta find
Any strength I have to break down this system that benefits the few
And take back what was mine
Will make it another day
Burn it all to the ground
The nightmare is done
It's gone on for too long
Your power is gone
I've come too far
I can still hold on!
I'll keep holding on
Till the whole world knows I matter
I feel myself getting stronger
My life is a gift I won't give away
LEAD VOCAL:
Just when I thought I had nothing left
I've found my faith again, faith again
The Lord said He won't forsake, won't forget
So I vowed that I won't give up yet!
DIGITAL DOWNLOAD OF "DISCOVERING"
AUTOGRAPHED HARD COPY CDs
Conversations: (2017) Autographed Mailed CD
AUTOGRAPHED HARD COPY OF SELINA'S FIRST FULL-LENGTH CD
RELEASE DATE: MARCH 17TH
She writes from experience. She doesn't hold back. Intimate and thoughtful, Selina Albright's "Conversations" is a richly poetic account of her personal journey through joy, betrayal, liberation, and hope.
The music rides a fine but intentional line between R&B and Jazz. Albright euphorically interweaves her soulful vocal melodies with a contemporary R&B production that gives away her Southern California roots, adorning the resulting sound with guest performances by such jazz legends as saxophonist Gerald Albright and guitarist Peter White.
Whether it be a playful song about culinary indulgence, or a tender expression of love, this distinguished collection of music is a blueprint into her heart.
Song List: 1. Eat Something (feat. Kay-Ta Matsuno) 2. Possible 3. If I Were A Boy (feat. Randy Ellis) 4. Talk To Her 5. Highest High 6. Wifey Anthem (You Don't Have To Fight At Home - feat. David P. Stevens) 7. Search My Name 8. Victim 9. Let Go (feat. Gerald Albright) 10. Uncharted Love
Sun Comes Up: (2016) Autographed Mailed CD
Add to cart: $3.00
Selina Albright's 2016 original single "Sun Comes Up," at first listen, is about the sun rising over the Earth as it rotates in its orbit. However, the artist's intention, is to describe her experience during her most recent epiphany. It reflects her urgency to change course, embracing a new lifestyle of fearlessness, focus, purpose, and a little sass.
Composed in 7/4 meter, this selection features world-renowned musicians, including her cowriter, jazz saxophonist Gerald Albright, keyboardist Chris "Big Dog" Davis, and drummer Jay Williams.
Sun Comes Up (feat. Gerald Albright)
Sun Comes Up (feat. Gerald Albright - Radio Edit)
Brighter: (2013) Autographed Mailed CD
Music Description: Selina Albright demonstrates her writing, producing, and performance versatility in her 2013 debut R&B EP "Brighter."
Brighter (feat. Gerald Albright)
How Do You Love Me
Didn't Cha Know
Don't Shake It Up
Why Does Life (feat. Brian Culbertson)
True By Design: CD
Hear Selina in 2006 as a member of Denver-based band, Future Jazz Project!
Only 25 copies available, so order now while supplies last, and you'll only pay shipping.
Support Selina's New Music & Make Her Day "Brighter" ;)
Track Selina Albright's Tour on Bandsintown
Become an Exclusive Email List Member for all the latest news... from yours truly!


text:
Q: Cannot extract jester dataset in windows 10 I know that this topic already appears in other posts but I'm not able to solve it and your help would be very much appreciated.
I'm trying to extract the Jester V1 Hand Gesture Recognition dataset but, when you download it, it comes in a very strange format. I've tried the command cat 20bn-jester-v1-?? | tar zx in the Windows Powershell which made my computer run something (don't know what) for several hours (I know that it was running because my computer was slow) but nothing changed in the file. And in the command line (this second option gave me an error). I've also tried to extract them with 7zip and was able to extract the first file but I couldn't accomplish it with the rest.
Please help, I'm using Windows 10 and have already installed 7zip and here's a screenshot of the files.
Thank you so much!

A: This page says to cat 20bn-jester-v1-?? | tar zx to extract the videos. However it also says that those 23 pieces are about 1 GB each. Your screen shot shows them as less than 1 MB each. Perhaps something went wrong further upstream.

A: A solution that I found to this problem is to install the Linux terminal on windows with ubuntu.


text:
Web Summit Highlights — Day #1
Nov 7 · 8 minutes read
topspeakers Reddit VC EuropevsSiliconValley Slack Booking gendergap appbusiness Highlights WebSummit Entrepreneurship techconference
The first day of Web Summit has come to an end, and we couldn't resist the temptation to share some of the highlights from Lisbon. Grab a glass of wine and enjoy, this is our way of making sure you don't miss the hot topics!
Inside the fastest-growing app business of history - Cal Handerson, CTO at Slack
In shorts and a holiday shirt, Cal Henderson, co-founder, and CTO at Slack opened the event with a talk about Slack, as being one of the top rising app businesses. We picked up one of Mamoon's remarks that we wanted to share with you:
Thank you for dressing up for the occasion — you look like life is a vacation every day.
From a gaming company to Slack?
When you see a headline like this, most times transition is what comes to your mind. Well, it is not the case here. Although it might seem that Slack has been the centerpiece of Cal's business in the early days, they actually built Slack so as to be able to communicate within their gaming company.
Once realizing they were not heading anywhere with the games they were building, they ditched that and started making an entry to the market with Slack, as a team communication tool.
Slack — product market fit
Cal talked about the initial product fit as being an observation and iteration process, going into different offices, observing the problems workers had and iterating on them.
We spent a huge amount of time talking to our potential customers. Once we put the product in the hands of the users whose problems we were solving, we realized things that could improve what we had already built.
Asked about some of the biggest mistakes they have done in the past 5 years, Cal mentioned that it is hard to pin down a single big mistake.
We constantly make mistakes and I think a big part of being successful is responding to those mistakes in a correct way.
When you find yourself being too busy, you might be stuck in the daily 'what to do' rather than focusing on a long-term strategy.
Firms or Government: Who should tackle the workplace gender gap?
Who should lead the way on gender equality in the workplace and how can both governments and companies ensure a fairer work environment?
As an open discussion Gillian Tans, CEO at Booking.com, Vera Jourova, the EU Commissioner for Justice, and Thorold Barker, Editor EMEA at The Wall Street Journal, tackled the gender gap topic pointing out some of the most important factors when it comes to gender equality and equal pay.
The discussion started off with Thorold pointing out the number of leading females in leadership roles declining in the last 4 years.
On a more positive note, it might be worth mentioning that at Web Summit, the percentage of women attendees is no of now of 44% compared to 24% five years ago.
Still, today, there are people doing the exact same job, and one of them is paid more than the other. So what are those things determining unequal pay?
Here's what Vera Jourova pointed out as being key factors:
Segregated Jobs — women that work jobs that are normally less paid
Care for families — women are seen as the centerpiece of the family
Moving on to the private sector, Gillian, CEO of Booking.com mentioned how companies should be the ones taking ownership for unequal pay.
Companies need to take ownership — they can do a lot by themselves to increase the numbers of female managers and the same applies to investors and owners of companies.
Investors should start understanding that it is good for their business to have more women in decision making positions. After the financial crisis, it was quite obvious that companies having females in leading positions felt the crisis earlier and were able to adapt faster.
— Gillian, CEO of Booking.com
Our side notes? We keep speaking about this as it is an issue concerning women only when it is actually a global problem that needs to be solved. Eventually, we'll get to see women being paid as men but until then we need to hurry because the gap is only widening.
Is Europe's tech scene finally heating up?
In past Europe has played in the shadow of Silicon Valley and China. However, over the last few years, European technology has exploded, with more unicorns than ever on the continent. How can Europe sustain this growth?
The question comes, is Europe the right ecosystem for early-stage startups?
There has never been a more exciting time to start as a startup, in Europe. It is clear that Capital Markets are thriving. With all the industries rising- fintech, healthcare and AI — right now Europe is the best place globally to start a company. So if you are a startup, you can definitely stay in Europe said Reshma Sohni, Managing Partner at Seedcamp.
Moving on to the financial side of every startup, we know now that London is one of the traditional hubs when it comes to the European startup ecosystem, but do startups really need to go to the main hubs when they are looking for money from VCs?
How should startups from other countries think about the European ecosystem?
One of the key jobs of a CEO should be raising money, so you have to be willing to go where the money is. That being said, you need to be flexible.
Still, most VCs are willing to invest in startups located in countries that are nowhere on the tech scene.
What do new startups bring to the market?
Enterprises are completely reinventing themselves. They digitize themselves, this means there are great opportunities for new software to be created in Europe, which was previously not the case.
Also, there is a lot of pressure on costs — a lot of developers are looking for more and more ways to reduce costs, and here we can see al the new technologies that come in hand with this matter.
If in the past we put money into developing software for banks, now we are investing in companies that are replacing banks.
Is being close to your target customers really that important when you are a startup?
In enterprise software, you need to be located where your key customers are. In online games for instance, people are everywhere.
You want to be close to where you can scale on distribution. The early stage of your startup you are trying to find out how to get traction and energy, and maybe, let's say moving to the USA might not be a good decision. It can't be done in a rush.
Many companies can thrive where they are. For instance, a lot of investment has been made in Barcelona (an ecosystem that was nowhere 10 years ago) this just shows that the world is powered by cloud and access to infrastructure.
How do you get your hands on the money if you are not based in one of the European hubs?
Don't wait until you are big. Find the guy who knows a guy. It might be a friend that knows a VC. Just get a slightly warm intro and you will get noticed.
Adding to this, Reshma mentioned finding their companies through a type form they placed on their site.
What I wish a VC had told me — Venture capitalist Alexis Ohanian
Venture capitalist Alexis Ohanian discusses the lessons he wishes investors had shared as he was building Reddit, one of the most viewed websites on the planet.
I heard I am the last speaker before lunch — no pressure.
Look for peers, not mentors — You might find yourself looking at the people that are on stage these days and think how much you'd like for them to be your mentors. The point is, you know more about your struggles than they do. Instead of looking for a mentor, go out and look for peers that are one level above you because they went through the stuff you are going right now not so long ago, and definitely not 10 years ago.
You are the average of your 5 friends — this is a no-brainer. You are the sum of the people you spend most of your time with.
Seek authenticity not authority — People seek transparency and authenticity and as an early stage startup that's what you have. You have to be real — this currency weights much more.
Become ruthless at prioritizing your schedule. Spend every Monday and Sunday going through the things you want to accomplish. There are always going be distractions and obstacles standing in your way — lear to triage.
Focus on the very specific things that make your product special. Obsess over them and cast all other distractions on the side. So many entrepreneurs get distracted after they find their product fit.
Health not hustle — is hustle porn a thing in the European startup ecosystem? It is the idea that unless you are working on stuff all the time, bragging, struggling and showing that you're suffering on Instagram, you are not working.
Don't let hustle porn infect your brain. So many times I wished I had someone to talk to. Bring people in your life that you can talk to about your health and your personal struggles besides work.
Garbage in garbage out — start investing in yourself mentally and physically now.
Values not friendships — a lot of startups team come together because they were friends before. Understand that you not only have a friendship in common but you share values. It is not only about the list of 10 values you hang on the walls of your company and you try to get into everyone's head, but it is about personal values. Share an alignment in how you see the world.
Cyborgs not robots — we build software to scale the unscalable. There are a lot of people out there offering black box solutions. I really believe that the future of humanity are cyborgs. Automation is doing all our jobs cheaper and faster.
Be relentless — there are going to be haters and detractors, a lot of noise in your life but you need to stand firm on your position. Get better as using no as a motivation in your life. You will hear a lot of nos in your entire life as an entrepreneur and, that is perfectly okay.
That's it about Web Summit Highlights - Day #1! If you are around Web Summit these days make sure to meet Gina, our CEO, and Adrian, the CTO of Wolfpack Digital. They are the coolest, and, oh, did we forget to mention they are fluent in startups and tech?
Also, stay tuned for Web Summit Highlights day #2!
Here's a selfie with Gina and Adrian.
Want us to build your app? Contact us and let's build powerful web and mobile apps together!
Want to know what Wolves are up to? Because Wolfpack Digital has a newsletter.
Want to work with us? Because Wolfpack Digital is hiring.
In case you are a Front-End developer and you want to test your skills, we have prepared a Quiz for you.
💪 Take the Quiz Now.
United Kingdom: +44 2039364492
Romania: +40 (741) 363 743
HQ: Racovita 33, 400165 Cluj-Napoca, Romania
Mobile and Web Apps Start-to-End
Follow the track of our paws to stay in touch with our latest adventures
Progressive Web Apps Are here. Now what?
We Have a Thing for the Internet of Things (IoT)
© Wolfpack Digital 2020


text:
The investigation into Gülistan Doku's disappearance raises critical questions
Eylül Deniz Yaşar – Ankara
This final article in this series features exclusive interviews with people who have been closely following the investigation into the disappearance of Gülistan Doku, a young Kurdish woman studying at Munzur University in Tunceli (Dersim), a Kurdish majority province of eastern Turkey. Gülistan Doku has been 'disappeared' since 5 January 2020. Close friends, women activists and lawyers in Turkey who seek justice have voiced their concerns about a cover-up of what might have actually happened.
Leading women activists fighting for justice for Gülistan Doku for a whole year, as well as a prominent feminist lawyer, argue that the case might actually be one of 'femicide'. They also shared their suspicions that the Turkish state might be protecting the lead suspect even as it tries to suggest that Gülistan might have committed 'suicide'.
An online petition highlighting these concerns – "Find Gülistan Doku: bring the perpetrators to Justice" – can be reached through this Change.org link.
The attacks in Dersim 'reveal direct or non-direct representatives of the state'
Activist women from the Dersim Women's Platform have been at the forefront of the "Where is Gülistan Doku?" campaign this past year. They have organised demonstrations and issued press statements, asked the Turkish authorities about the whereabouts of Gülistan Doku, and questioned why Zaynal Abakarov, the prime suspect, is being protected.
Tuba Apaydın, a young female activist from Dersim and a member of the Dersim Women's Platform, sees a pattern in the attacks on women that are taking place and observed that transgressions by the soldiers, police, guards ('korucu') and all kinds of law enforcement forces must be seen as part of an organised, systematic attack by the state which has its connections with the Turkish state's war policies in Dersim.
"Gülistan Doku was lost in Dersim, Sakine Oğuz and Esma Kılıçarslan were murdered in Hozat, three specialist sergeants raped a Kurdish woman. The latest murders of women in Dersim have reached the level of massacre. Furthermore, the increasing rates of harassment and rapes in the region are not coincidental or random acts of violence. Look at the profiles of the men who have committed violence against women in Dersim: the perpetrators are mostly family members of soldiers, policemen or guards. The attacks targeting women in Dersim reveal direct or non-direct representatives of the state", she said.
The state targets women as a 'special war' tactic in Kurdish cities
Apaydın noted that the orientation towards attacks on women in Dersim forms part of the 'special war' tactics of the Turkish state. Attacks continue in all the other Kurdish cities such as Diyarbakır (Amed), Hakkari (Colemêrg), Bingöl (Çewlîg) and Şırnak (Şirnex) but Dersim, given its symbolic significance as a site of Kurdish assault, massacre and resistance (where it never bowed to state oppression) has a special democratic character which makes it a special target for state forces.
According to Apaydın, the women living, studying and working in Dersim are a special target of the Turkish state's law enforcement officers engaged in a "non-direct violence" initiative: there is a special orientation towards targeting the region's women in order to make them state agents and to make them work for the intelligence services through pressure, blackmail and threats of various kinds.
"This state is fed by the patriarchal mentality that sees women as 'spoils of war'. By attacking women like Gülistan, they want to send people in the region a message. When it comes to organised, activist women, the violence towards them takes on a direct character such as police attacks, detentions and imprisonment as well as straight killings and murders. Remember that Gökçe Kurban's head was cut off after she was killed in an air strike. The women engaged in a democratic struggle also reveal the true character of the state, because when we exposed a harasser, named Hüseyin Polat, we then faced direct police attacks. They attacked us with pepper spray in our demonstrations for Gülistan. As the Dersim Women's Platform, we will never give up asking where Gülistan Doku is", she said.
'The Turkish state protects the lead suspect'
Justice Commissions for Gülistan Doku have united all efforts to find Gülistan Doku, organizing protests and social media campaigns to keep her high on the agenda of the human rights struggle in Turkey for the past year. The Commissions announced a country-wide protest on 5 January, the first anniversary of Gülistan's disappearance.
Tuğba Yalar, a campaigner for the Justice Commissions, shared the reasons for their concern that the state might be protecting the lead suspect, Zaynal Abakarov: "A water scientist who reached us through one of our hashtag campaigns analysed the security footage and filming of the dam lake and prepared a report, but the state has never worked on this footage, despite all our appeals. Minister Süleyman Soylu ordered the lowering of the dam waters to the minimum level seven months after Gülistan vanished. Despite the expert report stating that Gülistan has not committed suicide, Zaynal Abakarov has still not been brought to justice. His step-father, Engin Yücer, had access to the investigation file from the beginning. The state let the Abakarov's family move away from the city", she said.
'The investigation is held in favour of the suspects'
Candan Dumrul, a prominent feminist lawyer in Turkey, pointed out the legal irregularities of the case relating to Gülistan Doku's investigation. "The investigation is far from being effective. The officers conducting the investigation are in a close relationship with the policeman father of the lead suspect. So, the investigation is held in favour of the suspects. Official reports were prepared without the prosecutor's demand: this is just one of the many irregularities we have observed", she said.
In response to the question, 'What could have been done to advance an effective investigation?', Dumrul replied: "Searches limited to searches in the water are not eligible to enlighten this case file. The range of the searches that needed to be undertaken must have been extended. In the places where no security camera footage could be obtained, not only law enforcement officers' statements should have been taken into account and assessed, but also those of the experts, who are professionals in analyzing 'disappearance cases'. They should have been consulted. The father of the suspect should have been restricted from gaining access to the investigation file from the very beginning. An objective team of specialists should have worked on the investigation, who are completely independent to the suspect's police officer's father. The searches should have been extended outside merely the waters of the Uzunçayır dam lake".
Candan Dumrul: There is a huge problem with the conduct of the investigation
Noting the fact that the whole investigation is shaped by the assumption that Gülistan might have committed suicide, lawyer Dumrul said: "This is, in itself, a huge problem with regard to the conduct of the investigation, because Gülistan might be being held captive right now. She might still be alive. A delay of a whole year in trying to find her might actually cause her to lose her life. There is no solid evidence for the 'suicide assumption' anyway. In addition to this, the testimonies of Gülistan's family and friends suggested that there was no sign of any suicidal tendency in her life. These are all crucial testimonies in legal processes that need to be considered. We cannot just base our assumptions on the claims of 'suicide' that have been projected in such a case. We should consider her story within the context of continuing male violence during her life".
Speaking on a legal basis, suicide should be the last option and assumption to consider in the death or loss of a woman, noted Dumrul. "There are many suspicions that this might be a murder that seems to have been covered up as a 'suicide'. We have the example of Şule Çet, so in Gülistan Doku's case, this possibility cannot be disregarded", she stated.
"The fact that Şule Çet was raped and murdered was revealed as a result of the consistent justice struggles of women, but the system of justice has always had a sexist approach, judging how the victim woman has lived her life, rather than judging the actions of suspects or perpetrators. Unfortunately, the system of justice in Turkey takes up a position in favour of the perpetrator via the impunity we see in people murdering women. Therefore we, as female law makers and as feminists, must continue the struggle to seek justice for Gülistan Doku".


The 532 acre Vassar Farm and Ecological Preserve has been excluded as it managed for ecological conservation and research.
Within the main campus where grounds are managed there are 68 acres of buildings and other impervious surfaces.
Much of the campus has been shifted to a "mow and grow" approach that just focuses on mowing the grass once a week during the growing season. These lawns do not have any chemical or inorganic products applied to them. This fits with our certification as a Tree Campus USA and the Audubon Cooperative Sanctuary campus program.


text:
Calakmul is een gemeente in de Mexicaanse deelstaat Campeche. De hoofdplaats van Calakmul is Xpujil. Calakmul heeft een oppervlakte van 13.839 km² en 23.814 inwoners (census 2005).

Calakmul is de grootste gemeente van Campeche en een van de tien grootste van Mexico, zij is net iets groter dan Vlaanderen. Het grootste deel van Calakmul is bedekt met tropisch regenwoud, waarvan een groot deel beschermd is als biosfeerreservaat. Verscholen in het regenwoud bevinden zich tientallen Mayavindplaatsen, waaronder de Mayastad Calakmul, waarnaar de gemeente genoemd is. Andere Mayasteden binnen de gemeentegrenzen zijn Balakbal, Balamkú, Becán, Chicanná, Hormiguero, Río Bec en Xpujil.

Calakmul is opgericht als gemeente in 1996, voorheen maakte het onderdeel uit van Hopelchén. Een groot deel van de inwoners bestaat uit Ch'ol en Yucateken.

Gemeente in Campeche

redpajama_set_name: RedPajamaWikipedia


Various operations, services and processes call for caution and require the use of gloves. The 'Gloves Required' signs is a loud and clear indication for companies to enforce the best safety practices by ensuring workers make use of their safety gloves. It is common for these signs to have the official OSHA symbol.
Examples of Gloves required signs - Choose one of our example signs and adapt it to your requirements.


Søndagsmaler involved crossing a series of stepping stones, the first step a response to the project's evocation of empty spaces. Empty spaces led to the 'dead air' of a channel of transmission temporarily unoccupied by any signifying event.
'Dead air' suggested R. Murray Schafer's proposal for a radical radio. And then I wondered how Schafer's invocation of the auditory space of streaming soundscapes could itself be emptied. Faltering mid-crossing, uncertain which path to take, I remembered the Danish artist – and one-time Situationist – Asger Jorn retrieving Sunday paintings from flea markets and covering them in forms rendered from gloopy gouache.
To develop the acoustic equivalent of a Sunday painting, I sought out the twee and the sentimental, a palette of children at play, birds billing and cooing, leaf rustle and aircraft circling overhead. And then I really got stuck, water lapping at my shoe, the other bank receding: how to do the gloop? I tried Foley work on everything from porridge to paint, tried audio modelling, synthesis and processing. Nothing worked, nothing gave the right coat to cover the Sunday sounds that were to lie beneath. Looking over my shoulder, I saw a route back to where I started and decided to take it, abandoning the remaining stepping stones and leaving the flea market ambience as the track itself.
Angus Carlyle is curious about how we make sense of our environment, through sound and through our other senses. He edited the book "Autumn Leaves" for Double Entendre (2007), made the sound work "51° 32 ' 6.954" N / 0° 00 ' 47.0808" W" for the "Sound Proof" group show (2008), co-curated the exhibition "Sound Escapes" at Space Gallery in London (2009) and produced the CD "Some Memories of Bamboo" (2009) for the label Gruenrekorder.
In 2012 he completed a sixth month residency project called "Viso Come Territorio" / "Face As Territory", a collaboration with 7 photographers based around a village on a Southern Italian hillside. Another project Air Pressure has been a long collaboration with the anthropologist Rupert Cox that led to an exhibition (part of the Asia Triennial Manchester), a CD/ booklet, two films and a series of papers.
top image: Asger Jorn, The Worrying Duck, sound: Angus Carlyle.


So, I was contemplating the various smells I have experienced upon entering an active restroom. There is a disturbing trend that I seem to be noticing. Whenever I walk into the public restroom I notice a smell of poop and deodorant. However, it seems the poop and deodorant are mixed. Why does deodorant seem to be... show more So, I was contemplating the various smells I have experienced upon entering an active restroom. There is a disturbing trend that I seem to be noticing. Whenever I walk into the public restroom I notice a smell of poop and deodorant. However, it seems the poop and deodorant are mixed. Why does deodorant seem to be emanating from the poop? Is there deodorant in are poop?
Best Answer: You are the poop. Be the poop.


text:
Everything You Should Know About Noah Beck's Sisters, Tatum and Haley
By Leila Kozma
As one of the most popular members of the Sway House, Noah Beck frequently shoots TikTok videos with Blake Gray, Bryce Hall, Jaden Hossler, and the like.
The social media influencer tends to post updates about the latest developments taking place in his personal life. His two sisters, on the other hand, hardly ever feature in his TikToks. Why?
Noah Beck has two sisters, Tatum and Haley.
Although Noah barely ever makes content featuring his family, he appears to have a good relationship with his two older sisters. As a lifelong football-head, Noah spent two years of his high school studies at one of the leading academies for ambitious football players, the Real Salt Lake Academy based in Herriman, Utah.
Tatum, one of Noah's sisters, likely shares his passion for sports, as she was a cheerleader in high school.
Noah and Tatum have at least one more interest in common: social media.
Tatum posted her first-ever TikTok video on Jan. 14, 2018, and in less than three years, she managed to obtain a whopping 516,700 followers. Likewise, she has about 30,000 Instagram followers to boast, having registered on the platform around November 2013.
An exceptional dancer with a great sense of style, Tatum often posts her takes on dance challenges, older videos capturing her achievements as a cheerleader, and clips chronicling her latest adventures with friends. Her boyfriend, Ty Howard, features in her TikToks regularly as well.
From participating in a heated game of beer pong to playing with her 18-pound-cat, Tatum tends to create content that's hilarious and original at the same time.
Unlike Noah and Tatum, Haley prioritizes privacy over social media stardom. Her Instagram account is currently set to private, and it's uncertain if she registered on TikTok at all.
Although she did make an appearance on one of Noah's recent TikTok Lives featuring most of the Beck family, she didn't get that many opportunities to talk about herself.
Noah's sisters and his mom have recently created a TikTok clip together.
For one of her recent TikTok videos, Tatum invited her mom and her sister, Haley, to participate in a game of "Most Likely To" with her.
As the short clip reveals, their mom thinks that Tatum is the most likely to become a reality TV star. She is also the most likely to get into a bar fight, sleep through her class and get arrested. According to their mom, Tatum is the friend that gets everyone to go out, and the person that's most likely to crash their car. As their mom believes, she is the biggest flirt as well.
@tatum_beck
♬ MOST LIKELY TO.bff edition - ccast1011
Source: TikTok
As the short clip prompts, Haley is most likely to hook up with a random guy, marry an athlete, or bail out their mom if she needed her to. She also has the biggest problem with liking boys who wouldn't give them the time of day, and the one who has hooked up with the most number of people.
Judging by the TikTok video, the two sisters are equally adventurous and outgoing.
Noah Beck Is Currently Single, Though His Hype House Friends Want to Change That
According to a New Rumor, Noah Beck Might Have Dropped out of College
Watch out, Gen Z! Millennial Dance Moves Are Taking Over TikTok
Nick Carter and Wife Lauren Announce They're Expecting After Suffering "Multiple Miscarriages"
The Filming of 'Mr. Mayor' Had to Be Shut Down at Least Twice in 2020
Bring on the Magic! When Can We Watch 'WandaVision'?
Toby Keith Accepted a Medal From the President, but Does He Support Trump?


text:
'Live PD' to continue filming in El Paso next year
Daniel Borunda
A complaint about a neighbor's Christmas lights. A convict who turned his life around. Suspects running from the police.
The reality policing television program "Live PD" has aired a variety of encounters the public has had with El Paso police — from the mundane to the violent.
The television program will continue filming with the El Paso Police Department after the holidays, a department spokesman said.
The El Paso Police Department is one of six agencies featured on the three-hour television show that airs Fridays and Saturdays on the A&E cable network.
New episodes are on a break during the holidays, but the live broadcast is set to resume Jan. 5, said Sgt. Robert Gomez, a spokesman for the El Paso Police Department.
"We have received a lot of positive feedback," Gomez said about the show.
"Live PD" crews began riding with various El Paso police officers on Oct. 6 and filming has continued on weekly through December.
More:Body-worn cameras raise questions, concerns for El Paso police
Aftermath of El Paso double-homicide captured on reality TV show
Johnny Cash the police dog finds wanted man in vacant Kmart store
Some segments are broadcast the same night and others are recorded before airing on television.
Most of the filming has been in Northeast El Paso, though there has been filming in other parts of the city.
Gomez said that the police department's contract with the program will be evaluated about every six to eight weeks.
So far, the department and officers who have taken part in the show are happy with the weekly national television exposure, Gomez said, adding that they enjoy it.
"It's shedding light on what they do every day. It's positive and El Pasoans need to see what they do," Gomez said.
The show includes in-studio commentary and has a large following on Twitter with fans commenting about what they are seeing.
"Live PD" also has its critics.
Some have called the program "the most disturbing show on television" and a "damn shame" for exploiting police work as entertainment.
One criticism stems from a January case when a woman learned her son had been killed after seeing his body on a broadcast with sheriff deputies in Richland County, S.C., according to local news reports.
The Tulsa World reported that the Tulsa police chief didn't renew the contract with the show in January 2017 after criticism and concerns were raised.
"Live PD" had regularly featured the Tulsa police Gang Unit during the show's first season in 2016.
More:El Paso police hope being on 'Live PD' show helps lure recruits
Famed El Paso police K-9 Johnny Cash foils man's alleged attempt to flee from police
El Paso County featured on 'Jail: Big Texas'
Reality TV star Kim Kardashian draws massive crowd
A Tulsa activist group complained the program showed residents in a bad light and the mayor expressed concerns the video crews were a distraction after a cameraman stood by filming two officers wrestling on the ground with a man with a gun.
The show has become increasingly popular with cable television audiences.
"Live PD" is a hit for A&E with viewership up 145 percent since the show began and is averaging 2.1 million viewers, IndieWire.com reported.
Daniel Borunda may be reached at 546-6102; dborunda@elpasotimes.com; @BorundaDaniel on Twitter.


text:
Foot Locker invests $3 million in episodic ecommerce retailer NTWRK
James Risley | Sep 30, 2019
The shoe chain giant has invested at least $135 million in online retailers this year.
Shoe retailer Foot Locker Inc. invested $3 million in NTWRK, an ecommerce startup that provides limited numbers of products in drawings and drops. The investment is the seventh for Foot Locker this year. Foot Locker is No. 60 in the Internet Retailer 2019 Top 1000.
NTWRK offers limited edition products, including sneakers, streetwear and figurines, in an "episodic" format, releasing items for sale alongside unique videos that hype up the product, including the celebrity creators behind the products. These products are available in drops, in which buyers can purchase until the items are sold out, or via drawings, allowing shoppers to join the running for a unique item with hopes of getting it at a steep discount.
A snapshot of ecommerce sales of footwear
Brendan Reilly | Aug 16, 2019
NTWRK's main channel is an app, which allows the company to experiment with video production and shopping options. And since users must input shipping and credit card information before even viewing the drops and drawings, the app reduces the friction that can slow down limited-time sales. The company also operates a website and plans to add pop-up shops in the future.
"NTWRK's innovating and engaging content platform is pioneering the way brands tell their stories and the way youth culture shops," said Foot Locker CEO Richard Johnson in a statement. "At Foot Locker, we are focused on continuing to elevate the customer experience and investing for growth, and our partnership with NTWRK reflects our commitment to driving our business in new and exciting ways."
Foot Locker led the investment round alongside entertainment giant Live Nation, with NTWRK raising a total of $10 million for this Series A round.
Foot Locker has been doing plenty of other investing this year: Foot Locker invested $100 million in footwear marketplace GOAT in February, its largest funding round to date. It also invested $12.5 million in direct-to-consumer children's apparel brand Rockets of Awesome, No. 1966 in the Internet Retailer 2019 Next 1000, as well as another $10 million in performance fashion retailer Carbon38 (No. 1428) and a $3 million seed round for kids footwear brand Super Heroic.
Foot Locker's pattern of investments reflects the variety of ways shoes are being sold online, from one-off sales of high-value sneakers on marketplaces, to retailers focused on more vertical niches in the market that serve consumers' full lifestyle, such as Carbon38.
Foot Locker's web sales grew 12.8% in 2018, according to Internet Retailer estimates, and is the third-largest in the footwear category of the Top 1000 after manufacturers Nike Inc. (No. 33) and Adidas AG (No. 36). However, Foot Locker's growth is below the total category growth of 22.6%. Startups like Allbirds and Rothy's, which both make their own shoes, led growth in the footwear category.
Marketplaces for shoes are also on the rise. In the Internet Retailer Online Marketplaces ranking, GOAT is No. 59, behind only StockX at No. 31 in footwear marketplaces. However, Flight Club (No. 68), Stadium Goods (No. 71) and Kixify (No. 76) also round out the footwear rankings, with growth across the category hitting 30.9%.
Ecommerce Statistics
Foot Locker opens new digitally focused store with Nike app integration
Stephanie Crets | Aug 14, 2019
Foot Locker's online sales grow double digits in Q2
James Melton | Aug 23, 2016
Roundup: Personalization pushes Nike's online sales to grow 42%
How Nike is bridging the digital divide
Stephanie Crets | Mar 26, 2019


Re: Painter and Decorator needed???
Topic: Painter and Decorator needed???
Thanks for your replies. I'm aware of those websites and was just trying to locate one locally I could meet. I'm sorted now thanks and am meeting a couple locally.
don't forget tonight - at The Roundhouse.
we have another au pair night out planned on Monday 29th October at the County Arms.
Tell her to head along - ask at the bar if she can't find the group who usually have a balloon. Around 20 will go I'm sure great opportunity to meet new au pairs.


text:
CFD analysis of diffuser augmented wind turbine
Authors: Sagar Gade, P. V. Deshmukh, S. S. Patil, S. S. Khasbage, R. R. Deshmukh
Sagar Gade, P. V. Deshmukh, S. S. Patil, S. S. Khasbage, R. R. Deshmukh
AISSMS College of Engineering Pune, Maharashtra, India
DAWT, Windlens, Brim, Diffuser
Sagar Gade, P. V. Deshmukh, S. S. Patil, S. S. Khasbage, R. R. Deshmukh. CFD analysis of diffuser augmented wind turbine, International Journal of Advance Research, Ideas and Innovations in Technology, www.IJARIIT.com.
Sagar Gade, P. V. Deshmukh, S. S. Patil, S. S. Khasbage, R. R. Deshmukh (2019). CFD analysis of diffuser augmented wind turbine. International Journal of Advance Research, Ideas and Innovations in Technology, 5(3) www.IJARIIT.com.
Sagar Gade, P. V. Deshmukh, S. S. Patil, S. S. Khasbage, R. R. Deshmukh. "CFD analysis of diffuser augmented wind turbine." International Journal of Advance Research, Ideas and Innovations in Technology 5.3 (2019). www.IJARIIT.com.
Flanged Diffuser is a collecting-accelerating device that shrouds a turbine. Forgiven rotary engine diameter, the power augmentation may be achieved by a brimmed diffuser, popularly known as wind lens. the current numerical investigation deals with the result of the low region created by wind lens to analyze the sturdy vortices shaped by brim connected to the shrouded diffuser at the exit. additionally, during this analysis, a comparative numerical prediction of mass flow rates the turbine has been allotted with numerous sorts of wind lens that successively helps to optimize the torque augmentation. it's been well-tried that there's an important increase within the vortex strength & wake formation once the brimfull effect is added to a diffuser.