text:
#include "precomp.hpp"
#include <limits>
#include BOSS_OPENCV_U_opencl_kernels_features2d_hpp //original-code:"opencl_kernels_features2d.hpp"

#if defined(HAVE_EIGEN) && EIGEN_WORLD_VERSION == 2
#include <Eigen/Array>
#endif

namespace cv
{

/////////////////////// ocl functions for BFMatcher ///////////////////////////

#ifdef HAVE_OPENCL
static void ensureSizeIsEnough(int rows, int cols, int type, UMat &m)
{
    if (m.type() == type && m.rows >= rows && m.cols >= cols)
        m = m(Rect(0, 0, cols, rows));
    else
        m.create(rows, cols, type);
}

static bool ocl_matchSingle(InputArray query, InputArray train,
        UMat &trainIdx, UMat &distance, int distType)
{
    if (query.empty() || train.empty())
        return false;

    const int query_rows = query.rows();
    const int query_cols = query.cols();

    ensureSizeIsEnough(1, query_rows, CV_32S, trainIdx);
    ensureSizeIsEnough(1, query_rows, CV_32F, distance);

    ocl::Device devDef = ocl::Device::getDefault();

    UMat uquery = query.getUMat(), utrain = train.getUMat();
    int kercn = 1;
    if (devDef.isIntel() &&
        (0 == (uquery.step % 4)) && (0 == (uquery.cols % 4)) && (0 == (uquery.offset % 4)) &&
        (0 == (utrain.step % 4)) && (0 == (utrain.cols % 4)) && (0 == (utrain.offset % 4)))
        kercn = 4;

    int block_size = 16;
    int max_desc_len = 0;
    bool is_cpu = devDef.type() == ocl::Device::TYPE_CPU;
    if (query_cols <= 64)
        max_desc_len = 64 / kercn;
    else if (query_cols <= 128 && !is_cpu)
        max_desc_len = 128 / kercn;

    int depth = query.depth();
    cv::String opts;
    opts = cv::format("-D T=%s -D TN=%s -D kercn=%d %s -D DIST_TYPE=%d -D BLOCK_SIZE=%d -D MAX_DESC_LEN=%d",
        ocl::typeToStr(depth), ocl::typeToStr(CV_MAKETYPE(depth, kercn)), kercn, depth == CV_32F ? "-D T_FLOAT" : "", distType, block_size, max_desc_len);
    ocl::Kernel k("BruteForceMatch_Match", ocl::features2d::brute_force_match_oclsrc, opts);
    if(k.empty())
        return false;

    size_t globalSize[] = {((size_t)query.size().height + block_size - 1) / block_size * block_size, (size_t)block_size};
    size_t localSize[] = {(size_t)block_size, (size_t)block_size};

    int idx = 0;
    idx = k.set(idx, ocl::KernelArg::PtrReadOnly(uquery));
    idx = k.set(idx, ocl::KernelArg::PtrReadOnly(utrain));
    idx = k.set(idx, ocl::KernelArg::PtrWriteOnly(trainIdx));
    idx = k.set(idx, ocl::KernelArg::PtrWriteOnly(distance));
    idx = k.set(idx, uquery.rows);
    idx = k.set(idx, uquery.cols);
    idx = k.set(idx, utrain.rows);
    idx = k.set(idx, utrain.cols);
    idx = k.set(idx, (int)(uquery.step / sizeof(float)));

    return k.run(2, globalSize, localSize, false);
}

static bool ocl_matchConvert(const Mat &trainIdx, const Mat &distance, std::vector< std::vector<DMatch> > &matches)
{
    if (trainIdx.empty() || distance.empty())
        return false;

    if( (trainIdx.type() != CV_32SC1) || (distance.type() != CV_32FC1 || distance.cols != trainIdx.cols) )
        return false;

    const int nQuery = trainIdx.cols;

    matches.clear();
    matches.reserve(nQuery);

    const int *trainIdx_ptr = trainIdx.ptr<int>();
    const float *distance_ptr =  distance.ptr<float>();
    for (int queryIdx = 0; queryIdx < nQuery; ++queryIdx, ++trainIdx_ptr, ++distance_ptr)
    {
        int trainIndex = *trainIdx_ptr;

        if (trainIndex == -1)
            continue;

        float dst = *distance_ptr;

        DMatch m(queryIdx, trainIndex, 0, dst);

        std::vector<DMatch> temp;
        temp.push_back(m);
        matches.push_back(temp);
    }
    return true;
}

static bool ocl_matchDownload(const UMat &trainIdx, const UMat &distance, std::vector< std::vector<DMatch> > &matches)
{
    if (trainIdx.empty() || distance.empty())
        return false;

    Mat trainIdxCPU = trainIdx.getMat(ACCESS_READ);
    Mat distanceCPU = distance.getMat(ACCESS_READ);

    return ocl_matchConvert(trainIdxCPU, distanceCPU, matches);
}

static bool ocl_knnMatchSingle(InputArray query, InputArray train, UMat &trainIdx,
                               UMat &distance, int distType)
{
    if (query.empty() || train.empty())
        return false;

    const int query_rows = query.rows();
    const int query_cols = query.cols();

    ensureSizeIsEnough(1, query_rows, CV_32SC2, trainIdx);
    ensureSizeIsEnough(1, query_rows, CV_32FC2, distance);

    trainIdx.setTo(Scalar::all(-1));

    ocl::Device devDef = ocl::Device::getDefault();

    UMat uquery = query.getUMat(), utrain = train.getUMat();
    int kercn = 1;
    if (devDef.isIntel() &&
        (0 == (uquery.step % 4)) && (0 == (uquery.cols % 4)) && (0 == (uquery.offset % 4)) &&
        (0 == (utrain.step % 4)) && (0 == (utrain.cols % 4)) && (0 == (utrain.offset % 4)))
        kercn = 4;

    int block_size = 16;
    int max_desc_len = 0;
    bool is_cpu = devDef.type() == ocl::Device::TYPE_CPU;
    if (query_cols <= 64)
        max_desc_len = 64 / kercn;
    else if (query_cols <= 128 && !is_cpu)
        max_desc_len = 128 / kercn;

    int depth = query.depth();
    cv::String opts;
    opts = cv::format("-D T=%s -D TN=%s -D kercn=%d %s -D DIST_TYPE=%d -D BLOCK_SIZE=%d -D MAX_DESC_LEN=%d",
        ocl::typeToStr(depth), ocl::typeToStr(CV_MAKETYPE(depth, kercn)), kercn, depth == CV_32F ? "-D T_FLOAT" : "", distType, block_size, max_desc_len);
    ocl::Kernel k("BruteForceMatch_knnMatch", ocl::features2d::brute_force_match_oclsrc, opts);
    if(k.empty())
        return false;

    size_t globalSize[] = {((size_t)query_rows + block_size - 1) / block_size * block_size, (size_t)block_size};
    size_t localSize[] = {(size_t)block_size, (size_t)block_size};

    int idx = 0;
    idx = k.set(idx, ocl::KernelArg::PtrReadOnly(uquery));
    idx = k.set(idx, ocl::KernelArg::PtrReadOnly(utrain));
    idx = k.set(idx, ocl::KernelArg::PtrWriteOnly(trainIdx));
    idx = k.set(idx, ocl::KernelArg::PtrWriteOnly(distance));
    idx = k.set(idx, uquery.rows);
    idx = k.set(idx, uquery.cols);
    idx = k.set(idx, utrain.rows);
    idx = k.set(idx, utrain.cols);
    idx = k.set(idx, (int)(uquery.step / sizeof(float)));

    return k.run(2, globalSize, localSize, false);
}

static bool ocl_knnMatchConvert(const Mat &trainIdx, const Mat &distance, std::vector< std::vector<DMatch> > &matches, bool compactResult)
{
    if (trainIdx.empty() || distance.empty())
        return false;

    if(trainIdx.type() != CV_32SC2 && trainIdx.type() != CV_32SC1) return false;
    if(distance.type() != CV_32FC2 && distance.type() != CV_32FC1)return false;
    if(distance.size() != trainIdx.size()) return false;
    if(!trainIdx.isContinuous() || !distance.isContinuous()) return false;

    const int nQuery = trainIdx.type() == CV_32SC2 ? trainIdx.cols : trainIdx.rows;
    const int k = trainIdx.type() == CV_32SC2 ? 2 : trainIdx.cols;

    matches.clear();
    matches.reserve(nQuery);

    const int *trainIdx_ptr = trainIdx.ptr<int>();
    const float *distance_ptr = distance.ptr<float>();

    for (int queryIdx = 0; queryIdx < nQuery; ++queryIdx)
    {
        matches.push_back(std::vector<DMatch>());
        std::vector<DMatch> &curMatches = matches.back();
        curMatches.reserve(k);

        for (int i = 0; i < k; ++i, ++trainIdx_ptr, ++distance_ptr)
        {
            int trainIndex = *trainIdx_ptr;

            if (trainIndex != -1)
            {
                float dst = *distance_ptr;

                DMatch m(queryIdx, trainIndex, 0, dst);

                curMatches.push_back(m);
            }
        }

        if (compactResult && curMatches.empty())
            matches.pop_back();
    }
    return true;
}

static bool ocl_knnMatchDownload(const UMat &trainIdx, const UMat &distance, std::vector< std::vector<DMatch> > &matches, bool compactResult)
{
    if (trainIdx.empty() || distance.empty())
        return false;

    Mat trainIdxCPU = trainIdx.getMat(ACCESS_READ);
    Mat distanceCPU = distance.getMat(ACCESS_READ);

    return ocl_knnMatchConvert(trainIdxCPU, distanceCPU, matches, compactResult);
}

static bool ocl_radiusMatchSingle(InputArray query, InputArray train,
        UMat &trainIdx,   UMat &distance, UMat &nMatches, float maxDistance, int distType)
{
    if (query.empty() || train.empty())
        return false;

    const int query_rows = query.rows();
    const int train_rows = train.rows();

    ensureSizeIsEnough(1, query_rows, CV_32SC1, nMatches);

    if (trainIdx.empty())
    {
        ensureSizeIsEnough(query_rows, std::max((train_rows / 100), 10), CV_32SC1, trainIdx);
        ensureSizeIsEnough(query_rows, std::max((train_rows / 100), 10), CV_32FC1, distance);
    }

    nMatches.setTo(Scalar::all(0));

    ocl::Device devDef = ocl::Device::getDefault();
    UMat uquery = query.getUMat(), utrain = train.getUMat();
    int kercn = 1;
    if (devDef.isIntel() &&
        (0 == (uquery.step % 4)) && (0 == (uquery.cols % 4)) && (0 == (uquery.offset % 4)) &&
        (0 == (utrain.step % 4)) && (0 == (utrain.cols % 4)) && (0 == (utrain.offset % 4)))
        kercn = 4;

    int block_size = 16;
    int depth = query.depth();
    cv::String opts;
    opts = cv::format("-D T=%s -D TN=%s -D kercn=%d %s -D DIST_TYPE=%d -D BLOCK_SIZE=%d",
        ocl::typeToStr(depth), ocl::typeToStr(CV_MAKETYPE(depth, kercn)), kercn, depth == CV_32F ? "-D T_FLOAT" : "", distType, block_size);
    ocl::Kernel k("BruteForceMatch_RadiusMatch", ocl::features2d::brute_force_match_oclsrc, opts);
    if (k.empty())
        return false;

    size_t globalSize[] = {((size_t)train_rows + block_size - 1) / block_size * block_size, ((size_t)query_rows + block_size - 1) / block_size * block_size};
    size_t localSize[] = {(size_t)block_size, (size_t)block_size};

    int idx = 0;
    idx = k.set(idx, ocl::KernelArg::PtrReadOnly(uquery));
    idx = k.set(idx, ocl::KernelArg::PtrReadOnly(utrain));
    idx = k.set(idx, maxDistance);
    idx = k.set(idx, ocl::KernelArg::PtrWriteOnly(trainIdx));
    idx = k.set(idx, ocl::KernelArg::PtrWriteOnly(distance));
    idx = k.set(idx, ocl::KernelArg::PtrWriteOnly(nMatches));
    idx = k.set(idx, uquery.rows);
    idx = k.set(idx, uquery.cols);
    idx = k.set(idx, utrain.rows);
    idx = k.set(idx, utrain.cols);
    idx = k.set(idx, trainIdx.cols);
    idx = k.set(idx, (int)(uquery.step / sizeof(float)));
    idx = k.set(idx, (int)(trainIdx.step / sizeof(int)));

    return k.run(2, globalSize, localSize, false);
}

static bool ocl_radiusMatchConvert(const Mat &trainIdx, const Mat &distance, const Mat &_nMatches,
        std::vector< std::vector<DMatch> > &matches, bool compactResult)
{
    if (trainIdx.empty() || distance.empty() || _nMatches.empty())
        return false;

    if( (trainIdx.type() != CV_32SC1) ||
        (distance.type() != CV_32FC1 || distance.size() != trainIdx.size()) ||
        (_nMatches.type() != CV_32SC1 || _nMatches.cols != trainIdx.rows) )
        return false;

    const int nQuery = trainIdx.rows;

    matches.clear();
    matches.reserve(nQuery);

    const int *nMatches_ptr = _nMatches.ptr<int>();

    for (int queryIdx = 0; queryIdx < nQuery; ++queryIdx)
    {
        const int *trainIdx_ptr = trainIdx.ptr<int>(queryIdx);
        const float *distance_ptr = distance.ptr<float>(queryIdx);

        const int nMatches = std::min(nMatches_ptr[queryIdx], trainIdx.cols);

        if (nMatches == 0)
        {
            if (!compactResult)
                matches.push_back(std::vector<DMatch>());
            continue;
        }

        matches.push_back(std::vector<DMatch>(nMatches));
        std::vector<DMatch> &curMatches = matches.back();

        for (int i = 0; i < nMatches; ++i, ++trainIdx_ptr, ++distance_ptr)
        {
            int trainIndex = *trainIdx_ptr;

            float dst = *distance_ptr;

            DMatch m(queryIdx, trainIndex, 0, dst);

            curMatches[i] = m;
        }

        std::sort(curMatches.begin(), curMatches.end());
    }
    return true;
}

static bool ocl_radiusMatchDownload(const UMat &trainIdx, const UMat &distance, const UMat &nMatches,
        std::vector< std::vector<DMatch> > &matches, bool compactResult)
{
    if (trainIdx.empty() || distance.empty() || nMatches.empty())
        return false;

    Mat trainIdxCPU = trainIdx.getMat(ACCESS_READ);
    Mat distanceCPU = distance.getMat(ACCESS_READ);
    Mat nMatchesCPU = nMatches.getMat(ACCESS_READ);

    return ocl_radiusMatchConvert(trainIdxCPU, distanceCPU, nMatchesCPU, matches, compactResult);
}
#endif

/****************************************************************************************\
*                                      DescriptorMatcher                                 *
\****************************************************************************************/
DescriptorMatcher::DescriptorCollection::DescriptorCollection()
{}

DescriptorMatcher::DescriptorCollection::DescriptorCollection( const DescriptorCollection& collection )
{
    mergedDescriptors = collection.mergedDescriptors.clone();
    std::copy( collection.startIdxs.begin(), collection.startIdxs.begin(), startIdxs.begin() );
}

DescriptorMatcher::DescriptorCollection::~DescriptorCollection()
{}

void DescriptorMatcher::DescriptorCollection::set( const std::vector<Mat>& descriptors )
{
    clear();

    size_t imageCount = descriptors.size();
    CV_Assert( imageCount > 0 );

    startIdxs.resize( imageCount );

    int dim = -1;
    int type = -1;
    startIdxs[0] = 0;
    for( size_t i = 1; i < imageCount; i++ )
    {
        int s = 0;
        if( !descriptors[i-1].empty() )
        {
            dim = descriptors[i-1].cols;
            type = descriptors[i-1].type();
            s = descriptors[i-1].rows;
        }
        startIdxs[i] = startIdxs[i-1] + s;
    }
    if( imageCount == 1 )
    {
        if( descriptors[0].empty() ) return;

        dim = descriptors[0].cols;
        type = descriptors[0].type();
    }
    CV_Assert( dim > 0 );

    int count = startIdxs[imageCount-1] + descriptors[imageCount-1].rows;

    if( count > 0 )
    {
        mergedDescriptors.create( count, dim, type );
        for( size_t i = 0; i < imageCount; i++ )
        {
            if( !descriptors[i].empty() )
            {
                CV_Assert( descriptors[i].cols == dim && descriptors[i].type() == type );
                Mat m = mergedDescriptors.rowRange( startIdxs[i], startIdxs[i] + descriptors[i].rows );
                descriptors[i].copyTo(m);
            }
        }
    }
}

void DescriptorMatcher::DescriptorCollection::clear()
{
    startIdxs.clear();
    mergedDescriptors.release();
}

const Mat DescriptorMatcher::DescriptorCollection::getDescriptor( int imgIdx, int localDescIdx ) const
{
    CV_Assert( imgIdx < (int)startIdxs.size() );
    int globalIdx = startIdxs[imgIdx] + localDescIdx;
    CV_Assert( globalIdx < (int)size() );

    return getDescriptor( globalIdx );
}

const Mat& DescriptorMatcher::DescriptorCollection::getDescriptors() const
{
    return mergedDescriptors;
}

const Mat DescriptorMatcher::DescriptorCollection::getDescriptor( int globalDescIdx ) const
{
    CV_Assert( globalDescIdx < size() );
    return mergedDescriptors.row( globalDescIdx );
}

void DescriptorMatcher::DescriptorCollection::getLocalIdx( int globalDescIdx, int& imgIdx, int& localDescIdx ) const
{
    CV_Assert( (globalDescIdx>=0) && (globalDescIdx < size()) );
    std::vector<int>::const_iterator img_it = std::upper_bound(startIdxs.begin(), startIdxs.end(), globalDescIdx);
    --img_it;
    imgIdx = (int)(img_it - startIdxs.begin());
    localDescIdx = globalDescIdx - (*img_it);
}

int DescriptorMatcher::DescriptorCollection::size() const
{
    return mergedDescriptors.rows;
}

/*
 * DescriptorMatcher
 */
static void convertMatches( const std::vector<std::vector<DMatch> >& knnMatches, std::vector<DMatch>& matches )
{
    matches.clear();
    matches.reserve( knnMatches.size() );
    for( size_t i = 0; i < knnMatches.size(); i++ )
    {
        CV_Assert( knnMatches[i].size() <= 1 );
        if( !knnMatches[i].empty() )
            matches.push_back( knnMatches[i][0] );
    }
}

DescriptorMatcher::~DescriptorMatcher()
{}

void DescriptorMatcher::add( InputArrayOfArrays _descriptors )
{
    if(_descriptors.isUMatVector())
    {
        std::vector<UMat> descriptors;
        _descriptors.getUMatVector(descriptors);
        utrainDescCollection.insert( utrainDescCollection.end(), descriptors.begin(), descriptors.end() );
    }
    else if(_descriptors.isUMat())
    {
        std::vector<UMat> descriptors = std::vector<UMat>(1, _descriptors.getUMat());
        utrainDescCollection.insert( utrainDescCollection.end(), descriptors.begin(), descriptors.end() );
    }
    else if(_descriptors.isMatVector())
    {
        std::vector<Mat> descriptors;
        _descriptors.getMatVector(descriptors);
        trainDescCollection.insert( trainDescCollection.end(), descriptors.begin(), descriptors.end() );
    }
    else if(_descriptors.isMat())
    {
        std::vector<Mat> descriptors = std::vector<Mat>(1, _descriptors.getMat());
        trainDescCollection.insert( trainDescCollection.end(), descriptors.begin(), descriptors.end() );
    }
    else
        CV_Assert( _descriptors.isUMat() || _descriptors.isUMatVector() || _descriptors.isMat() || _descriptors.isMatVector() );
}

const std::vector<Mat>& DescriptorMatcher::getTrainDescriptors() const
{
    return trainDescCollection;
}

void DescriptorMatcher::clear()
{
    utrainDescCollection.clear();
    trainDescCollection.clear();
}

bool DescriptorMatcher::empty() const
{
    return trainDescCollection.empty() && utrainDescCollection.empty();
}

void DescriptorMatcher::train()
{}

void DescriptorMatcher::match( InputArray queryDescriptors, InputArray trainDescriptors,
                              std::vector<DMatch>& matches, InputArray mask ) const
{
    Ptr<DescriptorMatcher> tempMatcher = clone(true);
    tempMatcher->add(trainDescriptors);
    tempMatcher->match( queryDescriptors, matches, std::vector<Mat>(1, mask.getMat()) );
}

void DescriptorMatcher::knnMatch( InputArray queryDescriptors, InputArray trainDescriptors,
                                  std::vector<std::vector<DMatch> >& matches, int knn,
                                  InputArray mask, bool compactResult ) const
{
    Ptr<DescriptorMatcher> tempMatcher = clone(true);
    tempMatcher->add(trainDescriptors);
    tempMatcher->knnMatch( queryDescriptors, matches, knn, std::vector<Mat>(1, mask.getMat()), compactResult );
}

void DescriptorMatcher::radiusMatch( InputArray queryDescriptors, InputArray trainDescriptors,
                                     std::vector<std::vector<DMatch> >& matches, float maxDistance, InputArray mask,
                                     bool compactResult ) const
{
    Ptr<DescriptorMatcher> tempMatcher = clone(true);
    tempMatcher->add(trainDescriptors);
    tempMatcher->radiusMatch( queryDescriptors, matches, maxDistance, std::vector<Mat>(1, mask.getMat()), compactResult );
}

void DescriptorMatcher::match( InputArray queryDescriptors, std::vector<DMatch>& matches, InputArrayOfArrays masks )
{
    std::vector<std::vector<DMatch> > knnMatches;
    knnMatch( queryDescriptors, knnMatches, 1, masks, true /*compactResult*/ );
    convertMatches( knnMatches, matches );
}

void DescriptorMatcher::checkMasks( InputArrayOfArrays _masks, int queryDescriptorsCount ) const
{
    std::vector<Mat> masks;
    _masks.getMatVector(masks);

    if( isMaskSupported() && !masks.empty() )
    {
        // Check masks
        size_t imageCount = std::max(trainDescCollection.size(), utrainDescCollection.size() );
        CV_Assert( masks.size() == imageCount );
        for( size_t i = 0; i < imageCount; i++ )
        {
            if( !masks[i].empty() && (!trainDescCollection[i].empty() || !utrainDescCollection[i].empty() ) )
            {
                int rows = trainDescCollection[i].empty() ? utrainDescCollection[i].rows : trainDescCollection[i].rows;
                    CV_Assert( masks[i].rows == queryDescriptorsCount &&
                        (masks[i].cols == rows || masks[i].cols == rows) &&
                        masks[i].type() == CV_8UC1 );
            }
        }
    }
}

void DescriptorMatcher::knnMatch( InputArray queryDescriptors, std::vector<std::vector<DMatch> >& matches, int knn,
                                  InputArrayOfArrays masks, bool compactResult )
{
    if( empty() || queryDescriptors.empty() )
        return;

    CV_Assert( knn > 0 );

    checkMasks( masks, queryDescriptors.size().height );

    train();
    knnMatchImpl( queryDescriptors, matches, knn, masks, compactResult );
}

void DescriptorMatcher::radiusMatch( InputArray queryDescriptors, std::vector<std::vector<DMatch> >& matches, float maxDistance,
                                     InputArrayOfArrays masks, bool compactResult )
{
    matches.clear();
    if( empty() || queryDescriptors.empty() )
        return;

    CV_Assert( maxDistance > std::numeric_limits<float>::epsilon() );

    checkMasks( masks, queryDescriptors.size().height );

    train();
    radiusMatchImpl( queryDescriptors, matches, maxDistance, masks, compactResult );
}

void DescriptorMatcher::read( const FileNode& )
{}

void DescriptorMatcher::write( FileStorage& ) const
{}

bool DescriptorMatcher::isPossibleMatch( InputArray _mask, int queryIdx, int trainIdx )
{
    Mat mask = _mask.getMat();
    return mask.empty() || mask.at<uchar>(queryIdx, trainIdx);
}

bool DescriptorMatcher::isMaskedOut( InputArrayOfArrays _masks, int queryIdx )
{
    std::vector<Mat> masks;
    _masks.getMatVector(masks);

    size_t outCount = 0;
    for( size_t i = 0; i < masks.size(); i++ )
    {
        if( !masks[i].empty() && (countNonZero(masks[i].row(queryIdx)) == 0) )
            outCount++;
    }

    return !masks.empty() && outCount == masks.size() ;
}

////////////////////////////////////////////////////// BruteForceMatcher /////////////////////////////////////////////////

BFMatcher::BFMatcher( int _normType, bool _crossCheck )
{
    normType = _normType;
    crossCheck = _crossCheck;
}

Ptr<DescriptorMatcher> BFMatcher::clone( bool emptyTrainData ) const
{
    Ptr<BFMatcher> matcher = makePtr<BFMatcher>(normType, crossCheck);
    if( !emptyTrainData )
    {
        matcher->trainDescCollection.resize(trainDescCollection.size());
        std::transform( trainDescCollection.begin(), trainDescCollection.end(),
                        matcher->trainDescCollection.begin(), clone_op );
    }
    return matcher;
}

#ifdef HAVE_OPENCL
static bool ocl_match(InputArray query, InputArray _train, std::vector< std::vector<DMatch> > &matches, int dstType)
{
    UMat trainIdx, distance;
    if (!ocl_matchSingle(query, _train, trainIdx, distance, dstType))
        return false;
    if (!ocl_matchDownload(trainIdx, distance, matches))
        return false;
    return true;
}

static bool ocl_knnMatch(InputArray query, InputArray _train, std::vector< std::vector<DMatch> > &matches, int k, int dstType, bool compactResult)
{
    UMat trainIdx, distance;
    if (k != 2)
        return false;
    if (!ocl_knnMatchSingle(query, _train, trainIdx, distance, dstType))
        return false;
    if (!ocl_knnMatchDownload(trainIdx, distance, matches, compactResult) )
        return false;
    return true;
}
#endif

void BFMatcher::knnMatchImpl( InputArray _queryDescriptors, std::vector<std::vector<DMatch> >& matches, int knn,
                             InputArrayOfArrays _masks, bool compactResult )
{
    int trainDescType = trainDescCollection.empty() ? utrainDescCollection[0].type() : trainDescCollection[0].type();
    CV_Assert( _queryDescriptors.type() == trainDescType );

    const int IMGIDX_SHIFT = 18;
    const int IMGIDX_ONE = (1 << IMGIDX_SHIFT);

    if( _queryDescriptors.empty() || (trainDescCollection.empty() && utrainDescCollection.empty()))
    {
        matches.clear();
        return;
    }

    std::vector<Mat> masks;
    _masks.getMatVector(masks);

    if(!trainDescCollection.empty() && !utrainDescCollection.empty())
    {
        for(int i = 0; i < (int)utrainDescCollection.size(); i++)
        {
            Mat tempMat;
            utrainDescCollection[i].copyTo(tempMat);
            trainDescCollection.push_back(tempMat);
        }
        utrainDescCollection.clear();
    }

#ifdef HAVE_OPENCL
    int trainDescVectorSize = trainDescCollection.empty() ? (int)utrainDescCollection.size() : (int)trainDescCollection.size();
    Size trainDescSize = trainDescCollection.empty() ? utrainDescCollection[0].size() : trainDescCollection[0].size();
    int trainDescOffset = trainDescCollection.empty() ? (int)utrainDescCollection[0].offset : 0;

    if ( ocl::useOpenCL() && _queryDescriptors.isUMat() && _queryDescriptors.dims()<=2 && trainDescVectorSize == 1 &&
        _queryDescriptors.type() == CV_32FC1 && _queryDescriptors.offset() == 0 && trainDescOffset == 0 &&
        trainDescSize.width == _queryDescriptors.size().width && masks.size() == 1 && masks[0].total() == 0 )
    {
        if(knn == 1)
        {
            if(trainDescCollection.empty())
            {
                if(ocl_match(_queryDescriptors, utrainDescCollection[0], matches, normType))
                {
                    CV_IMPL_ADD(CV_IMPL_OCL);
                    return;
                }
            }
            else
            {
                if(ocl_match(_queryDescriptors, trainDescCollection[0], matches, normType))
                {
                    CV_IMPL_ADD(CV_IMPL_OCL);
                    return;
                }
            }
        }
        else
        {
            if(trainDescCollection.empty())
            {
                if(ocl_knnMatch(_queryDescriptors, utrainDescCollection[0], matches, knn, normType, compactResult) )
                {
                    CV_IMPL_ADD(CV_IMPL_OCL);
                    return;
                }
            }
            else
            {
                if(ocl_knnMatch(_queryDescriptors, trainDescCollection[0], matches, knn, normType, compactResult) )
                {
                    CV_IMPL_ADD(CV_IMPL_OCL);
                    return;
                }
            }
        }
    }
#endif

    Mat queryDescriptors = _queryDescriptors.getMat();
    if(trainDescCollection.empty() && !utrainDescCollection.empty())
    {
        for(int i = 0; i < (int)utrainDescCollection.size(); i++)
        {
            Mat tempMat;
            utrainDescCollection[i].copyTo(tempMat);
            trainDescCollection.push_back(tempMat);
        }
        utrainDescCollection.clear();
    }

    matches.reserve(queryDescriptors.rows);

    Mat dist, nidx;

    int iIdx, imgCount = (int)trainDescCollection.size(), update = 0;
    int dtype = normType == NORM_HAMMING || normType == NORM_HAMMING2 ||
        (normType == NORM_L1 && queryDescriptors.type() == CV_8U) ? CV_32S : CV_32F;

    CV_Assert( (int64)imgCount*IMGIDX_ONE < INT_MAX );

    for( iIdx = 0; iIdx < imgCount; iIdx++ )
    {
        CV_Assert( trainDescCollection[iIdx].rows < IMGIDX_ONE );
        batchDistance(queryDescriptors, trainDescCollection[iIdx], dist, dtype, nidx,
                      normType, knn, masks.empty() ? Mat() : masks[iIdx], update, crossCheck);
        update += IMGIDX_ONE;
    }

    if( dtype == CV_32S )
    {
        Mat temp;
        dist.convertTo(temp, CV_32F);
        dist = temp;
    }

    for( int qIdx = 0; qIdx < queryDescriptors.rows; qIdx++ )
    {
        const float* distptr = dist.ptr<float>(qIdx);
        const int* nidxptr = nidx.ptr<int>(qIdx);

        matches.push_back( std::vector<DMatch>() );
        std::vector<DMatch>& mq = matches.back();
        mq.reserve(knn);

        for( int k = 0; k < nidx.cols; k++ )
        {
            if( nidxptr[k] < 0 )
                break;
            mq.push_back( DMatch(qIdx, nidxptr[k] & (IMGIDX_ONE - 1),
                          nidxptr[k] >> IMGIDX_SHIFT, distptr[k]) );
        }

        if( mq.empty() && compactResult )
            matches.pop_back();
    }
}

#ifdef HAVE_OPENCL
static bool ocl_radiusMatch(InputArray query, InputArray _train, std::vector< std::vector<DMatch> > &matches,
        float maxDistance, int dstType, bool compactResult)
{
    UMat trainIdx, distance, nMatches;
    if (!ocl_radiusMatchSingle(query, _train, trainIdx, distance, nMatches, maxDistance, dstType))
        return false;
    if (!ocl_radiusMatchDownload(trainIdx, distance, nMatches, matches, compactResult))
        return false;
    return true;
}
#endif

void BFMatcher::radiusMatchImpl( InputArray _queryDescriptors, std::vector<std::vector<DMatch> >& matches,
                                float maxDistance, InputArrayOfArrays _masks, bool compactResult )
{
    int trainDescType = trainDescCollection.empty() ? utrainDescCollection[0].type() : trainDescCollection[0].type();
    CV_Assert( _queryDescriptors.type() == trainDescType );

    if( _queryDescriptors.empty() || (trainDescCollection.empty() && utrainDescCollection.empty()))
    {
        matches.clear();
        return;
    }

    std::vector<Mat> masks;
    _masks.getMatVector(masks);

    if(!trainDescCollection.empty() && !utrainDescCollection.empty())
    {
        for(int i = 0; i < (int)utrainDescCollection.size(); i++)
        {
            Mat tempMat;
            utrainDescCollection[i].copyTo(tempMat);
            trainDescCollection.push_back(tempMat);
        }
        utrainDescCollection.clear();
    }

#ifdef HAVE_OPENCL
    int trainDescVectorSize = trainDescCollection.empty() ? (int)utrainDescCollection.size() : (int)trainDescCollection.size();
    Size trainDescSize = trainDescCollection.empty() ? utrainDescCollection[0].size() : trainDescCollection[0].size();
    int trainDescOffset = trainDescCollection.empty() ? (int)utrainDescCollection[0].offset : 0;

    if ( ocl::useOpenCL() && _queryDescriptors.isUMat() && _queryDescriptors.dims()<=2 && trainDescVectorSize == 1 &&
        _queryDescriptors.type() == CV_32FC1 && _queryDescriptors.offset() == 0 && trainDescOffset == 0 &&
        trainDescSize.width == _queryDescriptors.size().width && masks.size() == 1 && masks[0].total() == 0 )
    {
        if (trainDescCollection.empty())
        {
            if(ocl_radiusMatch(_queryDescriptors, utrainDescCollection[0], matches, maxDistance, normType, compactResult) )
            {
                CV_IMPL_ADD(CV_IMPL_OCL);
                return;
            }
        }
        else
        {
            if (ocl_radiusMatch(_queryDescriptors, trainDescCollection[0], matches, maxDistance, normType, compactResult) )
            {
                CV_IMPL_ADD(CV_IMPL_OCL);
                return;
            }
        }
    }
#endif

    Mat queryDescriptors = _queryDescriptors.getMat();
    if(trainDescCollection.empty() && !utrainDescCollection.empty())
    {
        for(int i = 0; i < (int)utrainDescCollection.size(); i++)
        {
            Mat tempMat;
            utrainDescCollection[i].copyTo(tempMat);
            trainDescCollection.push_back(tempMat);
        }
        utrainDescCollection.clear();
    }

    matches.resize(queryDescriptors.rows);
    Mat dist, distf;

    int iIdx, imgCount = (int)trainDescCollection.size();
    int dtype = normType == NORM_HAMMING ||
        (normType == NORM_L1 && queryDescriptors.type() == CV_8U) ? CV_32S : CV_32F;

    for( iIdx = 0; iIdx < imgCount; iIdx++ )
    {
        batchDistance(queryDescriptors, trainDescCollection[iIdx], dist, dtype, noArray(),
                      normType, 0, masks.empty() ? Mat() : masks[iIdx], 0, false);
        if( dtype == CV_32S )
            dist.convertTo(distf, CV_32F);
        else
            distf = dist;

        for( int qIdx = 0; qIdx < queryDescriptors.rows; qIdx++ )
        {
            const float* distptr = distf.ptr<float>(qIdx);

            std::vector<DMatch>& mq = matches[qIdx];
            for( int k = 0; k < distf.cols; k++ )
            {
                if( distptr[k] <= maxDistance )
                    mq.push_back( DMatch(qIdx, k, iIdx, distptr[k]) );
            }
        }
    }

    int qIdx0 = 0;
    for( int qIdx = 0; qIdx < queryDescriptors.rows; qIdx++ )
    {
        if( matches[qIdx].empty() && compactResult )
            continue;

        if( qIdx0 < qIdx )
            std::swap(matches[qIdx], matches[qIdx0]);

        std::sort( matches[qIdx0].begin(), matches[qIdx0].end() );
        qIdx0++;
    }
}

///////////////////////////////////////////////////////////////////////////////////////////////////////

/*
 * Factory function for DescriptorMatcher creating
 */
Ptr<DescriptorMatcher> DescriptorMatcher::create( const String& descriptorMatcherType )
{
    Ptr<DescriptorMatcher> dm;
    if( !descriptorMatcherType.compare( "FlannBased" ) )
    {
        dm = makePtr<FlannBasedMatcher>();
    }
    else if( !descriptorMatcherType.compare( "BruteForce" ) ) // L2
    {
        dm = makePtr<BFMatcher>(int(NORM_L2)); // anonymous enums can't be template parameters
    }
    else if( !descriptorMatcherType.compare( "BruteForce-SL2" ) ) // Squared L2
    {
        dm = makePtr<BFMatcher>(int(NORM_L2SQR));
    }
    else if( !descriptorMatcherType.compare( "BruteForce-L1" ) )
    {
        dm = makePtr<BFMatcher>(int(NORM_L1));
    }
    else if( !descriptorMatcherType.compare("BruteForce-Hamming") ||
             !descriptorMatcherType.compare("BruteForce-HammingLUT") )
    {
        dm = makePtr<BFMatcher>(int(NORM_HAMMING));
    }
    else if( !descriptorMatcherType.compare("BruteForce-Hamming(2)") )
    {
        dm = makePtr<BFMatcher>(int(NORM_HAMMING2));
    }
    else
        CV_Error( Error::StsBadArg, "Unknown matcher name" );

    return dm;
}

/*
 * Flann based matcher
 */
FlannBasedMatcher::FlannBasedMatcher( const Ptr<flann::IndexParams>& _indexParams, const Ptr<flann::SearchParams>& _searchParams )
    : indexParams(_indexParams), searchParams(_searchParams), addedDescCount(0)
{
    CV_Assert( _indexParams );
    CV_Assert( _searchParams );
}

void FlannBasedMatcher::add( InputArrayOfArrays _descriptors )
{
    DescriptorMatcher::add( _descriptors );
    std::vector<UMat> descriptors;
    _descriptors.getUMatVector(descriptors);

    for( size_t i = 0; i < descriptors.size(); i++ )
    {
        addedDescCount += descriptors[i].rows;
    }
}

void FlannBasedMatcher::clear()
{
    DescriptorMatcher::clear();

    mergedDescriptors.clear();
    flannIndex.release();

    addedDescCount = 0;
}

void FlannBasedMatcher::train()
{
    if( !flannIndex || mergedDescriptors.size() < addedDescCount )
    {
        // FIXIT: Workaround for 'utrainDescCollection' issue (PR #2142)
        if (!utrainDescCollection.empty())
        {
            CV_Assert(trainDescCollection.size() == 0);
            for (size_t i = 0; i < utrainDescCollection.size(); ++i)
                trainDescCollection.push_back(utrainDescCollection[i].getMat(ACCESS_READ));
        }
        mergedDescriptors.set( trainDescCollection );
        flannIndex = makePtr<flann::Index>( mergedDescriptors.getDescriptors(), *indexParams );
    }
}

void FlannBasedMatcher::read( const FileNode& fn)
{
     if (!indexParams)
         indexParams = makePtr<flann::IndexParams>();

     FileNode ip = fn["indexParams"];
     CV_Assert(ip.type() == FileNode::SEQ);

     for(int i = 0; i < (int)ip.size(); ++i)
     {
        CV_Assert(ip[i].type() == FileNode::MAP);
        String _name =  (String)ip[i]["name"];
        int type =  (int)ip[i]["type"];

        switch(type)
        {
        case CV_8U:
        case CV_8S:
        case CV_16U:
        case CV_16S:
        case CV_32S:
            indexParams->setInt(_name, (int) ip[i]["value"]);
            break;
        case CV_32F:
            indexParams->setFloat(_name, (float) ip[i]["value"]);
            break;
        case CV_64F:
            indexParams->setDouble(_name, (double) ip[i]["value"]);
            break;
        case CV_USRTYPE1:
            indexParams->setString(_name, (String) ip[i]["value"]);
            break;
        case CV_MAKETYPE(CV_USRTYPE1,2):
            indexParams->setBool(_name, (int) ip[i]["value"] != 0);
            break;
        case CV_MAKETYPE(CV_USRTYPE1,3):
            indexParams->setAlgorithm((int) ip[i]["value"]);
            break;
        };
     }

     if (!searchParams)
         searchParams = makePtr<flann::SearchParams>();

     FileNode sp = fn["searchParams"];
     CV_Assert(sp.type() == FileNode::SEQ);

     for(int i = 0; i < (int)sp.size(); ++i)
     {
        CV_Assert(sp[i].type() == FileNode::MAP);
        String _name =  (String)sp[i]["name"];
        int type =  (int)sp[i]["type"];

        switch(type)
        {
        case CV_8U:
        case CV_8S:
        case CV_16U:
        case CV_16S:
        case CV_32S:
            searchParams->setInt(_name, (int) sp[i]["value"]);
            break;
        case CV_32F:
            searchParams->setFloat(_name, (float) ip[i]["value"]);
            break;
        case CV_64F:
            searchParams->setDouble(_name, (double) ip[i]["value"]);
            break;
        case CV_USRTYPE1:
            searchParams->setString(_name, (String) ip[i]["value"]);
            break;
        case CV_MAKETYPE(CV_USRTYPE1,2):
            searchParams->setBool(_name, (int) ip[i]["value"] != 0);
            break;
        case CV_MAKETYPE(CV_USRTYPE1,3):
            searchParams->setAlgorithm((int) ip[i]["value"]);
            break;
        };
     }

    flannIndex.release();
}

void FlannBasedMatcher::write( FileStorage& fs) const
{
     fs << "indexParams" << "[";

     if (indexParams)
     {
         std::vector<String> names;
         std::vector<int> types;
         std::vector<String> strValues;
         std::vector<double> numValues;

         indexParams->getAll(names, types, strValues, numValues);

         for(size_t i = 0; i < names.size(); ++i)
         {
             fs << "{" << "name" << names[i] << "type" << types[i] << "value";
             switch(types[i])
             {
             case CV_8U:
                 fs << (uchar)numValues[i];
                 break;
             case CV_8S:
                 fs << (char)numValues[i];
                 break;
             case CV_16U:
                 fs << (ushort)numValues[i];
                 break;
             case CV_16S:
                 fs << (short)numValues[i];
                 break;
             case CV_32S:
             case CV_MAKETYPE(CV_USRTYPE1,2):
             case CV_MAKETYPE(CV_USRTYPE1,3):
                 fs << (int)numValues[i];
                 break;
             case CV_32F:
                 fs << (float)numValues[i];
                 break;
             case CV_64F:
                 fs << (double)numValues[i];
                 break;
             case CV_USRTYPE1:
                 fs << strValues[i];
                 break;
             default:
                 fs << (double)numValues[i];
                 fs << "typename" << strValues[i];
                 break;
             }
             fs << "}";
         }
     }

     fs << "]" << "searchParams" << "[";

     if (searchParams)
     {
         std::vector<String> names;
         std::vector<int> types;
         std::vector<String> strValues;
         std::vector<double> numValues;

         searchParams->getAll(names, types, strValues, numValues);

         for(size_t i = 0; i < names.size(); ++i)
         {
             fs << "{" << "name" << names[i] << "type" << types[i] << "value";
             switch(types[i])
             {
             case CV_8U:
                 fs << (uchar)numValues[i];
                 break;
             case CV_8S:
                 fs << (char)numValues[i];
                 break;
             case CV_16U:
                 fs << (ushort)numValues[i];
                 break;
             case CV_16S:
                 fs << (short)numValues[i];
                 break;
             case CV_32S:
             case CV_MAKETYPE(CV_USRTYPE1,2):
             case CV_MAKETYPE(CV_USRTYPE1,3):
                 fs << (int)numValues[i];
                 break;
             case CV_32F:
                 fs << (float)numValues[i];
                 break;
             case CV_64F:
                 fs << (double)numValues[i];
                 break;
             case CV_USRTYPE1:
                 fs << strValues[i];
                 break;
             default:
                 fs << (double)numValues[i];
                 fs << "typename" << strValues[i];
                 break;
             }
             fs << "}";
         }
     }
     fs << "]";
}

bool FlannBasedMatcher::isMaskSupported() const
{
    return false;
}

Ptr<DescriptorMatcher> FlannBasedMatcher::clone( bool emptyTrainData ) const
{
    Ptr<FlannBasedMatcher> matcher = makePtr<FlannBasedMatcher>(indexParams, searchParams);
    if( !emptyTrainData )
    {
        CV_Error( Error::StsNotImplemented, "deep clone functionality is not implemented, because "
                  "Flann::Index has not copy constructor or clone method ");
        //matcher->flannIndex;
        matcher->addedDescCount = addedDescCount;
        matcher->mergedDescriptors = DescriptorCollection( mergedDescriptors );
        std::transform( trainDescCollection.begin(), trainDescCollection.end(),
                        matcher->trainDescCollection.begin(), clone_op );
    }
    return matcher;
}

void FlannBasedMatcher::convertToDMatches( const DescriptorCollection& collection, const Mat& indices, const Mat& dists,
                                           std::vector<std::vector<DMatch> >& matches )
{
    matches.resize( indices.rows );
    for( int i = 0; i < indices.rows; i++ )
    {
        for( int j = 0; j < indices.cols; j++ )
        {
            int idx = indices.at<int>(i, j);
            if( idx >= 0 )
            {
                int imgIdx, trainIdx;
                collection.getLocalIdx( idx, imgIdx, trainIdx );
                float dist = 0;
                if (dists.type() == CV_32S)
                    dist = static_cast<float>( dists.at<int>(i,j) );
                else
                    dist = std::sqrt(dists.at<float>(i,j));
                matches[i].push_back( DMatch( i, trainIdx, imgIdx, dist ) );
            }
        }
    }
}

void FlannBasedMatcher::knnMatchImpl( InputArray _queryDescriptors, std::vector<std::vector<DMatch> >& matches, int knn,
                                     InputArrayOfArrays /*masks*/, bool /*compactResult*/ )
{
    Mat queryDescriptors = _queryDescriptors.getMat();
    Mat indices( queryDescriptors.rows, knn, CV_32SC1 );
    Mat dists( queryDescriptors.rows, knn, CV_32FC1);
    flannIndex->knnSearch( queryDescriptors, indices, dists, knn, *searchParams );

    convertToDMatches( mergedDescriptors, indices, dists, matches );
}

void FlannBasedMatcher::radiusMatchImpl( InputArray _queryDescriptors, std::vector<std::vector<DMatch> >& matches, float maxDistance,
                                         InputArrayOfArrays /*masks*/, bool /*compactResult*/ )
{
    Mat queryDescriptors = _queryDescriptors.getMat();
    const int count = mergedDescriptors.size(); // TODO do count as param?
    Mat indices( queryDescriptors.rows, count, CV_32SC1, Scalar::all(-1) );
    Mat dists( queryDescriptors.rows, count, CV_32FC1, Scalar::all(-1) );
    for( int qIdx = 0; qIdx < queryDescriptors.rows; qIdx++ )
    {
        Mat queryDescriptorsRow = queryDescriptors.row(qIdx);
        Mat indicesRow = indices.row(qIdx);
        Mat distsRow = dists.row(qIdx);
        flannIndex->radiusSearch( queryDescriptorsRow, indicesRow, distsRow, maxDistance*maxDistance, count, *searchParams );
    }

    convertToDMatches( mergedDescriptors, indices, dists, matches );
}

}

redpajama_set_name: RedPajamaGithub


text:
Chelsea Clinton, Mindy Kaling, and more mourn the death of designer Kate Spade
Heartbreaking news from the fashion world today. Accessories designer Kate Spade was found dead in her New York apartment. Police are investigating it as an apparent suicide. She was 55 years old.
According to CNN, police responded to a call from Kate's housekeeper, who found her body in the apartment. NYPD chief of detectives Dermot Shea said that a suicide note was found, and other sources said that it was addressed to Kate's daughter, Frances Beatrix.
Associated Press also reported that Kate's husband, Andy, was in the apartment at the time. Their daughter was in school.
Kate Spade New York also confirmed the sad news with a statement on Twitter. "Although Kate has not been affiliated with the brand for more than a decade, she and her husband and creative partner, Andy, were the founders of our beloved brand. Kate will be dearly missed. Our thoughts are with Andy and the entire Spade family at this time."
pic.twitter.com/ylX5sA6MpQ
— kate spade new york (@katespadeny) June 5, 2018
As of now, there are no reports yet of what might've pushed Kate to take her own life. A source alleged that Kate and her husband Andy were having problems the past few months, but it's still not a clear indicator for what Kate might've gone through.
Kate is known for her namesake brand, which she started with Andy. The brand is well-loved for its colorful and versatile handbags.
Later on, Kate and Andy distanced themselves from the brand. In 1999, they sold 56 percent of Kate Spade New York's shares to Neiman Marcus for $33.6 million. And just last year, Coach announced that they're acquiring the brand for $2.4 billion. The couple also launched an accessories brand named Frances Valentine in 2016.
Still, the brand is a hit among young working women. Chelsea Clinton and other netizens shared stories of how they got their first Kate Spade bag. As CNN put it, "For many women, a Kate Spade handbag functioned as a symbol of professional achievement."
My grandmother gave me my first Kate Spade bag when I was in college. I still have it. Holding Kate's family, friends and loved ones in my heart.
— Chelsea Clinton (@ChelseaClinton) June 5, 2018
A year into being an attorney, my first splurge on myself was my (still) perfect #KateSpade black purse. Functional, crisp, professional, gorgeous. It takes a beautiful mind to design beautiful things. #RIP pic.twitter.com/NieF3sS7uI
— ℂ𝕙𝕒𝕪𝕒 (@ChayaBaliga) June 5, 2018
I was 22 when I moved to NYC and got my first real job and it even paid overtime. My first check that had OT hours in it, I set aside that money and bought myself a @katespadeny bag. It was 1998 and I felt so proud and successful. #RIPKateSpade ♥
— alyssa "please vote" mastromonaco (@AlyssaMastro44) June 5, 2018
I am heartbroken about the news of Kate Spade. I have worn her clothes many, many times. They were colorful, bold, cheerful, and encouraged women to find the twinkly person inside them. You couldn't walk into her boutiques and not smile. Rest In Peace, Kate.
— Mindy Kaling (@mindykaling) June 5, 2018
In a landscape where It Bags carry an "I'm-better-than-you" subtext, Kate Spade made adorable, accessible designs "where you have to have [it] because you like it, not because you're supposed to have it."
Thanks for spreading joy in a dreary world, Kate. You will be missed. 💔
— Ceej Tantengco (@ceejtheday) June 6, 2018
Kate brought joy to women who were looking for bags that were both functional and lasted a long time. However, what a person shows you isn't always reflective of what they're feeling.
To hear about Kate Spade is so devastating 😞 you never know the struggles people are facing so please remember to be kind to those you meet ❤ I know first hand how hard anxiety and depression are to deal with and we all need to be more mindful of our words.
— Manny MUA (@MannyMua733) June 5, 2018
We might not know what went on inside Kate's head and we want to extend our condolences to her family. For people who are going through something similar, please do not be afraid to seek professional help.
Photo courtesy of Getty Images via BBC News
Follow Preen on Facebook, Instagram, Twitter, YouTube, and Viber
Kate Spade to receive nothing from brand's recent sale
Kate Spade founders will launch new accessories line this February
Love dachshunds or French bulldogs? Show it with Chinese new year pieces
Cindy Crawford and Dita Von Teese mourn the death of Hervé Léger
Andy Spade
Kris Aquino has had enough of Mocha Uson
Miss America is removing the swimsuit competition. What will replace it?

redpajama_set_name: RedPajamaCommonCrawl


As host to nearly three-quarters of the undergraduate students on this campus, the College of Humanities, Arts and Social Sciences (CHASS) is the largest college within the University of California, Riverside, and host to some of the most prestigious programs and faculty in the world. As CHASS continues to grow and develop, its administrators, faculty, and staff want to ensure that freshman understand what it takes to succeed in this College. Interim Dean Joel Martin has offered some information and advice to the freshmen of the 2004-05 school year about what they need to do to thrive here as UCR students.
During an interview earlier this school year, Interim Dean Martin spoke of the expectations the college has of its freshman, advice on making the most of the college experience, and about opportunities for greater student involvement in the College. Martin wants to make sure that students take advantage of the extensive range of programs and experienced faculty provided by the College. The Dean also wants to stress the importance of incoming freshman learning from their peers, in order to make the most out of their university experience.
When asked what expectations the College has for its incoming freshman, Martin replied by offering the same advice that Richard Heckmann, keynote speaker, presented at this year's commencement ceremonies. Martin professed that students should "learn from mistakes, and behave ethically in all things." The Dean emphasized the need for students to take full advantage of all the opportunities given to them at the College, but also to continue to use their best judgment in their conduct and interpersonal relationships.
In speaking about the new and continuing programs that have been and will be in effect this school year, the Dean touched momentarily on the formation of the Dean's Advisory Board (of which students will be a part), and the proposed programs in Global Studies and Digital Arts that are currently being considered. Martin also encourages students to participate in the Associated Students of UCR (ASUCR) and to be informed on what happens on the campus as a whole so that they can be involved in the decision-making process. Martin listed several other new programs that will prove to be beneficial for students such as the Freshman Discovery Seminars, Academic Advising, the series of performances and lectures that the school has lined up, the Chancellor's new lecture series entitled "Imaging the Future," and finally the many other conferences, seminars, and colloquiums that will happen over the course of this exciting year.


text:
Facebook's Advice to Marketers: Post Stuff About Your Brand
By Todd Wasserman 2012-05-15 07:48:11 UTC
It's no secret that Facebook has decided the best way to spur more advertising on the platform is to encourage marketers to use their brand Pages more effectively.
With that goal in mind, Facebook looked at postings on 23 brand Pages over one month to see which posts did the best. The upshot: When you talk about things related to your brand, you'll get more engagement.
For example, a post by a cruise line marketer (Facebook did not disclose which brands exactly were involved in the study) stating "I decided to go on my first cruise because ____," performed better than one that said, "Hang in there everybody. Monday will be over before we know it."
"Topics related to brand or about the brand were significant predictors of increased engagement," says Sean Bruich, head of measurement at Facebook. "When pages post about topics related to brands, they increase engagement."
The advice may seem obvious, but Bruich points out that many brands try to stay relevant by "just publishing the latest meme."
Facebook's other advice to brands is to use photos, albums and videos to generate all three types of engagement and to post a clear call to action ("Like this if…") to increase likes. The company also confirmed the conventional wisdom that asking a question in a post will lead to more comments.
Though the study took place during the period in which brands switched over to Timeline, the research didn't delve into the topic. Despite that, some researchers, including Simply Measured, have seen a big difference in engagement with the new platform.
Facebook's focus on getting brands to use their Pages better coincided with the introduction of Timeline for users last fall. (Timeline for brands just became available in late February.) Facebook believes that more engaging brand Pages will become the main focus for advertisers on the platform and that amplifying status updates and other brand Page activity will be a viable alternative to traditional advertising.
With Facebook's IPO set to hit later this week, not everyone agrees that Facebook can herd big marketers over to the new platform. Nate Elliott, a Forrester Research analyst, called Facebook's latest ad strategy a "tiny evolution from its existing ad model" and noted that "companies in industries from consumer electronics to financial services tell us they're no longer sure Facebook is the best place to dedicate their social marketing budget – a shocking fact given the site's dominance among users."
Image courtesy of Flickr, GOIABA (Goiabarea)
Topics: Advertising, Business, Facebook, Marketing


whether your chauffeur driven car hire is business or personal, our priority is to provide not only what you want, but more than you expect. The luxury car hire service provided by Take Jag has been shaped to make your journey a pleasure from beginning to end.
Our priority is to remove all stress from travelling, bringing you to your destination safely, on time and feeling better than when you left!


Law Offices of Jeffrey R. Stoll, P.A.
The Law Offices of Jeffrey R. Stoll, P.A. provides legal services in real estate, estate planning, probate, and guardianship. The firm has built its solid reputation by handling diverse, complex legal challenges while providing personal attention and accessibility to our clients. We constantly strive to provide excellence in our representation by demonstrating knowledge and attention to detail, whether we are managing your real estate closing or planning your estate.
Located in Broward County, Florida, the firm treats small and large clients alike with respect and integrity. Whether your needs are long term or short term, one project or multiple projects, buying a house, administering a probate, or planning an estate, our team is dedicated to making your experience successful and rewarding.
Our extensive residential and commercial real estate practices provide a complete range of services – from contracts and closings to title insurance.
Proper estate planning not only puts you in charge of your finances, it can also spare your loved ones of the expense, delay and frustration.
Owning assets through a well drafted and properly funded living trust, it is key to have a no court-managed administration is necessary of your assets.
We can help you appoint as a guardian institutions such as a bank trust department, a nonprofit religious or charitable corporation, or a public guardian.
The Law Offices of Jeffrey R. Stoll, P.A. are here to help.
Copyright 2014 Law Offices of Jeffrey R. Stoll, P.A. - All Rights Reserved.


As part of our 1:1 iPad program, our Year 6 team are constantly reviewing the best practices for running our learning environments. Today I have come up with the term DAFA (Digital Anecdotal Formative Assessments). I got the idea from Andy Peartree (@anderspearz) who was using the app Explain Everything in his Maths group. I saw the students using the app to demonstrate their learning. They were engaged with the process and the Maths itself was not being compromised.
I decided to adopt the practice myself, but thought that I could formalise it to provide me with legitimate formative assessment. My maths class has just finished looking at converting fractions, to varying levels of success. I created a task on Edmodo asking my students to create an Explain Everything showing their understanding. I was able to quickly see who really understood the process without the need to troll through all their workbooks to establish their competence.
This is not a new process by any means, and I must stress the role my colleagues Andy and Jade in beginning this process. However, by formalising DAFA as a formal part of our teaching strategy, we have actively used technology to enhance our teaching.
Marking gives me the blues. It gets me down. Assigning a number to a student is not an instinctive action for me. I realise the need and all the buzzwords – monitoring, feedback, reporting, stakeholders, progress etc. It is something I find hard to do though. I see the bright kids cruise through and get a good mark. I see others struggle to even 'pass.' For me, its an unfortunate side of the teaching profession.
I need to make a disclaimer here. My current school has a great attitude towards assessment. It's all about the process as well as the product. Assessment needs to inform our teaching as well as provide feedback to students and parents. I've previously needed to give exams to Year 5's so all is well on the attitude to assessment front, but it remains something that in a perfect world I would avoid.
This ranting is not for naught – my point here is that when it comes to assessment design, it is important to ensure there is a fair balance between formal curriculum outcomes that you need to report on as well as the more specific objectives that frame a task and give it context. For example, we have recently conducted an investigation into measurement, using the iconic Vitruvian Man illustration as a model. Being an IB school, we have defined rubrics that apply to all assessments. These relate to skills, processes as well as knowledge and reflection: What are the fractions? How can you convert these to ratios? What is the relationship between body parts? Do your answers make sense in the context of the problem? and so on.
On top of these, we apply ACARA outcomes. After all these formal requirements, its hard to fit in things like curiosity, attitude, perseverance, commitment etc into an already packed assessment. It is these things that I value in my students, but I find it difficult at times to measure their success in these terms when there is such a focus on the formal outcomes.
This is where anecdotal records come in. Constant observations, feedback and adjustments are all part of the regular teaching cycle. I'm certainly not on a soapbox here – formal assessment is necessary, but I find it important to keep sight of personal development over the formal meeting of prescribed benchmarks.
I have been using Google for a long time. What has impressed me about the company is its ability to provide a 'one stop shop' for many Internet services, beyond a search engine. The tool that I have explored using the most recently is Google Docs / Google Drive. I have employed other cloud storage tools (and still do to different extents) but Google Drive has emerged for me as the easiest to use. I will discuss here two ways that I have successfully integrated the use of Google Docs in my classroom.
1. By students as part of their learning.
A couple of weeks ago I wrote about using Google Docs with students as part of their planning process. In short, this was a resounding success. Please read this post first to give context to what I'm talking about. The students surprised me in two ways as they used the doc; They didn't get caught up in the novelty factor and they actively utilised the added features of the process to improve their work.
I'll admit that a couple of kids jumped at the opportunity to record words that weren't strictly related to the task, but generally the maturity was sound. It was wonderful to see the students not only filling out the table as they would previously have in their workbooks, but also that they built on each other's ideas. This proved to me that the use of the tech was worthwhile – it led to an enhanced resource for the students to use as part of their learning process.
2. By me as part of communicating with parents.
I have so far uploaded photos of the students working, video of them presenting to the class and the Essay documents I mentioned above. My intention is that these shared folders become part digital portfolio, part window into the classroom and part opportunity to share learning beyond the local classroom environment – parents working overseas and extended family for example.
So far so good, then. I am always looking for interesting ways to meaningfully integrate technology into my classroom, so please feel free to share ways that you have used Google Drive or any other technologies!


text:
Paddy's Pointers: Five observations from the Canaries' 2-1 win at Brentford
Teemu Pukki slots a match winning penalty in Norwich City's 2-1 Premier League victory at Brentford - Credit: Paul Chesterton/Focus Images Ltd
Paddy Davitt delivers his Brentford verdict after Norwich City's 2-1 Premier League victory.
1. Delicious Norwich Away win
Okay, it does not quite work and you would not package this backs-to-the-wall win at Brentford as peak DNA football under Daniel Farke at Norwich City. But feel the precious result and worry about the quality another day.
Norwich were clinical in the first half, with Mathias Normann at the hub of their two goals. After the interval, they dug perhaps deeper than many thought they were capable of after a wretched opening 10 Premier League games.
That second period was heart and soul, character and commitment. There was little sparkling football from the visitors, although Teemu Pukki spurned a chance to double his tally and make it 3-0 before Brentford roared back. But this is Norwich. When do they ever do it the easy way?
The reaction at the final whistle spoke volumes. Normann dropped to his feet in a mixture of exhaustion and elation. Tim Krul hugged Andrew Omobamidele, backroom staff high fived each other and those long suffering away fans bellowed 'Yellows' before a spontaneous rendition of 'We are staying up'.
It was respite in a journey thus far spent navel gazing. Apologising for City's presence among the elite. It was Norwich sticking out their chests and saying maybe, just maybe, they can compete and they can pick up points at the top table.
5 PRESSER: Watford v City - Tim Krul ruled out
9 Klose regret over City exit
10 Paddy's Pointers: Watford 0-3 City
This has to be a line in the sand. Not a last hurrah.
2. The general
It was not simply the quality of Normann's opening strike, or the majestic threaded ball for Pukki to run onto before he was felled in the lead up to City's penalty.
It was the discipline and the defensive nous the Norwegian international displayed in a holding midfield role in front of the Canaries' backline.
Normann put out fires and sensed the danger in a manner Olly Skipp would have been proud of. He might not be a clone of the Tottenham midfielder, who excelled in last season's Championship triumph, but this was a more than passable impression in an area City desperately need to find an answer.
Normann is also a leader of men. At a critical stage in the second half, in a brief pause in the action, the platinum blond was going around his team mates with fists clenched and a determined look on his face.
In word and deed he was immense. He looked genuinely emotional as he dropped to his knees on the final whistle. A season long loan deal it may be, but Normann is already fully invested in this adventure.
3. Check his birth certificate
How can Omobamidele be in his teens? The maturity alongside the calming influence of Ben Gibson was something to behold. Particularly when the Bees raided at will in a second half when the 19-year-old will have learnt more than a season at development football.
There was perhaps one blip, when the central defensive duo both attacked the same ball which ended with Bryan Mbeumo slotting, before the Video Assistant Referee correctly intervened. But there was no quarter asked or given from the Irishman up against the fearsome Ivan Toney.
For Farke to trust him the previous weekend, ahead of both Brandon Williams or Dimitris Giannoulis at left back, up against Leeds' dangerman Raphinha said it all.
The Republic of Ireland international is now a serious player in the pack. But restored to his more favoured position, Omobamidele did not look out of place in Premier League company.
Rest assured, Farke will seek to puncture some of the hype and rising expectation, but he has a serious talent on his hands.
4. Krul to the rescue
City's number one took full responsibility for the manner of Leeds match winner at Carrow Road. That is a measure of the man. Farke himself said Krul was the most disappointed member of his squad in the immediate aftermath.
He had to stomach more frustration perhaps with his omission from the Dutch squad on Friday for upcoming World Cup qualifiers. Krul has spoken liberally in the past how much getting back in the fold for his country meant to him.
But when you had nearly two years out of the game with a career threatening knee injury, that effectively called timed on love affair with first club Newcastle, you have the mettle to respond to adversity.
No one should have doubted the experienced keeper would stand up and be counted.
Twice he foiled Christian Norgaard with wonderful point blank stops that highlighted his agility and his reflexes. There have been a few dissenting voices questioning whether Krul is perhaps not the force of nature he has been over the duration of his time at Carrow Road.
That looks premature now. If not foolish.
5. Baseline Brandon
The Manchester United loanee is fast turning into an enigma. Superb at Arsenal and here against the Bees. But in other games this season, much like Norwich, he has looked off the pace.
Williams is a young man with a profile inflated from emerging at one of the biggest clubs in the world.
He was sent to Norfolk because he needs to reach that level of consistency regularly to force his way into the starting line up at Old Trafford. But the same challenge applies equally for the Canaries.
Perform at this level; aggressive and combative in the challenge, vibrant in his counter-attacking urges, and the debate who occupies the left side of the City backline becomes largely redundant.
Even if that desire to chop back onto his favoured right foot does nothing to give Norwich the more natural balance which Giannoulis brings.
Nevertheless, perform to this standard and he looks the overall package. But it cannot be highs and lows. Peaks and troughs. This has to be the standard.
Brentford vs Norwich City
City striker pens new contract


Voters lined as much as vote at a polling place in Doylestown, Pa., at present, Nov. 6, 2018.
It's Election Day in America, and voters will ship their first verdict of President Donald Trump's tumultuous tenure in a midterm that's anticipated to attract historic numbers to the polls.
Immigration, the financial system, ladies's points, partisanship — all weighed closely on voters' minds as they forged ballots to determine management of Congress and put Trumpism to the check. Though not on the poll, the president looms giant over determination day, amongst each supporters and detractors. Across the nation, individuals are speaking about this election as some of the momentous of their lifetimes — a struggle for the very soul of America.
Here's what a few of them needed to say.
Richard and Aleshia Murphy took their 7-month-old daughter once they voted early in suburban Los Angeles. The couple, who moved seven months in the past from Reno, Nevada, to Lakewood, California, stated the financial system was foremost on their minds. "I want to keep things going," stated Richard, a Republican practice operations supervisor. "My work feels the booming economy. We're hiring more people, all positions, from the bottom to the top." Both Murphy and his spouse, an unbiased, voted for Trump in 2016 and like the place the nation's headed. "I'd rather have somebody who's going to come off as a complete jerk — but you know exactly what they're thinking because they have no filter — than a slick-haired politician that literally tells you anything you want to hear just so that you support them," Aleshia Murphy stated.
In Juneau, Alaska, 34-year-old Will Muldoon considers himself nonpartisan. Health care is a matter he'd wish to see Congress take up, "but that's scary. It's almost, I don't know that they could come up with better than what we have right now, type of thing. My confidence in them having the competency to do OK on that's not too high," stated Muldoon, a mainframe technician.
Rachel Geiger's purple hair matched her black and purple gown and helped her stand out amongst a whole lot of individuals ready to get into an area in Orlando, Florida, the place U.S. Sen. Bernie Sanders spoke forward of the election on behalf of Florida's Democratic gubernatorial nominee. Geiger, 33, a blogger from Ocala, Florida, stated "Trump and immigration" have been the 2 motivating points for her when she early-voted. "It's completely inhumane what he's doing," she stated, referring to insurance policies which have included sending troops to the border, separating immigrant youngsters from their mother and father and efforts to construct a wall. She voted a straight Democratic ticket.
In Phoenix, substitute instructor and lifelong Republican Kay Matthews stated that whereas the financial system is necessary to her, immigration is simply as essential. She's troubled by any inflow of immigrants getting into the nation illegally. "I've been taught as a young child that you respect the law. You don't have to always agree with it, but you do respect it," the 72-year-old stated. Matthews doesn't need Democrats taking management of both chamber of Congress, as a result of she fears they might attempt to impeach Trump.
Virginia Gollin, 75, describes herself as a average Republican however says she modified events to develop into a Democrat as a result of moderates are "like a dinosaur." "I'm not by nature a progressive. But we're at some extent in our nation the place all the issues I feel we should always have are being fiercely attacked," stated Gollin, a retired airline employee in Hopatcong, New Jersey. She cited for instance the Affordable Care Act, which she doesn't need to see gutted.


Students who claimed that they belong to the #Feesmustfall structures also told AfriForum Youth that they could not speak at the event.
"I walked up to the podium for my allotted turn to speak, and then these students approached me and said that I was not allowed to speak because I am white," said Jaco Grobbelaar, AfriForum Youth's coordinator for Tuks.
"They also shouted the slogan 'one settler, one bullet' in our faces and sang the 'kill the Boer' song. A huge fight broke out – people threw chairs at one another and members of AfriForum Youth were assaulted by Maasdorp," said Renier Goosen, chairperson of the Tuks branch.
"We feared for our lives, and this shows that they have no regard for our contributions and that they are racist towards white people. We hope that the police will pursue the case," Grobbelaar concluded.


Born London, arrived Australia 1950. Living Coast, Queensland.
Family and holiday photography have always been of interest, but since retirement have taken an interest in flower photography.
Would now like to extend my (at the moment, limited) abilities.


Teen Mom 2 star Kailyn Lowry is opening up about her current relationship status, and what is going on in her love life. As many fans already know, Kail has been busy raising her three sons, Isaac Rivera, Lincoln Marroquin, and Lux Lowry. However, her dating life always seems to be in the headlines.
According to a Jan. 12 report by In Touch Weekly, the Teen Mom 2 star is revealing that she is single. Kailyn Lowry says that after a very dramatic and tough year in 2017, which she claims "broke" her, the MTV personality is ready to start a brand new chapter in her life. Last year, Kail had a ton of relationship drama with her third baby daddy, Chris Lopez, as well as conflict with her ex-husband, Javi Marroquin, whom she shares son Lincoln with. Now it seems she's trying to move past it all.
Kailyn Lowry claims that she is content being single at the moment and that after the "mess" she's created in her life around her and her children she is ready to spend all of her energy on her kids and her career. The Teen Mom 2 star says that she's so busy taking care of herself so that she can successfully take care of her three boys, that she has no room to add a fourth person to the mix.
Lowry reveals that being single is "working" for her at the moment and that there is a definite plus side to not being in a relationship. Kailyn says that she is happy to have the whole bed to herself and that she has more time to focus on herself and her children instead of making sure her significant other is happy. Meanwhile, the Teen Mom 2 star has revealed a couple of her goals, and they are pretty big ones.
Kailyn Lowry revealed that in addition to being a good mom, which is always her first priority, she wants to make a million dollars before she turns 30-years-old. The Teen Mom also claims that she wants to write more books and produce a television show.
Kailyn Lowry fans can see more of her journey when a new season of Teen Mom 2 airs on MTV later this year.


text:
Kim Arndt
Community > People > Kim Arndt
Kim Arndt (also know as Sinyx) is a professional animator, cartoonist, and a former Yerf artist. Born in Queens, NY, USA. It was there that she would first encounter furry fandom, even joining FurryMUCK under her Sinyx alias, and having a shapeshifter fox as her fursona. She gained a BFA in animation from the New York's School of Visual Arts.
While being a Yerf artist, Kim Arndt worked on anthro art commissions, submitted to such publications as Anthrolations, and helped doing character designs [1] for such projects as The Adventures of Simion Lonewolf!.
As a professional artist, she has worked in such diverse companies as BlueSky Studios, Cartoon Network, Curious Pictures, DC Comics, Wizards of the Coast, Jumbo Pictures, Inc., MTV Animation, Nickelodeon, Nick Digital, and TNN, among others, working various illustration, animation, and comic projects.
Her present standing in relation with furry fandom is unknown.
1 Moondog
Moondog[edit]
She is the creator of the funny animal webcomic, MoonDog, listed at #14 on Buzzcomic's "Top 100 Top Anthropomorthic Comics."
MTV Animation
1997 - Daria
1998 - PB&J Otter
1998 - Celebrity Deathmatch
1999 - Downtown
2002 - Codename: Kids Next Door (storyboard operative)
↑ http://www.furryfiction.com/art/ Kim's designs for "The Adventures of Simion Lonewolf!".
Kim Arndt on the IMDb
Kim Arndt's gallery on deviantART
Tripshotpress.com, Kim Arndt's online portfolio
"Sometimes the appropriate response to reality is to go insane" Kim Arndt's LiveJournal
Retrieved from "https://en.wikifur.com/w/index.php?title=Kim_Arndt&oldid=448131"
Fox characters
Shapeshifting characters
Last modified 03:28, 20 April 2015


text:
— манга японского автора , посвященная альпинизму. С 2003 года по главам публикуется в журнале Big Comic Original издательства Shogakukan, на данный момент манга составляет 12 томов. В ней описываются приключения добровольного члена поисково-спасательной команды альпинистов в Японских Альпах. Gaku была награждена премиями Manga Taisho в 2008 году и премией Shogakukan в 2009.

Манга лицензирована на Тайване компанией Sharp Point Press.

Список томов

Примечания

Ссылки
 Официальный сайт

redpajama_set_name: RedPajamaWikipedia


On Monday May 9, the state Senate approved a bill that would threaten the autonomy of local school districts by eliminating the ability of a local board of education to choose when it wishes to hold its annual school election. It had been approved by the Senate State Government committee on May 5.
As written, S-2099 would remove the ability of local boards of education to move the annual election from November back to April. NJSBA supported the original 2011 legislation, because it permitted local boards of education to move the annual school election from April to November if they chose to do so. That law also permits the annual school election to be moved back to April after four years upon the action of the local board of education.
Under the 2012 law, school boards or municipalities, by resolution, or voters, by referendum, may change the date of the district's annual school election to November or back to April.
Currently, 97 percent of the elected local boards of education in New Jersey hold their elections in November. Three percent have chosen to remain in April. Current law preserves the choice of the local community to determine when it wants to hold its annual school election. S-2099 removes local control of the annual school election date from boards of education and the taxpayers that they serve.
The bill was approved by the Senate on May 9 on a vote of 33-1. Currently, there is no Assembly version of the bill.
NJSBA has begun a campaign in opposition to this bill. NJSBA urges school board members to contact their local legislators to express opposition to the bill that would take away a local board's ability to move its election back to April, if it so chooses.


text:
Iran part 2, west
Iran part 1, North-West
Latest pictures:
Pictures Iran, part 2, West
Pictures Food Iran
All our sleeping spots (Polarsteps)
News in short form:
Beginning of January 2023
We spent 6 weeks in Switzerland until we flew back to Armenia on November 6th. First task was the workshop in Yerevan to install a new clutch. Unfortunately, this didn't change anything! With a half-broken Iveco, we visited a few sights in Armenia before we entered Iran on November 19th. Our Iveco got worse and worse. In addition to the bangs when driving down (only with a gear engaged), there was suddenly a bad bang when reversing, a scratching in the transmission when there was no power from the engine (sometimes had to accelerate and brake at the same time), and at the very end the reverse gear didn't work anymore! Just barely we made it to Tabriz, the first big city. Our rescuer in need Yusef, takes the transfer case apart several times until all damage is temporarily repaired (no spare parts available due to sanctions). Chain shortened with hammer and shift fork, welded on and reworked.
We were traveling in Iran for 6 weeks. A wonderful, fascinating, exciting trip. Breathtaking landscapes and sights enchant us just as much as the intense scents of the spice sellers in the historical bazaars. The hospitality and helpfulness of the Iranians is indescribable, and so we ended up with the lovely people at home several times.
Every day you are addressed in a friendly manner and you feel very comfortable everywhere. But Iran can also be oppressive. You often get the hear down side. Many, especially young people, share their fate with us. They are partly without any hope that anything will change. Individuals have no prospects for the future. An economy that is at the bottom. Freedom that is enormously restricted! No money to afford anything. Up to the statement "I don't want to bring any children into this world as long as I have to live in Iran and nothing changes here". Such moments also show the reality and thus Iran is also a difficult country to travel to. In short, a country where not a day goes by without being tired in the evening from all the impressions, no matter what kind. But certainly, the most fascinating and impressive country on our trip so far.
On New Year's Day, the journey took us via the city of Basra, Iraq, directly to Kuwait. Here we now want to have the transfer case repaired with new spare parts and travel on to Saudi Arabia in a few weeks.
Previous news..
Mid-October
At the beginning of August, we received a visit from Switzerland from our good friends, Evelyn and Khoa, and we spent a wonderful few days in the north of Armenia.
We then stayed for almost three weeks in the north of Armenia before we returned to Georgia. During these three weeks in Armenia we marveled at the large Lake Sevan at 6230 feet (1900m) and climbed the highest mountain in Armenia, the 13'420 feet (4090m) high Aragats.
Then back to Georgia for two weeks. The reason for the return was the beautiful Vashlowani National Park where we mastered about 210 miles (350km) off-road track in 10 days!
At the beginning of September, we crossed the border to Armenia again. In the following 3 weeks, we admired not only the capital Yerevan but also countless monasteries surrounded by phenomenal landscapes and once again met the warm-hearted people of this beautiful and pleasant country.
Iran, our next destination, was getting closer, but then everything turned out differently. First, a military border conflict with Azerbaijan broke out near us, then the Iveco gave us problems with its defective clutch, and then my (Stefan) father's health condition deteriorated drastically. Iran and the onward journey were postponed, we parked the Iveco at a safe campsite and traveled back to Switzerland for several weeks at the end of September.
However, the plan is still to go to Israel via Iran and the Arabian Peninsula in order to return home by ship from there.
End of July:
We spent exactly two months in Georgia. A country with mountains over 17'000 feet (5000m) high in the Greater Caucasus, holiday resorts on the Black Sea, lots of forest and countless churches and monasteries.
The 3.7 million inhabitants are spread over an area that is about one and a half times the size of Switzerland. A country in which we felt very comfortable and welcome, did some hikes, enjoyed good food and looked into extremely remote areas.
However, Georgia is also a country with very bad mountain roads and our Iveco has had a tough time! The weather was not always on its best side and June was regularly a bit wet.
Historically and politically it was and is turbulent in Georgia. A country similar to the Ukraine, which is westernized but has Russia in the neck. Here, too, the mood towards Russia is bad! Firstly, because Russia appropriated 20% of Georgia in the 2008 war with Abkhazia and South Ossetia, and secondly because of the current Ukraine war.
A few days ago, we arrived in Armenia and are looking forward to another part of our journey :-).
End of May:
On May 14th, we celebrated our one-year travel anniversary. This is how we summarize the first year of travel: Leisurely - Nature - Carpathians - Hiking - House-sitting - Istanbul - Pamukkale - Ancient Sites - Turquoise Coast - Cappadocia - Visiting Parents - Beautiful Northeast. These are a few keywords that spontaneously come to mind. We only covered 9'300 miles (15'000km) in one year and were able to really enjoy cities, beaches or other beautiful places very often. Driven route: Switzerland-Austria-Slovakia-Ukraine-Romania-Bulgaria-Turkey.
After 170 days in Turkey, we entered Georgia at the end of May. Almost half a year in Turkey was great. Very friendly people, beautiful nature, good food and lovely, great hospitality. The weather was a little bad for us from time to time. Turkey had the hardest winter in 30 years, so our heating was on relatively often and breakfast or dinner outside was only occasionally possible in the almost 6 months! What is also a pity in Turkey are the language skills. Hardly anyone speaks English, so it is difficult to communicate with the extremely lovable Turks and to find out more about the country you are visiting.
We continue with Georgia, then Armenia and when the borders to Azerbaijan finally open (still closed due to Corona), also to Azerbaijan.
We are already looking forward to summer :-).
Beginning of April:
We are still very motivated to be on the road! However, we suffered a setback in the war against Ukraine. In our 4 weeks in the Ukraine last summer we got to know a lot of nice people and still don't understand what this terrible war is about.
Back to our trip. In the last few weeks it has mostly taken us along the beautiful turquoise coast of southern Turkey.
A sea in all shades of blue, a breathtaking coastal landscape and wonderful places to sleep. On this coast is also the famous 316 miles (509km) long Lycian hiking trail. One of the top 10 long-distance hiking trails in the world. We also took individual pieces of it under our feet on different days and it was simply fantastic.
On the less frequented streets we often met very lovable local people, from shepherds to fishermen to honey sellers.
You can tell that the tourist season is slowly starting. The sometimes huge hotel complexes open their gates and mobile homes accumulate at certain sites. The weather has remained cold for the last few weeks and our heating has been in use almost every day. Now it's finally getting warmer and we're looking forward to driving inland to Cappadocia, where we'll have parents visiting us from Switzerland in just under a week.
Mid-February:
And we got them, our Turkish identity cards. Now we don't have any stress and are allowed to stay in the country until the beginning of July.
In the last four weeks, we visited some archeological sites, and recovered from sightseeing at lonely sleeping places. They were fantastic, the more than 2000-year-old Greek-Roman sites like Ephesus or Hierapolis with their temples and Amphitheaters.
We made a worthwhile detour via the natural spectacle Pamukkale (Calcite travertines), and suddenly we were surrounded by snow at an altitude of over 3300 feet (1000m). We continued to the beautiful Datça peninsula where we stayed four nights and enjoyed the rocky coastal landscape.
We like Turkey and the people very much. A pleasant and exciting journey.
Slowly but surely the weather is kind to us and the rising temperatures invite more and more to be outside.
At the moment, we are enjoying a little break and looking after a house with cats and dogs for 8 days.
We continue towards Antalya and then heading east.
Mid-January:
Now it's already over a month later; how fast time can go by. In incredible Istanbul, we stayed much longer than planned.
Not a week, but a whole 20 days. Until shortly before New Year's Eve we lived in Istanbul! Not least because we sat isolated in the camper for several days because of Corona. But otherwise Istanbul was fantastic and a week just wasn't enough time! Find out more in our detailed report. Although we enjoyed city life with its advantages (e.g. food :-)), we longed for more peace and seclusion. The last 3 weeks we were mostly in lonely sleeping places with a view of the sea.
However, it hardly gets boring. We spent our free time walking on the beach, cooking delicious meals, learning to juggle, writing internet reports or just reading something in peace.
Along the Aegean Sea, along the west coast of Turkey, we also enjoyed the currently (off-season) peaceful and former Greek beach towns like Ayvalik, Foça or Çesme.
Since the usual 3 months residence permit in Turkey is not enough for us, we have decided to apply for an extension and will hopefully be able to pick up our new identity cards in Izmir in the next few days / weeks.
We plan to stay in Turkey for the next 4 months to explore and experience some of the countless fantastic places in this huge country. Then exciting Georgia awaits us.
Middle of December
In the meantime, we spent 6 weeks in Bulgaria and enjoyed the possibility to take a break from travelling. Just calming down instead constantly going on… :-).
We did house and (three) dog sitting in the centre of Bulgaria. The daily long walks in fall time in the middle of nature were definitely good for our soul and we had time to reflect and process the trip so far.
The Iveco started rolling again on the 1st of December with new motivation in our mind and a week later it said "Türkiye'ye hoşgeldiniz"; Welcome to Turkey :-). After a break at the Marmara-Sea, we continued to the 15 million mega-city of Istanbul.
We so far have a very good feeling about Turkey, friendly people and the best food so far on our trip! Istanbul is definitely different then the rest of Eastern Europe. More Asian, more Oriental, more chaotic but mainly more thrilling and lively.
Soon we continue to the South of Turkey where it hopefully is a bit warmer :-).
The first chapter of our travels came to an end!
The mountain range of the Carpathians that extend from Slovakia, over the Ukraine to Romania. In a good three months in the Carpathians we covered over 65'000 feet (20'000m) in altitude in over 200 hours hiking. Wonderful landscapes, fantastic mountain lakes, wild untouched nature and very pleasant meets with the locals. The only thing a bit disappointing was the animal watching. But anyways, among others we have seen chamois, deer, foxes and even a bear.
Until now we were on our trip at the right time at the right place. In the preseason we really could enjoy Slovakia before the masses of tourists were coming. The peak season we were in the not touristy Ukraine, so we also had our peaceful time there. And when the summer holidays came closer to end, we entered the touristy Romania.
The Vanlife in general, we still like very much. But we imagined and also planned to have a lot of time for ourselves. More time to cook, to read, to learn to play guitar, to learn languages etc. Unbelievably came this "time for us" a bit too short. We almost only had good weather, so we went hiking all the time. Besides the hiking we also visited many cities in the beautiful eastern Europe. Then writing precisely those reports and manage photos took actually quite some time. Not to underestimate is also the planning of the journey. Reading guide books, study maps etc. Often, we were moving from place to place, but rather short distances. The 4'600 miles (7'500km) that we drove so far are extrapolated to a year only 11'000 miles (18'000km).
Soon we will be sedentary for 5 weeks in Bulgaria since we will be house and pet sitting. We really look forward to this time since it really is time for a time-out of travelling.
Our 6 weeks in Slovakia were wonderful. The nice weather in connection with the countless hikes will stay in our memories as much as the gorgeous cities and towns with their fantastic churches and buildings! We continued excited towards east into the Ukraine. A country where we didn't know what to expect. How are the people? How are the roads? Is hiking possible without any problems? Is it safe? Etc etc etc… But exactly this is what it makes exciting!
Our Ukraine Route:
Now, after 4 weeks in Ukraine, we can only say good things about that place! The historic cities Lviv and Kiev were showing us how a country like the Ukraine can change over time by history, politics and demonstrations. Besides the unique and wonderful big cities has the Ukraine also countless hiking possibilities in the Carpathian Mountains, in the west of the country, to offer. The nature here has a diversity and is very wild as we've almost never seen before. Untouched ancient forests and lush grasslands full of flowers, butterflies and other insects.
Also the hospitality and the countless lovely and helpful people have made our visit to a memorable, beautiful experience.
In the next days, we will continue our trip into Romania, where the next part of the Carpathian mountains are waiting for us.
We are excited :-)!
We are already for more than 5 weeks in Slovakia. Very often hiking and just enjoying nature. Thanks to off-season and Covid we could enjoy the places without many other people.
After the High Tatras we went tot he Low Tatras and hiked up the mountains Dumbier and Kralova Hova (view map). The Low Tatras look, as the name reveals, not anymore as high mountainous as the High Tatras, but still great for hiking. After castles and marvellous towns, we stranded now in the second largest and apparently most beautiful city in Slovakia, in Košice.
Unfortunately, we slightly crashed into another car because the steps on the side of the camper were still out. Now we have to remain in Slovakia a bit longer before we can enter and discover the Ukraine.
We are excited and a bit nervous for the continuing into Ukraine. We are diligently exercising the Cyrillic alphabet and some words in Russian :-).
Since one week (not as planned 5 days) we are now in the High Tatras, and we stay two more days. The endless beautiful hiking possibilities made it impossible for us to leave :-). Hiking on top of a peak, to lake hikings and finally forest hikes, everything is here.
We decided to do the High Tatras first, then go to the Little Tatras, since the High Tatras will be overloaded with tourists; Can't blame them as we figured out :-).
Otherwise we are just enjoying our freedom and the easy life…
The little Fatra was wonderful for hiking. Although the region is not nearly as high altitude as Switzerland, we still reached in total 1 mile (1600m) in altitude difference in one day hiking. The weather was good for hiking, even when it was partially grey, but luckily it never rained!
The next five days we will spend in the high Tatras, where the mountains reach up to 8860 feet (2700m) and are the highest in Slovakia.
The weather forecast is sunny, the campground is quiet and has a great view, and the Iveco seems to work fine :-).
Finally we managed to leave the city life behind us. The past few days we stayed in the "small Karpate mountains", but we returned today, Monday back to the capital Bratislava, to get the late delivered new starter installed in the Iveco. A few hundred Euros later we continued towards north, in direction small Fatra, which is another small mountain in the North East of Slovakia. On the way there we currently stopped in the very famous health Spa town. Here we will go to the famous Spa and we are sure that we will feel years younger afterwards ;-)
Hey, and we already speak 30 words in Slovakian :-).
May 23rd 2021:
After crossing through rainy Austria, we have arrived in Vienna. We are doing just fine and the car is running, although we need very soon a new starter..


text:
Home In the News 🔊 In The News | 11th January 2023 | Latest Rail News
In the News 🔊
In The News | 11th January 2023 | Latest Rail News
Click here to listen to the latest rail news on Wednesday, 11th January 2023
InTheNews: The latest rail news on Wednesday, 11th January 2023
Business Secretary Grant Shapps has set out plans to enforce minimum service levels during strike action, including for ambulance staff, firefighters and railway workers.
The article on the BBC website says that under the bill, some employees would be required to work during a strike and could be sacked if they refuse.
Mr Shapps said the aim was to protect lives and livelihoods.
But unions said the proposed bill was "undemocratic, unworkable, and almost certainly illegal".
A pay offer of 10 per cent could be tabled by ministers in a bid to reach a breakthrough with the RMT rail union, it has emerged, according to an article on the Mail Online.
Sources said Whitehall officials were looking into whether the existing 8 per cent offer over two years to workers for 14 train companies could be improved.
Rail minister Huw Merriman is understood to have left open the possibility of an extra 2 per cent being found during a meeting with RMT boss Mick Lynch earlier this week.
East Midlands Railway (EMR) is working with engineers from the University of Sheffield Advanced Manufacturing Research Centre (AMRC) to create a simulation tool that will help improve the efficiency and effectiveness of its depots.
The project, made possible by the Network Rail Performance Improvement Fund, has seen AMRC engineers work closely with EMR operations staff to record the rules, processes and timings of train movements to develop a representative model of its Nottingham Eastcroft depot.
Happy birthday to the Tube, the world's first and most famous underground railway.
Yesterday marked 160 years since the first Tube journey took place between Paddington and Farringdon stations, on what was then the Metropolitan Railway.
Transport for London says a series of activities will be held throughout 2023 to mark the anniversary.
Photo credit: Transport for London
Previous articleSWiFT invites members for an evening with HS2 CCO
Next articleHS2 opening up construction sites as part of Build UK initiative
Click here to listen to the latest rail news on Friday, 27th January 2023 InTheNews: The latest rail news on Friday, 27th January 2023 The government...
Click here to listen to the latest rail news on Thursday, 26th January 2023 InTheNews: The latest rail news on Thursday, 26th January 2023 Network Rail...
Click here to listen to the latest rail news on Wednesday, 25th January 2023 InTheNews: The latest rail news on Wednesday, 25th January 2023 Network Rail...