text:
#include "config.h"

#if ENABLE(JIT)
#include "JIT.h"

// This probably does not belong here; adding here for now as a quick Windows build fix.
#if ENABLE(ASSEMBLER) && CPU(X86) && !OS(MAC_OS_X)
#include "MacroAssembler.h"
JSC::MacroAssemblerX86Common::SSE2CheckState JSC::MacroAssemblerX86Common::s_sse2CheckState = NotCheckedSSE2;
#endif

#include "CodeBlock.h"
#include "DFGCapabilities.h"
#include "Interpreter.h"
#include "JITInlines.h"
#include "JITStubCall.h"
#include "JSArray.h"
#include "JSFunction.h"
#include "LinkBuffer.h"
#include "Operations.h"
#include "RepatchBuffer.h"
#include "ResultType.h"
#include "SamplingTool.h"
#include "SlowPathCall.h"
#include <wtf/CryptographicallyRandomNumber.h>

using namespace std;

namespace JSC {

void ctiPatchNearCallByReturnAddress(CodeBlock* codeblock, ReturnAddressPtr returnAddress, MacroAssemblerCodePtr newCalleeFunction)
{
    RepatchBuffer repatchBuffer(codeblock);
    repatchBuffer.relinkNearCallerToTrampoline(returnAddress, newCalleeFunction);
}

void ctiPatchCallByReturnAddress(CodeBlock* codeblock, ReturnAddressPtr returnAddress, MacroAssemblerCodePtr newCalleeFunction)
{
    RepatchBuffer repatchBuffer(codeblock);
    repatchBuffer.relinkCallerToTrampoline(returnAddress, newCalleeFunction);
}

void ctiPatchCallByReturnAddress(CodeBlock* codeblock, ReturnAddressPtr returnAddress, FunctionPtr newCalleeFunction)
{
    RepatchBuffer repatchBuffer(codeblock);
    repatchBuffer.relinkCallerToFunction(returnAddress, newCalleeFunction);
}

JIT::JIT(VM* vm, CodeBlock* codeBlock)
    : JSInterfaceJIT(vm, codeBlock)
    , m_interpreter(vm->interpreter)
    , m_labels(codeBlock ? codeBlock->numberOfInstructions() : 0)
    , m_bytecodeOffset((unsigned)-1)
    , m_propertyAccessInstructionIndex(UINT_MAX)
    , m_byValInstructionIndex(UINT_MAX)
    , m_callLinkInfoIndex(UINT_MAX)
#if USE(JSVALUE32_64)
    , m_jumpTargetIndex(0)
    , m_mappedBytecodeOffset((unsigned)-1)
    , m_mappedVirtualRegisterIndex(JSStack::ReturnPC)
    , m_mappedTag((RegisterID)-1)
    , m_mappedPayload((RegisterID)-1)
#else
    , m_lastResultBytecodeRegister(std::numeric_limits<int>::max())
    , m_jumpTargetsPosition(0)
#endif
    , m_randomGenerator(cryptographicallyRandomNumber())
#if ENABLE(VALUE_PROFILER)
    , m_canBeOptimized(false)
    , m_shouldEmitProfiling(false)
#endif
{
}

#if ENABLE(DFG_JIT)
void JIT::emitEnterOptimizationCheck()
{
    if (!canBeOptimized())
        return;

    Jump skipOptimize = branchAdd32(Signed, TrustedImm32(Options::executionCounterIncrementForEntry()), AbsoluteAddress(m_codeBlock->addressOfJITExecuteCounter()));
    JITStubCall stubCall(this, cti_optimize);
    stubCall.addArgument(TrustedImm32(m_bytecodeOffset));
    ASSERT(!m_bytecodeOffset);
    stubCall.call();
    skipOptimize.link(this);
}
#endif

#define NEXT_OPCODE(name) \
    m_bytecodeOffset += OPCODE_LENGTH(name); \
    break;

#if USE(JSVALUE32_64)
#define DEFINE_BINARY_OP(name) \
    case op_##name: { \
        JITSlowPathCall slowPathCall(this, currentInstruction, slow_path_##name); \
        slowPathCall.call(); \
        NEXT_OPCODE(op_##name); \
    }

#define DEFINE_UNARY_OP(name) \
    case op_##name: { \
        JITSlowPathCall slowPathCall(this, currentInstruction, slow_path_##name); \
        slowPathCall.call(); \
        NEXT_OPCODE(op_##name); \
    }

#else // USE(JSVALUE32_64)

#define DEFINE_BINARY_OP(name) \
    case op_##name: { \
        JITSlowPathCall slowPathCall(this, currentInstruction, slow_path_##name); \
        slowPathCall.call(); \
        NEXT_OPCODE(op_##name); \
    }

#define DEFINE_UNARY_OP(name) \
    case op_##name: { \
        JITSlowPathCall slowPathCall(this, currentInstruction, slow_path_##name); \
        slowPathCall.call(); \
        NEXT_OPCODE(op_##name); \
    }
#endif // USE(JSVALUE32_64)

#define DEFINE_OP(name) \
    case name: { \
        emit_##name(currentInstruction); \
        NEXT_OPCODE(name); \
    }

#define DEFINE_SLOWCASE_OP(name) \
    case name: { \
        emitSlow_##name(currentInstruction, iter); \
        NEXT_OPCODE(name); \
    }

void JIT::privateCompileMainPass()
{
    Instruction* instructionsBegin = m_codeBlock->instructions().begin();
    unsigned instructionCount = m_codeBlock->instructions().size();

    m_callLinkInfoIndex = 0;

    for (m_bytecodeOffset = 0; m_bytecodeOffset < instructionCount; ) {
        if (m_disassembler)
            m_disassembler->setForBytecodeMainPath(m_bytecodeOffset, label());
        Instruction* currentInstruction = instructionsBegin + m_bytecodeOffset;
        ASSERT_WITH_MESSAGE(m_interpreter->isOpcode(currentInstruction->u.opcode), "privateCompileMainPass gone bad @ %d", m_bytecodeOffset);

#if ENABLE(OPCODE_SAMPLING)
        if (m_bytecodeOffset > 0) // Avoid the overhead of sampling op_enter twice.
            sampleInstruction(currentInstruction);
#endif

#if USE(JSVALUE64)
        if (atJumpTarget())
            killLastResultRegister();
#endif

        m_labels[m_bytecodeOffset] = label();

#if ENABLE(JIT_VERBOSE)
        dataLogF("Old JIT emitting code for bc#%u at offset 0x%lx.\n", m_bytecodeOffset, (long)debugOffset());
#endif

        OpcodeID opcodeID = m_interpreter->getOpcodeID(currentInstruction->u.opcode);

        if (m_compilation) {
            add64(
                TrustedImm32(1),
                AbsoluteAddress(m_compilation->executionCounterFor(Profiler::OriginStack(Profiler::Origin(
                    m_compilation->bytecodes(), m_bytecodeOffset)))->address()));
        }

        switch (opcodeID) {
        DEFINE_BINARY_OP(del_by_val)
        DEFINE_BINARY_OP(in)
        DEFINE_BINARY_OP(less)
        DEFINE_BINARY_OP(lesseq)
        DEFINE_BINARY_OP(greater)
        DEFINE_BINARY_OP(greatereq)
        DEFINE_UNARY_OP(is_function)
        DEFINE_UNARY_OP(is_object)
        DEFINE_UNARY_OP(typeof)

        DEFINE_OP(op_add)
        DEFINE_OP(op_bitand)
        DEFINE_OP(op_bitor)
        DEFINE_OP(op_bitxor)
        DEFINE_OP(op_call)
        DEFINE_OP(op_call_eval)
        DEFINE_OP(op_call_varargs)
        DEFINE_OP(op_catch)
        DEFINE_OP(op_construct)
        DEFINE_OP(op_get_callee)
        DEFINE_OP(op_create_this)
        DEFINE_OP(op_to_this)
        DEFINE_OP(op_init_lazy_reg)
        DEFINE_OP(op_create_arguments)
        DEFINE_OP(op_debug)
        DEFINE_OP(op_del_by_id)
        DEFINE_OP(op_div)
        DEFINE_OP(op_end)
        DEFINE_OP(op_enter)
        DEFINE_OP(op_create_activation)
        DEFINE_OP(op_eq)
        DEFINE_OP(op_eq_null)
        case op_get_by_id_out_of_line:
        case op_get_array_length:
        DEFINE_OP(op_get_by_id)
        DEFINE_OP(op_get_arguments_length)
        DEFINE_OP(op_get_by_val)
        DEFINE_OP(op_get_argument_by_val)
        DEFINE_OP(op_get_by_pname)
        DEFINE_OP(op_get_pnames)
        DEFINE_OP(op_check_has_instance)
        DEFINE_OP(op_instanceof)
        DEFINE_OP(op_is_undefined)
        DEFINE_OP(op_is_boolean)
        DEFINE_OP(op_is_number)
        DEFINE_OP(op_is_string)
        DEFINE_OP(op_jeq_null)
        DEFINE_OP(op_jfalse)
        DEFINE_OP(op_jmp)
        DEFINE_OP(op_jneq_null)
        DEFINE_OP(op_jneq_ptr)
        DEFINE_OP(op_jless)
        DEFINE_OP(op_jlesseq)
        DEFINE_OP(op_jgreater)
        DEFINE_OP(op_jgreatereq)
        DEFINE_OP(op_jnless)
        DEFINE_OP(op_jnlesseq)
        DEFINE_OP(op_jngreater)
        DEFINE_OP(op_jngreatereq)
        DEFINE_OP(op_jtrue)
        DEFINE_OP(op_loop_hint)
        DEFINE_OP(op_lshift)
        DEFINE_OP(op_mod)
        DEFINE_OP(op_mov)
        DEFINE_OP(op_mul)
        DEFINE_OP(op_negate)
        DEFINE_OP(op_neq)
        DEFINE_OP(op_neq_null)
        DEFINE_OP(op_new_array)
        DEFINE_OP(op_new_array_with_size)
        DEFINE_OP(op_new_array_buffer)
        DEFINE_OP(op_new_func)
        DEFINE_OP(op_new_func_exp)
        DEFINE_OP(op_new_object)
        DEFINE_OP(op_new_regexp)
        DEFINE_OP(op_next_pname)
        DEFINE_OP(op_not)
        DEFINE_OP(op_nstricteq)
        DEFINE_OP(op_pop_scope)
        DEFINE_OP(op_dec)
        DEFINE_OP(op_inc)
        DEFINE_OP(op_profile_did_call)
        DEFINE_OP(op_profile_will_call)
        DEFINE_OP(op_push_name_scope)
        DEFINE_OP(op_push_with_scope)
        case op_put_by_id_out_of_line:
        case op_put_by_id_transition_direct:
        case op_put_by_id_transition_normal:
        case op_put_by_id_transition_direct_out_of_line:
        case op_put_by_id_transition_normal_out_of_line:
        DEFINE_OP(op_put_by_id)
        DEFINE_OP(op_put_by_index)
        DEFINE_OP(op_put_by_val)
        DEFINE_OP(op_put_getter_setter)
        case op_init_global_const_nop:
            NEXT_OPCODE(op_init_global_const_nop);
        DEFINE_OP(op_init_global_const)

        DEFINE_OP(op_ret)
        DEFINE_OP(op_ret_object_or_this)
        DEFINE_OP(op_rshift)
        DEFINE_OP(op_urshift)
        DEFINE_OP(op_strcat)
        DEFINE_OP(op_stricteq)
        DEFINE_OP(op_sub)
        DEFINE_OP(op_switch_char)
        DEFINE_OP(op_switch_imm)
        DEFINE_OP(op_switch_string)
        DEFINE_OP(op_tear_off_activation)
        DEFINE_OP(op_tear_off_arguments)
        DEFINE_OP(op_throw)
        DEFINE_OP(op_throw_static_error)
        DEFINE_OP(op_to_number)
        DEFINE_OP(op_to_primitive)

        DEFINE_OP(op_resolve_scope)
        DEFINE_OP(op_get_from_scope)
        DEFINE_OP(op_put_to_scope)

        case op_get_by_id_chain:
        case op_get_by_id_generic:
        case op_get_by_id_proto:
        case op_get_by_id_self:
        case op_get_by_id_getter_chain:
        case op_get_by_id_getter_proto:
        case op_get_by_id_getter_self:
        case op_get_by_id_custom_chain:
        case op_get_by_id_custom_proto:
        case op_get_by_id_custom_self:
        case op_get_string_length:
        case op_put_by_id_generic:
        case op_put_by_id_replace:
        case op_put_by_id_transition:
            RELEASE_ASSERT_NOT_REACHED();
        }
    }

    RELEASE_ASSERT(m_callLinkInfoIndex == m_callStructureStubCompilationInfo.size());

#ifndef NDEBUG
    // Reset this, in order to guard its use with ASSERTs.
    m_bytecodeOffset = (unsigned)-1;
#endif
}

void JIT::privateCompileLinkPass()
{
    unsigned jmpTableCount = m_jmpTable.size();
    for (unsigned i = 0; i < jmpTableCount; ++i)
        m_jmpTable[i].from.linkTo(m_labels[m_jmpTable[i].toBytecodeOffset], this);
    m_jmpTable.clear();
}

void JIT::privateCompileSlowCases()
{
    Instruction* instructionsBegin = m_codeBlock->instructions().begin();

    m_propertyAccessInstructionIndex = 0;
    m_byValInstructionIndex = 0;
    m_callLinkInfoIndex = 0;

#if ENABLE(VALUE_PROFILER)
    // Use this to assert that slow-path code associates new profiling sites with existing
    // ValueProfiles rather than creating new ones. This ensures that for a given instruction
    // (say, get_by_id) we get combined statistics for both the fast-path executions of that
    // instructions and the slow-path executions. Furthermore, if the slow-path code created
    // new ValueProfiles then the ValueProfiles would no longer be sorted by bytecode offset,
    // which would break the invariant necessary to use CodeBlock::valueProfileForBytecodeOffset().
    unsigned numberOfValueProfiles = m_codeBlock->numberOfValueProfiles();
#endif

    for (Vector<SlowCaseEntry>::iterator iter = m_slowCases.begin(); iter != m_slowCases.end();) {
#if USE(JSVALUE64)
        killLastResultRegister();
#endif

        m_bytecodeOffset = iter->to;

        unsigned firstTo = m_bytecodeOffset;

        Instruction* currentInstruction = instructionsBegin + m_bytecodeOffset;

#if ENABLE(VALUE_PROFILER)
        RareCaseProfile* rareCaseProfile = 0;
        if (shouldEmitProfiling())
            rareCaseProfile = m_codeBlock->addRareCaseProfile(m_bytecodeOffset);
#endif

#if ENABLE(JIT_VERBOSE)
        dataLogF("Old JIT emitting slow code for bc#%u at offset 0x%lx.\n", m_bytecodeOffset, (long)debugOffset());
#endif

        if (m_disassembler)
            m_disassembler->setForBytecodeSlowPath(m_bytecodeOffset, label());

        switch (m_interpreter->getOpcodeID(currentInstruction->u.opcode)) {
        DEFINE_SLOWCASE_OP(op_add)
        DEFINE_SLOWCASE_OP(op_bitand)
        DEFINE_SLOWCASE_OP(op_bitor)
        DEFINE_SLOWCASE_OP(op_bitxor)
        DEFINE_SLOWCASE_OP(op_call)
        DEFINE_SLOWCASE_OP(op_call_eval)
        DEFINE_SLOWCASE_OP(op_call_varargs)
        DEFINE_SLOWCASE_OP(op_construct)
        DEFINE_SLOWCASE_OP(op_to_this)
        DEFINE_SLOWCASE_OP(op_create_this)
        DEFINE_SLOWCASE_OP(op_div)
        DEFINE_SLOWCASE_OP(op_eq)
        case op_get_by_id_out_of_line:
        case op_get_array_length:
        DEFINE_SLOWCASE_OP(op_get_by_id)
        DEFINE_SLOWCASE_OP(op_get_arguments_length)
        DEFINE_SLOWCASE_OP(op_get_by_val)
        DEFINE_SLOWCASE_OP(op_get_argument_by_val)
        DEFINE_SLOWCASE_OP(op_get_by_pname)
        DEFINE_SLOWCASE_OP(op_check_has_instance)
        DEFINE_SLOWCASE_OP(op_instanceof)
        DEFINE_SLOWCASE_OP(op_jfalse)
        DEFINE_SLOWCASE_OP(op_jless)
        DEFINE_SLOWCASE_OP(op_jlesseq)
        DEFINE_SLOWCASE_OP(op_jgreater)
        DEFINE_SLOWCASE_OP(op_jgreatereq)
        DEFINE_SLOWCASE_OP(op_jnless)
        DEFINE_SLOWCASE_OP(op_jnlesseq)
        DEFINE_SLOWCASE_OP(op_jngreater)
        DEFINE_SLOWCASE_OP(op_jngreatereq)
        DEFINE_SLOWCASE_OP(op_jtrue)
        DEFINE_SLOWCASE_OP(op_loop_hint)
        DEFINE_SLOWCASE_OP(op_lshift)
        DEFINE_SLOWCASE_OP(op_mod)
        DEFINE_SLOWCASE_OP(op_mul)
        DEFINE_SLOWCASE_OP(op_negate)
        DEFINE_SLOWCASE_OP(op_neq)
        DEFINE_SLOWCASE_OP(op_new_object)
        DEFINE_SLOWCASE_OP(op_not)
        DEFINE_SLOWCASE_OP(op_nstricteq)
        DEFINE_SLOWCASE_OP(op_dec)
        DEFINE_SLOWCASE_OP(op_inc)
        case op_put_by_id_out_of_line:
        case op_put_by_id_transition_direct:
        case op_put_by_id_transition_normal:
        case op_put_by_id_transition_direct_out_of_line:
        case op_put_by_id_transition_normal_out_of_line:
        DEFINE_SLOWCASE_OP(op_put_by_id)
        DEFINE_SLOWCASE_OP(op_put_by_val)
        DEFINE_SLOWCASE_OP(op_rshift)
        DEFINE_SLOWCASE_OP(op_urshift)
        DEFINE_SLOWCASE_OP(op_stricteq)
        DEFINE_SLOWCASE_OP(op_sub)
        DEFINE_SLOWCASE_OP(op_to_number)
        DEFINE_SLOWCASE_OP(op_to_primitive)

        DEFINE_SLOWCASE_OP(op_resolve_scope)
        DEFINE_SLOWCASE_OP(op_get_from_scope)
        DEFINE_SLOWCASE_OP(op_put_to_scope)

        default:
            RELEASE_ASSERT_NOT_REACHED();
        }

        RELEASE_ASSERT_WITH_MESSAGE(iter == m_slowCases.end() || firstTo != iter->to, "Not enough jumps linked in slow case codegen.");
        RELEASE_ASSERT_WITH_MESSAGE(firstTo == (iter - 1)->to, "Too many jumps linked in slow case codegen.");

#if ENABLE(VALUE_PROFILER)
        if (shouldEmitProfiling())
            add32(TrustedImm32(1), AbsoluteAddress(&rareCaseProfile->m_counter));
#endif

        emitJumpSlowToHot(jump(), 0);
    }

    RELEASE_ASSERT(m_propertyAccessInstructionIndex == m_propertyAccessCompilationInfo.size());
    RELEASE_ASSERT(m_callLinkInfoIndex == m_callStructureStubCompilationInfo.size());
#if ENABLE(VALUE_PROFILER)
    RELEASE_ASSERT(numberOfValueProfiles == m_codeBlock->numberOfValueProfiles());
#endif

#ifndef NDEBUG
    // Reset this, in order to guard its use with ASSERTs.
    m_bytecodeOffset = (unsigned)-1;
#endif
}

ALWAYS_INLINE void PropertyStubCompilationInfo::copyToStubInfo(StructureStubInfo& info, LinkBuffer &linkBuffer)
{
    ASSERT(bytecodeIndex != std::numeric_limits<unsigned>::max());
    info.codeOrigin = CodeOrigin(bytecodeIndex);
    info.callReturnLocation = linkBuffer.locationOf(callReturnLocation);
    info.hotPathBegin = linkBuffer.locationOf(hotPathBegin);

    switch (m_type) {
    case GetById: {
        CodeLocationLabel hotPathBeginLocation = linkBuffer.locationOf(hotPathBegin);
        info.patch.baseline.u.get.structureToCompare = MacroAssembler::differenceBetweenCodePtr(hotPathBeginLocation, linkBuffer.locationOf(getStructureToCompare));
        info.patch.baseline.u.get.structureCheck = MacroAssembler::differenceBetweenCodePtr(hotPathBeginLocation, linkBuffer.locationOf(getStructureCheck));
        info.patch.baseline.u.get.propertyStorageLoad = MacroAssembler::differenceBetweenCodePtr(hotPathBeginLocation, linkBuffer.locationOf(propertyStorageLoad));
#if USE(JSVALUE64)
        info.patch.baseline.u.get.displacementLabel = MacroAssembler::differenceBetweenCodePtr(hotPathBeginLocation, linkBuffer.locationOf(getDisplacementLabel));
#else
        info.patch.baseline.u.get.displacementLabel1 = MacroAssembler::differenceBetweenCodePtr(hotPathBeginLocation, linkBuffer.locationOf(getDisplacementLabel1));
        info.patch.baseline.u.get.displacementLabel2 = MacroAssembler::differenceBetweenCodePtr(hotPathBeginLocation, linkBuffer.locationOf(getDisplacementLabel2));
#endif
        info.patch.baseline.u.get.putResult = MacroAssembler::differenceBetweenCodePtr(hotPathBeginLocation, linkBuffer.locationOf(getPutResult));
        info.patch.baseline.u.get.coldPathBegin = MacroAssembler::differenceBetweenCodePtr(linkBuffer.locationOf(getColdPathBegin), linkBuffer.locationOf(callReturnLocation));
        break;
    }
    case PutById:
        CodeLocationLabel hotPathBeginLocation = linkBuffer.locationOf(hotPathBegin);
        info.patch.baseline.u.put.structureToCompare = MacroAssembler::differenceBetweenCodePtr(hotPathBeginLocation, linkBuffer.locationOf(putStructureToCompare));
        info.patch.baseline.u.put.propertyStorageLoad = MacroAssembler::differenceBetweenCodePtr(hotPathBeginLocation, linkBuffer.locationOf(propertyStorageLoad));
#if USE(JSVALUE64)
        info.patch.baseline.u.put.displacementLabel = MacroAssembler::differenceBetweenCodePtr(hotPathBeginLocation, linkBuffer.locationOf(putDisplacementLabel));
#else
        info.patch.baseline.u.put.displacementLabel1 = MacroAssembler::differenceBetweenCodePtr(hotPathBeginLocation, linkBuffer.locationOf(putDisplacementLabel1));
        info.patch.baseline.u.put.displacementLabel2 = MacroAssembler::differenceBetweenCodePtr(hotPathBeginLocation, linkBuffer.locationOf(putDisplacementLabel2));
#endif
        break;
    }
}

CompilationResult JIT::privateCompile(JITCompilationEffort effort)
{
#if ENABLE(VALUE_PROFILER)
    DFG::CapabilityLevel level = m_codeBlock->capabilityLevel();
    switch (level) {
    case DFG::CannotCompile:
        m_canBeOptimized = false;
        m_canBeOptimizedOrInlined = false;
        m_shouldEmitProfiling = false;
        break;
    case DFG::CanInline:
        m_canBeOptimized = false;
        m_canBeOptimizedOrInlined = true;
        m_shouldEmitProfiling = true;
        break;
    case DFG::CanCompile:
    case DFG::CanCompileAndInline:
        m_canBeOptimized = true;
        m_canBeOptimizedOrInlined = true;
        m_shouldEmitProfiling = true;
        break;
    default:
        RELEASE_ASSERT_NOT_REACHED();
        break;
    }

    switch (m_codeBlock->codeType()) {
    case GlobalCode:
    case EvalCode:
        m_codeBlock->m_shouldAlwaysBeInlined = false;
        break;
    case FunctionCode:
        // We could have already set it to false because we detected an uninlineable call.
        // Don't override that observation.
        m_codeBlock->m_shouldAlwaysBeInlined &= canInline(level) && DFG::mightInlineFunction(m_codeBlock);
        break;
    }
#endif

    if (Options::showDisassembly() || m_vm->m_perBytecodeProfiler)
        m_disassembler = adoptPtr(new JITDisassembler(m_codeBlock));
    if (m_vm->m_perBytecodeProfiler) {
        m_compilation = adoptRef(
            new Profiler::Compilation(
                m_vm->m_perBytecodeProfiler->ensureBytecodesFor(m_codeBlock),
                Profiler::Baseline));
        m_compilation->addProfiledBytecodes(*m_vm->m_perBytecodeProfiler, m_codeBlock);
    }

    if (m_disassembler)
        m_disassembler->setStartOfCode(label());

    // Just add a little bit of randomness to the codegen
    if (m_randomGenerator.getUint32() & 1)
        nop();

    preserveReturnAddressAfterCall(regT2);
    emitPutToCallFrameHeader(regT2, JSStack::ReturnPC);
    emitPutImmediateToCallFrameHeader(m_codeBlock, JSStack::CodeBlock);

    Label beginLabel(this);

    sampleCodeBlock(m_codeBlock);
#if ENABLE(OPCODE_SAMPLING)
    sampleInstruction(m_codeBlock->instructions().begin());
#endif

    Jump stackCheck;
    if (m_codeBlock->codeType() == FunctionCode) {
#if ENABLE(DFG_JIT)
#if DFG_ENABLE(SUCCESS_STATS)
        static SamplingCounter counter("orignalJIT");
        emitCount(counter);
#endif
#endif

#if ENABLE(VALUE_PROFILER)
        ASSERT(m_bytecodeOffset == (unsigned)-1);
        if (shouldEmitProfiling()) {
            for (int argument = 0; argument < m_codeBlock->numParameters(); ++argument) {
                // If this is a constructor, then we want to put in a dummy profiling site (to
                // keep things consistent) but we don't actually want to record the dummy value.
                if (m_codeBlock->m_isConstructor && !argument)
                    continue;
                int offset = CallFrame::argumentOffsetIncludingThis(argument) * static_cast<int>(sizeof(Register));
#if USE(JSVALUE64)
                load64(Address(callFrameRegister, offset), regT0);
#elif USE(JSVALUE32_64)
                load32(Address(callFrameRegister, offset + OBJECT_OFFSETOF(JSValue, u.asBits.payload)), regT0);
                load32(Address(callFrameRegister, offset + OBJECT_OFFSETOF(JSValue, u.asBits.tag)), regT1);
#endif
                emitValueProfilingSite(m_codeBlock->valueProfileForArgument(argument), regT4);
            }
        }
#endif

        addPtr(TrustedImm32(-m_codeBlock->m_numCalleeRegisters * sizeof(Register)), callFrameRegister, regT1);
        stackCheck = branchPtr(Above, AbsoluteAddress(m_vm->interpreter->stack().addressOfEnd()), regT1);
    }

    Label functionBody = label();

    privateCompileMainPass();
    privateCompileLinkPass();
    privateCompileSlowCases();

    if (m_disassembler)
        m_disassembler->setEndOfSlowPath(label());

    Label arityCheck;
    if (m_codeBlock->codeType() == FunctionCode) {
        stackCheck.link(this);
        m_bytecodeOffset = 0;
        JITStubCall(this, cti_stack_check).call();
#ifndef NDEBUG
        m_bytecodeOffset = (unsigned)-1; // Reset this, in order to guard its use with ASSERTs.
#endif
        jump(functionBody);

        arityCheck = label();
        store8(TrustedImm32(0), &m_codeBlock->m_shouldAlwaysBeInlined);
        preserveReturnAddressAfterCall(regT2);
        emitPutToCallFrameHeader(regT2, JSStack::ReturnPC);
        emitPutImmediateToCallFrameHeader(m_codeBlock, JSStack::CodeBlock);

        load32(payloadFor(JSStack::ArgumentCount), regT1);
        branch32(AboveOrEqual, regT1, TrustedImm32(m_codeBlock->m_numParameters)).linkTo(beginLabel, this);

        m_bytecodeOffset = 0;

        JITStubCall(this, m_codeBlock->m_isConstructor ? cti_op_construct_arityCheck : cti_op_call_arityCheck).call(regT0);
        branchTest32(Zero, regT0).linkTo(beginLabel, this);
        emitNakedCall(m_vm->getCTIStub(arityFixup).code());

#if !ASSERT_DISABLED
        m_bytecodeOffset = (unsigned)-1; // Reset this, in order to guard its use with ASSERTs.
#endif

        jump(beginLabel);
    }

    ASSERT(m_jmpTable.isEmpty());

    if (m_disassembler)
        m_disassembler->setEndOfCode(label());

    LinkBuffer patchBuffer(*m_vm, this, m_codeBlock, effort);
    if (patchBuffer.didFailToAllocate())
        return CompilationFailed;

    // Translate vPC offsets into addresses in JIT generated code, for switch tables.
    for (unsigned i = 0; i < m_switches.size(); ++i) {
        SwitchRecord record = m_switches[i];
        unsigned bytecodeOffset = record.bytecodeOffset;

        if (record.type != SwitchRecord::String) {
            ASSERT(record.type == SwitchRecord::Immediate || record.type == SwitchRecord::Character);
            ASSERT(record.jumpTable.simpleJumpTable->branchOffsets.size() == record.jumpTable.simpleJumpTable->ctiOffsets.size());

            record.jumpTable.simpleJumpTable->ctiDefault = patchBuffer.locationOf(m_labels[bytecodeOffset + record.defaultOffset]);

            for (unsigned j = 0; j < record.jumpTable.simpleJumpTable->branchOffsets.size(); ++j) {
                unsigned offset = record.jumpTable.simpleJumpTable->branchOffsets[j];
                record.jumpTable.simpleJumpTable->ctiOffsets[j] = offset ? patchBuffer.locationOf(m_labels[bytecodeOffset + offset]) : record.jumpTable.simpleJumpTable->ctiDefault;
            }
        } else {
            ASSERT(record.type == SwitchRecord::String);

            record.jumpTable.stringJumpTable->ctiDefault = patchBuffer.locationOf(m_labels[bytecodeOffset + record.defaultOffset]);

            StringJumpTable::StringOffsetTable::iterator end = record.jumpTable.stringJumpTable->offsetTable.end();
            for (StringJumpTable::StringOffsetTable::iterator it = record.jumpTable.stringJumpTable->offsetTable.begin(); it != end; ++it) {
                unsigned offset = it->value.branchOffset;
                it->value.ctiOffset = offset ? patchBuffer.locationOf(m_labels[bytecodeOffset + offset]) : record.jumpTable.stringJumpTable->ctiDefault;
            }
        }
    }

    for (size_t i = 0; i < m_codeBlock->numberOfExceptionHandlers(); ++i) {
        HandlerInfo& handler = m_codeBlock->exceptionHandler(i);
        handler.nativeCode = patchBuffer.locationOf(m_labels[handler.target]);
    }

    for (Vector<CallRecord>::iterator iter = m_calls.begin(); iter != m_calls.end(); ++iter) {
        if (iter->to)
            patchBuffer.link(iter->from, FunctionPtr(iter->to));
    }

    m_codeBlock->callReturnIndexVector().reserveCapacity(m_calls.size());
    for (Vector<CallRecord>::iterator iter = m_calls.begin(); iter != m_calls.end(); ++iter)
        m_codeBlock->callReturnIndexVector().append(CallReturnOffsetToBytecodeOffset(patchBuffer.returnAddressOffset(iter->from), iter->bytecodeOffset));

    m_codeBlock->setNumberOfStructureStubInfos(m_propertyAccessCompilationInfo.size());
    for (unsigned i = 0; i < m_propertyAccessCompilationInfo.size(); ++i)
        m_propertyAccessCompilationInfo[i].copyToStubInfo(m_codeBlock->structureStubInfo(i), patchBuffer);
    m_codeBlock->setNumberOfByValInfos(m_byValCompilationInfo.size());
    for (unsigned i = 0; i < m_byValCompilationInfo.size(); ++i) {
        CodeLocationJump badTypeJump = CodeLocationJump(patchBuffer.locationOf(m_byValCompilationInfo[i].badTypeJump));
        CodeLocationLabel doneTarget = patchBuffer.locationOf(m_byValCompilationInfo[i].doneTarget);
        CodeLocationLabel slowPathTarget = patchBuffer.locationOf(m_byValCompilationInfo[i].slowPathTarget);
        CodeLocationCall returnAddress = patchBuffer.locationOf(m_byValCompilationInfo[i].returnAddress);

        m_codeBlock->byValInfo(i) = ByValInfo(
            m_byValCompilationInfo[i].bytecodeIndex,
            badTypeJump,
            m_byValCompilationInfo[i].arrayMode,
            differenceBetweenCodePtr(badTypeJump, doneTarget),
            differenceBetweenCodePtr(returnAddress, slowPathTarget));
    }
    m_codeBlock->setNumberOfCallLinkInfos(m_callStructureStubCompilationInfo.size());
    for (unsigned i = 0; i < m_codeBlock->numberOfCallLinkInfos(); ++i) {
        CallLinkInfo& info = m_codeBlock->callLinkInfo(i);
        info.callType = m_callStructureStubCompilationInfo[i].callType;
        info.codeOrigin = CodeOrigin(m_callStructureStubCompilationInfo[i].bytecodeIndex);
        info.callReturnLocation = patchBuffer.locationOfNearCall(m_callStructureStubCompilationInfo[i].callReturnLocation);
        info.hotPathBegin = patchBuffer.locationOf(m_callStructureStubCompilationInfo[i].hotPathBegin);
        info.hotPathOther = patchBuffer.locationOfNearCall(m_callStructureStubCompilationInfo[i].hotPathOther);
        info.calleeGPR = regT0;
    }

#if ENABLE(DFG_JIT) || ENABLE(LLINT)
    if (canBeOptimizedOrInlined()
#if ENABLE(LLINT)
        || true
#endif
        ) {
        CompactJITCodeMap::Encoder jitCodeMapEncoder;
        for (unsigned bytecodeOffset = 0; bytecodeOffset < m_labels.size(); ++bytecodeOffset) {
            if (m_labels[bytecodeOffset].isSet())
                jitCodeMapEncoder.append(bytecodeOffset, patchBuffer.offsetOf(m_labels[bytecodeOffset]));
        }
        m_codeBlock->setJITCodeMap(jitCodeMapEncoder.finish());
    }
#endif

    MacroAssemblerCodePtr withArityCheck;
    if (m_codeBlock->codeType() == FunctionCode)
        withArityCheck = patchBuffer.locationOf(arityCheck);

    if (Options::showDisassembly())
        m_disassembler->dump(patchBuffer);
    if (m_compilation) {
        m_disassembler->reportToProfiler(m_compilation.get(), patchBuffer);
        m_vm->m_perBytecodeProfiler->addCompilation(m_compilation);
    }

    CodeRef result = patchBuffer.finalizeCodeWithoutDisassembly();

    m_vm->machineCodeBytesPerBytecodeWordForBaselineJIT.add(
        static_cast<double>(result.size()) /
        static_cast<double>(m_codeBlock->instructions().size()));

    m_codeBlock->shrinkToFit(CodeBlock::LateShrink);
    m_codeBlock->setJITCode(
        adoptRef(new DirectJITCode(result, JITCode::BaselineJIT)),
        withArityCheck);

#if ENABLE(JIT_VERBOSE)
    dataLogF("JIT generated code for %p at [%p, %p).\n", m_codeBlock, result.executableMemory()->start(), result.executableMemory()->end());
#endif

    return CompilationSuccessful;
}

void JIT::linkFor(ExecState* exec, JSFunction* callee, CodeBlock* callerCodeBlock, CodeBlock* calleeCodeBlock, JIT::CodePtr code, CallLinkInfo* callLinkInfo, VM* vm, CodeSpecializationKind kind)
{
    RepatchBuffer repatchBuffer(callerCodeBlock);

    ASSERT(!callLinkInfo->isLinked());
    callLinkInfo->callee.set(*vm, callLinkInfo->hotPathBegin, callerCodeBlock->ownerExecutable(), callee);
    callLinkInfo->lastSeenCallee.set(*vm, callerCodeBlock->ownerExecutable(), callee);
    repatchBuffer.relink(callLinkInfo->hotPathOther, code);

    if (calleeCodeBlock)
        calleeCodeBlock->linkIncomingCall(exec, callLinkInfo);

    // Patch the slow patch so we do not continue to try to link.
    if (kind == CodeForCall) {
        ASSERT(callLinkInfo->callType == CallLinkInfo::Call
               || callLinkInfo->callType == CallLinkInfo::CallVarargs);
        if (callLinkInfo->callType == CallLinkInfo::Call) {
            repatchBuffer.relink(callLinkInfo->callReturnLocation, vm->getCTIStub(linkClosureCallGenerator).code());
            return;
        }

        repatchBuffer.relink(callLinkInfo->callReturnLocation, vm->getCTIStub(virtualCallGenerator).code());
        return;
    }

    ASSERT(kind == CodeForConstruct);
    repatchBuffer.relink(callLinkInfo->callReturnLocation, vm->getCTIStub(virtualConstructGenerator).code());
}

void JIT::linkSlowCall(CodeBlock* callerCodeBlock, CallLinkInfo* callLinkInfo)
{
    RepatchBuffer repatchBuffer(callerCodeBlock);

    repatchBuffer.relink(callLinkInfo->callReturnLocation, callerCodeBlock->vm()->getCTIStub(virtualCallGenerator).code());
}

} // namespace JSC

#endif // ENABLE(JIT)

redpajama_set_name: RedPajamaGithub


CAMDEN (WTXF) - Police in Camden are searching for a suspect after two men were discovered shot in a car in Camden on Wednesday night.
Deputies responded to the 2800 block of Constitution Road shortly after 10:00 p.m. for reports of a suspicious vehicle idling on the street.
When police investigated the vehicle, they found Tyrone Coleman, 33, and Ryan Tisby, 29, unresponsive and suffering from a gunshot wound.
Both men were taken to Cooper University Hospital where they were pronounced dead at 10:45 p.m.
Police are investigating this incident as a double homicide. No arrests have been made at this time.
Anyone with information can contact 856-225-8623.


text:
Safety inspections don't hurt profits
While businesses bemoan the cost of regulations, a new study suggests that government enforcement of workplace health and safety rules can save lives without sapping a company's bottom line.
By Sam Hananel | Updated on May 17, 2012
WASHINGTON (AP) — While businesses bemoan the cost of regulations, a new study suggests that government enforcement of workplace health and safety rules can save lives without sapping a company's bottom line.
The findings come from a decade-long look at hundreds of California work sites subject to random safety inspections. Researchers found that 9.4 percent of those companies reduced their injury claims with no discernible impact on profits.
Employers paying hidden costs for recruitment in tight labor market
Joel Kranc | January 27, 2023
The real-life mark-up on recruiting and employing one $15/hour employee for a year is around 63%.
Burnout among hiring pros a growing problem, many cite stress over inefficiencies
Scot Wooldridge | January 27, 2023
"There's a perfect storm brewing with HR leaders telling us they're missing key hires, missing critical cost-per-hire goals and losing team members left and right to burnout," says Findem CEO Hari Kolam.
Florida bans more state pension funds from investing in ESG
Jim Turner | January 27, 2023
Gov. Ron DeSantis has made changes that direct investment decisions to be based only on "pecuniary factors" and they can't include "social, political or ideological interests."

redpajama_set_name: RedPajamaCommonCrawl


Halloween is tomorrow and it's a great time to play with your makeup. Last year we had some fun and tried our hand at one of the MAC Halloween masks.
We chose to go with a floral mask even though we didn't have all of the exact shades specified in the look and we think it turned out pretty well for our first try. What do you think?
From left to right we have Unzipped, Fantasy Lace, Red Baroque and Half Tinned. Of course there are many more where this came from.
Is that a picture of you?
It does look nice. I like to put a pic with the blogger, hon…..


65 Piece Plan Threader hung suspended.
65 Plan Sheets belonging to Fatih District are attached to board at the C Block Ground Floor of Municipality of Fatih for 1 months on the date of 10/15/2012. In addition, you may see it on our official web page.
Historical Peninsula-Fatih District Reconstruction Plan and Notes for Protection are found suitable by the resolution no 788 and date of 7/25/2012 of İst. No IV Cultural Heritage Preservation Region Council, Resolution no 277 and date 9/19/2012 of the Cultural Heritage Preservation Region Council of Ist. No 1 Renovation Areas, and Resolution No 81 dated 10/2/2012 of the Cultural Heritage Preservation Region Council of Ist. No II Renovation Areas and approved by the Metropolitan Municipality of İstanbul on the date of 10/4/2012.
65 Plan Sheets belonging to Fatih District are attached to board at the C Block Ground Floor of Municipality of Fatih for one month on the date of 10/15/2012. In addition, you may see it on our official web page. Please click to see on our web page.


Frostad Atelier Foundry opened for business in a white-collar district of Rocklin, California in 1998 by Ronnie Frostad. She had experience managing another foundry in Sacramento and began her own business with one employee. The foundry quickly grew, and after five years she moved to a larger facility at the recently closed McClellan Air Force Base in Sacramento, California. This foundry had previously been used by the United States Air Force for casting parts for its planes, and she modified this foundry for her own bronze work.
The McClellan foundry was very large (28 thousand sq. ft) and was equipped with overhead cranes that allowed for the construction of monumental sculptures. The largest standing bronze sculpture in the world was cast and assembled in this facility for its home at Queens University, Charlotte, North Carolina.
In 2016 we moved from the McClellan foundry and began construction of a modern, state-of-the-art foundry and fine art gallery within the city limits of Sacramento. This new foundry opened for business in January 2017 and serves artists mainly in the Central area of California, but many of our clients are on the East Coast of the United States. This new location, being close to the Sacramento International Airport and the major freeways of Sacramento, allows for easy access and expedient shipping to and from the foundry.
"Roaring Lion", the largest standing lion in the world, was constructed in our Rocklin Foundry.
The lion's journey across the U.S. was followed by Good Morning America and filmed by the Local TV station as it entered Charlotte, NC.
The foundry featured on KCRA TV Sacramento in 2017.


There are quite a few rumors and misunderstandings out there regarding how car accident claims work. Many drivers who have been in a collision are unpleasantly surprised to find out the truth about insurance coverage, fault, and other key components of a car accident case.
"Full coverage" means full coverage. Many people think they have what they would refer to as "full coverage" when it comes to auto accidents, bodily injuries, etc. However, most insurance policies do not insure all losses and have specific financial caps, depending on the policy.
The other driver's apparent fault will keep you from paying for anything. Even if it's obvious to you that the other driver caused your accident, they could still manage to convince the court that you are partially responsible for the crash. You will need strong legal representation in order to make sure you are not unfairly held responsible for the accident.
I feel fine, so I don't need to sue for damages. Many car accidents cause traumatic brain injuries and other soft tissue damage that can take hours, days, or even weeks to develop and become apparent. It is always smart to involve a lawyer from the get-go, even while you are still evaluating your mental and physical state after a collision.
You don't need to begin legal proceedings right away. Don't wait until the dust has settled to start taking action to protect yourself. A successful car accident case requires a great deal of research and investigation, which can be done most efficiently and accurately when done right after the accident. The state of Virginia allows you 2 years from the date of your accident to file a car accident claim, so do not wait to consult with an attorney.
At Breit Cantor Grana Buckner, we believe in providing a path to justice for injured people. Our firm was founded on a desire to serve folks who are injured through no fault of their own and need a firm advocate to plead their cause. When you bring in a member of our legal team, you will gain an immediate advantage in your case and take the first step toward a fair outcome.
Let us help you build a strong case. Call (888) 635-9500 or contact us to schedule your free, no-obligation consultation.


text:
Guest Post: The Potential of Connected, Social Photography
Princes Bridge, Melbourne | Image by Misho Baranovic
For this post we have asked five members of the international photographic collective, the Mobile Photo Group to share with us why they use mobile devices as part of their photographic process.
But first, a little bit of background about the group. The Mobile Photo Group was formed in mid-2011 and currently has 13 members from America, Europe, Asia and Oceania. The group is dedicated to promoting their work and presenting mobile photography as an important and evolving form of photography. Made up of documentarists, street photographers, fashion photographers, portrait photographers, photojournalists, story tellers, writers, poets and artists, MPG is exploring the potential of connected, social photography.[short]
Oliver Lang, Sydney, Australia
Floating, Park Street, Sydney | Image by Oliver Lang
"I use a mobile phone for photography because it allows me to shoot, edit and share my images from the single device. The iPhone can take excellent images. There are limitations, but this hasn't stopped me taking images worthy of printing and framing, or including among images taken on a DSLR.
"I am able to share my images with people from every corner of the world. Mobile photography is making the world a smaller place. I've found amazing friendships that will last a lifetime by shooting and sharing images on a mobile phone. I've travelled to New York and Tokyo and met the smiling faces of people I've only ever known because of their mobile photography. There's also the friendships I've made in my own city of Sydney, and people I would otherwise never have had the pleasure of meeting."
Theodore Kaye, Dushanbe, Tajikistan
Uighur men gathered at a sports event in Hotan, on the southern rim of the Taklamakan Desert | Image by Theodore Kaye
"Conspicuous photography can be hazardous to your health in the post-Soviet world, especially in parts of Central Asia, where I do much of my documentary work. After a few police confrontations due to my pro gear, I turned to the cellphone camera as a low-key way to explore certain local issues. I've grown to like the aesthetic and unique intimacy the cellphone affords, and now plan a book, profiling the Central Asian 'stans (ex-Soviet Republics) through mobile photography alongside my more formal assignment work."
Greg Schmigel, Arnold, Maryland
Private Room Entry | Image by Theodore Kaye
"For the past couple of years, one of the most common phrases echoed in the mobile photography community is 'The best camera is the one that's with you'. And while I believe that's true from a literal sense, I truly believe that the best camera is 'the one you're most comfortable with'. And for me, since 2008, that camera has been the iPhone – hands down.
"As a street photographer, candid shots are what I seek, so I was originally attracted to using a mobile device because it was much less intrusive and much more discreet than a traditional camera. But even that attraction has taken a back seat to the fact that the iPhone just feels right for me when shooting. While I clearly understand that the iPhone may run second place to larger DSLRs from a 'data' perspective, it gives me the freedom to compose and capture images in almost any given situation, worrying less about data and focusing more on the creative.
"I truly believe that nearly 90% of the art of photography is about what the photographer sees with his or her own eyes. The choice of camera that he or she uses makes up for the rest. So whether you're using a DSLR, a point and shoot, a pinhole camera, a film camera, or even a camera phone, it really shouldn't matter. Use what you're comfortable with, focus on the image and don't get distracted by the gear – go out and capture Just What YOU see."
Jim Darling, Washington DC
Image by Jim Darling
"There is something special about a street portrait. Something visceral and spontaneous. And for me there is no photographic tool more spontaneous than my smartphone.
"When I first began taking portraits with my iPhone (in late 2009) the idea of mobile photography was still a bit of a novelty. And approaching strangers on the street and asking them to pose for a photo – using a phone – was even less familiar. But the idea that I was making art with my phone was also a natural ice-breaker, and more often than not my request was met with a smile or laugh. One of my favorite things about taking those early portraits was that I had the ability to share the final image with the subject right then and there. Edited and processed and all. And as my collection grew I would show a prospective subject samples of earlier work, which most often would further secure the idea that I took the portraits seriously and that they were in good hands. They trusted me.
"All of those early benefits still ring true today, but what's most important is that having my 'camera' with me at all times means I never have to miss an opportunity. A street portrait is something that sneaks up on me without warning. And the best portraits come from faces and people that I'm immediately drawn to – without ever having to think twice. And using the mobile device gives me to opportunity to get closer to a subject both physically and emotionally."
Misho Baranovic, Melbourne, Australia
"I've been shooting with a mobile device, an iPhone for over three years. I used to over-complicate my photography, always worrying whether the photos were good enough. Since using the iPhone, I've been able to enjoy the shooting process again. Because the iPhone is always with me, I can experiment on a daily basis, shooting and editing wherever I find an interesting image. This freedom has sparked a passion for street photography and now I spend most days searching for the 'Decisive moment'.
"I also use the iPhone because of the incredible support and encouragement I receive from the mobile photography community. Each time I share a photo I know that I have a group of peers and friends who will give me honest feedback about my photograph, this helps me improve far quicker than I ever could before."
TPA would like to thank the members of The Mobile Photo Group for sharing their experience of mobile photography with us.
The only caveat is that if you abuse Diazepam Online (take too much) it will lead to depression, so stick to the lowest dose that works.
Back to main blog page
← Guest Post: How to take an Honest Picture
Portrait Photography : The World in London →
Competition Entry Terms and Conditions
Buy Soma ambien
Web Design Devon | Illicit
The Photographic Angle (TPA) is a company limited by guarantee, registered with Companies House in London (number 07063537) and is a charity registered with the Charity Commission for England and Wales (number 1135750). TPA advances education for the public benefit, in particular in the art and science of photography and its theory and practice, primarily by holding exhibitions of photography freely accessible to the public.


text:
Apply now! EIFL bootcamp for open science trainers
EIFL call for open science trainers in our partner countries to apply for the EIFL Open Science Train-the-Trainer Bootcamp
Home > News > Apply now! EIFL bootcamp for open science trainers
Are you based in one of our partner countries and want to strengthen your open science training skills? Apply now for the EIFL virtual open science train-the-trainer bootcamp, which runs over five half days, from 30 January - 3 February 2023.
The deadline for applications is 19 December 2022.
Librarians, research support staff and other professionals who are planning to deliver open science training to researchers and students, and who are based in one of our partner countries, should attend the course. We plan to accept 40 applicants who will learn and work together to develop engaging open science training.
We expect applicants to have some basic knowledge of open access. At the end of the online course, participants will -
Be able to communicate about why open science is an issue that researchers can't afford to ignore.
Be able to explain how to go about making research more open.
Be able to explain how to progress a research career through practicing open science.
Understand how to communicate and teach (pedagogy) open access publishing, research data management, open data and open science to researchers and students.
Be more confident and better equipped to deal with difficult questions.
Be able to plan training activities.
Be aware of best practices in training design for online, face-to-face and hybrid events.
Understand how to work with diverse audiences.
Know how to evaluate the impact of training.
Know how to make training materials FAIR (Finable, Accessible, Interoperable and Reusable).
We will use the following evaluation criteria when assessing your application -
Potential and motivation to conduct open science training in your institution or country - 50%.
Previous experience as a trainer, particularly on topics related to open access and open science - 50%.
WILL THERE BE ANY EXPENSES?
The course will be free. Participants are expected to commit five half-days for the duration of the course, which runs from 30 January - 3 February 2023.
Apply here now!
Enhancing open science and open research skills by organizing 'train-the-trainer' activities, creating training materials, and advocating for research incentives and structures that support and promote the acquisition of open science and open research skills, are among EIFL's strategic goals.
Open science is an approach that makes research processes and data open and transparent at all stages, from planning to dissemination of results, and which encourages collaboration among researchers. Growing numbers of researchers, research institutions and research funders have recognized the importance of open science in promoting responsible research and innovation. By building a cohort of open science trainers, we aim to boost adoption of open science practices in our partner countries.
Congratulations to EIFL Innovation...
EIFL names four winners of the EIFL Public Library(...)
Strengthening open access publishin...
Libraries take the initiative in EIFL project to s(...)
Sign the Copyright Bill, EIFL urges...
EIFL requests the President of Nigeria to sign the(...)
EIFL renews agreement with Oxford U...
Renewed agreement with OUP for free or discounted(...)


text:
Sting, Elton John and James Taylor Rock Rainforest Fund Concert - Bruno Mars, Jennifer Hudson also performed at star-packed charity show...
When she and Sting first visited South America's Amazon rainforest in 1988, Trudie Styler remembers flying into thick smoke from a fire raging below. "It was like seeing paradise and hell at the same time," she told a packed Carnegie Hall at last night's Revlon Concert for the Rainforest Fund. The evening's two-hour "Songs from the Silver Screen" event featured performances from Sir Elton John, James Taylor, Jennifer Hudson, Bruno Mars and more. Styler, who co-founded the Rainforest Fund to protect land and human rights for the indigenous there, singled out Chevron as the worst violator in Ecuador, where a court fined the oil giant $18 billion in February. "I liked that Trudie named names," Tom Hanks - who was in the audience along with Aretha Franklin and Clive Davis - told Rolling Stone after the event. "It's good that she got there and told it like it is." Backed by the 40-piece St. Luke's Orchestra, the show opened on a lighter note in the familiar Land of Oz, with Meryl Streep, Sting, Taylor and John trading verses of 'If I Only Had a Brain' and sporting proper attire: Streep channeled Dorothy, while Sting donned a Tin Man hat and John wore furry lion "paws," red sequins and ruby slippers. John later joined Mars for a standout duet of the Righteous Brothers' "Unchained Melody," and Jennifer Hudson's sizzling gospel take on the Band's 'The Weight' proved the night's heaviest hit. President Bill Clinton briefly took the stage to remind the audience of the dark counterpart to the night's fun - the world's rainforests throughout Africa, Asia and the Americas, in need of $4 million. "You have more in common with those isolated native tribes and those people who know how to care for their habitat than you can possibly imagine," he said. The concert exposed many in attendance to the devastation they've never seen firsthand. "I was inspired to go and try to write something," said singer Amy Grant, whose husband, Vince Gill, performed among the night's lineup. Taylor, who has performed in Brazil, said he has yet to visit the Amazon. "It's just a reminder of what a dire and pressing problem it is. It's really the main thing facing mankind today, is whether or not we can live on this planet and not damage it too terribly," Taylor told Rolling Stone at a gala following the show. The singer-songwriter also confirmed that he's "about half-done" with his first album of original music since his 2002 LP, 'October Road', while John said he expects to release his latest, The Diving Board, next year. (c) Rolling Stone by Patrick Flanary
Sting, Trudie Styler Raise Millions for the Rainforest with Bill Clinton, Stars...
What a night for the 20 plus year Rainforest Foundation: Trudie Styler produced her biennial all-star fundraiser at Carnegie Hall, probably the best ever with Sting, Elton John, James Taylor, Jennifer Hudson, Roseanne Cash, Esperanza Spaulding, Vince Gill, Bruno Mars, opera great Bryn Terfel, Rita Wilson, Meryl Streep, and Channing Tatum with his gorgeous dancer wife Jenna, and special guest Bill Clinton. They raised millions more for the preservation of the Rainforest and its indigenous people. So many highlights but probably no one will ever forget Elton John singing 'Diamonds Are a Girl's Best Friend' while Channing Tatum, wearing a vest and no shirt underneath, plus a black bowler, danced around him as if he were in the show, 'Chicago'. It was hilarious. Jennifer Hudson, of course, blew the doors off the building singing 'And I'm Telling You' from 'Dreamgirls'...
We are excited to announce that Jennifer Hudson and Bruno Mars have been added to the incredible lineup for the upcoming Revlon Concert for the Rainforest Fund!
Jennifer Hudson and Bruno Mars have been added to the incredible lineup for the upcoming Revlon Concert for the Rainforest Fund! They join an all-star list of performers including Sting, Elton John, James Taylor, Meryl Streep, Vince Gill, Rosanne Cash, and Bryn Terfel at the concert on April 3, 2012, which will be held at the world-renowned Carnegie Hall's Stern Auditorium/Perelman Stage, followed by a gala dinner.


text:
const { existsSync } = require('fs')
const { sep, normalize, join } = require('path')

module.exports = function () {
  let dir = process.cwd()

  while (dir.length && dir[dir.length - 1] !== sep) {
    if (
      existsSync(join(dir, 'quasar.conf.js')) ||
      existsSync(join(dir, 'quasar.config.js'))
    ) {
      const { fatal } = require('./logger')
      fatal(`⚠  Error. This command must NOT be executed inside a Quasar project folder.`)
    }

    dir = normalize(join(dir, '..'))
  }
}


text:
Q: Unable to connect to SQL server using mysqli_connect, but MSSMS connects fine I've read many questions similar to this but none of the answers have been relevant to me. I'm trying to access a SQL server using PHP. Both the SQL server and PHP are running on my Windows 10 machine. Here is my PHP code (the username and password are arbitrary):
$connection = mysqli_connect('127.0.0.1', 'hmuuser', 'password');

This causes the following error:
PHP Warning:  mysqli_connect(): (HY000/2002): No connection could be made because the target machine actively refused it.

Here is my connection using MSSMS (which is successful):

EDIT:
I was able to solve my problem using this link: http://blog.citrix24.com/configure-sql-express-to-accept-remote-connections/
Using this link I enable SQL Browser, and set a static port to connect to SQL server with. However, I'm presented with a new error:
PHP Warning:  mysqli_connect(): MySQL server has gone away in C:\HMUAPI\Index.php on line 7
PHP Warning:  mysqli_connect(): Error while reading greeting packet. PID=9920 in C:\HMUAPI\Index.php on line 7
PHP Warning:  mysqli_connect(): (HY000/2006): MySQL server has gone away in C:\HMUAPI\Index.php on line 7

My code has been changed to the following to cause this error: $connection = mysqli_connect('127.0.0.1:1434', 'hmuuser', 'password');

A: Add a database name
$connection = mysqli_connect('127.0.0.1', 'hmuuser', 'password','dbname');

Also here is suggest - Actively refused it" means that the host sent a reset instead of an ack when you tried to connect. It is therefore not a problem in your code. Either there is a firewall blocking the connection or the process that is hosting the service is not listening on that port. This may be because it is not running at all or because it is listening on a different port.

A: I guess the problem is, that you use MySQLi to connect to a MSSQL server.
You should use the correct MSSQL extension instead.
Microsoft published their SQL-Server for PHP driver on GitHub: https://github.com/Microsoft/msphpsql
Or you use the older extension which is documented in the PHP manual: http://de2.php.net/manual/en/book.mssql.php
And at least you can set up ODBC.
One of them should resolve your problem.

redpajama_set_name: RedPajamaStackExchange


text:
REVIEW: Forts
Home / REVIEW: Forts
tamaster No comments 2017, building, earthwork games, forts, rts, sandbox, steam
A fresh take on a classic genre from the early days of PC gaming. Forts involves deep strategy and won't disappoint RTS enthusiasts looking to try something different.
Steam: Released
Type: Single-player, Multi-player
Genre: RTS, Sandbox
Developer: EarthWork Games
Publisher: EarthWork Games
Release date: 19 Apr, 2017
Forts is a real-time single- and multi-player artillery shooter with greatly emphasised building elements. In this game, you act as one of the many available commanders and take on players online across a variety of maps and modes, or partake in a single-player campaign against the AI. This game heavily draws inspiration from the all-time classic, Worms, but adds base building to the gameplay formula, in addition to making the game real-time for faster-paced matches.
Gameplay Video
Gameplay Analysis
General Gameplay
In Forts you have always two main objectives: building and protecting your base, and destroying the enemy base. To protect your buildings, there are a plethora of defensive constructs ranging from simple wooden platforms to high-tech energy shields, with which you can build a true fortress. But mind taking into account the laws of physics, as unstable structures will quickly fall apart. To destroy the enemy base, you'll have to destroy the core, often making use of those same physical laws.
The building system is simple and immediate: drag and release whole base segments or just single components, and you'll have your base up in no time. Then place some of the many weapons available. These fire automatically for defence, but rely on you to control them for attacking, by deciding direction, force (if applicable), and trajectory of the projectiles.
To do all of this you'll also need to manage the resources of energy and metal, produced by from turbines and mines, so some planning is required in order to build a functional fortress to accommodate all this machinery. Being real time and not turn based as are most games of this kind, all these things unfold rather quickly, and you'll often have to multitask repairs, new structures, attack, and production together.
Overall, the gameplay formula works smoothly, and is not too long thanks to the real-time approach, but still involves considerable tactics and planning, especially in two-on-two and larger matches, where multiple adversaries result in more varied strategic options.
Combat System
All combat happens in real time. There are two types of armaments: direct fire, such as machine guns, and indirect fire, such as mortars. Each weapon has its own strengths and weaknesses, as does each construction part; some must be unlocked by building specific upgrade structures in the base. Knowing what weapons work best against a given enemy base layout is fundamental to success, as is balancing attack and defense.
Environmental hazards like wood catching fire and gravity must also be considered; damage to your base may cause it to fall apart because of structural strain, while unhindered fire might consume it all in the blink of an eye. Certain structures may provide benefits, but may also set off huge explosions and damage to surrounding areas if destroyed, so you really need to think where to put them.
On top of all this, each commander has his own unique ability, usable multiple times during a match. These can turn the tide of a battle if used effectively.
The highlight of Forts is without a doubt the multiplayer, which can potentially offer endless entertainment, while the single-player campaign has limited duration and serves mostly as a tutorial. If you like the game, being mostly multiplayer-oriented, you can get a lot of content for your money.
Overall there are no major balance issues, apart from maybe sniper turrets being a bit overpowered. These can mostly one-shot any enemy turret at any distance, making them a very powerful weapon in the hands of accurate players.
This game involves a good degree of multi-tasking and planning abilities. The strategic possibilities are many and the more players you add the more things you have to consider. Given the learning curve of the game mechanics and how they are applied to multiplayer gameplay, Forts warrants a high challenge rating.
Graphics are 2D and realised in a simple cartoonish fashion, which is appropriate for the general ambiance of the game. Do not expect to find elaborate, next-gen graphics in this title, because you won't. The art style is appreciable and there aren't inconsistencies with the overall quality.
Basic effects and sound tracks, with nothing out of the ordinary.
No particular issues were found. This game should run well even on dated systems.
No issues were found.
Enemy AI during the campaign or skirmish modes will follow a pre-determined building pattern. If a segment is destroyed the AI will rebuild it again. Do not expect adaptability from the AI, as it serves mainly as a tutorial for the players. It is sufficient for this, but nothing more.
Controls and UI are fine, with nothing bad to report.
Bugs / Issues
I didn't encounter any severe bugs or issues, though I saw a few minor ones that did not compromise gameplay significantly.
About tamaster
Hello everyone, I am Tamaster, a currently 23 years old gamer with, obviously, quite a passion for reviewing. I have always been a dedicated gamer since when i was a little kid, and there practically is no day i spend without gettin' some gaming. My platform of choice is PC, but i also have a dusty PS4 somewhere around here. Favourite kind of games? Well i enjoy playing old-school RPG, that is absolutely my favourite genre, but i also play Combined-Arms FPS (ArmA, Planetside, Red Orchestra and the likes), Tower Defense, used to play a lot of MOBAs in the past but not much anymore. Don't really like Platformers, Driving / Sports games and Roguelikes, but i review them anyway of course. I am a co-op games enthusiast, i like to cooperate with friends or even strangers to achieve something, be it building or be it defeating enemies.


I just read The five year lag, a good post about church and technology by @wezlo. While this wasn't his main point, a bit of what he said jumped out at me because it's been on my mind this week. I had to move back a couple of paragraphs to find the connecting statement, because - honestly - I'd skimmed right past it.
We are seeing a significant social shift in the ways people connect with each other that is literally re-mapping our brains.
It also further blurs the line between 'urgent' and 'important' because all of our data seems to demand immediate attention.
I was talking to my boss yesterday about how everything is an emergency to the end users we support. He's been telling users that when they put requests in our tracking system, it's not the same as pulling up to a clown's face and ordering food, then expecting instant results. I added to his analogy that ordering from the clown face doesn't mean you can now drive around all of the other cars waiting ahead of you and be next at the window, either.
In the inaugural episode of Back to Work, Merlin Mann and Dan Benjamin talked about the notion that our lizard brain, lacking the real-world fight-or-flight triggers of a less civilized era, has latched onto all of this input as a threat. I think that relates to the urgent-vs-important dilemma, too.
So now that I've unpacked all of this, what am I trying to say? I'm not really sure. This started as just a short post to point out something I found interesting.
I guess if I were to map it back to the church, where Wezlo's post started, it would be in the context of my own needs. I need my church to be a place of solace, where I can unplug from all of this for a couple of hours and just be in God's presence.
That's not really easy to do as the "always on" sound guy, but I've always seen our role as technology providers to be like John the Baptist: "He must increase, but I might decrease." I tend to consider (and prefer) technology not as a gimmick, but as a medium to facilitate, as transparently as possible, what God is actually doing in our midst. So that's how I measure our use of technology: any use that draws attention to itself draws attention away from God.
But that wasn't really why I started writing this. For the past few months, I've been piecing together my own answers to questions opened up on Back to Work, which started with "what didn't you ship?" and moved on to more important questions about who I am and what I want out of life. I'm still working all of that out; this is just one more part of that process.
This post was migrated and back-dated from my original post on Tumblr, which I have decided to move here.


Money, Relationship, Health & Get Your Happy On! What else is possible?
What if there was a way to quiet the endless thoughts in your mind, let go of the things that you've been holding on to and have more happiness? Would you be interested? And what if you didn't have to do anything to have all of this? What if you could simply lay down and receive?
A session of Bars® is like deleting the old junk on your personal computer hard drive. Letting go of all the deep-seated emotions, thoughts, judgments and attitudes that have been stored up through lifetimes, and that no longer serve you.
The Universe is endlessly abundant and desiring to gift to you! We actually have to put up barriers to not receive the greatness, beauty and magic of what is available. The Bars® breaks down those walls and barriers. This is an opportunity for you to let go of everything!
What shows up is more of you and you get way more HAPPY!
And for all you science buffs out there; a preliminary scientific study by leading neuroscientist, Dr Jeffery Fannin has revealed the neurological effects of the Access Bars®. By measuring brain waves on people before and after a Bars® session, Dr Fannin discovered that Access Bars® has a positive neurological effect on the recipient. Similar to those experienced by advanced meditators – and it produces these results immediately. How's that for mind blowing?!?!
What are the benefits of the Bars?
Deeper relaxation and non interrupted sleep.
Improved manageability of depressive and anxious tendencies.
Easily shift negative thought patterns and limiting beliefs.
Change and often remove physical pain in the body.
Greater mental clarity, motivation and problem solving capacity.
Identify and transform the negative self-talk.
Release the unconscious stories that keep you from having what you want.
Be more generative as you clear blocks to receiving - improve money flows.
Create change with health, weight, relationship, stress and so much more.
Improve your mood and maintain a positive outlook.
You get way more HAPPY!
All of life comes to us with Ease, Joy & Glory!
Book a Bars® session today!
Conveniently located a short walk from Waterloo & Southwark stations.
OMG! SQUEAAAAL!! I'm not quite sure where to start!! I feel fantastic! Lighter, brighter, EXCITED, since having my bars run its like I've found my creative mojo! Thank you thank you thank you!! I'm so excited about the bars class on Friday!!"


Businesses spend a ton of time working to optimize their supplier relationships and streamlining channels of delivery. And rightfully so. An efficient supply chain is critical to cost management and operational efficiency. However when operational efficiency is a commodity or markets are flush with supply, the opportunities for growth lie on the demand side of the equation. Which begs the question: is there such thing as a "demand chain" that needs optimizing as well? And if so, how does a business go about optimizing it and what can it expect in return?
In late 2011, Chief Outsiders, LLC partnered with the McCombs School of Business at The University of Texas to explore various growth drivers for mid-market companies. A study of CEOs from 27 industries provided data to the UT research team, including Professor Leigh McAlister, and Assistant Professors Jade DeKinder and Ty Henderson, whose analysis yielded several noteworthy discoveries.
Maintain a Market-Based Perspective: Even companies that rigorously solicit customer opinions on their products, services and support can be misled into believing they have a market-based perspective of their business. It's most common for companies to rely upon their sales and customer service organizations for these critical insights. However, a full market perspective extends far beyond customer satisfaction. A rigorous and continual approach to understanding market dynamics including competitive activity, ecosystem relationships, global shifts and technology impact are key factors in maintaining a market-based perspective. While most companies maintain an opinion of how they relate to their markets, few are proficient in maintaining a perspective of how the market views the relevance and distinctiveness of their business.
Continually Position for Distinctive Relevance: Capitalizing on the knowledge and insight gained from a truly market-based perspective, a business must continually evolve its relevance and uniqueness to the marketplace. This is not a messaging exercise, but drives the very purpose of the company – why it exists, to serve which customers, with what products and services – and the business plans that will align the company around these objectives. It provides clarity to the entire organization on how to create compelling value propositions that are market-relevant and competitively distinctive. It is the core business strategy for ensuring effectiveness in the marketplace, and efficiency in how a company executes its plans.
Execute with Precision: Go-to-market "execution" is what most business people refer to when they say "marketing." When leads are not being generated, prospects are not converting into customers, businesses generally believe they have a marketing problem and set out to find a new mix of tactics. Ninety percent of the time, however, the foundational issues are upstream, or further up the demand chain. When companies are well informed with a market-based perspective and have aligned their purpose, offerings and plans with this knowledge, tactical program execution is both effective and efficient. Developing a discipline for executing with greater precision requires an alignment of marketing program tactics with business priorities, plus establishing the processes for measurement and accountability. Companies that aren't already taking advantage of the broad range of affordable technologies (sales force automation, customer relationship management, marketing automation and analytics) are simply missing the most obvious opportunities to operationalize their marketing execution.
How does one get started in optimizing their demand chain? First, make sure someone besides the CEO is charged with "looking out the window." Make it a priority to regularly capture an understanding of the marketplace. Extend the company's operational excellence to include making the business fully aligned and distinctively positioned to serve current and future markets. Then, revisit the precision and accountability of marketing program execution. In short, apply the same excellence that's made other parts of the business operationally efficient to the demand chain and the business will improve its potential for growth.
Note the analysis on the size of the clusters changed; operations-oriented companies make up just over half of the population rather than nearly two-thirds. Details in the report. Please contact me if you have questions.


text:
Q: Can I create more than one bitmaps for compatible DC? Is it right to create two bitmaps for one DC?
My situation is I have
 dc = CreateCompatibleDC(NULL);
 bitmap = CreateDIBSection(dc, pbmi1, DIB_RGB_COLORS, (void **) &bmpBits, NULL, 0);
 extra_bitmap = CreateDIBSection(dc, pbmi2, DIB_RGB_COLORS, (void **) &extraBmpBits, NULL, 0);

The difference is: bitmap is width*height , extra_bitmap is width/2*height*2
I need to show both images on the screen according to requirements from users.
I tried these code above, it can run (based only on my limited test).  But I am not sure if it is the right way to do it. Any suggestions and/or comments are welcome. Thanks.
By the way, if I can have two bitmaps associated with one DC, what is the right way to release them? Can I just call DeleteDC(dc)? Thanks.

A: Bitmaps are only associated with a DC when they're selected into them via SelectObject. The DC you pass to the CreateDIBSection is only used to define the layout/palette of the newly created bitmap, and only in some circumstances, but it doesn't irrevocably associate that bitmap with the DC or anything like that.
To draw a bitmap to a window, it needs to be selected into a DC (the "source DC"), and this is where you can only have one at a time.
For example:
HDC hdcTarget = GetDC(hWnd); // or hdcTarget = BeginPaint(...)
HDC hdcSource = CreateCompatibleDC(hdcTarget); // create a "source DC")
HGDIOBJ hOldBmp = SelectObject(dc, bitmap); // select bitmap 1 in
BitBlt(hdcTarget, x, y, w, h, hdcSource, 0, 0, SRCCOPY); // draw bitmap 1
SelectObject(hdcSource, extra_bitmap); // select bitmap 2 in
BitBlt(hdcTarget, x1, y1, w1, h1, hdcSource, 0, 0, SRCCOPY); // draw bitmap 2
SelectObject(hdcSource, hOldBmp); // restore previous bitmap
DeleteDC(hdcSource); // no longer needed
ReleaseDC(hWnd, hdcTarget); // or EndPaint(...)

A: After search around for a few hours, I get
http://www.ucancode.net/Visual_C_MFC_Samples/CreateDIBSection-BITMAPINFOHEADER-CreateCompatibleDC-BITMAPINFO.htm
In this example:
// Create HDCs to hold our surfaces.
hdcSrc1 = CreateCompatibleDC(hdcDest);
if (!hdcSrc1) goto HANDLEERROR;

hdcSrc2 = CreateCompatibleDC(hdcDest);
if (!hdcSrc2) goto HANDLEERROR;

For delete:
  DeleteDC(hdcSrc1);
  DeleteDC(hdcSrc2);
  DeleteObject(hbmSrc1);  // hbmSrc1 and hbmSrc2 are created using  hbm = CreateDIBSection(hDC, &bmi, DIB_RGB_COLORS,(void **)&pBits, NULL, 0);
  DeleteObject(hbmSrc2);

Hope this can be helpful for others. thanks.

A: You may create as many in-memory bitmaps as you like.
You may create as many device-dependent DCs as you like.
A bitmap may be selected into only one DC at a time.  If you try to select the same bitmap into multiple DCs, then you will get unpredictable behavior.
A DC will never have more that one bitmap selected into it at a time, because the act of selecting one in selects the previous one out.
Don't delete a memory DC while your bitmap is still selected into it.  You should select the original bitmap (which is a monochrome 1x1 bitmap) into the DC to get your bitmap out before you delete the DC.
Don't delete an in-memory bitmap while it's still selected into a DC.


text:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>

	<parent>
		<groupId>fr.city</groupId>
		<artifactId>city-parent</artifactId>
		<version>0.0.1-SNAPSHOT</version>
	</parent>

	<groupId>fr.city</groupId>
	<artifactId>city-view</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<packaging>war</packaging>

	<build>
		<plugins>
			<plugin>
				<groupId>org.eclipse.jetty</groupId>
				<artifactId>jetty-maven-plugin</artifactId>
				<version>9.2.9.v20150224</version>
				<configuration>
					<scanIntervalSeconds>5</scanIntervalSeconds>
					<systemProperties>
						<systemProperty>
							<name>org.eclipse.jetty.util.log.Log</name>
							<value>org.eclipse.jetty.util.log.Slf4jLog</value>
						</systemProperty>
						<systemProperty>
							<name>logback.configurationFile</name>
							<value>src/test/resources/logback-test.xml</value>
						</systemProperty>
					</systemProperties>
				</configuration>
			</plugin>
		</plugins>
	</build>

	<dependencies>

		<dependency>
			<groupId>fr.city</groupId>
			<artifactId>life-core</artifactId>
		</dependency>

		<dependency>
			<groupId>fr.sunlight</groupId>
			<artifactId>sunlight-core</artifactId>
		</dependency>

		<dependency>
			<groupId>javax</groupId>
			<artifactId>javaee-api</artifactId>
			<scope>provided</scope>
		</dependency>

		<!-- JSON -->

		<dependency>
			<groupId>javax.json</groupId>
			<artifactId>javax.json-api</artifactId>
		</dependency>

		<dependency>
			<groupId>org.glassfish</groupId>
			<artifactId>javax.json</artifactId>
		</dependency>

		<dependency>
			<groupId>org.codehaus.jackson</groupId>
			<artifactId>jackson-mapper-asl</artifactId>
		</dependency>

		<!-- Servlet -->
		<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>javax.servlet-api</artifactId>
		</dependency>

		<!-- JSF -->
		<dependency>
			<groupId>com.sun.faces</groupId>
			<artifactId>jsf-api</artifactId>
		</dependency>

		<dependency>
			<groupId>com.sun.faces</groupId>
			<artifactId>jsf-impl</artifactId>
		</dependency>

		<!-- PrimeFaces -->
		<dependency>
			<groupId>org.primefaces</groupId>
			<artifactId>primefaces</artifactId>
		</dependency>

		<dependency>
			<groupId>org.primefaces.extensions</groupId>
			<artifactId>primefaces-extensions</artifactId>
		</dependency>

		<!-- LOG -->

		<dependency>
			<groupId>ch.qos.logback</groupId>
			<artifactId>logback-classic</artifactId>
		</dependency>

		<dependency>
			<groupId>ch.qos.logback</groupId>
			<artifactId>logback-access</artifactId>
		</dependency>

		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>slf4j-api</artifactId>
		</dependency>

	</dependencies>

</project>


Steven Greenberg practices primarily in the area of residential real estate law, currently handling approximately 800 real estate transactions per year.
As a complement to this practice, Steve is an agent for most title underwriters, including Fidelity National Title Insurance Company, Old Republic National Title Insurance Company, Attorneys' Title Insurance Fund, and Chicago Title Insurance Company. He is also approved to close loans for most national and local lenders.
Prior to joining Icard Merrill, he served as president of Steven R. Greenberg, P.A., a general practice law firm with emphasis on real estate transactions. Steve has served as general counsel to several real estate companies, advising clients on all aspects of real estate law. He is board certified by The Florida Bar in real estate law.
Steve frequently serves as a lecturer on a variety of real estate matters.


Our goal is to make scheduling an appointment as easy and convenient for you as possible. Please select several options that work with your schedule and we will do our best to accommodate your needs.
If this is your pet's first visit to Hope Veterinary Specialists, please contact us by phone to discuss your pet's unique needs. Coordinating specialty care can be confusing so we want to make sure your pet sees the right doctor, right from the start!
Please fill out the following form to request appointment times that are at least 2 full business days from the date of submission. We will contact you to confirm a date and time that is as close to your requested times as possible. If your appointment has not been confirmed within 24 hours, please contact us by phone.
If your pet has an urgent medical need, please call 610-296-2099 for immediate assistance.
Date-Please keep in mind most specialty services are booked 2-3 weeks in advance. If your pet has an immediate need it is best to give us a call to discuss scheduling.


The aluminium oxide belt is held in place by a patented spring- loaded mechanism that allows the belt to be rotated 360°. Rotating the belt exposes a new sanding surface and allows the entire belt to be used.
Ideal for sanding in hard to get areas.


Programmed with the skills of a mighty ninja, the non-sentient Nightbird developed a full meta-processor brain after being implanted with one of Bombshell's cerebro shells, which merged with her own simulated intelligence.
Nightbird became one of the greatest threats to the Autobots, even more so when - as Bombshell was reformatted - she gained true sentience and freedom of thought.
Holo Decoy - Place a decoy that disables defenses and has 25% of your Health. One decoy can be active at a time.


text:
HomeAfrican FilmsAfrican Movies And The 93rd Academy Awards
African Movies And The 93rd Academy Awards
The 93rd Academy Award ceremony was the first Oscar ceremony held since the pandemic. The toll that the covid-19 pandemic has had on the entertainment industry was evident in the sitting arrangement which was starkly different from that of the years prior.
However, the pandemic didn't stop the ceremony from showcasing some of the best films made within the last year.
Two African films, The Man Who Sold His Skin and My Octopus Teacher were showcased in the event which was held in the early hours of today.
A few weeks ago, we wrote about our thoughts and expectations for the Best International Feature Film category of the Oscar awards.
Five films were nominated in that category of which the Tunisian film, The Man Who Sold his Skin, was one of them. While we stated that it generally ticked many boxes for us when compared to the previous year's submissions that failed to get nominated, we also stated that it would face some real opposition from the Danish Film, Another Round.
So, we weren't really surprised that Another Round took home the award for Best International Feature Film for the 93rd Academy Awards ceremony.
So, you might ask, "Why did Another Round win the Oscars?". Have you seen the movie? You might find it counter productive that we answered a question with a question. Don't blame us; blame our nationality.
Another Round red carpet interview
But on a serious note, understanding why Another Round won the Oscars for Best International Feature Film for 2021 starts and ends with spending the time (a little below 2 hours) to see the movie on Hulu.
Where The Man Who Sold His Skin was brilliant, Another Round was a living, breathing masterpiece of a film. Where the former was artistic and edgy, the latter was life-affirming and a little unsteady on its feet.
Another Round, or Druk as it is known in Denmark, is a film about life, friendship and alcohol. The synopsis is based on Norwegian psychiatrist, Finn Skårderud's theory that humans are born with an alcohol blood level 0.05% too low. Another Round is a test on what it would mean to get drunk and stay drunk consistently every day.
Directed by Thomas Vinterberg, Another Round is the fourth film from Denmark to win the Oscars in this category, while The Man Who Sold His Skin is Tunisia's first time around. So, Denmark has some experience on what it takes to win that prize. It also helps that Vinterberg is internationally known for the purist filmmaking movement, Dogme 95.
The Man Who Sold His Skin is a good movie but Another Round is better, in our opinion and deserves its win.
While The Man Who Sold His Skin didn't win in its category, the other African film, My Octopus Teacher, took home the prize for Best Documentary Feature.
My Octopus Teacher is a South African Documentary by Craig Foster, Pippa Ehrlich and James Reed. We loved My Octopus teacher and are not surprised it won the Oscars. However, we were surprised that it didn't even make it into the nominee list for the Best Documentary Feature category in the African Movie Academy Awards that held earlier in the year.
My Octopus Teacher was a no-brainer for us here at AMDB.tv and if it hadn't won the Oscars, it can be rest assured that it won in our hearts. My Octopus Teacher was up against the likes of The Mole Agent, Collective, Crip Camp and Time.
My Octopus Teacher tells the story of a human-octopus friendship starring South African film-maker and diver, Craig Foster, as he explores an underwater kelp forest near Cape Town, South Africa, where he meets and forms a friendship with an octopus over her 18-month lifespan.
My Octopus Teacher, which started as a personal video project was 10 years in the making. The film is everything a film should be. It is uplifting, life-changing and it has heart. We say a big congratulations to the producer and directors of this great feature. They deserved their win.
My Octopus Teacher red carpet interview
Prior to the Oscars, My Octopus teacher had already garnered several awards in 2020 including the Critics Choice Documentary Awards for Best Science/Nature Documentary and Best Cinematography, the BAFTA Awards for Best Documentary and the PGA Awards for Best Documentary.
The documentary also won the Grand Teton Award at the Jackson Wild Media Awards where it received 8 nominations and the Best Feature Film Award at the EarthX film festival.
You can see my Octopus Teacher on Netflix.
We hope to see more African projects compete on an international level.
Tell us in the comment section what you think about the just concluded 93rd Academy Awards ceremony and what African filmmakers can do to get better.
Previous Post 2021 Oscars: Tunisia Gets Nominated For Best International Feature FilmAfrican Films, Film AwardsMarch 16, 2021


text:
Engage Princeton is an annual event where community members can interact with representatives of community, municipal and non-profit entities and learn about opportunities to collaborate with them. See past events HERE.
Housing Justice Forum
December 10: 11am -3pm (in person and Virtual) Register HERE.
Please register HERE for the in-person event.
To attend virtually, please join us via Zoom HERE.
11 a.m. – Panel Discussion: "How Did We Get Here?"
This panel will offer national and regional context for the housing crisis.
Jacob William Faber is an Associate Professor of Sociology and Public Service in New York University's Robert F. Wagner School of Public Service and holds a joint appointment in NYU's Sociology Department. His research and teaching focuses on spatial inequality. He leverages observational and experimental methods to study the mechanisms responsible for sorting individuals across space and how the distributions of people by race and class interact with political, social, and ecological systems to create and sustain economic disparities. Through investigation of several aspects of American life, he demonstrates that a pattern of "institutional marginalization" emerges as a powerful mechanism connecting segregation to socioeconomic disadvantage.
Ellora Derenoncourt is an Assistant Professor of Economics at Princeton University and a member of the Industrial Relations Section of Princeton Economics. Derenoncourt is the founder and faculty director for the Program for Research on Inequality at Princeton Economics. She works on labor economics, economic history, and the study of inequality.
Douglas Massey is Henry G. Bryant Professor of Sociology and Public Affairs, with a joint appointment in The Princeton School of Public and International Affairs. A member of the National Academy of Sciences, the American Academy of Arts and Sciences, and the American Philosophical Society, he is the current president of the American Academy of Political and Social Science and is a member of the Council of the National Academy of Sciences and co-editor of the Annual Review of Sociology. Massey's research focuses on international migration, race and housing, discrimination, education, urban poverty, stratification, and Latin America, especially Mexico. He is the author, most recently, of Brokered Boundaries: Constructing Immigrant Identity in Anti-Immigrant Times, coauthored with Magaly Sanchez and Published by the Russell Sage Foundation.
Moderator: Thomas J. Sugrue is Silver Professor of Social and Cultural Analysis and History and Director of the Cities Collaborative at New York University. He is the author or editor of nine books, including the Bancroft Prize winning, Origins of the Urban Crisis; the first sweeping history of the civil rights movement outside the south, Sweet Land of Liberty: The Forgotten Struggle for CIvil Rights in the North; and Not Even Past: Barack Obama and the Burden of Race. His newest book is The Long Year: A 2020 Reader. Sugrue has served as an expert witness for several voting rights, civil rights, and housing discrimination cases and has been president of the Urban History Association and the Social Science History Association.
Noon – Lunch (provided as part of the in-person event)
1 p.m. – Panel Discussion: "What Can We Do?"
The panel highlights various contemporary solutions being explored and the interplaying factors among them – especially in the Princeton area.
Sara Bronin is a Mexican-American architect, attorney, and policymaker specializing in property, land use, historic preservation, and climate change. She is a professor of planning and law at Cornell University, and she was recently nominated by President Biden to Chair the Advisory Council on Historic Preservation, pending Senate confirmation. She founded and directs the National Zoning Atlas, has served as an advisor to the National Trust for Historic Preservation and the Sustainable Development Code, served on the board of Latinos in Heritage Conservation, and founded Desegregate Connecticut. She was educated at Yale Law School (Truman Scholar), Oxford (Rhodes Scholar), and the University of Texas. She is the author of the forthcoming book, Key to the City.
Jean Pierre Brutus is a senior counsel in the Economic Justice Program at the New Jersey Institute for Social Justice. Prior to joining the Institute, Jean-Pierre worked at Bronx Legal Services, where he represented indigent Bronx tenants facing eviction in various courts and administrative proceedings.Jean-Pierre is a 2007 graduate of Georgetown University, graduating with a major in Sociology and a minor in African American Studies. As a graduate of the JD/PhD program at Northwestern University, Jean-Pierre is a graduate of Northwestern Pritzker School of Law and he earned his PhD in African American Studies from The Graduate School at Northwestern University. As a law student, Jean-Pierre served as a senior articles editor for the Journal of Law and Social Policy. As a PhD student, he also served as an assistant editor of the Journal of Africana Religions. Jean-Pierre wrote a dissertation that examined the origins of Black politics outside of the traditional public sphere to conceptualize the counterpublic of Black politics as bifurcated into a civil and uncivil Black politics.
Peter Kasabach is the Executive Director of New Jersey Future, a nonprofit statewide policy and practice organization that advocates for strong, healthy, and resilient communities for everyone. Prior to joining New Jersey Future, Peter served as the Chief of Policy for the New Jersey Housing and Mortgage Finance Agency, and prior to that led all planning and real estate programs at the Trenton-based community development organization Isles. Peter has been active in many community revitalization efforts on topics including the visual arts, historic preservation, housing, economic development, climate change, public education, and green building. He is an advocate for walkable, urban living and lives and works in Trenton, NJ. Peter is a licensed New Jersey Professional Planner, and holds a B.S. in Economics from the Wharton School of the University of Pennsylvania.
Moderator: Matt Mleczko is a doctoral candidate in Population Studies and Social Policy and a Prize Fellow in the Social Sciences at Princeton University. He primarily studies housing inequality and housing policy, with a particular interest in policies that promote affordable housing and integrated, cohesive communities. His dissertation explores the evolution of residential integration in the 21st century and its connection to zoning and land use policy. Matt is also a graduate student researcher with the Eviction Lab and a member of the Princeton Affordable Housing Board.
2 p.m. – Action Fair
In-person attendees will have the opportunity to connect with people and organizations who are working on housing and related efforts locally. All attendees will have access to a resource guide listing local organizations and initiatives.


This review appears on The Upcoming website here.
The Paddy Lincoln Gang is a drama about an Irish punk-rock band. Rob McAlister (Dean S. Jagger) is the front man of the band, stuck with a difficult decision to make about the future of the band after a disastrous meeting with a top record label. Steady Eddie (Joseph DiMasso) and Rick (Richard Wagner) – the drummer and the bass player – are getting lazy and uncontrollable and the label have decided to drop the band unless Rob and songwriter Tom (Demetri Watkins) get rid of Eddie and Rick. Rob is also dealing with his own dark past, a past that threatens to explode at any moment.
Not knowing anything about the film is probably not recommended. The film's opening is reminiscent of a horror film, though the majority of the film plays out as a simple drama. The opening was probably intended to give the audience a sense of unease but, unfortunately, it gives the film an unfocussed feel. Almost the entirety of the film feels like build-up, but the film never really delivers. Instead, the majority of the film is taken up with Rob and Tom's dilemma – what to do about Eddie and Rick – and the film is merely a tame drama about loyalty and music. It is tacky, full of lines about following your heart and letting the music take control – the kind of self-dramatising typical of films about musicians. Glen Matlock has a rather terrible cameo.
It doesn't help that an opening monologue establishes that the band members are pretty unlikeable. Eddie and Rick have few character traits beyond their hedonism and misogyny, while Rob is almost entirely passive. Tom is so shy that it is difficult to imagine him hanging around with these people. There is a long sequence in which the band – apparently the hottest new band to break America – is interviewed for television, but it is wholly unconvincing and awkward.
Eventually, there is a twist near the end, which should tie the film together but which instead introduces a totally different – and much more misogynistic – turn to the film. The finished film could be interpreted, begrudgingly, as a story about the pains of the creative process, but really it just seems to be a cheap, tacky drama about loyalty. It is a fairly bland story, messily told with undeveloped characters. The actors are fine, but the film needs a little more thought.


Credit: Mercer Museum. From left: Serafina Fleming and Sirui Chen at the 2018 History Day Regional Competition.
The 2019 National History Day regional competition for Bucks and Montgomery counties will be held on Saturday, March 30 from 9 a.m. to 2 p.m. at Delaware Valley University in Doylestown, Pennsylvania. First-place winners who are seniors will have a chance to qualify for DelVal scholarships worth up to $25,000 annually.
The competition will be coordinated by the Bucks County Historical Society, which oversees Mercer Museum and Fonthill Castle in Doylestown, in collaboration with professors and staff at DelVal.
National History Day is an annual academic enrichment program for students in grades 6 through 12 that encourages thoughtful historical research, project-based learning and a dose of friendly competition, as individuals or as a group, in one of five distinct categories: exhibits, papers, websites, documentary films and performances. More than 175 students from Bucks and Montgomery counties participate in the regional event, and regional winners move on to the state level competition.
Guided by an annual theme, students are encouraged to choose a topic that matches their personal interests. The 2019 theme is "Triumph and Tragedy in History", and allows middle and high school students to take history beyond the classroom.
The University will offer Presidential Scholarships to the first-place winners in the senior individual exhibit, the senior documentary, the senior website and the senior paper categories. The Presidential Scholarship is a merit award that is based on past academic achievement and encourages academic success and rigor at the University. The scholarship is worth up to $25,000 annually. To qualify, winners must be high school seniors in good academic standing, apply, be offered admission and enroll at DelVal in the Fall of 2019 meeting all stated criteria as first-time freshmen students. Eligible students will be required to show proof of their achievement in the competition at the time of application. Students are eligible for one academic scholarship at the University. A student will be granted the highest of any offer of institutional merit scholarship.
The Bucks County Historical Society will be offering a monetary award of $250 for this year's winning student project focused on any aspect of Pennsylvania history that ties into the National History Day theme.
For more information, please visit mercermuseum.org/national-history-day.