text:
module.exports = AgentWorker;
var $ = require('stringformat');
var async = require('async');
var shortid = require('shortid');
var fileSize = require('filesize');
var multiGlob = require('multi-glob');

var ioc = require('socket.io/node_modules/socket.io-client');
var fs = require('fs.extra');
var path = require('path');
var exec = require('child_process').exec;
var mkdirp = require('mkdirp');

var Build = require('../common/Build.js');
var Msg = require('../common/Msg.js');
var splice = Array.prototype.splice;
var serverUtils = require('../common/serverUtils');
var maxBuffer = 524288;
var tee = path.resolve(__dirname, '../bin/tee.exe');
var egrep = path.resolve(__dirname, '../bin/egrep.exe');

var zipArchiver;
function AgentWorker(conf, options) {
    this.id = shortid.generate();
    this.conf = conf || {};
    this.sevenZipPath = conf["7zpath"] || "7z";
    this.url = '{0}{1}{2}/{3}'.format(conf.protocol || 'http://', conf.server, conf.port == 80 ? '' : ':' + conf.port, 'agent');
    this.workFolder = conf.agentwork || 'work';

    process.on('exit', function () {
        this.socket.socket.connected && this.socket.disconnect();
        this.socket.socket.connected = false;
    }.bind(this));

}
AgentWorker.define({
    connect: function () {
        var conf = this.conf;
        if (!this.socket) {
            console.log('Connecting agent supporting', conf.agent, 'to:', this.url);
            this.socket = ioc.connect(this.url, {
                'max reconnection attempts': Infinity,
                'force new connection': true, // <-- Add this!
                'reconnect': true,
                'reconnection limit': Infinity,
                'sync disconnect on unload': true,
            }).on({
                'connect': this.onConnect,
                'disconnect': this.onDisconnect,
                'error': this.onError,
                'build': this.onBuild,
                'cancel': this.onCancelBuild,
                'log': function (msg) {
                    var message = new Msg(msg);
                    console.log(message.toString());
                },
            }, this);
            this.ensureWorkFolder();
            this.detectZipArchiver();
        }
        else {
            this.socket.reconnect();
        }
    },
    'onConnect': function () {
        console.log('AGENT WORKER CONNECTED supporting platforms:', this.conf.agent);
        this.emit('register', {
            id: this.id,
            name: this.conf.agentname,
            platforms: this.conf.agent || ['android', 'wp8'],
        });
    },
    'onDisconnect': function () {
        console.log('AGENT WORKER DISCONNECTED with platforms:', this.conf.agent);
    },
    'onError': function (err) {
        //if (err && (err.code == 'ETIMEDOUT'err.code == 'ECONNREFUSED' || err.indexOf && err.indexOf('ECONNREFUSED') >= 0)) {
        if (!this._reconnecting) {
            console.log('Agent Worker will attempt to reconnect because it the socket reported an error:', err);
            var self = this;
            this._reconnecting = function () {
                self.socket.socket.reconnect();
            }.defer(500);
            self.socket.on('connect', function () {
                clearTimeout(self._reconnecting);
                self._reconnecting = 1;
                self.socket.removeListener('connect', arguments.callee);
            });
        }
//}
//else
    },
    'onCancelBuild': function () {
        this.build.conf.status = 'cancelled';
        try {
            this.exec && this.exec.kill();
        }
catch (e) {
        }
    },
    'onBuild': function (build) {
        if (!build) {
            return this.buildFailed(build, 'No build configuration was specified!')
        }
        if (!build.conf || !build.conf.platform) {
            return this.buildFailed(build, 'No platform was specified for the requested build!');
        }
        this.emit('building', build.id);
        var buildObj = new Build(build.conf, null, this, build.conf.platform, build.files, null, build.id, build.masterId);
        this.build = build = buildObj;
        switch (build.conf.platform) {
            case 'wp8':
                this.buildWP8(build);
                break;
            case 'android':
                this.buildAndroid(build);
                break;
            case 'ios':
                this.buildIOS(build);
                break;
            default:
                this.buildFailed(build, "Platform '{2}' was requested for this build but this agent doesn't support it!", build.conf.platform);
                break;
        }
    },
    emit: function () {
        if (!this.build || this.build.conf && this.build.conf.status != 'cancelled') {
            return this.socket.emit.apply(this.socket, arguments);
        }
        return false;
    },
    log: function (build, priority, message, args) {
        if (/Command failed/i.test(message)) {
            try {
                throw new Error("agent worker stack");
            }
            catch (e) {
                message += e.stack;
            }
        }
        splice.call(arguments, 1, 0, this, 'AW');
        var msg = new Msg();
        msg.update.apply(msg, arguments);

        if (this.conf.mode != 'all' || !this.socket.socket.connected)
            console.log(msg.toString());
        this.emit('log', msg);
    },
    ensureWorkFolder: function (done) {
        var workFolder = this.workFolder = path.resolve(this.workFolder);
        var agent = this;

        mkdirp(workFolder, function (err) {
            if (err) {
                agent.log(null, Msg.error, 'Cannot create folder: {2}', workFolder);
                process.env.PWD = workFolder;
            }
            done && done(err, workFolder);
        });
    },
    detectZipArchiver: function () {
        var agent = this;
        var zipper = exec(agent.sevenZipPath || '7z', { maxBuffer: maxBuffer }, function (err) {
            if (!err) {
                zipArchiver = '7z';
//console.log("7z found");
            }
            else {
                exec('"c:\\Program Files\\7-Zip\\7z.exe"', { maxBuffer: maxBuffer }, function (err) {
                    if (!err) {
                        zipArchiver = '7z64';
                        //console.log("c:\\Program Files\\7-Zip\\7z.exe found");
                        if (agent.sevenZipPath == "7z")
                            agent.sevenZipPath = "c:\\Program Files\\7-Zip\\7z.exe";
                    }
                    else zipper = exec('/Applications/Keka.app/Contents/Resources/keka7z', { maxBuffer: maxBuffer }, function (err) {
                        if (!err)
                            zipArchiver = 'keka7z';
//else exec('unzip', { maxBuffer: maxBuffer }, function (err) {
//    if (!err)
//        zipArchiver = 'unzip';
//});
                    });
                });
            }
        });
    },
    modifyArchive: function (build, modifier, file, spaceSeparatedNames, opts, done) {
        var agent = this;
        var verb = modifier == 'a' ? 'adding' : 'removing';
        var into = modifier == 'a' ? 'to' : 'from';
        var errMsg = 'Error {2} {3} {4} archive via {5}\n{6}\n{7}';
        switch (zipArchiver) {
            case '7z':
            case '7z64':
                var zipper = exec('{0} {1} -tzip {2} {3}'.format(agent.sevenZipPath, modifier, file, spaceSeparatedNames), opts, function (err, stdout, stderr) {
                    if (build.conf.status === 'cancelled') return;
                    //stdout && agent.log(build, Msg.debug, '{2}', stdout);
                    if (err) return agent.buildFailed(build, errMsg, verb, spaceSeparatedNames, into, agent.sevenZipPath, err, stderr);
                    done();
                });
                break;
            case 'keka7z':
                var zipper = exec('/Applications/Keka.app/Contents/Resources/keka7z d -tzip {0} {1}'.format(file, spaceSeparatedNames), opts, function (err, stdout, stderr) {
                    if (build.conf.status === 'cancelled') return;
                    //stdout && agent.log(build, Msg.debug, '{2}', stdout);
                    if (err) return agent.buildFailed(build, errMsg, verb, spaceSeparatedNames, into, 'keka7z', err, stderr);
                    done();
                });
                break;
//case 'unzip':
//    exec('unzip -uo {0} -d {1} '.format(file, target), opts, function (err, stdout, stderr) {
//        stdout && agent.log(build, Msg.debug, '{2}', stdout);
//        if (err || stderr) return agent.buildFailed(build, 'error executing unzip\n{2}\n{3}', err, stderr);
//        done();
//    });
//    break;
            default:
                return agent.buildFailed(build, 'cannot find 7z: {2}', zipArchiver || 'searched {0}, /Applications/Keka.app/Contents/Resources/keka7z'.format(this.sevenZipPath));
        }
    },
    extractArchive: function (build, file, target, opts, done) {
        var agent = this;
        switch (zipArchiver) {
            case '7z':
            case '7z64':
                var cmd = '{0} x {1} -o{2} -y'.format(agent.sevenZipPath, file, target);
                var zipper = exec(cmd, opts, function (err, stdout, stderr) {
                    if (build.conf.status === 'cancelled') return;
                    //stdout && agent.log(build, Msg.debug, '{2}', stdout);
                    if (err) return agent.buildFailed(build, 'Error executing {2}:\nCMD:{3}\nOpts:{4}\nStdout:{5}\nErr:{6}\nStdErr:{7}', agent.sevenZipPath, cmd, JSON.stringify(opts), stdout, err, stderr);
                    done();
                });
                break;
            case 'keka7z':
                var zipper = exec('/Applications/Keka.app/Contents/Resources/keka7z x {0} -o{1} -y'.format(file, target), opts, function (err, stdout, stderr) {
                    if (build.conf.status === 'cancelled') return;
                    //stdout && agent.log(build, Msg.debug, '{2}', stdout);
                    if (err) return agent.buildFailed(build, 'error executing keka7z\n{2}\n{3}', err, stderr);
                    done();
                });
                break;
//case 'unzip':
//    exec('unzip -uo {0} -d {1} '.format(file, target), opts, function (err, stdout, stderr) {
//        stdout && agent.log(build, Msg.debug, '{2}', stdout);
//        if (err || stderr) return agent.buildFailed(build, 'error executing unzip\n{2}\n{3}', err, stderr);
//        done();
//    });
//    break;
            default:
                return agent.buildFailed(build, 'cannot find 7z: {2}', zipArchiver || 'searched 7z, /Applications/Keka.app/Contents/Resources/keka7z');
        }
    },
    genericBuild: function (build, filesDone, done, onExecutingCordovaBuild, command) {
        command = command || "cordova build {0} {1} --{2}";
        var agent = this;
        var locationPath = build.locationPath;
        var files = build.files;

        function buildFailed(args) {
            splice.call(arguments, 0, 0, build);
            return agent.buildFailed.apply(agent, arguments);
//splice.call(arguments, 0, 1);
//done.apply(agent, arguments);
        }

        return agent.conf.reuseworkfolder ? agent.ensureWorkFolder(s3WriteFiles) : s1Cleanup();
        function s1Cleanup() {
            if (build.conf.status === 'cancelled') return;
            serverUtils.cleanLastFolders(agent.conf.keep, agent.workFolder + '/*', s1CleanupDone);
        }
        function s1CleanupDone(err) {
            if (build.conf.status === 'cancelled') return;
            err && agent.log(build, Msg.debug, 'Error while cleaning up last {2} folders in AGENT {3} working folder {4}:\n{5}', agent.conf.keep, agent.conf.platform, agent.workFolder, err);
            agent.ensureWorkFolder(s2EmptyWorkFolder);
        }

        function s2EmptyWorkFolder(err) {
            if (build.conf.status === 'cancelled') return;
            if (err) return buildFailed(build, 'error creating the working folder {2}\n{3}', agent.workFolder, err);
            var glob = locationPath;
            if (!/(\/|\\)$/.test(glob))
                glob += '/';
            glob += '*';
            multiGlob.glob(glob, function (err, files) {
                if (err) return s2WriteFiles(null);
                async.each(files, function (file, cb) {
                    fs.remove(file, function (err) {
                        cb(err);
                    });
                }, s3WriteFiles);
            });
        }

        function s3WriteFiles(err) {
            if (build.conf.status === 'cancelled') return;
            if (err) return buildFailed('error cleaning the working folder {2}\n{3}', agent.workFolder, err);
            files.forEach(function (file) {
                file.file = path.resolve(locationPath, path.basename(file.file));
            });
            serverUtils.writeFiles(locationPath, files, 'the cordova build agent worker on {0}'.format(build.conf.platform), s4ProcessFiles);
        }

        function s4ProcessFiles(err) {
            if (build.conf.status === 'cancelled') return;
            serverUtils.freeMemFiles(files);
            if (err) return buildFailed('error while saving files on agent worker:\n{2}', err);
            agent.log(build, Msg.info, 'extracting archives for {2}...', build.conf.platform);

            async.each(files, s5ExtractFile, s6AllFilesExtracted);
        }        ;
        function s5ExtractFile(item, cb) {
            if (build.conf.status === 'cancelled') return;
            agent.log(build, Msg.debug, 'extracting {2} to {3}', item.file, locationPath);
            agent.extractArchive(build, item.file, locationPath, {
                cwd: locationPath,
                maxBuffer: maxBuffer,
            }, cb);
        }        ;

        function s6AllFilesExtracted(err) {
            // Final callback after each item has been iterated over.
            if (build.conf.status === 'cancelled') return;
            if (err) return buildFailed('error extracting archive files\n{2}', err);
            if (filesDone)
                filesDone.call(agent, s6ModifyConfigXML);
            else s6ModifyConfigXML();
        }
        function s6ModifyConfigXML(cmd) {
            command = cmd || command;
            if (build.conf.status === 'cancelled') return;
            var bundleid = build.conf[build.conf.platform + 'bundleid'] || build.conf.bundleid;
            if (bundleid) {
                var configPath = path.resolve(build.locationPath, 'config.xml');
                agent.log(build, Msg.info, 'Changing bundleid to {2} in config.xml', bundleid);
                fs.readFile(configPath, 'utf8', function (err, data) {
                    if (err) {
                        if (err) return buildFailed('error reading {2}\n{3}', configPath, err);
                    }
                    var result = data.replace(/\<widget id\=(\"|\').*?(\"|\')/g, "<widget id=\"{0}\"".format(bundleid));

                    fs.writeFile(configPath, result, 'utf8', function (err) {
                        if (err) return buildFailed('error writing bundleid {2} into {3}\n{4}', bundleid, configPath, err);
                        s6DecideExecuteCordovaBuild();
                    });
                });
            }
            else s6DecideExecuteCordovaBuild();
        }
        function s6DecideExecuteCordovaBuild() {
            if (build.conf.status === 'cancelled') return;
            if (onExecutingCordovaBuild)
                onExecutingCordovaBuild.call(agent, build, function (err, executeStandardCordovaBuild, args) {
                    executeStandardCordovaBuild !== false && s7BuildCordova(err, args);
                }, s8BuildExecuted, buildFailed);
            else s7BuildCordova();
        }
        function s7BuildCordova(err, args) {
            if (build.conf.status === 'cancelled') return;
            if (err) return buildFailed('error starting build\n{2}', err);
            agent.log(build, Msg.info, 'building cordova on {2}...', build.conf.platform);

            var cmd = command.format(build.conf.platform, args || '', build.conf.buildmode || 'release');
            if (build.conf.platform == 'ios')
                cmd += ' | tee "' + path.resolve(locationPath, 'build.ios.xcodebuild.log') + '" | egrep -A 5 -i "(error|warning|succeeded|fail|codesign|running|return)"';
            if (build.conf.platform == 'android')
                cmd += ' | "platforms\\android\\cordova\\lib\\tee.exe" "build.android.log" | "platforms\\android\\cordova\\lib\\egrep.exe" -i -A 6 "(error|warning|success|sign)"';

            agent.log(build, Msg.status, 'Executing {2}', cmd);
            var cordova_build = exec(cmd, {
                cwd: locationPath,
                maxBuffer: maxBuffer,
            }, s8BuildExecuted)
            .on('close', function (code) {
                if (build.conf.status === 'cancelled') return;
                if (code && code != 1) return buildFailed('child process exited with code ' + code);
            });
            cordova_build.stdout.on('data', function (data) {
                if (data)//get rid of new lines at the end
                    data = data.replace(/\r?\n?$/m, '');
                agent.log(build, Msg.build_output, data);
            });
            cordova_build.stderr.on('data', function (data) {
                if (data)//get rid of new lines at the end
                    data = data.replace(/\r?\n?$/m, '');
                agent.log(build, Msg.error, data);
            });

        }
        function s8BuildExecuted(err, stdout, stderr) {
            if (build.conf.status === 'cancelled') return;
            if (stdout)
                agent.log(build, Msg.build_output, stdout);
            var e;
            if (err && (!err.code || err.code != 1)) {
                e = 1;
                agent.log(build, Msg.error, 'error:\n{2}', err);
            }
            if (stderr)
                ((err && err.message || err && err.indexOf && err || '').indexOf(stderr) < 0) && agent.log(build, Msg.error, 'stderror-{3}:\n{2}', stderr, "cordova build");

            if (e) return agent.buildFailed(build);

            done.call(agent, e);
        }
    },
    computeLocationFolder: function (build) {
        var agent = this;
        build.locationPath = agent.conf.reuseworkfolder ? agent.workFolder : path.resolve(agent.workFolder, build.Id());
    },
    buildWP8: function (build) {
        this.computeLocationFolder(build);
        this.genericBuild(build, null, function (err) {
            if (build.conf.status === 'cancelled') return;
            !err && this.buildSuccess(build, ['platforms/wp8/**/*.xap', 'build.wp8.log']);
        });
    },
    buildIOS: function (build) {
        this.computeLocationFolder(build);
        var agent = this;
        this.genericBuild(build, function (startBuild) {
            if (build.conf.status === 'cancelled') return;
            var workFolder = build.locationPath;
            var globs = path.resolve(workFolder, 'platforms/ios/cordova/**/*');
            var hooks = 'hooks/**/*.bat';
            multiGlob.glob(hooks, { cwd: workFolder }, function (err, hooks) {
                hooks.forEach(function (file) {
                    file = path.resolve(workFolder, file);
                    console.log('remove hook: ' + file);
                    try { fs.removeSync(file); }
                    catch (e) {
                        agent.buildFailed(build, e);
                    }
                });
                start();
            });
            function start() {
                //console.log('globs', globs)
                multiGlob.glob(globs, function (err, files) {
                    if (err) return startBuild(err);
                    async.each(files, function (file, cb) {
                        //console.log('chmodding', file)
                        fs.chmod(file, 511 /*777 on nix machines in base 8*/, function (err) {
                            cb.defer(0, null, err);
                        });
                    }, function (err) {
                        startBuild.defer(0, agent, err);
                    });
                });
            }
        }, function (err) {
            if (build.conf.status === 'cancelled') return;
            if (err) return buildFailed(err);
            function buildFailed() {
                splice.call(arguments, 0, 0, build);
                return agent.buildFailed.apply(agent, arguments);
            }
            agent.log(build, Msg.info, 'creating a new signed ipa');
            var buildId = build.Id();
            if (!build.conf.iosprojectpath) return buildFailed('-iosprojectpath:"platforms/ios/build/device/your-project-name.app" was not being specified!');
            if (!build.conf.iosprovisioningpath) return buildFailed('-iosprovisioningpath:"path-to-your-provision-file.mobileprovision" was not being specified!');
            if (!build.conf.ioscodesignidentity) return buildFailed('-ioscodesignidentity:"your-provision-name" was not being specified!');
            var pathOfIpa = path.resolve(agent.workFolder, buildId, "platforms/ios/", path.basename(build.conf.iosprojectpath || 'app.app', '.app') + '.ipa');
            var pathOfInfo_plist = path.resolve(agent.workFolder, buildId, build.conf.iosprojectpath, 'Info.plist');
            var iosProjectPath = path.resolve(agent.workFolder, buildId, build.conf.iosprojectpath);
            if (!fs.statSync(iosProjectPath).isDirectory()) return buildFailed('-iosprojectpath:"{2}" does not exist or not a directory! Full path: {3}', build.conf.iosprojectpath, iosProjectPath);
            if (!fs.existsSync(build.conf.iosprovisioningpath)) return buildFailed('-iosprovisioningpath:"{2}" file does not exist!', build.conf.iosprojectpath);

            var xcodebuildLogPath = path.resolve(agent.workFolder, buildId, 'build.ios.xcodebuild.log');
            var signLogPath = path.resolve(agent.workFolder, buildId, 'build.ios.sign.xcrun.log');
            var execPath = '/usr/bin/xcrun -sdk iphoneos PackageApplication -v "{0}" -o "{1}" --sign "{2}" --embed "{3}" | tee "{4}" | egrep -A 5 -i "(return|sign|invalid|error|warning|succeeded|fail|running)"'.format(iosProjectPath, pathOfIpa, build.conf.ioscodesignidentity, build.conf.iosprovisioningpath, signLogPath);
            agent.log(build, Msg.status, 'executing: {2}', execPath);
            var xcrunExec = agent.exec(build, execPath, { maxBuffer: maxBuffer }, xcrunFinish, 'sign process exited with code {2}');

            function xcrunFinish(err, stdout, stderr) {
                if (build.conf.status === 'cancelled') return;
                stdout && agent.log(build, Msg.build_output, '{2}', stdout);
                err && agent.log(build, Msg.error, 'error:\n{2}', err);
                stderr && (err && err.message || '').indexOf(stderr) < 0 && agent.log(build, Msg.error, 'stderror-xcrun:\n{2}', stderr);
                var e = stderr || err;
                if (e) return agent.buildFailed(build, '');
                agent.log(build, Msg.status, 'Converting Info.plist as xml: \nplutil -convert xml1 {2}', pathOfInfo_plist);
                var plutilExec = agent.exec(build, 'plutil -convert xml1 ' + pathOfInfo_plist, { maxBuffer: maxBuffer }, function (err, stdout, stderr) {
                    if (err || stderr)
                        return agent.buildFailed(build, 'plutil erro converting Info.plist as xml: \n{2}\n{3}', err, stderr);
                    agent.log(build, Msg.info, 'Output files: \n{2}\n{3}', pathOfIpa, pathOfInfo_plist);
                    agent.buildSuccess(build, [pathOfIpa, pathOfInfo_plist, signLogPath, xcodebuildLogPath]);
                }, 'plutil process exited with code');
            }

        }, function (build, buildCordova) {
            buildCordova(null, true, "--device{0}{1}".format(build.conf.ioscodesignidentity && " CODE_SIGN_IDENTITY='{0}'".format(build.conf.ioscodesignidentity) || '', build.conf.iosprovisioningpath && " PROVISIONING_PROFILE='{0}'".format(build.conf.iosprovisioningpath) || ''));//pass the --device argument only on ios
        });
    },
    exec: function (build, cmd, opts, callback, exitCodeError) {
        var agent = this;
        var process = exec(cmd, function (err, stdout, stderr) {
            if (build.conf.status === 'cancelled') return;
            stdout && agent.log(build, Msg.build_output, '{2}', stdout);
            err && (!err.code || err.code != 1) && agent.log(build, Msg.error, 'error:\n{2}', err);
            stderr && (err && err.message || '').indexOf(stderr) < 0 && agent.log(build, Msg.error, 'stderror-{3}:\n{2}', stderr, cmd);
            callback.apply(agent, arguments);
            if (stderr || err && (!err.code || err.code != 1)) return agent.buildFailed(build, '');
        }).on('close', function (code) {
            if (build.conf.status === 'cancelled') return;
            if (code && code != 1) return agent.buildFailed(build, exitCodeError || 'process exited with error code {2}', code);
        });
        process.stdout.on('data', function (data) {
            if (/error\:/gi.test(data || ''))
                return agent.buildFailed(build, data);
            agent.log(build, Msg.build_output, data);
        });
        process.stderr.on('data', function (data) {
            agent.log(build, Msg.error, data);
        });
        return process;
    },
    buildAndroid: function (build) {
        this.computeLocationFolder(build);
        var agent = this;
        var workFolder = build.locationPath;
        var androidFolder = path.resolve(workFolder, 'platforms/android');
        var assetsFolder = path.resolve(androidFolder, 'assets/www');
        var signLogPath = path.resolve(workFolder, 'build.android.sign.jarsign.log');
        var alignLogPath = path.resolve(workFolder, 'build.android.zipalign.log');
        var command;
        var apkGlobPath = ['platforms/android/**/*.apk'];
        var updateAssetsWWW = false;
        multiGlob.glob(apkGlobPath, {
            cwd: workFolder,
        }, function (err, files) {
            files.length && agent.log(build, Msg.info, "Deleting existing apks:\n{2}", files.join('\n'));
            async.each(files, function (file, callback) {
                file = path.resolve(workFolder, file);
                fs.unlink(file, callback);
            }, startBuild);
        });
        function startBuild(err) {
            if (build.conf.status === 'cancelled') return;
            err && agent.log(build, Msg.info, "Error while deleting existing apks, {2}", err);
            agent.genericBuild(build, filesDone, buildDone, null, command);
        }

        function filesDone(callback) {
            agent.log(build, Msg.info, "Searching for existing apks for a faster build");
            var cordovaLibPath = path.resolve(androidFolder, 'CordovaLib');
            fs.exists(cordovaLibPath, function (cordovaLibPathExists) {
                if (!cordovaLibPathExists && build.conf.androidreleaseapk) {
                    var source = build.conf[build.conf.buildmode == 'release' ? 'androidreleaseapk': 'androiddebugapk'];
                    var dest = path.resolve(androidFolder, path.basename(source));
                    fs.copy(source, dest, function (err) {
                        if (build.conf.status === 'cancelled') return;
                        if (err) return agent.buildFailed(build, 'Error copying apk {2} to {3}\n{4}', source, dest, err);
                        apkGlobPath = [dest];
                        updateAssetsWWW = true;
                        agent.log(build, Msg.info, "Apk found {2}. Updating only assets/www for a faster build", apkGlobPath[0]);
                        ensureAssetsFolder("cordova prepare {0} {1}");
                    });
                }
                else ensureAssetsFolder();
            });
            function ensureAssetsFolder(command) {
                agent.log(build, Msg.info, "Ensuring android work folder {2}", assetsFolder);
                mkdirp(assetsFolder, runCordovaBuild.bind(agent, command));
            }
            function runCordovaBuild(command, err) {
                if (build.conf.status === 'cancelled') return;
                if (err) return agent.buildFailed(build, 'Error ensuring assets/www folder: {2}', err);
                callback(command);
            }
        }
        function buildDone(err) {
            if (build.conf.status === 'cancelled') return;
            if (updateAssetsWWW) {
                agent.modifyArchive(build, 'd', apkGlobPath[0], 'assets', {
                    cwd: androidFolder,
                    maxBuffer: maxBuffer,
                }, injectAssetsWWWInAPK);
                function injectAssetsWWWInAPK() {
                    agent.modifyArchive(build, 'a', apkGlobPath[0], 'assets', {
                        cwd: androidFolder,
                        maxBuffer: maxBuffer,
                    }, sign);
                }
            }
            else sign();
        }
        function sign() {
            //build.conf.androidsign = "jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore d:\\cordova-build\\certificates\\android\\safetybank.live.keystore -storepass Safetybank@14 -keypass Safetybank@14 {0} sftb";
            if (build.conf.androidsign) {
                var androidsign = build.conf.androidsign;
                multiGlob.glob(apkGlobPath, {
                    cwd: workFolder,
                }, function (err, apks) {
                    //we should sign unaligned apks
                    apks = apks.filter(function (apk, i) { return !i; });
                    apkGlobPath = apks;
                    agent.modifyArchive(build, 'd', apks[0], 'META-INF', {
                        cwd: workFolder,
                        maxBuffer: maxBuffer,
                    }, jarSigner);
                    function jarSigner() {
                        if (build.conf.status === 'cancelled') return;
                        agent.log(build, Msg.debug, 'APK Files:\n{2}', apks.join('\n'));
                        apks = apks.map(function (apk) { return path.resolve(workFolder, apk); });
                        androidsign = androidsign.format.apply(androidsign, apks) + ' 2>&1 | "{0}" "{1}" | "{2}" -i -E -v "(tsacert|signing|warning|adding)"'.format(tee, signLogPath, egrep);
                        agent.log(build, Msg.status, androidsign);
                        agent.exec(build, androidsign, { maxBuffer: maxBuffer }, function (err, stdout, stderr) {
                            if (err || stderr) return;
                            zipAlign(apks[0]);
                        }, 'android sign process exited with code {2}');
                    }
                });
            }
            else done();
            function zipAlign(apk) {
                var output = apk.replace('-unsigned', '').replace('-unaligned', '');
                var key = build.conf.androidsign.match(/(.*)(\\|\/| )(.*)(\.keystore)/i);
                key = key && key[3];
                key = key && ("-" + key);
                output = path.resolve(path.dirname(apk), path.basename(output, '.apk') + key + '-signed-aligend.apk');
                if (apk == output)
                    output = output.replace('.apk', '-updated.apk');
                var zipalign = 'zipalign -f -v 4  "{0}" "{1}"'.format(apk, output);
                zipalign = zipalign + ' 2>&1 | "{0}" "{1}" | "{2}" -i -A 5 "(success)""'.format(tee, alignLogPath, egrep);
                agent.exec(build, zipalign, {
                    cwd: workFolder,
                    maxBuffer: maxBuffer,
                }, function (err, stdout, stderr) {
                    if (err && (!err.code || err.code != 1) || stdout || build.conf.status === 'cancelled') return;
                    apkGlobPath = [output];
                    done();
                }, 'android zipalign process exited with code {2}');
            }
            function done(err) {
                !err && agent.buildSuccess(build, apkGlobPath.concat(['build.android.log', signLogPath, alignLogPath]));
            }
        }
    },
    buildSuccess: function (build, globFiles) {
        if (build.conf.status === 'cancelled') return;
        var agent = this;
        var workFolder = build.locationPath;
        multiGlob.glob(globFiles, {
            cwd: workFolder,
        }, function (err, files) {

            if (build.conf.status === 'cancelled') return;
            if (err) return agent.buildFailed(build, 'error globbing {2}', globFiles);
            files = files.map(function (file) {
                return { file: path.resolve(workFolder, file) };
            });
            agent.emit('uploading', build.id);//change build status to uploading..
            serverUtils.readFiles(files, '[Agent WORKER] cordova build agent worker output files', function (err) {
                if (build.conf.status === 'cancelled') return;
                if (err) {
                    serverUtils.freeMemFiles(files);
                    return agent.buildFailed(build, err);
                }
                uploadFiles(files);
            });
        });
        function uploadFiles(outputFiles) {
            try {
                build.outputFiles = outputFiles;
                var size = 0; outputFiles.forEach(function (file) { size += file && file.content && file.content.data && file.content.data.length || 0; })
                size && agent.log(build, Msg.info, 'Uploading results file(s) to cordova build server...{0}'.format(fileSize(size)));
                var paths = []; outputFiles.forEach(function (file) {
                    paths.push(file.file);
                    if (build.conf.name) {
                        var ext = path.extname(file.file);
                        switch (ext) {
                            case '.ipa':
                            case '.apk':
                            case '.xap':
                                file.name = build.conf.name ? build.conf.name + ext : file.file;
                                break;
                        }
                    }
                    file.file = path.basename(file.file);
                });

                agent.emit('build-success', build.serialize({
                    outputFiles: 1,
                    content: 1
                }));
                outputFiles.forEach(function (file, index) { file.file = paths[index]; });
            }
            finally {
                //free agent's memory of output files contents
                serverUtils.freeMemFiles(outputFiles);
                var buildPath = path.resolve(build.locationPath, 'build.' + build.conf.platform + '.json');
                build.save(buildPath, function (err, e, bp, json) {
                    err && agent.log(build, Msg.debug, err);
                });
            }
        }
    },
    buildFailed: function (build, err, args) {
        if (build.conf.status === 'cancelled') return;
        try {
            throw new Error("failed with stack");
        }
        catch (e) {
            err = err + '\n' + e.stack;
        }
        var agent = this;
        if (err) {
            splice.call(arguments, 1, 0, Msg.error);
            this.log.apply(this, arguments);
            this.log.call(this, build, Msg.error, '*** BUILD FAILED on {2} ***', build && build.conf && build.conf.platform || 'unknown platform');
        }

        serverUtils.freeMemFiles(build.files);
        var buildPath = path.resolve(build.locationPath, 'build.' + build.conf.platform + '.json');
        build.save(buildPath, function (err, e, bp, json) {
            err && agent.log(build, Msg.debug, err);
        });
        this.emit('build-failed', build.serialize());
    },
});


The best features of the fruits and vegetables are the enzymes that nourish the body. Regular centrifugal juicers rotate at high speed, generating heat while juicing. This heat destroys the enzymes in the juice, reducing the shelf life drastically. Masticating juicers rotate slowly at 80 RPM chewing through the vegetables and fruits to make the healthiest pulp free juice in a few minutes.
Double auger juicers perform better than single auger juicers and they last longer. At the maximum, masticating juicers operate at 100RPM. It is better to choose a juicer that comes apart easily for cleaning. A compact juicer can be handled easily and stowed away inside a cabinet when not in use. While purchasing masticating juicers, you should pay attention to the oxidation number which shows how long the juice can be stored to reap the benefits of enzymes.
This masticating juicer makes 10% more juice than regular centrifugal juicers. The auger system performs three operations – squeezing, filtering and collecting. This makes it easy to disassemble the juicer and clean once you make juices. The juice bowl has an innovative 24 rib design for increased grinding performance. The motor operates at 65RPM at 150 W and creates lower noise. All the parts of the juicer are made of food grade antioxidant materials that can be popped in a dishwasher for easy cleaning.
If you are bored of cutting the produce to feed through the narrow tube, you can make juice in a jiffy with BuySevenSide juicer with a wide feeding tube. The dishwasher safe parts can be detached and reattached easily after cleaning. It comes with a cleaning brush to clean non-removable parts. Using this juicer, you can extract as much as 98% of the juice. This juicer is super quiet operating at 49DB.
This extremely popular juicer operates at a low speed of 80 RPM and prevents oxidation. You can keep the juice fresh and enzyme-rich for up to 72 hours. It has a dual stage juicing system that allows you to extract maximum juice from the fruits and vegetables. One of the special features of this juicer is that you can make nut butter, baby food, and soy milk. You can even use it to extrude delicious pasta and replace your coffee and spice grinder. It comes with several different attachments for various needs in your kitchen.
Compared to centrifugal juicers, SKG juicers are budget-friendly and operate at low speed. The wide chute cuts down preparation time as you don't need to chop the ingredients finely. Its 240W AC motor operates at a low speed of 60 RPM. The juicer reduces oxidation, keeping the juice fresher for longer. This is made of TRITAN food grade materials with anti-oxidation properties. The juicer weighs 16 lbs and it stands proudly on your kitchen counter.
If you are looking for a juicer that fits your budget and lets you make fresh enzyme rich juice every time, then the Aicok juicer is the best choice. Operating at 80RPM, this juicer prevents oxidation and makes healthy juice. The auto pulp ejection feature allows you to continue using the juicer to make juice in large batches. The dishwasher safe parts are easy to clean and this juicer is quiet. You can juice all types of fruits and fibrous vegetables without worrying about clogging.
The limited space in your kitchen doesn't have room for bulkier equipment. The vertical juicer from Omega is easy to store and use. If you have been drinking smoothies for so long, you won't find it difficult to gulp raw juice with this amazing juicer. It delays oxidation and prevents the buildup of heat. It operates at a much lower speed of 43RPM and it has an auto-cleaning system. The upgraded auger system has a tighter fit, resulting in a high yield of juice.
This is a highly dependable domestic juicer that has all the features of a commercial juicer. The single auger construction with auto pulp-ejection is just what you want to make healthy juices at home. It has a 1/3 HP electric motor and the motor shaft comes with a 10-year warranty. To juice wheatgrass, you need to use a separate attachment that comes with the juicer. Cleaning is a breeze and you can use a cleaning brush to clean the screen.
Operating at a slow speed of 47RPM, this juicer makes the best fresh juice from any juice or vegetable with minimal oxidation. The dual blade augers make it possible to juice the produce quickly without any loss of nutrients. The mincing attachment converts this juicer into food processor instantly. You can make salsas and frozen desserts with a simple change of the attachment. One of the most useful features is the juice cap which controls the flow of juice during the juicing process. It makes it possible to premix juices and prevent spills.
The magnetic twin gears made of stainless steel bio-ceramic materials delays oxidation while extracting fresh juice from various fruits and vegetables. The natural enzymes are preserved for longer as the juicing process delays the degradation process. The juicer operates at 110RPM and extracts maximum juice resulting in a drier pulp. The entire juicer is easy to assemble and clean. The homogenizer attachment doubles the purpose of this juicer as you can make salsas, frozen desserts, nut butter and pasta noodles.
This juicer has a reliable 170 W motor that operates at a low speed of 80 RPM. The nutritional value of the fresh juice is preserved by the antioxidant materials used in this juicer. The auto feeding design cuts down the juicing time. This is truly a versatile juicer with 7 different nozzles for food processing. The juicer system can be disassembled for easy cleaning.


I travel roads and discover new places. Deep in the heart of new countries. Deep in the heart of me. Mostly I go lightly hardly noticing a load. Then suddenly one day I feel the weight of my own heart. How can something that is so seemingly light within you become so heavy in an instant? I suppose our hearts weren't meant to be forgotten and occasionally we are to be reminded that they need to be carried. Like the lake that carries the lone tree and the tracks that carry the train.
In a mound of shimmering moments.


* FREE* shipping on qualifying offers. The Bulletproof Diet: Lose up to a Pound a Day Reclaim Energy , Upgrade Your Life [ Dave Asprey, Focus J.
This is a very interesting book that shows the beautiful names of Allah with a simple concise meaning It also mentions the evidence of each name with showing how many times it is mentioned in the Quran the Sunnah. It is designed to meet the needs of residents delineation of tumor volumes/ fields , dose prescription for intensity- modulated radiation therapy, practicing radiation oncologists , will assist in selection , fellows including volumetric modulated arc. This book is an evidence- based guide to current use of radiation therapy for the treatment of malignancies at major disease sites.
An uncommon dialogue. This table contains the most up to date criteria for aquatic life ambient water quality criteria.
EPA sets limits on environmental radiation from use of radioactive elements. People are talking about Glow 15 " The first plan that' s worked for me" " Glow15 changed my life - and my body! Body for life book pdf free. Body Love: Live in Balance Weigh What You Want Free Yourself from Food Drama Forever ( The Body Love Series) [ Kelly LeVeque] on.
Body for life book pdf free. I lost almost 10 pounds in the first 15 days by the next 15 days my body fat percentage went down 3% my waist was 3 inches smaller. Celebrity favorite health and wellness consultant Kelly LeVeque shares her secrets for losing weight. Buy My Life My Shop Digital Scale and Body Analyzer on FREE SHIPPING on qualified orders.
We are delighted to welcome Ashgate Publishing and Gower books into the Taylor & Francis Group. The Radiation Protection website describes EPA' s radiation protection activities regulations supporting NVERSATIONS WITH GOD. NEALE DONALD WALSCH.
Aquatic life criteria for toxic chemicals are the highest concentration of specific pollutants or parameters in water that are not expected to pose a significant risk to the majority of species in a.
Is it " Healthcare" or Disease Care? True " healthcare" would be the care of the very basic unit of life, which as we know is the human cell. This comprehensive care would begin in our very early years, conceivably from conception, involving a system focused on the healthy maintenance of the cells and thus, the non- interference of cellular function, and subsequently unaltered DNA.
Life is a characteristic that distinguishes physical entities that have biological processes, such as signaling and self- sustaining processes, from those that do not, either because such functions have ceased ( they have died), or because they never had such functions and are classified as inanimate. Various forms of life exist, such as plants, animals, fungi, protists, archaea, and bacteria. The place for everything in Oprah' s world.
The Oprah Show, O magazine, Oprah Radio, Angel Network, Harpo Films and Oprah' s Book Club. The Game of Life and How to Play It by Florence Scovel Shinn Other Works by Florence Scovel Shinn Your Word is Your Wand ( Published in 1928) The Secret Door to Success ( Published in 1940). The meaning of life, or the answer to the question " What is the meaning of life?
", pertains to the significance of living or existence in general. Many other The Havan Agnihotra Pdf book ( The Havan ceremony as performed by the Arya Samaj) This free e- book is prepared by Free Bibliography & Citation Maker - MLA, APA, Chicago, Harvard.


Two time semi-finalists Delhi Dynamos will hope to wipe out their last season's Indian Super League campaign's memories as they begin a new journey this year.
The team representing India's capital have a decent mix of players this season and will hope that their coach Josep Gambau turns their fortunes around.
One of only four defenders to have played more than 50 matches in the Indian Super League, Narayan Das will be extremely critical for Delhi's success this season.
The 25-year-old defender made 19 appearances for FC Goa last season in which he made 34 tackles, 28 interceptions, 23 blocks and 37 clearances.
Das is one of the most technically sound Indian defenders in the league with a pass completion percentage of 76.72%. He will definitely add spark to Delhi's build-up play in the new season.
A product of Barcelona's famed La Masia, Adria Carmona was sold to AC Milan in 2010. He did not make a single appearance for the Italian giants and was loaned to Spanish side Real Zaragoza in 2013.
After making three appearances for them, he moved to Girona, Espanyol, Albacete and Lugo before Delhi Dynamos came along. The 26-year-old can play both as a winger and an attacking midfielder, something the Dynamos desperately needed for the coming season.
Delhi re-signed Marcos Tebar this season after selling him to Catalonian football club Reus in 2017 where he made just nine appearances before FC Pune City managed to get his signature for the 2017-18 season.
Last season, the Madrid born midfielder played 17 games for Pune, managing one goal and two assists. He was amazing for the Maharashtra based side as he made 44 tackles, 24 interceptions, 24 clearances and 18 blocks throughout the season.
The 32-year-old Real Madrid academy product will hope to create more for the Dynamos this season. Delhi fans will hope to see his impressive positional play and the ability to break counters this season.
Delhi signed Serbian striker Andrija Kaludjerovic on 17th August this year after looking at some of his impressive stints at previous clubs.
The 31-year-old played 23 games for A-League side Wellington Phoenix and scored nine goals before going through a blank spell at Slovenian club Olimpija Ljubljana.
As he was a free agent, Kaludjerovic chose to make a switch to the Indian Super League with Delhi and looks like an exciting prospect for the north Indian side.
His most impressive season came while playing for Lithuanian side Zalgiris in 2016, where he not only won the League and Cup double but was also the top scorer of the league with 20 goals in 19 games.
Kaludjerovic's unpredictability will make him a very tricky player to mark for opposition defences this season.
One of India's exciting young stars, Lallianzuala Chhangte was signed by Delhi Dynamos in 2017 and he went on to score three goals and provide three assists for them in 18 matches last season.
The pacy winger also came up with 31 tackles, 12 interceptions, two clearances in seven blocks for his team which goes to show his all-round contribution for the team.
On the national team front, Chhangte has already made five appearances and scored three goals which makes him one of the best youngsters in the league. It will be interesting to see how Delhi use his pace and skill to beat their opponents in the upcoming season.


text:
This website stores cookies on your computer. These cookies are used to improve your website and provide more personalised services to you, both on this website and through other media. To find out more about the cookies we use, see our Cookie Notice. OAG takes your privacy very seriously. For details, please see our recently updated Privacy Notice.
Flight Orlando - Washington (MCO - DCA) $97+ Flight Minneapolis - Washington (MSP - IAD) $107+ Flight Minneapolis - Washington (MSP - DCA) $117+ Flight New York - Washington (JFK - DCA) $127+ Flight New York - Washington (LGA - DCA) $147+ Flight Boston - Washington (BOS - DCA) $155+ Flight Boston - Washington (BOS - IAD) $161+ Flight Fort Lauderdale - Washington (FLL - DCA) $168+ Flight Denver - Washington (DEN - DCA) $173+ Flight Santa Ana - Washington (SNA - DCA) $182+ Flight Chicago - Washington (ORD - DCA) $186+ Flight Dallas - Washington (DFW - DCA) $198+ Flight Los Angeles - Washington (LAX - DCA) $204+ Flight San Francisco - Washington (SFO - DCA) $206+
This website stores cookies on your computer. These cookies are used to improve your website and provide more personalised services to you, both on this website and through other media. To find out more about the cookies we use, see our Cookie Notice.  OAG takes your privacy very seriously. For details, please see our recently updated Privacy Notice.
Flight Houston - Chicago (HOU - ORD) $55+ Flight Denver - Chicago (DEN - ORD) $79+ Flight Boston - Chicago (BOS - ORD) $90+ Flight New York - Chicago (LGA - ORD) $91+ Flight Phoenix - Chicago (PHX - ORD) $94+ Flight Dallas - Chicago (DFW - ORD) $97+ Flight Minneapolis - Chicago (MSP - ORD) $97+ Flight Washington - Chicago (BWI - ORD) $101+ Flight Atlanta - Chicago (ATL - ORD) $108+
Flight Oakland - Los Angeles (OAK - LAX) $55+ Flight San Francisco - Los Angeles (SFO - LAX) $91+ Flight San José - Los Angeles (SJC - LAX) $91+ Flight Houston - Los Angeles (HOU - LAX) $106+ Flight Houston - Los Angeles (IAH - LAX) $106+ Flight Dallas - Los Angeles (DFW - LAX) $123+ Flight Chicago - Los Angeles (ORD - LAX) $125+ Flight Seattle - Los Angeles (SEA - LAX) $125+ Flight Portland - Los Angeles (PDX - LAX) $137+ Flight New York - Los Angeles (LGA - LAX) $140+ Flight Orlando - Los Angeles (MCO - LAX) $163+ Flight Minneapolis - Los Angeles (MSP - LAX) $165+ Flight Detroit - Los Angeles (DTW - LAX) $166+ Flight Washington - Los Angeles (BWI - LAX) $173+ Flight Atlanta - Los Angeles (ATL - LAX) $178+ Flight Fort Lauderdale - Los Angeles (FLL - LAX) $178+ Flight Philadelphia - Los Angeles (PHL - LAX) $187+ Flight Newark - Los Angeles (EWR - LAX) $191+ Flight Boston - Los Angeles (BOS - LAX) $197+ Flight Raleigh - Los Angeles (RDU - LAX) $199+ Flight Chicago - Los Angeles (MDW - LAX) $201+ Flight Washington - Los Angeles (DCA - LAX) $204+
In March 2002, Travelocity acquired last minute travel specialist Site59.com.[9] The CEO and founder of Site59, Michelle Peluso, joined Travelocity with the acquisition as senior vice president, product strategy and distribution. Peluso became Travelocity's COO in April 2003 and was then named president and chief executive officer of Travelocity in December 2003.[3] Many members of Peluso's former management team at Site59 were appointed to senior management positions at Travelocity including Jeffrey Glueck (Chief Marketing Officer), Tracey Weber (President, North America), Josh Hartmann (Chief Technology Officer) and Jonathan Perkel (Senior Vice President and General Counsel).[10]
All the airlines, airports, services and trademarks listed are the sole property of their respective owners. This site is not affiliated with any of the airlines listed above - but is a service to track flights. Should you have any questions for any of the individual airlines you are asked to contact them direct. If you feel there is an error with our flight tracking please feel free to contact us.
If you're sightseeing, you may only be after a basic hotel, but its location will be crucial to you. Hotels.com gives you detailed maps of the Price area and each landmark and transportation option to allow you to book the cheapest hotel in Price nearest the attractions you actually care about. You can even search outside the city and find budget hotels across Utah.
Subject to the restrictions set out in these terms and conditions, the 15% promotion code may be applied to a qualifying stand-alone hotel (not a hotel booking in combination with any other product such as flight + hotel, or flight + hotel + car) booked on a mobile device or the Travelocity app by 12/31/2019, for 1 or more nights for travel 6/31/2020. Qualifying bookings instantly receive 15% off at check-out through the use of the promotion code. Customers are limited to one redemption of this promotion code and up to a maximum savings of $150 per booking. After the booking, this promo code will not be able to be used again, even if the booking is cancelled. Exclusions may apply and most major hotel chains are excluded. The promotion code cannot be redeemed against taxes, supplier fees, cancellation or change fees/penalties, administrative fees or other miscellaneous charges, which are the sole responsibility of the customer. Discounts are not redeemable for cash for any reason. Promotion codes are non-transferable, not for resale, and cannot be combined with other offers or used for any booking previously made. Any attempt at fraud will be prosecuted to the fullest extent of the law. Void where prohibited, taxed or restricted by law. Travelocity reserves the right to change or limit the promotion in its sole discretion. Usual booking terms and conditions apply (see https://www.travelocity.com/p/info-other/legal.htm) and all bookings are subject to availability.

redpajama_set_name: RedPajamaCommonCrawl


Popcorn, nachos, pretzels, and chocolate are all standard movie-watching staples, but who would serve such plebeian fare at an awards party? We would – with an upscale twist, of course. Behold, a gourmet popcorn bar, individual nacho chips with delectable fillings, plus elegant pretzel sticks robed in rich dark and white chocolate. Adding a touch of formality to your food is appropriate for an awards party – it is a black-tie affair, after all.
Popcorn with Panache: Fresh popcorn gets the red carpet-treatment with couture flavorings and a chic presentation.
Some like it hot: Lightly sprinkle cayenne pepper, white pepper, and black pepper over hot, buttered popcorn to taste, shaking gently to distribute.
Some like it sweet: Toss hot kettle corn with chocolate chips and miniature marshmallows, then sprinkle with cinnamon sugar. Let cool before serving.
Some like it savory: Sprinkle hot, lightly buttered popcorn generously with grated Parmesan cheese and shake gently to distribute.
TO SERVE: Twist decorative paper into cones and secure with tape. Alternate popcorn flavors in cones, and then group cones together in a decorative vessel (such as an ice bucket, shown here), or prop individually in elegant bowls or vases.
Epicurean Nacho Bites: A movie-theater favorite dresses up and sizes down into individual servings fit for a swish party.
Mediterranean Nachos: Slice whole-wheat pita pockets into chip-sized triangles. Arrange on baking sheet and brush with olive oil. Place in a 400-degree oven for approximately five minutes or until lightly browned and crisp. Place 4-5 pita chips into an aluminum-foil baking cup (jumbo-size). In a bowl, mix plain Greek yogurt with feta crumbles to taste. Add torn mint leaves, sprinkle with lemon juice, and stir. Top chips with yogurt-cheese mixture, and crown with diced cucumbers and tomatoes. Garnish with sprigs of fresh mint.
Fiesta Nachos: Arrange individual tortilla scoops on baking sheet, and fill with refried beans, grated cheddar cheese, diced tomatoes, and green chilies. Bake at 400 degrees for until cheese has melted (approximately five minutes). Arrange on tray and top with a dollop of sour cream followed by diced avocado, mango, and pineapple. Garnish with cilantro and serve.
Black-Tie Pretzel Rods: Amp up par-for-the-course pretzels and chocolate by combining the two and rolling in sweet, chic toppings. Pour your choice of black and white candy baking sprinkles onto individual plates. Line a baking sheet with parchment or waxed paper. In the microwave, melt dark chocolate and white chocolate in separate bowls (we used candy melts from our local craft store). Be sure to stir chocolate frequently to prevent scorching. Dip pretzel rods into chocolate, allowing excess to drip into bowl, then roll in sprinkles before placing on parchment paper to cool. Allow chocolate to set before serving.
NEXT: Check out more awards show party ideas!
Fashion and lifestyle expert, editor and writer Kelly Lee is passionate about improving lives by sharing new discoveries, delights, tips and trends from around the globe and the WWW on the best places to shop, play, stay, nosh and tie the knot. In addition to sharing style intel at KellyGolightly.com (formerly known as BussBuss.com), Kelly can be found dishing about the world's most glamorous weddings as a Contributing Writer at Inside Weddings magazine. She also co-wrote celebrity wedding planner Mindy Weiss' wedding advice column for Wedding Channel and was the former Entertainment & City Editor of AOL's City's Best. She created and penned a fashion column "Kelly's Klicks" for Pink Magazine (Media News Group) and LA Direct Magazine. The highlight of her career has been regaling Martha Stewart with the wonders of Booty Pop during a Fashion Fixes segment that she hosted on The Martha Stewart Show.


A two-seater sofa designed by Sven Ellekaer and produced by Komfort. Model Borneo is a high-quality, mid-century design made in Denmark in the 60's. The beautiful well-made curves and details are characteristic of Danish design.


The range is located at the north-east edge of the paved pathway loop (past the pond, in the second open field).
The Carter Park Archery Range is open to the community as a free, public practice space and offers block targets at 10, 20, 30, and 40 yards.
Deerfield Township received an ODNR Division of Wildlife Shooting Range Subsidy Grant for the development of the archery range.
PLEASE NOTE: For safety reasons, the range will be closed during formal programs and scheduled maintenance. Please see below for closure times.
The range features accessible paved pathways throughout, including shooting line, waiting area, and target lanes.
At each lane, Range guidelines are posted and signal flags for arrow retrieval are available.
Deerfield Township partners with Gold Medal Archery to offer archery programming for the community. Please click here for current programs.


text:
Razor-blade of Life
Still sliding
Lowestoft sparrows
As mentioned, the second post of the day, because I'll be unlikely to write anything for the next few days.
I mentioned that Rose has been in Trinidad, visiting her brother and family and she arrived home again yesterday evening. I didn't bother her with the news while she was away, but briefly filled her in while she was on the coach back to Norwich.
So, now she knows that Scrabble is sitting and that the eggs may hatch any time from Thursday onwards. Canasta's eggs took nearly four weeks to hatch, but nearer three is more likely. I've left everything ready, in case it happens while we're away. Tonight, we're at Tim's house in Reading, and are off to Pembrokeshire in the morning.
Other news is sadder, because one of the big black hens died the other night. She's been getting gradually more withdrawn for quite some time, spending a lot of time on her own and, whilst the three black sisters used to lay an egg each almost every day, there have been few for the last few months. I don't know much about non-bantam chickens, but I suspect that the sort of hens that produce a lot of eggs have shorter lives. As they were given to me, I don't know how old they are, anyway. But in any case, she had gone from being the leader of the three to the quietest and, for the last couple of nights of her life, I'd picked her up and put her to roost. And then, the other morning, I found her lying on the floor.
I spent a couple of days writing the information for the auction catalogue and we did all the photography and labelling over the weekend. Now i have to crop the photos and then LT will put the catalogue together. Since the weekend, I've had two people wanting to put more china in the auction and had to turn them down. I've got 109 lots already, which is a few more than I really wanted. But there are lovely pieces. I've fallen for the adorable, and very functional, eye bath, but I won't bid for it. I have too much stuff already … though it's tempting.
Tim and I were talking about the nature of collecting and the impulse, even obsession, to do so. He just doesn't get it at all and I don't really, though I have more comprehension of it than he does. Russell, like his mother, was a born collector and never happier than looking out for something to add. Neither of them was obsessive though, which does seem to take it beyond pleasure.
In other news, my foot is getting better but I still have to wear the boot. It's been quite uncomfortable while the weather is hot, but at least I can take it off and am very glad I'm not in a plaster cast.
No wifi now until next Monday. But, as I have brought my computer with me, I can get on with these photos without being tempted by the internet.
This entry was posted in Uncategorized on July 30, 2019 by Z.
Z's homes – Seaview – the kitchen gardens – part 3
Just some brief memories of what was grown and how, because I don't suppose it's done this way any more.
Cucumbers were grown on the bench, with a base of chicken wire. On that, was a generous heap of manure and the seedling was planted onto that. The plant was trained up wires. In those days, a greenhouse cucumber had to have all male flowers removed so that they didn't fertilise the female ones – if one were missed, the cucumber would grow with a bulbous end and taste bitter. All-female varieties put an end to that necessity and it never was needed for outdoor cucumbers, the ones with little spines on.
Tomatoes were planted straight into the ground in the big aluminium greenhouse, except for the early ones, which went into terracotta pots in the greenhouse.
My father liked to try something different, and he grew loofas one year in his greenhouse, the one that the gardener wasn't involved in. I've grown them a few times and they're just like a vigorous cucumber. You leave the fruit as long as possible and then harvest it and dry it out. It rots easily so you have to take care of it. The flesh gradually desiccates and the skin can finally be broken off, leaving the fibrous 'skeleton', which is full of black seeds. I remember childhood baths, when we had to pick those seeds out of the water before pulling the plug. He also grew aubergines, peppers and chillies, when they weren't easy to buy in the shops, back in the 1960s. I remember a huge crop of chillies, far more than we could ever use. I suspect most of them were quietly composted.
Melons needed quite a deal of warmth, so they were likely to be grown in a hothouse. I've grown melons too, the aroma of a ripe one is fabulous. Walking into the greenhouse, smelling that a melon is ready to pick and then searching for it is a joy. They sometimes need some help for fertilisation and it's traditional to use a paintbrush, dabbled first in a male flower and then a female one. I'm a bit lazy, so generally just broke off the male flower and performed the introduction to its partner.
Mr Weavers left us in the end, because his son Frank was starting up a smallholding and wanted his dad's help. He lived, with his wife and younger daughter in the cottage, known as Seaview Lodge, on the other side of the road. Because the soil was sandier there, root vegetables were grown in that garden. There was also a paddock, where our pony lived. First our horse Tom, that is, then the pony Snowball. The Lodge has been hugely enlarged and is unrecognisable – though I never remember seeing a photo of it in its original state – and the paddock was sold for another building plot.
As I said yesterday, a basket of vegetables was delivered to the house every day. There must have been a vast amount – I don't know if my mother said what she needed or whether the gardener brought what was ready, though I suspect it was a mixture of the two. And I don't know what happened to the surplus, though of course, he'd have lived off the land too. We never kept chickens, funnily enough.
I'll write another post after dinner, probably, just as a diary entry, because we're heading for Wales tomorrow and I'm likely to be offline – I won't have the computer, at any rate, and only an occasional connection on my phone. But right now, LT is cooking fish.
Here is the house where I grew up. The conservatory is on the left, a greenhouse left of that and the garage block behind. The house is still there, but divided into two and altered accordingly – the right hand half as we look at it didn't have a kitchen, for instance, so that has been added. The garage and three greenhouses were pulled down to build another house. The kitchen garden was to the right, out of sight.
But I'm telling you about the kitchen garden and the hothouses, so this picture isn't really relevant. It gives you a flavour, though.
The hothouses were heated by a coke furnace and hot water was piped through – I don't know how much it was used in our day, things were different when my grandparents built the house. My parents and Mr Weavers used to grow flowers and vegetables for shows – the Norfolk and Suffolk show mostly, but also local ones. It was all taken very seriously. My parents used to go to the Chelsea Flower Show every year, when Members' Day was very posh. You dressed up for it. They made a beeline for the Blackmore and Langdon stall in the marquee, to buy the best begonia corms and delphiniums. Those were the flowers that my parents specialised in showing. A begonia bigger than a dinner plate was not unknown. They were a bugger to transport as the fleshy stems were easily damaged. In a show, having a long tall flower that's in bloom all the way up is impressive. Mr Weavers used to sit, the day before a show, dipping delphinium stems in hot and then cold water, to get the upper buds to open up without scalding the plant. In nature, the lower flowers would have gone over by the time the upper ones were open. I daresay science has devised varieties that are at their peak all the way, now; as they have with tomatoes.
In the week or two before a show, we were constrained in what vegetables we ate. Nothing perfect, in fact. There was still plenty of choice. Mr Weavers would bring a basket of vegetables to the house every day.
I should manage some memories … I grew broad beans one year, in a little bit of ground in the rock garden. But I was too lazy to keep carrying water down from the house and used river water, not realising that it was a bit salt, as Oulton Broad is tidal, so they didn't actually produce any beans.
Once, when I was about ten or eleven, my father took me to the town nursery. In those days, all the parks had elaborate bedding schemes, changed twice a year, and everything was grown from seed or cuttings. The chief nurseryman was Mr Campbell, as Scottish as his name implies. He had a reputation as a martinet, but he was immensely kind to me, a shy little girl who didn't give much to go on. I had a lovely time. He showed me round the gardens and the greenhouses. I especially remember the huge glasshouse where, at one end, a lemon tree grew up the wall. He picked a ripe lemon for me, and also gave me lots of other plants to bring home. Although my parents were loving and kind and I had a happy childhood, I rarely felt the centre of attention, but I was on that day. The plants were all swept down to the greenhouse and I never saw them again and the lemon stayed on the kitchen counter, unused.
There was no lack of thoughtfulness intended, it's just that there was nothing child-centred (as we'd say today) about my childhood and so it didn't matter, and I was too reserved to say anything – if I had, I'd have had whatever I wanted. Still, I had the day and I still have it, over half a century later and, if I'd had the care of the plants I'd probably have forgotten to water them. Pfft. All the same, one of them was a mimosa pudica, the sensitive plant, whose leaves fold up when you touch them, and I've grown that from seed and given the plants to children, many times since. And, a few years ago, I bought some lemons with the twigs attached. A day or two later, the kitchen smelt wonderful, and it was the lemon flowers that had opened up, and it took me right back to that day.
Another memory is the time when the raspberries kept vanishing. Mr Weavers suggested to my mother that I might have been eating them. My mother assured him that I'd have done no such thing, and I wouldn't. It was well known that Mr Weavers was King in the kitchen garden, though I was allowed to eat as many tiny tomatoes off the vine as I wanted. But a watch was kept – I mentioned that there was a picket fence between the drive and the kitchen garden. Darling Huckleberry (Hound, not Finn) leapt the fence and delicately put his lips round each raspberry to remove it from the cane. The poor dog got his comeuppance in the end, however. We heard an agonised yowling and ran to the window – jumping, he'd not gone high enough and had caught both his back legs between the upright pickets and was painfully stuck, barely able to reach the ground with his front paws. We rushed to rescue him and he wasn't hurt, but he was quite subdued for a day or two. I've written about all our dogs, so I know I've told you about Huck, who was probably the sweetest dog I've ever known.
Z's homes – Seaview – the garden – the kitchen gardens. Probably Part 1 of ?
I lived here from the age of three or four until I got married. I don't remember the move at all, so probably was the younger age – all I remember was walking along the passageway in our flat at the hotel and seeing my parents' four poster bed being dismantled. That was unusual enough to stick in my memory. But I know nothing about the move itself or arriving at the house.
It was built by my grandparents in 1912 and my father wasn't born there, but lived there on and off. I've written before in "the family story" about his parents' divorce when he was five when, with his father serving in the army during the first world war, his mother took up with another man and had to leave when she became pregnant by him. Daddy was farmed out rather, to grandparents, godparents and boarding school until his father returned and he could spend holidays at home again.
An early memory is of our gardener, Mr Weavers (pronounced locally as Weevus) coming in for his elevenses, when I could hardly understand a word he said in his broad accent. He was a kind man and a very good gardener. We had many greenhouses, most of them brick-built to the staging, two of them hothouses. Water was piped into tanks in those two so that it would be warmed and not a shock to the plants.
To this day, I love an old greenhouse. Whenever I visit a grand house and garden, I'm always keen to check out the kitchen garden and hope that there will be the original greenhouses. We had five brick ones and two aluminium ones, one of which was at least 30 feet long and took up half of the length of a bed in the kitchen garden. It was on tracks and I am not sure whether the purpose was to start tomatoes in its shelter and then move the greenhouse along to leave them outside, then plant something like potatoes for the autumn, or whether it was just moved back and forth each year so that disease didn't build up in the soil. I do know that my parents were intensely interested in gardening, and keen to get stuck in – but the kitchen garden in particular was Mr Weavers' domain and they weren't allowed to do much there, so they had a spare bit of land dug up for their use, where the seventh greenhouse was put. There was a half bricked conservatory as well, by the way, which had a grille in the floor for steam to come up when the furnace was lit in the winter. This had an outside door but was reached from the inside through the dining room.
The kitchen garden was huge. Three houses were eventually built on it – big houses, but with long, narrow gardens. The house is by Oulton Broad, but set well back from the river. The lower lawn flooded – presumably it still does – in the winter and, in any case, the building line has been preserved. The kitchen garden had six, I think, beds running from east to west, which must have been about ten or twelve feet wide and maybe fifty feet long. This is a guess, but I know they were longer than mine here, which are four feet by about thirty-eight. We grew all our vegetables, as well as flowers and fruit. The kitchen garden was separated, for most of its length, by a tall hedge. I think it was yew – evergreen, certainly, and I think it was some sort of conifer. Not privet, I know. At the top, by the drive, there was a white picket fence. As you went through the gate of that fence, at the right hand side next to the hedge, there was the pump house to your right and one of the beds to your left, with the left-hand end of the first hothouse straight ahead, along a concrete path. The pump house housed – wait for it – the pump which drew water from the 60 foot deep artesian well right up to the tanks in the attic. There were four of them, each holding 250 gallons of water. The water was pure and there was no need for chlorine or anything else.
In my grandparents' day, there were several gardeners, but we just had Mr Weavers and occasionally someone to help with some heavy work. He was always "Mr" Weavers to us. My father would call him by his first name, Willy, but no one ever called him just by his last name. They thought it disrespectful, though it was not at all unusual in those days. "Tradesmen' and "servants" were often called by their last name, if men, or first name if women. Not in our house. "Mr Malcolm always gives a fellow a handle to his name," someone doing some work for us was heard to say, and he was liked for it.
When I married Russell, his parents' maid Hilda still called him Master Russell. I was Mrs Russell, of course and, back in those days of my childhood, my mother was Mrs Malcolm. Winkie and I weren't Miss, though – the world had moved on a bit, even in the late 1950s.
I could go on for ages about the garden alone. Drop a gentle hint when it's time to move on, darlings, won't you.
Weymouth people
I didn't explain about my sister staying on in Weymouth after we left. My grandfather lived there and so she stayed with him at weekends. During the school week, she stayed with great friends of my parents. They had three daughters; the eldest was Roseanne, who was the same age as Wink. Vicky was the same age as me and Sally was in the middle. The parents were Richard and Maureen. The arrangement worked well, it seems – as I said, Wink was happy at school and at her temporary homes and so was everyone else, but there wasn't any real reason for her to stay at that school in the long term, so she came back to join us.
There aren't all that many people I remember from the days I lived in Weymouth and, any that I do were all people I knew later. I had a nursemaid called Violet, but I don't remember her at all. My mother worked full-time, and then some, in the hotel during the summer and she couldn't look after me too. There was a waiter who apparently adored babies and often looked after me. It sounded as if he really missed his home life. He had sisters and baby nephews and nieces and he used to help with washing and ironing and so on – my mum was embarrassed because of underwear, but he said it reminded him of home, his sisters and mum. He used to take a piece of cloth and wrap it round baby Z and himself and carry me round for hours. He said babies love being swaddled as it makes them secure and they can hear the heartbeat of the one carrying them.
Opposite the hotel was a row of cottages and, in one of them, lived a retired couple. She was known as Auntie Carter and he was Uncle Tom Carter – of course, in those days, all grown-up friends of parents were honorary uncles and aunts. Since I didn't have too many relations, this didn't seem odd to me. Uncle Tom Carter was a retired policeman. That picture "Nine Pints of the Law' – they had a print of it hanging on the wall. As a child, I assumed it was the original and very funny. I remember very little about Auntie Carter, but she was something of a mother figure to my mum, who had never had one, to remember. There was one story, though, about her.
When she was a child, she lived quite near Thomas Hardy, the writer. Auntie Carter (I have no idea what her first name was) used to meet him, out walking with her mother, quite regularly. Auntie C was tall, even as a girl, a lot taller than her mum. Every single time they met, Thomas Hardy cracked the same joke – "You're a naughty girl, to look down on your mother." Yeah. Passable once only. Still, a lot more cheerful than any of his books.
Mr Dyke was the hotel pastry chef. They kept key staff on during the winter, even when the hotel was shut and, as he'd been a loyal member of staff for all the years they were there, my parents bought him a guest house – an outright gift – when they left. When we went back to visit my grandfather, we always stayed there. He also made us a huge Christmas pudding and iced Christmas cake every year, which no one enjoyed – far too rich and dark, yet rather dry. I don't know how he managed it, because I like both now. Anyway, he was a lovely man with a white moustache and we were all fond of him. Sadly, when he decided to retire and sold the guest house, he went to a financial manager who gave him dreadful advice and he was persuaded to invest his money in something speculative and lost the lot. He was terribly embarrassed to tell my father about it.
Here are some photos – the first two are my sister and me as babies (and this isn't the first time I've posted them) – there are very few photos of me, being the younger. As my mother used to put it, I was bonny but Wink was beautiful, and I can't deny it at all. She wasn't being unkind or off-putting, simply truthful. The third photo is, I think, taken in Uncle Tom and Auntie Carter's house.
Z's homes – the hotel
Well, unsurprisingly, I have written about our move here. I've written about most things. Here you are http://razorbladeoflife.co.uk/uncategorized/30-years-on/.
As I said, I've lived here more than half my life, but I have lived in five other places, though I hardly remember the first.
I know I have written before about my parents' hotel just outside Weymouth. It's gone downhill, I'm afraid. It was bought by Fred Pontin and run as a holiday camp for many years, then sold on a couple of times – I've just looked up reviews and they aren't great. But the hotel itself is spectacular, and here's a link to the Wiki photo of it. https://en.wikipedia.org/wiki/Riviera_Hotel,_Weymouth#/media/File:Uk_dor_bowleaze.JPG
Isn't that an amazing example of Art Deco? My mother used to say that the ballroom was the biggest unsupported (by pillars or walls) of any room in the country at that time. I don't remember it, though. I was a small child when we left. I remember the drive outside, which was gravelled and I got my tricycle stuck. I pedalled away, and the trike didn't move.
Most of what I know has been told to me. Like the 1947 floods, when a lot of holidaymakers in caravans on the hill behind the hotel were flooded out. They took refuge in the hotel, where my parents looked after them. It was the off season; March, and there was still rationing and stocks were low, but they gave everyone a room and food, though the hotel itself was flooded too. Afterwards, everyone was very grateful, but no one was asked for any money. They received two letters of thanks afterwards, one enclosing a cheque, though they'd looked after hundreds of people.
My father wasn't really cut out to be a hotelier. He was much better as a host. My mother said that she'd done every job in the hotel except barmaid and he'd done every job except clean the rooms. It wasn't unknown, after licensing hours, when he could no longer charge for any drinks – giving them away was fine, of course – for him to pile the stalwarts down to the kitchen to carve slices of ham and make midnight sandwiches.
They were both acutely interested in food and cookery and great fans of Elizabeth David, whose first book was published in 1950. All my childhood, we were the first to try any "new" food – which includes such standards (nowadays) as aubergine, avocado and muesli, but also dishes such as jambalaya and gumbo, pad Thai and ceviche. It was a family hotel, which didn't stop them doing quite adventurous food, for its time. My father bought my mother a sewing machine once. She wanted a basic Singer, but he loved a good gadget and bought one that did embroidery and all sorts of things. He used those gizmos; she made straightforward clothes and curtains. Once, they were doing an elaborate Chinese meal and he obtained a bolt of cream-coloured silk. He looked up the Mandarin characters for 'bon appétit' and cut up the silk, hemmed them and embroidered the characters in red. We only had a few of these napkins left when I was a child, though he'd made 100 of them, and I haven't any of them now, to my regret. I couldn't find any after my mother died.
My father had a motorbike, when there was petrol rationing, though he once came a cropper along the half-mile drive from the road to the hotel, and broke his arm quite badly. My mother had tried to ride it, in the huge ballroom, but couldn't get the hang of the handlebar controls and crashed into a pile of chairs at the end of the room. No harm done, but she never tried again. She always claimed to be hopeless with anything mechanical, though she acknowledged that she chose to be unable to cope with a job she really didn't want to get stuck with forever.
My parents didn't take a salary, just their board and lodging. In theory, they took the profits, but in fact, though they made good money in the summer months, they lost it in the winter with the unavoidable overheads. They kept on their best staff, though only had occasional events to be catered for, and they were fairly naive about business.
I've always been a bit hazy about my age when we left, I was either three or four. My sister was left behind to start with, as she was settled and happy at school, but eventually she joined us at my father's family home in Oulton Broad.
Some people called round this evening with china for the next auction – the last, we're now full. John asked how long I'd lived here, which made me think of the date. It will be 33 years tomorrow. I have lived here more than half my life. That has made me stop and think about it for a bit.
I tend to work things out numerically, just for the sake of it. Like when I was exactly a third of a century – I acknowledge that I didn't work out all the leap years of my life, though the year in question happened to be a leap year; so 33 years, 122 days was not too hard. I also knew the day I'd outlived my father's age, which was 59 years, 6 months and 2 weeks. And so on – I was surprised to discover that not everyone does this sort of thing. I remember when I was a child, counting up exactly how old I'd be on the 1st January 2000.
But anyway, 23rd July, 1986. The day before Ronan's second birthday. I've probably reminisced about the move before, but it may just be that I'll do it again.
Pictures of chickens
Having a drink
I seem to have worked out how to add pictures, though it needs a bit more comprehension on my part to get them as I want them – anyway, here are some of the most recent photos (we've moved the run since then, so they have grass again), followed by a repeat of a very early one. You'd hardly think those little yellow fluffs had changed that much in four weeks.
The big hens have been to visit the house a few times now. I always did love it, back in the old days, when that happened, and missed them when I had to shut them in. On this occasion, I didn't happen to have any corn but I had found the remains of a packet of pine nuts in the fridge. They seemed happy with that, as well they might be.
I've put a piece of board jutting over the run, so that I can put some food down without having always to clamber over the wire and crawl into the coop, whilst keeping it dry. Rummy thinks it's a splendid viewing platform. None of the cats has ever gone for a chicken, though I wouldn't trust a cat with a chick. Of course, the end has to be weighted down and I use a full watering can, which weighs a lot more than Rummy does. About twice as much, in fact. I've put a bigger board down today, so that they can have a feeder with chick crumbs and another with mixed corn (they're too young for layer's pellets) which was mostly for Canasta to start with, but they're gradually moving on to it. I've also ordered more grit, having been surprised by how much they eat of it. The grit I provide for the other chickens (though they can eat whatever earth or stones they like outdoors) has oyster shell in it which, again, isn't suitable for a growing chick though it's ideal for a laying hen.
Yesterday, Polly – Rose's black bantam – legged it out of the greenhouse as soon as I'd opened the door of their shed. I suspected she'd gone to lay an egg, but I didn't know in which direction she'd gone. I'm reasonably sure she is laying somewhere, but these bantams have always been notorious for laying away. I thought that today, I'd keep the greenhouse door shut until I was ready to follow her. Sure enough, she strode out as soon as she could. She turned right. Fair enough, I hadn't looked for eggs that way. Then she turned left. Ah. I observed from a distance. She went to share the barn cats' breakfast. Unlike the big hens, she didn't intimidate the cats and one ate from one side of the plate while she helped herself from the other. I don't know whether it's what she does every day – which is pretty smart if she does – or if she is actually laying away and just wasn't quite ready yet. I'll keep watching … and report back, obvs.
Next post will be about something other than chickens. I'm sure it will. I have a life, don't I?
……answers on a postcard…
Update at the Zedery
I haven't written because not much has happened. I used to write regardless of whether I had anything to say, which might have made me more inventive and entertaining, or might have been deadly dull: I can't judge that without looking through years of daily posts and I don't think I'm up for that.
The chicks are still doing well and I have an admission to make – which hasn't gone out on Facebook or anywhere else; only Tim and Wince know; which is that Scrabble is sitting on more eggs. Rose always says she's unreliable and she did leave them for a little while yesterday, but she has been sitting for over a week. She had been scooting off to lay an egg as soon as I released the chooks from the henhouse each morning, but when I dished my foot, I disregarded numbers for a few days, so didn't notice that she wasn't returning at night.
The coop is ready, I'll put her in it in another couple of days and, if she is unhappy enough to abandon the eggs, she will be let out again. If she stays, she's in it for the duration. I think she's sitting on eight eggs, so probably six chicks at most, which will hatch early next month.
I think we've got at least three, probably four, hopefully not more cock chicks. One of my favourites is, I'm sure, a boy, so I must not have favourites as we can't keep any boys. They're all doing very well. Wince and I moved the run yesterday, so they've got fresh grass, and I tried releasing Canasta, but she was so unhappy that I put her back. Good mummy.
I've tried to add photos but, though I can upload them, I am only given the options to delete or unselect them. Perhaps WordPress will get its act together and iron out this glitch. In the meantime, I can only suggest you befriend me on Facebook, which I know some of you object to on principle, not without reason. I'll try again tomorrow.
On the seventh day…
The end of the week was gratefully reached. After driving well over 300 miles in three days, when I often don't go that far in a month (and that's when Tim and I go to Reading), and an early start and late finish yesterday, I didn't want to do anything nor go anywhere today. I took Rose to the bus station yesterday at 6 am, for the start of her visit to her West Indian family, and picked Ro and family from the airport, which should have been at 9 pm but the plane was late and it was 10.15 by the time they were out, and over an hour later before I got home again. So, apart from making a loaf of bread, I've been thoroughly lazy today.
I must take more photos of the chicks. Their plumage has changed over the last few days, the final fluff gone and more colours coming out. The brown showed first, but now there are black and white feathers on some of them too. They're very pretty. The run that Tim and I made for them is plenty big enough, though Canasta has dug a lot of holes in it – it's charming to watch them dustbath, but she's gone rather further than strictly necessary. Perhaps we'll be able to move the whole thing in the next few days, they'd certainly appreciate it. Canasta is still happy to be with them, but we'll probably take her out in the next week or two, when she'll be ready to join the others. Things have changed since she became broody, because Rose's chickens have joined ours in the henhouse to roost. Rose had enough on her plate and it's no extra bother to shut them all up together. In fact, it's less than one of use shutting them in two different places. I'm sure Canasta will catch on pretty quickly. And Jenga, the cockerel, will soon make sure she troops in with the others.
I was very relieved yesterday, when Betty, the feral girl cat, turned up to be fed in the evening. I hadn't seen her since we got home, which was only a week but long enough for me to start to worry. She's more independent than her brothers, so I thought she'd be all right, but father RasPutin had come for food a couple of times, so wild food couldn't have been in that great supply. I'm sure that the mother cat and Zain, the tabby ex-kitten, found families to live with, because they wanted to be pets and were very tame and friendly, but none of the three remaining siblings will ever be adopted. They're all cautious, though all allow me to stroke them now and are as fond of me as they are able to be. I'm fond of them too, but don't think of them as pets. It doesn't mean I don't care or get anxious, though.
The Unobservant Eye of Z
Dramatis personae:
My husband, Lovely Tim or LT for short (though he is actually tall).
My late husband, the Sage, aka Russell.
My children: Dearest daughter Weeza, who has London Ways, is married to Phil. Their daughter is Zerlina Buttercup and their son is Augustus Bufo. Elder son - Al X, is married to Dilly. Their children are Squiffany Virgilia, Maximus Pugsley and Hadrian Swallow. Younger son - Ro married to Dora and their three-year-old is Rufus Russell. His little sister Perdita Hedera was born on 29th January 2020.
Big Sister: Wink. She lives in Wiltshire, 230 miles away, but we're much closer than that and we really will be closer soon, as she's coming to live in the annexe next door.
We live with our cat Eloise, a black tortoiseshell half-Ragdoll, who has just had her second replacement knee operation.
Bantams live in the garden and cats live in the barns but we feed them and they have ambitions to be pets too. In addition, cows come to visit in the summer. Mostly, they stay in the fields. None of them has got a hoof in the door yet, but it's only a matter of time.
Z's blogroll
Updating takes too much memory, sorry - but then I'm not very young any more, so am hanging on to the memory I've got. Please don't look for any significance in the order - I'm not drunk but I am disorderly.
Vicus
Blue Witch
Mike & Ann
Allotment Queen
Compostwoman
Sir Bruin
Liz, the Small Bear
PixieMum Madeleine
Wendz
Vagabonde
Sablonneuse
Debum
Pontillius
If you're looking for your name here and don't see it, I do read your blog but you haven't left a comment here yet - if I put down all the blogs I read, we'd both be here all night.
The best bit – comments
Ponita on Z fails to draw part 8
Scarlet on Z fails to draw part 8
Z on Z fails to draw – part 4 – the twist
Z on Zoë fails to draw 6 – a horse of a different colour
Z on Z fails to draw 7 – Z has fun
Z fails to draw part 8
Wink's op
Z fails to draw 7 – Z has fun
Zoë fails to draw 6 – a horse of a different colour
In case we are nostalgic
Oh, what's the problem? This is hardly Great Literature. I'd appreciate anything taken from here being acknowledged, and I might change my mind if I'm suddenly proclaimed as the Literary Queen of the Blogosphere - but I probably wouldn't. Do what you like, just as long as it doesn't extend to defamation of anyone, even me.
Actually, you want to pass off what I say as your own, I might even be flattered. Let's face it, who cares anyway?


text:
07/12/2019 Liebherr and Shanghai Diesel announce cooperation
Liebherr and Shanghai Diesel cooperate on the development of new high-performance engines
Liebherr supplies hydraulic injection systems for use in decentralised power generation (genset)
The Shanghai Diesel Engine Co. Ltd., a subsidiary of China's largest vehicles and components manufacturer, SAIC Motor Corporation Limited, and Liebherr Components have entered an agreement for the development of new high-performance off-highway engines.
Commissioning ceremony for the Shanghai Diesel 25K engine platform.
As part of this agreement, Liebherr will initially supply hydraulic common rail injection components for use in Shanghai Diesel engines. This involves the 6-cylinder in-line engines of the newly-developed 6KTAA25-G3 series (25K) with a maximum power output of 780 kW and cylinder capacity of 25 litres.
"The strong demand for high-performance engines for power generation has encouraged us to develop a completely new engine series," says Yong Chen, Vice-President of Shanghai Diesel Engine Co. Ltd. "Therefore, we place great importance on the use of up-to-date injection components with the highest quality standards. The hydraulic components from Liebherr are ideally dimensioned for high-performance engines. Looking to the future, they will ensure that our new engine generation further keeps pace with the growing demands on fuel consumption and emissions."
Common rail system for Shanghai Diesel genset engines.
One of the major advantages of Liebherr injection systems is that the compact injectors feature a high output per cylinder. For example, the LI2 side-feed injector with a 9 mm injection nozzle enables an outstandingly high hydraulic flow rate within a compact design. "Our tailor-made injection components allow us to serve engines in a particularly high-performance segment. Our injectors and pumps are also compatible with engine control units from other manufacturers, such as is the case with the engines of Shanghai Diesel," explains Richard Pirkl, Managing Director Engineering & Production for the Common Rail Systems business unit at Liebherr. The common rail system and the engine control for the 6KTAA25-G3 series are handled by Shanghai Diesel's sourcing engine control units and software. Thanks to the standardised interfaces, the modular injection components from Liebherr can be seamlessly integrated in third-party control circuits.
"Thanks to the cooperation with Shanghai Diesel we have acquired another strong partner on the Chinese market," explains Pirkl. "We are very proud to have convinced another key player among the Chinese engine manufacturers of the Liebherr injection systems and look forward to build further on this cooperation."
Press Information German (PDF, 104 KB)
Images (ZIP, 3.0 MB)
Alexandra Nolde
Senior Communication & Media Specialist
Liebherr-Components AG
Kirchweg 46
5415 Nussbaumen/AG
Phone+41 562 9643-26
Fax+41 562 9643-01


text:
Sport Africa
Jersey survival is 'bare minimum' for director Ben Harvey
http://www.bbc.com/sport/rugby-union/19353434
Surviving in the Championship is the bare minimum for Jersey, says the club's director of rugby Ben Harvey.
The islanders are preparing for their first season in the second tier after four promotions in five years.
The size of the St Peter ground would prevent Jersey from an unlikely further promotion, but Harvey is keen for his side to continue their progress.
"I'm not setting targets but at the bare minimum we want to stay in the league," he said.
"I think it's realistic that we can sustain the Championship. I think it's sustainable as a club in terms of rugby but also as a business.
We're going to make sure that we're competitive in every game and go out there to win every single game we can
Ben Harvey Jersey
"If you're thinking along the lines of sustaining the Championship, then you should be looking along the lines of sustaining the Premiership, and building a stadium has got to be the goal in years to come."
Jersey have improved facilities at their St Peter ground over the summer with a new terrace for up to 1,000 fans.
The capacity has also been increased in front of the clubhouse as officials try to keep up with the pace of the success on the pitch.
"Huge credit goes to the lads that have been involved because at the end of the day they are the ones who have got us here," Harvey told BBC Radio Jersey.
"I have no reason to see why they can't go on to do bigger and better things again.
"I'm not going to set any targets this year, so we just keep looking forward as a club, and hopefully make sure we do ourselves proud as we've done in every year.
"We're going to make sure that we're competitive in every game and go out there to win every single game we can."
Former Jersey players including Nathan Kemp and England international Matt Banahan have tipped the club to impress in the Championship.
The islanders start their Championship campaign on Saturday, 1 September at home against Cornish Pirates.
Jersey Rugby Club
Read more on Jersey Rugby Club
Read more on England take series lead with huge win
Read more on England call up eight uncapped players
Dempsey aims for mid-table spot
Read more on Dempsey aims for mid-table spot
Banahan backs Jersey to succeed
Read more on Banahan backs Jersey to succeed
Jersey will get stronger - Kemp
Read more on Jersey will get stronger - Kemp
Jersey hope ground will be ready
Read more on Jersey hope ground will be ready