text:
/* tslint:disable:no-empty naming-convention no-magic-numbers mocha-no-side-effect-code max-func-body-length */
import { FocusOrigin, ListKeyManagerModifierKey } from '@angular/cdk/a11y';
import { DOWN_ARROW, END, HOME, LEFT_ARROW, RIGHT_ARROW, TAB, UP_ARROW } from '@angular/cdk/keycodes';
import { QueryList } from '@angular/core';
import {
    FocusKeyManager,
    ListKeyManager
} from '@ptsecurity/cdk/a11y';
import { createKeyboardEvent } from '@ptsecurity/cdk/testing';
import { take } from 'rxjs/operators';

class FakeFocusable {
    /** Whether the item is disabled or not. */
    disabled = false;
    /** Test property that can be used to test the `skipPredicate` functionality. */
    skipItem = false;

    constructor(private _label = '') {}

    focus(_origin?: FocusOrigin) {}

    getLabel() {
        return this._label;
    }
}

interface KeyEventTestContext {
    nextKeyEvent: KeyboardEvent;
    prevKeyEvent: KeyboardEvent;
}

describe('Key managers', () => {
    let itemList: QueryList<any>;
    let fakeKeyEvents: {
        downArrow: KeyboardEvent;
        upArrow: KeyboardEvent;
        leftArrow: KeyboardEvent;
        rightArrow: KeyboardEvent;
        tab: KeyboardEvent;
        home: KeyboardEvent;
        end: KeyboardEvent;
        unsupported: KeyboardEvent;
    };

    beforeEach(() => {
        itemList = new QueryList<any>();
        fakeKeyEvents = {
            downArrow: createKeyboardEvent('keydown', DOWN_ARROW),
            upArrow: createKeyboardEvent('keydown', UP_ARROW),
            leftArrow: createKeyboardEvent('keydown', LEFT_ARROW),
            rightArrow: createKeyboardEvent('keydown', RIGHT_ARROW),
            tab: createKeyboardEvent('keydown', TAB),
            home: createKeyboardEvent('keydown', HOME),
            end: createKeyboardEvent('keydown', END),
            unsupported: createKeyboardEvent('keydown', 192) // corresponds to the tilde character (~)
        };
    });

    describe('ListKeyManager', () => {
        // We have a spy on the `setActiveItem` method of the list key manager. That method has
        // multiple overloads and TypeScript is unable to infer the right parameters when calls are
        // checked using jasmine's `hasBeenCalledWith` matcher. We work around this by explicitly
        // specifying the overload signature that should be used.
        // TODO: remove if https://github.com/DefinitelyTyped/DefinitelyTyped/issues/42455 is solved.
        let keyManager: Omit<ListKeyManager<FakeFocusable>, 'setActiveItem'> & {
            setActiveItem(index: number): void;
        };

        beforeEach(() => {
            itemList.reset([
                new FakeFocusable('one'),
                new FakeFocusable('two'),
                new FakeFocusable('three')
            ]);
            keyManager = new ListKeyManager<FakeFocusable>(itemList);

            // first item is already focused
            keyManager.setFirstItemActive();

            spyOn(keyManager, 'setActiveItem').and.callThrough();
        });

        it('should maintain the active item if the amount of items changes', () => {
            expect(keyManager.activeItemIndex).toBe(0);
            expect(keyManager.activeItem!.getLabel()).toBe('one');
            itemList.reset([
                new FakeFocusable('zero'),
                ...itemList.toArray()
            ]);
            itemList.notifyOnChanges();

            expect(keyManager.activeItemIndex).toBe(1);
            expect(keyManager.activeItem!.getLabel()).toBe('one');
        });

        xit('should start off the activeItem as null', () => {
            expect(new ListKeyManager([] as any).activeItem).toBeNull();
        });

        xit('should set the activeItem to null if an invalid index is passed in', () => {
            keyManager.setActiveItem(1337);
            expect(keyManager.activeItem).toBeNull();
        });

        describe('Key events', () => {

            it('should emit tabOut when the tab key is pressed', () => {
                const spy = jasmine.createSpy('tabOut spy');
                keyManager.tabOut.pipe(take(1)).subscribe(spy);
                keyManager.onKeydown(fakeKeyEvents.tab);

                expect(spy).toHaveBeenCalled();
            });

            it('should emit tabOut when the tab key is pressed with a modifier', () => {
                const spy = jasmine.createSpy('tabOut spy');
                keyManager.tabOut.pipe(take(1)).subscribe(spy);

                Object.defineProperty(fakeKeyEvents.tab, 'shiftKey', { get: () => true });
                keyManager.onKeydown(fakeKeyEvents.tab);

                expect(spy).toHaveBeenCalled();
            });

            it('should emit an event whenever the active item changes', () => {
                const spy = jasmine.createSpy('change spy');
                const subscription = keyManager.change.subscribe(spy);

                keyManager.onKeydown(fakeKeyEvents.downArrow);
                expect(spy).toHaveBeenCalledTimes(1);

                keyManager.onKeydown(fakeKeyEvents.upArrow);
                expect(spy).toHaveBeenCalledTimes(2);

                subscription.unsubscribe();
            });

            xit('should emit if the active item changed, but not the active index', () => {
                const spy = jasmine.createSpy('change spy');
                const subscription = keyManager.change.subscribe(spy);

                keyManager.setActiveItem(0);
                itemList.reset([
                    new FakeFocusable('zero'),
                    ...itemList.toArray()
                ]);
                keyManager.setActiveItem(0);

                expect(spy).toHaveBeenCalledTimes(1);
                subscription.unsubscribe();
            });

            it('should activate the first item when pressing down on a clean key manager', () => {
                keyManager = new ListKeyManager<FakeFocusable>(itemList);

                expect(keyManager.activeItemIndex)
                    .withContext('Expected active index to default to -1.').toBe(-1);

                keyManager.onKeydown(fakeKeyEvents.downArrow);

                expect(keyManager.activeItemIndex)
                    .withContext('Expected first item to become active.').toBe(0);
            });

            it('should not prevent the default keyboard action when pressing tab', () => {
                expect(fakeKeyEvents.tab.defaultPrevented).toBe(false);

                keyManager.onKeydown(fakeKeyEvents.tab);

                expect(fakeKeyEvents.tab.defaultPrevented).toBe(false);
            });

            it('should not do anything for unsupported key presses', () => {
                keyManager.setActiveItem(1);

                expect(keyManager.activeItemIndex).toBe(1);
                expect(fakeKeyEvents.unsupported.defaultPrevented).toBe(false);

                keyManager.onKeydown(fakeKeyEvents.unsupported);

                expect(keyManager.activeItemIndex).toBe(1);
                expect(fakeKeyEvents.unsupported.defaultPrevented).toBe(false);
            });

            it('should ignore the horizontal keys when only in vertical mode', () => {
                keyManager.withVerticalOrientation().withHorizontalOrientation(null);

                expect(keyManager.activeItemIndex).toBe(0);

                keyManager.onKeydown(fakeKeyEvents.rightArrow);

                expect(keyManager.activeItemIndex).toBe(0);
                expect(fakeKeyEvents.rightArrow.defaultPrevented).toBe(false);
            });

            it('should ignore the vertical keys when only in horizontal mode', () => {
                keyManager.withVerticalOrientation(false).withHorizontalOrientation('ltr');

                expect(keyManager.activeItemIndex).toBe(0);

                keyManager.onKeydown(fakeKeyEvents.downArrow);

                expect(keyManager.activeItemIndex).toBe(0);
                expect(fakeKeyEvents.downArrow.defaultPrevented).toBe(false);
            });

            describe('withHomeAndEnd', () => {
                beforeEach(() => {
                    keyManager.withHomeAndEnd();
                });

                it('should focus the first item when Home is pressed', () => {
                    keyManager.setActiveItem(1);
                    expect(keyManager.activeItemIndex).toBe(1);

                    keyManager.onKeydown(fakeKeyEvents.home);

                    expect(keyManager.activeItemIndex).toBe(0);
                });

                it('should focus the last item when End is pressed', () => {
                    keyManager.setActiveItem(0);
                    expect(keyManager.activeItemIndex).toBe(0);

                    keyManager.onKeydown(fakeKeyEvents.end);
                    keyManager.setActiveItem(itemList.toArray()[2]);
                    expect(keyManager.activeItemIndex).toBe(itemList.length - 1);
                });
            });

            describe('with `vertical` direction', function (this: KeyEventTestContext) {
                beforeEach(() => {
                    keyManager.withVerticalOrientation();
                    this.nextKeyEvent = createKeyboardEvent('keydown', DOWN_ARROW);
                    this.prevKeyEvent = createKeyboardEvent('keydown', UP_ARROW);
                });

                runDirectionalKeyTests.call(this);
            });

            describe('with `ltr` direction', function (this: KeyEventTestContext) {
                beforeEach(() => {
                    keyManager.withHorizontalOrientation('ltr');
                    this.nextKeyEvent = createKeyboardEvent('keydown', RIGHT_ARROW);
                    this.prevKeyEvent = createKeyboardEvent('keydown', LEFT_ARROW);
                });

                runDirectionalKeyTests.call(this);
            });

            describe('with `rtl` direction', function (this: KeyEventTestContext) {
                beforeEach(() => {
                    keyManager.withHorizontalOrientation('rtl');
                    this.nextKeyEvent = createKeyboardEvent('keydown', LEFT_ARROW);
                    this.prevKeyEvent = createKeyboardEvent('keydown', RIGHT_ARROW);
                });

                runDirectionalKeyTests.call(this);
            });

            /**
             * Defines the directional key tests that should be run in a particular context. Note that
             * parameters have to be passed in via Jasmine's context object (`this` inside a `beforeEach`)
             * because this function has to run before any `beforeEach`, `beforeAll` etc. hooks.
             */
            function runDirectionalKeyTests(this: KeyEventTestContext) {
                it('should set subsequent items as active when the next key is pressed', () => {
                    keyManager.onKeydown(this.nextKeyEvent);

                    expect(keyManager.activeItemIndex)
                        .withContext('Expected active item to be 1 after one next key event.').toBe(1);
                    expect(keyManager.setActiveItem).not.toHaveBeenCalledWith(0);
                    expect(keyManager.setActiveItem).toHaveBeenCalledWith(1);
                    expect(keyManager.setActiveItem).not.toHaveBeenCalledWith(2);

                    keyManager.onKeydown(this.nextKeyEvent);
                    expect(keyManager.activeItemIndex)
                        .withContext('Expected active item to be 2 after two next key events.').toBe(2);
                    expect(keyManager.setActiveItem).toHaveBeenCalledWith(2);
                    expect(keyManager.setActiveItem).not.toHaveBeenCalledWith(0);
                });

                it('should set first item active when the next key is pressed if no active item', () => {
                    keyManager.setActiveItem(-1);
                    keyManager.onKeydown(this.nextKeyEvent);

                    expect(keyManager.activeItemIndex)
                        .withContext('Expected active item to be 0 after next key if active item was null.')
                        .toBe(0);
                    expect(keyManager.setActiveItem).toHaveBeenCalledWith(0);
                    expect(keyManager.setActiveItem).not.toHaveBeenCalledWith(1);
                    expect(keyManager.setActiveItem).not.toHaveBeenCalledWith(2);
                });

                it('should set previous items as active when the previous key is pressed', () => {
                    keyManager.onKeydown(this.nextKeyEvent);

                    expect(keyManager.activeItemIndex)
                        .withContext('Expected active item to be 1 after one next key event.').toBe(1);
                    expect(keyManager.setActiveItem).not.toHaveBeenCalledWith(0);
                    expect(keyManager.setActiveItem).toHaveBeenCalledWith(1);

                    keyManager.onKeydown(this.prevKeyEvent);
                    expect(keyManager.activeItemIndex)
                        .withContext('Expected active item to be 0 after one next and one previous key event.')
                        .toBe(0);
                    expect(keyManager.setActiveItem).toHaveBeenCalledWith(0);
                });

                it('should do nothing when the prev key is pressed if no active item and not wrap', () => {
                    keyManager.setActiveItem(-1);
                    keyManager.onKeydown(this.prevKeyEvent);

                    expect(keyManager.activeItemIndex)
                        .withContext('Expected nothing to happen if prev event occurs and no active item.')
                        .toBe(-1);
                    expect(keyManager.setActiveItem).not.toHaveBeenCalledWith(0);
                    expect(keyManager.setActiveItem).not.toHaveBeenCalledWith(1);
                    expect(keyManager.setActiveItem).not.toHaveBeenCalledWith(2);
                });

                it('should skip disabled items', () => {
                    const items = itemList.toArray();
                    items[1].disabled = true;
                    itemList.reset(items);

                    // Next event should skip past disabled item from 0 to 2
                    keyManager.onKeydown(this.nextKeyEvent);
                    expect(keyManager.activeItemIndex)
                        .withContext('Expected active item to skip past disabled item on next event.').toBe(2);
                    expect(keyManager.setActiveItem).not.toHaveBeenCalledWith(0);
                    expect(keyManager.setActiveItem).not.toHaveBeenCalledWith(1);
                    expect(keyManager.setActiveItem).toHaveBeenCalledWith(2);

                    // Previous event should skip past disabled item from 2 to 0
                    keyManager.onKeydown(this.prevKeyEvent);
                    expect(keyManager.activeItemIndex)
                        .withContext('Expected active item to skip past disabled item on up arrow.').toBe(0);
                    expect(keyManager.setActiveItem).toHaveBeenCalledWith(0);
                    expect(keyManager.setActiveItem).not.toHaveBeenCalledWith(1);
                });

                it('should work normally when disabled property does not exist', () => {
                    const items = itemList.toArray();
                    items[0].disabled = undefined;
                    items[1].disabled = undefined;
                    items[2].disabled = undefined;
                    itemList.reset(items);

                    keyManager.onKeydown(this.nextKeyEvent);
                    expect(keyManager.activeItemIndex)
                        .withContext('Expected active item to be 1 after one next event when disabled not set.')
                        .toBe(1);
                    expect(keyManager.setActiveItem).not.toHaveBeenCalledWith(0);
                    expect(keyManager.setActiveItem).toHaveBeenCalledWith(1);
                    expect(keyManager.setActiveItem).not.toHaveBeenCalledWith(2);

                    keyManager.onKeydown(this.nextKeyEvent);
                    expect(keyManager.activeItemIndex)
                        .withContext('Expected active item to be 2 after two next events when ' +
                            'disabled not set.').toBe(2);
                    expect(keyManager.setActiveItem).not.toHaveBeenCalledWith(0);
                    expect(keyManager.setActiveItem).toHaveBeenCalledWith(2);
                });

                it('should not move active item past either end of the list', () => {
                    keyManager.onKeydown(this.nextKeyEvent);
                    keyManager.onKeydown(this.nextKeyEvent);
                    expect(keyManager.activeItemIndex)
                        .withContext(`Expected last item of the list to be active.`).toBe(2);

                    // This next event would move active item past the end of the list
                    keyManager.onKeydown(this.nextKeyEvent);
                    expect(keyManager.activeItemIndex)
                        .withContext(`Expected active item to remain at the end of the list.`).toBe(2);

                    keyManager.onKeydown(this.prevKeyEvent);
                    keyManager.onKeydown(this.prevKeyEvent);
                    expect(keyManager.activeItemIndex)
                        .withContext(`Expected first item of the list to be active.`).toBe(0);

                    // This prev event would move active item past the beginning of the list
                    keyManager.onKeydown(this.prevKeyEvent);
                    expect(keyManager.activeItemIndex)
                        .withContext(`Expected active item to remain at the beginning of the list.`).toBe(0);
                });

                it('should not move active item to end when the last item is disabled', () => {
                    const items = itemList.toArray();
                    items[2].disabled = true;
                    itemList.reset(items);

                    keyManager.onKeydown(this.nextKeyEvent);
                    expect(keyManager.activeItemIndex)
                        .withContext(`Expected second item of the list to be active.`).toBe(1);

                    // This next key event would set active item to the last item, which is disabled
                    keyManager.onKeydown(this.nextKeyEvent);
                    expect(keyManager.activeItemIndex)
                        .withContext(`Expected the second item to remain active.`).toBe(1);
                    expect(keyManager.setActiveItem).not.toHaveBeenCalledWith(2);
                });

                it('should prevent the default keyboard action of handled events', () => {
                    expect(this.nextKeyEvent.defaultPrevented).toBe(false);
                    keyManager.onKeydown(this.nextKeyEvent);
                    expect(this.nextKeyEvent.defaultPrevented).toBe(true);

                    expect(this.prevKeyEvent.defaultPrevented).toBe(false);
                    keyManager.onKeydown(this.prevKeyEvent);
                    expect(this.prevKeyEvent.defaultPrevented).toBe(true);
                });

                xit('should not do anything for arrow keys if the alt key is held down', () => {
                    runModifierKeyTest(this, 'altKey');
                });

                xit('should not do anything for arrow keys if the control key is held down', () => {
                    runModifierKeyTest(this, 'ctrlKey');
                });

                xit('should not do anything for arrow keys if the meta key is held down', () => {
                    runModifierKeyTest(this, 'metaKey');
                });

                xit('should not do anything for arrow keys if the shift key is held down', () => {
                    runModifierKeyTest(this, 'shiftKey');
                });

            }

            /** Runs the test that asserts that we handle modifier keys correctly. */
            function runModifierKeyTest(
                context: { nextKeyEvent: KeyboardEvent; prevKeyEvent: KeyboardEvent }, modifier: ListKeyManagerModifierKey
            ) {
                const initialActiveIndex = keyManager.activeItemIndex;
                const spy = jasmine.createSpy('change spy');
                const subscription = keyManager.change.subscribe(spy);

                expect(context.nextKeyEvent.defaultPrevented).toBe(false);
                expect(context.prevKeyEvent.defaultPrevented).toBe(false);

                Object.defineProperty(context.nextKeyEvent, modifier, { get: () => true });
                Object.defineProperty(context.prevKeyEvent, modifier, { get: () => true });

                keyManager.onKeydown(context.nextKeyEvent);
                expect(context.nextKeyEvent.defaultPrevented).toBe(false);
                expect(keyManager.activeItemIndex).toBe(initialActiveIndex);
                expect(spy).not.toHaveBeenCalled();

                keyManager.onKeydown(context.prevKeyEvent);
                expect(context.prevKeyEvent.defaultPrevented).toBe(false);
                expect(keyManager.activeItemIndex).toBe(initialActiveIndex);
                expect(spy).not.toHaveBeenCalled();

                subscription.unsubscribe();
            }

        });

        describe('programmatic focus', () => {

            it('should setActiveItem()', () => {
                expect(keyManager.activeItemIndex)
                    .withContext(`Expected first item of the list to be active.`).toBe(0);

                keyManager.setActiveItem(1);
                expect(keyManager.activeItemIndex)
                    .withContext(`Expected activeItemIndex to be updated when setActiveItem() was called.`)
                    .toBe(1);
            });

            it('should be able to set the active item by reference', () => {
                expect(keyManager.activeItemIndex)
                    .withContext(`Expected first item of the list to be active.`).toBe(0);

                keyManager.setActiveItem(itemList.toArray()[2]);
                expect(keyManager.activeItemIndex)
                    .withContext(`Expected activeItemIndex to be updated.`).toBe(2);
            });

            it('should be able to set the active item without emitting an event', () => {
                const spy = jasmine.createSpy('change spy');
                const subscription = keyManager.change.subscribe(spy);

                expect(keyManager.activeItemIndex).toBe(0);

                keyManager.updateActiveItem(2);

                expect(keyManager.activeItemIndex).toBe(2);
                expect(spy).not.toHaveBeenCalled();

                subscription.unsubscribe();
            });

            it('should expose the active item correctly', () => {
                keyManager.onKeydown(fakeKeyEvents.downArrow);

                expect(keyManager.activeItemIndex)
                    .withContext('Expected active item to be the second option.').toBe(1);
                expect(keyManager.activeItem)
                    .withContext('Expected the active item to match the second option.')
                    .toBe(itemList.toArray()[1]);

                keyManager.onKeydown(fakeKeyEvents.downArrow);
                expect(keyManager.activeItemIndex)
                    .withContext('Expected active item to be the third option.').toBe(2);
                expect(keyManager.activeItem)
                    .withContext('Expected the active item ID to match the third option.')
                    .toBe(itemList.toArray()[2]);
            });

            it('should setFirstItemActive()', () => {
                keyManager.onKeydown(fakeKeyEvents.downArrow);
                keyManager.onKeydown(fakeKeyEvents.downArrow);
                expect(keyManager.activeItemIndex)
                    .withContext(`Expected last item of the list to be active.`).toBe(2);

                keyManager.setFirstItemActive();
                expect(keyManager.activeItemIndex)
                    .withContext(`Expected setFirstItemActive() to set the active item to the first item.`)
                    .toBe(0);
            });

            it('should set the active item to the second item if the first one is disabled', () => {
                const items = itemList.toArray();
                items[0].disabled = true;
                itemList.reset(items);

                keyManager.setFirstItemActive();
                expect(keyManager.activeItemIndex)
                    .withContext(`Expected the second item to be active if the first was disabled.`).toBe(1);
            });

            it('should setLastItemActive()', () => {
                expect(keyManager.activeItemIndex)
                    .withContext(`Expected first item of the list to be active.`).toBe(0);

                keyManager.setLastItemActive();
                expect(keyManager.activeItemIndex)
                    .withContext(`Expected setLastItemActive() to set the active item to the last item.`)
                    .toBe(2);
            });

            it('should set the active item to the second to last item if the last is disabled', () => {
                const items = itemList.toArray();
                items[2].disabled = true;
                itemList.reset(items);

                keyManager.setLastItemActive();
                expect(keyManager.activeItemIndex)
                    .withContext(`Expected the second to last item to be active if the last was disabled.`)
                    .toBe(1);
            });

            it('should setNextItemActive()', () => {
                expect(keyManager.activeItemIndex)
                    .withContext(`Expected first item of the list to be active.`).toBe(0);

                keyManager.setNextItemActive();
                expect(keyManager.activeItemIndex)
                    .withContext(`Expected setNextItemActive() to set the active item to the next item.`)
                    .toBe(1);
            });

            it('should set the active item to the next enabled item if next is disabled', () => {
                const items = itemList.toArray();
                items[1].disabled = true;
                itemList.reset(items);

                expect(keyManager.activeItemIndex)
                    .withContext(`Expected first item of the list to be active.`).toBe(0);

                keyManager.setNextItemActive();
                expect(keyManager.activeItemIndex)
                    .withContext(`Expected setNextItemActive() to only set enabled items as active.`).toBe(2);
            });

            it('should setPreviousItemActive()', () => {
                keyManager.onKeydown(fakeKeyEvents.downArrow);
                expect(keyManager.activeItemIndex)
                    .withContext(`Expected second item of the list to be active.`).toBe(1);

                keyManager.setPreviousItemActive();
                expect(keyManager.activeItemIndex)
                    .withContext(`Expected setPreviousItemActive() to set the active item to the previous.`)
                    .toBe(0);
            });

            it('should skip disabled items when setPreviousItemActive() is called', () => {
                const items = itemList.toArray();
                items[1].disabled = true;
                itemList.reset(items);

                keyManager.onKeydown(fakeKeyEvents.downArrow);
                keyManager.onKeydown(fakeKeyEvents.downArrow);
                expect(keyManager.activeItemIndex)
                    .withContext(`Expected third item of the list to be active.`).toBe(2);

                keyManager.setPreviousItemActive();
                expect(keyManager.activeItemIndex)
                    .withContext(`Expected setPreviousItemActive() to skip the disabled item.`).toBe(0);
            });

            it('should not emit an event if the item did not change', () => {
                const spy = jasmine.createSpy('change spy');
                const subscription = keyManager.change.subscribe(spy);

                keyManager.setActiveItem(2);
                keyManager.setActiveItem(2);

                expect(spy).toHaveBeenCalledTimes(1);

                subscription.unsubscribe();
            });

        });

        describe('wrap mode', () => {

            it('should return itself to allow chaining', () => {
                expect(keyManager.withWrap())
                    .withContext(`Expected withWrap() to return an instance of ListKeyManager.`)
                    .toEqual(keyManager);
            });

            it('should wrap focus when arrow keying past items while in wrap mode', () => {
                keyManager.withWrap();
                keyManager.onKeydown(fakeKeyEvents.downArrow);
                keyManager.onKeydown(fakeKeyEvents.downArrow);

                expect(keyManager.activeItemIndex)
                    .withContext('Expected last item to be active.').toBe(2);

                // this down arrow moves down past the end of the list
                keyManager.onKeydown(fakeKeyEvents.downArrow);
                expect(keyManager.activeItemIndex)
                    .withContext('Expected active item to wrap to beginning.').toBe(0);

                // this up arrow moves up past the beginning of the list
                keyManager.onKeydown(fakeKeyEvents.upArrow);
                expect(keyManager.activeItemIndex)
                    .withContext('Expected active item to wrap to end.').toBe(2);
            });

            it('should set last item active when up arrow is pressed if no active item', () => {
                keyManager.withWrap();
                keyManager.setActiveItem(-1);
                keyManager.onKeydown(fakeKeyEvents.upArrow);

                expect(keyManager.activeItemIndex)
                    .withContext('Expected last item to be active on up arrow if no active item.').toBe(2);
                expect(keyManager.setActiveItem).not.toHaveBeenCalledWith(0);
                expect(keyManager.setActiveItem).toHaveBeenCalledWith(2);

                keyManager.onKeydown(fakeKeyEvents.downArrow);
                expect(keyManager.activeItemIndex)
                    .withContext('Expected active item to be 0 after wrapping back to beginning.').toBe(0);
                expect(keyManager.setActiveItem).toHaveBeenCalledWith(0);
            });

            // This test should pass if all items are disabled and the down arrow key got pressed.
            // If the test setup crashes or this test times out, this test can be considered as failed.
            it('should not get into an infinite loop if all items are disabled', () => {
                keyManager.withWrap();
                keyManager.setActiveItem(0);
                const items = itemList.toArray();
                items.forEach((item) => item.disabled = true);
                itemList.reset(items);

                keyManager.onKeydown(fakeKeyEvents.downArrow);
            });

            it('should be able to disable wrapping', () => {
                keyManager.withWrap();
                keyManager.setFirstItemActive();
                keyManager.onKeydown(fakeKeyEvents.upArrow);

                expect(keyManager.activeItemIndex).toBe(itemList.length - 1);

                keyManager.withWrap(false);
                keyManager.setFirstItemActive();
                keyManager.onKeydown(fakeKeyEvents.upArrow);

                expect(keyManager.activeItemIndex).toBe(0);
            });
        });

        describe('skip predicate', () => {

            it('should skip disabled items by default', () => {
                const items = itemList.toArray();
                items[1].disabled = true;
                itemList.reset(items);

                expect(keyManager.activeItemIndex).toBe(0);

                keyManager.onKeydown(fakeKeyEvents.downArrow);

                expect(keyManager.activeItemIndex).toBe(2);
            });

            it('should be able to skip items with a custom predicate', () => {
                keyManager.skipPredicate((item) => item.skipItem);

                const items = itemList.toArray();
                items[1].skipItem = true;
                itemList.reset(items);

                expect(keyManager.activeItemIndex).toBe(0);

                keyManager.onKeydown(fakeKeyEvents.downArrow);

                expect(keyManager.activeItemIndex).toBe(2);
            });
        });
    });

    describe('FocusKeyManager', () => {
        let keyManager: FocusKeyManager<FakeFocusable>;

        beforeEach(() => {
            itemList.reset([new FakeFocusable(), new FakeFocusable(), new FakeFocusable()]);
            keyManager = new FocusKeyManager<FakeFocusable>(itemList);

            // first item is already focused
            keyManager.setFirstItemActive();

            spyOn(itemList.toArray()[0], 'focus');
            spyOn(itemList.toArray()[1], 'focus');
            spyOn(itemList.toArray()[2], 'focus');
        });

        it('should focus subsequent items when down arrow is pressed', () => {
            keyManager.onKeydown(fakeKeyEvents.downArrow);

            expect(itemList.toArray()[0].focus).not.toHaveBeenCalled();
            expect(itemList.toArray()[1].focus).toHaveBeenCalledTimes(1);
            expect(itemList.toArray()[2].focus).not.toHaveBeenCalled();

            keyManager.onKeydown(fakeKeyEvents.downArrow);
            expect(itemList.toArray()[0].focus).not.toHaveBeenCalled();
            expect(itemList.toArray()[1].focus).toHaveBeenCalledTimes(1);
            expect(itemList.toArray()[2].focus).toHaveBeenCalledTimes(1);
        });

        it('should focus previous items when up arrow is pressed', () => {
            keyManager.onKeydown(fakeKeyEvents.downArrow);

            expect(itemList.toArray()[0].focus).not.toHaveBeenCalled();
            expect(itemList.toArray()[1].focus).toHaveBeenCalledTimes(1);

            keyManager.onKeydown(fakeKeyEvents.upArrow);

            expect(itemList.toArray()[0].focus).toHaveBeenCalledTimes(1);
            expect(itemList.toArray()[1].focus).toHaveBeenCalledTimes(1);
        });

        it('should allow setting the focused item without calling focus', () => {
            expect(keyManager.activeItemIndex)
                .withContext(`Expected first item of the list to be active.`).toBe(0);

            keyManager.updateActiveItem(1);
            expect(keyManager.activeItemIndex)
                .withContext(`Expected activeItemIndex to update after calling updateActiveItem().`)
                .toBe(1);
            expect(itemList.toArray()[1].focus).not.toHaveBeenCalledTimes(1);
        });

        it('should be able to set the focus origin', () => {
            keyManager.setFocusOrigin('mouse');

            keyManager.onKeydown(fakeKeyEvents.downArrow);
            expect(itemList.toArray()[1].focus).toHaveBeenCalledWith('mouse');

            keyManager.onKeydown(fakeKeyEvents.downArrow);
            expect(itemList.toArray()[2].focus).toHaveBeenCalledWith('mouse');

            keyManager.setFocusOrigin('keyboard');

            keyManager.onKeydown(fakeKeyEvents.upArrow);
            expect(itemList.toArray()[1].focus).toHaveBeenCalledWith('keyboard');
        });

    });
});


text:
Home / Societies / Kotoko fan in critical condition after gunshot wound
ghanapolitics 4 days ago Societies Leave a comment 11 Views
A supporter of Kumasi Asante Kotoko is battling for his life after he was allegedly hit by a stray 'rubber' bullet from Police personnel deployed to ensure security at the Baba Yara Sports stadium earlier today.
Kotoko were facing Berekum Chelsea in Match Day three of the Ghana Premier League this afternoon, and as is customary, police and other security personnel were deployed to the stadium to ensure the safety of life and property.
However, the game took an unfortunate turn when Kotoko supporters allegedly threw projectiles on the field during their shock 1-0 defeat to Berekum Chelsea, halting the Premier League match for several minutes on Sunday.
Angry supporters of the Porcupine Warriors were furious over decisions of the referee in their match against the visiting team which led to some throwing stones and sachet water directed at the match officials.
Some also tried to force a gate to the pitch open before security officials intervened to halt the action which could have spiraled out of control in the match.
Calm appeared to have been restored and the game continued until the end.
However, outside the stadium after the game, the disturbances continued.
A footage sighted by GhanaWeb has a man, clad in a Kotoko replica jersey, in a pool of blood with onlookers shouting that he (the victim) had been shot by a police officer.
The man was then seen being carried into an ambulance and conveyed to a nearby hospital.
GhanaWeb cannot independently confirm what occasioned the shooting or what resulted in the wound but we will update you as and when we get information.
Source: www.ghanaweb.com
Previous CPP opens nomination, flagbearer aspirants to pay ¢200K as filing fee
Next Gas explosion wipes out entire family at Ablekuma
The Supreme Court has slapped a cost of GHC5,000.00 against a senior lawyer who represented …

redpajama_set_name: RedPajamaCommonCrawl


text:
Who kidnapped President Ayuk Tabe and his cabinet members: When free Dr. Ojong Okongho and Barrister Nalowa Bih will give more details
VideoActualitésActualitésThe Fomunyoh Foundation (TFF) NEWS
Last updated Fév 23, 2018
Nigerian govt detains more Southern Cameroonian separatists
Five alleged members of the Ambazonia separatist movement, a Cameroonian group seeking independence from the Francophone country, are currently being detained at an Abuja Police station.
A PREMIUM TIMES reporter was on Wednesday not allowed to speak with the detainees when he visited the Asokoro Police station where they are being held.
According to Abdul Oroh, who has been providing legal support for the detainees, "two out of the five in custody are among the 12 leaders of the group the Nigerian government arrested last month."
Leader of the separatists, Julius Ayuk Tabe and 11 others who reportedly gathered at Nera Hotels Abuja on January 6 to discuss the influx of thousands of Cameroonian asylum seekers to Nigeria following protests in October were arrested and detained by Nigerian security for about a month. About 39 other Ambasonian separatist leaders were detained in Taraba.
Dozens of those arrested were handed over to Cameroon authorities by the Nigerian government.
Cameroonian authorities confirmed they received some of the activists and vowed to prosecute them.
According to Mr. Abdul, there was uncertainty over the number of the separatists deported and the ones still in custody because the Nigerian government failed to announce the deportation which is being celebrated by Cameroonian authorities as a major victory in a clampdown on Mr. Tabe and other leaders of the self-proclaimed Ambasonia state in English-speaking parts of Cameroon.
"Only 10 out of the 12 arrested on January 6 were deported. The remaining two resisted the deportation insisting that they are of Nigerian nationality. They are John Ojong Okongho and Nsoh Nabowah Bih and they are among the five people currently being detained," Mr. Oroh said.
Lire aussi: TENTATION MONARCHIQUE AU CAMEROUN
He said the other three, Winifred Augustine, ThankGod Genesis and Nasiru Bah, "were picked up randomly."
"The five of them were brought to the police headquarters yesterday in a military vehicle with handcuffs and leg chains before they were later taken to the Asokoro Police station.
"They granted us access to them, we interrogated them. The interesting thing they said is that they are convinced that they were arrested by Cameroonian soldiers", Mr. Abdul said.
"There is need to know whether Cameroonians can come to Nigeria, arrest people and keep them at the DIA (Defence Intelligence Agency) custody only to later pick them in a Cameroonian military air craft and take them to Cameroon.
"I don't know the agreement we had with them (Cameroon) but I don't think this is reasonable. This issue should be investigated thoroughly. The SSS are not involved, (for) the police, this is the first time they are hearing about the case.
"If this people have a problem with their government and they came to Nigeria to take refuge, we should protect them or hand them over to the UN high commission on refugee", he added.
Jimoh Moshood, police spokesperson, did not answer or return text messages sent to his phone on Wednesday.
The unrest in Cameroon began in November 2016, when English-speaking teachers and lawyers in the North-west and South-west regions took to the streets, calling for reforms and greater autonomy.
They said they were 'frustrated' with the dominance of the French language in official matters and 'marginalisation' of Cameroon's Anglophone population.
Lire aussi: Pr Fabien Eboussi sur une société qui se ment
The protests were followed by a harsh government crackdown, as well as internet shut-downs and arrests.
In October 2017, the secessionist group declared the independence of the so-called Anglophone "state" of Ambazonia. International rights groups say that between 20 and 40 people were killed in clashes since late September.
According to Amnesty International, at least 500 people were detained in the aftermath of the announcement.
The UNHCR, the UN refugee agency reported that it has registered over 7,000 Cameroonians from the Anglophone regions, who have fled the unrest in the country to Nigeria.
Nigerian activists and lawyers such as Femi Falana and Jiti Ogunye have condemned the treatment by Nigerian government of the Cameroonian separatists.
Cameroononline.org
Amateurismes, affairismes et non maîtrisent du terrain des oppérations sur le terrain par les officiers suppérieurs pousse Biya à créer une 5e région militaire
John Fru Ndi from HEROS TO ZEROS. , the Villain Of Southern Cameroons Ambazonia
Et si c'était elle ? Alternance. De nombreuses simulations de la succession à…
Dr Chris Fomunyoh nommé par le président Volodymyr Zelensky ambassadeur de…


No matter where you stay on South Whidbey you will enjoy peaceful surroundings, friendly people and lots of outdoor activities. Clinton is uniquely located at the southern entrance of Whidbey Island and staying in our small community allows for quick and convenient access to all Whidbey had to offer. Click on the links we have provided and find the perfect place to stay!
Clinton, Where all your Greatest Adventures begin!


text:
Q: How to get a predicted image of YOLOv5 model? I'm trying to load YOLOv5 model and using it to predict specific image. My problem is I want to show predicted image with bounding box into my application so I need to get it directly from the predict method of PyTorch to show in my application.
    model = torch.hub.load('yolov5', 'custom', path=model_name, force_reload=True,
    source='local')
    pred = model(image)
    pred.show() #show image but can't assign to a variable
    pred.save() #save image to runs\detect\exp

I want something like:
    predict_image = model(image)
    cv2.imshow('Predict', predict_image)

Thank you.

A: Because the Answer from @mak13 did not work for me and i wanted to understand this behaviour, here is my solution:
Simple get the image as variable
import torch
import pathlib

img_path = pathlib.Path("test_img.jpg")

model = torch.hub.load('ultralytics/yolov5', 'yolov5n')
results = model(img_path)
r_img = results.render() # returns a list with the images as np.array
img_with_boxes = r_img[0] # image with boxes as np.array

Existing infos for this topic at GitHub
Looking into the official Pytorch Hub Wiki from yolov5 in the section Base64 Results we find info on how to use render and also some handy info for yolov5 and REST API's and why this was implemented.
Looking into the code to understand this behaviour
If take a look into the type of results type(results) we get <class 'models.common.Detections'> which we can find here at yolov5's GitHub page.
This class has this (render, show, etc.) methods that run the _run method with different parameters. The render method will cause the _run method to override all images with the detected ones:
if render:
    self.ims[i] = np.asarray(im)

A: A quick workaround will be to use "imgs" object from "pred" like the following:
predict_image = model(image)
im_rgb = cv2.cvtColor(predict_image.imgs[0], cv2.COLOR_BGR2RGB) # Because of OpenCV reading images as BGR
cv2_imshow(im_rgb)

I wish this will help you, have a good day.

redpajama_set_name: RedPajamaStackExchange


text:
Q: Cropping tool using javascript I want to make a cropping tool using javascript. The tool should support elliptical, circular and rectangular cropping.
Which javascript library can i use to achieve this
Thanks in advance

A: This site may help you get what you want. some of them are free but others are not.


Dreamplex - the only beautifully designed coworking space for real startup entrepreneurs, creatives, consultants and investors to work collaboratively or privately right in the heart of District 1, Ho Chi Minh City.
At Dreamplex, we don't just have a place to set your laptop on. We create a community that encourages meaningful connections – ones that lead to professional collaboration on, mutual support and cross-pollination of ideas. And events are an indispensable part of our growing community. You will have opportunity to learn and network with industry professionals, investors and mentors.
Are you a member of DreamPlex?
"productive energetic space in the heart of the District 1"
I just tried the space out for half day so my opinion might be different if I worked here long term. The actual ergonomics are comfortable. Good desks (height and spacious), plugs (fit north american), Wifi (10/10mbps), temperature (nice ac), and comfortable chair. You can soak in and catch the wave the young entrepreneurial energy and get some work done here. It's a bit crowded for my liking long-term, but definitely check it out. The staff were helpful and gave me a tour of the space and helped me order some beef pho on the grabfood app. There is another location, which I hear is quieter.
"There is a popular reason."
"Very nice and professional place for working "
"A good beginning for entrepreneurs"
In my opinion, DreamPlex is a good place for all those who want to work as freelancer, entrepreneurs and young startups. It has a strong community, many events. Besides, the facility is very good, we have 3 cantinas, coffee machine, a lot of sofa so you can take a nap in the lunch time. Of course, Wi-Fi is very strong, i usually download and watch HD movies without any lag. Lastly, the only coworking space in Saigon that attracted Mr Obama must has something special about it. Right?
Great coworking space in Saigon! With the best location in the centre of the city, lot of good restaurant, local street food and shops around. The design it's really friendly and modern. You have lounge areas for relax and take a nap, kitchen as well a lot of flexibility to choose your space with different environments. They have weekly events in different very useful topics. Higly recommended!
"great coworking - business center professionnally in heart of Ho Chi Minh City right now."
a lot private offices - studio, furnished serviced office... many kinds of private meeting rooms... big coworking space/open area for flexible & fixed hot desks... all great & beautifully, there're a lot events/workshops/activites on daily/weekly/monthly to join & discovering ecosystem in Saigon.
"Best coworking spot in Saigon."
Great Location, nice staff, good amenities and awesome community. The common area is sometimes a bit overrun, but the private offices are top-notch. The WIFI is mostly fast, considering it's Vietnam. I'll go there as long as I'm in town.
"The place to work in HCMC"
This is one of my favorite coworking spaces in the world. Clean, modern, with a great community and events. Its definitely a big pull factor in me wanted to return to HCMC.
One of my favorites coworking places in the world. Clean, modern with great community and events. Definitely a big pull factor in returning to HCMC.
"Favorite Coworking space in HCMC"
Great Location, nice staff and good amenities. The common area is a bit overrun, but the private offices are top-notch. The WIFI is mostly fast, considering it's Vietnam. It's not cheap, but worth it. Also, they sometime host interesting events.
DreamPlex will be in touch with you soon to confirm.
DreamPlex has received your membership enquiry and will be in touch with you soon.


text:
QCGN News
QCGN Initiatives
The 10th Anniversary of the QCGN Community Awards
QCGN's Goldbloom Community Service Award
Young Quebecers Leading the way Award
Improving access, quality of services
April 14, 2018 /in Press Coverage /by Catheline Moreau
The Montreal Gazette
Re: "Anglo panel sounds familiar" (Letters, April 13) In his letter, Robert Libman characterizes as unnecessary the revamped regulation announced by Health Minister Gaétan Barrette to oversee the creation of access plans that guarantee the delivery of health and social services in English to our community.
As a former MNA, Libman should know that rights obtained by Alliance Quebec in negotiations with the government in 1986 only guarantee services where plans are in place that actually define those services.
As a result of massive reforms in the health-care system, many of those plans are either out of date or out of service. Over the past few years, we have received frequent complaints about the lack of access to services in English, a recurring problem throughout the province.
https://qcgn.ca/wp-content/uploads/2016/11/mg_300x300_rgb-e1485201819250.png 200 200 Catheline Moreau https://qcgn.ca/wp-content/uploads/2015/11/qcgn-pan-trans-white.png Catheline Moreau2018-04-14 11:45:292018-05-09 08:54:46Improving access, quality of services
Letter: Why the QCGN rejects Bill 14
April 11, 2013 /in Press Coverage /by QCGN Communications
The Gazette, Letter: Dan Lamoureux
Since Bill 101 was passed some 35 years ago, English-speaking Quebecers have made tremendous efforts to speak the language of Quebec's majority. We consider French to be the common language of Quebec. Most of us speak French every day, even if we speak English among ourselves, and in the privacy of our own homes. The majority of English-speaking Quebecers — 69 per cent of us — are bilingual. This reflects our integration in Quebec and our commitment to the French language.
In order to maintain a shaky linguistic truce, our post-Bill-101 generation has accepted restrictions on our language. Those who did not leave during the mass exodus of the 1970s have learned to live with Bill 101. However, we are opposed to any new measures that would undermine the vitality of our communities.
The overwhelming reaction of English-speaking Quebecers to Bill 14, the proposed overhaul of Bill 101, or the Charter of the French Language, has been negative.
https://qcgn.ca/wp-content/uploads/2015/11/qcgn-pan-trans-white.png 0 0 QCGN Communications https://qcgn.ca/wp-content/uploads/2015/11/qcgn-pan-trans-white.png QCGN Communications2013-04-11 17:50:092013-04-11 17:50:09Letter: Why the QCGN rejects Bill 14
Opinion: Fellow anglos, don't let Bill 14 get you down
April 3, 2013 /in Press Coverage /by QCGN Communications
The Gazette, Letters to the editor, Tim Thomas
As a former scholar and policy analyst, and as an anglophone who has lived in Montreal for more than 50 years, I have been struck by the resurgent themes on the Opinion page of The Gazette when it comes to Bill 14 and the language issue. Thoughts of Bill 22, St-Léonard in the 1970s, Bill 101, Alliance Quebec, the Equality Party, Howard Galganov and the partition movement have all flashed through my head.
"Here we go again," I thought at first.
But then I realized that's not really true, that Quebec is a much different place than it used to be.
The forces that have always driven the Quebec sovereignist movement — the desire for cultural preservation and the need for a nation-state — have been transformed dramatically by globalization. Increasingly, English has become a tool for global commerce and communication. Most forward-looking Quebecers realize this, and are telling their children that English is a necessary tool of advancement in the global economy.
The best way to live and prosper in French, then, is to nurture a healthy economy that is fully capable of dealing in English, but not threatened or overwhelmed by it.
Who knows, someday, having an English-speaking minority might even be perceived as an asset.
https://qcgn.ca/wp-content/uploads/2015/11/qcgn-pan-trans-white.png 0 0 QCGN Communications https://qcgn.ca/wp-content/uploads/2015/11/qcgn-pan-trans-white.png QCGN Communications2013-04-03 20:06:002013-04-03 20:06:00Opinion: Fellow anglos, don't let Bill 14 get you down
Should English-speaking Quebecers Care About the Official Languages Act? December 18, 2019
QCGN Asks New Parliament to Deliver Improved Official Languages Act December 5, 2019
APPELE-Québec calls for further study of Bill 40 December 3, 2019
Are You on the List? November 22, 2019
QCGN Asks Government to Exclude English School Boards from Education Reform Plan November 19, 2019
The QCGN is funded by the Government of Canada through the Department of Canadian Heritage.
En poursuivant votre navigation sur ce site, vous acceptez l'utilisation de cookies pour analyser votre utilisation du site et améliorer votre expérience. Accepter En savoir plus...
Politique en matière de données privées


Watching the calendar once again roll, this time from 2010 to 2011 it seems only yesterday everyone was up tight about 2000. Now that transition seems like a piece of cake, right?
I have always been told that if you keep your clothing long enough the fashion will return—the trick of course is whether or not you can still get into them when that happens.
But now those my age and older are watching the possible return of things that they hoped never to see again, things like rationing? I do remember my father car pooling to the factory and everyone chipping in their gas stamps so they could have enough gas for the car for a week. Now even most of the factories are gone. Interest rates on savings now are actually lower than when I was little. Remember when we bought stamps to fill a book that we redeemed for war bonds?
I remember things like black outs where we even covered the front of the radio so there were no lights to be seen by the enemy. The entire town, dark, so as not to be detected from the air. Watching news reels in the theatre about the food lines in Europe, about the torture and killings by Socialist and Communist controllers in far off lands… things our youth have not even been taught about. Crazy when you watch riots and know it is England but that it is also happening in Haiti?
This is a New Year approaching and with God's help prayerfully we won't repeat these things (or even worse)—reality check is that it could happen—HOPE through our Lord, in my humbled opinion, is our only HOPE. So my prayer for 2011 is that we figure out what is wrong, change it and turn this country back to God and prosperity, the land of Hope and Promise, the example once again for other nations.
RCCL got the five pallets to Labadee, notified Roseline and Presume and everything shipped is now at the headquarters. On one of those pallets is 50 pair of shoes, one brand new pair for every girl and boy in the orphanage and home… they will be opened on Christmas eve so everyone has new shoes for Christmas Day. Thank you Alex and Jim and friends.
Those pallets included one pallet of 55 boxes of food packs from Kids Against Hunger in Cedar Rapids, Iowa.
Since last writing, one of the Feed My Starving Children containers of food packs was released from the wharf in Port au Prince and have been distributed. The beans were finally released also, but being in the leaky container since May it is still questionable if any of them will be more than animal feed… but hey, goats gotta eat too, right?
The FMSC container of food packets and the container of beans that came in through Cap Haitien arrived in timely fashion, so our next containers are scheduled through Cap.
In the February Newsletter we will include a Summary of 2010, your yearend tax statement and some of our favorites along with plans for 2011.
As I write this letter the elections are still uncertain with riots causing interruptions in the testing of the children. They need their test results to go on to the next grade when they come back from Christmas holidays.
This has been a year of tragedies punctuated with some really great blessings. We have met so many new people and pray that this is just the beginning of those relationships. We have videos on YouTube, you can find those either under For Haiti with Love or Cruise4Haiti. The website is being updated, it even has a video now… we have added to that a new area for doing a blog so that we can keep you updated through the website, FaceBook and Twitter.
With all the new ways of reaching people, we also have our very dear friends at Mission Network News who manage to do interviews with us several times a year. There were the new friends from the raffle of the holiday in San Juan, along with other websites where we are now registered.
Or containers from various suppliers to go to Haiti by sea, we are always trying to keep ahead of the need for food and for medical supplies for the clinic — and it all takes money so know that every cent you can give is blessed by the Lord to help his needy in Haiti.
Right now Roseline and Presume are organizing for the Christmas party on Christmas Day at the headquarters. Between riots they are looking for a calf to butcher and cook; the cookies, new drink coolers, plates and other last minute supplies are in Ft. Pierce waiting their turn to go down. This will finish up the supplies… then it is a matter or organizing gifts, cooking food and striking up the band. We have the Creole coloring books giving the Christmas Story with songs compliments of Ronnie and Sir Speedy… it should be a wonderful party.
Gifts to For Haiti with Love are deductible as charitable contributions. For Haiti with Love, inc. is a Florida not for profit and a 501(c)(3) corporation with IRS, allowing your gifts to qualify as charitable contributions. Year end tax statements are mailed by January 15. Our mailing list is confidential, we do not loan, sell or share!


text:
Al-Jadaan reveals full extent of Saudi Arabia's pandemic challenge
Employees work at the Saudi National Health Emergency Operations Center (NHEOC) in Riyadh monitoring the COVID-19 pandemic crisis on May 3, 2020. (AFP / FAYEZ NURELDINE)
04 May 2020 03:05:20 GMT9
Mohammed Al-Jadaan, Saudi Arabia's finance minister, has revealed the full scale of the challenges that face the Kingdom from the economic shock of the coronavirus disease (COVID-19) pandemic.
His interview on Saturday evening spoke of the need to take "strict, painful" measures to counter the economic downturn caused by the pandemic, and the minister made clear that everything — including the timing of some of the high-profile projects under the Vision 2030 diversification strategy — was under consideration in a bid to get costs under control in an unprecedented situation.
"The list is extremely long," he said of potential cost-cutting opportunities. The economies of the rest of the world also face the same challenge, of course, but what makes the crisis all the more acute for Saudi Arabia is that it coincides with a simultaneous shock to oil revenues as a result of falling global demand. The double whammy of declining economic activity and falling oil revenue make drastic and speedy action inevitable for the Kingdom, Al-Jadaan indicated.
Stock markets do not like surprises, especially unpleasant ones, and the Tadawul index shed more than 7 percent in trading immediately after the interview as published.
Saudi Aramco, the Riyadh exchange bellwether, lost more than 5 percent. What disturbed the markets was the distinct change in tone from the minister's recent statements on the Kingdom's finances. Just 10 days ago, in a preview of the first quarter budget release, he said that, while Saudi Arabia would have to tighten its belt, dip into reserves, and borrow on the international capital markets, the country had the resources and the resilience to withstand the pandemic as it had weathered other serous crises.
The whole world is now facing a period of economic downturn similar to the 1930s Great Depression. At least Saudi Arabia has the economic and financial resources to weather the initial shock, and — with sound and visionary strategy — to come out the other side of austerity.
In the budget itself, the minister laid out a carefully considered plan to cover the inevitable financial deficit for 2020 and revealed that is still had $646 billion in reserves to help it do so. The new change of tone and emphasis was remarkable. Now, all options are open, beyond the "basic necessities of the people," he said. "The list is extremely long," he said of potential cost-cutting opportunities. It is important to stress that the Kingdom goes into this period of unparalleled economic uncertainty with some distinct advantages. Its levels of debt are low by international standards, and it has the ability to raise more funding in international capital markets, as the success of the recent $7 billion bond, oversubscribed several times, has shown.
It also has the deep capital reserves held by the Saudi Arabian Monetary Authority, the Public Investment Fund and other state agencies which could be called upon to balance the books in an emergency such as the one we are experiencing. No other member of the G20 group of leading economies has such firepower in reserve as they try to combat the economic hurricane caused by the pandemic.
Moreover, Saudi financial institutions have strong balance sheets, which have been further bolstered by early government measures to protect the banking system via injections of extra cash. The non-oil sector of the economy, especially small to medium businesses, will look to the banks to come good on government pledges of support.
Once the initial shock to pubic finances is contained by the emergency measures outlined by Al-Jadaan, policymakers will turn their attention to the stimulus packages needed to get the economy up and running again.
The International Monetary Fund (IMF) said recently that while it expected the Saudi economy to contract by 2.3 percent this year, it expected a sharp rebound next year to 2.9 percent growth. By this time, demand for revenue-generating energy products should also have recovered to some degree, giving the oil price a much needed boost.
The IMF also said that the COVID-19 crisis could bring on a global level of economic hardship similar to that of the 1930s Great Depression. What principally got the world out of that trough was increased government spending under the New Deal of US President Franklin Delano Roosevelt. The whole world is now facing a period of economic downturn similar to that era. At least Saudi Arabia has the economic and financial resources to weather the initial shock, and — with sound and visionary strategy — to come out the other side of austerity.
• Frank Kane is an award-winning business journalist based in Dubai.
Saudi and British ministers discuss developing cooperation
Japan to push controversial mine fo...
Coalition: Saada prison was not tar...
Coalition: Nearly 200 Houthis kille...
Saudi Arabia announces 'Founding Da...


The wickerwork Landscaping and garden accessories woven wicker living.
Throughout the year, we can order books wicker autoclave treated as solid borders, windbreaks, planter baskets, vines and other media gardens accessories.
New: our achievements are now available in ecological materials untreated wicker is protected by a green stain (for more information: contact us).


STNL Specialist. Young Aggressive Real Estate Broker located in Louisville, KY.
Steven P. Shaffer serves as an Investment Sales and Leasing Specialist for PRG Investments. Steven is very well versed in the local commercial real estate market representing both buyers and sellers of commercial property. Steven started his real estate career at Re/Max, where he represented numerous homebuyers and sellers. Steven quickly transitioned to commercial real estate with a focus on national retail franchise tenants, landlord representation and retail investment properties. Steven is a member of International Council of Shopping Centers (ICSC). Steven is on the board of Young Professional Networks at Greater Louisville Association of Realtors and a member of both the Kentucky CCIM Chapter and YREP Louisville. Steven is a graduate from the University of Louisville.


We usher in the new year with our brand new Worldwide FM playlist, so that you can listen to the best curated music on-air and also on-the-go on your preferred device. Handpicked by WWFM staff, we will regularly update the playlist with a selection of the finest music across the station, and you'll hear these tracks throughout the day and evening.
The January additions to the playlist are listed below and the full playlist is available to listen to and follow via Spotify and Soundcloud.


Here we will discuss how to update data into the database table without go in the database. Yes it can be possible when we work with the hibernate. For this we will take as we discussed in the last example how to fetch data form the database table data into the jsp page.
Here in the Hibernate we can update the data which we inserted into the database. It can be done through the some basic step as we discussed in our last session of the project example of the hibernate. So now here we will create as we done before and we will show the code to implement only here.
Step 1. take a project.
Step 2. create a jsp page for input data.
Step 3. create a table in the database. Remember which database you selected on the time of the project taking all table will be created into the same database. Now we here we will use the hibernate_pro database.
Step 4. Take a package type the name of the package r4r.
Step 5. create a Hibernate reverse engineering file as we discussed in our last example.
PUBLIC "-//Hibernate/Hibernate Reverse Engineering DTD 3.0//EN"
Step 7. Now we create a servlet file for making the action to perform the value into the database.
Step 8. Now build and run the application.
Step 9. create a hibernate.util file for making the connection between database and application.
Step 9. Now we need to create a jsp page to update the data. In this we fetch the data form the database in a table and perform the action update.
Step 11. Create a jsp page to perform the action of update.
Step 11. Now run this file.


With top-ranked experts with the finest experience working towards your cardiac health and advanced treatments in a multi-specialty hospital with all facilities available under one roof, round-the-clock.
Polytrauma is a number of severe, life threatening injuries that might lead to death. Latest monitoring and imaging equipment available 24 x 7. State of the art Blood Bank operational 24×7.All the Specialists from various specialties available round the clock. Round the clock ready operating rooms.
A stroke occurs when part of the brain loses its blood supply and stops working. This causes the part of the body that the injured brain controls to stop working. 24/7 Ambulance Service provides state of the art ambulances equipped with advanced life support equipment and manned by trained personnel.
It refers to drinking, eating, inhaling, injecting, or touching hazardous substances which can cause illness or death. A dedicated and easy to remember emergency access number: 0512 – 308111. Highly trained and experienced emergency Physicians available 24-hours a day.
A heart attack is when blood flow to the heart is blocked, and sudden cardiac arrest is when the heart malfunctions and suddenly stops beating unexpectedly. Supported by highly skilled and active ICU, CCU, PICU, NICU doctors and nurses.
Our Emergency and Trauma department has some of the best surgeons in the region, with vast experience and up-to-date working patterns.
Dr. Shikha has been associated with Regency Hospital as Consultant Intensivist since 2015. She holds distinguished life membership of European Society of Intensive Care with her expertise in ICU.


Update: It's confirmed. The soak toast began rolling out and Verizon posted the official changelog for build 21.44.8 – the update is for VoLTE and Advanced Calling 1.0. If you were hoping for Lollipop, continue hoping. You can find the full changelog below.
Yesterday, a number of readers tipped us to an impending update for the DROID Turbo that was kicking off through Motorola's Feedback Network. We speculated yesterday that the update would include both Advanced Calling 1.0 (VoLTE and HD Voice) and Android 5.0 "Lollipop." According to readers participating in a test of the update through Motorola, we may only see one of those – Advanced Calling 1.0.
Motorola is currently labeling the update as "Droid Turbo VoLTE/Advanced Verizon DEC 2014 Software Update," with no mention of it also updating the device to Android 5.0. That's a bit surprising since a recent update for the Verizon Moto X (2nd gen) brought Lollipop along for the ride. However, the Moto X did not receive Advanced Calling 1.0 in that update. It looks like it's one or the other these days from Big Red.
On that note, Verizon has also updated its Advanced Calling 1.0 device page include the DROID Turbo. So yes, it's official.
To learn about Advanced Calling 1.0, including how it will work on your phone, hit up this post.
If we receive additional details, like a full changelog, we will be sure to pass along that info.
Here is the changelog from Verizon.
Cheers A, J, A, R, and P!


Scott Sher leads the antitrust department at Wilson Sonsini Goodrich & Rosati and is a partner in the firm's Washington, D.C., office, where his practice focuses on antitrust counseling and litigation. He represents clients in connection with antitrust issues that arise throughout the merger and acquisition process, from pre-merger counseling through investigations conducted by the Department of Justice, the Federal Trade Commission, the European Commission, State Administration for Market Regulation (SAMR), and other foreign regulatory agencies. In addition, Scott has significant experience providing both day-to-day counseling and litigation representation to clients on issues pertaining to intellectual property, joint ventures, pricing and distribution, trade association, and patent pooling matters.
Scott's representations have included a number of cutting-edge cases involving the intersection of antitrust and intellectual property law. He specializes in working with companies in the software, biotechnology, pharmaceutical, semiconductor, telecommunications, computer hardware, Internet infrastructure, and e-commerce industries. Global Competition Review, in its review of antitrust lawyers in the United States, called Scott "a true star of the antitrust bar."
Prior to joining Wilson Sonsini Goodrich & Rosati, Scott clerked for both the Honorable Joseph T. Sneed III of the U.S. Court of Appeals for the Ninth Circuit in San Francisco and the Honorable Charles A. Legge of the U.S. District Court for the Northern District of California.
Hebei Welcome Pharmaceutical Co., the largest vitamin C manufacturer in China, in connection with its successful Second Circuit appeal of a jury verdict finding the company responsible for price fixing. The case raised important and precedential application of the antitrust laws in situations where a foreign sovereign compels the defendant's actions.
Google in connection with its successful acquisition of ITA Software, which included a significant Department of Justice investigation into the transaction. Google completed the acquisition after agreeing to a consent order to license ITA's software on a non-discriminatory basis.
Google before the Federal Trade Commission and other regulatory and political fora in connection with the company's acquisition of DoubleClick. After the issuance of a Second Request, the Federal Trade Commission closed its investigation in December 2007, noting that the acquisition of DoubleClick was unlikely to substantially lessen competition.
Private equity fund Vector Capital after the company was sued along with Francisco Partners by a class of WatchGuard Technologies investors who claimed that the two funds had colluded in their bidding to acquire WatchGuard voting securities. The firm secured the first-ever published opinion from the Western District of Washington concluding that such joint bidding does not implicate the antitrust laws.
Brocade Communications Systems in connection with the Federal Trade Commission's investigation and Second Request regarding Brocade's proposed acquisition of McDATA Corporation. The Federal Trade Commission ultimately voted to clear the acquisition in January 2007.
University of Pittsburgh Medical Center after it was sued by rival West Penn Allegheny Medical System, which claimed that UPMC conspired with a leading health-insurance firm and took steps to exclude WPAMS from the market. The complaint was dismissed in its entirety.
Recognized in the Competition/Antitrust category of the 2016-2019 editions of Chambers Global: The World's Leading Lawyers for Business, in which peers highlighted his "incredible skill" in technology-related matters and clients noted that he's "pragmatic and very good at navigating clients through complex issues. His understanding of antitrust law is amazing."
Honored with the "Best Business Mergers Article - 2012 Antitrust Writing Award" from the Institute of Competition Law for co-authoring "EU and U.S. Antitrust Authorities Update: Best Practices on Cooperation in Merger Investigations"
Named among the nation's top antitrust attorneys in the 2011-2018 editions of Chambers USA: America's Leading Lawyers for Business, in which clients described him as "very good at navigating clients through complex issues" and noted that "his understanding of antitrust law is amazing"


If you aren't already familiar with internet marketing for small business, it is important to know just the influence it can have for your business in generating a larger consumer base. The processes involved in web marketing are a bit different than that of traditional marketing, but offer a much stronger approach. The actual impact web marketing campaign can have for a small business is well above that of traditional marketing, allowing small businesses to target the most consumers with ease and great management of the venture. Marketing through the internet provides a highly effective management of the marketing attempts and provides several tools and resources that are also quite effective in marketing any small business to great heights.
SEO should play a key part in your internet marketing for small business efforts. You are targeting these search engines as well, seeking to be indexed as much as possible, receiving the highest search engine ranking possible. Why? Mainly because your target consumers get online and choose one of these search engines to search for what they need. They type a few words in the search bar and there is a search engine results page that shows up and you want to be at the top, because 9 times out of 10, your target consumers are choosing between the first 10 sites as the business for their needs.


On Sunday August 24, Fr. William Fitzgerald looked from the altar to see St. Peter's Church filled to capacity with family and friends for a Mass in celebration of the 50th anniversary of his ordination.
"It was a family Mass. The young cousins were the altar servers, singers, musicians and in the procession," said Peggy Fitzgerald, wife of Joe Fitzgerald, twin brother of Fr. Fitzgerald.
A long-time parishioner remarked that the parish hall, where the reception was held, has never been so filled, Peggy Fitzgerald reported.
And the weather co-operated with sunshine. "I came to Saint John for a sunburn," quipped Fr. Fitzgerald. Similar good weather is predicted for August 29, the actual date of his ordination fifty years ago by Saint John Bishop Alfred Leverman in St. Peter's Church. An outdoor Mass is planned for the family at the home of Joe and Peggy Fitzgerald.
A native St. Johnner, Fr. Fitzgerald was baptized, received First Communion and was confirmed at Assumption parish in West Saint John. On May 1, 1947, the family moved to the North End and into the Redemptorist parish of St. Peter's, where he became an altar boy. He remembers serving the Mass for the golden jubilee of Fr. Charles McCormick in September 1951. From the close influence of the Redemptorists at St. Peter's, he attended St. Mary's College, Brockville, graduating in 1957.
After a year of Novitiate at St. Alphonsus, Woodstock, he professed first vows on August 22, 1958. Seminary studies followed at Holy Redeemer College, Windsor. He earned a bachelor of arts degree at Assumption University in 1961 and a bachelor of theology degree in 1964.
After seminary studies, Fr. Fitzgerald was appointed to St. Patrick's, Toronto, as a hospital chaplain for a few months in 1965 before returning to St. Mary's College (1965-1968). During those years, he was director of students, professor of history and mathematics, coach of all the sports teams, including an all-star hockey team and the St. Lawrence 'B' basketball champions.
When St. Mary's closed, Fr. Fitzgerald began parish appointments, beginning with Holy Redeemer parish (1968-1975) in Charlottetown. For the next 30 years, he served as pastor and superior at four parishes: St. Alphonsus, Windsor (1975-1984); St. Peter's, Saint John (1984-1992); Holy Redeemer, Sudbury, (1993-1999) and St. Patrick's, Toronto (1999-2004). Noted as an articulate and thoughtful homilist, Fr. Fitzgerald intermingles humour and the ever-important personal connection.
While pastor of his home parish of St. Peter's, Fr. Fitzgerald directed the 100th anniversary of the parish in 1984 and marked the Marian Year in 1988. A new access ramp to the church was opened in 1992 and the St. Peter's Non-Profit Housing project was developed and constructed. On August 29, 1989, he celebrated the silver jubilee of his ordination in an outdoor Mass on the grounds of St. Peter's.


text:
import {
  shallowMount,
  createLocalVue
} from '@vue/test-utils';
import Vuex from 'vuex';
import Vuelidate from 'vuelidate';
import chai from 'chai';
import { expect } from 'chai'
import sinon from 'sinon';
import sinonChai from 'sinon-chai';

import OfferingEdit from './OfferingEdit.vue';

const localVue = createLocalVue();
localVue.use(Vuex);
localVue.use(Vuelidate);
chai.use(sinonChai);

describe('OfferingEdit.vue', () => {
  let wrapper, store, actions;

  beforeEach(() => {
    actions = {
      deleteOffering: sinon.stub(),
      createOffering: sinon.stub(),
      updateOffering: sinon.stub()
    };

    store = new Vuex.Store({
      actions
    });

    wrapper = shallowMount(OfferingEdit, {
      localVue,
      store,
      propsData: {
        badge: {
          badge_id: 2,
          duration: 1,
          periods: [2, 3],
          requirements: [1, 2, 3],
          name: 'Badge'
        },
        eventId: '1'
      }
    });
  });

  it('should be a component', () => {
    expect(wrapper.isVueInstance()).to.be.true;
  });

  it('should default to editing', () => {
    expect(wrapper.vm.creating).to.be.false;
  });

  it('should format the list of periods', () => {
    expect(wrapper.vm.editablePeriods).to.equal('2, 3');
  });

  it('should format the list of requirements', () => {
    expect(wrapper.vm.editableRequirements).to.equal('1, 2, 3');
  });

  it('should parse edited periods', () => {
    wrapper.vm.editablePeriods = '1, 2, 3';
    expect(wrapper.vm.offering.periods).to.deep.equal([1, 2, 3]);
  });

  it('should parse poorly formatted edited periods', () => {
    wrapper.vm.editablePeriods = '1 ,2,3,';
    expect(wrapper.vm.offering.periods).to.deep.equal([1, 2, 3]);
  });

  it('should only parse 3 periods', () => {
    wrapper.vm.editablePeriods = '1, 2, 3, 4';
    expect(wrapper.vm.offering.periods).to.deep.equal([1, 2, 3]);
  });

  it('should parse edited requirements', () => {
    wrapper.vm.editableRequirements = '1, 2, 3a, 4';
    expect(wrapper.vm.offering.requirements).to.deep.equal(['1', '2', '3a', '4']);
  });

  it('should parse poorly formatted edited requirements', () => {
    wrapper.vm.editableRequirements = '1,2 ,3,4';
    expect(wrapper.vm.offering.requirements).to.deep.equal(['1', '2', '3', '4']);
  });

  describe('and then trying to delete the offering', () => {
    beforeEach(() => {
      wrapper.vm.deleteOffering();
    });

    it('should have dispatched the appropriate action', () => {
      expect(actions.deleteOffering).to.have.been.called;
    });

    xit('should have called with the appropriate information', () => {
      expect(actions.deleteOffering).to.have.been.calledWithMatch(
        { eventId: '1', badgeId: 2 }
      )
    });
  });
});

redpajama_set_name: RedPajamaGithub


text:
Blu-Ray Review: THE 100: THE COMPLETE FIRST SEASON
Starring Eliza Taylor, Paige Turco, Thomas McDonell, Eli Goree, Marie Avgeropoulos, Bob Morley, Kelly Hu, Christopher Larkin, Devon Bostick, Isaiah Washington, Henry Ian Cusiack. Various directors. (2014, 544 min).
The Walking Dead notwithstanding, the end of civilization doesn't fare too well as weekly TV. Part of the reason is the genre's built-in limitations; there's only so much you can do with any apocalyptic premise before the well runs dry. But even creatively consistent programs (such as NBC's terrific Revolution) tend to get cancelled once the ratings no longer justify their production costs. Still, Hollywood keeps trying.
The 100, the CW's latest teen-centric serial, might have a chance. Based on the popular YA novel by Kass Morgan, the show is handsomely produced and features a plethora of good-looking kids in the lead roles, along with a few token grown-ups as secondary characters. In that respect, The 100 is similar to CW's Vampire Diaries and may likely appeal to the same crowd (and will totally accept the notion only the gorgeous will survive the apocalypse).
Someone didn't shower this morning.
The premise is actually kind of interesting. 97 years has passed since a nuclear war rendered Earth uninhabitable. What's left of humankind has been living in an orbiting space station (dubbed The Ark) for the past three generations. To keep the population in check, any crime, no matter how small, is punishable by death…unless you're under 18. In that case, you're put in prison. But when the governing council discovers The Ark will soon run out of oxygen, they decide to send these kids back to Earth to fend for themselves (extending everyone else's lives for a few more months). The council monitors them from above to see if they indeed survive or die from radiation sickness. Of course, most of them do survive, but face bigger problems, such as mutated monsters, toxic dust clouds and "grounders" (tribes of marauders who've been surviving on Earth the entire time).
Another obstacle threatening undermine their survival is each other, as when level-headed Clarke (Eliza Taylor) continually clashes with Bellamy (Bob Morley), who takes a more brutal, survival-of-the-fittest approach. But while Bellamy is kind of a turd sometimes, he's not really a bad guy. In fact, he's probably the best-realized and well-rounded character in the whole show. On the opposite end of the spectrum, Richard Harmon's sneering, over-the-top performance as Murphy (Bellamy's primary thug and the most one-dimensional character) approaches high camp.
Like most serial programs, The 100 features many plot twists, story turns, love triangles (yeah, even in this world, such a thing matters) and deaths of characters we initially assume will be in it for the long haul. Episodes typically switch back and forth between the kids on the ground and the adults on The Ark (whose decisions regarding everyone's well-being have increasingly ominous implications). Much of it is fun, providing you are able to accept it for what it is…a teenage soap opera. As science-fiction, you're better off not scrutinizing the science part too deeply and just enjoy the fiction.
As such things go, The 100 is off to a decent start. While nothing original or compelling enough to tune into on a weekly basis, it's entertaining enough for an evening of binging.
Featurettes: In the Beginning; The Ark; A New Earth; Grounders, Reapers & Mountain Men
2013 Comic-Con Panel
Season Finale Audio Commentary
Season Finale Deleted Scenes
FKMG RATING:
Movie Haiku of the Week: APOCALYPSE NOW
AIR FORCE ONE: Fox News Sexy-Time
DVD Review: MOM, Season One / MIKE & MOLLY, Season...
Movie Haiku of the Week: THE EXORCIST
CD Giveaway: THE BOXTROLLS Original Soundtrack
Blu-Ray Giveaway: If You Loved HEAT, You Have to C...
DVD Review: CASTLE: THE COMPLETE SIXTH SEASON
Blu-Ray Review: THE BIG BANG THEORY: THE COMPLETE ...
Film Review: THE BOXTROLLS
Movie Haiku of the Week: DIRTY HARRY
CAT NIP Reviews: Women at War, Sarandon's Calling ...
NEIGHBORS: Delta Psi Beta House Beer Pong Rules (N...
Blu-Ray Review: THE ROVER
Blu-Ray Review: THINK LIKE A MAN TOO
THE BOXTROLLS - The Nature Of Creation
Bloopers from CAPTAIN AMERICA: THE WINTER SOLDIER
Blu-Ray Review: HANNIBAL, SEASON TWO
Movie Haiku of the Week: SOYLENT GREEN
DAY OF THE DEAD (1985) and the Supermarket Slaughter
Blu-Ray Review: PERSON OF INTEREST: THE COMPLETE T...
Blu-Ray Review: THE DEAD 2


After ISP processing is completed, the target will re-boot from the AP-memory to run the new application code when the Programmer is plugged out of the target; if the ISP is not requested, the target will directly re-boot from the AP-memory for normal running of the application code.
It provides all the programming functions which a universal programmer can support, such as: (1)Erase the device, (2)Program the device, (3)Verify the device, and (4)Program all the device H/W options, including the security bits.
(4) Program all the device H/W options, including the security bits.


"This measure is about dignity. Senator Scutari and Assemblyman Burzichelli should be commended for sponsoring this bill that will make us a more dignified and empathetic state. For Assemblyman Burzichelli, in particular, with whom I have met to discuss this issue, this bill has been a personal fight for years.


Hello there beautiful ladies! Enjoying the winter? I'll be reviewing a great shampoo for you all. In today's world of commercialization and consumerism, people tend to be interested in fancy looking products with great TV commercials. What most of us forget is that these products are made with harmful chemicals which can affect the health of our hair or skin! From ancient times, the ladies of our land have used shikakai to maintain their enviable crowning glory. So great is the importance given to shikakai that its very name means "fruit for hair". It's an excellent cleanser which is hard on the dirt but soft on your hair. It's a natural conditioner which effectively detangles hair and gives it a bouncy look with silky feel. It helps to reduce hair fall and strengthens hair to give it a new vitality. Shikakai has a balancing effect on our scalp and helps reduce dandruff as well. I have been in love with shikakai from the first time I used a homemade shampoo but it's too time consuming. However, with this shampoo of Khadi I get almost same results for my thick, waist length hair with little effort or time.
Excellent for damaged hair of all types. Shikakai is a hair tonic and a natural conditioner for hair.
Wet hair and apply shampoo. Lather, keep for five to ten minutes and rinse off. Repeat if required.
Shikakai, reetha, henna, aqua, amla, tulsi and mehndi.
After using the Patanjali Milk Protein Hair Cleanser for nearly six months, I was bored with it. Frankly speaking, I don't like chemical laden stuff for my hair or skin- the Patanjali shampoo contains silicones. My skin and hair love natural products. So, I started my search for a natural shampoo and stumbled upon this wonder from Khadi online.
The shampoo is very thick in consistency and has a dark bluish color which can be mistaken as black. Honestly its appearance had freaked me out for a while. The smell of the shampoo is very fresh and herbal- no artificial perfumes in this one! It lathers decently and you need a lot of shampoo if you want to clean a dirty, oily scalp- the proof that it is mild. The conditioning and cleansing power of the shampoo completely depends on the time you keep it in your hair. If you keep it for 2 to 3 minutes then you'll not get anything out of it but the longer you keep it, the better it is for your hair! I make it a point to keep the shampoo in my hair for 10 minutes. I don't feel the need of any conditioner or other leave in treatments after I'm done shampooing with this one. The shampoo does help with hair fall. Also, I have a chronic dandruff which was reduced to a great extent by this shampoo. So, those with sensitive/ irritated scalp can try this wonderful product.
The result of using this shampoo- beautiful hair which is silky, shiny and a little more bouncy! However, don't expect it to deliver the same results like Dove or Pantene on the very first application. You have to be consistent with it and gradually you'll notice the benefits. Please note that I do not have severely damaged or chemically treated hair. I generally oil my hair with a little olive/coconut oil mixed with bhringaraj oil before shampooing and my skin and hair type is normal.
A very good shampoo without all the bad chemicals.
Helps your hair and scalp every way possible.
It's the product of our country.
As far as I'm concerned, none.
Will I repurchase Khadi Shikakai Shampoo?
Already have. I'm on my third bottle!
Thank you! This shampoo is a total loser when it comes to looks but it's a winner for your hair Neha 🙂 Well I apply the shampoo in a ninja mode and then clipping my hair up, do rest of the things.
somehow this looks really good to me…. will try this… nice revew..


text:
@class NSImageView, NSTextField, XCSUIIntegrationTestsDetailPerfMeasureButton;

@interface XCSUIIntegrationPerformanceTestMeasureTableCellView : NSTableCellView
{
    XCSUIIntegrationTestsDetailPerfMeasureButton *_measureTypeButton;
    NSImageView *_measureImageView;
    NSTextField *_minField;
    NSTextField *_maxField;
    NSTextField *_averageField;
    NSTextField *_rsdField;
}

@property(retain) NSTextField *rsdField; // @synthesize rsdField=_rsdField;
@property(retain) NSTextField *averageField; // @synthesize averageField=_averageField;
@property(retain) NSTextField *maxField; // @synthesize maxField=_maxField;
@property(retain) NSTextField *minField; // @synthesize minField=_minField;
@property(retain) NSImageView *measureImageView; // @synthesize measureImageView=_measureImageView;
@property(retain) XCSUIIntegrationTestsDetailPerfMeasureButton *measureTypeButton; // @synthesize measureTypeButton=_measureTypeButton;
- (void).cxx_destruct;
- (void)drawRect:(struct CGRect)arg1;
- (id)initWithFrame:(struct CGRect)arg1;

@end


We at SAFTzine value privacy very much. Rest assured that we will treat any personal data you will give us with the uttermost respect for you and your data. SAFTzine will use your personal data for the sole purposes of enabling you to carry out purchases on the Site, as well as - where expressly requested through the use of the dedicated button - to periodically send you a newsletter.
The services contained in this section enable SAFTzine to monitor and analyze web traffic and can be used to keep track of User behavior.
With the exception of your mobile telephone number, the conferment of your data is necessary; the refusal to grant consent does not imply any consequence. The SAFTzine would, however, be unable to allow you to make purchases on the Site.
In order to achieve the aims described above, your personal data may be communicated, transmitted or technically processed also by third parties, collaborators of the SAFTzine. Your personal data may also be transmitted to Judicial Authorities, supervisory or control authorities if required by law or regulations, or is requested under legitimate measures. In any case, your personal data will not be disclosed.


Early Head Start Infant/Toddler Lead Teacher – Mission Neighborhood Centers, Inc.
• Observe, monitor, and share with parents their milestones and areas of improvement. Encourage parent involvement through family events, field trips, and other family engagement activities.
• Implement the Creative Curriculum and design lesson plans that stimulate our little ones' curious minds and spark enriching learning interactions; tailoring individualized activities based on each one's unique needs.
If you are qualified and interested in joining and growing with us, please send your resume and cover letter with Early Head Start Infant/Toddler Lead Teacher in the subject line to hr@mncsf.org.


Watch The Pagemaster in HD quality online for free, putlocker The Pagemaster. Free watching The Pagemaster, download The Pagemaster, watch The Pagemaster with HD streaming.
A storm forces frightened Richard Tyler (Macaulay Culkin) inside a nearby library for shelter. There Richard is transformed into an animated illustration by the Pagemaster. He has to work through obstacles from classic books to return to real life. Watch The Pagemaster Online Free / Stream The Pagemaster Online Free without Registration.


text:
Home ▸ News ▸ Business News
Getting closer on a farm bill
Dan Looker
Members of congressional agriculture committees are learning
more about the shape of a farm bill that may go soon to the deficit cutting
super committee but regional disputes are still holding it up.
Senator Chuck Grassley (R-IA) told reporters Tuesday that
Republican ag committee members met Monday to learn more about the still
unfinished farm bill.
"There's a lot of debate about how to structure the
commodity program," Grassley said.
The committees remain under pressure to finish a draft in
time for the Super Committee to consider it for deficit cutting legislation
that's due on November 23. And Grassley said he still hasn't seen a draft of a
If they don't Grassley said the Super Committee is likely to
ask the agriculture committees to write a farm bill next year that would at
least stick to the $23 billion in cuts they have already proposed.
When asked if the Super Committee's cuts might be bigger, Grassley said, "The could be. I'm sure
they won't be any smaller."
Grassley said that it may be too much to expect only the
four leaders (chairs and ranking members) of the ag committees write a farm
bill in a short time. But he said it will be even harder to write one next year
because it's an election year, and because new members of the House who were
elected in 2010 don't understand agriculture.
Ag committee Democrats also went over a broad outline of the
commodity title ideas at a meeting on Monday, according to a staffer working
for a congressional Democrat.
"There have been real challenges for the ag committee to come up with something to replace direct payments," he told Agriculture.com.
There seems to be a consensus to eliminate direct payments,
he said, but the ag committees aren't replacing it with just one commodity program.
Instead, he said, they're likely to offer farmers three separate programs.
The first would allow producers to stay in the marketing
loan and counter-cyclical programs (with no direct payment). At least some target prices would be
increased, making this option more attractive perhaps to rice and maybe wheat
growers. But the levels would be too low to be attractive to corn and soybean
farmers.
A second alternative is a revenue program similar to ACRE
(Average Crop Revenue Election) but with the guarantee set at the county level. It is
similar to legislation already introduced by Senators John Thune (R-SD) and
Sherrod Brown (D-OH).
The third is an enhanced revenue-based crop insurance
program designed to appeal to cotton growers, who have not been big
participants in the existing crop insurance program.
The staffer said that one of the remaining disputes is over payment
"There are some issues relating to whether payment limits
would apply, and how they would apply if there's a crop insurance program for
cotton," he said. The cotton
growers already are giving up direct payments and may be resisting payment
limits on a new program, which also would not pay every year.
Senate Ag Committee member Kent Conrad said at a farm bill
meeting in Fargo, North Dakota Monday that he opposes exempting some programs
from payment limits.
"I've very concerned about having a farm program that really
is defensible," Conrad said in an article written for the Grand Forks Herald by
Mikkel Pates.
The Democratic staffer also said that some wheat grower
interests still believe that crop isn't being treated as well as corn and
soybeans in the farm bill commodity title that's being put together.
At this point, the committee leaders are still considering cutting
$15 billion from the commodity title over 10 years as well as $4 billion from
nutrition programs. Conservation cuts would total $6.3 billion.
That adds up to more than the $23 billion in proposed cuts
for ag programs, but that's because committee members want to make some funds
available for a few of the programs that expire in the current farm bill.
Grassley has said that he wants to maintain some energy-related programs.
Crop insurance discount deadline extended to January 27 for Iowa farmers
New forest management incentive for USDA's CRP
Shea is acting chief of USDA; Biden freezes regulations
Biden proposes legal status, path to citizenship for undocumented farmworkers
Tyson to pay $221.5 million to settle price fixing claims


It's December, which means it's almost time for everybody's favourite celebration; New Years Eve. We love New Years because it is a celebration for everyone and the focus is firmly fixed on fun. Harbour Kitchen understand better than all other event venues. We've put on some amazing NYE parties over the years and 2015 / 2016 will be no different. Here's why Harbour Kitchen is the best place to be as we see out one year and bring in the next.
Nothings screams celebration quite like a pyrotechnic display and Melbourne is world renowned for putting on incredible shows. The New Years Eve fireworks in Docklands seems to get bigger and better with every passing year and we're extremely excited to have the best location in Melbourne to enjoy the display. Other event venues may offer you a glimpse of the action, but only Harbour Kitchen give you panoramic views from our waterfront location.
As if a front row seat to one of the world's greatest fireworks display wasn't entertainment enough, Harbour Kitchen will also have DJs playing throughout the night. We'll have two dance floors in two rooms playing great selection of tunes to keep you moving.
If you're tired of event venues that fail to offer a complete New Years experience, you needn't look any further. New Years is our time to shine. And it's also yours. For more details visit our event page.