text:
package org.apache.parquet.hadoop;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.fs.FileStatus;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.FSDataOutputStream;
import org.apache.parquet.crypto.ColumnDecryptionProperties;
import org.apache.parquet.crypto.ColumnEncryptionProperties;
import org.apache.parquet.crypto.DecryptionKeyRetrieverMock;
import org.apache.parquet.crypto.FileDecryptionProperties;
import org.apache.parquet.crypto.FileEncryptionProperties;
import org.apache.parquet.crypto.ParquetCipher;
import org.apache.parquet.crypto.ParquetCryptoRuntimeException;
import org.apache.parquet.crypto.SingleRow;
import org.apache.parquet.example.data.Group;
import org.apache.parquet.example.data.simple.SimpleGroupFactory;
import org.apache.parquet.hadoop.example.ExampleParquetWriter;
import org.apache.parquet.hadoop.example.GroupReadSupport;
import org.apache.parquet.hadoop.metadata.ColumnPath;
import org.apache.parquet.io.api.Binary;
import org.apache.parquet.schema.MessageType;
import org.apache.parquet.schema.Types;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ErrorCollector;
import org.junit.rules.TemporaryFolder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import okhttp3.ConnectionSpec;
import okhttp3.MediaType;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;

import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import static org.apache.parquet.hadoop.ParquetFileWriter.Mode.OVERWRITE;
import static org.apache.parquet.schema.PrimitiveType.PrimitiveTypeName.BOOLEAN;
import static org.apache.parquet.schema.PrimitiveType.PrimitiveTypeName.INT32;

/*
 * This file contains samples for writing and reading encrypted Parquet files in different
 * encryption and decryption configurations. The samples have the following goals:
 * 1) Demonstrate usage of different options for data encryption and decryption.
 * 2) Produce encrypted files for interoperability tests with other (eg parquet-cpp)
 *    readers that support encryption.
 * 3) Produce encrypted files with plaintext footer, for testing the ability of legacy
 *    readers to parse the footer and read unencrypted columns.
 *
 * The write sample produces number of parquet files, each encrypted with a different
 * encryption configuration as described below.
 * The name of each file is in the form of:
 * tester<encryption config number>.parquet.encrypted.
 *
 * The read sample creates a set of decryption configurations and then uses each of them
 * to read all encrypted files in the input directory.
 *
 * The different encryption and decryption configurations are listed below.
 *
 *
 * A detailed description of the Parquet Modular Encryption specification can be found
 * here:
 * https://github.com/apache/parquet-format/blob/encryption/Encryption.md
 *
 * The write sample creates files with seven columns in the following
 * encryption configurations:
 *
 *  UNIFORM_ENCRYPTION:             Encrypt all columns and the footer with the same key.
 *                                  (uniform encryption)
 *  UNIFORM_ENCRYPTION_PLAINTEXT_FOOTER: Encrypt all columns with the same key.
 *                                  Do not encrypt footer.
 *  ENCRYPT_COLUMNS_AND_FOOTER:     Encrypt six columns and the footer, with different
 *                                  keys.
 *  ENCRYPT_COLUMNS_PLAINTEXT_FOOTER: Encrypt six columns, with different keys.
 *                                  Do not encrypt footer (to enable legacy readers)
 *                                  - plaintext footer mode.
 *  ENCRYPT_COLUMNS_AND_FOOTER_AAD: Encrypt six columns and the footer, with different
 *                                  keys. Supply aad_prefix for file identity
 *                                  verification.
 *  ENCRYPT_COLUMNS_AND_FOOTER_DISABLE_AAD_STORAGE:   Encrypt six columns and the footer,
 *                                  with different keys. Supply aad_prefix, and call
 *                                  disable_aad_prefix_storage to prevent file
 *                                  identity storage in file metadata.
 *  ENCRYPT_COLUMNS_AND_FOOTER_CTR: Encrypt six columns and the footer, with different
 *                                  keys. Use the alternative (AES_GCM_CTR_V1) algorithm.
 *  NO_ENCRYPTION:                  Do not encrypt anything
 *
 *
 * The read sample uses each of the following decryption configurations to read every
 * encrypted files in the input directory:
 *
 *  DECRYPT_WITH_KEY_RETRIEVER:     Decrypt using key retriever that holds the keys of
 *                                  the encrypted columns and the footer key.
 *  DECRYPT_WITH_KEY_RETRIEVER_AAD: Decrypt using key retriever that holds the keys of
 *                                  the encrypted columns and the footer key. Supplies
 *                                  aad_prefix to verify file identity.
 *  DECRYPT_WITH_EXPLICIT_KEYS:     Decrypt using explicit column and footer keys
 *                                  (instead of key retrieval callback).
 *  NO_DECRYPTION:                  Do not decrypt anything.
 */
public class TestEncryptionOptions {
  private static final Logger LOG = LoggerFactory.getLogger(TestEncryptionOptions.class);
  // The link includes a reference to a specific commit. To take a newer version - update this link.
  private static final String PARQUET_TESTING_REPO = "https://github.com/apache/parquet-testing/raw/40379b3/data/";

  @Rule
  public TemporaryFolder temporaryFolder = new TemporaryFolder();

  @Rule
  public ErrorCollector localErrorCollector = new ErrorCollector();
  private ErrorCollector errorCollector;

  private static String PARQUET_TESTING_PATH = "target/parquet-testing/data";

  private static final byte[] FOOTER_ENCRYPTION_KEY = "0123456789012345".getBytes();
  private static final byte[][] COLUMN_ENCRYPTION_KEYS = { "1234567890123450".getBytes(),
    "1234567890123451".getBytes(), "1234567890123452".getBytes(), "1234567890123453".getBytes(),
    "1234567890123454".getBytes(), "1234567890123455".getBytes()};
  private static final String[] COLUMN_ENCRYPTION_KEY_IDS = { "kc1", "kc2", "kc3", "kc4", "kc5", "kc6"};
  private static final String FOOTER_ENCRYPTION_KEY_ID = "kf";
  private static final String AAD_PREFIX_STRING = "tester";

  private static final byte[] footerKeyMetadata = FOOTER_ENCRYPTION_KEY_ID.getBytes(StandardCharsets.UTF_8);
  private static final byte[] AADPrefix = AAD_PREFIX_STRING.getBytes(StandardCharsets.UTF_8);

  private static final int ROW_COUNT = 10000;
  private static final List<SingleRow> DATA = Collections.unmodifiableList(SingleRow.generateRandomData(ROW_COUNT));
  private static final List<SingleRow> LINEAR_DATA = Collections.unmodifiableList(SingleRow.generateLinearData(250));

  private static final MessageType SCHEMA = SingleRow.getSchema();

  private static final DecryptionKeyRetrieverMock decryptionKeyRetrieverMock = new DecryptionKeyRetrieverMock()
    .putKey(FOOTER_ENCRYPTION_KEY_ID, FOOTER_ENCRYPTION_KEY)
    .putKey(COLUMN_ENCRYPTION_KEY_IDS[0], COLUMN_ENCRYPTION_KEYS[0])
    .putKey(COLUMN_ENCRYPTION_KEY_IDS[1], COLUMN_ENCRYPTION_KEYS[1])
    .putKey(COLUMN_ENCRYPTION_KEY_IDS[2], COLUMN_ENCRYPTION_KEYS[2])
    .putKey(COLUMN_ENCRYPTION_KEY_IDS[3], COLUMN_ENCRYPTION_KEYS[3])
    .putKey(COLUMN_ENCRYPTION_KEY_IDS[4], COLUMN_ENCRYPTION_KEYS[4])
    .putKey(COLUMN_ENCRYPTION_KEY_IDS[5], COLUMN_ENCRYPTION_KEYS[5]);

  public enum EncryptionConfiguration {
    UNIFORM_ENCRYPTION {
      /**
       * Encryption configuration 1: Encrypt all columns and the footer with the same key.
       */
      public FileEncryptionProperties getEncryptionProperties() {
        return FileEncryptionProperties.builder(FOOTER_ENCRYPTION_KEY)
          .withFooterKeyMetadata(footerKeyMetadata).build();
      }
    },
    ENCRYPT_COLUMNS_AND_FOOTER {
      /**
       * Encryption configuration 2: Encrypt six columns and the footer, with different keys.
       */
      public FileEncryptionProperties getEncryptionProperties() {
        Map<ColumnPath, ColumnEncryptionProperties> columnPropertiesMap = getColumnEncryptionPropertiesMap();
        return FileEncryptionProperties.builder(FOOTER_ENCRYPTION_KEY)
          .withFooterKeyMetadata(footerKeyMetadata)
          .withEncryptedColumns(columnPropertiesMap)
          .build();
      }
    },
    ENCRYPT_COLUMNS_PLAINTEXT_FOOTER {
      /**
       * Encryption configuration 3: Encrypt six columns, with different keys.
       * Don't encrypt footer.
       * (plaintext footer mode, readable by legacy readers)
       */
      public FileEncryptionProperties getEncryptionProperties() {
        Map<ColumnPath, ColumnEncryptionProperties> columnPropertiesMap = getColumnEncryptionPropertiesMap();
        return FileEncryptionProperties.builder(FOOTER_ENCRYPTION_KEY)
          .withFooterKeyMetadata(footerKeyMetadata)
          .withEncryptedColumns(columnPropertiesMap)
          .withPlaintextFooter()
          .build();
      }
    },
    ENCRYPT_COLUMNS_AND_FOOTER_AAD {
      /**
       * Encryption configuration 4: Encrypt six columns and the footer, with different keys.
       * Use aad_prefix.
       */
      public FileEncryptionProperties getEncryptionProperties() {
        Map<ColumnPath, ColumnEncryptionProperties> columnPropertiesMap = getColumnEncryptionPropertiesMap();
        return FileEncryptionProperties.builder(FOOTER_ENCRYPTION_KEY)
          .withFooterKeyMetadata(footerKeyMetadata)
          .withEncryptedColumns(columnPropertiesMap)
          .withAADPrefix(AADPrefix)
          .build();
      }
    },
    ENCRYPT_COLUMNS_AND_FOOTER_DISABLE_AAD_STORAGE {
      /**
       * Encryption configuration 5: Encrypt six columns and the footer, with different keys.
       * Use aad_prefix and disable_aad_prefix_storage.
       */
      public FileEncryptionProperties getEncryptionProperties() {
        Map<ColumnPath, ColumnEncryptionProperties> columnPropertiesMap = getColumnEncryptionPropertiesMap();
        return FileEncryptionProperties.builder(FOOTER_ENCRYPTION_KEY)
          .withFooterKeyMetadata(footerKeyMetadata)
          .withEncryptedColumns(columnPropertiesMap)
          .withAADPrefix(AADPrefix)
          .withoutAADPrefixStorage()
          .build();
      }
    },
    ENCRYPT_COLUMNS_AND_FOOTER_CTR {
      /**
       *  Encryption configuration 6: Encrypt six columns and the footer, with different keys.
       *  Use AES_GCM_CTR_V1 algorithm.
       */
      public FileEncryptionProperties getEncryptionProperties() {
        Map<ColumnPath, ColumnEncryptionProperties> columnPropertiesMap = getColumnEncryptionPropertiesMap();
        return FileEncryptionProperties.builder(FOOTER_ENCRYPTION_KEY)
          .withFooterKeyMetadata(footerKeyMetadata)
          .withEncryptedColumns(columnPropertiesMap)
          .withAlgorithm(ParquetCipher.AES_GCM_CTR_V1)
          .build();
      }
    },
    UNIFORM_ENCRYPTION_PLAINTEXT_FOOTER {
      /**
       * Encryption configuration 7: Encrypt all columns with the same key.
       * Don't encrypt footer.
       */
      public FileEncryptionProperties getEncryptionProperties() {
        return FileEncryptionProperties.builder(FOOTER_ENCRYPTION_KEY)
          .withPlaintextFooter()
          .withFooterKeyMetadata(footerKeyMetadata).build();
      }
    },
    NO_ENCRYPTION {
      public FileEncryptionProperties getEncryptionProperties() {
        return null;
      }
    };

    abstract public FileEncryptionProperties getEncryptionProperties();
  }

  public enum DecryptionConfiguration {
    DECRYPT_WITH_KEY_RETRIEVER {
      /**
       * Decryption configuration 1: Decrypt using key retriever callback that holds the keys
       * of the encrypted columns and the footer key.
       */
      public FileDecryptionProperties getDecryptionProperties() {
        return FileDecryptionProperties.builder()
          .withKeyRetriever(decryptionKeyRetrieverMock)
          .build();
      }
    },
    DECRYPT_WITH_KEY_RETRIEVER_AAD {
      /**
       * Decryption configuration 2: Decrypt using key retriever callback that holds the keys
       * of the encrypted columns and the footer key. Supply aad_prefix.
       */
      public FileDecryptionProperties getDecryptionProperties() {
        return FileDecryptionProperties.builder()
          .withKeyRetriever(decryptionKeyRetrieverMock)
          .withAADPrefix(AADPrefix)
          .build();
      }
    },
    DECRYPT_WITH_EXPLICIT_KEYS {
      /**
       * Decryption configuration 3: Decrypt using explicit column and footer keys.
       */
      public FileDecryptionProperties getDecryptionProperties() {
        Map<ColumnPath, ColumnDecryptionProperties> columnMap = getColumnDecryptionPropertiesMap();

        return FileDecryptionProperties.builder()
          .withColumnKeys(columnMap)
          .withFooterKey(FOOTER_ENCRYPTION_KEY)
          .build();
      }
    },
    NO_DECRYPTION {
      public FileDecryptionProperties getDecryptionProperties() {
        return null;
      }
    };

    abstract public FileDecryptionProperties getDecryptionProperties();
  }

  @Test
  public void testWriteReadEncryptedParquetFiles() throws IOException {
    this.errorCollector = localErrorCollector;
    Path rootPath = new Path(temporaryFolder.getRoot().getPath());
    LOG.info("======== testWriteReadEncryptedParquetFiles {} ========", rootPath.toString());
    byte[] AADPrefix = AAD_PREFIX_STRING.getBytes(StandardCharsets.UTF_8);
    // Write using various encryption configuraions
    testWriteEncryptedParquetFiles(rootPath, DATA);
    // Read using various decryption configurations.
    testReadEncryptedParquetFiles(rootPath, DATA);
  }

  /**
   * This interop test should be run from a separate integration tests suite, so it's not marked with @Test.
   * It's not moved into a separate file since it shares many utilities with the unit tests in this file.
   * @param errorCollector - the error collector of the integration tests suite
   * @param httpClient - HTTP client to be used for fetching parquet files for interop tests
   * @throws IOException
   */
  public void testInteropReadEncryptedParquetFiles(ErrorCollector errorCollector, OkHttpClient httpClient) throws IOException {
    this.errorCollector = errorCollector;
    Path rootPath = new Path(PARQUET_TESTING_PATH);
    LOG.info("======== testInteropReadEncryptedParquetFiles {} ========", rootPath.toString());
    boolean readOnlyEncrypted = true;
    downloadInteropFiles(rootPath, readOnlyEncrypted, httpClient);
    byte[] AADPrefix = AAD_PREFIX_STRING.getBytes(StandardCharsets.UTF_8);
    // Read using various decryption configurations.
    testInteropReadEncryptedParquetFiles(rootPath, readOnlyEncrypted, LINEAR_DATA);
  }

  private void testWriteEncryptedParquetFiles(Path root, List<SingleRow> data) throws IOException {
    Configuration conf = new Configuration();

    int pageSize = data.size() / 10;     // Ensure that several pages will be created
    int rowGroupSize = pageSize * 6 * 5; // Ensure that there are more row-groups created

    SimpleGroupFactory f = new SimpleGroupFactory(SCHEMA);

    EncryptionConfiguration[] encryptionConfigurations = EncryptionConfiguration.values();
    for (EncryptionConfiguration encryptionConfiguration : encryptionConfigurations) {
      Path file = new Path(root, getFileName(encryptionConfiguration));
      FileEncryptionProperties encryptionProperties = encryptionConfiguration.getEncryptionProperties();
      LOG.info("\nWrite " + file.toString());
      try (ParquetWriter<Group> writer = ExampleParquetWriter.builder(file)
        .withWriteMode(OVERWRITE)
        .withRowGroupSize(rowGroupSize)
        .withPageSize(pageSize)
        .withType(SCHEMA)
        .withConf(conf)
        .withEncryption(encryptionProperties)
        .build()) {

        for (SingleRow singleRow : data) {
          writer.write(
            f.newGroup()
              .append(SingleRow.BOOLEAN_FIELD_NAME, singleRow.boolean_field)
              .append(SingleRow.INT32_FIELD_NAME, singleRow.int32_field)
              .append(SingleRow.FLOAT_FIELD_NAME, singleRow.float_field)
              .append(SingleRow.DOUBLE_FIELD_NAME, singleRow.double_field)
              .append(SingleRow.BINARY_FIELD_NAME, Binary.fromConstantByteArray(singleRow.ba_field))
              .append(SingleRow.FIXED_LENGTH_BINARY_FIELD_NAME, Binary.fromConstantByteArray(singleRow.flba_field))
              .append(SingleRow.PLAINTEXT_INT32_FIELD_NAME, singleRow.plaintext_int32_field));

        }
      }
    }
  }

  private String getFileName(EncryptionConfiguration encryptionConfiguration) {
    return encryptionConfiguration.toString().toLowerCase() + ".parquet.encrypted";
  }

  private void testReadEncryptedParquetFiles(Path root, List<SingleRow> data) {
    Configuration conf = new Configuration();
    DecryptionConfiguration[] decryptionConfigurations = DecryptionConfiguration.values();
    for (DecryptionConfiguration decryptionConfiguration : decryptionConfigurations) {
      EncryptionConfiguration[] encryptionConfigurations = EncryptionConfiguration.values();
      for (EncryptionConfiguration encryptionConfiguration : encryptionConfigurations) {
        Path file = new Path(root, getFileName(encryptionConfiguration));
        LOG.info("==> Decryption configuration {}", decryptionConfiguration);
        FileDecryptionProperties fileDecryptionProperties = decryptionConfiguration.getDecryptionProperties();

        LOG.info("--> Read file {} {}", file.toString(), encryptionConfiguration);

        // Read only the non-encrypted columns
        if ((decryptionConfiguration == DecryptionConfiguration.NO_DECRYPTION) &&
          (encryptionConfiguration == EncryptionConfiguration.ENCRYPT_COLUMNS_PLAINTEXT_FOOTER)) {
          conf.set("parquet.read.schema", Types.buildMessage()
            .optional(INT32).named(SingleRow.PLAINTEXT_INT32_FIELD_NAME)
            .named("FormatTestObject").toString());
        }

        int rowNum = 0;
        try (ParquetReader<Group> reader = ParquetReader.builder(new GroupReadSupport(), file)
          .withConf(conf)
          .withDecryption(fileDecryptionProperties)
          .build()) {
          for (Group group = reader.read(); group != null; group = reader.read()) {
            SingleRow rowExpected = data.get(rowNum++);
            // plaintext columns
            if (rowExpected.plaintext_int32_field != group.getInteger(SingleRow.PLAINTEXT_INT32_FIELD_NAME, 0)) {
              addErrorToErrorCollectorAndLog("Wrong int", encryptionConfiguration, decryptionConfiguration);
            }
            // encrypted columns
            if (decryptionConfiguration != DecryptionConfiguration.NO_DECRYPTION) {
              if (rowExpected.boolean_field != group.getBoolean(SingleRow.BOOLEAN_FIELD_NAME, 0)) {
                addErrorToErrorCollectorAndLog("Wrong bool", encryptionConfiguration, decryptionConfiguration);
              }
              if (rowExpected.int32_field != group.getInteger(SingleRow.INT32_FIELD_NAME, 0)) {
                addErrorToErrorCollectorAndLog("Wrong int", encryptionConfiguration, decryptionConfiguration);
              }
              if (rowExpected.float_field != group.getFloat(SingleRow.FLOAT_FIELD_NAME, 0)) {
                addErrorToErrorCollectorAndLog("Wrong float", encryptionConfiguration, decryptionConfiguration);
              }
              if (rowExpected.double_field != group.getDouble(SingleRow.DOUBLE_FIELD_NAME, 0)) {
                addErrorToErrorCollectorAndLog("Wrong double", encryptionConfiguration, decryptionConfiguration);
              }
              if ((null != rowExpected.ba_field) &&
                !Arrays.equals(rowExpected.ba_field, group.getBinary(SingleRow.BINARY_FIELD_NAME, 0).getBytes())) {
                addErrorToErrorCollectorAndLog("Wrong byte array", encryptionConfiguration, decryptionConfiguration);
              }
              if (!Arrays.equals(rowExpected.flba_field,
                group.getBinary(SingleRow.FIXED_LENGTH_BINARY_FIELD_NAME, 0).getBytes())) {
                addErrorToErrorCollectorAndLog("Wrong fixed-length byte array",
                  encryptionConfiguration, decryptionConfiguration);
              }
            }
          }
        } catch (ParquetCryptoRuntimeException e) {
          checkResult(file.getName(), decryptionConfiguration, e);
        } catch (Exception e) {
          e.printStackTrace();
          addErrorToErrorCollectorAndLog(
            "Unexpected exception: " + e.getClass().getName() + " with message: " + e.getMessage(),
            encryptionConfiguration, decryptionConfiguration);
        }
        conf.unset("parquet.read.schema");
      }
    }
  }

  private void downloadInteropFiles(Path rootPath, boolean readOnlyEncrypted, OkHttpClient httpClient) throws IOException {
    LOG.info("Download interop files if needed");
    Configuration conf = new Configuration();
    FileSystem fs = rootPath.getFileSystem(conf);
    LOG.info(rootPath + " exists?: " + fs.exists(rootPath));
    if (!fs.exists(rootPath)) {
      LOG.info("Create folder for interop files: " + rootPath);
      if (!fs.mkdirs(rootPath)) {
        throw new IOException("Cannot create path " + rootPath);
      }
    }

    EncryptionConfiguration[] encryptionConfigurations = EncryptionConfiguration.values();
    for (EncryptionConfiguration encryptionConfiguration : encryptionConfigurations) {
      if (readOnlyEncrypted && (EncryptionConfiguration.NO_ENCRYPTION == encryptionConfiguration)) {
        continue;
      }
      if (EncryptionConfiguration.UNIFORM_ENCRYPTION_PLAINTEXT_FOOTER == encryptionConfiguration) {
        continue;
      }
      String fileName = getFileName(encryptionConfiguration);
      Path file = new Path(rootPath, fileName);
      if (!fs.exists(file)) {
        String downloadUrl = PARQUET_TESTING_REPO + fileName;
        LOG.info("Download interop file: " + downloadUrl);
        Request request = new Request.Builder().url(downloadUrl).build();
        Response response = httpClient.newCall(request).execute();
        if (!response.isSuccessful()) {
          throw new IOException("Failed to download file: " + response);
        }
        try (FSDataOutputStream fdos = fs.create(file)) {
          fdos.write(response.body().bytes());
        }
      }
    }
  }

  private void testInteropReadEncryptedParquetFiles(Path root, boolean readOnlyEncrypted, List<SingleRow> data) throws IOException {
    Configuration conf = new Configuration();
    DecryptionConfiguration[] decryptionConfigurations = DecryptionConfiguration.values();
    for (DecryptionConfiguration decryptionConfiguration : decryptionConfigurations) {
      EncryptionConfiguration[] encryptionConfigurations = EncryptionConfiguration.values();
      for (EncryptionConfiguration encryptionConfiguration : encryptionConfigurations) {
        if (readOnlyEncrypted && (EncryptionConfiguration.NO_ENCRYPTION == encryptionConfiguration)) {
          continue;
        }
        if (EncryptionConfiguration.UNIFORM_ENCRYPTION_PLAINTEXT_FOOTER == encryptionConfiguration) {
          continue;
        }
        Path file = new Path(root, getFileName(encryptionConfiguration));
        LOG.info("==> Decryption configuration {}", decryptionConfiguration);
        FileDecryptionProperties fileDecryptionProperties = decryptionConfiguration.getDecryptionProperties();

        LOG.info("--> Read file {} {}", file.toString(), encryptionConfiguration);

        // Read only the non-encrypted columns
        if ((decryptionConfiguration == DecryptionConfiguration.NO_DECRYPTION) &&
          (encryptionConfiguration == EncryptionConfiguration.ENCRYPT_COLUMNS_PLAINTEXT_FOOTER)) {
          conf.set("parquet.read.schema", Types.buildMessage()
            .required(BOOLEAN).named(SingleRow.BOOLEAN_FIELD_NAME)
            .required(INT32).named(SingleRow.INT32_FIELD_NAME)
            .named("FormatTestObject").toString());
        }

        int rowNum = 0;
        try (ParquetReader<Group> reader = ParquetReader.builder(new GroupReadSupport(), file)
          .withConf(conf)
          .withDecryption(fileDecryptionProperties)
          .build()) {
          for (Group group = reader.read(); group != null; group = reader.read()) {
            SingleRow rowExpected = data.get(rowNum++);
            // plaintext columns
            if (rowExpected.boolean_field != group.getBoolean(SingleRow.BOOLEAN_FIELD_NAME, 0)) {
              addErrorToErrorCollectorAndLog("Wrong bool", encryptionConfiguration, decryptionConfiguration);
            }
            if (rowExpected.int32_field != group.getInteger(SingleRow.INT32_FIELD_NAME, 0)) {
              addErrorToErrorCollectorAndLog("Wrong int", encryptionConfiguration, decryptionConfiguration);
            }
            // encrypted columns
            if (decryptionConfiguration != DecryptionConfiguration.NO_DECRYPTION) {
              if (rowExpected.float_field != group.getFloat(SingleRow.FLOAT_FIELD_NAME, 0)) {
                addErrorToErrorCollectorAndLog("Wrong float", encryptionConfiguration, decryptionConfiguration);
              }
              if (rowExpected.double_field != group.getDouble(SingleRow.DOUBLE_FIELD_NAME, 0)) {
                addErrorToErrorCollectorAndLog("Wrong double", encryptionConfiguration, decryptionConfiguration);
              }
            }
          }
        } catch (ParquetCryptoRuntimeException e) {
          checkResult(file.getName(), decryptionConfiguration, e);
        } catch (Exception e) {
          e.printStackTrace();
          addErrorToErrorCollectorAndLog(
            "Unexpected exception: " + e.getClass().getName() + " with message: " + e.getMessage(),
            encryptionConfiguration, decryptionConfiguration);
        }
        conf.unset("parquet.read.schema");
      }
    }
  }

  /**
   * Check that the decryption result is as expected.
   */
  private void checkResult(String file, DecryptionConfiguration decryptionConfiguration,
                           ParquetCryptoRuntimeException exception) {
    String errorMessage = exception.getMessage();
    String exceptionMsg = (null == errorMessage ? exception.toString() : errorMessage);
    // Extract encryptionConfigurationNumber from the parquet file name.
    EncryptionConfiguration encryptionConfiguration = getEncryptionConfigurationFromFilename(file);

    // Encryption_configuration 5 contains aad_prefix and
    // disable_aad_prefix_storage.
    // An exception is expected to be thrown if the file is not decrypted with aad_prefix.
    if (encryptionConfiguration == EncryptionConfiguration.ENCRYPT_COLUMNS_AND_FOOTER_DISABLE_AAD_STORAGE) {
      if (decryptionConfiguration == DecryptionConfiguration.DECRYPT_WITH_KEY_RETRIEVER ||
        decryptionConfiguration == DecryptionConfiguration.DECRYPT_WITH_EXPLICIT_KEYS) {
        if (!exceptionMsg.contains("AAD")) {
          addErrorToErrorCollectorAndLog("Expecting AAD related exception", exceptionMsg,
            encryptionConfiguration, decryptionConfiguration);
        } else {
          LOG.info("Exception as expected: " + exceptionMsg);
        }
        return;
      }
    }
    // Decryption configuration 2 contains aad_prefix. An exception is expected to
    // be thrown if the file was not encrypted with the same aad_prefix.
    if (decryptionConfiguration == DecryptionConfiguration.DECRYPT_WITH_KEY_RETRIEVER_AAD) {
      if (encryptionConfiguration != EncryptionConfiguration.ENCRYPT_COLUMNS_AND_FOOTER_DISABLE_AAD_STORAGE &&
        encryptionConfiguration != EncryptionConfiguration.ENCRYPT_COLUMNS_AND_FOOTER_AAD &&
        encryptionConfiguration != EncryptionConfiguration.NO_ENCRYPTION) {
        if (!exceptionMsg.contains("AAD")) {
          addErrorToErrorCollectorAndLog("Expecting AAD related exception", exceptionMsg,
            encryptionConfiguration, decryptionConfiguration);
        } else {
          LOG.info("Exception as expected: " + exceptionMsg);
        }
        return;
      }
    }
    // Encryption_configuration 7 has null encryptor, so parquet is plaintext.
    // An exception is expected to be thrown if the file is being decrypted.
    if (encryptionConfiguration == EncryptionConfiguration.NO_ENCRYPTION) {
      if ((decryptionConfiguration == DecryptionConfiguration.DECRYPT_WITH_KEY_RETRIEVER) ||
        (decryptionConfiguration == DecryptionConfiguration.DECRYPT_WITH_KEY_RETRIEVER_AAD) ||
        (decryptionConfiguration == DecryptionConfiguration.DECRYPT_WITH_EXPLICIT_KEYS)) {
        if (!exceptionMsg.endsWith("Applying decryptor on plaintext file")) {
          addErrorToErrorCollectorAndLog("Expecting exception Applying decryptor on plaintext file",
            exceptionMsg, encryptionConfiguration, decryptionConfiguration);
        } else {
          LOG.info("Exception as expected: " + exceptionMsg);
        }
        return;
      }
    }
    // Decryption configuration 4 is null, so only plaintext file can be read. An exception is expected to
    // be thrown if the file is encrypted.
    if (decryptionConfiguration == DecryptionConfiguration.NO_DECRYPTION) {
      if ((encryptionConfiguration != EncryptionConfiguration.NO_ENCRYPTION &&
        encryptionConfiguration != EncryptionConfiguration.ENCRYPT_COLUMNS_PLAINTEXT_FOOTER)) {
        if (!exceptionMsg.endsWith("No keys available") && !exceptionMsg.endsWith("Null File Decryptor") && !exceptionMsg.endsWith("Footer key unavailable")) {
          addErrorToErrorCollectorAndLog("Expecting No keys available exception", exceptionMsg,
            encryptionConfiguration, decryptionConfiguration);
        } else {
          LOG.info("Exception as expected: " + exceptionMsg);
        }
        return;
      }
    }
    exception.printStackTrace();
    addErrorToErrorCollectorAndLog("Didn't expect an exception", exceptionMsg,
      encryptionConfiguration, decryptionConfiguration);
  }

  private EncryptionConfiguration getEncryptionConfigurationFromFilename(String file) {
    if (!file.endsWith(".parquet.encrypted")) {
      return null;
    }
    String fileNamePrefix = file.replaceFirst(".parquet.encrypted", "");
    try {
      EncryptionConfiguration encryptionConfiguration = EncryptionConfiguration.valueOf(fileNamePrefix.toUpperCase());
      return encryptionConfiguration;
    } catch (IllegalArgumentException e) {
      LOG.error("File name doesn't match any known encryption configuration: " + file);
      errorCollector.addError(e);
      return null;
    }
  }

  private void addErrorToErrorCollectorAndLog(String errorMessage, String exceptionMessage, EncryptionConfiguration encryptionConfiguration,
                                              DecryptionConfiguration decryptionConfiguration) {
    String fullErrorMessage = String.format("%s - %s Error: %s, but got [%s]",
      encryptionConfiguration, decryptionConfiguration, errorMessage, exceptionMessage);

    errorCollector.addError(new Throwable(fullErrorMessage));
    LOG.error(fullErrorMessage);
  }

  private void addErrorToErrorCollectorAndLog(String errorMessage, EncryptionConfiguration encryptionConfiguration,
                                                     DecryptionConfiguration decryptionConfiguration) {
    String fullErrorMessage = String.format("%s - %s Error: %s",
      encryptionConfiguration, decryptionConfiguration, errorMessage);

    errorCollector.addError(new Throwable(fullErrorMessage));
    LOG.error(fullErrorMessage);
  }

  private static Map<ColumnPath, ColumnEncryptionProperties> getColumnEncryptionPropertiesMap() {
    Map<ColumnPath, ColumnEncryptionProperties> columnPropertiesMap = new HashMap<>();

    ColumnEncryptionProperties columnPropertiesDouble = ColumnEncryptionProperties
      .builder(SingleRow.DOUBLE_FIELD_NAME)
      .withKey(COLUMN_ENCRYPTION_KEYS[0])
      .withKeyID(COLUMN_ENCRYPTION_KEY_IDS[0])
      .build();
    columnPropertiesMap.put(columnPropertiesDouble.getPath(), columnPropertiesDouble);

    ColumnEncryptionProperties columnPropertiesFloat = ColumnEncryptionProperties
      .builder(SingleRow.FLOAT_FIELD_NAME)
      .withKey(COLUMN_ENCRYPTION_KEYS[1])
      .withKeyID(COLUMN_ENCRYPTION_KEY_IDS[1])
      .build();
    columnPropertiesMap.put(columnPropertiesFloat.getPath(), columnPropertiesFloat);

    ColumnEncryptionProperties columnPropertiesBool = ColumnEncryptionProperties
      .builder(SingleRow.BOOLEAN_FIELD_NAME)
      .withKey(COLUMN_ENCRYPTION_KEYS[2])
      .withKeyID(COLUMN_ENCRYPTION_KEY_IDS[2])
      .build();
    columnPropertiesMap.put(columnPropertiesBool.getPath(), columnPropertiesBool);

    ColumnEncryptionProperties columnPropertiesInt32 = ColumnEncryptionProperties
      .builder(SingleRow.INT32_FIELD_NAME)
      .withKey(COLUMN_ENCRYPTION_KEYS[3])
      .withKeyID(COLUMN_ENCRYPTION_KEY_IDS[3])
      .build();
    columnPropertiesMap.put(columnPropertiesInt32.getPath(), columnPropertiesInt32);

    ColumnEncryptionProperties columnPropertiesBinary = ColumnEncryptionProperties
      .builder(SingleRow.BINARY_FIELD_NAME)
      .withKey(COLUMN_ENCRYPTION_KEYS[4])
      .withKeyID(COLUMN_ENCRYPTION_KEY_IDS[4])
      .build();
    columnPropertiesMap.put(columnPropertiesBinary.getPath(), columnPropertiesBinary);

    ColumnEncryptionProperties columnPropertiesFixed = ColumnEncryptionProperties
      .builder(SingleRow.FIXED_LENGTH_BINARY_FIELD_NAME)
      .withKey(COLUMN_ENCRYPTION_KEYS[5])
      .withKeyID(COLUMN_ENCRYPTION_KEY_IDS[5])
      .build();
    columnPropertiesMap.put(columnPropertiesFixed.getPath(), columnPropertiesFixed);

    return columnPropertiesMap;
  }

  private static Map<ColumnPath, ColumnDecryptionProperties> getColumnDecryptionPropertiesMap() {
    Map<ColumnPath, ColumnDecryptionProperties> columnMap = new HashMap<>();

    ColumnDecryptionProperties columnDecryptionPropsDouble = ColumnDecryptionProperties
      .builder(SingleRow.DOUBLE_FIELD_NAME)
      .withKey(COLUMN_ENCRYPTION_KEYS[0])
      .build();
    columnMap.put(columnDecryptionPropsDouble.getPath(), columnDecryptionPropsDouble);

    ColumnDecryptionProperties columnDecryptionPropsFloat = ColumnDecryptionProperties
      .builder(SingleRow.FLOAT_FIELD_NAME)
      .withKey(COLUMN_ENCRYPTION_KEYS[1])
      .build();
    columnMap.put(columnDecryptionPropsFloat.getPath(), columnDecryptionPropsFloat);

    ColumnDecryptionProperties columnDecryptionPropsBool = ColumnDecryptionProperties
      .builder(SingleRow.BOOLEAN_FIELD_NAME)
      .withKey(COLUMN_ENCRYPTION_KEYS[2])
      .build();
    columnMap.put(columnDecryptionPropsBool.getPath(), columnDecryptionPropsBool);

    ColumnDecryptionProperties columnDecryptionPropsInt32 = ColumnDecryptionProperties
      .builder(SingleRow.INT32_FIELD_NAME)
      .withKey(COLUMN_ENCRYPTION_KEYS[3])
      .build();
    columnMap.put(columnDecryptionPropsInt32.getPath(), columnDecryptionPropsInt32);

    ColumnDecryptionProperties columnDecryptionPropsBinary = ColumnDecryptionProperties
      .builder(SingleRow.BINARY_FIELD_NAME)
      .withKey(COLUMN_ENCRYPTION_KEYS[4])
      .build();
    columnMap.put(columnDecryptionPropsBinary.getPath(), columnDecryptionPropsBinary);

    ColumnDecryptionProperties columnDecryptionPropsFixed = ColumnDecryptionProperties
      .builder(SingleRow.FIXED_LENGTH_BINARY_FIELD_NAME)
      .withKey(COLUMN_ENCRYPTION_KEYS[5])
      .build();
    columnMap.put(columnDecryptionPropsFixed.getPath(), columnDecryptionPropsFixed);

    return columnMap;
  }
}

redpajama_set_name: RedPajamaGithub


text:
Mobius Brass
Race Gun Ready 9MM Fully Processed
Quantity 250 500 1000 2000
----We are accepting backorders on fully processed 9MM. Any new orders of 9MM will ship within 1 week.----
Our RGR (Race Gun Ready) brass is at the pinnacle of brass for the discerning competition shooter. All RGR 9MM brass has been thoroughly inspected, sorted, and run through our prepping process detailed below.
-Rough sorted to remove 9x18 Mak, 380 ACP, and 38 Super
-Dry tumbled
-Final sort before processing
-Roll sized
-Decapped
-Full Length Sized
-Swaged
-Wet Tumbled in Stainless Chip Media
-Final dry tumble for brilliant shine
This process leaves a piece of brass that is not only very close to brand new in appearance, but will also fit in the tightest of chambers.
*************THIS IS NOT LOADED AMMUNITION*************
You as the reloader are responsible to check all cases before loading. We include extra cases in every order to account for any defects or issues that may arise. Reloading can be dangerous even when using published load data and should be approached with the utmost caution. Mobius Brass will not be held responsible for any injury, harm or death resulting from improper loads, lack of attention or negligence, or any combination of these. It is the ultimate responsibility of the end user to confirm and test every load that goes through their gun.
Back to Fully Processed Brass
© 2022, Mobius Brass

redpajama_set_name: RedPajamaCommonCrawl


^ R.A. Lewin (1976). "Prochlorophyta as a proposed new division of algae". Nature 261: 697-8.
^ Cavalier-Smith T (2006). "Rooting the tree of life by transition analyses". Biol. Direct 1: 19. doi:10.1186/1745-6150-1-19. PMC: 1586193. PMID 16834776. http://www.biology-direct.com/content/1//19.
^ Battistuzzi FU, Hedges SB (2009). "A major clade of prokaryotes with ancient adaptations to life on land". Mol. Biol. Evol. 26 (2): 335–43. doi:10.1093/molbev/msn247. PMID 18988685. http://mbe.oxfordjournals.org/cgi/content/full/26/2/335.
^ Shih, P.M., et al. (2017). "Crown group Oxyphotobacteria postdate the rise of oxygen". Geobiology. 15 (1). doi:10.1111/gbi.12200. PMID 27392323.
^ a b Soo, R.M., et al. (2017). "On the origins of oxygenic photosynthesis and aerobic respiration in Cyanobacteria". Science 355 (6332): 1436-1440. doi:10.1126/science.aal3794.
^ Jensen, Gitte S.; Ginsberg, Donald I.; Drapeau, Christian (Winter 2001). "Blue-Green Algae as an Immuno-Enhancer and Biomodulator". JANA 3 (4): 24–30.


The Goons - Spike Milligan, Peter Sellers, Harry Secombe and, in the early years, Michael Benetine - began life masquerading as a radio show called "Crazy People: featuring Radio's own Crazy Gang - The Goons". To save wear and tear on Wallace Greenslade denture's, the subsequent seasons were simple called "The Goons".
I'm trying to collect and correlate all the scripts. The short while I've been at it already tells me that Goondom owes Debby Stark and Christopher Thomas a large batter pudding ... emmm I mean Thank you. They seem to be behind most of the transcriptions.
I've collected only 40 of the 200+ scripts, and I apologies for the state you find them in. Many have been copied straight into a web page from the newsgroup alt.fan.goons. I haven't got around to formatting, editing, or even sorting them into transmission order! The major problems are lack of time, and the fact I keep finding more and more scripts. That said, the second reason is a millstone I'd gladly choak over, so please please please, if you have any scripts which I don't have, I'd really appreciate if you could email them to me!


First of all, it's obviously quite hard to screw up a filet mignon. So anything on the filet mignon list should be pretty easy on the tongue.
1. Chez Spencer's morel mushroom creme sauce and truffle butter over filet mignon – I mean, it's like a last meal. Incredibly rich but so satisfying.
2. RNM – seriously impressive filet mignon in the Haight.
3. Colibri Mexican Bistro – underrated restaurant with great food by the theatre district and Union Square, the place should get more recognition. Their filet mignon is a bit small in size but big on taste.
1. Spruce, SF – absolutely smashing beef bavette…one of my favorite restaurants in SF (new to me this year). Gets the highest meatmeister grade, and a great bar scene, great service, and luxury atmosphere.
Caveat: Possibly the most amazing beef bavette I've ever eaten was at Baraka, which sadly closed its doors this year. So look out for whatever restaurant Chef Chad Newton and Sous Chef Ashton Mullikin are working at next…bound to be dynamite.
1. Town Hall, SF – incredible Niman Ranch ribeye – gets the highest meatmeister grade for simplicity, taste, excellence. Killer steak.
1. See aforementioned filet mignon at Colibri, SF – just $18.
2. Flatiron Steak Frites – Chez Maman, SF – $19 – nice, well-grilled flank steak and fries for the price, if you can wait in line to this 15-person eatery in Potrero Hill.
If you're really hungry, are in SF's Outer Mission, need a steak, and don't have much cash in your pockets, there's the Palace Steakhouse. You can nab a steak, veggies, and a monster baked potato with fixings for just $10. Nothing soul-shaking but no complaints. Filling, decent, and old-school in a funky, charming way.


Learn information about balcony decks that use cantilevered joists . Balcony Deck . The longer the materials will last, the longer the balcony design .
Home > WPC Products > balcony decking materials cost. . Decking materials for Deck building . wood decking balcony price singapore .
. building, decks .Balcony Composite Wood Decking In Singapore . Composite Deck Price per . ideas balcony; 48m plastic decking boards; free deck plans .
Our deck for balcony installations . Is Planter and Balcony Decking the New Trend in Singapore . what are the popular decking materials for balcony and .
balcony floor decking singapore cost. . price of wood deck balcony sg . Common Wood Decking Materials in Singapore. Flooring; Decking; .
Deck Products Materials Composite . balcony decking materials cost . cost of vinyl balcony decking ,Composite Decking Boards Price cost of vinyl balcony .
Easy to install balcony flooring using HandyDeck interlocking deck tiles. Toggle navigation. Home; . Just sweep your balcony floor with a broom every so often to .
DeckRite Exterior Floor Covering is a popular . DeckRite is a popular selection for use on second story walkout balcony's that require a . a deck or a garden .
renovation balcony decking singapore - WPC Wood Plastic .
Posts Related to wood decking balcony price singapore . balcony wood decking singapore diy. Composite Deck Price » WPC . resin deck boards china; balcony .
Singapore wpc flooring price . floor deck for balcony in singapore - YouTube. . Wood plastic composite decking boards are a fantastic high quality, .
Fiberon composite decking combines the beauty of real wood with the performance of . Have more time to do what you love on a Fiberon composite deck. . great price .


People can invest outside their homeland, given they have the right documents and are considered eligible to hold business under immigration laws of a particular country. If you are an expatriate and planning to invest a large amount of money, you can do so, either through a one-time, lump sum investment or through annuity investments where you will be receiving a fixed amount of returns per period of time while your money continues to grow.Financial Advice as well as expatriate financial planning, expatriate investment is part of all investment related searches and often includes objective-setting, evaluating assets and resources, and drafting a roadmap to achieve expats financial goals. In this section you will find various resources to answer you Financial Advice search. Find the best expatriate financial advice by locating your financial advisor now, contact a specialist today.
Contact a financial consultant today!
Depending on your risk profile a financial consultant can help you select the right asset class that will help you you attain your financial goal. Request a free, no obligation first introduction advice and meeting with our pre selected expat financial specialist.
More info on Contact a financial consultant today!


It's summertime, which means time for the beach and refreshing seasonal fruits such as watermelons and pineapples. Another staple of the Australian summer is the mango. This sweet stone fruit is not only delicious, but a healthy source of fibre. Mangos are also rich in beta-carotene, an antioxidant that the body uses to synthesise vitamin A, which is important for healthy skin, eyes and may even help prevent some forms of cancer.
Under the hot Australian sun the boost to both skin health as well as anti-melanoma properties makes the beta-carotene from mangos an important part of our summer diets. The cancer fighting benefits don't stop there. Alongside being rich with antioxidants, mangos are one of the few plants to contain mangiferin, a bioactive compound that helps fight neural and breast cancers and gives our immune system a boost in fighting all kinds of bacteria.
For those wanting to jump on board and manGO healthy this summer try out this Mango Cheesecake recipe from the SoupedUp Kitchen.
1. Place biscuits in food processor and crumb.
2. In a bowl stir together biscuit crumbs and melted butter until well combined.
3. Press the crumbs into a lined pan.
5. In a mixing bowl beat cream cheese and sugar until smooth.
6. Gradually beat in cream.
7. Place water into a small bowl. Sprinkle over gelatine. Stir until gelatine dissolves. Set aside to cool slightly.
8. Beat gelatine into filling until combined.
9. Drain mango slices and fold into the cheese mix gently.
10.Spread evenly over biscuit base and chill.
11. Garnish with whipped cream.


Olympic Gold Medal diver Greg Louganis and football-great-turned-announcer O. J. Simpson were inducted into the Balboa Bay Club Sports Hall of Fame at a club banquet Wednesday night.
Louganis and Simpson, in turn, roasted and toasted Don Chumley, winner of the Lowsman Trophy, given annually to the last man picked in the NFL draft as part of Irrelevant Week in Newport Beach. Chumley's award, presented by Clark Graves of the University Athletic Club, makes the University of Georgia the first school in the nation to have both a Heisman and a Lowsman.


This is the way that in our Golden Pages has been entered Snela with address Kazanlak, Sevtopolis 55	and phone 089 9186947. The main activity of the company is Snela is "Confectionery Production Manufacturing and Wholesale". If you write by mistake the name of the company in latin characters, you will see	SNELA or SNELA. If you use phonetic or BDS layouts, you are probably searching for Snela if you have entered SNELA	or SNELA.


Our primary goal is to provide superior risk-adjusted real estate returns and capital preservation through a broad spectrum of real estate investment strategies designed to meet each investor's needs.
Our strategies are implemented through commingled core and value add funds, which provide liquidity in addition to income and appreciation, and separate accounts. Further expanding our product offerings, our separately managed accounts can be tailored to an investor's specific investment, duration, and liquidity needs and goals.
For more information on investing with ARA, contact us!
Our income-oriented core strategy focuses on institutional quality assets with an emphasis on long-term stabilized cash flow and market appreciation potential. We create portfolios with a broad exposure to property types and geography and that recognize economic diversity and the unique drivers of demand in each sector and market.
ARA's expertise targets stabilized assets that are substantially leased to high-quality tenants with long-term in-place leases and limited rollover exposure located in major markets with a strong institutional presence.
Property types include 24-hour CBD office, industrial, neighborhood/community retail, and multi-family that are characterized by low to moderate risk and high current cash flow.
This approach limits the need for capital expenditures as assets are well maintained with little or no functional obsolescence; allowing these high-quality stabilized institutional assets to perform over the long-term.
With an emphasis on combining stabilized income and value-creation, we identify lower-risk value opportunities in core-like assets that "need something done" quickly and with minimal expenditures in order for them to perform to their full potential as a core asset. Core-plus investments are identified and the value-creation opportunity is realized through diligent active management. The fully stabilized core asset is then held for income and appreciation.
ARA value-add expertise targets assets in key locations with strong potential that need active management to realize their full potential. We create value in well-located assets that can benefit from our decades of hands-on experience in acquisitions and asset management at all stages of the market cycle. Strategies include rehabilitating undermanaged and capital constrained assets, lease-up opportunities, renovation and repositioning, and ground-up development to create stabilized assets that can be sold to longer-term investors.
Our real estate debt strategy offers senior and subordinate financing on new construction and transitory assets through direct origination of structured first mortgage loans, mezzanine debt/preferred equity, and other hybrid debt investments. We work with sponsors and developers who are well-capitalized and who have extensive experience in the development and construction of multi-family, office, retail, and industrial projects located in major U.S. markets with strong demographic and employment trends.
ARA's structured finance products offer borrowers and sponsors flexible financial solutions that provide strong protections to investor capital.


text:
;(function(){
function tidycalc(indexedData) {
	indexedData = Object.freeze(indexedData);

	function hash(value) 	{
		function hash1(v) {
			var hashed = indexedData.hash[v];
			if(hashed === undefined) {
				throw new Error("Could not hash " + v +": not in hash table");
			}
			return hashed;
		}

		// hash an array
		if(Array.isArray(value)) {
			return value.map(hash1);
		} else if (!Array.isArray(value) && typeof value === "object") {
			var hashed = Object.create(null);
			var keys = getKeys(value);
			for(var i=0; i<keys.length; i++) {
				var key = keys[i];
				hashed[hash1(key)] = hash(value);
			}
			return hashed;
		} else {
			return hash1(value);
		}
	}
	function unhash(value)	{
		// unhash a value
		function unhash1(v) {
			var unhashed = indexedData.unhash[v];
			if(unhashed === undefined) {
				throw new Error("Could not unhash " + v + ": value not found in hash table");
			}
			return unhashed;
		}

		// unhash an array
		if(Array.isArray(value)) {
			return value.map(unhash1);

		// unhash an object
		} else if(!Array.isArray(value) && typeof value === "object") {
			var unhashed = Object.create(null);
			getKeys(value).forEach(function(key){
				unhashed[unhash(key)] = unhash(value[key]);
			});

			return unhashed;
		} else {
			return unhash1(value);
		}
	}
	function get(data, key)	{ return data[key];					}
	function getKeys(data)	{ return Object.keys(data);			}
	function unhashRow(rowPtr) {
		if (rowPtr === undefined) {
			return get(indexedData, 'data').map(unhash);
		} else {
			var hashedRow = get(get(indexedData, 'data'), rowPtr);
			return unhash(hashedRow);
		}
	}
	function processQuery(query) {
		if(query === undefined) {
			query = [];
		} else if(typeof query !== "object") {
			query = [].concat(query);
		}

		if(!Array.isArray(query) && typeof query === "object") {
			if(get(indexedData, 'indexOrder') !== undefined) {
				throw new Error("Cannot use object notation for queries on slimmed (ordered) index. Use array notation instead.");
			}
			query = Object.keys(query).reduce(function(list, key){
				var term = query[key];
				if(term === undefined || term === null) { // stop processing
					return list.concat(key);
				} else {
					return list.concat(key).concat(term);
				}
			}, []);
		} else if(!Array.isArray(query)) {
			throw new Error("Invalid query");
		}

		return query;
	}

	function extract(rows, varName) {
		function extract1(row) {
			return row[varName];
		}
		rows = [].concat(rows);
		return rows.map(extract1);
	}

	function focusIndex(query) {
		return query.reduce(function(subIndex, term){
				return get(subIndex, hash(term));
			}, get(indexedData, 'index'));
	}

	function select(query, limit) {
		query = processQuery(query);
		limit = limit || 0;

		try {
			var focused = focusIndex(query);
			if(focused === undefined) {
				// no matching rows found
				//console.warn("No matching rows found for " + query);
				return [];
			}
			var ptrs = get(focused, '$');

			if(limit > 0) { ptrs = ptrs.slice(0, limit); }
			results = ptrs.map(unhashRow);

			return results;
		} catch(e) {
			//console.warn(e);
			return [];
		}
	}

	var reader = function reader(){};

	reader.data = unhashRow;
	reader.selectMany = function selectMany(query, extractVar) {
		var results = select(query, 0);
		if(extractVar !== undefined) { results = extract(results, extractVar); }

		return results;
	};

	reader.selectOne = function selectOne(query, extractVar) {
		var results = select(query, 1);

		if(extractVar !== undefined) {
			results = extract(results, extractVar);
		}

		return results[0];
	};

	reader.levels = function levels(query) {
		query = processQuery(query);
		try {
			var focused = focusIndex(query);
			return unhash(get(focused, '$$'));
		} catch(e) {
			console.warn("No level values found for " + query);
			return [];
		}
	}

	return reader;
}

var isNodejs = typeof module !== "undefined";
var isAngular = typeof angular === "object";
var isBrowser = typeof window === "object";

if(isNodejs) {
	module.exports = tidycalc;
} else if(isAngular) {
	angular.module('ngTidycalc', [])
		   .provider('tidycalc', function(){
		   		this.$get = function(){
		   			return tidycalc;
		   		};
		   });
} else {
	window.tidycalc = tidycalc;
}

}());


Are you spending a lot of time and sweat equity in the gym? Do you want to know what will help improve your golf swing, surf longer, or get around the softball diamond faster? Wondering what supplements will help you get the gains you are looking for and will help keep you healthy? Pre-workout? Post-workout? Protein? Supplements? Everyone is an individual and has different fitness goals. Proper diet, exercise regimens, and supplementation will help you get there quicker and with less injury downtime.


If anyone asked me what Shanghai was like when I visited before, my 12-year old version would immediately make a face and say it was very dirty, smelly and was always cloudy. Shanghai is still very much like that, but the first impressions aren't that simple anymore, especially when one has to try to live there for a bit of time.
The easy bits: Shanghai is always changing with more high rises, more KFCs, more Chinese-speaking foreigners, people are louder than before and the list goes on. The harder bits to see are the slow change of social institutions and environment — poorly-constructed healthcare system, few allowed-NGOs, the gaping disparity of wealth, the extremely competitive and sometimes madly-insane educational system, etc. Just a preview of the stuff that we'll touch on in later posts.
On the day-to-day stuff, a lot of what I consider simple things in the US were a hassle in China. During our first week in Shanghai, we had to get a cell phone (so that our parents could bother us at their pleasure) and open a bank account (so that we can spend money like the girls we are). Luckily, my Shanghainese cousin accompanied us which meant that we got slightly better treatment than we would have had otherwise. Although we've met a lot of nice Shanghainese people, I felt that in terms of the service industry, it's better to speak Shanghainese so that people know that you're 1) native Shanghainese and 2) by extension, won't tolerate any crap.
Anyways, in terms of China cell phone plans – most people pay as they go. However, we were going to be traveling all over China which meant we'd have to change our SIM card (and hence our telephone number) everywhere that we went. The service agent wasn't helpful, and her attitude bordered on apathy. So it was a frustrating experience as we realized that we had to sign up for the China-world plan which meant paying much more than the first plan, but it allowed us flexibility in that we didn't have to change cell phone numbers constantly (and this turned out to be a really good idea). The fun part was that we got to choose our cell phone numbers. If you want a cell phone number with the number eight, or six, it costs more. I think in the Szechuan region, the number of 8888-8888 sold to a business costed upwards of 200,000 kuai.
Opening a bank account was easier: fill out a form, deposit money, and remember to always bring your passport! However, one always must keep in mind that there are crazy lines everywhere, and that day was no exception. We waited thirty minutes, which wasn't bad at all considering the long wait times that we had for other things in China.


text:
Often asked: What Are The Three Laws Of Tension Robotics?
Home > Robotics > Often asked: What Are The Three Laws Of Tension Robotics?
1 What are the 3 laws in I robot?
2 Are the 3 laws of robotics real?
3 What are the three laws of robotics in Bicentennial Man?
4 Who wrote the 3 laws of robotics?
5 Can a robot lie?
6 What type of jobs are in Robotics?
7 Will robots replace humans?
8 Who created the word robot?
9 Are robots dangerous?
10 What are the robots called in I Robot?
11 What was the first working robot made for?
12 Where did the Three Laws of Robotics come from?
13 What are the types of robot?
14 Where are tethered robots used most often?
15 What is the artificial intelligence?
What are the 3 laws in I robot?
The Three Laws They are: A robot may not injure a human being or, through inaction, allow a human being to come to harm. A robot must protect its own existence as long as such protection does not conflict with the First or Second Laws.
Are the 3 laws of robotics real?
A robot may not harm humanity, or, by inaction, allow humanity to come to harm. The Three Laws, and the zeroth, have pervaded science fiction and are referred to in many books, films, and other media. They have impacted thought on ethics of artificial intelligence as well.
What are the three laws of robotics in Bicentennial Man?
He stated three laws in his book I, Robot that robots must obey: (1) a robot may not injure a human being, or, through inaction, allow a human being to come to harm, (2) a robot must obey orders given to it by human beings except where such orders would conflict with the first law, and (3) a robot must protect its own
You might be interested: Often asked: How Much Are Kuka Robotics?
Who wrote the 3 laws of robotics?
Science fiction already envisioned this problem and has suggested various potential solutions. The most famous was author Isaac Asimov's Three Laws of Robotics, which are designed to prevent robots harming humans.
Can a robot lie?
A robot will certainly be able to mimic human behaviours – and perhaps even lie to us, if that's how they are programmed – but it doesn't mean they will ever become essentially human."
What type of jobs are in Robotics?
5 Great Jobs in the Field of Robotics
Robotics Engineer. A robotics engineer is the person responsible for creating and designing robots and robotic systems.
Robotics Technician.
Sales Engineer.
Software Developer.
Robotics Operator.
Will robots replace humans?
Yes, robots will replace humans for many jobs, just as innovative farming equipment replaced humans and horses during the industrial revolution. Factory floors deploy robots that are increasingly driven by machine learning algorithms such that they can adjust to people working alongside them.
Who created the word robot?
Science Diction: The Origin Of The Word 'Robot' Robot is a relative newcomer to the English language. It was the brainchild of the Czech playwright, novelist and journalist Karel Čapek, who introduced it in his 1920 hit play, R.U.R., or Rossum's Universal Robots.
Are robots dangerous?
As explained above, robots don't often hurt humans. They should, then, be considered safe to use in workplaces and could save humans from engaging in risky work. But even the smartest robots could fail if companies don't learn how to use them safely and pass on that knowledge to employees.
You might be interested: Readers ask: Where Is Vecna Robotics Located?
What are the robots called in I Robot?
The robot, Sonny, is a specially built NS-5 with higher-grade materials as well as a secondary processing system that allows him to ignore the Three Laws. Sonny also appears to show emotion and claims to have "dreams".
What was the first working robot made for?
The first commercial, digital and programmable robot was built by George Devol in 1954 and was named the Unimate. It was sold to General Motors in 1961 where it was used to lift pieces of hot metal from die casting machines at the Inland Fisher Guide Plant in the West Trenton section of Ewing Township, New Jersey.
Where did the Three Laws of Robotics come from?
The best known set of laws are Isaac Asimov's "Three Laws of Robotics". These were introduced in his 1942 short story "Runaround", although they were foreshadowed in a few earlier stories. The Three Laws are: A robot may not injure a human being or, through inaction, allow a human being to come to harm.
What are the types of robot?
4 Types of Robots Every Manufacturer Should Know
Articulated Robots. An articulated robot is the type of robot that comes to mind when most people think about robots.
SCARA Robots.
Delta Robots.
Cartesian Robots.
Where are tethered robots used most often?
Tethered ground robots (TGRs) have been widely used for observation and remote manipulation in hostile environments and tethered aerial robots (TARs) are becoming more frequently used for monitoring, surveying, and fixing power lines.
What is the artificial intelligence?
Artificial intelligence is the simulation of human intelligence processes by machines, especially computer systems. Specific applications of AI include expert systems, natural language processing, speech recognition and machine vision.


Realtek High Definition Audio is a MEDIA device. This driver was developed by Realtek. In order to make sure you are downloading the exact right driver the hardware id is HDAUDIO/FUNC_01&VEN_10EC&DEV_0270&SUBSYS_103C1439.
This driver received an average rating of 3.5 stars out of 52901 votes.


Doyle Wolfgang Von Frankenstein got 19 balloons for his birthday! Gift him more message balloons!!
Doyle Wolfgang Von Frankenstein will celebrate his 55 yo birthday in 4 months and 19 days!
American, Musician; He is famous from The Misfits.


text:
Q: Mysql Right Outer Join is Not working 100 % I am new to mysql and  have an My sql query wrote and tryin to make an outer join with two subqueries but results are not showing accurate results here is the Query
SELECT a.lpcode,a.lpname,a.companycode,a.zone,a.tdy_growr,a.tdy_acres,b.tdate_growr,tdate_acres,a.name
  FROM    (SELECT z.lpcode,
                  x.companycode,
                  z.lpname,
                  z.zone,
                  z.name,
                  count(x.vehicleno) tdy_growr,
                  sum(x.haulagecode) tdy_acres
             FROM gis.registration x, loadingpoint z
            WHERE x.date =
                     (SELECT max(a.date)
                        FROM gis.registration a
                       WHERE     a.fieldno > 0
                             AND a.haulagecode > 0
                             AND a.isaccepted = 1)
                  AND z.lpcode = x.lpcode
                  AND x.fieldno > 0
                  AND x.haulagecode > 0
                  AND x.isaccepted = 1
           GROUP BY x.lpcode) a
       RIGHT OUTER JOIN
          (SELECT r.lpcode,
                  count(r.vehicleno) tdate_growr,
                  sum(r.haulagecode) tdate_acres
             FROM gis.registration r, loadingpoint l
            WHERE r.fieldno > 0 AND r.haulagecode > 0 AND r.isaccepted = 1
            AND r.lpcode = l.lpcode
           GROUP BY l.lpcode) b
       ON a.lpcode = b.lpcode
ORDER BY a.zone, a.lpcode

Any Help May Appreciated thanks in advance

A: Right outer joins have terrible performance and there is not too many cases where you can't change the structure of the query to use a left outer join instead which will perform better. What your query is doing is getting all rows from b regardless of whether or not there is a row in a to join to. The same query rewritten is:
SELECT             a.lpcode,a.lpname,a.companycode,a.zone,a.tdy_growr,a.tdy_acres,b.tdate_growr,a.tdate_acres,a.name
FROM (SELECT r.lpcode,
              count(r.vehicleno) tdate_growr,
              sum(r.haulagecode) tdate_acres
         FROM gis.registration r, loadingpoint l
        WHERE r.fieldno > 0 AND r.haulagecode > 0 AND r.isaccepted = 1
        AND r.lpcode = l.lpcode
       GROUP BY l.lpcode) b
   LEFT OUTER JOIN (SELECT z.lpcode,
              x.companycode,
              z.lpname,
              z.zone,
              z.name,
              count(x.vehicleno) tdy_growr,
              sum(x.haulagecode) tdy_acres
         FROM gis.registration x, loadingpoint z
        WHERE x.date =
                 (SELECT max(a.date)
                    FROM gis.registration a
                   WHERE     a.fieldno > 0
                         AND a.haulagecode > 0
                         AND a.isaccepted = 1)
              AND z.lpcode = x.lpcode
              AND x.fieldno > 0
              AND x.haulagecode > 0
              AND x.isaccepted = 1
       GROUP BY x.lpcode) a
   ON a.lpcode = b.lpcode
ORDER BY a.zone, a.lpcode

This also gives all rows from b regardless of whether there is a matching row in a to join to.
If your problem is that you are getting NULLS in all of these columns: "a.lpcode,a.lpname,a.companycode,a.zone,a.tdy_growr,a.tdy_acres,a.tdate_acres,a.name" then use should be using the structure you are already using but with a LEFT OUTER JOIN instead which may return a null in this column "b.tdate_growr"

redpajama_set_name: RedPajamaStackExchange


A travel report from Benedict Riegler Mudita association volunteer. In November 2017, volunteers of Mudita association did a 15 days round trip through Myanmar. The next tour will be organized by Myanmar Vision in February 2018.
In November 2017 I participated in a trip through Myanmar with a group of 10 people. It was an incredible experience where we got to know this amazing country from a local perspective, and also had the opportunity to reconnect with ourselves and find a deeper purpose in our trip.
I booked the "Unseen Myanmar" tour with Myanmar Vision. For 15 days, we were on the road with expert local guides, discovering the stunning nature off the beaten track, getting to know the simple village life and mingling with our new burmese friends. Participating in NGO projects and doing hands-on work where it was most needed, for example in the Thabawa Center made our trip truly outstanding. We also had the chance to visit Aung May Oo Monastic Education School, where Mudita association runs a health and education program.
For our group, it was important to spend some time reconnecting with ourselves and soak in the magic of this highly spiritual country. Myanmar Vision fully embraced our wish and took us to listen to Dhamma talks, visit monasteries and meditate, sometimes together with the monks in the forest, sometimes on our own. Finally, the money we payed for the tour - all of it, except for the guide and what is required to cover the travel costs - was donated to Hete Aeng Gu monastic education school (near Inle Lake) and used in projects for the education and welfare of the burmese children.
For the group, including us as the Mudita volunteers, this first tour in November 2017 was a wonderful first experience of a new way of traveling, combining the discovery of this beautiful country and its people with mindfulness and humanitarian work. Mudita association is already planning a second tour with Myanmar Vision. If you want to discover the "Unseen Myanmar Tour" by yourself, Myanmar Vision will warmly welcome you in next february.
You'll find our latest itinerary, more detailed information and an online booking form on Myanmar Vision's website. Click the link below to jump to Myanmar Vision's page.


text:
New & Forthcoming Titles | Advances in Theory and Practice of Emerging Markets
Advances in Theory and Practice of Emerging Markets
Series Ed.: Dwivedi, Yogesh K.
Emerging Markets (EMs) exhibit a number of unique characteristics (i.e. unique challenges and opportunities) in terms of socio-economic, demographic, cultural, political, and regulatory. Examples of such unique challenges and opportunities includes diversity and fragmentation of markets, differential market growth rate in terms of urban vs rural, evolution of institutions, political instability, distinct cultural heritage, inherent corruption, and unusual technological diffusion trends. Unique characteristics of EMs makes this context different from developed countries, causing implications for both theory and practice. It necessitates substantial adaptations of theories developed and approaches employed in the Western world for investigating problems specific to such markets. As such, doing research in the EMs context for establishing new conceptual and theoretical paradigms from multidisciplinary perspectives is vital for making the global economy more equitable and sustainable.
This book series aims to publish scholarly work from a variety of disciplines (for example, information systems, electronic government, marketing, digital and social media marketing international business, human resources, public administration, entrepreneurship, operations and supply chain management, health care management, finance, accounting, economics, innovation, science policy, built environment, energy production and consumption, agriculture extension and management, biodiversity conservation and management, sustainable development) focusing on the issues prominent in Emerging Markets such as India, China, Brazil, Russia and South Africa in a book series.
The series will strive to publish conceptual, theoretical, and empirical works relating to the contexts of Emerging Markets. This series will contain four sub-series including: monographs, handbooks, edited volumes, and text books. The Research Monographs and Handbooks sections will focus on the state-of-the-art of both established and emerging topics specifically in the contexts of Emerging markets. Doctoral research produced from the institutions based in one of the EMs countries would also be considered for publication in the monograph category of the series. Monographs will be considered both in the form of relatively shorter pieces and traditional more extended works. This series would also encourage and invite academics and researchers to publish text books specific to EMs context.
Services for the Series
Responsible Editor, Nitza Jones-Sepulveda
Download Product Flyer
Springer editorial policy


text:
Debates Day 2 - Wednesday 14 February 2007
Parliamentary Record 12
Debates for 10th Assembly 2005 - 2008; 10th Assembly 2005 - 2008; Parliamentary Record; ParliamentNT
Made available by the Legislative Assembly of the Northern Territory
Legislative Assembly of the Northern Territory
Attribution International 4.0 (CC BY 4.0)
DEBATES Wednesday 14 February 2007 3845 doorway into the home market, and that door is open to both first home buyers and those people who do not currently own a home, but have previously owned a home. The door is not shut to the latter group. HomeNorth is a scheme which has enormous benefits. On the issue of land release, you have to look at planning. We started the year off in a very positive sense with planning. We have introduced the new Northern Territory Planning Scheme. That scheme has been debated and consulted about for some seven years. It commenced in February, so we come into 2007 with a very consolidated, contemporary planning scheme that underpins planning for the Territory. I have given an undertaking to continue to work with all the stakeholders in the planning area to look at the use of area plans, for example. We are in discussion with Palmerston City Council about area plans of Palmerston. Those discussions will, obviously, be highly consultative and will be ongoing through this year. We are working, in the Department of Planning and Infrastructure, very closely with the Department of Chief Minister in background support on the Chief Ministers Creating Darwins Future, which is a very exciting, dynamic look at what we want our city to look like in the future, with a tremendous amount of public consultation. I know the Chief Minister is very proactive in getting out and listening to the people of the Top End about what they want their city to look like. A section of that will be a planning forum that I will host in April, bringing together key stakeholders - architects, Planning Action Network advocates, Property Council, HIA, TCA; all the key industry stakeholders participating. Importantly, I also want the public to participate. We are looking at mechanisms at how to engage the public - the person who is not an industry stakeholder nor an advocate per se, but is a resident of Darwin and wants an opportunity to have their input into what they think Darwin should look like, particularly the CBD. We will be tackling issues of what should be the heights of buildings in the CBD, what will be the set back for buildings, how we want our streetscapes to look, and the nutting down into those difficult areas of debate that, as a society, we are mature enough to tackle, and lay down a strong plan for Darwin as a city that will hold us in good stead for its development for the next five, 10, 15 and 20 years. A forum of this nature is very important and has not been held in Darwin. I am very excited about the opportunity to host it. We are building on the experience of jurisdictions elsewhere which have had similar forums. All our major capital cities have had similar planning forums which gave everyone certainty about what their city was going to look like, and the opportunity for input. In the area of my other agency of Family and Community Services, a key body of work this year will be looking at the implementation of any findings and recommendations that come out of the Chief Ministers child sexual abuse inquiry. In addition, we will implement our new legislation dealing with the care and protection of children and young people. We have received some 70-odd submissions on that legislation. I am looking forward to introducing that key reform of our welfare legislation, the first reform in 20-odd years, into this Assembly this year. We will continue to raise the issue of childcare and the lack of affordable childcare for Territory families. It is a cost that cripples families with young children and creates real barriers to entry into the workforce post having your children. It is something that is very squarely the responsibility of the federal government that they are ignoring and walking away from; that their own backbenchers are condemning them for. As minister responsible for Childrens Services, I will continue to take it up with the federal government and challenge them to start to listen to the cries of families suffering the financial burden of unaffordable childcare, and the barrier to even getting childcare. Childcare is often required so families can pay their mortgage and their bills. It is not necessarily a case of choice of returning to work; many mothers need to return to work post having their babies. In looking at providing for families and providing a co-located centre, a bit of a one-stop-shop model for families in need, we are continuing with the implementation of what we call the families hub in the northern suburbs of Darwin, co-locating organisations such as the Toy Library and SIDS, Kids NT and other non-government organisations that provide support to families. I am looking forward to the implementation of that really exciting one-stop-shop model. We will continue to tackle alcohol abuse in our communities. My division of Alcohol and Other Drugs is doing fantastic work in tackling volatile substance abuse, in wiping out petrol sniffing in our communities. It provides us with the opportunity to apply significant policy and operational input into tackling alcohol abuse, which is a core social problem and related to crime problems within our community. We will also be looking at the disability review, an important piece of work that was undertaken late last year, which is definitely before our government early this year and, hopefully, for implementation through 2007. We are working with the Commonwealth government. There is new mental health funding that has been opened up through the work of


I really don't know much about this Kapor Center so take it for a grain of salt, but seemed like an interesting discussion.
Perhaps someone will introduce a site where people can discreetly and securely log their reason for leaving a company. At some stage, if someone chooses to pursue it further, it may be possible to assimilate information about a particular company.
I figure folk can mine Glassdoor for that.
Perhaps someone will introduce a site where people can discreetly and securely log their reason for leaving a company.
& then you end up with a Yelp like structure of constant content containing drama, exaggerations, & even lying. The entire thing fizzles out when people become disinterested & lawsuits begin.
People leave for various reasons. I don't think we can really hope to solve this sort of thing, and I don't think we should expect that software development, or I.T for that matter will ever be totally inclusive. It takes a certain type of (partially insane) person to be good at this. It really seems that some people think that one day we will all be software developers and I really just don't see that happening. We all leave eventually, whether it be because we retire or because we realize early on that computers are annoying assholes.
Solutions like Yelp never work out the way you'd think initially, you end up with more negative reviews(which are not always accurate, and the person giving negative reviews could be lying to themselves to protect their ego and then blames everyone else which is extremely common) than anything, and then everything spirals from there. Sometime's there's no solution.
I just see these sorts of reports/studies etc as a way to try and keep people in the field that don't really want to be there, and nothing good ever comes from forcing the issue.
Kapor as in Mitch Kapor? You might as well know who he is - Lotus, co-founder of EFF, Chandler? Well, that last one never hit, but there was a guy made a book about it. The book was titled... Dreaming In Code.
Anyway, he seems pretty legit.
Chandler as in Chanandler Bong?
Kapor as in Mitch Kapor? You might as well know who he is - Lotus, co-founder of EFF, Chandler?


Dr. Ed Hoskins is a full-time physician with a heart for the Muslim community. A Muslim's Mind is rooted in more than thirty years of experience with Muslims. He and his wife, Charlene, have a passion to share the hope of Christ with their Muslim friends and mentor others who want to do the same. Ed and his wife have two children and two grandchildren, and they travel to both the Middle East and Far East. In his free time Ed likes to play chess and make wooden toys for children. Ed is also the author of "A Muslim's Heart" what every Christian needs to know about sharing Christ with Muslims.


From Keystone Rd (in between US-19 on the west and East Lake Rd on the east), turn north onto N Highlands Ave. Left on Riverside Ridge Rd. Home will be on right almost at the end of the street.
Sign up to view market trends and price history for 1079 Riverside Ridge Road.
I am interested in 1079 Riverside Ridge Road, Tarpon Springs, FL 34688.


The Tailor Birds play ANTARCTICA on Friday 11 July. It's the first show of the tour, and one of only a few shows in Holland this summer.
Stay up to date at the Facebook event.
Check out www.tailorbirdsmusic.com for tour dates, music, pre sale tickets, new merch & more.


DURBAN - A 2018 special report by the Intergovernmental Panel on Climate Change has identified Southern Africa as a climate change hotspot.
The panel is meeting at the Inkosi Albert Luthuli Convention Centre in Durban on Monday.
The gathering will continue until Friday where the Sixth Assessment Report will be discussed related to the effects of climate change on natural systems, human well-being and the functioning of societies.
Chief director at the Department of Environmental Affairs Maesela Kekana says although the full effects of climate change are likely to be felt 20 to 30 years from now, the high temperatures are already having an impact.
"[For instance] The issue of the Cape Town water crisis that was preceded by the longest drought in history which started in 2015 until late 2018."
Over 200 researchers and experts have been split into three working groups looking at the physical impact of climate change, adaptation measures that need to be taken and how to mitigate the phenomenon.


GrooVe IP Free Calls 2.0.6 apk update fixed credentials loss issue, and now supports dialing your own Google Voice number. Free download and reviews below.
If you are having trouble with an update please try a clean install. Uninstall the app, restart the device, then download and install the app again.


Most people don't associate intelligence with fishes. Blame it on the misconception that evolution is linear, with fishes sunk at the primitive end and primates raised near the top. Increasingly, though, scientists are appreciating the full spectrum of fish behaviors in their natural environments, thanks to advances in technology such as underwater ROVs and better recording equipment.
Their long-term memories help fish keep track of complex social relationships. Their spatial memory — "equal in all respects to any other vertebrate" — allows them to create cognitive maps that guide them through their watery homes, using cues such as polarized light, sounds, odors, and visual landmarks.
Fish also communicate with "sign language" or "Morse code." Lion fish wave the row of fins on their backs in a specific way to signal other fish to join them in a hunt. Large coral groupers alert smaller, more slender fish like moray eels to prey fish concealed in a crevice by pointing their nose toward the concealed fish and shaking their body from side to side, and the obliging eel flushes out the prey.
Fish like physical contact with other fish and often gently rub against one another — like a cat weaving in and out of your legs.
Dr. Phil Gee, a psychologist from the University of Plymouth in the U.K., trained fish to collect food by pressing a lever at specific times, demonstrating their ability to tell time.
Some fish tend well-kept gardens, encouraging the growth of tasty algae and weeding out the types they don't like.
Scientists documented that cichlids would play with a bottom-weighted thermometer, intentionally knocking it over just so that they could watch it bounce back up again.
Fish even use tools. The blackspot tuskfish, for example, has been photographed smashing a clam on a rock until the shell breaks open.
Goldfish have longer "sustained attention" spans than humans, according to a study by Microsoft, which found that the small fish can concentrate for nine seconds compared to eight for humans.


R. G. LOGAN, M.D.; J. M. BANDERA, M.D.; W. M. MIKKELSEN, M.D., F.A.C.P.; I. F. DUFF, M.D., F.A.C.P.
Dermatomyositis, or polymyositis as it is probably more accurately termed, is an uncommon connective tissue disorder. Although reference is made in the English literature to about 700 cases, there have been few sizable series reported in which detailed analysis is available (1-14). Over a 17-year interval we have had the opportunity to follow a reasonably large number of patients in whom this diagnosis has been established. This study presents the clinical and laboratory features of this group of patients.
Published: Ann Intern Med. 1966;65(5):996-1007.


text:
Lawyers Have Their Own "HIPAA" Issues – The Story of a Prostitute
by Medical Justice | Aug 9, 2017 | HIPAA, Legal
Do not conclude I am equating an attorney to a prostitute. I'm not. Jerene Dildene started working as an escort when a divorce and cutback in work hours (teaching Spanish in area pubic school) created financial hardship. Initially she searched Craigslist for part time...
Freckles and Lawsuits
by Medical Justice | Jun 20, 2017 | HIPAA, Legal, Patient Safety, Risk Management
Virtually every physician knows that patient privacy is sacred. One needs a patient's affirmative consent to disclose what is known as protected health information. This is covered by state and federal (HIPAA) privacy laws.If a doctor posts the medical record, that is...
by Medical Justice | May 26, 2017 | Blog, HIPAA, Legal
A Texas physician who performs aesthetic treatments recently agreed to disciplinary action by the Board of Medicine. In 2015, a patient underwent a series of non-invasive laser treatments with Dr. Tinuade Olugesugun-Gbadeham. Around May 27, 2015, the patient made a...
Damn, that's awkward…
by Medical Justice | Mar 29, 2017 | Blog, HIPAA
Ars Technica and the Minneapolis Star Tribune recently reported that Mayo Clinic is considering prioritizing patient care with private insurance over those with Medicare and Medicaid. The Minnesota Department of Human Services (which oversees Minnesota Medicaid),...
Dealing With The "HIPAA Police"
by Medical Justice | Sep 11, 2015 | HIPAA, Medical Justice Articles
We continue with our series of general educational articles penned by one attorney, an MD, JD, giving you a view of the world through a malpractice plaintiff attorney's eyes. This attorney is a seasoned veteran. The series includes a number of pearls on how to stay...
Texas Enacts a New Patient Privacy Law that is More Stringent than HIPAA
by Medical Justice | Aug 26, 2011 | HIPAA, Patient privacy
Michael J. Sacopulos, Esq. Recently, Texas House Bill 300 was signed into law by Texas Governor Rick Perry. The new law, which will become effective on September 1, 2012, expands privacy rights of patients beyond those contained in the HIPAA privacy standards. The law...


The first round of the 2016 Malaysian Superbike Championship was held at the Sepang International Circuit as a support race for the World Superbike Championship. K Rajini, reigning Malaysian Superbike Champion in the 1000cc class competed in the first round astride a 2013 Kawasaki ZX 10R. During qualifying, he managed to put himself fifth on the grid, after facing tyre issues in the wet conditions that prevailed.
During the first race, Rajini was running in second position for the first six laps. With two laps to go, suspension issues cropped up and his bike began sliding around far too much in the corners. This meant he dropped down the order and finished the race fourth.
The second race was declared a wet race. With the track really slippery, the Indian rider, who competes for Team Chia Moto, was only able to finish fifth.
However, there's hope for the upcoming rounds of the championship, as Rajini will now trade the 2013 motorcycle for a 2016 Kawasaki Ninja ZX10R. This means that he is likely to be more competitive in the next few rounds, and has a real shot at defending his championship title.
On another note, Rajini is still trying to raise the remaining funds needed for his 2016 season. There's only a few days left to help him achieve his target. Click here to help him in his crowdfunding effort.


text:
Singapore Employment Pass New Salary Criteria
As a part of MOM's continuous review of the manpower needs to support the Singapore economy, MOM have issued a press release updating the employment pass (EP) salary criteria for foreigner's applying for an employment pass to work in Singapore from 1 January 2017.
From 1 January 2017, the qualifying salary for new EP applications will be raised from $3,300 to $3,600. All new EP applications will be assessed on the new qualifying salary subject to meeting other criteria based on academic qualifications and work experience. The current practice of assessing new EP applications for applicants with many years of work experience and the requirement to command higher salaries will continue.
Employers will have sufficient time to adjust to the new salary threshold for their existing EP holder employees as follows:
a. EP's expiring before 1 January 2017: Renewal: for a duration of up to three years, based on existing EP criteria ($3,300 threshold).
b. EP's expiring between 1 January 2017 and 30 June 2017 (both dates inclusive): Renewal: Will be able to renew, for a duration of one year, based on the existing EP criteria ($3,300 threshold).
c. 1 July 2017 onwards: Renewal: Will have to meet the new criteria ($3,600) for renewal, for a duration of up to three years.
If you have queries regarding the changes to the qualifying salaries for new EP applications and your current EP holder employees, please contact us at CSLB Asia via email at info@cslb-asia.com.
Singapore, Employment Pass (EP), Work Pass, MOM, Foreigner, Incorporation


text:
Watch a live Blue Whale
Balaenoptera musculus
3 subspecies endangered: Northern Blue Whale (Balaenoptera musculus musculus), Southern Blue Whale (Balaenoptera musculus intermedia), Pygmy Blue Whale (Balaenoptera musculus brevicauda)
EN-IUCN: 2008
The blue whale is the largest of all whales and is said to be the largest animal in Earths history. The average length of an adult blue whale is 79 to 88 feet and the average weight is 130 to 150 tons. Blue whales are blue to blue-gray and may sometimes appear to have a faint yellow skin color because of the many microorganisms that accumulate on their bodies as they travel through colder waters. Blue whales prefer cold waters and open seas and prefer not to venture near coastal areas. However, some whales have been seen off the coast of Peru.
The blue whale eats mostly krill (small shrimp-like crustaceans) by using its baleen plates lining its mouth to sieve krill from the water. It can consume several tons of krill daily. Researchers have believed that the blue whale only eats in the summer, seldom eating during the rest of the year. But recent research has suggested that some blue whales of the north may eat year-round and that blue whales found traveling with empty stomachs may stop eating during migration and resume feeding at wintering areas. Blue whales only mate in warmer waters and the gestation period lasts 10 to 11 months. The females give birth to only one calf in the spring which gives the calf the entire summer to grow a layer of blubber needed to protect it when traveling through colder waters. The calves nurse for around seven months.
There are three subspecies of blue whales. The blue whales of the northern and southern hemispheres generally come together for mating, but they are considered two separate subspecies, Balaenoptera musculus musculus and Balaenoptera musculus intermedia. The third subspecies, the pygmy blue whale (Balaenoptera musculus brevicauda), is smaller than the others, and it is found in the sub-Antarctic waters of the Indian Ocean and the southeast Atlantic Ocean. Over 350,000 whales have been hunted and killed, and by the 1960s, blue whales were on the edge of extinction. There are probably only around 2500 blue whales left in the oceans and they are now legally protected despite opposition by the whaling industry.
Copyright Notice: This article is licensed under the GNU Free Documentation License. It uses material from the Wikipedia article "Blue whale".
More Links about the Blue Whale:
Blue Whale - American Cetacean Society
Whale and Dolphin Conservation Society
Blue Whale Facts Last Updated:
Glenn, C. R. 2006. "Earth's Endangered Creatures - Blue Whale Facts" (Online). Accessed 1/17/2020 at http://earthsendangered.com/profile.asp?sp=927&ID=2.
Need more Blue Whale facts?
Want to help save endangered species, but don't have a lot of money to donate? There are actually a lot of creative ways you can help endangered species, even if you are an individual and not a funded organization. We've put together a list of ways you as an individual can help save endangered species.


text:
Pirates! Gold for Windows
Strategy Multi-genre strategy
Pirates! Gold is the excellent remake of 1987's Pirates!, Sid Meier's classic about swashbuckling on the high seas. Despite the pedigree of the original version, the game suffered the same fate as Railroad Tycoon Deluxe when it was initially released in 1993: the game was very buggy, and plays much slower than the EGA original. Fortunately, Microprose shortly released this Windows 3.1 version of the game, which fixed many bugs that were shipped with original DOS release, and finally made Pirates! Gold a game worthy of its name: although it was too late to drum up gamers' attention again.
Anyone who has played Sid Meier's 1987 classic will be at home with this SVGA remake. The object of the game is to retire in high social standing, having amassed a huge fortune in the process. How do you do that? The usual 17th century way of becoming a mighty pirate, sacking towns and other ships, and searching for buried treasure on faraway islands. To acquire social standing, you also must play the dangerous game of politics with four European superpowers (England, France, Holland, and Spain). Gaining their favor may require marrying a governor's daughter, or doing various dirty deeds such as attacking that government's rival countries. Along the way, you will engage in mortal sword duels with other pirates, survive cannon battles in ship-to-ship combat, loosen tongues at bars, and piece together torn pieces of treasure maps. Four countries, four skill levels and six historical scenarios set in different time periods add a great deal of variety to the game. The random map option ensures virtually unlimited replayability.
With Sid Meier's uncanny knack for striking a perfect balance between strategy, action, and even adventure elements, excellent watercolor-style SVGA graphics, and virtually bug-free gameplay thanks to the Windows 3.1 update, Pirates! Gold for Windows is a must-have for anyone interested in the era. And if you like this game, check out Pirates! 2, an excellent freeware remake of the original classic. Two thumbs up!
Designer: Paul Murphy
Software Copyright: Firaxis
Theme: Naval, Grand Adventure, Freelance
System Requirements: Windows 3.1
Related Links: The Lost Tavern, Pirates! Gold Fansite (archived), Pirates of The Spanish Main
If you like this game, try: Pirates 2, Sea Legends, Machiavelli The Prince