text:
Search YouTube Mobile Retail
Research & Data Success Stories Industry Perspectives Digital Transformation Newsletters
Tools & Products
Programmatic direct: A deep-dive into EMEA trends and insights
/ August 2016 / Mobile, Search, Video, Consumer Insights, Content Marketing, Data & Measurement, Programmatic
Out of all the Programmatic Direct impressions bought and sold globally on DoubleClick Ad Exchange from October 2014 to December 2015, more than a quarter occurred in EMEA. Here, we introduce some of the most exciting data collected by DoubleClick over that 15-month period, and we'll analyse key trends in Programmatic Direct and their implications for publishers, advertisers and users in the region.
This post is part of a series exploring trends in Programmatic Direct. You can learn more about these trends and create your own charts by vertical and industry in our interactive spotlight, The State of Programmatic Direct.
Out of all the Programmatic Direct impressions that were bought and sold globally on DoubleClick Ad Exchange over a 15-month period (up until December 2015), more than a quarter occurred in EMEA. Within that slice of the global pie, we saw incredible diversity in how programmatic advertising was bought, sold and consumed — a diversity that mirrored the cultural and technological landscape of EMEA itself. Here, we'll introduce some of the most exciting DoubleClick data and analyse what it may mean for publishers, advertisers and users.
Impressions: in step with global growth
In the 15-month timeframe, Programmatic Direct impressions across EMEA more than doubled. Germany, Italy, and the UK produced the highest amount of total impressions, contributing to roughly half of all impressions in EMEA. Ukraine, Turkey and Spain drove tremendous growth, with their Programmatic Direct impressions more than doubling in just 12 months.
The adoption of Programmatic Direct reflects the overall tech profiles of EMEA countries: while Germany, Italy and the UK are already well established in the ad tech landscape, parts of Southern and Eastern Europe are just now getting on board and may have significant potential for rapid growth.
Platforms: you can take it with you
Desktop may have been a popular platform on which to buy, but its share of the programmatic pie decreased by more than 15% from December 2014 to December 2015 as advertisers and publishers followed the consumer trend to mobile.
In the 15-month period we analysed, mobile web's share of impressions in EMEA more than doubled. When we looked at the data for impressions on tablet web, what was fascinating wasn't how fast they grew, but how they compared to the rest of the world. Tablet web accounted for more than 10% of all EMEA impressions – about 45% higher than the global average.
The buyer's guide to Programmatic Direct
Categories: the key content to monetise
What are all these users doing on their smartphones and tablets? The most rapidly growing publisher verticals are Books & Literature, Beauty & Fitness and Hobbies & Leisure. Perhaps this growth is related to the trend in these industries for consumers to look for immediate advice and tips online; for example, the use of online reviews and video tutorials about beauty products, the popularity of wearable devices in the fitness industry, and the success of eSports and game streaming sites in the computers and electronics industry.
News and Arts & Entertainment publishers connected with buyers in strong numbers, accounting for 30% of Programmatic Direct impressions on DoubleClick Ad Exchange (on par with global trends). This is quite possibly a case of advertisers seeking out the premium content that News and Arts & Entertainment publishers often have to offer.
Of particular interest in EMEA, the Computers & Electronics vertical grew more than 35% faster than the rest of the world. As with the percentages for tablet web, this could indicate a greater willingness for EMEA consumers to spend on consumer electronics in comparison to the rest of the world — and advertisers' eagerness to use Programmatic Direct to reach those consumers.
A rapidly changing tech-scape
When analysing the Programmatic Direct data coming out of EMEA, it's fascinating to see just how much has changed in the past two years. The growth in some countries has been dramatic, while other countries are yet to reach programmatic maturity. Mobile is showing remarkable growth as more users turn to their smartphones and tablets to get everyday information and make on-the-go decisions. The programmatic space has become a lot more advanced with new deal types and a growing breadth of functionalities. We're seeing more and more brand advertisers and agencies making Programmatic Direct a key part of their strategies.
We'll continue to keep an eye on the data and give you the most important facts and figures in this space. You can also visit our new interactive report, The State of Programmatic Direct, to gain a comprehensive global overview and create customised charts based on the regions, platforms and verticals most relevant to you. For more information on how Programmatic Direct helps connect buyers and sellers of digital advertising, check out The buyer's guide to Programmatic Direct.
* All data cited in this article is taken from internal DoubleClick Ad Exchange data from October 2014 to December 2015
The best tools for consumer insights: Lessons from Google BrandLab
Get the latest data, insights and inspiration from Google.
Follow us on LinkedIn Follow us on Twitter Follow us on Facebook Subscribe to our RSS feed
Google About Google Products Advertising Business Privacy & Terms About Think with Google
Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn More From Google, directly in your inbox An invitation to Think with Google Subscribe


The newest hit from B.o.B is "Airplanes" featuring Hayley Williams. If you are a fan, check out this video. This song is way easier to play than you would think and actually only requires a few chords. So, check out this tutorial and learn exactly how to play this huge pop/hip hop hit on your guitar today.


The Palestine Children's Relief Fund (PCRF), the world's largest charity devoted to the medical needs of children in the Middle East, will hold its annual banquet/fundraiser on October 15th at theWyndham Hotel, 12021 Harbor Boulevard in Anaheim, California. The event will be titled: Light of Hope: A Children's Cancer Center in Gaza. Doors will open at 6:00pm.
Monies raised during this event will be used to construct a pediatric oncology/hematology center in the Gaza Strip. The building will be named the Dr. Musa and Suhaila Nasir Gaza Cancer Department after the husband and wife founders of the PCRF. When completed it will be the first and only children's public oncology/hematology facility in Gaza. The PCRF has also been responsible for a similar facility in the West Bank.
Speakers will include the Chief Executive Officer of the PCRF, Steve Sosebee, and Dr. Khaled Abughazaleh, the new chair of the National Board of the PCRF who has replaced Dr. Nasir in that position. Entertainment will be provided. Guests will have the opportunity to meet with children from the Middle East who have been brought to this country, at no charge to their families, for medical treatment by the PCRF.
In the past the event has been sold out prior to the event date. It is suggested that tickets be purchased well in advance.
The Palestine Children's Relief Fund sends medical teams to treat children in the Middle East on site. These teams also serve to train local medical personnel. If on site treatment is not optimum, children, and if necessary an accompanying adult, are flown to a more suitable treatment site. The PCRF provides mechanized fitted wheel chairs and fitted eyeglasses. The PCRF also provides summer camps for disabled children. Orphan sponsorship is one more PCRF program as is a Gaza mental health project.
The above PCRF services are but a few of the total. Please access the organizations national web site at www.pcrf.net for a more complete picture.


A young Dark Faerie sat in the Faerie Castle early in the morning, awaiting her audience with Queen Fyora. The Faerie Queen had requested her appearance, and a curiosity for the unknown made her speed to the Castle to learn why her services were required. She shifted impatiently in her chair, waiting for the doors to the Queen's chamber to open.
Minutes turned into hours, and the young Neopian's eyes fell to the ground. She examined them in detail, searching for cracks or breaks in the pristine floor. It only took her a few minutes to find a fault, honing in on it like an Eyrie searching for food. She looked for ways it might cause injury, trying to find out if it needed to be fixed. The faerie had a talent for such things, finding the mistakes that needed to be fixed. It came in handy when she was making potions, because even the slightest mistake could turn a good potion into a bad one. She imagined herself standing at her cauldron, stirring normal contents into a magical spell. Her body relaxed, and she passed the rest of the time thinking of potions and magic.
The Faerie Queen appeared in front of her almost immediately after she relaxed, as if that was her cue. "Welcome dear child," the magnificent figure said, and the guest gazed at her in amazement. A wonderful glow surrounded her powerful looks, and pale wings spread out behind the Queen. The Dark Faerie got to her feet, not sure whether to bow or curtsey. She tried to do both, and fell over onto the floor. The Faerie Queen laughed.
The Queen laughed again, and the visiting faerie noticed how its echo rang throughout the castle. She admired that laugh, and even wished she were the Queen of Faeries for a moment. Then she remembered how much work that must be, and discarded the thought entirely.
Jhudora nodded, excited that she merited the attention of the greatest faerie in the world. She was almost as excited as when she made her first spell, and that was the greatest day of her life!
"Anything, Queen Fyora," Jhudora said, trying to make respect cover up the excitement in her voice.
Jhudora gazed back at the faerie, imagining their places being switched. She wouldn't trust anyone with this kind of potion, that's for sure. But who was she to pass up a quest from the Faerie Queen?
Thirty minutes later, the Dark Faerie was in Neopia Central, having been transported there by Queen Fyora's magic. She rushed about town, gathering all of the ingredients the Queen had asked for. It was strange, because the spell actually required the basic ingredients for the items themselves. Jhudora had to go to the Pharmacy and retrieve the herbs used in Herbal Scrambled Eggs, the Chocolate Factory for a jar of melted chocolate, the Post Office for the ingredients used in glue, and so many other places she began to lose track of time. Before she knew it, the sun was setting.
"Finally," she said, exiting the Coffee Shop in the Art Catacombs. She made her way to the Soup Kitchen, where Fyora said the Soup Faerie would let her use a cauldron and an empty workspace. Exactly as the Great Faerie had said, Jhudora was let into an average-sized room with spoons, ladles, and cutting boards for any ingredients that needed to be sized. Jhudora set out the ingredients and immediately set to work.
Heating a pot of water was the first step. Next, Jhudora had to stir in sourdough from the bakery with mud from the Pizzaroo, which disgusted her. Why they had mud specially made for pizzas was beyond her understanding.
"This is definitely a drinking potion," she said to herself, watching the contents bubble.
The potion maker stirred it perfectly, exactly four times every ten seconds. She had learned potion-making from every master in Faerieland, and considered herself an expert in the formation of them, although not in the inventing part. With her skillful hands, she quickly had the potion on the last step before it was complete.
"And one handful of crushed Splime from the Smoothie Shop," she murmured to herself. The green dust fell into the mixture, which had turned purple throughout the entire process. Jhudora admired the mixture of colours, the dark and the light blending in swirls as she stirred. After three minutes, she extinguished the fire, as instructed, and took her spoon out of the cauldron.
The potion needed to sit for thirty minutes, so Jhudora let herself out of the room, locking up behind her. She waved to the Soup Faerie as she passed, who was busy ladling Golden Juppie soup into the bowl of a yellow Skeith who looked as if he had gone to the Battledome a few too many times. Making her way to the center of the town, she stopped to breathe in the fresh air.
"Queen Fyora is using you," said a mysterious voice, and Jhudora coughed mid-breath in surprise. She looked around for a source, but it didn't make itself heard again. The young faerie relaxed, and turned to make her way back to the Soup Kitchen.
"She doesn't need this strength potion, does she?" the voice questioned, causing Jhudora to whirl around. But the voice fell quiet again.
"Is this the Darkness inside of me?" she wondered, then continued on her way back.
"Be quiet," Jhudora said aloud, but the voice could not be stopped.
"No, I don't. I'm just contemplating what you've said," she retorted.
Jhudora waited for the Darkness inside of her to continue.
"Why one of its branches?" she asked, but she had already started moving towards the designation.
Jhudora jumped in excitement. "You know how to make a wand?" she asked, having wanted one all of her life.
Jhudora was so overjoyed that she didn't listen to what the Darkness had said. She rushed to the Money Tree, waking it from its slumber.
"I don't have any donations right now," the Tree groaned.
"It's because of Fyora," she said, and the Money Tree looked amazed.
"Trying to take over Faerieland," Jhudora replied, then ran off towards the Soup Kitchen. "Thanks for the branch!" she called back.
Jhudora heard the Money Tree call out for someone other than her as she went, but she ignored it. She burst through the Soup Kitchen door, fumbling with the keys to get the door open. As soon as she did, she shut it closed behind her for privacy.
"What now?" she whispered to the Darkness, and it filled her head.
"Carve it," it answered, and Jhudora set to work.
"Hurry," it urged, and she glanced at the potion. By her count, she had ten minutes before it set, but carving her wand wouldn't take too long. She had already thought about this day for so long, she knew exactly what she wanted it to look like.
She carved the handle, leaving a small pommel at the end. Next, she carved a spiral into the handle, reminded of the swirling colours of the potion. Finally, she curved the end of the branch into a sphere, being careful not to notch it accidentally. "Finished," she announced.
"Not quite," the Darkness said, and put an image in her head of the improvised wand.
"Are you sure?" Jhudora said, but the Darkness stayed silent in response.
"Fine," the Dark Faerie said, hollowing out the sphere and cutting it into three prongs that resembled a Kougra's claw.
"Now, drop it into the potion," it ordered. Jhudora felt it was almost as excited as her. Sensing her question, he decided to reply.
"Then I can protect Faerieland from her with it?" Jhudora said questioningly, and the Darkness grunted in her head.
Exactly as the Darkness said that, the thirty minutes was up. Jhudora watched in awe as the green and purple swirls of the potion settled into position and any bubbling still happening stopped. The potion shifted, as it forcing something up from the depths of the cauldron. That was the first time Jhudora saw her wand.
The colours of the potion had inhabited the wand, making the bright green swirl around the dark purple in the same way. A glow emitted from it, granting Jhudora a warm sensation in her arm. Her magic seemed to flow into it, then magnify and return to her.
"Perfect!" she exclaimed, and picked up the well-crafted device. The Darkness agreed.
"I guess not," Jhudora replied, and poured the potion into a cup. As she did, it seemed to condense magically so that the entire cauldron fit into a single cup.
"Whoa," the faerie murmured in surprise. She brought the cup to her lips, letting the drink pour into her mouth and down her throat. It seemed the moment she started drinking, it was finished.
Only seconds later, Jhudora felt the power flooding through her. Her magic was increased tenfold, and she seemed to know ways to use it that she had never thought of before. She gazed at the wand in her hand, which increased her already increasing power, and thought of the strength she had.
Suddenly, the door burst open. Fyora stood in front of Jhudora in all her glory, her own power seeming to burst forth and attack Jhudora's newfound ones.
"You were going to use this potion to take over Faerieland, weren't you?" Jhudora screamed at her in anger. It seemed any rage she had kept inside now lashed out at Fyora.
Jhudora was shocked for a moment, recoiling at Fyora's words, and the Faerie Queen used this. She teleported them both back to the Castle in Faerieland, and waited for Jhudora to recover her wits.
"What are you saying?" questioned Jhudora angrily, her rage returning slowly.
"No!" shouted Jhudora. "Impossible!" She ran out of Faerie Castle and rushed to the edge of the cloud. Weaving her way in between the crowd of Neopets, she cursed them all for every good deed they'd done. When she reached the edge of Faerieland, however, she couldn't fly off of it. "It can't be!" she raged again, then turned to the castle.
Turning away from the house of her enemy, Jhudora raised her wand. The Dark Faerie forged a cloud from the air and pieces of the already-made Faerieland. Stronger and stronger, she wove her magic into the wisps of white. Finally, she was left with a purple cloud of he own making, and she stepped onto it.
"This will be my home, and if you ever come here I will destroy every house from here to your horrid castle!" The cloud moved as far away from Faerieland's main cloud as Jhudora could go, then stopped abruptly. Even her magic couldn't pass the boundaries Fyora had set. Jhudora settled down, letting her rage fester and planning for the day she could have her revenge.
Back in the castle, in her private chambers, Fyora looked at her two friends. The Fountain Faerie had come after hearing the news from a messenger that Jhudora thought Fyora was taking over Faerieland, and the Space Faerie had arrived shortly after. They all knew that the Darkness had consumed Jhudora.
"What are we going to do?" asked the Fountain Faerie.
"Once I leave Faerieland, the barrier will weaken," the Space Faerie mentioned.
"Fine," the Space Faerie said. "I trust your wisdom, Fyora." With a flash, the Space Faerie disappeared.
"I know," the Fountain Faerie answered, then returned to care for the fountain.
Fyora walked to the window and stared at the purple cloud. Jhudora had already constructed a house with her powers, and Fyora could sense spells being made to protect the cloud from the Faerie Queen. Maybe she shouldn't have given Jhudora a quest, but Jhudora had deserved her own quest, no matter how it had turned out.


Durban Friday Fan Day Photo Galleries!
5 Star Durban is a glossy print tourism magazine and online community promoting the beautiful city of Durban and surrounding KwaZulu-Natal, highlighting the best that "South Africa's Playground" has to offer.
From accommodation and hotels, restaurants and bars, markets, shopping and entertainment to activities and things to do in Durban and surrounding KwaZulu-Natal - we cover it all!
Durban or eThekwini in Zulu (from itheku meaning "bay/lagoon"), is the largest city in the South African province of KwaZulu-Natal. The Durban Metropolitan Area is the second most important manufacturing hub in South Africa after Johannesburg. Durban is famous for being one of the busiest ports in Africa and the city is the main economic driver in KwaZulu-Natal, contributing over half of the province's output and 15% of the national output of South Africa.
By 2030, Durban will be Africa's most caring and liveable city.


An inner-city eatery in Brisbane and its manager are being taken to court by the Fair Work ombudsman after it was found that the business had been allegedly underpaying one of its foreign employees by "a significant amount".
The restaurant and one of its owners had charges brought against them after investigations found that one of the casual cooks was receiving as little as 50 per cent of their standard hourly wage.
According to official reports, the ombudsman's office began looking into the allegations after the employee in question - a Japanese national in possession of a bridging visa that allowed her to work in Australia - lodged a formal complaint with the government body.
It alleged that the worker was receiving anything between $9.25 and $11.70 per hour for shift work when the industry standard for hospitality employees of their level required a minimum rate of $18.43 an hour.


"Could my past success be topped? It never occurred to me, but the answer is YES! I now have TWO women who want to VOLUNTEER to work with me because my sales team has FUN and they're EFFECTIVE. I've also had six estate sales in the last four months. That's more than I did all of last year. Thank you! I'm so happy that I took the Soul of Entrepreneurship and Dana's My Coach!" Deborah Larsen, Amber Ostrich Estate Sales.


Leukemia is a type of cancer that affects the bloodstream of the dog, mainly related to the number of white blood cells.
It is a serious disease, which if not diagnosed in time can be deadly for the dog.
In this article by YourCatCareguide we detail everything about leukemia in dogs , explaining the possible causes of leukemia , the most frequent symptoms and the treatment to be applied.
Leukemia is a type of cancer that affects leukocytes (white blood cells). The bone marrow of dogs suffering from leukemia produces a large amount of defective leucocytes. These defective white blood cells flood the bloodstream and bone marrow, but because of their defects they are unable to protect the body.
Consequently, the immune system is adversely affected and dogs are susceptible to contracting various diseases. As leukemia progresses, it also affects the production of other blood cells such as red blood cells and platelets, thus causing additional problems of great magnitude. Canine leukemia can be acute when it occurs rapidly and abruptly, or chronic when it occurs slowly and gradually.
Different possible causes for leukemia have been proposed, among them are genetic factors, exposure to radiation, exposure to chemical substances and virus infection. However, the real causes of this disease are not yet known and it remains to be seen if any of the causes proposed is correct.
The diagnosis is made based on a physical examination, on the symptoms, on a bone marrow biopsy and should always be done by a veterinarian .
To carry out the biopsy it is necessary to anesthetize the dog, since it is a complicated and painful procedure. The bone marrow sample is usually taken from the hip region. The sample is then sent to the laboratory, where a cytological study is performed to determine if there is leukemia.
Unfortunately there is no cure for this disease. However, there are treatments that can help dogs in some cases.
Treatments are usually based on chemotherapy, giving the dog anticancer drugs . As a rule, these treatments have to be repeated from time to time. In addition, it is often necessary to administer antibiotics or other drugs to combat opportunistic infections, and analgesics may be necessary to reduce pain and discomfort.
The prognosis of dogs with chronic leukemia may be favorable if the disease is detected and treated in the early stages. In these cases, dogs can gain a few years of life thanks to timely treatment, but the disease is still lethal.
Dogs with acute leukemia usually have a very reserved prognosis , since in these cases the disease is very aggressive and progresses very quickly.
In any case, sick dogs are very unlikely to survive for long, so their owners often opt for euthanasia instead of expensive treatment that can be difficult for both humans and their dogs.
If you want to read more articles matching Leukemia in dogs , we recommend that you enter our section on Other health problems .


The Brisbane design studio tasked with rebuilding Myspace talks to CNET ... Josephmark: the Australian architects of the ... through sheer weight of music catalogue.
Welcome to Tribù outdoor furniture | exclusive, high-end furniture. Catalogue with modern luxury outdoor furniture from design company Tribù ... your love for a warm and personal interior outside to your terrace and garden.
catalogue design for terrace . To view the rest of the catalogue, select a category below and press Search . Traditional design for terrace railings, with an added twist.
To view the rest of the catalogue, select a category below and press Search ... Traditional design for terrace railings, with an added twist. Product Page: Outdoors.
Find and compare all the manufacturers in the Garden and terrace fittings category and contact them directly.
Our large range of terrace furniture and accessory pieces, including signature OKA rattan products, can be used together to create a comfortable and accessible conservatory area.


Elizabeth Koval's bright and energetic art will likely redefine the standards that new artists are judged by. Her vibrant colors, unmatched attention to detail, and enormous range of styles unashamedly contrast much of today's lukewarm "Commercialism". This immensely talented young artist can capture a dream or explore the tranquil spirituality of nature in one piece, yet flush out our most powerful emotions in another with mystic symbolism and the sheer force of color. With little or no formal training, her work leaps nevertheless into our mind's eye and defies us to forget the power and emotions of her images. Koval's work often brings together realism and ancient mythology, as in "Kibo". This beautiful piece depicts the centuries old Japanese superstition of a thousand paper cranes bringing good luck. "Kibo" pays homage to this cultural symbol, then brings the paper birds to life and lets them soar into reality.
The artist's work ventures into the real and then a bit further, without sacrificing the natural beauty or texture to extremes. "Mythical Stone Gardens" is a series of four mythological creatures, each in the color of one distinct stone. Koval's Phoenix, Griffin, Pegasus, and Unicorn take to life as amethyst, thulite, malichite, and tourmaline. It is here that the power and emotion of color is used to illuminate the strengths and personalities of these mythical animals. She leaps from the vivid fantasy of this series to the peace and serenity of "Beauty Of The Bonsai", another series of four pieces where we enter a plesant trance, both respectful of the Bonsai's solemn dignity and in tune with the ancient living spirit within. The passing of the torch across generations is theme to "Tangu No Sekku", a traditional oriental piece that makes audible the unspoken words on a holiday outing. Here, we see the ancient Japanese fascination with the kite, but even more importantly the bringing of a father and son together in a special moment of kinship.
Her different works have been described as Organic, Naturalistic, and Super Realistic, but to cast Elizabeth Koval's art into any one category is impossible because of the delicious variations in style and substance. Koval is equally talented working with brush, the airbrush, and in gouache, watercolor, acrylic, and ink. More than one of these methods and /or media are usually brought together in each piece. She studied 2 dimentional design and airbrush art in college, earning an Associate of Arts degree from Los Angeles Pierce college. Over fifteen pieces have been commissioned either privately or by corporations, ranging from portraits to fantasy paintings, to business images and wearable art. Her work has won multiple awards at the "Western States Craft and Hobby Association" competition held at the Orange County Fairgrounds. 26 year old Elizabeth Koval lives in Los Angeles with her husband, musical composer Ken Maffeo.


text:
Frank Mitchell	Kate Cebik	2015-06-02T15:57:18-04:00
Photo Credit: Harold Shapiro
Frank Mitchell, Curator-at-Large and Assistant Director of The Amistad Center for Art & Culture, specializes in African-American historical and American contemporary visual culture. Past Amistad Center exhibitions include Emancipation!, War Prizes: The Cultural Legacy of Slavery & the Civil War, Lincoln: Man, Myth and Memory, High Water Marks: Art & ReNEWal after Katrina, Soulfood: African American Cooking and Creativity, Hairitage, and Sankofa. He is curatorial consultant to the Connecticut Audubon Society's Birdcraft Museum renovation and frequently contributes to the Connecticut history magazine Connecticut Explored.
Frank has research and writing credits on the Connecticut Public Television documentaries African Americans in Connecticut parts I, II, Connecticut's Cities, and the independent documentary Unsung Heroes: The Music of Jazz in New Haven. Mitchell is a member of the Connecticut public history collective Stone Soup and author of the 2009 Greenwood Press publication African American Food Culture. He is a co-author and photo editor for the 2013 Wesleyan University Press anthology African American Connecticut Explored. He serves on the boards of Common Ground Charter High School & Environmental Center, the International Festival of Arts & Ideas, the Eli Whitney Museum, and is a member of the New Haven Food Policy Council.

redpajama_set_name: RedPajamaCommonCrawl


text:
retail news in context, analysis with attitude
FastNewsBeat
• EnvironmentalLeader.com reports that the Whole Foods Market in Lincoln Park, Chicago, has earned the took the top prize for Project of the Year at the second annual A.R.E. Sustainability Awards.
According to the story, the Whole Foods Market "won for Project of the Year and a Grand Prize in the category of Sustainability – Standalone for its complete integration of sustainable strategies and green building practices. The store was built to the U.S. Green Building Council's LEED Gold standards and Energy Star standards for buildings. The store is packed with sustainable features including ozone-friendly water-cooled refrigeration system, destratification fans, night curtains on refrigerated cases, LED lighting in exterior signage and freezer cases, motion-activated lighting controls in frozen food cases, and a HVAC system that reduces air flow when the space is unoccupied."
• Nebraska Grocery Industry Association Executive Director Kathy Siefken received the Food Marketing Institute (FMI) Donald H. MacManus Association Executive Award in recognition of what was described as "her professional skills, knowledge and passion for the industry she represents and her tenacity of purpose in the legislative arena."
The award was presented at the industry's Washington Public Policy Conference hosted by FMI, the National Grocers Association and Food Industry Association Executives (FIAE).
• The Wall Street Journal reports that McDonald's is trying to convince its franchisees that they should embrace a soft drink promotion this summer - $1 per drink, no matter what the size. If it can get its franchisees to say yes, the promotion would run for 150 days, starting on Memorial Day weekend ... practically guaranteeing that the campaign will dominate the airwaves for five months.
• Agence France Presse reports that France-based Carrefour "plans to enter India's vast retail market in 2010 following years of delays." The entry is likely to come in the form of a cash-and-carry wholesale outlet opened in partnership with a local company...local laws make it impossible for foreign retailers to operate independently in India.
• Crain's Chicago Business reports that Kraft Foods, best known for Cheez Whiz and Velveeta, has won first place in a global cheese contest, winning in the mozzarella, fresh mozzarella and spreadable cheese categories of the 2010 World Championship Cheese Contest.
KC's View:
Back to Home What's your view?
content guy
Kevin Coupe kc@morningnewsbeat.com www.KevinCoupe.com
For more than 30 years bringing to readers and audiences a wealth of experience, sharp storytelling skills, provocative and contextual insights, unique worldview and serious levity about the world of business and consumers.
advertise with mnb
join the mnb community
Get the MNB in your inbox every morning.
MNB Home
MNB News Archive
Copyright © 2020 Morning News Beat


14 million people lost their lives during the 'The Great War' and a generation of young men had been wiped out. This 'war to end all wars' was so awful; that it was believed it could never again be repeated. Although World War I hasn't had as much attention as other wars, (such as World War II or the Vietnam War), it has still left a profound impact on the lives of Americans to this day.


text:
The company involved in the Mauritius spill claims to have extracted the remaining crude oil from the stranded freighter
Japanese company Nagashiki Shipping, which was involved in the spillage of a cargo ship that ran aground off the island of Mauritius in the Indian Ocean last month, has assured that it has successfully extracted around 3,000 tons of crude oil that remained on the ship.
In a statement, the company confirmed the removal of the remaining oil to minimize the environmental impact of a spill that has already stained 1,000 tons of fuel in the area.
The incident occurred when the cargo ship carrying around 4,000 tons of crude oil ran aground off the island's coast, known for its transparent waters and native flora and fauna.
Since then, several teams have worked against the clock to remove the remaining crude oil on board the ship before the ship was completely cracked and split in two, as warned by authorities.
The EU is sending 17 tons of medical supplies to Lebanon by humanitarian airlift
Díaz-Canel attributes the "undisputed successes" to Fidel Castro in the fight against the pandemic
Jeanine Añez completes her Cabinet and appoints five other ministers
By	 November 15, 2019
Jeanine Añez – REUTERS / HENRY ROMERO MADRID, Nov. 15 (EUROPE PRESS) – The self-proclaimed interim president of Bolivia, Jeanine Añez, appointed five other ministers on Thursday as part of the formation of her Cabinet after assuming the Presidency of the country before the resignation of Evo Morales last Sunday. Jeanine Añez completes her Cabinet…
Binance Reveals Plan for $1 Billion Blockchain Startup Fund
ByEurope World News	 June 1, 2018
Binance, one of the world's largest cryptocurrency exchanges, has announced it is launching a $1 billion "Social Impact Fund" to foster the growth of blockchain and cryptocurrency startups. Ella Zhang, head of the exchange's incubator program Binance Labs, said during an online meetup Thursday that the capital for the fund will be coming from Binance's…
Highlights from the red carpet
Share this with These are external links and will open in a new window Email Share this with Email Facebook Share this with Facebook Messenger Share this with Messenger Messenger Share this with Messenger Twitter Share this with Twitter Pinterest Share this with Pinterest WhatsApp Share this with WhatsApp LinkedIn Share this with LinkedIn Copy…
World Cup countdown: Luis Suarez's goal knocks England out – 2014
ByEurope World News	 May 25, 2018
Watch Luis Suarez's superb goal which knocked England out of the 2014 World Cup in Brazil, with 19 days to go until Russia 2018. Available to UK users only.
Ukraine has more than 2,000 coronavirus infections in a day for the first time
The Ukrainian authorities recorded more than 2,000 cases of COVID-19 for the first time in 24 hours. This is a new record that puts Ukraine globally above China, the country where the new coronavirus outbreak began in 2019. now in the pandemic. The Ministry of Health of Ukraine has registered 98,537 positives since the first…
Six Nations: World Rugby confirm TMO error in England v Wales match
Gareth Anscombe of Wales try was disallowed after he battled with Anthony Watson of England Six Nations: Ireland v Wales Venue: Aviva Stadium, Dublin Date: Saturday, 24 February Kick-off: 14:15 GMT Coverage: Live on S4C, BBC Radio Wales, BBC Radio Cymru & BBC Sport website and BBC Sport app, plus live text commentary. World Rugby…


Hi everyone, do you know you can access all your emails with gmail. You can easily add your other emails in your Gmail account.
then you can easily integrate these id in your Gmail [email protected] account.
6. A verification email will be sent to your Yahoo mail id.
7. Open Yahoo mail id, click on the verification link and verify and Done! You have successfully added your Yahoo mail id into Gmail.
You can also send emails from yahoo mail id using Gmail.


What is the Constitution? Simplified Definition: The US Constitution was written to establish the basic principles of the legal, political and economic systems of the new nation of America. The US Constitution is the basic framework for the system of Government in the USA and its adoption led to the creation of the US Congress.
It is permitted to make additions or alterations to the Constitution. These are called constitutional amendments. To date there a have been 27 amendments to the Constitution.
The first 10 Amendments were made to the US Constitution that guaranteed basic liberties to Americans, and these were collectively called the Bill of Rights. The Bill of Rights prohibits the government from violating them. The Bill of Rights was put into effect, or ratified, by representatives of the first 13 states during the Presidency of George Washington.
US Constitution Simplified for Kids: When was the US Constitution written?
1. The Preamble The US Constitution has an introduction called the 'Preamble' that explains why it was written.
2. The 'Articles' The Constitution has seven parts, called "Articles".
The following table contains all of the elements and the Summary of each - the US Constitution Simplified! The links take you to articles containing the text and a detailed summary of each.
Article VII ARTICLE 7 Lists the requirements for ratification of the Constitution.
Bill of Rights Amendments 1-10 BILL OF RIGHTS US Constitution Simplified: AMENDMENTS 1-10 were added to the Constitution in 1791 and are collectively called the Bill of Rights which reserves the rights of the people.
Amendment 27 27th Amendment Congressional pay increases go into effect only during the next Congressional session, meaning Congress cannot vote itself a pay rise - any pay rise would only count for the next congress.
6. To "Secure the blessings of liberty" Meaning: Present and future generations will enjoy independence and freedom.
The article on the simplified US Constitution of America provides a summary of one of the most important documents in the history of America, the Constitution. The following video will give you important facts and dates about the political events experienced by all of the Presidents of America.
When was the Constitution written and adopted?


text:
Meet the Contributors Behind the Best Performances Issue
by W Staff
Courtesy of Rafael Pavarotti.
Rafael Pavarotti
Photographer, "Lila Moss Goes Bold in '90s-Inspired Sportswear"
Which film do you think has the most beautiful fashion or costumes?
Ceddo, a 1977 film by the Senegalese director Ousmane Sembène.
What is your favorite movie quote?
"It was your tears that brought me back to the coast," from Atlantique, directed by Mati Diop.
What is the first film you remember watching?
The NeverEnding Story. It made me dream of fantasy and imagine other universes besides what I was learning to know.
Courtesy of Juergen Teller and Dovile Drizyte.
Juergen Teller and Dovile Drizyte
Photographer and Creative Partner, "Best Performances"
What would you consider the most memorable film scene of all time, and why?
JT: Whenever somebody smokes onscreen, because nobody does that anymore.
Which film do you think has the most beautiful fashion or costumes? Any favorite outfits in particular?
DD: Akira Kurosawa's Ran has pretty impressive looks.
What is your earliest film memory?
JT: When I was 14 or 15 years old, going from my village into town at daytime, alone, to see Apocalypse Now. I stepped out of the cinema, it was daylight, and I was completely blinded and completely blown away.
Courtesy of Cyndia Harvey.
Cyndia Harvey
Hairstylist, "Cyndia Harvey Shapes Hair With a Sculptor's Hand"
Who is your favorite film character?
Sebastian from The Little Mermaid totally stole the show for me.
What would you consider the most memorable film scene of all time?
The amazing dance scene in The Great Beauty, by Paolo Sorrentino. It's an intense hedonistic explosion of pure joy and escapism.
What is your favorite art-house film and your favorite guilty pleasure?
Daughters of the Dust is a masterpiece. Happy Feet is my ultimate not-so-guilty pleasure. After watching it, I became obsessed with Savion Glover.
J.P. Pryor.
Lorena Lohr
Photographer, "Spring's Best Accessories are Bright, Retro and a Little Off-Kilter"
Which film do you watch over and over again?
In the past year, I've watched Daryl Duke's Payday a lot. It stars Rip Torn as a country singer, and it's strangely soothing in that every character is more depraved than the last, but there are never any questions about morality posed.
The opening scene of Orson Welles's Touch of Evil. It's one single tracking shot of around three and a half minutes, going through a U.S.-Mexico border town, building up to an exploding car.
Who is your favorite movie character?
Elliott Gould as Philip Marlowe in The Long Goodbye. He has a great way of getting things done, and the best apartment to boot.
Courtesy of Justin French.
Justin French
Photographer, "The Future of Fashion Is in the Past"
Major Motoko Kusanagi, from the anime film franchise Ghost in the Shell. I love her ever-evolving perception, sense of self, duty, and principle.
What is the most creative "live" performance you've seen in the past year?
Lauryn Hill's performance for the Louis Vuitton spring 2021 show. It was very unexpected but so fitting.
Clouds of Sils Maria (art house) and Fair Game (guilty pleasure).
Courtesy of Todd Finkel.
Jori Finkel
Writer, "Inside Julie Mehretu's Richly Layered World"
What is your favorite film quote?
"If you think Mick Jagger will still be out there trying to be a rock star at age 50, then you are sadly, sadly mistaken." - Jimmy Fallon's music manager character in Almost Famous.
The first film I begged to see right when it came out was Star Wars—and then I had to see it again and again heading into second grade. I needed to get my Princess Leia Halloween costume right.
What's the best family movie you've watched lately?
The best thing I streamed with my kids recently was My Octopus Teacher, which has such strangely beautiful underwater footage. I couldn't get over how well the camera captured the octopus's point of view.


text:
Queensrÿche – gruppo musicale statunitense
Queensrÿche – album del 2013
Queensrÿche – EP del 1982

redpajama_set_name: RedPajamaWikipedia


My clinical interests are in taking care of patients with advanced lung diseases, namely interstitial lung disease. I also have an interest in lung transplantation. My current research project is characterizing macrophage/Type II alveolar epithelial cell interactions.


text:
И́ндржих Китцбе́ргер (; ) — чешский кёрлингист.

Играет на позиции первого.

Достижения
 : бронза ().

Команды

(скипы выделены полужирным шрифтом; см. также )

Примечания

Кёрлингисты по алфавиту
Кёрлингисты Чехии


Engineers with 25 years experience. Genuine 24 hour emergency service. All leads - burst pipes. All blockages cleared. high pressure jetting. CCTV surveys and report. Complete bathroom installations/ Power showers. Central heating systems serviced, repaired and installed. All electrical, brickwork, roof and carpentry also undertaken. Corgi registered.


text:
Today is a B Day.
Holmes (Past and Current) Students Shine in State Constitution Contest
How well do you know your Constitution? Probably not as well some of these current and former Holmes Jr. High students. On Monday, January 13th, five Cedar Falls Schools students traversed the cold weather to West Des Moines to participate in the Know Your Constitution Program, sponsored by the State Bar Association. Students were tasked with completing a multiple choice quiz, and students in grades 9-12 were also challenged to write a short essay on the U.S. Constitution. Winning entries [...]
Benjamin Hirdler
Constitution, students, Holmes, school
How Holmes Teachers are Promoting Literacy Outside of the Classroom | Holmes Jr. High Jeans Day
Holmes Jr. High Teachers and Staff were granted the opportunity to promote literacy in the Cedar Valley and wear some comfier clothes at the same time! Teachers donated $5 to wear jeans on Friday, January 10th. Proceeds will go to Readers Today, Leaders Tomorrow, a student organization at the University of Northern Iowa. Readers Today, Leaders Tomorrow began in 2018 when a young student at UNI learned that students who do not have access to age-appropriate reading material tend to do worse [...]
Cardamone Receives Award
Congratulations, Ashley Cardamone (Holmes Junior High in Cedar Falls) and Elizabeth Mastalio (Mid City High School in Davenport)! These Panthers earned the Yager Exemplary Teaching Recognition Award for exemplary K-12 teaching. #DiscoverUNI
What is an algorithm?
What is an algorithm? We learned just that today in computer science.
NEIBA Honor Band
A great day at the NEIBA honor band Saturday. All ten students from Holmes were in the top three chairs for their section and five were first chair in their band. Three students: Cian W, Taylor J and Kristen E were selected to the All Iowa band that performs in May. Congrats!
Jeremy.Jones@cfschools.org
505 Holmes Drive
Follow Holmes Junior High


BMK Media is an Authorized Partner with Jive Communications. Jive has built the most impressive business-class hosted VoIP system available today. We can help prepare your home or company to use industry-standard VoIP phones from Cisco, Polycom, Panasonic, VTech, and others so you can take advantage of this cutting-edge VoIP technology on an easy-to-manage hosted platform. CONTACT US TODAY for more info, and start experiencing the benefits of true VoIP phone service right away!
100% Hosted - Jive ONLY provides Hosted VoIP PBX and dial-tone services. We are not distracted with legacy premises-based offerings.
Industry-Leading Uptime – Jive's services are built to ensure uptime and are hosted in Tier 1 facilities with redundant connectivity to the nation's leading carriers.
Nationwide Coverage – We can service over 97% of the US population.
Flexible Connectivity – We allow customers to utilize quality bandwidth providers of their choice. You do not need to wait until their current IP contract is up to switch them to Jive. We also offer MPLS and Class of Service models.
Top-Rated – Customers consistently rate Jive #1 among Hosted VoIP PBX providers. We invite you to read customer reviews of our service on any of the major review sites.
Simple – Our pricing models are simple and transparent, so you and your customers will never be surprised. One price gives you full access to Jives complete feature set.
Month-to-Month Customer Contracts - We earn your business every month and have industry-leading customer retention.
Pre-Configured Phones - All phones purchased from Jive ship pre-configured with the latest firmware and end user information. Once they arrive, simply plug them in and make calls.
Fast Delivery – Most orders delivered to the customer/partner within three business days.


Set #1 Oh No, Not Another Set Featuring Unrequited Love Songs. Okay I Agree I've Done That One Too Much, So This Set Is About Unrequited Love That Is Cynical Beyond All Physical Belief, Inflicts Permanent Damage, And Still Isn't Covered By Insurance!
Set #2 Okay, Now It's Time For Some Balance, The Love Affairs In These Songs Are So Darn Positive, They Are Covered By The FDIC!
Set #3 And Now Back To Our Regularly Scheduled Theme From Set One. I Swear I Couldn't Find A Song Where The Guy Actually Broke Up With The Girl.
Set #4 After All That Bad Love It's Time To Just Put It All Away And Go On A Happy Trip So B.Y.O.P.!


text:
Stettler was a provincial electoral district in Alberta, Canada, mandated to return a single member to the Legislative Assembly of Alberta from 1909 to 1993.

History
The Stettler electoral district was formed in 1909 from the eastern portions of the Gleichen, Rosebud, Innisfail, Red Deer and Lacombe electoral districts. The district is named after the Town of Stettler.

The Stettler electoral district was abolished in 1993 and combined with portions of the Lacombe electoral district to form Lacombe-Stettler electoral district.

Members of the Legislative Assembly (MLAs)

Election results

1909 general election

1913 general election

1917 general election

1921 general election

1926 general election

1930 general election

1935 general election

1940 general election

1944 general election

1948 general election

1952 general election

1955 general election

1959 general election

1963 general election

1967 general election

1971 general election

1975 general election

1979 general election

1982 general election

1986 general election

1989 general election

1989 by-election

Plebiscite results

1957 liquor plebiscite

On October 30, 1957 a stand-alone plebiscite was held province wide in all 50 of the then current provincial electoral districts in Alberta. The government decided to consult Alberta voters to decide on liquor sales and mixed drinking after a divisive debate in the legislature. The plebiscite was intended to deal with the growing demand for reforming antiquated liquor control laws.

The plebiscite was conducted in two parts. Question A, asked in all districts, asked the voters if the sale of liquor should be expanded in Alberta, while Question B, asked in a handful of districts within the corporate limits of Calgary and Edmonton, asked if men and women should be allowed to drink together in establishments.

Province wide, Question A of the plebiscite passed in 33 of the 50 districts, while Question B passed in all five districts. Stettler barely voted against the proposal; the results were almost a tie. The voter turnout in the district was well above the province wide average of 46%.

Official district returns were released to the public on December 31, 1957. The Social Credit government in power at the time did not consider the results binding. However the results of the vote led the government to repeal all existing liquor legislation and introduce an entirely new Liquor Act.

Municipal districts lying inside electoral districts that voted against the plebiscite, such as Stettler, were designated Local Option Zones by the Alberta Liquor Control Board and considered effective dry zones. Business owners who wanted a license had to petition for a binding municipal plebiscite in order for a license to be granted.

See also
List of Alberta provincial electoral districts
Stettler, a town in central Alberta

References

Further reading

External links
Elections Alberta
The Legislative Assembly of Alberta

Former provincial electoral districts of Alberta
1909 establishments in Alberta
1993 disestablishments in Canada


text:
Is Leif in Vikings Leif Erikson?
What were Norse explorers called?
How did Vikings really look?
Did Vikings love their kids?
Did Vikings marry English?
Which Native American tribe is the oldest?
Do DNA tests show Native American?
Does 23andMe show if you are Native American?
What percentage of blood do you need to be considered Native American?
Leif was the son of Erik the Red, who had founded the first Norse settlement in Greenland. At the moment, there has been no official confirmation Leif Erikson will appear in Vikings season six, part B. Leif is believed to have been born in Iceland, which had recently been colonised by Norsemen from Norway.
"From picture sources we know that the Vikings had well-groomed beards and hair. The men had long fringes and short hair on the back of the head," she says, adding that the beard could be short or long, but it was always well-groomed. Further down on the neck, the skin was shaved.
Family life was important to Norse men, and every proper, upstanding Viking aimed to marry and have children. And although their parents arranged their marriages, Norsemen liked to court their ladies- and made a special effort to impress with their appearance.
The Vikings most likely married into Anglo-Saxon families over time, yes maybe the children of the Scandinavians were raised by Anglo-Saxon servants, as was the case among white American children in the southern states, where African slaves took care of white children.
The Clovis culture, the earliest definitively-dated Paleo-Indians in the Americas, appears around 11,500 RCBP (radiocarbon years Before Present), equivalent to 13,500 to 13,000 calendar years ago.
Native Americans all descend from populations that expanded through Asia thousands of years ago. Today, each tribe has its own course, but most groups still have the same genetic material. This means that a DNA test will not be able to reveal what tribal group you belong to specifically.
Currently 23andMe has several features that can reveal genetic evidence of Native American ancestry, although they are not considered a confirmatory test or proof of such ancestry in a legal context.
Most federally recognized tribes (as implicitly prescribed under the Federal Acknowledgment Act of 1978) require a certain level of blood quantum, ranging from "full" Indian blood to 1/32 Indian blood.


text:
'use strict';

const level  = require('levelup');
const ttl    = require('level-ttl');
const spaces = require('level-spaces');
const ms     = require('ms');
const fs     = require('fs');
const _      = require('lodash');
const leveldb = require('leveldown');

const gms    = require('./gms');
const LRU    = require('lru-cache');
const EventEmitter = require('events').EventEmitter;
const dbChecker = require('../bin/db-checker');

const INTERVAL_TO_MS = {
  'per_second': ms('1s'),
  'per_minute': ms('1m'),
  'per_hour':   ms('1h'),
  'per_day':    ms('1d')
};

const drivers = {
  'leveldb': leveldb
};

const INTERVAL_SHORTCUTS = Object.keys(INTERVAL_TO_MS);
const GC_GRACE_PERIOD = ms('2m');

const defaults = {
  driver: 'leveldb',
  inMemory: false
};

function normalizeType(params) {
  const type = _.pick(params, [
    'per_interval',
    'interval',
    'size',
    'unlimited',
    'ttl'
  ]);

  INTERVAL_SHORTCUTS.forEach(ish => {
    if (!params[ish]) { return; }
    type.interval = INTERVAL_TO_MS[ish];
    type.per_interval = params[ish];
  });

  if (typeof type.size === 'undefined') {
    type.size = type.per_interval;
  }

  if (type.per_interval && !type.ttl) {
    type.ttl = (type.size * type.interval) / type.per_interval;

    if (process.env.NODE_ENV !== 'test') {
      type.ttl += GC_GRACE_PERIOD;
    }
  }

  type.overrides = _.map(params.overrides || params.override || {}, (overrideDef, name) => {
    const override = normalizeType(overrideDef);
    override.name = name;
    override.until = overrideDef.until;
    override.match = overrideDef.match;
    return override;
  }).filter(o => !o.until || o.until >= new Date());

  if (type.overrides) {
    type.overridesCache = new LRU({ max: 50 });
  }

  return type;
}

class LimitDB extends EventEmitter {

  /**
   * Creates an instance of LimitDB.
   * @param {params} params - The configuration for the database.
   */
  constructor(params) {
    super();
    params = params || {};

    params = Object.assign({}, defaults, params);

    if (typeof params.path !== 'string' && !params.inMemory) {
      throw new Error('path is required');
    }

    this.state = 'opening';

    const done = (err) => {
      if (err) {
        return this.emit('error', err);
      }
      this.state = 'ready';
      this.emit('ready');
    };

    const leveldbOnFs = params.driver === 'leveldb' && !params.inMemory;

    if (leveldbOnFs && fs.existsSync(params.path)) {
      this._safeOpenDb(params, done);
    } else {
      this._openDb(params, done);
    }
  }

  _safeOpenDb(params, done) {
    dbChecker.check(params.path, (err) => {
      if (err) {
        this.emit('repairing');
        return leveldb.repair(params.path, (err) => {
          if (err) {
            this.emit('error', err);
            return;
          }
          this._openDb(params, done);
        });
      }
      this._openDb(params, done);
    });
  }

  _openDb(params, callback) {
    const db = drivers[params.driver];
    const memory = params.inMemory && params.driver === 'leveldb' || undefined;

    level(db(params.path || ''), {
      memory,
      valueEncoding: 'json'
    }, (err, db) => {
      if (err) {
        return callback(err);
      }

      this._db = ttl(db, {
        checkFrequency: process.env.NODE_ENV === 'test' ? 100 : ms('30s')
      });

      this.loadTypes(params.types);

      callback();
    });
  }

  /**
   * Load the buckets configuration.
   * This method can be used when the database is open.
   *
   * @param {Object.<string, type>} typesConfig The buckets configuration.
   * @memberof LimitDB
   */
  loadTypes(typesConfig) {
    if (!this._db) {
      throw new Error('database is not ready yet');
    }

    const types = _.reduce(typesConfig, (result, typeParams, name) => {
      const type = result[name] = normalizeType(typeParams);
      type.db = gms(spaces(this._db, name, { valueEncoding: 'json' }));
      return result;
    }, {});

    this._types = types;
  }

  _drip(bucket, type) {
    if (!type.per_interval) {
      return {
        content: bucket.content,
        size: bucket.size
      };
    }

    const now = Date.now();
    const deltaMS = Math.max(now - bucket.lastDrip, 0);
    const dripAmount = deltaMS * (type.per_interval / type.interval);
    const content = Math.min(bucket.content + dripAmount, type.size);

    return {
      content:    content,
      lastDrip:   now,
      size:       type.size,
      beforeDrip: bucket.content
    };
  }

  _getResetTimestamp(bucket, type) {
    if (!type.per_interval) {
      return 0;
    }

    const now = Date.now();
    const missing = type.size - bucket.content;
    const msToCompletion = Math.ceil(missing * type.interval / type.per_interval);

    return Math.ceil((now + msToCompletion) / 1000);
  }

  _getTypeParams(type, key) {
    const fromCache = type.overridesCache.get(key);

    if (fromCache) {
      return fromCache;
    }

    const result = _.find(type.overrides, o => {
      if (o.match) {
        return o.match.exec(key);
      } else {
        return o.name === key;
      }
    }) || type;

    type.overridesCache.set(key, result);

    return result;
  }

  _getFullBucket(typeParams) {
    return {
      lastDrip: Date.now(),
      content: typeParams.size,
      reset: this._getResetTimestamp({ content: typeParams.size }, typeParams.size)
    };
  }

  /**
   * Take N elements from a bucket if available.
   *
   * @param {takeParams} params - The params for take.
   * @param {function(Error, takeResult)} callback - The callback to call
   */
  take(params, callback) {
    if (typeof params !== 'object') {
      params = {};
    }

    if (typeof params.type !== 'string') {
      return setImmediate(callback, new Error('type is required'));
    }

    const type = this._types[params.type];

    if (typeof type === 'undefined') {
      return setImmediate(callback, new Error(`undefined bucket type ${params.type}`));
    }

    if (typeof params.key !== 'string') {
      return setImmediate(callback, new Error('key is required'));
    }

    const typeParams = this._getTypeParams(type, params.key);

    const count = params.count || 1;

    if (typeParams.unlimited) {
      return setImmediate(callback, null, {
        conformant: true,
        remaining: typeParams.size,
        reset: Math.ceil(Date.now() / 1000),
        limit: typeParams.size
      });
    }

    type.db.gms(params.key, (bucket) => {
      if (bucket && typeof bucket === 'string') {
        bucket = JSON.parse(bucket);
      }

      bucket = bucket ? this._drip(bucket, typeParams) : this._getFullBucket(typeParams);

      //this happen when we scale down a bucket
      //imagine the size was 10 and the current content is 9.
      //then we scale down the bucket to 6...
      //The current content should be computed as 6, not 9.
      bucket.content = Math.min(typeParams.size, bucket.content);
      bucket.size = typeParams.size;

      if (bucket.content >= count) {
        bucket.lastConformant = true;
        bucket.content -= count;
      } else {
        bucket.lastConformant = false;
      }

      bucket.reset = this._getResetTimestamp(bucket, typeParams);
      return bucket;
    }, { ttl: typeParams.ttl }, (err, bucket) => {
      if (err) { return callback(err); }
      callback(null, {
        conformant: bucket.lastConformant,
        remaining:  Math.floor(bucket.content),
        reset:      bucket.reset,
        limit:      typeParams.size
      });
    });
  }

  /**
   * Take N elements from a bucket if available otherwise wait for them.
   * The callback is called when the number of request tokens is available.
   *
   * @param {waitParams} params - The params for take.
   * @param {function(Error, waitResult)} callback
   */
  wait(params, callback) {
    if (typeof params !== 'object') {
      params = {};
    }

    if (typeof params.type !== 'string') {
      return setImmediate(callback, new Error('type is required'));
    }

    const type = this._types[params.type];

    if (typeof type === 'undefined') {
      return setImmediate(callback, new Error(`undefined bucket type ${params.type}`));
    }

    if (typeof params.key !== 'string') {
      return setImmediate(callback, new Error('key is required'));
    }

    const typeParams = this._getTypeParams(type, params.key);

    const count = params.count || 1;

    this.take(params, (err, result) => {
      if (err) { return callback(err); }
      if (result.conformant) { return callback(null, result); }
      const required = count - result.remaining;
      const minWait = Math.ceil(required * typeParams.interval / typeParams.per_interval);
      return setTimeout(() => {
        this.wait(params, (err, result) => {
          if (err) { return callback(err); }
          result.delayed = true;
          callback(null, result);
        });
      }, minWait);
    });
  }

  /**
   * Put N elements in the bucket.
   *
   * @param {putParams} params - The params for take.
   * @param {function(Error, putResult)} [callback]
   */
  put(params, callback) {
    callback = callback || _.noop;
    if (typeof params !== 'object') {
      params = {};
    }

    if (typeof params.type !== 'string') {
      return setImmediate(callback, new Error('type is required'));
    }

    const type = this._types[params.type];

    if (typeof type === 'undefined') {
      return setImmediate(callback, new Error(`undefined bucket type ${params.type}`));
    }

    if (typeof params.key !== 'string') {
      return setImmediate(callback, new Error('key is required'));
    }

    const typeParams = this._getTypeParams(type, params.key);

    if (typeParams.unlimited) {
      return setImmediate(callback, null, {
        remaining: typeParams.size,
        reset: Math.ceil(Date.now() / 1000),
        limit: typeParams.size
      });
    }

    const finish = (err, bucket) => {
      if (err) {
        return callback(err);
      }

      bucket = bucket || this._getFullBucket(typeParams);

      callback(null, {
        remaining:  Math.floor(bucket.content),
        reset:      bucket.reset,
        limit:      typeParams.size
      });
    };

    if (params.all ||
        typeof params.count === 'undefined' ||
        params.count >= typeParams.size) {
      //We are going to reset the bucket entirely to its default state
      //this is a short circuit
      return type.db.del(params.key, (err) => {
        //ignore the error, example key is missing.
        finish();
      });
    }

    const count = params.count || typeParams.size;

    type.db.gms(params.key, bucket => {
      if (bucket && typeof bucket === 'string') {
        bucket = JSON.parse(bucket);
      }

      bucket = bucket || {
        lastDrip: Date.now(),
        content: typeParams.size,
        size: typeParams.size
      };

      bucket.content = Math.min(typeParams.size, bucket.content + count);

      // Storage optimization: if the bucket is full we can remove it from DB.
      // this partially fixes an issue causing us to collect items in DB indefinitelly
      // those items in general exceed the existing limit of 100 items
      // we return when calling bucket status
      // console.dir(bucket);
      return bucket;
    }, { ttl: typeParams.ttl }, finish);
	}

  /**
   * Gets a single key:value by key
   *
   * @param {statusParams} params - The params for take.
   * @param {function(Error, getResult)} [callback]
   */
  get(params, callback) {
    if (typeof params !== 'object') {
      return setImmediate(callback, new Error('params is required'));
    }

    if (typeof params.type !== 'string') {
      return setImmediate(callback, new Error('type is required'));
    }

    if (typeof params.key !== 'string') {
      return setImmediate(callback, new Error('key is required'));
    }

    const type = this._types[params.type];

    if (typeof type === 'undefined') {
      return setImmediate(callback, new Error(`undefined bucket type ${params.type}`));
    }

    const typeParams = this._getTypeParams(type, params.key);

    type.db.get(params.key, (err, value) => {
      if (!value) {
        value = this._getFullBucket(typeParams);
      }

      callback(null, {
        remaining:  Math.floor(value.content),
        reset: this._getResetTimestamp(value, typeParams),
        limit: typeParams.size
      });
    });
  }

  /**
   * Put N elements in the bucket.
   *
   * @param {statusParams} params - The params for take.
   * @param {function(Error, statusResult)} [callback]
   */
  status(params, callback) {
    if (typeof params !== 'object') {
      return setImmediate(callback, new Error('params is required'));
    }

    if (typeof params.type !== 'string') {
      return setImmediate(callback, new Error('type is required'));
    }

    if (typeof params.prefix !== 'string') {
      return setImmediate(callback, new Error('prefix is required'));
    }

    const type = this._types[params.type];

    if (typeof type === 'undefined') {
      return setImmediate(callback, new Error(`undefined bucket type ${params.type}`));
    }

    const items = [];
    var count = 0;

    const readStream = type.db.createReadStream({
      gte: params.prefix,
      lte: `${params.prefix}~`,
    });

    const finish = () => {
      callback(null, { items });
    };

    readStream.on('data', data => {
      if (!data.value) return;
      var bucket;

      //this is because of an old bug with levelup
      bucket = typeof data.value === 'string' ?
                JSON.parse(data.value) :
                data.value;

      if (bucket.reset === 0 && bucket.content === bucket.size) {
        //we dont care about this.
        return;
      }

      const typeParams = this._getTypeParams(type, data.key);

      count++;
      bucket = this._drip(bucket, typeParams);

      items.push({
        remaining: bucket.content,
        reset:     this._getResetTimestamp(bucket, typeParams),
        limit:     typeParams.size,
        key:       data.key
      });

      if (count === 100) {
        readStream.destroy();
        finish();
      }
    }).once('end', finish).once('error', (err) => {
      if (err.message === 'Unexpected token ~') {
        readStream.destroy();
        return finish();
      }
      callback(null, err);
    });
  }

  /**
   * Close the database.
   *
   * @param {function(Error)} [callback]
   */
  close(callback) {
    callback = callback || _.noop;
    if (this.state === 'opening') {
      return this.once('ready', () => this.close(callback));
    } else if(this.state === 'closed') {
      return setImmediate(callback, new Error('the database is already closed'));
    }

    this.state = 'closed';

    this._db.close(() => {
      this.emit('closed');
      callback();
    });
  }

  /**
   * Check if the database is open.
   *
   * @returns {boolean}
   */
  isOpen() {
    return this._db && !this._db.isClosed();
  }
}

module.exports = LimitDB;

/**
 * And now some typedefs for you:
 *
 * @typedef {Object} type
 * @property {integer} [per_interval] The number of tokens to add per interval.
 * @property {integer} [interval] The length of the interval in milliseconds.
 * @property {integer} [size] The maximum number of tokens in the bucket.
 * @property {integer} [per_second] The number of tokens to add per second. Equivalent to "interval: 1000, per_interval: x".
 * @property {integer} [per_minute] The number of tokens to add per minute. Equivalent to "interval: 60000, per_interval: x".
 * @property {integer} [per_hour] The number of tokens to add per hour. Equivalent to "interval: 3600000, per_interval: x".
 * @property {integer} [per_day] The number of tokens to add per day. Equivalent to "interval: 86400000, per_interval: x".
 *
 * @typedef {Object} params
 * @property {string} [params.path] The path to the database.
 * @property {string} [params.driver=leveldb] The driver to use the only supported now is leveldb and it is the default.
 * @property {boolean} [params.inMemory] Store the database in RAM instead of disk.
 * @property {Object.<string, type>} params.types The buckets configuration.
 *
 * @typedef takeParams
 * @property {string} type The name of the bucket type.
 * @property {string} key The key of the bucket instance.
 * @property {integer} [count=1] The number of tokens to take from the bucket.
 *
 * @typedef takeResult
 * @property {boolean} conformant Returns true if there is enough capacity in the bucket and the tokens has been removed.
 * @property {integer} remaining The number of tokens remaining in the bucket.
 * @property {integer} reset A unix timestamp indicating when the bucket is going to be full.
 * @property {integer} limit The size of the bucket.
 *
 * @typedef waitParams
 * @property {string} type The name of the bucket type.
 * @property {string} key The key of the bucket instance.
 * @property {integer} [count=1] The number of tokens to wait for.
 *
 * @typedef waitResult
 * @property {integer} remaining The number of tokens remaining in the bucket.
 * @property {integer} reset A unix timestamp indicating when the bucket is going to be full.
 * @property {integer} limit The size of the bucket.
 *
 * @typedef putParams
 * @property {string} type The name of the bucket type.
 * @property {string} key The key of the bucket instance.
 * @property {integer} [count=SIZE] The number of tokens to put in the bucket. Defaults to the size of the bucket.
 *
 * @typedef putResult
 * @property {integer} remaining The number of tokens remaining in the bucket.
 * @property {integer} reset A unix timestamp indicating when the bucket is going to be full.
 * @property {integer} limit The size of the bucket.
 *
 * @typedef getParams
 * @property {string} type The name of the bucket type.
 * @property {string} key The key of the bucket instance.
 *
 * @typedef getResult
 * @property {integer} remaining The number of tokens remaining in the bucket.
 * @property {integer} reset A unix timestamp indicating when the bucket is going to be full.
 * @property {integer} limit The size of the bucket.
 *
 * @typedef statusParams
 * @property {string} type The name of the bucket type.
 * @property {string} prefix The prefix to search for.
 *
 * @typedef statusItem
 * @property {string} key The key of the bucket instance.
 * @property {integer} remaining The number of tokens remaining in the bucket.
 * @property {integer} reset A unix timestamp indicating when the bucket is going to be full.
 * @property {integer} limit The size of the bucket.
 *
 * @typedef statusResult
 * @property {Array.<statusItem>} items The number of tokens remaining in the bucket.
 *
*/

redpajama_set_name: RedPajamaGithub