text:
London Irish Rifles at Spinello – 23rd October 1944
By Edmund O'Sullivan | February 8, 2017 | 4
Major Mervyn Davies MC and Lieutenant Nicholas Mosley MC
After several abortive attempts to make a breakthrough at Monte Spaduro, on 23rd October 1944, the 2nd Battalion, London Irish Rifles (2 LIR), were ordered to assault and occupy the strongpoint of Casa Spinello, which was a key position on the approach to the Spaduro ridge.
During the afternoon, a patrol from E Company, led by Lieutenant Desmond Fay MC, accompanied by Sergeant William Farthing and Riflemen McWilliam and Fitzmaurice, was sent out on a mission to find out the layout of the German defensive positions in the area. This they were able to do successfully as they brought back a prisoner, who divulged details that allowed a plan to be formed for the occupation of Spinello and the assault would be undertaken later in the day.
Desmond Fay would later describe the approach that he took that day with typical infantryman understatement:
"It really was a matter of skill rather than bravery. We covered ourselves in mud and we advanced along dead ground, where we could not be seen by the Germans."
An except of Lieutenant Fay's citation for the Military Cross (MC) highlights the true nature of the patrol's exploits:
"…(Lt Fay) left his two Riflemen under cover and advanced with the Sergeant over open grassland to the farm at the front edge of which he found a slit trench which contained three Germans one of whom he shot, the second escaped whilst the third he took prisoner and brought back to Battalion HQ. The garrison, although over 30 men strong and backed up by a Company on a nearby feature, were completely taken by surprise. This prisoner gave much information which helped greatly in the capture of the farm which took place two or three hours later…."
You can read here further details of Desmond's Fay mission for which he was awarded a bar to a previously awarded Military Cross.
As a result of this remarkable success, a platoon from E Company, led by Lieutenant Nicholas Mosley, was sent out in the early evening and, under heavy fire, entered Casa Spinello and were then able to beat off a series of counter attacks over the next few hours. Desmond Fay brought up his platoon in support and, despite being wounded, E Company commander, Major Mervyn Davies, was able to arrange much needed supplies and ammunition to be sent forward.
In his memoir, 'Time at War', Nicholas Mosley would describe the hours that his platoon spent at Casa Spinello:
"…During the night, three or four counter attacks did come in from the further hills but, by this time, we were experiencing a strange exhilaration. We felt invulnerable, heroic; when we heard Germans approaching, we opened fire with all our weapons from every opening in all directions. I remember one man, who had lost his spectacles and could find no room at a window, firing his rifles repeatedly straight up in the air.
We yelled and whooped our war cry – 'Woo-hoo Mahommet!; – and blazed away until the attacks seemed to fade into the thin night air. It was all quite like, yes, an apotheosis of a mad apocalyptic children's game. Only once, I think, did a German get right up to the wall of the house; he shot one of our men point blank through a window. Grenades usually bounced off the walls and exploded outside. After a time, things quietened down. Our wireless was not working so, at least we were out of touch with headquarters so they could not order us to do anything different…."
As a result of the occupation of Casa Spinello, other units of 78th Division, including 2 Innisks, were able to overwhelm Monte Spaduro that same night and this would establish a base for possible forward progress towards the northern Italian plains but the onset of winter rains intervened and further operations in the sector soon had to be suspended.
Six London Irishmen, including Major Ronnie Boyd MC and Lieutenant John Bruckmann, were killed at Casa Spinello and, a few days later, Sergeant Farthing would succumb to wounds suffered during the assault.
For their outstanding actions at Casa Spinello, Nicholas Mosley and Mervyn Davies were both awarded the Military Cross, and Corporals Tomkinson and Flavell received the Military Medal.
Nick Mosley's MC citation would state that:
"….After bitter fighting amongst the buildings, they were cleared of the enemy except for two who maintained resistance from beneath the floor of a building. Lt Mosley personally disposed of these two with his tommy-gun and a grenade. His company commander becoming a casualty, Lt Mosley took over temporary command of the Company and rapidly prepared for counter attack under very heavy shelling and mortaring…."
You can read Nicholas Mosley's narrative of his platoon action at Casa Spinello here.
Posted in London Irish Rifles and tagged Desmond Fay, Irish Brigade, Italy, London Irish Rifles, Mervyn Davies, Monte Spaduro, Monte Spinello, Nicholas Mosley, Second World War
J-D v Merveldt
Can you advise me when Nicholas Mosley MC came over from the Rifle Bde (into which he was commissioned in Dec 1942) to 2LIR with whom he subsequently won his MC.
Edmund O'Sullivan
Thank you. Nicholas Mosley served with 2 LIR from December 1943 to July 1945.
Michael Cramb
Christopher Michael Cramb was my uncle. I'm looking for a reference in Lieut Mosley's account that mentions his death. His service number was. 250904V
Thank you Michael. As you know, your uncle Christopher was one of a number of South African officers attached to the infantry battalions of the Irish Brigade during 1944/45. When I met Nick Mosley a couple of years ago before hs death, he spoke rather movingly about Christopher.
Best wishes Richard


Because of this the value of individual bottles can range from only $10 to $500 and even higher. Additionally due of the vast variety of bottles produced it has been impossible for anyone to really do the research to determine values for them all. Due to this factor if you are interested in this sub-niche it is necessary that you be willing to take somewhat of a shotgun approach that involves some risk and this should be considered before making a final decision The only ones you should initially consider will have ALL the following characteristics If even one of these six requirements is not there do not even consider the bottle unless you are very knowledgeable about collectible milk bottles. They must be 1 quart in size They must have a round body They must be at least 8? tall They must have both a town and state name on them They must have a dairy creamery or farm name on them These town state and dairy names must be in colored (Pyro) graphics Here is how I have been buying them for the past several years.I buy any milk bottle that meets the previously mentioned six requirements if I can buy it for $20 or less.


text:
Q: Weird result for a do loop with FORTRAN+OpenMP First I compiled the code without -fopenmp, and run the code, got a serial result which is a benchmark.
Second I considered use OpenMP to speed up my code.
There are two weird results:
1.The result obtained by
   !$OMP CRITICAL
       p1=p1+1
   !$OMP END CRITICAL

is a little difference (1%) with serial result. My code does not contain random number so it must be wrong.
2. If I replace !$OMP CRITICAL with !$OMP ATOMIC and delete !$OMP END CRITICAL, the results between these two, are totally different. Aren't the two can be replaced by each other at this situation for p1=p1+1 ?
My thoughts:
1. The most common problems could be using a thread-not-safe subroutine. But I can not find one in the code below.
Here is a fraction copied from my code.
ATTENTION:

*

*Variables other than i,j,k,k1,k2,k3,distance are considered "SHARED"

*The code is below is the ONLY part I parallelized in the whole code.

*(i,j,k,k1,k2,k3, distance) are not used after the parallel loop, so the uncertainty of private variables declared by "PRIVATE" will not be considered.
p1=0;

!$OMP PARALLEL PRIVATE(i,j,k,k1,k2,k3,distance)
!$OMP DO
do i=1,N_MESH;do j=1,N_MESH;do k=1,N_MESH;

   !$OMP CRITICAL
   p1=p1+1
   !$OMP END CRITICAL

   ! - box-1. special treatment for doing specturm operations for FFT.
   if (i.lt.(N_MESH/2+1))then
       k1=i-1
   elseif (i.eq.N_MESH/2+1) then
       k1=0
   else
       k1=i-1-N_MESH
   endif

   if (j.lt.(N_MESH/2+1))then
       k2=j-1
   elseif (j.eq.N_MESH/2+1)then
       k2=0
   else
       k2=j-1-N_MESH
   endif

   if (k.lt.(N_MESH/2+1))then
       k3=k-1
   elseif (k.eq.N_MESH/2+1)then
       k3=0
   else
       k3=k-1-N_MESH
   endif

   ! =============distance =====================
   distance=(k1*k1)+(k2*k2)+(k3*k3);

   ! -----============put them into =======================
   final_index(p1,l) = nint(dsqrt(distance));

   if (((k1.eq.0).AND.(k2.eq.0)).AND.(k3.eq.0)) THEN
      final(p1,l)=0d0
   else
      final(p1,l)=(abs(fu(i,j,k))**2+abs(fv(i,j,k))**2+abs(fw(i,j,k))**2)/2d0

   endif

enddo;enddo;enddo
!$OMP END DO
!$OMP END PARALLEL

A: The problem is that p1 is shared, and may change during the main body of the loop.
Let's say that you have two threads and p1 starts at zero, and that they start at the same time. First rank 0 reaches the critical section and increments p1 to 1 while rank 1 is waiting for the critical section to end. Once rank 0 is done incrementing p1, it starts executing the rest of the code, but at the same time rank 1 starts executing the critical section, and increments p1. It is not guaranteed that rank 0 will reach the final(p1,l) = ... statements before p1 has become 2. If this happens, final(1,l) will never be updated. So there is a race condition.
To avoid this problem, I recommend that you manually compute p1 based on i, j and k. That will let you make p1 private, save you a critical section, and remove this race condition.
p1 = k + N_MESH*(j-1+N_MESH*(i-1))

redpajama_set_name: RedPajamaStackExchange


text:
HomeVideosVideo: Seasick Steve "Clock is Running"
Video: Seasick Steve "Clock is Running"
May 14, 2020 Andrew Frolish Videos 0
The animated video for Seasick Steve's latest single is simple yet effective. 'Clock is Running' is a typically rhythmic, foot-tapping song with some excellent guitar and percussion-work. The video was created during the lockdown – Steve filmed himself on the porch and then the animation was added by New Beach. Stunning air guitar.
It's a creative way to get around the current restrictions. Seasick says: "Since we all locked up, I was thinking about music. I was supposed to be going on tour, but now I can't do it. For me, music is all about y'all… it's about playing for people. I surely miss you all and wish I could be out there playing for you." Alongside the single, Seasick Steve is building up to the release of his next album on 24th July with live performances from his kitchen every Sunday. 'Love & Peace' promises more boogie blues. Long-time fans won't be disappointed.
About Andrew Frolish	556 Articles
From up north but now hiding in rural Suffolk. An insomniac music-lover. Love discovering new music to get lost in - country, singer-songwriters, Americana, rock...whatever. Currently enjoying Lukas Nelson, Midland, Jarrod Dickenson.
Classic Americana Albums: The Jayhawks "The Sound of Lies" (American Recordings, 1997)
Track Premiere: The Frisbys "I Heard"

redpajama_set_name: RedPajamaCommonCrawl


Earlier this month, ACCT President & CEO J. Noah Brown participated in the 2016 Association of Colleges (AoC) annual conference in Birmingham, England.
This morning, President Trump released his initial request for funding for fiscal year (FY) 2018. While not the full budget request expected later this spring, early details appear to be at odds with the President's promise to provide for "...a Government that puts the needs of its own people first."
Why hold a board retreat?
Serving on a community college governing board can be a rewarding experience but at times quite challenging as well. The roles and responsibilities of governing boards are complex.
What should boards know and do about sexual misconduct prevention on their college campuses?


Perfect for Family gatherings or several Friends sharing a vacation but having the privacy of your own homes.
THREE LAKEFRONT CABINS! (3 BD/2 BA), (3 BD/1 BA) and (1 BD/1 BA) Guest Cottage with huge swim deck on DOCK!
Uncle Fuzzy's has a screened in furnished sunporch off the dining room, propane grill on the deck that a chef would enjoy, there is something for almost everyone to enjoy.
The short walk is mainly grass covered until you get to the shoreline.
This home is located just 650 feet away from the shoreline (also a flat walk) right at the beginning of the property.
You can also swim and fish off the owners large dock with 40 ft. swim deck which is right in front of Uncle Fuzzy's and Robin's Roost.
Living Room, Dining Room, Screened in sunroom, Fully Equipped Kitchen, 3 bedrooms, 2 Full Baths.
SLEEPS 6 people very comfortably.
Room on the floor for sleeping bags, but there is not a sofa sleeper available.
1 QUEEN BED will sleep 2.
These THREE homes are ONLY rented TOGETHER, IN SEASON.
They can be rented ALONE, during the OFF SEASON. Ask for details or look them up on our 'HOMES LIST' TAB, by house 'Name'.
LAKE FRONT HOMES on BEAVER LAKE HAVE 'LIMITED' CELL PHONE COVERAGE! SORRY NO WIFI AVAILABLE AT THIS TIME.


Local Southwest specializes in extra virgin olive oil (EVOO) from small, family owned farms in neighboring California. Featuring EVOO's that are certified extra virgin by the California Olive Oil Council (CCOC). Their seal assures a rigorous chemical analysis and blind tasting to ensure the highest quality USA, extra virgin olive oil. Our infused and flavored oils offer you an excellent way to bring exquisite flavors to your table. "No lye" California olives are brine cured, the traditional Sicilian method which takes a full nine months. This results in an outstanding crispy, and flavorful olives. Fine traditional oak barrel aged balsamic vinegars and fruit flavored California balsamic vinegars. Arizona Rangeland Honey– raw, local honey, certified 100% pesticide free by the USDA, from world famous beekeeper Dee Lusby of Amado. Az. lavender shea butter for beautiful, silky skin.
Fresh Extra Virgin Olive (EVOO) oils from small, family owned, California farms complete with California Olive Oil council certification of EVOO.
Traditional slow cured olives – from two family owned California farms. The natural curing process can take in between 9~18 months depending on the flavor. And no use LYE such as commercial olives!
Traditionally crafted Italian Balsamic vinegars, including flavored vinegars to rave about with, deep, complex layers of flavor, and a long finish.


text:
Superhero Showdown
Simul-Reviews
Thom Yee
Thom's Favourites
What Thom's Doing
Grace Crawford
Grace's Favourites
Scott Philp
Our Grading System
GOO Reviews
~ An Edmonton-based movie blog
The Walking Dead – Heads Up
Posted by Thom Yee in Television
Horror, Walking Dead, Zombies
by Thom Yee
The Walking Dead images courtesy of AMC.
6×07: "Heads Up"
Between the Jon Snow Game of Thrones season six poster that debuted today and last night's Walking Dead episode, what is this, the season of people not being dead? I mean, who else is gonna turn out to not be dead, Ned Stark? Derek Shepherd? Omar from The Wire?
So hands up, who's surprised Glenn's not dead? No one? No hands up? That's what I thought. We were all hit pretty hard by Glenn's seeming demise towards the end of "Thank You", the third episode of this season, though there was a fair amount of skepticism about his death even back then, but the way not knowing what happened to Glenn has been strung out over the last four weeks made it increasingly clear to most of us that he wasn't dead. I'm okay with that, you're okay with that, most of us are probably even happy about that, I think we're just not so sure about the execution. I mean, what was their end game with having Glenn turn out to have been just hiding out underneath that dumpster until the coast was clear, the guts that we all saw ripped apart having belonged to Nicholas, and everything turning out the way we all had immediately thought it would when we were thinking about ways Glenn could still be alive? If anything, this stunt death precludes the possibility of a more as-seen-in-the-comicbook death for the character sometime later in the season, and it may guarantee that that horrible fate instead befalls another of our beloved characters.
Carl's just walking around, twiddling his thumbs, going "do-do-do-do-doo, do-do-do-do-do-do-do…"
Other than that, "Heads Up" was a fairly calm series of vignettes and one-off, catch up moments where the most significant event was probably Carol's discovery of what Morgan's got going on with that Wolf in the camp. Having already confronted Morgan alongside Rick and Michonne for his unwillingness to kill earlier in the episode, this is a turn of events that'll be sure to raise tensions in the group, but hopefully it'll be in a way that lets both Carol and Morgan stick around for at least a bit longer. I really never noticed until now how preachy Morgan's "All life is precious" mantra can be just because Morgan sells it so well (it also helps that it's been coming from a character we know has been through a lot), but I did appreciate seeing that it's still a line that's hard for Morgan to believe in sometimes and something with which he's constantly struggling.
Meanwhile, Sam's still cowering upstairs, going "do-do-do-do-doo, do-do-do-do-do-do-do…"
For the first time, I didn't hate Father Gabriel when I saw his resolve in putting his prayer signs back up after Rick tore them down, because it finally shows the character in a virtuous light and finally trying to help (I think). He's found purpose after recognizing that the Alexandrians are looking for guidance and comfort in these trying, I-don't-want-to-be-bit-by-a-zombie times. I also didn't hate Tara, who gave Rick the middle finger that I'm sure we've all been thinking about giving him at least once since we got to the increasingly less Safe-Zone. In this episode, Ron is probably going to be the character we hate most, and as soon as I saw that Rick was going to let him walk around with that ammo-less gun, I clearly remember thinking, "that f*cking little prick is gonna find himself some bullets." Meanwhile his puny little brother Sam takes the cake for least manly as he's still hiding upstairs, and I think the thing his scenes with Carol this episode most effectively illustrate is how perilous it is for shows like these to have to rely on kid actors to convey complex emotions.
The most action-heavy scene goes to the bozo move Spencer tried to pull with his grappling hook crawl, and it's actually a scene straight from the comic, including that comment about losing his shoe, though they had a better reason for trying it in the book. Right now we're actually in a point right before a lot of crucial moments from the comicbook, and that's what "Heads Up" most reminded me of. If even half of those things come to fruition, there are a whole bunch of major, sudden, possibly horrible and graphic changes just around the corner, and frankly I hope at least half of those things do happen. After an unexpectedly, unrealistically, shockingly strong opening, the last few episodes have been more than a bit of a drag, and I think for all of us (I've been doing a lot of thinking for all of us in this review) the walls couldn't have come down soon enough.
While all the while, Tara's flashing her middle finger, going "do-do-do-do-doo, do—
The Walking Dead — "Heads Up" final score
Items of Note
Nicholas took a pretty clean shot through his own head. His entire face was intact and everything!
So you know your way around a gun, Carl. Stop rubbing our noses in it!
Just because medicine is in Denise's background doesn't mean that nobody else should ever have to help her or study with her and that everything medical is on her and her alone. Can't somebody else in town pick up a medical textbook?
As confirmed in the Talking Dead after show, everything since the first episode until now has taken place over the course of one day.
<< Last Episode: Always Accountable
Next Episode: Start to Finish >>
Fear the Walking Dead reviews
Shaun of the Dead review
About Thom Yee
Thom is a marketing communications genius, a movie blogger, and a comic book historian who spends most of his free time test driving experimental race cars. He never drives faster than he can see, and besides that, it's all in the reflexes.
View all posts by Thom Yee »
Give your opinion. Cancel reply
In honour of #WorldEggDay, I am writing this sentence. https://t.co/4E3G9ATqfC 3 months ago
January 17th Weekend Predictions & Predilections
January 3rd Weekend Predictions & Predilections
December 27th Weekend Predictions & Predilections
December 6th Weekend Predictions & Predilections
November 29th Weekend Predictions & Predilections
Action Adventure Aliens Animation Anime Batman biography Blade Runner Box Office cars Comedy comics Comics Marvel coming of age DC DCEU Documentary Drama Emotion Existence family Fantasy Food Future George Lucas Godzilla History Hobbit Horror J.J. Abrams James Bond kaiju Lord of the Rings martial arts Marvel Marvel Cosmic MCU MCU TV Mission: Impossible Monsters MonsterVerse Music Netflix Nolan Nostalgia Oscars Predictions Preview Retrospective Rocky Romance Sci-Fi Shyamalan Space speculative Spider-Man Sports Spy Stallone Star Trek Star Wars Summer Movies You Missed superhero Superman Tarantino Thriller Time Travel Tom Cruise Walking Dead Weekend Weekends Wonder Woman X-Men Year-End Zombies
Follow GOO Reviews by email
Follow GOO Reviews
Follow GOO Reviews on WordPress.com


text:
Q: ThreadPoolTaskScheduler internals - does the parameter order of Task.WaitAll() change the order of execution? I've run across a case like the following in my work. (I've kinda simplified it a bit for this thread's purpose)
Here's the code (a .net core console app) :
class Program
{
    static void Main(string[] args)
    {
        const int numberOfTasks = 15;
        var taskArray = new Task[numberOfTasks];

        for (int i = 0; i < numberOfTasks; i++)
        {
            var temp = i;
            taskArray[i] = Task.Run(() => SingleTest(temp));
        }

        Task.WaitAll(taskArray);
        Console.WriteLine("FINISHED!!!");

        Console.ReadKey();
    }

    static void SingleTest(int temp)
    {
        var signal = new AutoResetEvent(false);
        var t1 = Task.Run(() =>
        {
            Console.WriteLine($"{temp} T1 started");
            signal.Set();
            Console.WriteLine($"{temp} T1 finished");
        });

        var t2 = Task.Run(() =>
        {
            Console.WriteLine($"{temp} T2 started");
            signal.WaitOne();
            Console.WriteLine($"{temp} T2 finished");
        });

        Task.WaitAll(t1, t2);
        //Task.WaitAll(t2, t1);
        Console.WriteLine($"{temp}: Both tasks finished");
    }
}

When I run this code with 8 or more loop iterations, none of the T1 tasks start before ALL the T2 tasks have been started, which seems really weird. My question is why would this happen? I would have expected the tasks to start in a totally random order.
Here's the start of the output for a sample execution (8 iterations):
5 T2 started
7 T2 started
3 T2 started
0 T2 started
4 T2 started
6 T2 started
2 T2 started
1 T2 started
1 T1 started
1 T1 finished
1 T2 finished
1: Both tasks finished
...

When I change the order of the parameters in the Task.WaitAll() call (as in the commented out line), the behaviour is quite different, where the tasks are started in a (seemingly) random order (Most T1 tasks seem to start earlier than their T2 equivalents, however at least some T2 tasks are started before all the T1 tasks have been completed)
Sample output:
7 T1 started
5 T1 started
5 T1 finished
4 T1 started
4 T1 finished
1 T1 started
1 T1 finished
6 T1 started
6 T1 finished
3 T1 started
3 T1 finished
1 T2 started --For example,this T2 task was started before some of the T1 tasks
0 T1 started
0 T1 finished
2 T1 started
2 T1 finished
4 T2 started
4 T2 finished
3 T2 started
1 T2 finished
7 T1 finished
0 T2 started
0 T2 finished
2 T2 started
6 T2 started
6 T2 finished
3 T2 finished
1: Both tasks finished

So, what I'm wondering is, what is happening under the hood to create such a behaviour?


text:
Mirage Queen Aime Cirque Theatrical OVA Release Date and Cast Announced
By Robert Milakovic / December 14, 2021 December 14, 2021
Back in July, it was announced that the first volume of the popular novel series "Kaitou Queen" will be getting a theatrical OVA adaptation in Summer 2022. Recently, on the Mirage Queen official site, the main cast has also been revealed. The Queen will be played by Yuga Yamato (past works unknown), Kato Kazuki (Kento from B-Project) will be playing the part of Joker, and Yuma Uchida (Megumi from Jujutsu Kaisen) will voice RD.
Since the novel wasn't as popular overseas as it was in Japan, most anime fans won't be familiar with this series when it does air next year. So, why should you be excited about it? First, let's see what this series is about.
A phantom thief queen—whose age and gender are unknown—flies around the world on an airship in search of treasure. A gemstone the queen had their sights on is stolen from them by a mysterious circus troupe, and a game soon unfolds between the queen and the troupe's magicians, hypnotists, and other members wielding special abilities. (Source: MAL)
You might remember back in 2020 a little show by the name of "Great Pretender". This show gained massive popularity with its cast of loveable characters and intricate and mind-blowing scams. Having the protagonist stand in a sort of moral gray area, as opposed to being strictly good or evil, is a trope a lot of anime fans find exciting (myself included). And this is exactly how our Mirage Queen is portrayed.
RELATED: What Does OVA (Original Video Animation) Mean in Anime & How Are They Different?
With Joker as his/her business partner and RD being the artificial intelligence that supports them in their heists, Queen travels around the world in search of treasures worth risking their lives over. If you are still not convinced, they have prepared a teaser trailer to give you an insight at what you can expect, and it does not disappoint.
Robert Milakovic
Robert is the co-owner of Fiction Horizon and a lifelong fan of movies, TV shows, comics, and video games. Especially fascinated by Marvel, he enjoys every aspect of the franchise.
What is the Void Century in One Piece? Origins Explained!
Kaguya-sama: Love Is War – The First Kiss That Never Ends US &...
What Does the Initial "D." Stand for in One Piece? E...


I was fascinated by this article in The Guardian. It concerns a Southern California treatment facility that has integrated pot use into its therapy program.
I'm skeptical, for a couple reasons. First, most heavy opioid users arrive in treatment with extensive histories of marijuana use. It shows up right away in the assessment. Yet despite their pot use, they've continued using Oxy, heroin, cocaine, alcohol, benzos, what have you. Why hasn't the pot they've been smoking been sufficient to replace opioids and the other drugs?
Second, I'm not aware of a direct relationship in brain function or chemistry between cannabis and drugs such as the opioids or cocaine. Why would smoking pot suppress opioid craving better than, say, Valium or alcohol? Which by the way, in my experience, some opioid users consume in quantity.
So my guess is, it's not really about the pot itself. The value would be secondary to two other factors: readiness and setting.
In this context, readiness refers to the attitudes, beliefs, and commitment that the patient brings to treatment. Setting refers to the social and physical environment in which treatment occurs– particularly the active support of others.
When someone reaches a tipping point where they acknowledge the need for professional help, and then makes a commitment to get that help, it signals an interruption in denial and a significant increase in motivation for change. Granted, it's a first step, but one psychologists consider essential to early recovery. Treatment adds a controlled, recovery-positive environment, dedicated to providing structure and support. And if you're willing to pay $42,500 a month for it– well, that's one heck of a commitment.
It has been suggested by research that the methods used in treatment matter far less than two other considerations: The quality of the bond between patient and therapist, and the therapist's own belief in the effectiveness of what s/he is doing. In other words, simply engaging and retaining someone in treatment in a helpful way may be more essential to outcome than therapeutic approach.
As one colleague put it, the user is already conditioned to expect a remedy in the form of a chemical. That doesn't mean it protects against a return to opioid use. Might even encourage it.
The program described in the article is definitely on the high side, price-wise, but if the competition prohibits pot smoking in treatment, then I imagine the availability of marijuana has significant marketing appeal for some customers. It'll attract new business.
And that's something I know a lot of treatment providers are on the lookout for.


text:
A Feast for Joseph
, illustrated by Ken Daley, received a Skipping Stones Honor, and The Cat Who Liked Potato Soup, illustrated by Barry Root, won a Bulletin for the Center of Children's Books Blue Ribbon. Terry lives in Kittery, Maine.
OD BONNY is a writer, producer and songwriter, as well as an artist of traditional Acholi music and dancehall/Afrobeat. He was born in South Sudan and fled to Uganda with his two older brothers, where they lived in Kyangwali Refugee Settlement. In 2003, they moved to the United States. OD attended the University of Maine in Orono, and he began composing and singing traditional Acholi music. He has toured all around Canada, the US, Australia and Ireland. This is his first book. He lives with his family in Omaha, Nebraska.
KEN DALEY is an illustrator who draws inspiration for his work from his African Caribbean roots. He has illustrated: Joseph's Big Ride by Terry Farish, which received a Skipping Stones Honor Award for International Multicultural Books, and Auntie Luce's Talking Paintings by Francie Latour, an Américas Award Honor Book and a Kirkus Best Picture Book about History and Tradition.He has exhibited his art in Canada, the United States and the Caribbean, and his work can be found in numerous private collections. Ken lives in Cambridge, Ontario.
Audience ages 3 to 6 / grades P to 1
Reading Levels Guided Reading N
Fountas & Pinnel Text Level N
Key Text Features glossary; translations
Common Core CCSS.ELA-LITERACY.RL.1.3
A wonderful book that humanizes refugees through a focus on joy in everyday life, even in asylum. STARRED REVIEW
The robust illustrations use saturated colors and shading to help convey a mood of happiness and warmth.
A heart-warming, powerful story.
" —Open Book
A Feast for Joseph captures and celebrates the magic that happens when individuals come together over food and friendship.
Praise for authors Terry Farish and OD Bonny and illustrator Ken Daley for A Feast for Joseph:
"A wonderful book that humanizes refugees through a focus on joy in everyday life, even in asylum." — Kirkus, starred review
"The robust illustrations use saturated colors and shading to help convey a mood of happiness and warmth." — Booklist
"A heart-warming, powerful story." — Open Book
"A Feast for Joseph captures and celebrates the magic that happens when individuals come together over food and friendship." — CM: Canadian Review of Materials


RAMALLAH (Ma'an) -- The Israeli authorities released a Palestinian prisoner, on Saturday, after he ended his 17-year sentence in Israeli prisons.
The Palestinian Prisoners and Former Prisoners' Affairs Committee said, in a statement, that prisoner Ahmad Moussa al-Hajj, from the Beit Sira village in the central occupied West Bank district of Ramallah was released, from the Negev jail in southern Israel, after spending 17 years in Israeli prisons for "resisting the occupation."
Al-Hajj was released at an Israeli checkpoint in the southern West Bank.
The former prisoner's family and friends welcomed him at the checkpoint.


After nearly three years since his last release – years spent locked away painstakingly developing the exact sound he is looking for – the incredible Phonat returns this summer with a new E.P. "Identity Theft".
Phonat has crafted an exceptionally intimate and personal journey, exploring themes of the soul within the machine, the passage of time and the passions and challenges of the creator.


text:
<?php
class BasicTest extends SimpleTest {
  function __construct() {
    foreach (DB::tableList() as $table) {
      DB::query("DROP TABLE %b", $table);
    }
  }

  function test_1_create_table() {
    DB::query("CREATE TABLE `accounts` (
    `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
    `profile_id` INT NOT NULL,
    `username` VARCHAR( 255 ) NOT NULL ,
    `password` VARCHAR( 255 ) NULL ,
    `age` INT NOT NULL DEFAULT '10',
    `height` DOUBLE NOT NULL DEFAULT '10.0',
    `favorite_word` VARCHAR( 255 ) NULL DEFAULT 'hi',
    `birthday` TIMESTAMP NOT NULL
    ) ENGINE = InnoDB");

    DB::query("CREATE TABLE `profile` (
    `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
    `signature` VARCHAR( 255 ) NULL DEFAULT 'donewriting'
    ) ENGINE = InnoDB");

    $mysqli = DB::get();
    DB::disconnect();
    @$this->assert($mysqli->server_info === null);
  }

  function test_1_5_empty_table() {
    $counter = DB::queryFirstField("SELECT COUNT(*) FROM accounts");
    $this->assert($counter === strval(0));

    $row = DB::queryFirstRow("SELECT * FROM accounts");
    $this->assert($row === null);

    $field = DB::queryFirstField("SELECT * FROM accounts");
    $this->assert($field === null);

    $field = DB::queryOneField('nothere', "SELECT * FROM accounts");
    $this->assert($field === null);

    $column = DB::queryFirstColumn("SELECT * FROM accounts");
    $this->assert(is_array($column) && count($column) === 0);

    $column = DB::queryOneColumn('nothere', "SELECT * FROM accounts"); //TODO: is this what we want?
    $this->assert(is_array($column) && count($column) === 0);
  }

  function test_2_insert_row() {
    $true = DB::insert('accounts', array(
      'username' => 'Abe',
      'password' => 'hello'
    ));

    $this->assert($true === true);
    $this->assert(DB::affectedRows() === 1);

    $counter = DB::queryFirstField("SELECT COUNT(*) FROM accounts");
    $this->assert($counter === strval(1));
  }

  function test_3_more_inserts() {
    DB::insert('`accounts`', array(
      'username' => 'Bart',
      'password' => 'hello',
      'age' => 15,
      'height' => 10.371
    ));
    $dbname = DB::$dbName;
    DB::insert("`$dbname`.`accounts`", array(
      'username' => 'Charlie\'s Friend',
      'password' => 'goodbye',
      'age' => 30,
      'height' => 155.23,
      'favorite_word' => null,
    ));

    $this->assert(DB::insertId() === 3);
    $counter = DB::queryFirstField("SELECT COUNT(*) FROM accounts");
    $this->assert($counter === strval(3));

    DB::insert('`accounts`', array(
      'username' => 'Deer',
      'password' => '',
      'age' => 15,
      'height' => 10.371
    ));

    $username = DB::queryFirstField("SELECT username FROM accounts WHERE password=%s0", null);
    $this->assert($username === 'Deer');

    $password = DB::queryFirstField("SELECT password FROM accounts WHERE favorite_word IS NULL");
    $this->assert($password === 'goodbye');

    DB::$usenull = false;
    DB::insertUpdate('accounts', array(
      'id' => 3,
      'favorite_word' => null,
    ));

    $password = DB::queryFirstField("SELECT password FROM accounts WHERE favorite_word=%s AND favorite_word=%s", null, '');
    $this->assert($password === 'goodbye');

    DB::$usenull = true;
    DB::insertUpdate('accounts', array(
      'id' => 3,
      'favorite_word' => null,
    ));

    DB::$param_char = '###';
    $bart = DB::queryFirstRow("SELECT * FROM accounts WHERE age IN ###li AND height IN ###ld AND username IN ###ls",
      array(15, 25), array(10.371, 150.123), array('Bart', 'Barts'));
    $this->assert($bart['username'] === 'Bart');
    DB::insert('accounts', array('username' => 'f_u'));
    DB::query("DELETE FROM accounts WHERE username=###s", 'f_u');
    DB::$param_char = '%';

    $charlie_password = DB::queryFirstField("SELECT password FROM accounts WHERE username IN %ls AND username = %s",
      array('Charlie', 'Charlie\'s Friend'), 'Charlie\'s Friend');
    $this->assert($charlie_password === 'goodbye');

    $charlie_password = DB::queryOneField('password', "SELECT * FROM accounts WHERE username IN %ls AND username = %s",
      array('Charlie', 'Charlie\'s Friend'), 'Charlie\'s Friend');
    $this->assert($charlie_password === 'goodbye');

    $passwords = DB::queryFirstColumn("SELECT password FROM accounts WHERE username=%s", 'Bart');
    $this->assert(count($passwords) === 1);
    $this->assert($passwords[0] === 'hello');

    $username = $password = $age = null;
    list($age, $username, $password) = DB::queryOneList("SELECT age,username,password FROM accounts WHERE username=%s", 'Bart');
    $this->assert($username === 'Bart');
    $this->assert($password === 'hello');
    $this->assert($age == 15);

    $mysqli_result = DB::queryRaw("SELECT * FROM accounts WHERE favorite_word IS NULL");
    $this->assert($mysqli_result instanceof MySQLi_Result);
    $row = $mysqli_result->fetch_assoc();
    $this->assert($row['password'] === 'goodbye');
    $this->assert($mysqli_result->fetch_assoc() === null);
  }

  function test_4_query() {
    DB::update('accounts', array(
      'birthday' => new DateTime('10 September 2000 13:13:13')
    ), 'username=%s', 'Charlie\'s Friend');

    $results = DB::query("SELECT * FROM accounts WHERE username=%s AND birthday IN %lt", 'Charlie\'s Friend', array('September 10 2000 13:13:13'));
    $this->assert(count($results) === 1);
    $this->assert($results[0]['age'] === '30' && $results[0]['password'] === 'goodbye');
    $this->assert($results[0]['birthday'] == '2000-09-10 13:13:13');

    $results = DB::query("SELECT * FROM accounts WHERE username!=%s", "Charlie's Friend");
    $this->assert(count($results) === 3);

    $columnlist = DB::columnList('accounts');
    $this->assert(count($columnlist) === 8);
    $this->assert($columnlist[0] === 'id');
    $this->assert($columnlist[5] === 'height');

    $tablelist = DB::tableList();
    $this->assert(count($tablelist) === 2);
    $this->assert($tablelist[0] === 'accounts');

    $tablelist = null;
    $tablelist = DB::tableList(DB::$dbName);
    $this->assert(count($tablelist) === 2);
    $this->assert($tablelist[0] === 'accounts');
  }

  function test_4_1_query() {
    DB::insert('accounts', array(
      'username' => 'newguy',
      'password' => DB::sqleval("REPEAT('blah', %i)", '3'),
      'age' => DB::sqleval('171+1'),
      'height' => 111.15
    ));

    $row = DB::queryOneRow("SELECT * FROM accounts WHERE password=%s", 'blahblahblah');
    $this->assert($row['username'] === 'newguy');
    $this->assert($row['age'] === '172');

    $true = DB::update('accounts', array(
      'password' => DB::sqleval("REPEAT('blah', %i)", 4),
      'favorite_word' => null,
      ), 'username=%s', 'newguy');

    $row = null;
    $row = DB::queryOneRow("SELECT * FROM accounts WHERE username=%s", 'newguy');
    $this->assert($true === true);
    $this->assert($row['password'] === 'blahblahblahblah');
    $this->assert($row['favorite_word'] === null);

    $row = DB::query("SELECT * FROM accounts WHERE password=%s_mypass AND (password=%s_mypass) AND username=%s_myuser",
      array('myuser' => 'newguy', 'mypass' => 'blahblahblahblah')
    );
    $this->assert(count($row) === 1);
    $this->assert($row[0]['username'] === 'newguy');
    $this->assert($row[0]['age'] === '172');

    $row = DB::query("SELECT * FROM accounts WHERE password IN %li AND password IN %li0 AND username=%s", array('blahblahblahblah'), 'newguy');
    $this->assert(count($row) === 1);
    $this->assert($row[0]['username'] === 'newguy');
    $this->assert($row[0]['age'] === '172');

    $true = DB::query("DELETE FROM accounts WHERE password=%s", 'blahblahblahblah');
    $this->assert($true === true);
    $this->assert(DB::affectedRows() === 1);
  }

  function test_4_2_delete() {
    DB::insert('accounts', array(
      'username' => 'gonesoon',
      'password' => 'something',
      'age' => 61,
      'height' => 199.194
    ));

    $ct = DB::queryFirstField("SELECT COUNT(*) FROM accounts WHERE %ha", array('username' => 'gonesoon', 'height' => 199.194));
    $this->assert(intval($ct) === 1);

    $ct = DB::queryFirstField("SELECT COUNT(*) FROM accounts WHERE username=%s1 AND height=%d0 AND height=%d", 199.194, 'gonesoon');
    $this->assert(intval($ct) === 1);

    DB::delete('accounts', 'username=%s AND age=%i AND height=%d', 'gonesoon', '61', '199.194');
    $this->assert(DB::affectedRows() === 1);

    $ct = DB::queryFirstField("SELECT COUNT(*) FROM accounts WHERE username=%s AND height=%d", 'gonesoon', '199.194');
    $this->assert(intval($ct) === 0);
  }

  function test_4_3_insertmany() {
    $ins[] = array(
      'username' => '1ofmany',
      'password' => 'something',
      'age' => 23,
      'height' => 190.194
    );
    $ins[] = array(
      'password' => 'somethingelse',
      'username' => '2ofmany',
      'age' => 25,
      'height' => 190.194
    );
    $ins[] = array(
      'password' => NULL,
      'username' => '3ofmany',
      'age' => 15,
      'height' => 111.951
    );

    DB::insert('accounts', $ins);
    $this->assert(DB::affectedRows() === 3);

    $rows = DB::query("SELECT * FROM accounts WHERE height=%d ORDER BY age ASC", 190.194);
    $this->assert(count($rows) === 2);
    $this->assert($rows[0]['username'] === '1ofmany');
    $this->assert($rows[0]['age'] === '23');
    $this->assert($rows[1]['age'] === '25');
    $this->assert($rows[1]['password'] === 'somethingelse');
    $this->assert($rows[1]['username'] === '2ofmany');

    $nullrow = DB::queryOneRow("SELECT * FROM accounts WHERE username LIKE %ss", '3ofman');
    $this->assert($nullrow['password'] === NULL);
    $this->assert($nullrow['age'] === '15');
  }

  function test_5_insert_blobs() {
    DB::query("CREATE TABLE `store data` (
      `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
      `picture` BLOB
    ) ENGINE = InnoDB");

    $columns = DB::columnList('store data');
    $this->assert(count($columns) === 2);
    $this->assert($columns[1] === 'picture');

    $smile = file_get_contents('smile1.jpg');
    DB::insert('store data', array(
      'picture' => $smile,
    ));
    DB::queryOneRow("INSERT INTO %b (picture) VALUES (%s)", 'store data', $smile);

    $getsmile = DB::queryFirstField("SELECT picture FROM %b WHERE id=1", 'store data');
    $getsmile2 = DB::queryFirstField("SELECT picture FROM %b WHERE id=2", 'store data');
    $this->assert($smile === $getsmile);
    $this->assert($smile === $getsmile2);
  }

  function test_6_insert_ignore() {
    DB::insertIgnore('accounts', array(
      'id' => 1, //duplicate primary key
      'username' => 'gonesoon',
      'password' => 'something',
      'age' => 61,
      'height' => 199.194
    ));
  }

  function test_7_insert_update() {
    $true = DB::insertUpdate('accounts', array(
      'id' => 2, //duplicate primary key
      'username' => 'gonesoon',
      'password' => 'something',
      'age' => 61,
      'height' => 199.194
    ), 'age = age + %i', 1);

    $this->assert($true === true);
    $this->assert(DB::affectedRows() === 2); // a quirk of MySQL, even though only 1 row was updated

    $result = DB::query("SELECT * FROM accounts WHERE age = %i", 16);
    $this->assert(count($result) === 1);
    $this->assert($result[0]['height'] === '10.371');

    DB::insertUpdate('accounts', array(
      'id' => 2, //duplicate primary key
      'username' => 'blahblahdude',
      'age' => 233,
      'height' => 199.194
    ));

    $result = DB::query("SELECT * FROM accounts WHERE age = %i", 233);
    $this->assert(count($result) === 1);
    $this->assert($result[0]['height'] === '199.194');
    $this->assert($result[0]['username'] === 'blahblahdude');

    DB::insertUpdate('accounts', array(
      'id' => 2, //duplicate primary key
      'username' => 'gonesoon',
      'password' => 'something',
      'age' => 61,
      'height' => 199.194
    ), array(
      'age' => 74,
    ));

    $result = DB::query("SELECT * FROM accounts WHERE age = %i", 74);
    $this->assert(count($result) === 1);
    $this->assert($result[0]['height'] === '199.194');
    $this->assert($result[0]['username'] === 'blahblahdude');

    $multiples[] = array(
      'id' => 3, //duplicate primary key
      'username' => 'gonesoon',
      'password' => 'something',
      'age' => 61,
      'height' => 199.194
    );
    $multiples[] = array(
      'id' => 1, //duplicate primary key
      'username' => 'gonesoon',
      'password' => 'something',
      'age' => 61,
      'height' => 199.194
    );

    DB::insertUpdate('accounts', $multiples, array('age' => 914));
    $this->assert(DB::affectedRows() === 4);

    $result = DB::query("SELECT * FROM accounts WHERE age=914 ORDER BY id ASC");
    $this->assert(count($result) === 2);
    $this->assert($result[0]['username'] === 'Abe');
    $this->assert($result[1]['username'] === 'Charlie\'s Friend');

    $true = DB::query("UPDATE accounts SET age=15, username='Bart' WHERE age=%i", 74);
    $this->assert($true === true);
    $this->assert(DB::affectedRows() === 1);
  }

  function test_8_lb() {
    $data = array(
      'username' => 'vookoo',
      'password' => 'dookoo',
    );

    $true = DB::query("INSERT into accounts %lb VALUES %ls", array_keys($data), array_values($data));
    $result = DB::query("SELECT * FROM accounts WHERE username=%s", 'vookoo');
    $this->assert($true === true);
    $this->assert(count($result) === 1);
    $this->assert($result[0]['password'] === 'dookoo');
  }

  function test_9_fullcolumns() {
    $true = DB::insert('profile', array(
      'id' => 1,
      'signature' => 'u_suck'
    ));
    DB::query("UPDATE accounts SET profile_id=1 WHERE id=2");

    $r = DB::queryFullColumns("SELECT accounts.*, profile.*, 1+1 FROM accounts
      INNER JOIN profile ON accounts.profile_id=profile.id");

    $this->assert($true === true);
    $this->assert(count($r) === 1);
    $this->assert($r[0]['accounts.id'] === '2');
    $this->assert($r[0]['profile.id'] === '1');
    $this->assert($r[0]['profile.signature'] === 'u_suck');
    $this->assert($r[0]['1+1'] === '2');
  }

  function test_901_updatewithspecialchar() {
    $data = 'www.mysite.com/product?s=t-%s-%%3d%%3d%i&RCAID=24322';
    DB::update('profile', array('signature' => $data), 'id=%i', 1);
    $signature = DB::queryFirstField("SELECT signature FROM profile WHERE id=%i", 1);
    $this->assert($signature === $data);

    DB::update('profile',array('signature'=> "%li "),"id = %d",1);
    $signature = DB::queryFirstField("SELECT signature FROM profile WHERE id=%i", 1);
    $this->assert($signature === "%li ");

  }

}

?>

redpajama_set_name: RedPajamaGithub


text:
American Comedy Films (X) Meredith, George (X) Law (X) Favorites from the National Library of China (X)
American Comedy Films
* Favorites from the National Library of China
One of Our Conquerors
George Meredith
Collections: Literature, Law, Penn State University's Electronic Classics Series Collection, Classic Literature Collection, Most Popular Books in China, Favorites from the National Library of China
Excerpt: One of Our Conquerors by George Meredith.
...ONE OF OUR CONQUERORS By George Meredith A Penn State Electronic Classics Series Publication One of Our Co... ...enn State Electronic Classics Series Publication One of Our Conquerors by George Meredith is a publication of the Pennsylvania State University. This... ...te Electronic Classics Series Publication One of Our Conquerors by George Meredith is a publication of the Pennsylvania State University. This Portab... ...e file as an electronic transmission, in any way. One of Our Conquerors by George Meredith, the Pennsylvania State University, Electronic Classics Ser... ... He thanked heaven to his wife often, that he had nothing to do with North American or South American mines and pastures or with South Africa and, gol... ...and in- structed Germans not deviously march; whom acute and ad- venturous Americans, with half a cock of the eye in passing, compassionately outstrip... ...panese erudites. Delphica, with each of the rivals in turn, is very pretty Comedy. She is aware that M. Falarique is her most redoubtable adversary, b... ...e to work in the direction of the casuistries and the sensational webs and films. Facing Victor, it was a block. But the thought came: how could she m... ...and contemptuously, to be- come in the active, while it is exacted of hero Comedy of Clowns!—that in the passive she be a rockfortress impreg- nable, ...


Business success doesn't happen by accident. It is the result of careful planning, effective execution, and having the confidence to close the sale. Sales professionals aren't just selling a product or service; they're selling themselves and the believability in their offer. But what happens when sales dry up? Where do you go when your approach or presentation is no longer believable? How do you turn "no" into your next opportunity? A sales slump is the last place anyone wants to be. These five steps are key to beating the dreaded sales slump.
Remember that "no" is short for next opportunity. Don't give up. If you want to be better than the average salesperson, you need to make a better-than-average attempt. Top sales professionals are successful because they exude competence and affability. They have evolved a winning personality and have worked hard to do so. They have shaped their character, patiently labored through the intricacies of their profession, and done their homework day after day for every customer they encounter. A top sales professional knows that 80 percent of potential customers only buy after five to 10 calls from salespeople, but 50 percent of sales professionals call their prospects just once. Find out what your customer really wants, make adjustments, and keep calling. Perseverance makes the sale.
People buy from people. This means that most sales decisions are made on a relationship level. In the B2B world, where sales professionals have to deal with buying centers more and more often, connecting on a personal level may appear harder than in the past. The way around this is to find "allies" within your target company (e.g., potential users of the product you're selling), and have them help you through their company's internal decision-making process.
When a sales slump hits, or after losing a deal, many salespeople lack motivation. It's better to assess what happened and learn how your approach went wrong than fall into despair. We all make mistakes, push too hard, and even step on toes from time to time, but it's how they evaluate and adapt their approach that keep salespeople successful. Top salespeople know they need to become even more motivated when times are tough. It is critical to learn to deal with rejection. Focus and recollect your energy, and start over, with full power.


Will OWN ultimately succeed? The odds are good that Winfrey has what it takes to succeed as a serial entrepreneur. In my classes, I like to point out that unlike just about every other entrepreneur on the Forbes list of 400 wealthiest Americans, Winfrey didn't have any help from venture capital funds and the public financing markets to propel her first company's growth.


text:
Home News and updates Companies, organisations and people Pacific Basin sponsors seafarers' support network
Pacific Basin sponsors seafarers' support network
More about Sick
Pacific Basin Shipping joins five other leading companies as a Platinum sponsor of the Mission's Sustaining Crew Welfare Campaign, allocating their contribution specifically to the Mission's Family Support Network in the Philippines.
First established in 2016, the Mission's Family Support Network (Philippines) has grown significantly and now supports over 4,000 seafarers and their family members across the Philippines. This valuable service not only brings seafarers' families together to provide mutual support it also offers relevant training and guidance in terms of managing long distance relationships, how to communicate by social media with seafarers away from home, managing finances and everyday worries and concerns. In addition, they have helped with the vaccination effort.
The Mission to Seafarers team in Manila can coordinate expert advice in specific circumstances to alleviate concerns and worries. This reduces the pressure on seafarers away from home, enabling them to continue with their work with the knowledge that the Mission is supporting their families at home. The Mission hopes that this goes some small way to assist safety at sea.
The project sponsorship will fund the operational costs of the Family Support Network service including the running of a minibus which transports seafarers to and from their homes; assists sick seafarers who need transport, and for travel from ports and airports as necessary. The transport also provides support for the delivery of the Family Support Network's seminars and information services on medical, legal and financial support, as well as counselling to those in need.
On countless occasions, The Mission to Seafarers has provided first response support to seafarers in need. The Family Support Network service liaises with the Mission's global network to assist in times of crisis and concern by offering reassurance and practical solutions. This has been the case in countries like the Philippines during natural disasters and global pandemics such as COVID-19 and the recent Typhoon Rai.
Martin Fruergaard, CEO of Pacific Basin, commented, ''Our seafarers continue to be the backbone of our business, and their dedication, loyalty and professionalism – despite the hardships – enables our company to continue to provide reliable service to customers in good times and bad. Our contribution to this worthy cause is one of the ways we can help to support both seafarers and their families, who are also part of the wider Pacific Basin family. The Mission to Seafarers' Family Support Network helps by providing assistance and support to families which is vital while their seafarers are away at sea''
Ben Bailey, Director of Advocacy & Regional Engagement, The Mission to Seafarers, added, "Over the last six years we have built 8 chapters across the Philippines and empowered local communities to work together to create sustainable support networks while their loved ones are at sea. During the pandemic, our chapters have been very active online, working to complete the Mission's WeCare Financial Wellbeing programme as well as explore topics of resilience and positive mental health. In Manila, our team has been offering transport to seafarers and working with those who are seeking work or who require a route into state support. During the recent Typhoon Rai, one of our chapters has been very badly hit, and we are working with affected communities to provide support and practical assistance.
"Our work with seafarers' families is part of our strategy to be there when crews need us most. Over the next five years, we want to work with maritime stakeholders to establish new networks across the globe and already have plans to build on our latest network in India. We are delighted to be working with Pacific Basin Shipping for the next three years, and we are very grateful for their generous financial contribution. We thank Pacific Basin Shipping for their incredible generosity. We are now looking for two more corporate donors to help us cover all the costs of this service."
Posted in Companies, organisations and people
Tagged Seafarers


text:
var express = require("express");
var FS = require("q-io/fs");
var FSSync = require("fs");
var HTTP = require("q-io/http");
var moment = require("moment");
var UUID = require("uuid");

var Board = require("../boards");
var Captcha = require("../captchas");
var Chat = require("../helpers/chat");
var config = require("../helpers/config");
var controller = require("../helpers/controller");
var Database = require("../helpers/database");
var Global = require("../helpers/global");
var markup = require("../helpers/markup");
var Tools = require("../helpers/tools");
var vk = require("../helpers/vk")(config("site.vkontakte.accessToken", ""));

var router = express.Router();

var getFiles = function(fields, files, transaction) {
    var setFileRating = function(file, id) {
        file.rating = "SFW";
        var r = fields["file_" + id + "_rating"];
        if (["R-15", "R-18", "R-18G"].indexOf(r) >= 0)
            file.rating = r;
    };
    var tmpFiles = Tools.filterIn(files, function(file) {
        if (file.size < 1) {
            FS.remove(file.path).catch(function(err) {
                Global.error(req, err.stack || err);
            });
            return false;
        }
        return true;
    });
    var promises = Tools.mapIn(tmpFiles, function(file, fieldName) {
        setFileRating(file, file.fieldName.substr(5));
        transaction.filePaths.push(file.path);
        return Tools.mimeType(file.path).then(function(mimeType) {
            file.mimeType = mimeType;
            return Promise.resolve(file);
        });
    });
    return Promise.all(promises).then(function(files) {
        tmpFiles = files;
        var urls = [];
        Tools.forIn(fields, function(url, key) {
            if (!/^file_url_\S+$/.test(key))
                return;
            urls.push({
                url: url,
                formFieldName: key
            });
        });
        promises = urls.map(function(url) {
            var path = __dirname + "/../tmp/upload_" + UUID.v1();
            transaction.filePaths.push(path);
            var c = {};
            var proxy = Tools.proxy();
            var p;
            if (url.url.replace("vk://", "") != url.url) {
                p = vk("audio.getById", {audios: url.url.split("/")[2]}).then(function(result) {
                    return HTTP.request({
                        url: result.response[0].url,
                        timeout: Tools.Minute
                    });
                });
            } else if (proxy) {
                p = HTTP.request({
                    host: proxy.host,
                    port: proxy.port,
                    headers: { "Proxy-Authorization": proxy.auth },
                    path: url.url,
                    timeout: Tools.Minute
                });
            } else {
                p = HTTP.request({
                    url: url.url,
                    timeout: Tools.Minute
                });
            }
            return p.then(function(response) {
                if (response.status != 200)
                    return Promise.reject(Tools.translate("Failed to download file"));
                return response.body.read();
            }).then(function(data) {
                c.size = data.length;
                if (c.size < 1)
                    return Promise.reject(Tools.translate("File is empty"));
                return Tools.writeFile(path, data);
            }).then(function() {
                c.file = {
                    name: url.url.split("/").pop(),
                    size: c.size,
                    path: path
                };
                setFileRating(c.file, url.formFieldName.substr(9));
                return Tools.mimeType(path);
            }).then(function(mimeType) {
                c.file.mimeType = mimeType;
                return Promise.resolve(c.file);
            });
        });
        return Promise.all(promises);
    }).then(function(downloadedFiles) {
        tmpFiles = tmpFiles.concat(downloadedFiles);
        var hashes = fields.fileHashes ? fields.fileHashes.split(",") : [];
        return Database.getFileInfosByHashes(hashes);
    }).then(function(fileInfos) {
        return tmpFiles.concat(fileInfos.map(function(fileInfo, i) {
            var fi = {
                name: fileInfo.name,
                thumbName: fileInfo.thumb.name,
                size: fileInfo.size,
                boardName: fileInfo.boardName,
                mimeType: fileInfo.mimeType,
                rating: fileInfo.rating,
                copy: true
            };
            setFileRating(fi, fields.fileHashes.split(",")[i]);
            return fi;
        }));
    });
};

var testParameters = function(fields, files, creatingThread) {
    var board = Board.board(fields.boardName);
    if (!board)
        return Promise.reject(404);
    var email = fields.email || "";
    var name = fields.name || "";
    var subject = fields.subject || "";
    var text = fields.text || "";
    var password = fields.password || "";
    var fileCount = files.length;
    var maxFileSize = board.maxFileSize;
    var maxFileCount = board.maxFileCount;
    if (email.length > board.maxEmailLength)
        return Promise.reject(Tools.translate("E-mail is too long"));
    if (name.length > board.maxNameLength)
        return Promise.reject(Tools.translate("Name is too long"));
    if (subject.length > board.maxSubjectLength)
        return Promise.reject(Tools.translate("Subject is too long"));
    if (text.length > board.maxTextFieldLength)
        return Promise.reject(Tools.translate("Comment is too long"));
    if (password.length > board.maxPasswordLength)
        return Promise.reject(Tools.translate("Password is too long"));
    if (creatingThread && maxFileCount && !fileCount)
        return Promise.reject(Tools.translate("Attempt to create a thread without attaching a file"));
    if (text.length < 1 && !fileCount)
        return Promise.reject(Tools.translate("Both file and comment are missing"));
    if (fileCount > maxFileCount) {
        return Promise.reject(Tools.translate("Too many files"));
    } else {
        var err = files.reduce(function(err, file) {
            if (err)
                return err;
            if (file.size > maxFileSize)
                return Tools.translate("File is too big");
            if (board.supportedFileTypes.indexOf(file.mimeType) < 0)
                return Tools.translate("File type is not supported");
        }, "");
        if (err)
            return Promise.reject(err);
    }
    return Promise.resolve();
};

router.post("/action/markupText", function(req, res, next) {
    var c = {};
    var date = Tools.now();
    Tools.parseForm(req).then(function(result) {
        c.fields = result.fields;
        c.board = Board.board(c.fields.boardName);
        if (!c.board)
            return Promise.reject(Tools.translate("Invalid board"));
        return controller.checkBan(req, res, c.board.name, true);
    }).then(function() {
        if (c.fields.text.length > c.board.maxTextFieldLength)
            return Promise.reject(Tools.translate("Comment is too long"));
        var markupModes = [];
        Tools.forIn(markup.MarkupModes, function(val) {
            if (c.fields.markupMode && c.fields.markupMode.indexOf(val) >= 0)
                markupModes.push(val);
        });
        return markup(c.board.name, c.fields.text, {
            markupModes: markupModes,
            referencedPosts: {},
            accessLevel: req.level(c.board.name)
        });
    }).then(function(text) {
        var data = {
            boardName: c.board.name,
            text: text || null,
            rawText: c.fields.text || null,
            options: {
                signAsOp: ("true" == c.fields.signAsOp),
                showTripcode: !!req.hashpass && ("true" == c.fields.tripcode)
            },
            createdAt: date.toISOString()
        };
        if (req.hashpass && c.fields.tripcode)
            data.tripcode = Tools.generateTripcode(req.hashpass);
        res.send(data);
    }).catch(function(err) {
        next(err);
    });
});

router.post("/action/createPost", function(req, res, next) {
    var c = {};
    var transaction = new Database.Transaction();
    Tools.parseForm(req).then(function(result) {
        c.fields = result.fields;
        c.files = result.files;
        c.board = Board.board(c.fields.boardName);
        if (!c.board)
            return Promise.reject(Tools.translate("Invalid board"));
        transaction.board = c.board;
        return controller.checkBan(req, res, c.board.name, true);
    }).then(function() {
        return getFiles(c.fields, c.files, transaction);
    }).then(function(files) {
        c.files = files;
        return testParameters(c.fields, c.files);
    }).then(function() {
        return c.board.testParameters(req, c.fields, c.files);
    }).then(function() {
        return Database.createPost(req, c.fields, c.files, transaction);
    }).then(function(post) {
        res.send({
            boardName: post.boardName,
            postNumber: post.number
        });
    }).catch(function(err) {
        transaction.rollback();
        next(err);
    });
});

router.post("/action/createThread", function(req, res, next) {
    var c = {};
    var transaction = new Database.Transaction();
    Tools.parseForm(req).then(function(result) {
        c.fields = result.fields;
        c.files = result.files;
        c.board = Board.board(c.fields.boardName);
        if (!c.board)
            return Promise.reject(Tools.translate("Invalid board"));
        transaction.board = c.board;
        return controller.checkBan(req, res, c.board.name, true);
    }).then(function() {
        return getFiles(c.fields, c.files, transaction);
    }).then(function(files) {
        c.files = files;
        return testParameters(c.fields, c.files, true);
    }).then(function() {
        return c.board.testParameters(req, c.fields, c.files, true);
    }).then(function() {
        return Database.createThread(req, c.fields, c.files, transaction);
    }).then(function(thread) {
        res.send({
            boardName: thread.boardName,
            threadNumber: thread.number
        });
    }).catch(function(err) {
        transaction.rollback();
        next(err);
    });
});

router.post("/action/editPost", function(req, res, next) {
    var c = {};
    Tools.parseForm(req).then(function(result) {
        c.fields = result.fields;
        c.boardName = result.fields.boardName;
        c.postNumber = +result.fields.postNumber;
        return controller.checkBan(req, res, c.boardName, true);
    }).then(function() {
        return Database.editPost(req, c.fields);
    }).then(function(result) {
        res.send({
            boardName: c.boardName,
            postNumber: c.postNumber
        });
    }).catch(function(err) {
        next(err);
    });
});

router.post("/action/addFiles", function(req, res, next) {
    var c = {};
    var transaction = new Database.Transaction();
    Tools.parseForm(req).then(function(result) {
        c.fields = result.fields;
        c.files = result.files;
        c.board = Board.board(c.fields.boardName);
        if (!c.board)
            return Promise.reject(Tools.translate("Invalid board"));
        transaction.board = c.board;
        return controller.checkBan(req, res, c.board.name, true);
    }).then(function() {
        return getFiles(c.fields, c.files, transaction);
    }).then(function(files) {
        c.files = files;
        var fileCount = c.files.length;
        if (fileCount < 1)
            return Promise.reject(Tools.translate("No file specified"));
        var maxFileSize = c.board.maxFileSize;
        var maxFileCount = c.board.maxFileCount;
        if (fileCount > maxFileCount) {
            return Promise.reject(Tools.translate("Too many files"));
        } else {
            var err = c.files.reduce(function(err, file) {
                if (err)
                    return err;
                if (file.size > maxFileSize)
                    return Tools.translate("File is too big");
                if (c.board.supportedFileTypes.indexOf(file.mimeType) < 0)
                    return Tools.translate("File type is not supported");
            }, "");
            if (err)
                return Promise.reject(err);
        }
        return Database.addFiles(req, c.fields, c.files, transaction);
    }).then(function(result) {
        res.send({
            boardName: result.boardName,
            postNumber: result.postNumber,
            threadNumber: result.threadNumber
        });
    }).catch(function(err) {
        transaction.rollback();
        next(err);
    });
});

router.post("/action/deletePost", function(req, res, next) {
    var c = {};
    Tools.parseForm(req).then(function(result) {
        c.fields = result.fields;
        return controller.checkBan(req, res, c.fields.boardName, true);
    }).then(function() {
        return Database.deletePost(req, res, c.fields);
    }).then(function(result) {
        res.send(result);
    }).catch(function(err) {
        next(err);
    });
});

router.post("/action/deleteFile", function(req, res, next) {
    Tools.parseForm(req).then(function(result) {
        return Database.deleteFile(req, res, result.fields);
    }).then(function(result) {
        res.send(result);
    }).catch(function(err) {
        next(err);
    });
});

router.post("/action/editFileRating", function(req, res, next) {
    Tools.parseForm(req).then(function(result) {
        return Database.editFileRating(req, res, result.fields);
    }).then(function(result) {
        res.send(result);
    }).catch(function(err) {
        next(err);
    });
});

router.post("/action/moveThread", function(req, res, next) {
    var c = {};
    Tools.parseForm(req).then(function(result) {
        c.fields = result.fields;
        return controller.checkBan(req, res, c.fields.boardName, true);
    }).then(function() {
        return controller.checkBan(req, res, c.fields.targetBoardName, true);
    }).then(function() {
        return Database.moveThread(req, c.fields);
    }).then(function(result) {
        res.send(result);
    }).catch(function(err) {
        next(err);
    });
});

router.post("/action/editAudioTags", function(req, res, next) {
    Tools.parseForm(req).then(function(result) {
        return Database.editAudioTags(req, res, result.fields);
    }).then(function(result) {
        res.send(result);
    }).catch(function(err) {
        next(err);
    });
});

router.post("/action/banUser", function(req, res, next) {
    if (!req.isModer())
        return next(Tools.translate("Not enough rights"));
    var c = {};
    Tools.parseForm(req).then(function(result) {
        c.bans = [];
        c.fields = result.fields;
        c.userIp = result.fields.userIp;
        Tools.forIn(result.fields, function(value, name) {
            if (!/^banBoard_\S+$/.test(name))
                return;
            var level = result.fields["banLevel_" + value];
            if ("NONE" == level)
                return;
            var expiresAt = result.fields["banExpires_" + value];
            if (expiresAt) {
                var timeOffset = +c.fields.timeOffset;
                if (isNaN(timeOffset) || timeOffset < -720 || timeOffset > 840)
                    timeOffset = config("site.timeOffset", 0);
                var hours = Math.floor(timeOffset / 60);
                var minutes = Math.abs(timeOffset) % 60;
                var tz = ((timeOffset > 0) ? "+" : "") + ((Math.abs(hours) < 10) ? "0" : "") + hours + ":"
                    + ((minutes < 10) ? "0" : "") + minutes;
                expiresAt = moment(expiresAt + " " + tz, "YYYY/MM/DD HH:mm ZZ");
                if (+expiresAt < (+Tools.now() + Tools.Second))
                    expiresAt = null;
            } else {
                expiresAt = null;
            }
            c.bans.push({
                boardName: value,
                expiresAt: +expiresAt ? expiresAt : null,
                level: level,
                reason: result.fields["banReason_" + value],
                postNumber: +result.fields["banPostNumber_" + value] || null
            });
        });
        return Database.banUser(req, c.fields.userIp, c.bans);
    }).then(function(result) {
        res.send({});
    }).catch(function(err) {
        next(err);
    });
});

router.post("/action/delall", function(req, res, next) {
    if (!req.isModer())
        return next(Tools.translate("Not enough rights"));
    var c = {};
    Tools.parseForm(req).then(function(result) {
        c.fields = result.fields;
        c.boardNames = Tools.toArray(Tools.filterIn(c.fields, function(boardName, key) {
            return /^board_\S+$/.test(key);
        }));
        if (c.boardNames.length < 1)
            return Promise.reject(Tools.translate("No board specified"));
        return controller.checkBan(req, res, c.boardNames, true);
    }).then(function() {
        return Database.delall(req, c.fields.userIp, c.boardNames);
    }).then(function(result) {
        res.send({});
    }).catch(function(err) {
        next(err);
    });
});

var getRegisteredUserData = function(fields) {
    var levels = {};
    var password = fields.password;
    var ips = Tools.ipList(fields.ips);
    if (typeof ips == "string")
        return Promise.reject(ips);
    Tools.forIn(fields, function(value, name) {
        if (!/^accessLevelBoard_\S+$/.test(name))
            return;
        var level = fields["accessLevel_" + value];
        if ("NONE" == level)
            return;
        levels[value] = level;
    });
    return Promise.resolve({
        password: password,
        levels: levels,
        ips: ips
    });
};

router.post("/action/registerUser", function(req, res, next) {
    if (!req.isSuperuser())
        return next(Tools.translate("Not enough rights"));
    Tools.parseForm(req).then(function(result) {
        return getRegisteredUserData(result.fields);
    }).then(function(result) {
        return Database.registerUser(result.password, result.levels, result.ips);
    }).then(function(hashpass) {
        res.json({ hashpass: hashpass });
    }).catch(function(err) {
        next(err);
    });
});

router.post("/action/unregisterUser", function(req, res, next) {
    if (!req.isSuperuser())
        return next(Tools.translate("Not enough rights"));
    var c = {};
    Tools.parseForm(req).then(function(result) {
        return Database.unregisterUser(result.fields.hashpass);
    }).then(function(result) {
        res.send({});
    }).catch(function(err) {
        next(err);
    });
});

router.post("/action/updateRegisteredUser", function(req, res, next) {
    if (!req.isSuperuser())
        return next(Tools.translate("Not enough rights"));
    Tools.parseForm(req).then(function(result) {
        return getRegisteredUserData(result.fields);
    }).then(function(result) {
        return Database.updateRegisteredUser(result.password, result.levels, result.ips);
    }).then(function() {
        res.json({});
    }).catch(function(err) {
        next(err);
    });
});

router.post("/action/setThreadFixed", function(req, res, next) {
    var c = {};
    Tools.parseForm(req).then(function(result) {
        c.fields = result.fields;
        c.boardName = result.fields.boardName;
        c.threadNumber = +result.fields.threadNumber;
        return controller.checkBan(req, res, c.boardName, true);
    }).then(function() {
        return Database.setThreadFixed(req, c.fields);
    }).then(function(result) {
        res.send(result);
    }).catch(function(err) {
        next(err);
    });
});

router.post("/action/setThreadClosed", function(req, res, next) {
    var c = {};
    Tools.parseForm(req).then(function(result) {
        c.fields = result.fields;
        c.boardName = result.fields.boardName;
        c.threadNumber = +result.fields.threadNumber;
        return controller.checkBan(req, res, c.boardName, true);
    }).then(function() {
        return Database.setThreadClosed(req, c.fields);
    }).then(function(result) {
        res.send(result);
    }).catch(function(err) {
        next(err);
    });
});

router.post("/action/setThreadUnbumpable", function(req, res, next) {
    var c = {};
    Tools.parseForm(req).then(function(result) {
        c.fields = result.fields;
        c.boardName = result.fields.boardName;
        c.threadNumber = +result.fields.threadNumber;
        return controller.checkBan(req, res, c.boardName, true);
    }).then(function() {
        return Database.setThreadUnbumpable(req, c.fields);
    }).then(function(result) {
        res.send(result);
    }).catch(function(err) {
        next(err);
    });
});

router.post("/action/sendChatMessage", function(req, res, next) {
    Tools.parseForm(req).then(function(result) {
        var fields = result.fields;
        return Chat.sendMessage({
            ip: req.ip,
            hashpass: req.hashpass
        }, fields.boardName, +fields.postNumber, fields.text);
    }).then(function(result) {
        res.send({});
    }).catch(function(err) {
        next(err);
    });
});

router.post("/action/deleteChatMessages", function(req, res, next) {
    Tools.parseForm(req).then(function(result) {
        var fields = result.fields;
        return Chat.deleteMessages({
            ip: req.ip,
            hashpass: req.hashpass
        }, fields.boardName, fields.postNumber);
    }).then(function(result) {
        res.send(result);
    }).catch(function(err) {
        next(err);
    });
});

router.post("/action/synchronize", function(req, res, next) {
    var c = {};
    Tools.parseForm(req).then(function(result) {
        c.key = result.fields.key;
        if (!c.key)
            return Promise.reject(Tools.translate("No key specified"));
        var data = result.fields.data;
        try {
            data = JSON.parse(data);
        } catch (err) {
            return Promise.reject(err);
        }
        return Database.db.set("synchronizationData:" + c.key, JSON.stringify(data));
    }).then(function() {
        return Database.db.expire("synchronizationData:" + c.key, 300); //NOTE: 5 minutes
    }).then(function() {
        res.send({});
    }).catch(function(err) {
        next(err);
    });
});

router.post("/action/search", function(req, res, next) {
    var c = { model: {} };
    Tools.parseForm(req).then(function(result) {
        var fields = result.fields;
        c.query = fields.query || "";
        if (!c.query)
            return Promise.reject(Tools.translate("Search query is empty"));
        if (c.query.length > config("site.maxSearchQueryLength", 50))
            return Promise.reject(Tools.translate("Search query is too long"));
        var boardName = fields.boardName || "";
        if ("*" == boardName)
            boardName = "";
        var page = fields.page || 0;
        c.model.searchQuery = c.query;
        c.model.searchBoard = boardName;
        c.phrases = Tools.splitCommand(c.query);
        if (!c.phrases || !c.phrases.command)
            return Promise.reject(Tools.translate("Invalid search query"));
        c.phrases = [c.phrases.command].concat(c.phrases.arguments);
        c.query = {
            requiredPhrases: [],
            excludedPhrases: [],
            possiblePhrases: []
        };
        c.phrases.forEach(function(phrase) {
            if (phrase.substr(0, 1) == "+")
                c.query.requiredPhrases.push(phrase.substr(1).toLowerCase());
            else if (phrase.substr(0, 1) == "-")
                c.query.excludedPhrases.push(phrase.substr(1).toLowerCase());
            else
                c.query.possiblePhrases.push(phrase.toLowerCase());
        });
        c.model.phrases = c.query.requiredPhrases.concat(c.query.excludedPhrases).concat(c.query.possiblePhrases);
        c.model.phrases = Tools.withoutDuplicates(c.model.phrases);
        return Database.findPosts(c.query, boardName, page);
    }).then(function(result) {
        var posts = result.posts;
        c.model.searchResults = posts.map(function(post) {
            var text = post.plainText || "";
            text = text.replace(/\r*\n+/g, " ");
            if (text.length > 300)
                text = text.substr(0, 297) + "...";
            var subject = post.subject || text;
            if (subject.length > 100)
                subject = subject.substr(0, 97) + "...";
            return {
                boardName: post.boardName,
                postNumber: post.number,
                threadNumber: post.threadNumber,
                archived: post.archived,
                subject: subject,
                text: text
            };
        });
        c.model.total = result.total;
        c.model.max = result.max;
        res.send(c.model);
    }).catch(function(err) {
        next(err);
    });
});

router.post("/action/superuserAddFile", function(req, res, next) {
    if (!req.isSuperuser())
        return next(Tools.translate("Not enough rights"));
    Tools.parseForm(req).then(function(result) {
        var dir = result.fields.dir;
        if (dir.slice(-1)[0] != "/")
            dir += "/";
        var path = __dirname + "/../" + dir + result.fields.fileName;
        var files = Tools.toArray(result.files);
        if ("true" == result.fields.isDir)
            return FS.makeDirectory(path);
        else if (files.length < 1)
            return Tools.writeFile(path, "");
        else
            return FS.move(files[0].path, path);
    }).then(function() {
        res.json({});
    }).catch(function(err) {
        if ("ENOENT" == err.code)
            err.status = 404;
        else if ("ENOTDIR" == err.code)
            err = Tools.translate("Not a directory");
        next(err);
    });
});

router.post("/action/superuserEditFile", function(req, res, next) {
    if (!req.isSuperuser())
        return next(Tools.translate("Not enough rights"));
    Tools.parseForm(req).then(function(result) {
        var path = __dirname + "/../" + result.fields.fileName;
        return Tools.writeFile(path, result.fields.content);
    }).then(function() {
        res.json({});
    }).catch(function(err) {
        if ("ENOENT" == err.code)
            err.status = 404;
        else if ("EISDIR" == err.code)
            err = Tools.translate("Not a file");
        next(err);
    });
});

router.post("/action/superuserRenameFile", function(req, res, next) {
    if (!req.isSuperuser())
        return next(Tools.translate("Not enough rights"));
    Tools.parseForm(req).then(function(result) {
        var oldPath = __dirname + "/../" + result.fields.oldFileName;
        var newPath = oldPath.split("/").slice(0, -1).join("/") + "/" + result.fields.fileName;
        return FS.rename(oldPath, newPath);
    }).then(function() {
        res.json({});
    }).catch(function(err) {
        if ("ENOENT" == err.code)
            err.status = 404;
        next(err);
    });
});

router.post("/action/superuserDeleteFile", function(req, res, next) {
    if (!req.isSuperuser())
        return next(Tools.translate("Not enough rights"));
    Tools.parseForm(req).then(function(result) {
        var path = __dirname + "/../" + result.fields.fileName;
        return FS.removeTree(path);
    }).then(function() {
        res.json({});
    }).catch(function(err) {
        if ("ENOENT" == err.code)
            err.status = 404;
        next(err);
    });
});

router.post("/action/superuserRegenerateCache", function(req, res, next) {
    if (!req.isSuperuser())
        return next(Tools.translate("Not enough rights"));
    var c = {};
    Tools.parseForm(req).then(function(result) {
        c.regenerateArchive = ("true" == result.fields.regenerateArchive);
        return Global.IPC.send("stop");
    }).then(function() {
        return Global.IPC.send("regenerateCache", c.regenerateArchive);
    }).then(function() {
        return Global.IPC.send("start");
    }).then(function() {
        res.json({});
    }).catch(function(err) {
        next(err);
    });;
});

router.post("/action/superuserRerenderPosts", function(req, res, next) {
    if (!req.isSuperuser())
        return next(Tools.translate("Not enough rights"));
    var c = { boardNames: [] };
    Tools.parseForm(req).then(function(result) {
        Tools.forIn(result.fields, function(value, name) {
            if (!/^board_\S+$/.test(name))
                return;
            c.boardNames.push(value);
        });
        if (c.boardNames.length < 1)
            c.boardNames = Board.boardNames();
        return Global.IPC.send("stop");
    }).then(function() {
        return Database.rerenderPosts(c.boardNames);
    }).then(function() {
        return Global.IPC.send("start");
    }).then(function() {
        res.json({});
    }).catch(function(err) {
        next(err);
    });
});

router.post("/action/superuserRebuildSearchIndex", function(req, res, next) {
    if (!req.isSuperuser())
        return next(Tools.translate("Not enough rights"));
    Global.IPC.send("stop").then(function() {
        return Database.rebuildSearchIndex();
    }).then(function() {
        return Global.IPC.send("start");
    }).then(function() {
        res.json({});
    }).catch(function(err) {
        next(err);
    });
});

router.post("/action/superuserReload", function(req, res, next) {
    if (!req.isSuperuser())
        return next(Tools.translate("Not enough rights"));
    var c = { list: [] };
    Tools.parseForm(req).then(function(result) {
        if ("true" == result.fields.boards)
            c.list.push("boards");
        if ("true" == result.fields.config)
            c.list.push("config");
        if ("true" == result.fields.templates)
            c.list.push("templates");
        if (c.list.length < 1)
            return Promise.resolve();
        return Global.IPC.send("stop");
    }).then(function() {
        return Tools.series(c.list, function(action) {
            switch (action) {
            case "boards":
                return Global.IPC.send("reloadBoards");
            case "config":
                return Global.IPC.send("reloadConfig");
            case "templates":
                return controller.initialize();
            default:
                return Promise.resolve();
            }
        });
    }).then(function() {
        if (c.list.length < 1)
            return Promise.resolve();
        return Global.IPC.send("start");
    }).then(function() {
        res.json({});
    }).catch(function(err) {
        next(err);
    });
});

Captcha.captchaIds().forEach(function(id) {
    Captcha.captcha(id).actionRoutes().forEach(function(route) {
        router[route.method]("/action" + route.path, route.handler);
    });
});

Board.boardNames().forEach(function(name) {
    Board.board(name).actionRoutes().forEach(function(route) {
        router[route.method]("/action" + route.path, route.handler);
    });
});

module.exports = router;


text:
Human rights of people on the move must be protected, says UN nuncio
People on the move – refugees, asylum-seekers, migrants and victims of human smuggling – are "some of the world's most vulnerable people," said Archbishop Gabriele Caccia, who heads the Permanent Observer Mission of the Holy See to the United Nations. They have "no fewer human rights than lawful residents," he added. "We must avoid, as... Read More
Archbishop Gabriele Caccia, asylum-seekers, human rights, International Law Commission, migrants, nationality, political opinion, race, refugees, religion, United Nations General Assembly


Aaron Rodgers #12 Green Bay Packers NFL Woven Tapestry Throw Blanket (48x60")"
This loom woven triple layer tapestry throw blanket is fringed on all 4 sides. This blanket can be used at the game, on a picnic, in the bedroom, or cuddle under it in the den while watching the game. Use it as a room accent, bed covering, throw blanket or wall hanging. They are easy to care for, and are machine washable and dryable. This blanket is made of 100% acrylic. Actual item will vary from image.


Khumba in streaming. A half-striped zebra named Khumba (Jake T. Austin) is born into an insular, isolated herd obsessed with stripes. Rumors that the strange foal is cursed spread and, before long, he is blamed for the drought that sets into the Great Karoo, except for Tombi (AnnaSophia Robb) his female zebra friend who has a huge crush on him. When a mystical mantis (Adrian Rhodes) appears to the foal, He draws a map to what could be interpreted as either water or stripes. When even his father (Laurence Fishburne), the leader of the herd, blames him for the lack of rain and the subsequent death of his mother (Anika Noni Rose), the outcast zebra leaves the confines of his home knowing that he cannot survive in the herd without all his stripes. Khumba ventures beyond the fence - vulnerable to the ferocious Leopard Phango (Liam Neeson), who terrorizes all the animals in the Great Karoo. Born blind in one eye and rejected by his family when he was just a cub has made Phango obsessed with being whole. Phango is highly superstitious and, unbeknown to Khumba, has been waiting for the half-striped zebra, which, according to an ancient myth will make him the most powerful hunter that ever lived.
Khumba – Internet Movie Database.


Does the hypnotherapist control your mind during trance?
No. A common myth about hypnosis is that is mind control and is used to make one behave foolishly. This myth is inaccurate. Firstly, you have awareness throughout the trance, you will not lose control of your mind and you cannot be controlled anyway. As far as you acting embarrassingly, this myth comes from stage hypnosis and fiction, where participants allow themselves to participate in frivolous suggestions. Hypnotherapy is clinical and based on many decades of research from famous psychologists. Clinical hypnotherapy not entertainment.
Hypnosis is a state of focused attention, a deeper level of consciousness, when your conscious and unconscious mind are both focusing on the same thing. When you are in this state you still have awareness, it's like daydreaming. You will be more receptive to the positive suggestions via imagery language patterns and guided mediation, when in this state, and this can help with changing negative patterns of thinking. In fact, we go into a light trance/hypnosis many times a day, when we are absorbed in the moment, blissed out, and in a relaxed focused state, whether this is when we are walking, exercising, cooking, meditating, dancing. I'm sure you're familiar with doing things on auto pilot; driving somewhere that you've driven so many times, that you are driving without thinking. This is trance, it is a natural every day state of consciousness. In fact, trance is our default mode; when we are daydreaming, we are coming up with solutions and creative ideas.
Will it be ok to drive afterwards?
Yes, you will be fine to drive afterwards. That chilled out yet focused feeling that you feel after yoga or a massage is very similar to how you feel after hypnotherapy. Post hypnotherapy, you will be relaxed yet energised and focused.
You will have no problem waking up; when you are in a trance state, you still have awareness and control and will hear everything I say.
When treating phobias, you will need 4 sessions, with other conditions it varies from person to person. Treatment of depression or anxiety may require approximately 8-12, though could be less or more.
All data collected from clients is dealt with in accordance with the General Data Protection Regulations and the Data Protection Act.


Yes again, we have another fantastic issue for everyone. We have a couple of really interesting opinion pieces looking at shopping on the internet vs. the highstreet and at the online phenomenon that has really exploded this year: Kickstarter. We also have a great short story for your entertainment from the talented pen of Dave Jackson.
Time to get reading – go on, download your copy now.


text:
https://bullswire.usatoday.com/2021/01/26/lonzo-ball-rumors-trade-pelicans-report/
Report: New Orleans Pelicans receiving calls on Lonzo Ball, open to trade
[jwplayer rh1NU8nj-z6KDnl0B]
January 26, 2021 3:20 pm CT
After a slow start to the season, the New Orleans Pelicans have been receiving trade calls on Lonzo Ball and appear open to a trade, The Athletic's Shams Charania reports. Along with Ball, JJ Redick appears to also be a possible trade candidate.
A team that is expected to be prominent in the trade market picture, rival teams expect: The New Orleans Pelicans. The franchise is off to an uneven 5-10 start to the season. New Orleans has been receiving calls about the availability of Lonzo Ball and JJ Redick and has shown an openness to discussing trades around both with interested teams, sources tell The Athletic. A move would create a clearer pathway for young guards Nickeil Alexander-Walker and Kira Lewis in the Pelicans' rotation.
Ball has struggled when healthy this season, averaging 12.0 points, 4.7 assists and 3.8 rebounds in 31.8 minutes per game. Always an area of focus, Ball is shooting just 29.1% from 3-point range this season through 12 games.
A knee injury sidelined Ball for about 10 days, resulting in him missing three games. In his absence, Nickeil Alexander-Walker shined with a 37-point performance vs. the Clippers.
Prior to the season, the Pelicans and Ball did not come to an agreement on an extension, leaving Ball set for restricted free agency in the offseason. Any team trading for Ball would be set to offer Ball a likely pay raise in the coming months.
Lonzo Ball says Pelicans have to get much better on defensive side of the ball
Offensive struggles, Lonzo Ball and how the Pelicans improve moving forward
WATCH: Lonzo Ball discusses Martin Luther King Jr.'s impact on his life


text:
Metabolic and structural skeletal muscle health in systemic lupus erythematosus related fatigue: a multi-modal magnetic resonance imaging study
Cheung, S. M. et al. (2019) Metabolic and structural skeletal muscle health in systemic lupus erythematosus related fatigue: a multi-modal magnetic resonance imaging study. Arthritis Care and Research, 71(12), pp. 1640-1646. (doi: 10.1002/acr.23833) (PMID:30629805)
177650.pdf - Accepted Version
Objective: This study aimed to investigate the potential structural and metabolic role of skeletal muscle in SLE related fatigue. Methods: A case control, multi-modal MRI study was conducted. Cases were inactive SLE patients who reported chronic fatigue. Controls were age/sex matched healthy members of the general population. Participants were clinically characterised and then underwent a 3T whole body MRI scan. Resting and dynamic 31 Phosphorous Magnetic Resonance Spectroscopy (MRS) of the calf muscles was applied from which phosphocreatine recovery half time (PCr), a marker of mitochondrial dysfunction, was computed. In addition, microstructural sequences (T1-weighted anatomical images, T2 mapping and diffusion tensor imaging) were acquired. Descriptive statistics evaluated group differences and within case physical fatigue correlations were explored. Results: Of the 37 recruits (mean age= 43.8 years, 89.2% female), cases (n=19) reported higher levels of physical fatigue, pain, depression and sleep disturbance compared to the control group (p<0.0001). PCr was greater (p=0.045) among cases (33.0+/-9.0s) compared to controls (27.1+/-6.6s). No micro-structural group differences were observed. Within cases, physical fatigue did not correlate with PCr (r=-0.28, p=0.25). Conclusion: We report preliminary data evidencing greater skeletal muscle mitochondrial dysfunction among fatigued SLE patients compared to healthy controls.
This work was supported by Lupus UK
Basu, Professor Neil and Gray, Dr Stuart
Cheung, S. M., Keenan, K., Senn, N., Hutcheon, G., Chan, K., Erwig, L., Schrepf, A., Dospinescu, P., Gray, S., Waiter, G., He, J., and Basu, N.
College of Medical Veterinary and Life Sciences > Institute of Infection Immunity and Inflammation
Arthritis Care and Research
Copyright © 2019 John Wiley and Sons Ltd
First published in Arthritis Care and Research 71(12):1640-=1646
Reproduced in accordance with the copyright policy of the publisher
Mr Matt Mahon


text:
Home Medtech News + Manufacturing firm to launch new prosthetic leg cover designs
Manufacturing firm to launch new prosthetic leg cover designs
LIMB-art, a British design and manufacturing company announces plans to present new prosthetic leg cover designs at Naidex.
A paralympian businessman who lost his leg in a cycling accident as a child is on a mission to produce the world's coolest prosthetic leg covers.
Mark Williams from Denbighshire will launch his latest designer prosthetic leg covers at Naidex in the NEC in Birmingham this week. LIMB-art will be on stand N7144 on March 26th and 27th.
As well as new prosthetic leg covers lit with flashing LED lights, there will be carbon fibre finishes available to buy and samples of bespoke designs featuring everything from the Welsh flag to Remembrance Day covers.
Mark runs LIMB-art, a British design and manufacturing company based in Conwy and dedicated to improving on the stem legs traditionally offered on the NHS.
LIMB-art covers, which come in all sorts of colours, designs and patterns, aim to give prosthetic legs a better shape as well as allowing the wearer to express their personality.
The company was one of five finalists of the Stelios Awards for Disabled Entrepreneurs, hosted by EasyJet founder Stelios Haji-Ioannou. The award rewards those with disabilities who have demonstrated exceptional entrepreneurial spirit and business ability in the face of significant barriers.
Williams who was a medallist at the Seoul Paralympics in 1988 said, "Although prostheses have come on in leaps and bounds functionally, how they look has generally been overlooked.
"LIMB-art aims to change this. Our covers are a completely customisable accessory, lightweight and easy to fit and they are suitable for all users of above and below knee prostheses.
"Our covers not only give the wearer a full leg shape and restore balance to their silhouette, they also boost their confidence and allow them to show their personality because we offer a whole range of colours and designs.
"When you wear a cool looking cover, it breaks down barriers and cuts out awkward stares. I've lost count of the number of times I've been stopped in the street and been told my leg looks amazing.
"We don't want prosthetic wearers to hide away or be self-conscious. We want to be known worldwide for making the coolest prosthetic leg covers so people who wear them feel they can stand out and stand proud."
Limb-Art prosthetics Naidex Naidex