text:
The Discourse missed its fundraising campaign goal. Here's what the Canadian news startup learned.
By: Joseph Lichterman
Local Journalism
Solution Set
This spring, the Canadian news startup The Discourse launched a fundraising campaign. It was looking to grow its base of monthly donors to support its reporting in three communities.
The site called the campaign a do-or-die moment.
The Discourse, however, did not meet its goal. It couldn't convince enough readers to make monthly contributions. As a result, it decided to close two of its pilot sites and double down on its most successful pilot covering the Cowichan Valley in rural British Columbia.
This week in Solution Set we're going to study The Discourse's campaign and approach to funding, share what it learned from the membership push, and discuss how it's planning to move forward. (I'd also like to mention how Editor in Chief and CEO Erin Millar graciously put up with my questions earlier this week on Canadian Thanksgiving when I forgot it was a holiday there. 😬)
Solution Set is a weekly report from The Lenfest Institute for Journalism. Every Thursday, we take an in-depth look at one riveting thing in journalism, share lessons, and point you toward other useful resources.
Get Solution Set in your email inbox
Here's the TLDR:
• The Challenge: The Discourse needed an influx of cash from the fundraising campaign to support its three pilot communities. The campaign fell short.
• The Strategy: Discourse Editor in Chief and CEO Erin Millar and her team spent the summer assessing the Campaign and plotting their next steps. They decided to focus on just one community.
• The Numbers: The Discourse's goal was to attract 1,000 contributors. Just over 500 people donated.
• The Lessons: Transparency has been one of the hallmarks of The Discourse and one of the keys to retaining its subscribers. It focused on its next steps thinking about the audience engagement funnel.
• The Future: The Discourse is launching a number of projects to work toward sustainability.
• Want to know more?: Scroll down to learn more about The Discourse's business and the broader Canadian ecosystem.
• Anything to add?: Keep scrolling to learn more about our next #NewsBookClub read.
Over the past year or so, The Discourse was hit by a "perfect storm" of funding challenges, CEO and Editor-in-Chief Erin Millar told me.
Launched in 2014 as Discourse Media, a nationally focused investigative site and broader journalism platform, the company was primarily bootstrapped for its first five years. But in late 2017 and early 2018 it decided to shift its focus to build a platform for audience-driven local news that can help fill the gaps in news coverage left by the decimation of local newspapers.
It rebranded as The Discourse and decided to focus its initial coverage on serving three communities in a pilot of sorts: The Cowichan Valley, a rural community south of Vancouver; Urban Nation, serving the indigenous population in the Vancouver area; and Scarborough, a diverse area of Toronto. It planned to use these three communities as pilots, with the ultimate goal of growing the model to communities across Canada.
Each Discourse site would ask readers what topics they wanted covered. This created a structured data set that is regularly updated so Discourse reporters can then identify the five topics that people want deeper coverage on.
Reporters turn those topics into more fleshed out story ideas, which they then present back to the community, which votes on the stories they want reported.
For example, last year, the Urban Nation readership voted to back an investigation into fake indigenous art that was being sold to tourists in Vancouver. It won over proposed stories on police racism and a murder trial, among others.
"What my traditional newspaper and magazine feature writer said — go for the racism in the police force, but that's not what the community wanted," Millar said. "They already knew about that problem."
This is a fairly radical rethinking of what journalism looks like, and to complete the transition, it set out to raise additional funding.
But raising money is hard. Really hard.
"Starting something is crazy. It's so crazy," Millar said. "Had I known how crazy this was going to be, I might have had second thoughts. We're still going, but there's just a million things that can happen and about four of them happened at the same time for us, which made it really really tricky."
In 2017, it set out to raise an additional $1 million from a crowdfunded equity campaign and additional investment from angel investors and values-aligned funds. (A note: These monetary figures are all in Canadian dollars, which has an exchange rate of $1 CAD to $0.76 USD.)
Nearly 300 individual investors contributed about $350,000. It received $250,000 from its lead investor. In total, since 2017, The Discourse said it raised more than $1.3 million in investment capital — a combination of debt and equity investments.
Despite the fundraising success, Millar told me that The Discourse was still short of its goal. And there were also some regulatory issues that it had to deal with associated with the investments.
During this time, The Discourse was also involved in discussions with the Canadian government about how to structure a plan to support local journalism across the country. "We didn't succeed in moving forward in the way we wanted to there," Millar said.
In short, there were a number of factors that combined put the squeeze on The Discourse.
With all that going on, The Discourse launched its first membership campaign in May. Millar, in an email to readers, called it a do-or-die moment. "The Discourse is not yet sustainable," she wrote.
It sought to sign up 1,000 contributors who would become monthly supporters.
"Hitting this big milestone is a crucial step towards our sustainability and independence," Millar wrote. "This won't cover all our costs and so until we grow to a point where most of our funding comes from community members, we still need to hustle funding from value-aligned partners. (So. Much. Hustle.) We need you to help us hit our goal to prove to them, and to ourselves, that we're providing a real service of value that is worth supporting."
As May turned into June — and The Discourse's campaign deadline approached — support was flagging, but a group of core supporters offered to run a matching campaign, matching up to $5,000 in donations.
While it was able to convert many of its core readers, The Discourse needed to grow its audience and it struggled to attract new readers, partially because it couldn't spend as much as it had planned on marketing due to the shortfalls.
Even though more than 500 people signed up as monthly contributors, the campaign fell short.
"That means, at least in the short-term, we can't do everything we planned," Millar wrote in a July email to readers and supporters. "And so we've been struggling through some tough decisions about focusing our resources to make the biggest impact toward our ultimate goal: developing a replicable business model for in-depth local journalism."
Millar and The Discourse team decided to take the summer to figure out those next steps.
Taking a cue from The Sprawl — which regularly takes breaks from publishing, and which we've covered here and here — The Discourse slowed down publication to assess what was working and wasn't. It wasn't much of a summer vacation.
The team dug through its audience data, it conducted surveys and user interviews, it restructured its audience funnel, and it examined its churn and retention modeling.
The Discourse also assessed earlier experiments it conducted around pricing and marketing that it tested across all three markets where it was running the campaign.
"We [had] to slow down because we [didn't] have the capital we need to continue publishing and producing at the rate that we we were," Millar said. "We quickly realized that that gives us a little bit of the breathing room we need to do all the analysis that we have around this wealth of information that we got from this. Our whole organization…is well positioned to collect all the data, but sometimes where we fall short is pausing long enough to do the analysis and pull the insights from that, and then making sure that they're informing our strategy."
She continued: "That's a culture piece we've had to work through because so many journalists are trained on these news values and to trust our instincts and gut about story selection. That's absolutely valuable, but it can be difficult to let the data inform what we're doing. We're trying to find that balance. We're often challenged by what we learn and what the communities really want. It's not what always what I necessarily would have thought having came up through more traditional newsrooms…It takes some humility to implement a data-driven culture."
That analysis led to a decision: The Discourse would focus its efforts on just one community, the Cowichan Valley.
The Cowichan Valley site received the most support during the campaign, and as a result, it is the closest to profitability. In turn, The Discourse decided it would shutter the Urban Nation and Scarborough pilots to focus its efforts on the one site.
Led by reporter Jacqueline Ronson, The Discourse Cowichan is reporting on issues affecting the community — including Monday's federal election — and also focused on reaching sustainability by the end of 2019.
The goal is to grow The Discourse Cowichan's audience, which it hopes will lead to greater support. To do so, it's focusing on its email newsletter strategy. More on this in The Numbers, but it's aiming to reach about 8,500 email subscribers, or 10 percent of the Cowichan Valley's 85,000-person population.
In order to expand its audience, The Discourse has tweaked its editorial approach and has upped its publishing frequency. It has also revamped its website and updated its SEO strategy to make itself more Google friendly.
The Discourse has also invested in paid digital marketing via Google search ads and Facebook lead acquisition ads.
"Investing as aggressively as we are is new…and it's a great opportunity for us to continue to refine the product because we can constantly be testing different value propositions," Millar said. "We're constantly looking at the data around every single thing that we're dputting out there."
This week, The Discourse is also planning to announce another pillar of its plan to support sustainable local journalism. Over the past few years, it has invested in building out its own tech stack. It's also learned a ton about how to build and monetize audiences. Now it's hoping to share that knowledge and those resources with other news organizations.
It's creating a nine-week long boot camp with two soon-to-launch local Canadian newsrooms to help kick start their businesses as they get off the ground.
"The approach is essentially: Can we really rapidly test the demand for whatever that product is. Are those journalists' instincts about where the gap is correct? Can we test that really quickly and kick the tires on all the metrics that show you have a pretty solid audience funnel so you can understand how you can grow and what it's going to cost to get to that sustainable level, and then get them generating their first membership revenue as quickly as possible so they have something to grow from?" Millar said.
(The Discourse will have more to share on this soon, and I'll update the web version of the newsletter when they do.)
The Discourse's planned 2019 budget was $1.2 million Millar said in a May post. However, with the cutbacks, that's since shrunk to under $1 million. About 60 percent of the budget pays for The Discourse's full-time and freelance editors and reporters. (Again, these are all in Canadian currency.)
The Discourse said it had raised $1.3 million in investment capital since 2017. (For a more detailed breakdown on how The Discourse raised and spent the funds, check out the post.)
With the campaign this spring, it was looking to attract 1,000 monthly supporters with an average monthly donation of $15 per month.
The Discourse got about halfway to its goal with more than 500 monthly supporters with an average of $11.64 per month, Millar said.
"We're doing pretty well there in terms of benchmarks," Millar said. "That's not bad for a small product. We're not as comprehensive as The New York Times or something, so we can't compare it to that." (For more on benchmarks, check out this data from my colleague Matt Skibinski.)
The Discourse has six staffers, in addition to a couple of people contributing part-time back office help.
The site did have to go through layoffs as it shifted strategy and closed two of the pilot sites.
Still, Millar said she worked hard to ensure that nobody was caught off guard by the staffing changes.
"We've all gone through terrible layoffs in other media outlets that feel so inhumane, but I think it's fair for me to say everyone who has gone through [these] changes feel like they have some agency," she said. "We had an open books policy through this period. Nobody was caught surprised."
Millar and The Discourse have continued to look for other funding sources to support their work. The Discourse this spring, for example, was one of 11 Canadian news organizations that took part in Facebook's accelerator program, which came with coaching and a grant to enable publishers to implement what they learned. (The Lenfest Institute has partnered with Facebook to run its American-based accelerator programs, but we had no involvement in the Canadian initiative.)
• Be transparent: We just covered how The Discourse has an open-book policy with its staff, but from the very beginning, it has also been open and clear with its readers about its plans and finances.
That transparency was one of the reasons why audiences have stuck with The Discourse even though it didn't meet its goals.
Millar sent emails to readers who subscribed to the Urban Nations and Scarborough explaining why they would cease publishing.
"I was expecting more backlash," she said. "I was super scared as being seen as not following through on my commitment to these communities having pretty publicly made some statements about how we need more diversity in media."
That backlash never came.
Only five supporters asked for their money back, and most of the people who reached out to Millar expressed support.
Here's an email one supporter in Scarborough sent Millar in response to her announcement:
"I'm glad to hear you viewing this 'failure' in Scarborough as one step on the journey of understanding a community like Scarborough. I stand whole-heartedly by the goal of pushing Canadian media to be more equitable and diverse, and I really hope to see a future iteration of The Discourse back in Scarborough. I work for the Toronto Public Library and equitable access to information is so important. Thanks for all the work you do for democratizing information access."
That person ended up increasing her donation. That, obviously, is not the norm, but it's a sign that news orgs should not shy away from talking about shortcomings.
Innovation requires risk, which inevitably will result in failure. By being open with your audiences about your success, struggles, and lessons learned, you can gain their support and trust.
• Focus on the funnel: The Discourse decided to focus its efforts on Cowichan because its conversion rates were highest there, meaning it was most successful in getting readers to subscribe to its email newsletter and then ultimately contribute money.
"Our conversion funnel is really strong," Millar said. "Once they're receiving the product, they're highly engaged in it, and those who are highly engaged are highly likely to become paying supporters."
Newsletters, as a result, are a huge part of The Discourse's strategy, as it has doubled down on the Cowichan Valley site.
For example, it found that about 35 percent of readers who visited The Discourse website and read its email newsletters above a certain threshold each month became paying contributors.
"There's an opportunity to improve the value of our product to try and get more people in that category who are finding it really useful, who they have to open it everyday and really want to be using it."
About a quarter of The Discourse's email subscribers fall in that audience, so it's looking to move those readers to the paying category while also broadening the top of its funnel, or the total potential audiences.
"That tells us we have the kernels of a really successful model if we can just grow the top of our funnel," Millar said. "Can we replicate those results with a larger audience if we better resource our marketing efforts, improve at SEO, and are using all the tactics and tools that are available to us through digital marketing to put us in front of people? At least among our early small audience, they're finding this really useful and they're willing to pay for it."
No matter if you're running a membership or subscription-driven newsroom, it's critical to focus on how you can turn casual, infrequent visitors into frequent, paying supporters.
• Re-think campaigns: The Discourse has historically approached fundraising through a typical campaign style. Two or three times a year, it throws itself entirely behind a drive to drum up noise and bring in revenue.
One of its major lessons from this experience was that traditional drives are "totally exhausting," Millar said.
"Because there is so much happening, sometimes the campaign story gets a little bit confused," she said. "We wanted to simplify that."
The Discourse's research showed that readers wanted other opportunities to support the journalism, so the site is now going run smaller campaigns every four to six weeks. And instead of pushing readers toward monthly donations, it's going to ask readers for one-time donations to support specific projects and help readers understand the actual costs of producing the journalism.
It's going to frame the asks in two ways: One way is by laying out a story it wants to pursue and ask for quick donations to help make the reporting possible. It will also follow up on major stories to ask for continued support that highlights the impact of the work. (Millar cited The Narwhal and Mother Jones as an inspiration for both approaches.)
It expects to generate 20 percent of revenue from the smaller one-time campaigns, while it will still run broader campaigns that bring in the rest. And Millar said she expects that the new strategy will help boost conversion rates for the bigger drive campaigns.
"It's our hypothesis that introducing these other campaigns will educate our audience about our business model throughout the whole process, so it primes them for the larger campaigns," she said.
Moving forward, The Discoure's primary goal is to prove that its model of reader-supported journalism is sustainable.
As it prepares to leverage its platform with other news organizations, it's hoping to build out a replicable model for sustainable local journalism.
"The actual need for this is more clear every week," Millar said.
And beyond the initiatives I covered here, The Discourse is launching additional projects to continue to build out its model — both in Cowichan and elsewhere.
With Cowichan it's planning to create a mechanism for companies and other community organizations to support The Discourse.
In the run-up to Canada's forthcoming federal election, The Discourse is partnering with the Aboriginal Peoples Television Network to produce Set the Agenda, a collaborative effort that will use Hearken to help underserved audiences drive coverage. The project is funded by the Inspirit Foundation and the Facebook Journalism Project.
"Our ultimate goal is to complicate political narratives with content driven by our communities, especially people who are too often ignored," Millar wrote last month.
• Millar has been dutifully reporting on The Discourse's own progress as well as sharing commentary on the state of the Canadian media industry. Everything she's written is fascinating, and worth your time if you've made it this far in this issue.
• Nieman Lab has also written about The Discourse's shift in strategy. Here's Christine Schmidt's story from 2017.
• Want to know more about the proposed Canadian media bailout? Here's a CBC story outlining the government's proposal and some questions about it. For more, here's a piece Millar wrote in March outlining some of her concerns with the proposal.
• Last year, I wrote about ProPublica's approach to its year-end fundraising campaigns.
• Finally, I wanted to point you toward a piece Matt Skibinski published last week looking at the two metrics newsrooms should care about as they think about the value of their coverage in terms of driving subscriptions and ad revenue.
Anything to add?
How has your news organization approached campaigns? Has there been coordination between the newsroom and revenue or marketing teams? What did that look like?
Also, I'm thrilled to share our next Solution Set Book Club read: There's No Crying in Newsrooms: What Women Have Learned about What It Takes to Lead by Kristin Grady Gilger and Julia Wallace.
We'll be meeting via Zoom call on Nov. 25 at 1pm EDT. Our host is Anita Zielina, Director of News Innovation and Leadership at CUNY's Newmark Graduate School of Journalism. Join us! More details at newsbook.club.
See you next Thursday!
Photo of Discourse Cowichan reporter Jacqueline Ronson is a screenshot from this YouTube video.
Posted in Local Journalism, Solution SetTagged Erin Millar, Solution Set, The Discourse
How a Small Nonprofit News Site Generated Triple-Digit Growth in One Year
Lenfest Local Lab, The Philadelphia Inquirer receive Google GNI Innovation Challenge support to build automated neighborhood newsletters


Establish your name recognition so the probate attorneys know who you are. It is important to get your name in front of probate attorneys. The Attorney Action Plan is a step-by-step plan that lists the letters and correspondences I send and the calls I make to the probate attorney in the order that I do them. Each correspondence builds on the previous ones. I begin by introducing myself to the attorney as the leader in probate real estate sales, continue to establish name recognition and eventually develop a strong working relationship.
These are the letters and emails my team and I send to the probate attorney to establish my name recognition when I am following my Attorney Action Plan. Also, you will find call scripts that I use when I am cold-calling attorneys.


text:
Chapel Hart Enters Country with 'Jesus and Alcohol'
Watch the irony because Chapel Hart's new single 'Jesus and Alcohol' is here to give you another perspective on how to dream big.
No hypocrisy about your faith here because alcohol isn't really prohibited in the scriptures, just mere reminders on how people should drink responsibly. Jesus even turned water into wine at a wedding! But here's the catch, watch the music video and look at the plot because spoilers aside, a runaway groom is another reason to switch onto a much 'stronger' drink.
A post shared by Chapel Hart (@chapelhartband) on Mar 15, 2020 at 5:42am PDT
Tranquilizers for a Broken Heart
Well practically, the MV is only meant to visualize the views of the artists toward the song. The message it tries to convey is to have fun, to dream, and to believe in yourself even though things don't usually go your way and the situation you're facing is haphazardly depressing. 'Jesus and Alcohol' is indeed a song about break up, but the message leans on the positive side wherein people choose to lean in faith while having a few drinks.
For a debut single, it's hard to find someone who will fly up to the heights of elevating the 'to-be' fans emotional state as the first track in their arsenal, but if we speak Chapel Hart, this trio left the eccentric side of a performer to gain admirers for their music. In building their career, they started as influencers to score a critical hit in one's heart that neutralizes faith and alcohol's co-existence in one's body as something that won't forfeit salvation.
A post shared by Chapel Hart (@chapelhartband) on Sep 7, 2020 at 6:22am PDT
Country music has a broad history of being paired up with other genres of music, such as pop or rock, but Chapel Hart is one of the few who mixed Country with Gospel, and through that, they say a three-man band is made specifically for that purpose.
The Secret Behind the MV's Success
Chapel Hart also explained how smoothly the shoot went for their videos as all were simply there to participate. Be they celebrities or simply just someone who wanted to lend a hand into making their movement come to life, social status had no place during the shoot. They loved how the people involved in their project worked together without complaining or being prideful, and that's the secret behind the successful shoot of their music video.
Chapel Hart thanked ZZ Top's Billy Gibbons' appearance together with other celebrities like T. Graham Brown, Deborah Allen, and JD Shelburne for helping them to make the MV.
A post shared by Chapel Hart (@chapelhartband) on Sep 7, 2020 at 5:45pm PDT
Chapel Hart
Can We All Be "A Living Prayer?"
"Days of Thunder:" A Song of Summer Love and Younger Years
Remembering Daryle Singletary Through His Hit "I Let Her Lie"

redpajama_set_name: RedPajamaCommonCrawl


The regular annual meeting of the Radiology Section of Serbian Medical Society and the Institute of Radiology MMA was held at the MMA.
The Head of the Institute of Radiology MMA Prof. Dr Leposava Sekulovic introduced the gathering with the most important plans for the future period that was discussed about at the Section presidency and she announced lectures that would follow. As she stated, lectures that would deliver the MMA's physicians would remind the attendees of daily procedures in practice in order to be improved and harmonized in accordance with the latest research and published papers, as well as to share experiences.
During the meeting, it was also discussed about interventional nonvascular procedures in diagnostics and treatment, radiological diagnostics of magistral arteries of lower extremities, as well as about the contrast-induced nephropathy.


How does meditation change you? How do you deal with people who notice you're not engaging in their negative behaviours anymore? And how can you create a naturally positive brain? We answer all those questions and more!


Our staff is comprised of numerous seasoned professionals on both our business and clinical teams.
We utilize a registered nurse in every general anesthesia and IV sedation surgery for IV placement and airway and vitals monitoring. All of our nurses have over two decades of experience and are BLS certified….some are ACLS and PALS certified as well. It should be noted that registered nurses are not required in our specialty, but with patient safety and well-being as our first concern, we believe the additional level of expertise is warranted.
Our clinical assistants are a combination of both dental and medical assistants which we feel is perfect for our specialty as it is a combination of both of those worlds. There are two clinical assistants in each general anesthesia and IV sedation surgery and at least one in every local anesthesia surgery. We staff in this manner to make sure Dr. Smith is properly supported for the safe and meticulous performance of surgery.
The business team is made up of individuals bringing a variety of business and customer service backgrounds to the mix. They are well-versed in all aspects of the administrative side of an oral surgery practice including but not limited to scheduling, pre-authorization, insurance billing, analyzing an explanation of benefits, proper posting of payments, etc. Due to the longevity with the practice of many of the business team members, they are also incredibly knowledgeable of many of the clinical aspects of the practice as well.


Hi! Sign in to let us know how Hillbilly's Tease was?
by HannaDee08 at Citysearch Nov 10 .
I speant DAYS looking for the best deal on tee shirts. Hillbilly's Tease was the cheapest and had the smallest min. order. So I thought that they would be a great place to order shirts from. Boy was I wrong!!
First of all I gave them a 2 week window to make the shirts. I told them that I will be back to pick up the shirts the next friday or somehting. So they had pleanty of time. Well, I called on the desginated day to tell them that I was on my way to pick up the order. When I called, they told me that the shirts wern't in yet, and they hadn't even made the screen print. At this time I was furious!! They then went on to tell me that if I wanted the shirts by the next week that I would have to change the color of the tees. Since I was so p/o at this point I was like yea sure wat ever just get them printed!! My mom then called back Hillbilly's Tease later and they agreed that we would be able to pick up the shirts on Saturday.
So I we drove an hour out of our way on Saturday, just to find that the stupid place was CLOSED!!! We looked at their hours and found out that they wouldnt be open until Monday.
So that brings me to what happened today. I called today to see if they were ready and they told me that all the shirts were printed except the larges because they wernt in stock. They had to drive over to their other location to see if they had the shirts in stock. About 2 hours later we drove up their and I saw on the computer that they were putting the wrong logo on the shirts. I made them aware of the mistake and they just said, "well good thing we haven't started making the shirts yet!" Alright Now I was raging mad!! They told me this morning that they had them all printed excpet the larges!!!
They then went on to tell me that the shirts would be done and printed in an hour and of ccourse they wernt! We went back to get them at 4:30 and they were finally done.
They are good quality shirts and they look really nice but HillBilly's Tease is not worth your time.
If you've been to or used Hillbilly's Tease, leave a review.


An history of passion, devotion but above all a great love of our vineyards and their traditions. A company philosophy based on quality research, antique knowledge, centuries-old customs, respect of the earth and its balance with the most articulate knowledge of agriculture and wine production. These values work together to create a composite story of refined harmony which is timeless, telling the story as an old tale, as those the elderly used to tell to the young, in front of the fireplace during cold winter nights. This transmission of feelings depicts how attached they are to the earth and their traditions, respect for the generations past and future. This is where our world renowned masterpiece of wine production is born. Our vineyards are looked after with the utmost attention to the soil and equipment.
"Wine is made in the vineyard" is the antique saying of our forefathers.
And its with this spirit that we create wines like the red Oreno, it holds 5th place in the Top Hundred of the Wine Spectator magazine awarded worldwide, Vigna dell'Impero 1935, Vigna di Pallino and Crognolo. Whites like Anni and dessert wine such as Grisoglia.
Tenuta Sette Ponti extends over 330 hectares (of which 50 are vines) in Valdarno, in the suggestive heart of Tuscany, between Florence and Arezzo, an area at the foot of the mountain which were inhabited by the Romans and Etruscans from the 8th century. Tenuta Sette Ponti takes its name from the number of bridges over the Arno -seven in number- between these two Tuscan cities. The most famous of these, Buriano, on the border of the estate, was constructed between 1240 and 1277. In the background we can see two of Leonardo de Vinci's great masterpieces, "Gioconda" and "Madonna dei Fusi".
It has been one of the properties of the Moretti Cuseri family since the 50's, when the architect Alberto Moretti Cuseri, attracted by the hunting ground and the game (boar, fallow deer, pheasants, hares and rare yellow deer), bought the first 60 hectares directly from Princess Margherita and Maria Cristina di Savoia d'Aosta, daughters of Vittorio Emanuele III, King of Italy from 1900 to 1946. The two princesses, in their turn, had purchased the property from the Grand Duke Leopoldo d'Asburgo, to whom we can attribute the creation of the "Vigna di Pallino" at the early 19th – century.
Today our most antique vineyard dates back to 1935 and has always been called "Vigna dell'Impero", to remind us of the victory in the African war and the birth of Colonial Italian Empire with the conquest of Abissinia.
The vines were planted by S.A.R. Emanuele Filiberto di Savoia, Count of Turin, on request of his cousin, S.A.R. Amedeo d'Aosta, Vice King of Ethiopia, to celebrate and commemorate the Italian victory in Abissinia, naming it "Vigna dell'Impero". They are three terraced hectares, built completely by hand: from the beginning were used for the first plant barbatelle of Sangiovese, Malvasia, Trebbiano, Canaiolo e Colorino.
Many of the other vineyards in production, about 35 hectares, were planted in the 60's by Antonio Moretti Cuseri's father and other 25 hectares of new vineyards will soon be productive. These include not only the best clone of Sangiovese, but also many international varieties: Cabernet Sauvignon and Merlot.
Subsequently, other bordering grounds, partly to the family Boutourline-Young and partly to S.To.R. Amedeo of Savoia Duca d' Aosta, were purchased by Alberto Moretti Cuseri.
It was Antonio Moretti Cuseri, Alberto's son and a well-known entrepreneur in fashion and Italian style, who consolidated the strong vine vocation in Tenuta Sette Ponti and this area.
This territory had already been appreciated by Grand Duke Cosimo III de' Medici in distant 1716, writing that Valdarno di Sopra, in the province of Arezzo, and was considered one of the four most important wine producing areas in Tuscany.
Thanks to Antonio Moretti Cuseri's love of wines and vineyards, the labels which identifies Tenuta Sette Ponti are among the most prestigious in the world. Nowadays, the famous race of Chianina beef, from which the famous Fiorentina steak is made, and the renowned race pork, Cinta, for the production of cold meats. There are also an excellent production of extra virgin olive oil.


Ron Holland's beautifully designed Quarter Tonner.
Strawberry Duck, has been ashore in the boat yard at Bluepoint Marine, Liverpool, for a couple of years. She is in need of some work to make her seaworthy again, but the hull and decks are sound. The engine was refurbished shortly prior to her being taken out of the water. She has a small fixed bladed propeller with a rope cutter and an ebberspacher heater, which was working, when she was lifted into the yard.
she has 4 berths, a sea toilet and galley.
Her sails are older Austin Farrar, made from Dacron and in serviceable condition. However she has 2 spinnakers in excellent condition one with a Snuffer chute.
Once refurbished, she will be an exhilarating boat to sail. she would be a comfortable pocket cruiser. However her home should be in the Quarter Tonne revival fleet. Were you would have a competitive fun boat to race on a modest budget.


text:
Advertising the Plastic Bag Ban: How Kinney Drugs Turned an Inconvenience into a Celebration
New York State's plastic ban went into effect over the weekend, which prohibits the distribution of plastic carryout bags by certain retailers. Shoppers will be required to bring their own reusable bags to stores or opt for a carryout paper bag. Stores have had almost a year to prepare for this transition, while some retailers such as Wegmans have already made the switch. The situation has fueled customer frustration over the inconvenience, with many heated debates occurring on social media and blogging platforms about this new law.
Kinney Drugs, knowing that people would inevitably miss their iconic, durable orange bags, started planning for the transition months ago by creating a multi-tiered campaign dedicated to retiring the beloved bags.
Elements included:
Customer Involvement: Kinney customers were asked to share pictures, poems, stories…anything they felt would act as a proper good-bye. In return, Kinney received over 1,500 submissions. Stories and photos poured in detailing how bags were reused in the home, and a few people shared how they crafted the bags into new items like hats and braided rugs.
In-Store Celebrations: Every Kinney store in NY State celebrated with a retirement party over the weekend. Festivities included cake, a Kinney bag signed by employees, and a free reusable tote (with a $10 purchase).
Media Support: The celebration was supported by radio, social media, and display campaigns, reminding people of the retirement date and in-store festivities. Becky Bubel, President of Kinney Drugs, and Judy Cowden, Senior Director of Marketing and Advertising, were even invited on WSYR's morning show Bridge Street to share details of the event.
Photos from the eventful weekend:
Social media posts featuring the in-store celebrations
Kinney Drugs bag cake, provided by a local Gouverneur, NY bakery
The Kinney Drugs team on WSYR's Bridge Street morning program
Judy Cowden, Senior Director of Marketing and Advertising, shows off a framed Kinney bag ready to be signed by store employees
Retirement gift from Wahl Media
We at Wahl Media wish the orange Kinney bag a very happy retirement. It's certainly well deserved!


text:
Home > ETDs 2020- > 339
Electronic Theses and Dissertations, 2020-
Chemometric Analysis of Multidimensional Fluorescence Data Recorded from Benzo[a]pyrene Metabolites in Shpol'skii Like Matrixes
Mohammadreza Chehelamirani, University of Central Florida
This dissertation extends the application of Shpol'skii spectroscopy to polar metabolites in polar organic solvents. For the first-time, we reported experimental evidence on the line-narrowing effect caused by primary alcohols on the spectral features of PAH metabolites at 77 K and 4.2 K. The effect of primary alcohols (RCH2OH) on the 77 K and 4.2 K fluorescence characteristics of PAH metabolites showed the best spectral narrowing when matching the length of the alkyl group (R) of the primary alcohol to the length of the n-alkane that best fitted the dimensions of the parent PAH. The spectral narrowing and the fluorescence enhancements observed for 1-hydroxypyrene, 2-hydroxyfluorene, 9-hydroxyphenanthrene, 3-hydroxybenzo[a]pyrene , 4-hydroxybenzo[a]pyrene , 5-hydroxybenzo[a]pyrene , B[a]P-trans-7,8-dihydrodiol (±), B(a)P-trans-9,10-dihydrodiol (±), B[a]P-r-7,t-8-dihydrodiol-c-9,10-epoxide(±) (syn-BPDE), and B[a]P-r-7,t-8-dihydrodiol-t-9,10-epoxide(±) (anti-BPDE) demonstrated the potential for the qualitative and quantitative analysis of PAH metabolites at trace concentration levels. The obtained enhancements for B[a]P metabolites provided limits of detection varying from 0.1 ng.mL-1 (anti-BPDE (±)) to 0.8ng.mL-1 . Since B[a]P is the most toxic PAH in EPA list, four B[a]P metabolites were selected for chemometric studies. These included 1-Hydroxybenzo[a]pyrene, Benzo[a]pyrene-cis-4,5-dihydrodiol, Benzo[a]pyrene-r-7, t-8, t-9, c-10-tetrahydrotetrol (+/-) and Benzo[a]pyrene-r-7, t-8, t-9, t-10-tetrahydrotetrol (+/-). In all cases, 1-octanol was used as the Shpol'skii matrix. MCR-ALS, UPLS/RBL, and PARAFAC were tested for multi-way calibration purposes. These algorithms carry with them the higher order advantage, which refers to their ability to perform a "mathematical" separation, identification, and quantitation of analytes in complex samples with chemically unknown composition. Three-way data formats consisted of 77 K EEMs recorded with the spectrofluorimeter. Four-way data formats were 4.2 K TREEMs recorded with the instrumental system built in-house. In both cases, the best prediction abilities were obtained with PARAFAC. This algorithm was able to provide accurate determinations at the parts-per-billion concentration levels.
Campiglia, Andres
Chehelamirani, Mohammadreza, "Chemometric Analysis of Multidimensional Fluorescence Data Recorded from Benzo[a]pyrene Metabolites in Shpol'skii Like Matrixes" (2020). Electronic Theses and Dissertations, 2020-. 339.
https://stars.library.ucf.edu/etd2020/339


text:
Q: Cannot send ajax request with cordova I started new project and added code for request. My js file looks like this:
(function () {
"use strict";

document.addEventListener( 'deviceready', onDeviceReady.bind( this ), false );

function onDeviceReady() {

    $.ajax({
        type: "GET",
        url: "http://api.vk.com/method/database.getCountries?v=5.5&need_all=0",
        crossDomain: true,
        success: function (response) {
            alert('Works!');
        },
        error: function (data) {
            console.log(data);
            alert('Not working!');
        }
    });

    // Handle the Cordova pause and resume events
    document.addEventListener( 'pause', onPause.bind( this ), false );
    document.addEventListener( 'resume', onResume.bind( this ), false );

    // TODO: Cordova has been loaded. Perform any initialization that requires Cordova here.
    var parentElement = document.getElementById('deviceready');
    var listeningElement = parentElement.querySelector('.listening');
    var receivedElement = parentElement.querySelector('.received');
    listeningElement.setAttribute('style', 'display:none;');
    receivedElement.setAttribute('style', 'display:block;');
};

function onPause() {
    // TODO: This application has been suspended. Save application state here.
};

function onResume() {
    // TODO: This application has been reactivated. Restore application state here.
};
})();

But it didn't work at all. It always returns "Not working". I've tried other ways to send request but always get an error.
Please, help!

A: Cordova 5.0 blocks external http requests by default.
Try adding cordova-plugin-whitelist to your project.
And rebuild your app still issue persist. Do one of following:
1) set following herder in your response service:
header('Content-Type: application/json');
header('Access-Control-Allow-Origin: *');

2) Add this line to config file -:
<access origin="*" />

3) additionally to the whitelisting, make sure the cors flag is true to enable cross origin resource sharing.
$.support.cors=true;

4) You can follow this $.getJSON for make request instead of ajax.
Hope it will help you.

redpajama_set_name: RedPajamaStackExchange


A slate roof is the perfect combination of durable practicality and visual appeal using only the best materials!
High standards combined with over 30 years experience makes D Evans Roofing LTD the ideal choice for replacement tiling, emergency roof repairs and roofing extensions. Our experienced and professional roofing contractors are fully trained and qualified.
We specialise in all manner of roofs including pitched tiling roofs, flat roofs and slate roofs. We can also repair or replace guttering, fascias and soffits and install insulation in the loft space or roof area. Why not add some value to your home by enhancing the roofing using our experts.
Our commercial clients include the Queen Elizabeth Hospital and the prestigious Birmingham Mint as well as Raybone Developments. Specialist services on offer are chimney stacks of all shapes and size, flues and guttering. Flat roofs require waterproofing and weather proofing and we can ensure that your roof will last for many years. If you want to find good roofing in Birmingham, look at the D Evans Roofing LTD services.
With no call out charge and our ability to get to you throughout Birmingham, whether you're a business or a homeowner, why not give us a call today?
The best service is available at D Evans Roofing LTD so if an emergency repair is needed you can be sure that this is the best business to call. In addition, you can rely on D Evans Roofing LTD to carry out the highest quality work at a very competitive cost. Do not risk your premises by engaging 'cowboys'. D Evans Roofing LTD will undertake both small and large contracts and every client is treated to our exceptional high standards of work with a guarantee. Just look at the website for testimonials from satisfied customers who have searched for good Birmingham roofers.
This is the best local family run business for roofing repairs in the Birmingham area.
call David's direct mobile on 07788251438.
A comprehensive list of the services we offer, from New Roofs to Emergency Repairs.
Read what previous clients have said about the quality of our D Evans Roofing LTD workmanship.
Gret work by D Evans Roofing Limited and affordable too. I was quite worried about the cost it was going to be, but they provided me with the best qoute (and trust me I had done some fishing about). Would highly recommend!
Whether you're planning ahead for a new roof or fascia, or you're caught in an emergency that you need help with, use the contact details below to get in touch.


text:
Liam's wish...
"I wish to be a guard at Buckingham Palace"
10 years old, Wolverhampton
Donate to wishes like Liam's
Ten-year-old Liam from Bilston, near Wolverhampton has sickle cell anaemia and wished to be a guard at Buckingham Palace and to meet the Queen. Wishgranter Dawn got straight onto organising his wish, but despite all her best efforts, Her Majesty was not available! However, with the help of The Coldstream Guards and the British Army, she did organise a truly unique wish for Liam and a day to remember.
Liam's story
Liam spent many years of his childhood living with sickle cell disease, which affects the red blood cells. He was often very tired, in pain at times and at an increased risk of catching infections.
In 2016, Liam had a successful stem cell transplant. His recovery was slow but he gradually started to feel stronger.
"Two years ago I was in hospital undergoing my transplant and two years later here I am now strong and fit in Buckingham Palace being a guard."
Liam, Wish child
Liam's wish
Liam's wish took place on one of the hottest days of the year! He arrived – dressed in his special uniform – alongside his younger brother, Milan, and his mum.
They were met by Lt. Tom Melville from the Coldstream Guards who are based at Wellington Barracks, just moments away from Buckingham Palace.
Liam and Milan were treated like VIPs and were even allowed to try on the real bearskin hats worn by the guards.
The changing of the guard starts inside the grounds of the barracks and after watching this at close-hand, Liam marched alongside Lt. Melville to the gates of Buckingham Palace.
The streets were lined with tourists and visitors.
"Walking through the crowd with an officer made me feel very special."
Liam and his family were granted special access inside the gates of the Palace. They had the best view in the house and were able to watch the ceremony close-up and with a personal commentary by Lt. Melville.
Afterwards, the family took the same route that the guards had marched, along the red-paved Mall outside the Palace.
Liam said: "It's like I'm retracing the Guard's steps." He felt like a VIP with all the visitors taking photos of him as he walked by.
Back at the barracks, Liam met the Garrison Commander, Lt. Col. Jimmy Duggan, who asked Liam to sign their visitor's book for very important people, including royalty from all over the world.
Then he and his family enjoyed lunch at the officer's mess and heard all about life as a soldier.
Liam recalls: "My favourite part of the day was having lunch with the Garrison Commander and talking to him about how great the day had been so far."
After lunch, Liam was presented with some special gifts from the Garrison Commander including a custom-made Guard's waistcoat, with badges from the foot guard's regiments and a Coldstream Guards' flag.
How Liam's wish helped
Liam's wish built up his confidence and gave him an insight into life in the Armed Forces – something he's interested in exploring in the future.
Lt. Col. Duggan said: "To look at Liam, I see a fine, healthy, young man who has clearly gone through a difficult time. He's very confident, has a fabulous future ahead of him and I hope, is a budding Guardsman of the future. He's been a pleasure to host all day."
At the end of his wish Liam said, "One day I hope the Queen will appreciate me being a guard for her."
We'd like to say a special thank you to everyone at The Coldstream Guards and The British Army who helped to make Liam's wish a wonderful reality.
Please take a second to share this wish:


text:
Q: IMDb web scrapping errors: AttributeError: 'NoneType' object has no attribute 'text' and ValueError: All arrays must be of the same length I am practicing web scraping of movie data from IMDb. for each movie, I want to extract and save on a dataframe: movie title, year, age rating (PG), rating, number of votes, stars/casts, and description. however, I've been stuck because of these couple of errors:
AttributeError: 'NoneType' object has no attribute 'text'
ValueError: All arrays must be of the same length

my code:
from requests import get
url = 'https://www.imdb.com/search/title/?user_rating=6.9,10.0&adult=include&count=250'
response = get(url)

from bs4 import BeautifulSoup
html_soup = BeautifulSoup(response.text, 'html.parser')

movie_containers = html_soup.find_all('div', 'lister-item mode-advanced')

first_movie = movie_containers[0]

first_movie_name = first_movie.h3.a.text
first_movie_name
first_movie_year = first_movie.h3.find('span', 'lister-item-year text-muted unbold')
first_movie_year.text
first_movie_PG = first_movie.find('span', 'certificate')
first_movie_PG.text
first_movie_rating = float(first_movie.strong.text)
first_movie_rating
first_movie_votes = first_movie.find('span', attrs = {'name':'nv'})
first_movie_votes.text
first_movie_genre = first_movie.find('span','genre')
first_movie_genre.text
first_movie_runtime = first_movie.find('span', 'runtime')
first_movie_runtime.text
first_description = first_movie.find_all('p', {"class":"text-muted"})[1].text.strip()
first_description
first_stars = [s.text for s in first_movie.select('a[href*="name"]')]
first_stars

#storing scraped data in list

movie_title = []
year = []
age_rating = []
movie_genre = []
imdb_rating = []
votes = []
movie_casts = []
movie_description = []

#extracting data from individual movie container

for container in movie_containers:
    name = container.h3.a.text
    movie_title.append(name)

    year = container.h3.find('span', 'lister-item-year text-muted unbold').text
    year+year

    age_rating = container.find('span', 'certificate').text
    age_rating+age_rating

    genre = container.find('span','genre').text
    movie_genre.append(genre)

    rating = float(container.strong.text)
    imdb_rating.append(rating)

    votes = container.find('span', attrs = {'name':'nv'}).text
    votes+votes

    casts = [s.text for s in container.select('a[href*="name"]')]
    movie_casts+casts

    description = container.find_all('p', {"class":"text-muted"})[1].text.strip()
    movie_description.append(description)

this is where i got the first error:
AttributeError                            Traceback (most recent call last)
Input In [46], in <cell line: 12>()
     16 year = container.h3.find('span', 'lister-item-year text-muted unbold').text
     17 year+year
---> 19 age_rating = container.find('span', 'certificate').text
     20 age_rating+age_rating
     22 genre = container.find('span','genre').text

AttributeError: 'NoneType' object has no attribute 'text'

then i decided to comment the lines 19 and 20 where the error seem to be coming from and proceeded with the following code:
# creating movie dataframe

import pandas as pd
movie_df = pd.DataFrame({'movie':movie_title,
                        'year of production':year,
                        'imdb rating':imdb_rating,
                        'number of imdb votes':votes,
                        'genre':movie_genre,
                        'casts':movie_casts,
                        'movie description':movie_description
                       })
movie_df = pd.DataFrame.from_dict(movie_df, orient='index')
print(movie_df)

and this is where i got the second error:
ValueError                                Traceback (most recent call last)
Input In [47], in <cell line: 2>()
      1 import pandas as pd
----> 2 movie_df = pd.DataFrame({'movie':movie_title,
      3                         'year of production':year,
      4                         'imdb rating':imdb_rating,
      5                         'number of imdb votes':votes,
      6                         'genre':movie_genre,
      7                         'casts':movie_casts,
      8                         'movie description':movie_description
      9                        })
     10 movie_df = pd.DataFrame.from_dict(movie_df, orient='index')
     11 print(movie_df)

File ~\Anaconda3\lib\site-packages\pandas\core\frame.py:636, in DataFrame.__init__(self, data, index, columns, dtype, copy)
    630     mgr = self._init_mgr(
    631         data, axes={"index": index, "columns": columns}, dtype=dtype, copy=copy
    632     )
    634 elif isinstance(data, dict):
    635     # GH#38939 de facto copy defaults to False only in non-dict cases
--> 636     mgr = dict_to_mgr(data, index, columns, dtype=dtype, copy=copy, typ=manager)
    637 elif isinstance(data, ma.MaskedArray):
    638     import numpy.ma.mrecords as mrecords

File ~\Anaconda3\lib\site-packages\pandas\core\internals\construction.py:502, in dict_to_mgr(data, index, columns, dtype, typ, copy)
    494     arrays = [
    495         x
    496         if not hasattr(x, "dtype") or not isinstance(x.dtype, ExtensionDtype)
    497         else x.copy()
    498         for x in arrays
    499     ]
    500     # TODO: can we get rid of the dt64tz special case above?
--> 502 return arrays_to_mgr(arrays, columns, index, dtype=dtype, typ=typ, consolidate=copy)

File ~\Anaconda3\lib\site-packages\pandas\core\internals\construction.py:120, in arrays_to_mgr(arrays, columns, index, dtype, verify_integrity, typ, consolidate)
    117 if verify_integrity:
    118     # figure out the index, if necessary
    119     if index is None:
--> 120         index = _extract_index(arrays)
    121     else:
    122         index = ensure_index(index)

File ~\Anaconda3\lib\site-packages\pandas\core\internals\construction.py:674, in _extract_index(data)
    672 lengths = list(set(raw_lengths))
    673 if len(lengths) > 1:
--> 674     raise ValueError("All arrays must be of the same length")
    676 if have_dicts:
    677     raise ValueError(
    678         "Mixing dicts with non-Series may lead to ambiguous ordering."
    679     )

ValueError: All arrays must be of the same length

I understand the second error is because the length of the lists are not the same so I typed the following code to check the length of each list
print(len(movie_title), len(year), len(movie_genre), len(imdb_rating), len(votes), len(movie_casts), len(movie_description))

and got the output:
250 8 250 250 6 0 250

going through the website, I realize that each movie has 'year', 'votes' and 'stars' so why am I getting 8, 6, and 0 respectively instead of 250 for each?
any idea how I can solve these errors?
thanks


With Black Friday and Cyber Monday right around the corner, you're probably wondering how best to capitalize on the massive seasonal sales. This week we've got a quick guide to using Black Friday updates to get your store in the best shape possible.
For most of these steps, it's helpful to have a second set of eyes. Consider asking a friend or a fellow entrepreneur to take a look at your store as you work and get their opinions on the different elements.
You'll want to start by going over the copy and imagery on your whole site, but especially on landing pages and in product pages.
Landing pages are your initial introduction to potential customers and need to be instantly engaging and seductive. Remember that you have limited time and space to prove that your site is reputable and that your products are quality. Go through your copy and look for over-the-top, hyperbolic language (i.e. "the miracle plant") and ask yourself whether you would make a purchase from a similar site. Look at your imagery as well. Is the page too busy? Does it have enough visual elements to be eye-catching?
Tell your customers a story- how is the product made? why is it done this way? what is the philosophy behind your business?
Once these pages are in good shape, have a friend go through and explore your offerings. A second set of eyes can be a great way to see how your store appears to someone exploring it for the first time.
Your store should be as user-friendly and easy to navigate as possible. Go through your categories and take a look at what's contained within them. Do all of the products contained in each subset make sense in their current location? Test all the links in your store to make sure that they're working properly.
If you don't already have an FAQ section, now is a great time to make one. This way you can minimize questions and help customers solve their problems quickly and efficiently. Remember: the less friction in the buying process, the better your conversion rate.
Call-to-action colors—or specific visual elements you only use for buy buttons and other actions—can be a great way to help users navigate your site with minimal effort. Choose a color that matches the rest of your branding but stands out enough to be instantly recognizable.
Finally, test-buy a product from beginning to end. While you'll want to ideally collect some information in the sales process (more on that later) this process should be as streamlined and simple as possible.
This probably goes without saying. The trick here is to use a range of platforms to connect with your audience and remind them that great deals are just a click away. Use your social media and email list to connect with as many potential customers as possible. Consider offering discounts for returning shoppers.
Specific discounts and deals for the holiday are another important aspect of a successful Black Friday and Cyber Monday. Remember that free or reduced shipping costs are a big deal for many consumers, and the number one cause of cart abandonment is extra costs like shipping and taxes being too high. If you can feasibly offer a deal on shipping, do it.
If you have a blog, create some content related to your upcoming sale. This can be as simple as exploring your products in a little extra detail or collecting positive reviews that you've received. Share your posts on social and encourage engagement.
Don't sell and say goodbye- instead, build relationships and repeat business to sustain you over time. Done right, your sales at this point in the year will be rocketfuel for your business.
Essentially, the key to success will be turning your first-time customers into returning customers, and your returning customers into engaged fans of your brand. The most important step here is gathering emails for your list. Luckily, this isn't tough to do in the checkout process.
From here, you can connect with your audience over time. Offer them discounts, unique content, and rewards for sharing your products. While Black Friday and Cyber Monday are perfect days to offer sales, it is important to find the right balance between tempting and spoiling your customer base with deals and discounts, so check out this essential guide to using them effectively. The repeat business you can generate from a successful business will be absolutely vital over time, so spend time crafting your communications and bargains after Cyber Monday. With even more holidays following close on the heels, you have a chance to engage with these customers again and draw them back for Christmas, Hanukkah, and maybe even New Years.
Ready for a successful sale? Let us know your tips and tricks for making it into the black this holiday season.
When you test-buy a product, should I do, or someone else?
Hi Naomi, thanks for your insightful comment! Ideally, you'll want to go through yourself and test-buy a product, from start to finish. Usually, there are no issues, but always good just to do a test, especially when you're incorporating coupon codes or discounted prices. Once everything is good to go, it doesn't hurt to ask a friend or team member to check the process out as well! The more certain you can be, the better. Thanks for checking out FounderU, and have a happy holiday selling season!


6 Bombardier Dash 8-Q200 Turboprops.
Scheduled Airline headquartered in Bogotá, Colombia. Formerly known as Aires.
In late 2011, the airline was purchased by LAN Chile and was rebranded LAN Colombia, within the LAN Group. Thereafter fleet changed to Airbus A320s from B737s.
* Prefer Colombian National Pilots / Pilot Licenses.


Ohh boy! Seeds arrived, been wanting to grow these for a while. Three each of Durban Poison, and Jack Herer, one freebie each of Triple Cheese, Critical Orange Punch, and my most coveted Franco's Lemon Cheese. Now I have two Franco's.


text:
Neurological Complications of HIV
HIV (human immunodeficiency virus) is the virus that causes AIDS (acquired immune deficiency syndrome). HIV weakens and slowly breaks down the body's immune system. That leaves you vulnerable to deadly complications from an infection or certain cancers.
As HIV and AIDS battle your immune system, your central nervous system is also affected. HIV and AIDS both cause a number of neurological problems, also known as complications, in your nervous system. That's particularly the case if HIV progresses to AIDS, which occurs in the most advanced stages of HIV.
Today, antiretroviral medicines—when taken as directed—help to slow down the progression of HIV. They also help to slow the start of or to lower the risk for AIDS. Controlling HIV can also lower your risk for neurological complications of HIV.
What causes neurological complications of HIV?
HIV doesn't seem to take over the cells in your nervous system. But it does cause major inflammation in the body. This inflammation can harm the spinal cord and brain. It can also stop your nerve cells from working the way that they should.
Neurological problems may result not only from damage caused by the virus itself. But they can also happen from other side effects of HIV and AIDS, such as cancers, that are tied to these diseases. Some of the drugs used to treat HIV and AIDS can also cause neurological problems. In addition, certain genetic factors can influence the risk for neurological side effects from HIV medicines.
Neurological problems don't often set in until HIV is advanced, typically when someone has AIDS. About half of adults with AIDS suffer from neurological problems linked to HIV.
What are the symptoms of neurological complications of HIV?
HIV can cause many health problems that affect the nervous system and result in neurological complications. Some of these health problems include:
Dementia. When HIV becomes very advanced, HIV-associated dementia or AIDS dementia complex can happen. These disorders impair cognitive function. This means that you may have trouble thinking, understanding, and remembering. This type of dementia can be life-threatening. It can often be prevented when antiretroviral medicines are taken the right way.
Viral infections. HIV can raise your risk for several viral infections that strike the nervous system. Cytomegalovirus infections can impair cognitive function and physical control (like the use of legs and arms and bladder control). They can also affect eyesight, hearing, and your respiratory system, causing problems like pneumonia. People with AIDS are also likely to get a herpes virus infection, like shingles, and inflammation in the brain and spinal cord. The condition progressive multifocal leukoencephalopathy (PML) is also caused by a virus. PML is aggressive and dangerous. In some cases, it can be controlled with antiretroviral medicines.
Fungal and parasitic infections. Cryptococcal meningitis is caused by a fungus. It leads to serious inflammation of the spinal cord and brain. A parasite can cause an infection called toxoplasma encephalitis. It often leads to confusion, seizures, and very painful headaches. Both of these infections can be deadly.
Neuropathy. This is most common in people with advanced HIV. The virus causes damage to nerves throughout the body, resulting in major pain or weakness.
Vacuolar myelopathy. This health problem occurs when tiny holes develop in the fibers of the nerves of the spinal cord. It causes trouble walking, particularly as it gets worse. It's common in people with AIDS who aren't getting treatment and also in children with HIV.
Psychological conditions. People with HIV or AIDS often develop anxiety disorders. They may suffer from depression. They may also have hallucinations and major changes in behavior.
Lymphomas. Tumors called lymphomas often strike the brain of people with HIV. They're often related to another virus, like the herpes virus. Lymphomas can be deadly. But good management of HIV can make treating lymphomas more successful.
Neurosyphilis. If an HIV-infected person also has syphilis that goes untreated, it can quickly worsen and harm the nervous system. It can cause the nerve cells to break down. It can lead to eyesight and hearing loss, dementia, and walking problems.
Once HIV starts affecting your immune system and health problems develop, various neurological symptoms can appear such as:
Sudden forgetfulness or confusion
Feeling of weakness that keeps getting worse
Changes in behavior
Problems with balance and coordination
Changes in your eyesight
Wide swings in your heart rate or blood pressure
Diarrhea or loss of bladder control
A loss of feeling in your legs or arms
Mental health problems like anxiety and depression
How are neurological complications of HIV diagnosed?
While a blood test can diagnose HIV and AIDS, a number of other tests are needed to look at the different parts of the nervous system and diagnose neurological problems. Tests often include:
An electromyography and nerve conduction study to measure the electrical activity of the muscles and nerves.
Biopsy to analyze a sample of tissues and to help find tumors in the brain or inflammation in the muscles.
Magnetic resonance imaging (MRI), which uses radio waves and strong magnets to image the brain structures. This is the most powerful conventional imaging tool. It can spot brain inflammation, many infections, tumors, strokes, and tissue destruction within the brain and spinal cord.
Sample of cerebrospinal fluid to look for infections, bleeding, or other problems affecting the spinal cord or brain.
CT scan, which uses X-rays to reconstruct a 3-D picture of the brain. This test is faster and less expensive. But it gives less detail than an MRI scan.
How are neurological complications of HIV treated?
Antiretroviral medicines are used to stop HIV from replicating and spreading throughout the body. They are also used to help lower the risk that it will cause damage to the nervous system.
Specific neurological conditions and complications are treated differently. Cancer may be treated with chemotherapy and radiation. Bacterial infections need antibiotics. Certain medicines may help with viral infections or nerve pain. Counseling and medicines, including antidepressants, may be used to handle some of the mental health problems linked to HIV.
How can I prevent neurological complications of HIV?
Following all of your healthcare provider's recommendations, especially taking all antiretroviral medicines exactly as told, can help control HIV and prevent it from getting worse. Suppressing the virus with medicines can help prevent damage to the body, including nervous system damage and neurological problems.
How do I manage neurological complications of HIV?
Living a healthy lifestyle can help you better control HIV and prevent the progression to AIDS. Vital steps in handling HIV are:
Eating a healthy diet
Maintaining a healthy body weight
Exercising regularly
Practicing safe sex
Not using illicit IV drugs
Following your medicine plan
Medicine, Infectious Disease
AIDS Institute and CFAR
AIDS-Related Cancers
AIDS-Related Lymphoma in Children
Darunavir oral suspension


If you are under continual stress at work or you feel like life is "pressing down" on you and it's beginning to affect your health and well-being, it may be time to step back and assess your situation.
If you feel empty, apathetic or unhappy and just don't care anymore, you may be burnt out. If you lack motivation to go to work, feel trapped or just simply lack desire or drive when it comes to your work—it might be time to re-evaluate your future.
What causes stress and/or burnout on the job?
Do you work long hours and never seem to catch up? Do you always have too much work to do and never enough time? Is this self-imposed or workplace imposed?
Are you always asked to take on more and more at work? Does this increase in responsibilities usually include additional support staff? Are you required to work long hours to complete your tasks, frequently working more than 40 hour weeks?
Do you feel that your boss is always looking over your shoulder, telling you how or when to do things? Do you feel that you are not trusted to make decisions on your own?
Do you have a job that requires little thought and creativity, one that rarely changes and offers little challenge? Do you like what you are doing?
Do you love your work? Do you look forward to going to work each day? Does it make your heart sing?
Have you worked for the company forever and feel safe and secure and don't want to take risks? You may have a long history of loyalty to a company, but are no longer receiving expected promotions or raises so don't feel as valued which can result in burnout or apathy.
Are you consumed by your job, so that your job goes home with you?
You take work home with you and once the family is taken care of, you jump back into hours of work to stay caught up. You may even fall asleep thinking about work and have little joy or no real outside life.
Do you work in an oppressive environment?
Do you have problems either with difficult, disrespectful or harassing boss or co-workers? Is your manager unrealistic and unsupportive? Are there strict company rules that allow for no creativity or individual expression?
If any of the above ring true for you, there are many things you can to do adjust or correct the situation so you can begin to live a life you desire vs one you feel stressed or burned out in.
Manage your stress with exercise. Exercise is one of the great stress-reducers; anything that gets your heart rate up. Walking, jogging or aerobics for higher intensity. Or try yoga or deep-breathing exercises are also great ways to reduce stress.
Take up a new hobby: Or put some time into an old one. By committing time to doing something you love, you will feel happier and have more satisfaction in your daily life. And if you do this by attending classes or joining a social community or group, it adds even more fun to the activity because it is always more fun with others. You will find it will motivate you even more to get out and do it on a regular basis.
Find what's right. When a person looks for and finds what is right in their work environment and focuses on that, it can change their perspective and outcomes. Trust your inner voice. If your work environment is causing the stress, you may consider looking for a new position elsewhere; whether it be at a new company, in a different department or in a different industry all together.
Refuse to take work home with you. Leave it at the door. When you go home, be present at home. This takes practice if it has become a habit. You have to consciously tell yourself no when you begin to pack up at the end of the day.
Change jobs. If you feel trapped or unhappy in your job, you don't have to be there. No matter how old you are, you can still change careers. You can start today, while you are still working in your current job. You can begin to prepare yourself for a career or job transition. I can promise you that once you begin taking steps towards a new career, you will find yourself infused with new vigor.
Hire a career coach. A good career coach can help you determine what your true gifts are, what will make your heart sing and how to prepare for that transition, even if it is polar opposite from what you do today. They can help you with tools for presenting yourself in a way so that employer can see the advantages of hiring you. They can also help you feel confident in the interviewing process and will advise you on what to look for and what questions to ask, so you know you are getting into a new environment that you will love.


text:
2023 VIP Savings Card (NEW)
Get discounts and special offers in El Paso, Texas for a whole year!
Accepted at over 1,000 local businesses in El Paso, Juarez and Las Cruces. The VIP Card has been a well known program in our community since 2010. Schools, families, and businesses of El Paso love our awesome discount program!
The VIP Card is a simple to use discount program. Your card can be used for an unlimited amount of times before its expiration date. Same concept as a coupon, but in a card! Follow these steps:
Buy your VIP Card.
Visit any of our 1,000+ VIP businesses in El Paso, Las Cruces, and Cd. Juarez (Listed on our site and online magazine).
Just show your VIP Card at checkout. (No swiping, no PIN, nada!)
Get a discount on your purchase.
Repeat steps 2 - 4 for the rest of the year!
IT'S THAT EASY! Just show your card, and get a discount!
The VIP Card is a benefit to our local community. Buy purchasing your card, you are helping the small businesses in our city, you are helping schools and non-profits raise money, and you've helped yourself save big for the rest of the year, a win-win for everyone!
VIP Savings is a small local business. Established in 2009, family owned and operated. We're proud of the major contributions we've made to all the independent school districts, nonprofits, and small businesses in our great city. Over $3 million dollars raised for schools and nonprofits!
From our family to yours we greatly appreciate your support for our community and our fundraisers. We love you El Paso!


text:
import os
import bson
import time
import logging
import datetime
import functools

import furl
from dateutil.parser import parse as parse_date

from modularodm import fields, Q
from modularodm import exceptions as modm_errors

from framework.auth import Auth
from framework.mongo import StoredObject
from framework.analytics import get_basic_counters

from website.models import NodeLog
from website.addons.base import AddonNodeSettingsBase, GuidFile

from website.addons.osfstorage import logs
from website.addons.osfstorage import errors
from website.addons.osfstorage import settings

logger = logging.getLogger(__name__)

oid_primary_key = fields.StringField(
    primary=True,
    default=lambda: str(bson.ObjectId())
)

def copy_file_tree_stable(tree, node_settings):
    """Copy file tree, recursively creating stable copies of its children.

    :param OsfStorageFileTree tree: Tree to copy
    :param node_settings: Root node settings record
    """
    children = filter(
        lambda item: item is not None,
        map(
            lambda child: copy_files_stable(child, node_settings),
            tree.children
        )
    )
    clone = tree.clone()
    clone.children = children
    clone.node_settings = node_settings
    clone.save()
    return clone

def copy_file_record_stable(record, node_settings):
    """Copy stable versions of an `OsfStorageFileRecord`. Versions are copied
    by primary key and will not be duplicated in the database.

    :param OsfStorageFileRecord record: Record to copy
    :param node_settings: Root node settings record
    :return: Cloned `OsfStorageFileRecord` if any stable versions were found,
        else ``None``
    """
    versions = [
        version for version in record.versions
        if not version.pending
    ]
    if versions:
        clone = record.clone()
        clone.versions = versions
        clone.node_settings = node_settings
        clone.save()
        return clone
    return None

def copy_files_stable(files, node_settings):
    if isinstance(files, OsfStorageFileTree):
        return copy_file_tree_stable(files, node_settings)
    if isinstance(files, OsfStorageFileRecord):
        return copy_file_record_stable(files, node_settings)
    raise TypeError('Input must be `OsfStorageFileTree` or `OsfStorageFileRecord`')

class OsfStorageNodeSettings(AddonNodeSettingsBase):

    file_tree = fields.ForeignField('OsfStorageFileTree')

    def copy_contents_to(self, dest):
        """Copy file tree and contents to destination. Note: destination must be
        saved before copying so that copied items can refer to it.

        :param OsfStorageNodeSettings dest: Destination settings object
        """
        dest.save()
        if self.file_tree:
            dest.file_tree = copy_file_tree_stable(self.file_tree, dest)
            dest.save()

    def after_fork(self, node, fork, user, save=True):
        clone, message = super(OsfStorageNodeSettings, self).after_fork(
            node=node, fork=fork, user=user, save=False
        )
        self.copy_contents_to(clone)
        return clone, message

    def after_register(self, node, registration, user, save=True):
        clone, message = super(OsfStorageNodeSettings, self).after_register(
            node=node, registration=registration, user=user, save=False
        )
        self.copy_contents_to(clone)
        return clone, message

class BaseFileObject(StoredObject):

    path = fields.StringField(required=True, index=True)
    node_settings = fields.ForeignField(
        'OsfStorageNodeSettings',
        required=True,
        index=True,
    )

    _meta = {
        'abstract': True,
    }

    @property
    def name(self):
        _, value = os.path.split(self.path)
        return value

    @property
    def extension(self):
        _, value = os.path.splitext(self.path)
        return value

    @property
    def parent(self):
        parents = getattr(self, '_parent', None)
        if parents:
            assert len(parents) == 1
            return parents[0]
        return None

    @property
    def node(self):
        return self.node_settings.owner

    @classmethod
    def parent_class(cls):
        raise NotImplementedError

    @classmethod
    def find_by_path(cls, path, node_settings, touch=True):
        """Find a record by path and root settings record.

        :param str path: Path to file or directory
        :param node_settings: Root node settings record
        :param bool touch: Handle expired records
        """
        try:
            obj = cls.find_one(
                Q('path', 'eq', path) &
                Q('node_settings', 'eq', node_settings._id)
            )
            if touch:
                obj.touch()
            return obj
        except (modm_errors.NoResultsFound, modm_errors.MultipleResultsFound):
            return None

    @classmethod
    def get_or_create(cls, path, node_settings, touch=True):
        """Get or create a record by path and root settings record.

        :param str path: Path to file or directory
        :param node_settings: Root node settings record
        :param bool touch: Handle expired records
        """
        obj = cls.find_by_path(path, node_settings, touch=touch)
        if obj:
            return obj
        obj = cls(path=path, node_settings=node_settings)
        obj.save()
        # Ensure all intermediate paths
        if path:
            parent_path, _ = os.path.split(path)
            parent_class = cls.parent_class()
            parent_obj = parent_class.get_or_create(parent_path, node_settings)
            parent_obj.children.append(obj)
            parent_obj.save()
        else:
            assert node_settings.file_tree is None
            node_settings.file_tree = obj
            node_settings.save()
        return obj

    def touch(self):
        """Check whether the current object is valid. By default, always return
        `True`.
        """
        return True

    def get_download_count(self, version=None):
        """Return download count or `None` if this is not a file object (e.g. a
        folder).
        """
        return None

    def __repr__(self):
        return '<{}(path={!r}, node_settings={!r})>'.format(
            self.__class__.__name__,
            self.path,
            self.node_settings._id,
        )

class OsfStorageFileTree(BaseFileObject):

    _id = oid_primary_key
    children = fields.AbstractForeignField(list=True, backref='_parent')

    @classmethod
    def parent_class(cls):
        return OsfStorageFileTree

class OsfStorageFileRecord(BaseFileObject):

    _id = oid_primary_key
    is_deleted = fields.BooleanField(default=False)
    versions = fields.ForeignField('OsfStorageFileVersion', list=True)

    @classmethod
    def parent_class(cls):
        return OsfStorageFileTree

    def get_version(self, index=-1, required=False):
        try:
            return self.versions[index]
        except IndexError:
            if required:
                raise errors.VersionNotFoundError
            return None

    def get_versions(self, page, size=settings.REVISIONS_PAGE_SIZE):
        start = len(self.versions) - (page * size)
        stop = max(0, start - size)
        indices = range(start, stop, -1)
        versions = [self.versions[idx - 1] for idx in indices]
        more = stop > 0
        return indices, versions, more

    def create_pending_version(self, creator, signature):
        latest_version = self.get_version()
        if latest_version and latest_version.pending:
            raise errors.PathLockedError
        if latest_version and latest_version.signature == signature:
            raise errors.SignatureConsumedError
        version = OsfStorageFileVersion(
            creator=creator,
            signature=signature,
            status=status_map['UPLOADING'],
        )
        version.save()
        self.versions.append(version)
        self.is_deleted = False
        self.save()
        return version

    def ping_pending_version(self, signature):
        latest_version = self.get_version(required=True)
        latest_version.ping(signature)
        return latest_version

    def set_pending_version_cached(self, signature):
        latest_version = self.get_version(required=True)
        latest_version.set_cached(signature)
        return latest_version

    def update_version_metadata(self, signature, metadata):
        for version in self.versions[::-1]:
            if version.signature == signature:
                version.update_metadata(signature, metadata)
                return
        raise errors.VersionNotFoundError

    def remove_version(self, version):
        if len(self.versions) == 1:
            OsfStorageFileRecord.remove_one(self)
            retained_self = False
        else:
            self.versions.remove(version)
            self.save()
            retained_self = True
        OsfStorageFileVersion.remove_one(version)
        return retained_self

    def touch(self):
        """Check for expired pending versions. Note: the current `FileRecord`
        will be removed if this method reduces the number of versions to zero.

        :return: Current record is valid
        """
        latest_version = self.get_version()
        if latest_version and latest_version.expired:
            retained_self = self.remove_version(latest_version)
            logger.warn('Removed pending version on {!r} due to inactivity'.format(self))
            return retained_self
        return True

    def resolve_pending_version(self, signature, location, metadata, log=True):
        """Finish pending upload. Update version record with file information
        and unlock file path.

        :param str signature: Signature used in signed URL
        :param dict location: Location of file in backend
        :param dict metadata: Metadata to append to record
        :param bool log: Add log to containing `Node`
        """
        action = None
        latest_version = self.get_version(required=True)
        latest_version.resolve(signature, location, metadata)
        previous_version = self.get_version(-2)
        if previous_version and previous_version.is_duplicate(latest_version):
            self.versions.remove(latest_version)
            self.save()
            OsfStorageFileVersion.remove_one(latest_version)
            action = NodeLog.FILE_UPDATED
            ret = previous_version
        else:
            action = (
                NodeLog.FILE_UPDATED
                if len(self.versions) > 1
                else NodeLog.FILE_ADDED
            )
            ret = latest_version
        if log:
            self.log(Auth(latest_version.creator), action)
        return ret

    def cancel_pending_version(self, signature, log=True):
        latest_version = self.get_version(required=True)
        latest_version.cancel(signature)
        self.remove_version(latest_version)

    def log(self, auth, action, version=True):
        node_logger = logs.OsfStorageNodeLogger(
            auth=auth,
            node=self.node,
            path=self.path,
        )
        extra = {'version': len(self.versions)} if version else None
        node_logger.log(action, extra=extra, save=True)

    def delete(self, auth, log=True):
        if self.is_deleted:
            raise errors.DeleteError
        self.is_deleted = True
        self.save()
        if log:
            self.log(auth, NodeLog.FILE_REMOVED, version=False)

    def undelete(self, auth, log=True):
        if not self.is_deleted:
            raise errors.UndeleteError
        self.is_deleted = False
        self.save()
        if log:
            self.log(auth, NodeLog.FILE_RESTORED)

    def get_download_count(self, version=None):
        """
        :param int version: Optional one-based version index
        """
        parts = ['download', self.node._id, self.path]
        if version is not None:
            parts.append(version)
        page = ':'.join([format(part) for part in parts])
        _, count = get_basic_counters(page)
        return count or 0

identity = lambda value: value
metadata_fields = {
    'size': identity,
    'content_type': identity,
    'date_modified': parse_date,
}

status_map = {
    'UPLOADING': 'uploading',
    'CACHED': 'cached',
    'COMPLETE': 'complete',
}
def validate_status(value):
    if value not in status_map.values():
        raise modm_errors.ValidationValueError

def check_status(*statuses):
    def wrapper(func):
        @functools.wraps(func)
        def wrapped(self, signature, *args, **kwargs):
            if statuses and self.status not in statuses:
                raise errors.VersionStatusError(
                    'Version status must be one of {0}; received {1}'.format(
                        ', '.join(statuses),
                        self.status,
                    )
                )
            if self.signature != signature:
                raise errors.SignatureMismatchError
            return func(self, signature, *args, **kwargs)
        return wrapped
    return wrapper

class OsfStorageFileVersion(StoredObject):

    _id = oid_primary_key
    creator = fields.ForeignField('user', required=True)

    status = fields.StringField(required=True, validate=validate_status)
    signature = fields.StringField()

    date_created = fields.DateTimeField(auto_now_add=True)
    date_resolved = fields.DateTimeField()
    last_ping = fields.FloatField(default=lambda: time.time())

    # Dictionary specifying all information needed to locate file on backend
    # {
    #     'service': 'cloudfiles',  # required
    #     'container': 'osf',       # required
    #     'object': '20c53b',       # required
    #     'worker_url': '127.0.0.1',
    #     'worker_host': 'upload-service-1',
    # }
    location = fields.DictionaryField()

    # Dictionary containing raw metadata from upload service response
    # {
    #     'size': 1024,                            # required
    #     'content_type': 'text/plain',            # required
    #     'date_modified': '2014-11-07T20:24:15',  # required
    #     'md5': 'd077f2',
    # }
    metadata = fields.DictionaryField()

    size = fields.IntegerField()
    content_type = fields.StringField()
    date_modified = fields.DateTimeField()

    @property
    def pending(self):
        return self.status != status_map['COMPLETE']

    @property
    def expired(self):
        """A version is expired if in pending state and has not received a ping
        from the upload service since in `PING_TIMEOUT` seconds.
        """
        if self.status != status_map['UPLOADING']:
            return False
        return time.time() > (self.last_ping + settings.PING_TIMEOUT)

    @property
    def location_hash(self):
        return self.location['object'] if self.location else None

    def is_duplicate(self, other):
        return (
            bool(self.location_hash) and
            self.location_hash == other.location_hash
        )

    @check_status(status_map['UPLOADING'])
    def ping(self, signature):
        """Verify upload signature and update last ping time.

        :param str signature: Signature used in signed URL
        """
        self.last_ping = time.time()
        self.save()

    @check_status(status_map['UPLOADING'])
    def set_cached(self, signature):
        """
        """
        self.status = status_map['CACHED']
        self.save()

    @check_status(status_map['UPLOADING'], status_map['CACHED'])
    def resolve(self, signature, location, metadata):
        """
        """
        self.status = status_map['COMPLETE']
        self.date_resolved = datetime.datetime.utcnow()
        self.location = location
        self.metadata = metadata
        for key, parser in metadata_fields.iteritems():
            try:
                value = metadata[key]
            except KeyError:
                raise errors.MissingFieldError
            setattr(self, key, parser(value))
        self.save()

    @check_status()
    def update_metadata(self, signature, metadata):
        self.metadata.update(metadata)
        self.save()

    @check_status(status_map['UPLOADING'])
    def cancel(self, signature):
        pass

LOCATION_KEYS = ['service', 'container', 'object']
@OsfStorageFileVersion.subscribe('before_save')
def validate_version_location(schema, instance):
    if instance.pending:
        return
    for key in LOCATION_KEYS:
        if key not in instance.location:
            raise modm_errors.ValidationValueError

@OsfStorageFileVersion.subscribe('before_save')
def validate_version_dates(schema, instance):
    if instance.pending:
        return
    if not instance.date_resolved:
        raise modm_errors.ValidationValueError
    if instance.date_created > instance.date_resolved:
        raise modm_errors.ValidationValueError

class OsfStorageGuidFile(GuidFile):

    path = fields.StringField(required=True, index=True)

    @property
    def file_url(self):
        return os.path.join('osfstorage', 'files', self.path)

    def get_download_path(self, version_idx):
        url = furl.furl('/{0}/'.format(self._id))
        url.args.update({
            'action': 'download',
            'version': version_idx,
            'mode': 'render',
        })
        return url.url

    @classmethod
    def get_or_create(cls, node, path):
        try:
            obj = cls.find_one(
                Q('node', 'eq', node) &
                Q('path', 'eq', path)
            )
        except modm_errors.ModularOdmException:
            obj = cls(node=node, path=path)
            obj.save()
        return obj

redpajama_set_name: RedPajamaGithub


Canon PIXMA TR8550 Driver Download. This printer has a speed in printing that varies depending on system configuration and software and the type of paper used etc. Scan speeds also vary depending on the system configuration and the type of paper used etc. Likewise with Copy speed. Ink results that vary affect the writing or color of the printed photo.
This printer can connect with high speed USB cable, 10 / 100Mbps Ethernet (switchable automatically). Wireless connection with Wi-Fi and Bluetooth (BLE) and supported by Canon PRINT 14, Apple AirPrint, Mopria, Google Cloud Print, Wireless & PictBridge LAN.
This software is a printer driver for printing using a Canon IJ printer.


text:
Теодора Духовникова (; до замужества — Теодора Иванова) (род. в декабре 1977, София, Болгария) — болгарская актриса театра и кино. Известна у себя в стране как «болгарская Мишель Пфайфер».

Биография
Родилась в декабре 1977 года в Софии. Окончила классическую среднюю школу в Софии, а в 2000 году болгарскую Национальную академию искусства театра и кино с отличием в классе профессора Снежины Танковской и покойного Андрея Баташова.

Летом 2013 года вместе с мужем разбилась на автомобиле, возвращаясь в Софию с Летнего фестиваля в Варне, сломав позвоночник.

Замужем. Супруг — Стефан Духовников, ресторатор, сын известного в Болгарии врача-гинеколога. Двое детей, дочери Бояна и Эма.

Карьера
Теодора Иванова с 10 лет стала заниматься в детской театральной студии при театре «Сълза и смях» под руководством Бончо Узунова. В 1980-х годах стала сниматься в фильмах Болгарского телевидения. В 2003 году дебютировала на сцене Национального театра Ивана Вазова в роли Саломеи и с тех пор является частью первой труппы.

Самые известные роли в театре — госпожа Д'Олбак в спектакле «Распутник» по одноимённой пьесе Эрика-Эмманюэля Шмитта, Мэрилин в спектакле «Однорукий из Спокана» по пьесе Мартина Макдонаха, Оливии в «Идеальном муже» Оскара Уайльда, Марии в «Процессе против Богомилова» Стефана Цанева и Регины в «Лисице» Лилиан Хелман, а также участие в постановке «Ворона» Калины Попяновой на сцене «».

Духовникова снялась в многочисленных болгарских, американских и западноевропейских фильмах и сериалах.

Фильмография
 2002 — «Антитело» — Тречак
 2003 — «Карающий» — Рита
 2005 — «»
 2006
 «BBC: Ганнибал» — Имильца
 «Китайская жена» — Мариэлла
 «Нюрнбергский процесс: Нацистские преступники на скамье подсудимых»
 2007 — «Торговые пути» — Лина Линда Хэмилтон
 2008
 «» — Маргарита
 «Специальное задание» — Энн-Люси Эшли
 2011
 «Генерал Делла Ровере»
 «Конан-варвар»
 2012
 «Капитанская дочка» — Лизавета
 «» — Елица Владева
 2013 — «» — Божура Джелезова
 2015
 «Собиратель трупов» — Катя
 «Неоспоримый 4» — Альма
 2016 — «» — голос рассказчика в болгарской версии
 2017
 «Вездесущий» — Анна
 «Бубльгум» () — Биляна
 2018
 «Горло дьявола»
 «День мертвецов: Злая кровь» — Венди

Награды
 2012 — «» за лучшую второстепенную женскую роль за спектакль «Однорукий из Спокана» (Национальный театр Ивана Вазова).
 2013 — «Модная икона Болгарии»
 2017 — «Золотая роза» за лучшую женскую роль в фильме «Преодоление».
Дважды признавалась Женщиной года в Болгарии.

Примечания

Ссылки

redpajama_set_name: RedPajamaWikipedia


Speed range: Infrared black and white. Class 2m iiWholesale lens diffractie. 30x 60x 90x. Led lifetime :Range: Eyewear magnifyingZwart,zilver. 2*1.5v aaa. Laser range finder. 1.25" telescope eyepiece15 30 45 60 90 100 degree. Elektron telescoop. Digitale tape. maatregel tape. 35x50wa. Drawtube: Sport events, concerts, bird watching, camping, fishing and travel. Lucky merk zoom.
Desktop magnifier. 180x120mm. Helm moto. Easy to use. 30x and 60x and 90x. Approx. 20.5 * 18.5 * 6.8cm / 8.07 * 7.28 * 2.68in. Golf/hunting laser range finder. 355mm. 248 g. Led include: Microscope stand.


text:
SyFy acquires Project Blue Book
SYFY – the UK destination brand for all things science fiction and fantasy – today announced the acquisition of Project Blue Book. From A+E Networks, this historical drama – based on the true, top-secret investigations conducted by the US Air Force into Unidentified Flying Objects (UFOs) from 1952 to 1969 – is executive produced by Oscar-winning filmmaker Robert Zemeckis (Forrest Gump, Back to the Future, Contact), alongside creator, writer and co-executive producer David O'Leary. The ten one-hour episodes will premiere on SYFY, part of NBC Universal International Networks' portfolio in the UK, from March 2019.
Project Blue Book stars Aidan Gillen (Game of Thrones, The Wire) as Dr. J Allen Hynek, a brilliant yet underappreciated college professor, who is recruited by the US Air Force to spearhead a clandestine operation called "Project Blue Book." Along with his partner, the debonair Air Force Captain Michael Quinn (Michael Malarkey, The Vampire Diaries) Hynek is summoned to investigate UFO sightings around the country and uses science to discover what really happened. However, when some encounters cannot be explained and cases remain open, he begins to suspect that he as been duped by the government into a larger conspiracy to cover up the truth.
Set again the backdrop of the Cold War and rising Atomic Era, each episode draws from the actual "Project Blue Book" case files, blending UFO theories with authentic historical events from one of the most mysterious eras in the history of the United States.
Project Blue Book also stars Neal McDonough (Minority Report), Michael Harney (Orange is the New Black), Laura Mennell (Watchmen) and Ksenia Solo (Black Swan).
"Project Blue Book delves into themes such as trust, instinct, and top secret UFO investigations, which guarantee to appeal to fans of science fiction and fantasy," commented Lee Raftery, Managing Director UK & Emerging Markets and Chief Marketing & Content Officer, NBC Universal International. "This acquisition is uniquely suited for SYFY UK and, with top talent both in front and behind the camera, we know viewers will be instantly hooked by these compelling, mysterious case files."
SyFy mobile streaming app
SyFy channel for MENA
NBCUniversal reboots SYFY
NBCUniversal acquires SPIDES for SYFY
Syfy UK acquires Disney trio
Categories: Press Releases