text:
© Poppy Malby
2020 was a huge year for PrEP. Why don't black men know about it?
By Takudzwa Mukiwa 6 December 2020
Terrence Higgins Trust's Takudzwa Mukiwa speaks about the importance of raising awareness about the HIV prevention pill, PrEP, among black men in the UK
We have made tremendous progress on HIV prevention and treatment over the years. New cases are down, and people are now living long and healthy lives. However, not everyone is having an equal shot at benefiting from this progress, and that is something that keeps many of us awake at night as we seek solutions to make everyone benefit.
I grew up in Zimbabwe in the Nineties and still vividly remember the devastating impact the HIV epidemic had on the community back home. That decade HIV spread quickly across the country with a quarter of adults in Zimbabwe infected by the mid-1990s.
Right into the early 2000s, many struggled to get life-saving treatment. It had a profound impact on me, and I've devoted my professional life, as well as a fair chunk of my personal one, talking to people about the various ways to prevent HIV and the advances in HIV treatment.
Here we are in 2020 in the UK, and things have changed. People have access to life-saving treatment, and there have been significant breakthroughs in prevention, particularly the introduction of PrEP, the pill you can take to stop yourself from contracting HIV.
PrEP – which is short for HIV Pre-exposure prophylaxis – is a pill that is taken by someone who is HIV negative before and after sex to prevent HIV. It contains two of the drugs found in HIV treatment which block the virus from taking hold.
It's absolutely amazing what medical science has achieved in treating and preventing HIV, but that's only half the battle – because you can't access something you don't know about or use it if you are unsure about it.
Black African heterosexuals like me are more likely to be diagnosed with HIV compared to other heterosexuals of other ethnicities in the UK. In 2019, 37% of heterosexuals diagnosed with HIV were black African, although we make around 2% of the UK population. However, compared to gay men (who are the most affected group by HIV in the UK) we haven't taken up PrEP, and there is a lot of evidence that many of us don't even know it exists.
To address the lower awareness of PrEP within my community, our team here at Terrence Higgins Trust has launched PrEP Protects as part of our It Starts With Me campaign to empower people around their sexual health. Raising awareness is a step in the right direction, though this is just a start.
There are common questions I hear again and again about PrEP from black African people that I believe should be addressed if we are to potentially see improvements in uptake of PrEP.
1. Getting the facts right
I am often asked: 'So does this PrEP stuff really work'? This recurring question has led me to believe that there is a deep desire to have confidence that there is scientific proof of its effectiveness.
So here it is: The Food and Drug Administration (FDA) first approved PrEP in the United States in 2012. In the UK, researchers from the Proud Study published findings that concluded PrEP is highly effective five years ago. And, if that's not enough for you, the World Health Organisation has listed it as one of the key ways of preventing HIV.
Another related question that comes up regularly during these conversations is regarding side effects. For the vast majority, that's not an issue, and I've never met anyone who's had any issues taking PrEP. Some people experience nausea, headaches or tiredness and, very rarely, the medication can affect kidney function. That's why people accessing PrEP for free on the NHS have regular kidney function tests.
2. Mistrust of pharmaceutical companies
One of the big issues is regarding the concerns that stem from the mistrust of the intentions of pharmaceutical companies within my community. Unfortunately, due to previous malpractices of the pharmaceutical industry towards black people in the US and Africa – such as the Tuskegee Syphilis Experiment – people are quite cautious about new medicines. Especially when the medication is perceived to be mainly targeted at marginalised groups.
For this reason, some people question whether it might be that these companies are experimenting on marginalised groups. I don't wish to invalidate this fear – especially given the history – but the treatment from our NHS is fit for purpose and can be trusted. It has gone through rigorous testing.
3. The cost of PrEP
Times are hard and money is tight for many of us. Which means I often get asked 'is this PrEP stuff free?' And the answer in the UK is yes, because money shouldn't be a consideration when it comes to health. From 1 October this year, PrEP became available at sexual health clinics to those eligible. While this is the case, some clinics are still getting set up to deliver on this.
4. The media's perception
A lot of the time when PrEP is spoken about in the media it's referred to as a 'gay men's drug'. Often, one of the responses I get from people is: 'isn't PrEP for gay men only?' And my answer is: 'No'. PrEP is highly effective at stopping HIV for anyone, regardless of gender, sexuality or ethnicity.
PrEP is unfortunately also subject to stigma driven by negative perceptions. This can prevent people from considering whether PrEP is right for them. In 2016, some quarters of the media referred to PrEP as a 'promiscuity pill' and even made claims that the cost of the pill will take away treatment from cancer patients. GQ, you're one of the good guys.
Going into 2021, I no longer want PrEP and the progress made in treating and preventing HIV to be our best kept secret. The vision in the UK is a country free of new HIV cases by 2030.
And I don't know about you, but I don't want anyone to be left behind. Not my community who are too proud to go and talk about their sexual health. Not straight men like me who think HIV is something they don't have to think about. But let's be completely clear: none of us will get to zero unless all of us get there.
Find out more about PrEP on the It Starts With Me website. For questions about HIV, PrEP and sexual health, call THT Direct on 0808 802 1221.
Gareth Thomas: 'Rugby is the worst and best thing that has happened to me'
Lady Phyll's guide to fighting for equality without burning out
Everything you need to know about PrEP, the drug that could end HIV
LifestyleHealth
Bling Empire makes The Real Housewives look poor
By Olive Pometsey 18 January 2021
Why a Google Alert for 'Seiko Izul' could be a money-maker
By Adrian Hailwood 19 January 2021


Get good shoes- These are essential. Don't use old ones or shoes that are not meant for running; they will only hurt your feet, which I learned the hard way. If you need new running shoes, you can check out Intersport in town or buy some online.
Layers- I strongly recommend wearing a sweatshirt, because it can get pretty cold at this time of year.
Listen up- The next step is to fill your iPod with motivational running music, anything from classical music to The Strokes. Pick something with a beat that will keep you motivated.
Learn to love it- You may think that starting to run requires a lot of self control. I have, however, come to realise that once you start exercising twice or three times a week, from then on your body will want that exercise. If you don't think you have the time for regular exercise, rethink how much time you spend on watching TV online or social networking. You can surely spare two to three hours of that every week.


text:
Ecobee's new home security service has a professional monitoring option
Ecobee now gives you the option to pair its smart home monitoring devices with a professional security service. With the company's new Smart Security service, which replaces the Haven service it formerly offered, you can enable 24/7 professional monitoring (which is still in beta) for an additional $10 / month as a part of the Complete subscription plan. This price is half of what Ring now charges for its Pro plan that comes with a professional live monitoring service.
Ecobee's Smart Security service uses the RapidSOS emergency response platform to send crucial data to emergency responders. It relays your home's entry and exit data to first responders, as well as any video and audio snippets captured by Ecobee devices.
Ecobee is offering a $5 / month Standard plan and a $10 / month Complete plan
To get started with the Smart Security service, you'll need Ecobee's smart sensors for doors and windows, which you can purchase as a bundle for $79.99. The $99.99 SmartCamera also integrates with the service, as its optional video verification feature can send footage to monitoring centers whenever the camera detects the sound of a smoke alarm — if an emergency is confirmed, dispatchers may be able to send responders faster.
If you don't need live monitoring, Ecobee offers a $5 / month Standard subscription that comes with several other handy features (that are also included with the Complete plan). Aside from live monitoring, the Smart Security service can remind you to arm or disarm your house by using Wi-Fi and geofencing data to determine when you're home. It will also send a notification to your phone when a door opens unexpectedly — Ecobee says that its system can tell the difference between your family members and an intruder, so you shouldn't expect unnecessary notifications. You can check out the full list of Smart Security features on Ecobee's website.
As far as privacy goes, Ecobee says that it "will never sell or misuse your data" and that it uses "extra security layers like two-factor authentication so your account is secure." Ecobee also notes that its SmartCamera switches off when it detects that you and your family are home.
It's important to keep in mind that some features only work with certain devices. The entire Smart Security suite makes use of Ecobee's lineup of gadgets, all of which it sells — sans SmartCamera — in an Efficiency and Security Solution bundle for $279.99. In case you want to add the SmartCamera with that bundle, expect to pay a total of $379.98.
If you don't want to commit to $10 / month just yet, Ecobee is offering a free two-month trial.
Aston Villa keen to appoint Liverpool icon Gerrard as next manager amid Rangers success
I had to overcome fear of playing in front of crowds
Smart Home Security Camera Conspires With Burglars In Exchange For Half The Loot
EcoFlow Rolls Out the Smart Home Ecosystem to Address Broader Power Needs
Smart Home Tech Firm Orvibo Bags 1 Billion Yuan in E-Round Financing
Best Smart Locks to Improve Your Home's Security in 2022

redpajama_set_name: RedPajamaCommonCrawl


text:
Renan Silva (n. 27 ianuarie 1989)  este un jucător brazilian care a făcut performanță la echipa Olaria Atlético Clube, mai ales în meciul Flamengo - Olaria încheiat 3-1 unde a reușit să îl umileasca chiar pe starul Ronaldinho cu o schemă pe care a spus in urmă cu câteva zile (iunie 2012) că o va face și la echipa care evoluează acum: Rapid București.

Legături externe

Renan Silva e gata să repete schema care l-a umilit pe Ronaldinho: "Nu e mare lucru!" Prima reacție a lui 'Wesley din Giulești': ce obiectiv și-a impus

Fotbaliști brazilieni
Brazilieni expatriați în România

redpajama_set_name: RedPajamaWikipedia


text:
cognitivedaily
How do you react to an emotional face? Depends on how quickly you see it
By dmunger on March 4, 2009.
What's your first reaction on seeing this picture of Nora? Are you excited because she appears to be excited? Or do you react to her intent? Perhaps you think she's cute, or maybe even sarcastic. Ultimately you might have all of those reactions.
There's no doubt we're exceptionally fast at responding to faces, and to the emotions they convey. But reacting appropriately, especially when a face signals danger, could be the difference between life and death.
These two ways of reacting to a facial expression correspond to two possible intentions of an expression: to elicit an emotion in someone else, or to express your own emotional state. The result, for the other person, isn't always the same. For example, if you simply mimick the emotion of an angry face, then you too would be angry. But if the angry person was stronger or better-armed than you, you might recognize their anger and become afraid, not angry. So which response comes first?
Kirsten Ruys and Diderick Stapel believe they have devised a way to find out. They asked students to watch movies that quickly flashed emotional faces at them -- so fast that the facial expressions couldn't be consciouly judged. The faces were flashed at two different speeds, illustrated in this video:
Click to watch video (QuickTime required)
The students were instructed to focus on the cross in the center of the screen and react as quickly as possible, indicating when a picture flashed to the left or right of the cross. As you can see in the slowed-down version (which the students never saw), the face flashed very briefly before being masked by a black-and-white rectangle. (Yes, that's me, doing my best to look "angry.") In the "quick" version, the face stayed on-screen for 120 milliseconds. In the "super quick" version, it appeared for just 40 milliseconds. The students were divided into 8 groups, who saw one of four emotions (Anger, Fear, Disgust, or Neutral) at either quick or super quick speeds.
After completing this task, the researchers tested the students' emotions using two different tasks. The first was word-completion. Students were given a few letters from words and were asked to complete them. For example, if they saw "HA" -- the idea is that an angry person might complete it as "HATE," but a cheerful person might complete it as "HAPPY." Here are the results for the students who saw angry faces:
When the images were seen for the longer, "quick" duration, students completed significantly more angry words than disgust or fear words. But when they were only seen for a super-quick 40 milliseconds, angry words weren't completed any more frequently than any of the other words. Overall, there were still more negative words compared to those who had seen neutral faces, but the specific emotion of "anger" wasn't elicited. The same pattern held for people who saw disgusting faces or fearful faces.
The students were also asked to rate their own mood on a scale 1 (positive) to 7 (negative) after finishing the experiment. Here are those results:
When the faces were seen for a longer time period, there was no difference in mood ratings, no matter what expression they had seen during the experiment. But when faces were seen super-quickly, the students who saw negative expressions rated their moods as significantly more negative than students who saw neutral faces.
Ruys and Stapel say this means our facial expressions elicit a mood response in others even before they recognize our particular expression. Over time -- still a very short period of time -- we then are able to decode the particular expression and decide how to respond.
Kirsten I. Ruys, Diederik A. Stapel (2008). Emotion Elicitor or Emotion Messenger? Subliminal Priming Reveals Two Faces of Facial Expressions Psychological Science, 19 (6), 593-600 DOI: 10.1111/j.1467-9280.2008.02128.x
Cognitive Daily Closes Shop after a Fantastic Five-Year Run
Five years ago today, we made the first post that would eventually make its way onto a blog called Cognitive Daily. We thought we were keeping notes for a book, but in reality we were helping build a network that represented a new way of sharing psychology with the world. Cognitive Daily wasn't the…
Both musicians and non-musicians can perceive bitonality
Take a listen to this brief audio clip of "Unforgettable." Aside from the fact that it's a computer-generated MIDI performance, do you hear anything unusual? If you're a non-musician like me, you might not have noticed anything. It sounds basically like the familiar song, even though the…
Synesthesia and the McGurk effect
We've discussed synesthesia many times before on Cognitive Daily -- it's the seemingly bizarre phenomenon when one stimulus (e.g. a sight or a sound) is experienced in multiple modalities (e.g. taste, vision, or colors). For example, a person might experience a particular smell whenever a given…
Does watching TV really kill you?
Today I had to put off my normal morning run in order to make time to be interviewed on a radio show at 7:30 a.m. As I waited on hold for the interview to start, I could hear the hosts joking back-and-forth about what the "latest TV controversy" is. "Is it the Jay Leno / Conan O'Brien news on NBC…
The outfielder problem: The psychology behind catching fly balls
It's football season in America: The NFL playoffs are about to start, and tonight, the elected / computer-ranked top college team will be determined. What better time than now to think about ... baseball! Baseball players, unlike most football players, must solve one of the most complicated…


text:
Trump: Give me the wall, I'll give you 'Dreamers'
People look at prototypes of a border wall Thursday, Oct. 26, 2017, in San Diego. Elliott Spagat / AP
Jan. 4, 2018, 5:51 PM UTC / Updated Jan. 4, 2018, 6:15 PM UTC
By Ali Vitali
WASHINGTON — President Donald Trump pressed for action on immigration Thursday, saying the country's system has failed Americans and pressing for his wall on the southern border.
Any legislation to address the residency status of "Dreamers," currently in limbo, "must secure the border with a wall," the president said, flanked by Republican senators who came to the White House for a meeting on immigration.
"We'd love to take care of DACA, but we're only going to do it under these conditions," he concluded, laying down a red line as Congress gears up for yet another round of fights to fund the government.
Trump: DACA 'going to be terrific' with support from Democrats
Jan. 4, 201801:14
He also demanded that future legislation further restrict visa overstays and so-called chain migration, and end the visa lottery.
Among the issues complicating the funding battle to keep the government running is what to do about "Dreamers," which has remained an open question since the Justice Department announced last fall that it would end the Obama-era program that allowed young people who came to the United States illegally as children to remain in the country.
Trump kicked the issue to Congress in September, while promising to "resolve the DACA issue with heart and compassion."
But actions to aid the young immigrants could upset Trump's base, who voted in support of the hard-line immigration policies he espoused during the campaign. Chief among those campaign promises was the wall, which Trump imagined at campaign rallies as "big" and "beautiful" — and maybe even branded with his name.
Democrats have already drawn their own red line, insisting that they will not accept any proposal that includes the construction of a border wall or any changes to legal immigration.
While Trump laid out his demands to television cameras ahead of the meeting with Republican senators, lawmakers have been asking for specifics from the White House on his demands, including how he defines a border wall, how much money he'd like in this deal and what specific changes he'd like to legal immigration. Senators who attended the meeting said the White House will release a paper with specific requests on Tuesday, the same day Trump will hold a bipartisan meeting on immigration, senators said.
Democrats are skeptical that the White House will release their specifics next week. It's a promise they've been making for several weeks.
Meanwhile, a separate group of five bipartisan senators — Sens. Dick Durbin, D-Ill., Michael Bennett, D-Colo., Jeff Flake, R-Ariz., Cory Gardner, R-Colo., and Lindsey Graham, R-S.C. — are in the middle of their own negotiations revolving around both border security and the DREAM Act, legislation that provides a path to citizenship for the immigrants brought to the U.S. as children.
"We're trying to get to a final working document. There's a lot of working groups out there on this we got to get that to a single document," said Sen. James Lankford, R-Okla., who attended the meeting with Trump.
Democrats want an agreement on DACA attached to any deal to fund the government for the remainder of the year, while Republicans say that any immigration deal should be separate. But Democrats say they will block any government funding deal unless immigration is addressed.
On Wednesday, senior administration officials met with House Speaker Paul Ryan, Senate Majority Leader Mitch McConnell, House Minority Leader Nancy Pelosi and Senate Minority Leader Chuck Schumer to discuss potential paths forward for a budget agreement. DACA and the border were among the topics mentioned.
A joint statement from the White House, Ryan and McConnell issued after the meeting warned against "holding funding for our troops hostage for immigration policy."
Asked as she left the meeting if the group was getting anywhere, Pelosi told reporters, "I hope so."
Ali Vitali
Ali Vitali is a political reporter for NBC News, based in Washington.
Leigh Ann Caldwell contributed.


We are a skilled team of design, math, finance, and technology geeks who noticed a lack of trust in the financial system and decided to do something about it. We created a company that combines data science, streamlined design, and exceptional service to bring people a fast, low-cost, and hyper-personalized financial experience. Our mission is to make credit more accessible by reducing the costs and barriers faced by millions of financially responsible people.
We offer 1, 2, and 3 year personal loans between $2,000 and $50,000. Personal loans can be used for a number of reasons, including but not limited to: vacation/honeymoon, moving/relocation, security deposit, engagement/wedding, home improvement, new job expenses, and career development. We do not currently offer loans for small businesses. Take a look at our Eligibility Guidelines for more information, and then start your personal loan application here.
You can apply on Earnest's website in a six-step application. You will have to provide information about why you're borrowing money, your education and profession, and give Earnest permission to scan bank account transactions to learn about your financial behavior. The company conducts a hard credit check with credit bureau Experian before finalizing the loan.


Online Advertising, online advertising network.
The poignant bee tattoo people are getting in honour of innocent Manchester victims – Mirror Online, tattoo schools online.
Online Programs, University of Texas Rio Grande Valley, university of texas online programs.
Online Education Programs – Schooling, K12, online schools for k.
Online College Courses & Classes, astronomy online classes.
Online and On-Campus Medical Billing Program, Herzing, medical billing classes online.
Online and On-Campus Medical Billing Program, Herzing, medical billing and coding online degree.
Buy Car Insurance Online – Online Auto Insurance, buy cheap car insurance online.
Auto online verkaufen – Auto Online-Bewertung, auto verkaufen online.
Compare Cheap Car Insurance Quotes at GoCompare, free insurance quote online.
Englisch ⇔ Deutsch Wörterbuch: Startseite, wörterbuch englisch deutsch kostenlos online.
Assicurazioni online – Polizza Auto da 220€ – Zurich Connect – RCA, Moto, Furgoni, Casa, assicurazioni auto online economiche.
Car Insurance Quotes, Compare Car Insurance – Liberty Insurance Ireland, get online car insurance quote.
Travel Insurance – Compare and Buy Trip Insurance Online, buy insurance online now.
Term Life Insurance Quotes Online – Instant – Private Quotes, instant insurance quote online.
Farmers Insurance: Get a Home, Life – Auto Insurance Quote, automobile insurance quotes online.
Online Medical Billing and Coding Schools, Classes, medical billing and coding courses online.
Synonyme, W – rterbuch – Spr – che, herkunftswörterbuch online kostenlos.
Get Online Car Insurance Quotes, Quick Instant Rates, Trusted Choice, instant online insurance.
Compare Cheap Car Insurance Quotes, get a insurance quote online.
Learn Medical Billing Online, medical billing coding online certification.
AARP Life Insurance Program from New York Life, online life insurance rate.
Borse Asiatiche, quotazioni borsa online.
Term Life Insurance Quotes Online – Instant – Private Quotes, instant insurance life online quote.
Online Auto Insurance – Quotes Comparison, Find Cheap Rates, Buy Car Insurance Policy Online, insurance quotes online.
Insurance Quotes – Compare Rates for Auto, Home, More, online free insurance quotes.
Andrews School Online Medical Career Training Programs, medical billing and coding schools online.
Car Insurance, Compare Car Insurance Quotes, iSelect, car insurance qoutes online.
Miro Kredit AG – Online Kredit Schweiz, online hypothek.
Taller mecánico, seguros coche online.


Ubuntu Desktop is an open-source operating system that provides users with useful tools for web browsing, composing document, video playing, etc.
Ubuntu Desktop offers you full necessary software to browse the web, compose document and play video, music, etc.
This OS offers the office application named OffpenOffice. With this, users can compose document, book, text and slide show. Especially, this software is compatible with documents created by other office software like Microsoft Office, Word Perfect, KOffice and StarOffice.
Ubuntu Desktop also integrates Firefox browser and other services including MSN Messenger, Yahoo Messenger, Jabber, Gmail, etc. to help users surf the web, chat and send email, etc.
Besides, this OS provides many free software in its collection, uses only have to download, install and use them without paying any fees.
Especially, Ubuntu Desktop has the ability to detect and fix errors, auto-update new version via Internet.
Users can copy the set-up package of this OS and use on other computer without registration and paying fee.
- Update new version over the air.
We compile the Introduction and usage guidance about Ubuntu Desktop software with the purpose to provide you more information for reference, if you download ubuntu desktop, that is in your discretion. We shall not take any responsibility for problems arising (if any) during the installation and use of the software. See [Terms and Conditions] for more details.


text:
Borno Monpoint (Cabo Haitiano, 1830 - ibidem, 12 de septiembre de 1905) mejor conocido como Monpoint Jeune, fue un militar y político haitiano.

Biografía
Monpoint Jeune era un joven graduado cuando comenzó una carrera militar, durante la cual ascendió al rango de General.

Como general, reprimió una revuelta en marzo de 1878 contra el presidente Pierre Théoma Boisrond-Canal.

Después de la destitución del presidente François Denys Légitime, fue designado, el 23 de agosto de 1889, como presidente interino de Haití.

El 17 de octubre de 1889 fue reemplazado por el Ministro de Agricultura, Florvil Hyppolite.

Sirvió como Secretario de Estado de Guerra y Marina entre abril y diciembre de 1896, y nuevamente entre octubre de 1889 y agosto de 1890 (bajo las presidencias de Tirésias Simon Sam y Florvil Hyppolite, respectivamente).

Referencias

Presidentes de Haití
Militares de Haití


A guide for parents, teachers, and caregivers of learning-disabled children draws on the theories presented in the author's best-selling PBS videos to explain how to instill social skills in disabled children, covering such topics as self-esteem, depression, and body language. Reprint. 50,000 first printing.


What is an EMT and what does he do? New readers will research all approximately this crucial task during this easy-to-read name. Crisp colour images improve the easy textual content.
George T. Hunt's vintage 1940 learn of the Iroquois throughout the heart and overdue 17th century provides war because of depletion of usual assets within the Iroquois native land and tribal efforts to imagine the function of middlemen within the fur alternate among the Indians to the west and the Europeans.
The LNCS magazine Transactions on Large-Scale info- and Knowledge-Centered platforms makes a speciality of information administration, wisdom discovery, and data processing, that are middle and scorching subject matters in desktop technological know-how. because the Nineties, the web has turn into the most motive force at the back of software improvement in all domain names.
Benchmark Books, 2008. gov/> Index ambulance, 11, 19 doctor, 13 emergency, 7 hospital, 13, 17, 21 hurt, 5, 9, 15, 21 help, 5, 7, 13, 23 lights, 19 lives, 21, 23 tools, 11 Note To Our Readers About This Electronic Book: This electronic book was initially published as a printed book. We have made many changes in the formatting of this electronic edition, but in certain instances, we have left references from the printed book so that this version is more helpful to you. Chapter Notes and Internet Addresses: We have done our best to make sure all Internet Addresses in this electronic book were active and appropriate when this edition was created.
Photos and illustrations fill the pages with color and effectively enhance the text. com. Search for the All About Community Helpers series name. Guided Reading Level: C Guided Reading Leveling System is based on the guidelines recommended by Fountas and Pinnell. com Image Credit: Larry St. com Read More Nelson, Kristin L. EMTs. : Lerner Publishing Group, 2005. Randolph, Joanne. Ambulances. New York: PowerKids Press, 2008. Rau, Dana Meachen. EMTs. : Benchmark Books, 2008. gov/> Index ambulance, 11, 19 doctor, 13 emergency, 7 hospital, 13, 17, 21 hurt, 5, 9, 15, 21 help, 5, 7, 13, 23 lights, 19 lives, 21, 23 tools, 11 Note To Our Readers About This Electronic Book: This electronic book was initially published as a printed book.
Ambulances. New York: PowerKids Press, 2008. Rau, Dana Meachen. EMTs. : Benchmark Books, 2008. gov/> Index ambulance, 11, 19 doctor, 13 emergency, 7 hospital, 13, 17, 21 hurt, 5, 9, 15, 21 help, 5, 7, 13, 23 lights, 19 lives, 21, 23 tools, 11 Note To Our Readers About This Electronic Book: This electronic book was initially published as a printed book. We have made many changes in the formatting of this electronic edition, but in certain instances, we have left references from the printed book so that this version is more helpful to you.


text:
Yeovil Town Tables
Enter a team or competition
1 team hasn't moved Torquay 17 12 2 3 38 17 21 38 DDrew 0 - 0 against King's Lynn Town on December 12th 2020.LLost 0 - 1 against Dagenham & Redbridge on December 15th 2020.WWon 6 - 1 against Yeovil Town on December 26th 2020.WWon 4 - 3 against Weymouth on December 28th 2020.LLost 1 - 2 against Yeovil Town on January 2nd 2021.
2 team hasn't moved Hartlepool 17 9 3 5 26 19 7 30 LLost 0 - 3 against Woking on December 12th 2020.WWon 4 - 0 against Stockport County on December 22nd 2020.WWon 3 - 1 against FC Halifax Town on December 26th 2020.WWon 1 - 0 against Notts County on December 28th 2020.WWon 3 - 1 against Wealdstone on January 9th 2021.
3 team hasn't moved Sutton United 14 8 3 3 25 16 9 27 WWon 1 - 0 against FC Halifax Town on November 28th 2020.WWon 1 - 0 against Woking on December 1st 2020.WWon 4 - 1 against Solihull Moors on December 5th 2020.LLost 0 - 1 against Chesterfield on December 8th 2020.DDrew 2 - 2 against Altrincham on January 9th 2021.
4 team hasn't moved Stockport 15 8 3 4 24 16 8 27 LLost 0 - 4 against Hartlepool United on December 22nd 2020.DDrew 1 - 1 against Altrincham on December 26th 2020.WWon 2 - 0 against Wrexham on December 28th 2020.DDrew 2 - 2 against Altrincham on January 2nd 2021.WWon 2 - 0 against Dagenham & Redbridge on January 19th 2021.
5 team hasn't moved Altrincham 18 6 6 6 20 21 -1 24 WWon 1 - 0 against Dagenham & Redbridge on December 12th 2020.DDrew 1 - 1 against Stockport County on December 26th 2020.LLost 2 - 3 against FC Halifax Town on December 28th 2020.DDrew 2 - 2 against Stockport County on January 2nd 2021.DDrew 2 - 2 against Sutton United on January 9th 2021.
6 team hasn't moved Halifax 17 6 5 6 28 21 7 23 LLost 1 - 2 against Solihull Moors on December 15th 2020.WWon 3 - 1 against Eastleigh on December 22nd 2020.LLost 1 - 3 against Hartlepool United on December 26th 2020.WWon 3 - 2 against Altrincham on December 28th 2020.DDrew 1 - 1 against King's Lynn Town on January 9th 2021.
7 team hasn't moved Notts County 14 7 2 5 19 13 6 23 DDrew 0 - 0 against Dagenham & Redbridge on December 2nd 2020.WWon 1 - 0 against Woking on December 5th 2020.LLost 0 - 1 against Boreham Wood on December 8th 2020.WWon 1 - 0 against Stockport County on December 15th 2020.LLost 0 - 1 against Hartlepool United on December 28th 2020.
8 team hasn't moved Wrexham 15 7 2 6 20 17 3 23 LLost 0 - 1 against Altrincham on December 1st 2020.LLost 1 - 3 against Torquay United on December 5th 2020.WWon 3 - 2 against Weymouth on December 15th 2020.LLost 0 - 2 against Stockport County on December 28th 2020.WWon 3 - 1 against Dover Athletic on January 16th 2021.
9 team hasn't moved Maidenhead United 14 7 2 5 21 21 0 23 DDrew 2 - 2 against Bromley on November 21st 2020.LLost 0 - 2 against Altrincham on November 28th 2020.WWon 1 - 0 against Eastleigh on December 5th 2020.LLost 1 - 2 against Torquay United on December 8th 2020.WWon 4 - 0 against Wealdstone on December 26th 2020.
10 team hasn't moved Bromley 14 6 4 4 23 17 6 22 DDrew 1 - 1 against Wrexham on November 28th 2020.WWon 4 - 1 against King's Lynn Town on December 1st 2020.LLost 0 - 2 against Stockport County on December 5th 2020.LLost 1 - 2 against Yeovil Town on December 8th 2020.WWon 1 - 0 against Solihull Moors on December 12th 2020.
11 team hasn't moved Boreham Wood 14 6 4 4 17 11 6 22 WWon 2 - 1 against Hartlepool United on December 5th 2020.WWon 1 - 0 against Notts County on December 8th 2020.WWon 3 - 2 against Aldershot Town on December 12th 2020.WWon 3 - 0 against Barnet on January 2nd 2021.DDrew 1 - 1 against Dover Athletic on January 12th 2021.
12 team hasn't moved Solihull Moors 13 7 1 5 18 13 5 22 LLost 1 - 4 against Sutton United on December 5th 2020.LLost 0 - 1 against Bromley on December 12th 2020.WWon 2 - 1 against FC Halifax Town on December 15th 2020.LLost 0 - 1 against Chesterfield on January 2nd 2021.WWon 2 - 1 against Chesterfield on January 5th 2021.
13 team hasn't moved Woking 16 6 3 7 20 18 2 21 LLost 0 - 1 against Notts County on December 5th 2020.WWon 3 - 0 against Hartlepool United on December 12th 2020.LLost 0 - 3 against Aldershot Town on December 26th 2020.DDrew 0 - 0 against Eastleigh on December 28th 2020.LLost 0 - 1 against Aldershot Town on January 2nd 2021.
14 team hasn't moved Aldershot 16 6 3 7 22 22 0 21 LLost 1 - 3 against FC Halifax Town on December 8th 2020.LLost 2 - 3 against Boreham Wood on December 12th 2020.WWon 3 - 0 against Woking on December 26th 2020.LLost 0 - 3 against Yeovil Town on December 28th 2020.WWon 1 - 0 against Woking on January 2nd 2021.
15 team hasn't moved Wealdstone 16 6 3 7 23 33 -10 21 LLost 1 - 2 against Torquay United on December 1st 2020.DDrew 0 - 0 against Barnet on December 5th 2020.WWon 2 - 1 against Weymouth on December 12th 2020.LLost 0 - 4 against Maidenhead United on December 26th 2020.LLost 1 - 3 against Hartlepool United on January 9th 2021.
16 team hasn't moved Eastleigh 14 5 5 4 21 16 5 20 LLost 1 - 3 against FC Halifax Town on December 22nd 2020.DDrew 0 - 0 against Weymouth on December 26th 2020.DDrew 0 - 0 against Woking on December 28th 2020.DDrew 1 - 1 against Weymouth on January 2nd 2021.LLost 0 - 1 against King's Lynn Town on January 19th 2021.
17 team hasn't moved Chesterfield 15 6 1 8 26 20 6 19 DDrew 0 - 0 against Aldershot Town on December 1st 2020.WWon 1 - 0 against Sutton United on December 8th 2020.WWon 6 - 0 against Barnet on December 12th 2020.WWon 1 - 0 against Solihull Moors on January 2nd 2021.LLost 1 - 2 against Solihull Moors on January 5th 2021.
18 team hasn't moved Dag & Red 15 5 3 7 11 16 -5 18 WWon 3 - 2 against Weymouth on December 8th 2020.LLost 0 - 1 against Altrincham on December 12th 2020.WWon 1 - 0 against Torquay United on December 15th 2020.WWon 1 - 0 against Dover Athletic on December 26th 2020.LLost 0 - 2 against Stockport County on January 19th 2021.
19 team has moved up King's Lynn 15 5 3 7 19 31 -12 18 LLost 1 - 4 against Bromley on December 1st 2020.LLost 0 - 2 against Hartlepool United on December 8th 2020.DDrew 0 - 0 against Torquay United on December 12th 2020.DDrew 1 - 1 against FC Halifax Town on January 9th 2021.WWon 1 - 0 against Eastleigh on January 19th 2021.
20 team has moved down Yeovil 15 4 5 6 20 24 -4 17 WWon 2 - 1 against Bromley on December 8th 2020.LLost 1 - 6 against Torquay United on December 26th 2020.WWon 3 - 0 against Aldershot Town on December 28th 2020.WWon 2 - 1 against Torquay United on January 2nd 2021.WWon 3 - 0 against Weymouth on January 5th 2021.
21 team hasn't moved Weymouth 16 2 3 11 17 31 -14 9 LLost 2 - 3 against Wrexham on December 15th 2020.DDrew 0 - 0 against Eastleigh on December 26th 2020.LLost 3 - 4 against Torquay United on December 28th 2020.DDrew 1 - 1 against Eastleigh on January 2nd 2021.LLost 0 - 3 against Yeovil Town on January 5th 2021.
22 team hasn't moved Barnet 14 2 3 9 11 35 -24 9 LLost 2 - 5 against FC Halifax Town on December 2nd 2020.DDrew 0 - 0 against Wealdstone on December 5th 2020.LLost 1 - 2 against Stockport County on December 8th 2020.LLost 0 - 6 against Chesterfield on December 12th 2020.LLost 0 - 3 against Boreham Wood on January 2nd 2021.
23 team hasn't moved Dover 12 2 1 9 8 29 -21 7 LLost 1 - 5 against Woking on November 17th 2020.LLost 0 - 2 against King's Lynn Town on November 21st 2020.LLost 0 - 1 against Dagenham & Redbridge on December 26th 2020.DDrew 1 - 1 against Boreham Wood on January 12th 2021.LLost 1 - 3 against Wrexham on January 16th 2021.
Last updated 19th January 2021 at 20:54
Please note: All times UK. Tables are subject to change. The BBC is not responsible for any changes that may be made.


text:
El Aeropuerto de Morón  es uno de los aeropuertos de Argentina, situado en el partido de Morón, en la provincia de Buenos Aires. Este aeropuerto es sede de la Base Aérea Militar Morón de la Fuerza Aérea Argentina.

Historia
El aeropuerto de Morón fue habilitado en la década de 1940 sobre tierras donadas por la familia Merlo Gómez. En sus inicios disponía de una pista de 3500 metros que era apta para la operación de grandes aeronaves, pero el desarrollo urbano en los alrededores fue limitando su funcionalidad; en la actualidad posee una pista de 2817 x 38 m y 7 calles de rodaje.

En 1948 se inauguró su gran edificio central, que sólo fue utilizado durante un año, hasta la inauguración del Aeropuerto Internacional de Ezeiza, cuando quedó desafectado como aeropuerto internacional.

Luego fue el asiento del la VII Brigada Aérea; para cumplir con esta función, durante los años 1970 se construyeron otros importantes edificios (casino de oficiales, casino de tropas, hangares, viviendas para los altos jefes). En 1987 la brigada fue trasladada a José C. Paz.

En 2009 comenzó a funcionar como aeródromo civil bajo control de la Administración Nacional de Aviación Civil (ANAC), compartiendo aún parte de las instalaciones con la Fuerza Aérea Argentina, según ordenó el decreto 825/2009 publicado por el Gobierno Nacional Argentino.

En la actualidad es la sede del Instituto Nacional de Aviación Civil (INAC) y en sus terrenos se aloja el Museo Nacional de Aeronáutica y varias escuelas de vuelo. También alojó las instalaciones de la desaparecida empresa CATA Línea Aérea que brindaba servicios de pasajeros, carga y correo desde Ezeiza y Aeroparque.

Estadísticas
En 2019 el aeropuerto registró 67.835 movimientos totales anuales, colocándolo como el tercer aeropuerto con mayor cantidad de movimientos de aeronaves de Argentina detrás del Aeroparque Jorge Newbery  con 112.535 movimientos anuales y el Aeropuerto Internacional de Ezeiza  con 84.437 movimientos.

Referencias

  en el Atlas Ambiental de Buenos Aires.
 Aeropuerto Presidente Rivadavia

Enlaces externos
 Aeropuerto de Morón  en World Aero Data (en inglés).

Morón
Morón
Morón
Morón
Arquitectura de Argentina de 1948


Join us at the Recruit in Canada Fair in Toronto, ON! The NYU School of Professional Studies offers 20 Masters degrees that provide students practical knowledge and skills based on emerging industry trends, opportunities and research. Come meet one of our Admissions Officers to learn more about our graduate study options and get answers to your questions about our application process.
This event will take place at the Toronto, ON!


text:
using System;
using System.Collections.Generic;
using System.Runtime.InteropServices;

namespace OVR {

//-------------------------------------------------------------------------------------
// ***** OVRHmd
//
// Wraps access to CAPI

// ovrVector2
[StructLayout(LayoutKind.Sequential)]
public struct ovrVector2i
{
    public int x, y;

    public ovrVector2i(int _x, int _y)
    {
        x = _x;
        y = _y;
    }
};

// ovrSizei
[StructLayout(LayoutKind.Sequential)]
public struct ovrSizei
{
    public int w, h;

    public ovrSizei(int _w, int _h)
    {
        w = _w;
        h = _h;
    }
};

// ovrRecti
[StructLayout(LayoutKind.Sequential)]
public struct ovrRecti
{
    public ovrVector2i Pos;
    public ovrSizei    Size;
};

// ovrQuatf
[StructLayout(LayoutKind.Sequential)]
public struct ovrQuatf
{
    public float x, y, z, w;

    public ovrQuatf(float _x, float _y, float _z, float _w)
    {
        x = _x;
        y = _y;
        z = _z;
        w = _w;
    }
};

// ovrVector2f
[StructLayout(LayoutKind.Sequential)]
public struct ovrVector2f
{
    public float x, y;

    public ovrVector2f(float _x, float _y)
    {
        x = _x;
        y = _y;
    }
};

// ovrVector3f
[StructLayout(LayoutKind.Sequential)]
public struct ovrVector3f
{
    public float x, y, z;

    public ovrVector3f(float _x, float _y, float _z)
    {
        x = _x;
        y = _y;
        z = _z;
    }
};

// ovrMatrix4f
[StructLayout(LayoutKind.Sequential)]
public struct ovrMatrix4f
{
    public float[,] m;

    public ovrMatrix4f(ovrMatrix4f_Raw raw)
    {
        this.m = new float[,] {
			{ raw.m00, raw.m01, raw.m02, raw.m03 },
			{ raw.m10, raw.m11, raw.m12, raw.m13 },
			{ raw.m20, raw.m21, raw.m22, raw.m23 },
			{ raw.m30, raw.m31, raw.m32, raw.m33 } };
    }
};

[StructLayout(LayoutKind.Sequential)]
public struct ovrMatrix4f_Raw
{
    public float m00;
    public float m01;
    public float m02;
    public float m03;

    public float m10;
    public float m11;
    public float m12;
    public float m13;

    public float m20;
    public float m21;
    public float m22;
    public float m23;

    public float m30;
    public float m31;
    public float m32;
    public float m33;
};

// ovrPosef
// Position and orientation together.
[StructLayout(LayoutKind.Sequential)]
public struct ovrPosef
{
    public ovrQuatf    Orientation;
    public ovrVector3f Position;

    public ovrPosef(ovrQuatf q, ovrVector3f p)
    {
        Orientation = q;
        Position    = p;
    }
};

// ovrPoseStatef
// Full pose (rigid body) configuration with first and second derivatives.
[StructLayout(LayoutKind.Sequential)]
public struct ovrPoseStatef
{
    public ovrPosef     ThePose;
    public ovrVector3f  AngularVelocity;
    public ovrVector3f  LinearVelocity;
    public ovrVector3f  AngularAcceleration;
    public ovrVector3f  LinearAcceleration;
    public double       TimeInSeconds;         // Absolute time of this state sample.
};

// ovrFovPort
// Field Of View (FOV) in tangent of the angle units.
// As an example, for a standard 90 degree vertical FOV, we would
// have: { UpTan = tan(90 degrees / 2), DownTan = tan(90 degrees / 2) }.
[StructLayout(LayoutKind.Sequential)]
public struct ovrFovPort
{
    public float UpTan;
    public float DownTan;
    public float LeftTan;
    public float RightTan;
};

// ***** HMD Types

// Enumerates all HMD types that we support.
public enum ovrHmdType
{
	ovrHmd_None             = 0,
	ovrHmd_DK1              = 3,
	ovrHmd_DKHD             = 4,
	ovrHmd_DK2              = 6,
	ovrHmd_Other                        // Some HMD other then the one in the enumeration.
};

// HMD capability bits reported by device.
public enum ovrHmdCaps
{
	// Read-only flags.
	ovrHmdCap_Present           = 0x0001,   //  This HMD exists (as opposed to being unplugged).
	ovrHmdCap_Available         = 0x0002,   //  HMD and is sensor is available for Ownership use, i.e.
	//  is not owned by another app.
	ovrHmdCap_Captured          = 0x0004,   //  'true' if we captured ownership for this Hmd.

	// These flags are intended for use with the new driver display mode.
	ovrHmdCap_ExtendDesktop     = 0x0008,   // Read only, means display driver is in compatibility mode.

	// Modifiable flags (through ovrHmd_SetEnabledCaps).
	ovrHmdCap_NoMirrorToWindow  = 0x2000,   // Disables mirrowing of HMD output to the window;
	// may improve rendering performance slightly (only if ExtendDesktop is off).
	ovrHmdCap_DisplayOff        = 0x0040,   // Turns off Oculus HMD screen and output (only if ExtendDesktop is off).

	ovrHmdCap_LowPersistence    = 0x0080,   //  Supports low persistence mode.
	ovrHmdCap_DynamicPrediction = 0x0200,   //  Adjust prediction dynamically based on DK2 Latency.
	// Support rendering without VSync for debugging
	ovrHmdCap_NoVSync           = 0x1000,

	// These bits can be modified by ovrHmd_SetEnabledCaps.
	ovrHmdCap_Writable_Mask     = 0x33F0,
	// These flags are currently passed into the service. May change without notice.
	ovrHmdCap_Service_Mask      = 0x23F0
};

// Tracking capability bits reported by device.
// Used with ovrHmd_ConfigureTracking.
public enum ovrTrackingCaps
{
	ovrTrackingCap_Orientation       = 0x0010,   //  Supports orientation tracking (IMU).
	ovrTrackingCap_MagYawCorrection  = 0x0020,   //  Supports yaw correction through magnetometer or other means.
	ovrTrackingCap_Position          = 0x0040,   //  Supports positional tracking.
	ovrTrackingCap_Idle              = 0x0100,   //  Overwrites other flags; indicates that implementation
	                                             //  doesn't care about tracking settings. Default before
	                                             //  ovrHmd_ConfigureTracking is called.
};

// Distortion capability bits reported by device.
// Used with ovrHmd_ConfigureRendering and ovrHmd_CreateDistortionMesh.
public enum ovrDistortionCaps
{
    ovrDistortionCap_Chromatic  = 0x01,     //  Supports chromatic aberration correction.
    ovrDistortionCap_TimeWarp   = 0x02,     //  Supports timewarp.
    ovrDistortionCap_Vignette   = 0x08,     //  Supports vignetting around the edges of the view.
	ovrDistortionCap_NoRestore  = 0x10,     //  Do not save and restore the graphics state when rendering distortion.
	ovrDistortionCap_FlipInput  = 0x20,     //  Flip the vertical texture coordinate of input images.
	ovrDistortionCap_SRGB       = 0x40,     //  Assume input images are in SRGB gamma-corrected color space.
	ovrDistortionCap_Overdrive  = 0x80,     //  Overdrive brightness transitions to dampen high contrast artifacts on DK2+ displays
    ovrDistortionCap_ProfileNoTimewarpSpinWaits = 0x10000,  // Use when profiling with timewarp to remove false positives
};

// Specifies which eye is being used for rendering.
// This type explicitly does not include a third "NoStereo" option, as such is
// not required for an HMD-centered API.
public enum ovrEyeType
{
    ovrEye_Left  = 0,
    ovrEye_Right = 1,
    ovrEye_Count = 2
};

// This is a complete descriptor of the HMD.
public struct ovrHmdDesc
{
    public IntPtr       Handle;  // Handle of this HMD.
    public ovrHmdType   Type;

	// Name string describing the product: "Oculus Rift DK1", etc.
    public string       ProductName;
    public string       Manufacturer;
    // HID Vendor and ProductId of the device.
    public short        VendorId;
    public short        ProductId;
    // Sensor (and display) serial number.
    public string       SerialNumber;
	// Sensor firmware
	public short        FirmwareMajor;
	public short        FirmwareMinor;
	// Fixed camera frustum dimensions, if present
    public float        CameraFrustumHFovInRadians;
    public float        CameraFrustumVFovInRadians;
    public float        CameraFrustumNearZInMeters;
    public float        CameraFrustumFarZInMeters;

    // Capability bits described by ovrHmdCaps.
    public uint         HmdCaps;
    // Capability bits described by ovrTrackingCaps.
    public uint         TrackingCaps;
    // Capability bits described by ovrDistortionCaps.
    public uint         DistortionCaps;

    // These define the recommended and maximum optical FOVs for the HMD.
    public ovrFovPort[] DefaultEyeFov;
    public ovrFovPort[] MaxEyeFov;
	public ovrEyeType[] EyeRenderOrder;

    // Resolution of the entire HMD screen (for both eyes) in pixels.
    public ovrSizei     Resolution;
    // Where monitor window should be on screen or (0,0).
    public ovrVector2i  WindowsPos;

    // Display that HMD should present on.
    // TBD: It may be good to remove this information relying on WidowPos instead.
    // Ultimately, we may need to come up with a more convenient alternative,
    // such as a API-specific functions that return adapter, or something that will
    // work with our monitor driver.

    // Windows: "\\\\.\\DISPLAY3", etc. Can be used in EnumDisplaySettings/CreateDC.
    public string       DisplayDeviceName;
    // MacOS
    public int          DisplayId;

    internal ovrHmdDesc(ovrHmdDesc_Raw raw)
    {
        this.Handle                     = raw.Handle;
        this.Type                       = (ovrHmdType)raw.Type;
        this.ProductName                = Marshal.PtrToStringAnsi(raw.ProductName);
        this.Manufacturer               = Marshal.PtrToStringAnsi(raw.Manufacturer);
		this.VendorId                   = raw.VendorId;
		this.ProductId                  = raw.ProductId;
		this.SerialNumber               = raw.SerialNumber;
		this.FirmwareMajor              = raw.FirmwareMajor;
		this.FirmwareMinor              = raw.FirmwareMinor;
        this.CameraFrustumHFovInRadians = raw.CameraFrustumHFovInRadians;
        this.CameraFrustumVFovInRadians = raw.CameraFrustumVFovInRadians;
        this.CameraFrustumNearZInMeters = raw.CameraFrustumNearZInMeters;
        this.CameraFrustumFarZInMeters  = raw.CameraFrustumFarZInMeters;
        this.HmdCaps                    = raw.HmdCaps;
        this.TrackingCaps               = raw.TrackingCaps;
        this.DistortionCaps             = raw.DistortionCaps;
        this.Resolution                 = raw.Resolution;
        this.WindowsPos                 = raw.WindowsPos;
        this.DefaultEyeFov              = new ovrFovPort[2] { raw.DefaultEyeFov_0, raw.DefaultEyeFov_1 };
        this.MaxEyeFov                  = new ovrFovPort[2] { raw.MaxEyeFov_0, raw.MaxEyeFov_1 };
		this.EyeRenderOrder = new ovrEyeType[2] { ovrEyeType.ovrEye_Left, ovrEyeType.ovrEye_Right };
        this.DisplayDeviceName          = Marshal.PtrToStringAnsi(raw.DisplayDeviceName);
        this.DisplayId                  = raw.DisplayId;
    }
};

// Internal description for HMD; must match C 'ovrHmdDesc' layout.
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
internal struct ovrHmdDesc_Raw
{
    public IntPtr       Handle;
    public uint         Type;
    // Use IntPtr so that CLR doesn't try to deallocate string.
    public IntPtr       ProductName;
    public IntPtr       Manufacturer;
    // HID Vendor and ProductId of the device.
    public short        VendorId;
    public short        ProductId;
    // Sensor (and display) serial number.
    [MarshalAsAttribute(UnmanagedType.ByValTStr, SizeConst = 24)]
    public string       SerialNumber;
	// Sensor firmware
	public short        FirmwareMajor;
	public short        FirmwareMinor;
	// Fixed camera frustum dimensions, if present
    public float        CameraFrustumHFovInRadians;
    public float        CameraFrustumVFovInRadians;
    public float        CameraFrustumNearZInMeters;
    public float        CameraFrustumFarZInMeters;
    public uint         HmdCaps;
    public uint         TrackingCaps;
    public uint         DistortionCaps;
    // C# arrays are dynamic and thus not supported as return values, so just expand the struct.
    public ovrFovPort   DefaultEyeFov_0;
    public ovrFovPort   DefaultEyeFov_1;
	public ovrFovPort   MaxEyeFov_0;
    public ovrFovPort   MaxEyeFov_1;
	public ovrEyeType   EyeRenderOrder_0;
	public ovrEyeType   EyeRenderOrder_1;
	public ovrSizei     Resolution;
	public ovrVector2i  WindowsPos;
    public IntPtr       DisplayDeviceName;
    public int          DisplayId;
};

// Bit flags describing the current status of sensor tracking.
public enum ovrStatusBits
{
    ovrStatus_OrientationTracked    = 0x0001,   // Orientation is currently tracked (connected and in use).
    ovrStatus_PositionTracked       = 0x0002,   // Position is currently tracked (false if out of range).
    ovrStatus_CameraPoseTracked     = 0x0004,   // Camera pose is currently tracked.
    ovrStatus_PositionConnected     = 0x0020,   // Position tracking HW is conceded.
    ovrStatus_HmdConnected          = 0x0080    // HMD Display is available & connected.
};

public struct ovrSensorData
{
    public ovrVector3f    Accelerometer;    // Acceleration reading in in m/s^2.
    public ovrVector3f    Gyro;             // Rotation rate in rad/s.
    public ovrVector3f    Magnetometer;     // Magnetic field in Gauss.
    public float          Temperature;      // Temperature of sensor in degrees Celsius.
    public float          TimeInSeconds;    // Time when reported IMU reading took place, in seconds.
};

// Tracking state at a given absolute time (describes HMD location, etc).
// Returned by ovrHmd_GetTrackingState.
[StructLayout(LayoutKind.Sequential)]
public struct ovrTrackingState
{
    // Predicted pose configuration at requested absolute time.
	// The look-ahead interval is equal to (HeadPose.TimeInSeconds - RawSensorData.TimeInSeconds).
    public ovrPoseStatef HeadPose;
	// Current orientation and position of the external camera, if present.
    // This pose will include camera tilt (roll and pitch). For a leveled coordinate
    // system use LeveledCameraPose instead.
	public ovrPosef      CameraPose;
    // Camera frame aligned with gravity.
    // This value includes position and yaw of the camera, but not roll and pitch.
    // Can be used as a reference point to render real-world objects in the correct place.
    public ovrPosef       LeveledCameraPose;
    // Most recent sensor data received from the HMD.
    public ovrSensorData  RawSensorData;
    // Sensor status described by ovrStatusBits.
    public uint          StatusFlags;
};

// Frame timing data reported by ovrHmd_BeginFrameTiming() or ovrHmd_BeginFrame().
[StructLayout(LayoutKind.Sequential)]
public struct ovrFrameTiming
{
    // The amount of time that has passed since the previous frame returned
    // BeginFrameSeconds value, usable for movement scaling.
    // This will be clamped to no more than 0.1 seconds to prevent
    // excessive movement after pauses for loading or initialization.
    public float    DeltaSeconds;

    // It is generally expected that the following hold:
    // ThisFrameSeconds < TimewarpPointSeconds < NextFrameSeconds <
    // EyeScanoutSeconds[EyeOrder[0]] <= ScanoutMidpointSeconds <= EyeScanoutSeconds[EyeOrder[1]]

    // Absolute time value of when rendering of this frame began or is expected to
    // begin; generally equal to NextFrameSeconds of the previous frame. Can be used
    // for animation timing.
    public double   ThisFrameSeconds;
    // Absolute point when IMU expects to be sampled for this frame.
    public double   TimewarpPointSeconds;
    // Absolute time when frame Present + GPU Flush will finish, and the next frame starts.
    public double   NextFrameSeconds;

    // Time when when half of the screen will be scanned out. Can be passes as a prediction
    // value to ovrHmd_GetTrackingState() go get general orientation.
    public double   ScanoutMidpointSeconds;
    // Timing points when each eye will be scanned out to display. Used for rendering each eye.
    public double[] EyeScanoutSeconds;

    internal ovrFrameTiming(ovrFrameTiming_Raw raw)
    {
        this.DeltaSeconds           = raw.DeltaSeconds;
        this.ThisFrameSeconds       = raw.ThisFrameSeconds;
        this.TimewarpPointSeconds   = raw.TimewarpPointSeconds;
        this.NextFrameSeconds       = raw.NextFrameSeconds;
        this.ScanoutMidpointSeconds = raw.ScanoutMidpointSeconds;
        this.EyeScanoutSeconds      = new double[2] { raw.EyeScanoutSeconds_0, raw.EyeScanoutSeconds_1 };
    }
};

// Internal description for ovrFrameTiming; must match C 'ovrFrameTiming' layout.
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
internal struct ovrFrameTiming_Raw
{
    public float  DeltaSeconds;
    public double ThisFrameSeconds;
    public double TimewarpPointSeconds;
    public double NextFrameSeconds;
    public double ScanoutMidpointSeconds;
    // C# arrays are dynamic and thus not supported as return values, so just expand the struct.
    public double EyeScanoutSeconds_0;
    public double EyeScanoutSeconds_1;
};

// Rendering information for each eye, computed by either ovrHmd_ConfigureRendering().
// or ovrHmd_GetRenderDesc() based on the specified Fov.
// Note that the rendering viewport is not included here as it can be
// specified separately and modified per frame though:
//    (a) calling ovrHmd_GetRenderScaleAndOffset with game-rendered api,
// or (b) passing different values in ovrTexture in case of SDK-rendered distortion.
[StructLayout(LayoutKind.Sequential)]
public struct ovrEyeRenderDesc
{
    ovrEyeType  Eye;
    ovrFovPort  Fov;
	ovrRecti    DistortedViewport;          // Distortion viewport
    ovrVector2f PixelsPerTanAngleAtCenter;  // How many display pixels will fit in tan(angle) = 1.
    ovrVector3f ViewAdjust;                 // Translation to be applied to view matrix.
};

//-----------------------------------------------------------------------------------
// ***** Platform-independent Rendering Configuration

// These types are used to hide platform-specific details when passing
// render device, OS and texture data to the APIs.
//
// The benefit of having these wrappers vs. platform-specific API functions is
// that they allow game glue code to be portable. A typical example is an
// engine that has multiple back ends, say GL and D3D. Portable code that calls
// these back ends may also use LibOVR. To do this, back ends can be modified
// to return portable types such as ovrTexture and ovrRenderAPIConfig.

public enum ovrRenderAPIType
{
    ovrRenderAPI_None,
    ovrRenderAPI_OpenGL,
    ovrRenderAPI_Android_GLES,  // May include extra native window pointers, etc.
    ovrRenderAPI_D3D9,
    ovrRenderAPI_D3D10,
    ovrRenderAPI_D3D11,
    ovrRenderAPI_Count
};

// Platform-independent part of rendering API-configuration data.
// It is a part of ovrRenderAPIConfig, passed to ovrHmd_Configure.
[StructLayout(LayoutKind.Sequential)]
public struct ovrRenderAPIConfigHeader
{
    public ovrRenderAPIType API;
    public ovrSizei         RTSize;
    public int              Multisample;
};

[StructLayout(LayoutKind.Sequential)]
public struct ovrRenderAPIConfig
{
    public ovrRenderAPIConfigHeader Header;
    public IntPtr[]                 PlatformData;

	internal ovrRenderAPIConfig(ovrRenderAPIConfig_Raw raw)
	{
		this.Header = raw.Header;
		this.PlatformData = new IntPtr[8] {
			raw.PlatformData_0,
		   	raw.PlatformData_1,
			raw.PlatformData_2,
		   	raw.PlatformData_3,
		   	raw.PlatformData_4,
		   	raw.PlatformData_5,
		   	raw.PlatformData_6,
		   	raw.PlatformData_7 };
	}
};

// Internal description for ovrFrameTiming; must match C 'ovrFrameTiming' layout.
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public struct ovrRenderAPIConfig_Raw
{
    public ovrRenderAPIConfigHeader Header;
    public IntPtr                   PlatformData_0;
    public IntPtr                   PlatformData_1;
    public IntPtr                   PlatformData_2;
    public IntPtr                   PlatformData_3;
    public IntPtr                   PlatformData_4;
    public IntPtr                   PlatformData_5;
    public IntPtr                   PlatformData_6;
    public IntPtr                   PlatformData_7;
};

// Platform-independent part of eye texture descriptor.
// It is a part of ovrTexture, passed to ovrHmd_EndFrame.
//  - If RenderViewport is all zeros, will be used.
[StructLayout(LayoutKind.Sequential)]
public struct ovrTextureHeader
{
    public ovrRenderAPIType API;
    public ovrSizei         TextureSize;
    public ovrRecti         RenderViewport;  // Pixel viewport in texture that holds eye image.
};

[StructLayout(LayoutKind.Sequential)]
public struct ovrTexture
{
    public ovrTextureHeader Header;
    public IntPtr[]         PlatformData;

	internal ovrTexture(ovrTexture_Raw raw)
	{
		this.Header = raw.Header;
		this.PlatformData = new IntPtr[8] {
			raw.PlatformData_0,
		   	raw.PlatformData_1,
			raw.PlatformData_2,
		   	raw.PlatformData_3,
		   	raw.PlatformData_4,
		   	raw.PlatformData_5,
		   	raw.PlatformData_6,
		   	raw.PlatformData_7 };
	}
};

[StructLayout(LayoutKind.Sequential)]
public struct ovrTexture_Raw
{
    public ovrTextureHeader Header;
    public IntPtr           PlatformData_0;
    public IntPtr           PlatformData_1;
    public IntPtr           PlatformData_2;
    public IntPtr           PlatformData_3;
    public IntPtr           PlatformData_4;
    public IntPtr           PlatformData_5;
    public IntPtr           PlatformData_6;
    public IntPtr           PlatformData_7;
};

// Describes a vertex used for distortion; this is intended to be converted into
// the engine-specific format.
// Some fields may be unused based on ovrDistortionCaps selected. TexG and TexB, for example,
// are not used if chromatic correction is not requested.
[StructLayout(LayoutKind.Sequential)]
public struct ovrDistortionVertex
{
    public ovrVector2f ScreenPosNDC;    // [-1,+1],[-1,+1] over the entire framebuffer.
    public float       TimeWarpFactor;  // Lerp factor between time-warp matrices. Can be encoded in Pos.z.
    public float       VignetteFactor;  // Vignette fade factor. Can be encoded in Pos.w.
    public ovrVector2f TanEyeAnglesR;
    public ovrVector2f TanEyeAnglesG;
    public ovrVector2f TanEyeAnglesB;
};

public struct ovrDistortionMesh
{
    public ovrDistortionVertex[] pVertexData;
    public short[]               pIndexData;
    public uint                  VertexCount;
    public uint                  IndexCount;

    internal ovrDistortionMesh(ovrDistortionMesh_Raw raw)
    {
        this.VertexCount = raw.VertexCount;
        this.pVertexData = new ovrDistortionVertex[this.VertexCount];
        this.IndexCount  = raw.IndexCount;
        this.pIndexData  = new short[this.IndexCount];

        // Copy data
        System.Type vertexType = typeof(ovrDistortionVertex);
        Int32       vertexSize = Marshal.SizeOf(vertexType);
        Int32       indexSize  = sizeof(short);
        Int64       pvertices  = raw.pVertexData.ToInt64();
        Int64       pindices   = raw.pIndexData.ToInt64();

		// TODO: Investigate using Marshal.Copy() or Buffer.BlockCopy() for improved performance

        for (int i = 0; i < raw.VertexCount; i++)
        {
            pVertexData[i] = (ovrDistortionVertex)Marshal.PtrToStructure(new IntPtr(pvertices), vertexType);
            pvertices += vertexSize;
        }
        // Indices are stored as shorts.
        for (int j = 0; j < raw.IndexCount; j++)
        {
            pIndexData[j] = Marshal.ReadInt16(new IntPtr(pindices));
            pindices += indexSize;
        }
    }
};

// Describes a full set of distortion mesh data, filled in by ovrHmd_CreateDistortionMesh.
// Contents of this data structure, if not null, should be freed by ovrHmd_DestroyDistortionMesh.
[StructLayout(LayoutKind.Sequential)]
internal struct ovrDistortionMesh_Raw
{
    public IntPtr pVertexData;
    public IntPtr pIndexData;
    public uint   VertexCount;
    public uint   IndexCount;
};

// Used by ovrHmd_GetHSWDisplayState to report the current display state.
[StructLayout(LayoutKind.Sequential)]
public struct ovrHSWDisplayState
{
    public bool    Displayed;       // If true then the warning should be currently visible
                                    // and the following variables have meaning. Else there is no
                                    // warning being displayed for this application on the given HMD.
    public double  StartTime;       // Absolute time when the warning was first displayed. See ovr_GetTimeInSeconds().
    public double  DismissibleTime; // Earliest absolute time when the warning can be dismissed. May be a time in the past.
};

//-------------------------------------------------------------------------------------
//  ****** ovrHmd Class
// ovrHmd provides an interface to an HMD object.  The ovrHmd instance is normally
// created by ovrHmd::Create, after which its other methods can be called.
// The typical process would involve calling:
//
// Setup:
//   - Initialize() to initialize the OVR SDK.
//   - Create() to create an HMD.
//   - Use hmd members and ovrHmd_GetFovTextureSize() to determine graphics configuration.
//   - ConfigureTracking() to configure and initialize tracking.
//   - ConfigureRendering() to setup graphics for SDK rendering.
//   - If ovrHmdCap_ExtendDesktop is not set, use ovrHmd_AttachToWindow to associate the window with an Hmd.
//   - Allocate textures as needed.
//
// Game Loop:
//   - Call ovrHmd_BeginFrame() to get frame timing and orientation information.
//   - Render each eye in between, using ovrHmd_GetEyePose to get frame poses
//     for rendering.
//   - Call ovrHmd_EndFrame() to render distorted textures to the back buffer
//     and present them on the Hmd.
//
// Shutdown:
//   - Destroy() to release the HMD.
//   - ovr_Shutdown() to shutdown the OVR SDK.
	public class Hmd
	{
		public const string OVR_KEY_USER                   = "User";
		public const string OVR_KEY_NAME                   = "Name";
		public const string OVR_KEY_GENDER                 = "Gender";
		public const string OVR_KEY_PLAYER_HEIGHT          = "PlayerHeight";
		public const string OVR_KEY_EYE_HEIGHT             = "EyeHeight";
		public const string OVR_KEY_IPD                    = "IPD";
		public const string OVR_KEY_NECK_TO_EYE_DISTANCE   = "NeckEyeDistance";

		// Default measurements empirically determined at Oculus to make us happy
		// TODO: Need to sync these with ANSUR-88 models and tests
		public const string OVR_DEFAULT_GENDER                 = "Unknown";
		public const float OVR_DEFAULT_PLAYER_HEIGHT           = 1.778f;
		public const float OVR_DEFAULT_EYE_HEIGHT              = 1.675f;
		public const float OVR_DEFAULT_IPD                     = 0.064f;
		public const float OVR_DEFAULT_NECK_TO_EYE_HORIZONTAL  = 0.09f;
		public const float OVR_DEFAULT_NECK_TO_EYE_VERTICAL    = 0.15f;
		public const float OVR_DEFAULT_EYE_RELIEF_DIAL         = 3;

		IntPtr HmdPtr;
		// Used to return color result to avoid per-frame allocation.
		byte[] LatencyTestRgb = new byte[3];

		// -----------------------------------------------------------------------------------
		// Static Methods

		// Library init/shutdown, must be called around all other OVR code.
		// No other functions calls are allowed before Initialize succeeds or after Shutdown.
		public static bool Initialize()
		{
			return ovr_Initialize();
		}

		public static void Shutdown()
		{
			ovr_Shutdown();
		}

		// Detects or re-detects HMDs and reports the total number detected.
		// Users can get information about each HMD by calling ovrHmd_Create with an index.

		public static int Detect()
		{
			return ovrHmd_Detect();
		}

		public static Hmd Create(int index)
		{
			IntPtr hmdPtr = ovrHmd_Create(index);
			if (hmdPtr == IntPtr.Zero)
				return null;

			OVR_SetHMD(ref hmdPtr);
			return new Hmd(hmdPtr);
		}

		public static Hmd CreateDebug(ovrHmdType type)
		{
			IntPtr hmdPtr = ovrHmd_CreateDebug(type);
			if (hmdPtr == IntPtr.Zero)
				return null;

			OVR_SetHMD(ref hmdPtr);
			return new Hmd(hmdPtr);
		}

        public static Hmd GetHmd()
        {
            IntPtr hmdPtr = IntPtr.Zero;
			OVR_GetHMD(ref hmdPtr);
			return (hmdPtr != IntPtr.Zero) ? new Hmd(hmdPtr) : null;
        }

		// Used to generate projection from ovrEyeDesc::Fov.
		public static ovrMatrix4f GetProjection(ovrFovPort fov, float znear, float zfar, bool rightHanded)
		{
			return new ovrMatrix4f(ovrMatrix4f_Projection(fov, znear, zfar, rightHanded));
		}

		// Used for 2D rendering, Y is down
		// orthoScale = 1.0f / pixelsPerTanAngleAtCenter
		// orthoDistance = distance from camera, such as 0.8m
		public static ovrMatrix4f GetOrthoSubProjection(ovrMatrix4f projection, ovrVector2f orthoScale, float orthoDistance, float eyeViewAdjustX)
		{
			return new ovrMatrix4f(ovrMatrix4f_OrthoSubProjection(projection, orthoScale, orthoDistance, eyeViewAdjustX));
		}

		// Absolute time.
		public static double GetTimeInSeconds()
		{
			return ovr_GetTimeInSeconds();
		}

		// Waits until the specified absolute time.
		public static double WaitTillTime(double absTime)
		{
			return ovr_WaitTillTime(absTime);
		}

		// -----------------------------------------------------------------------------------
		// **** Constructor

		public Hmd(IntPtr hmdPtr)
		{
			this.HmdPtr = hmdPtr;
		}

        //~Hmd()
        //{
        //    if (HmdPtr != IntPtr.Zero)
        //    {
        //        ovrHmd_Destroy(HmdPtr);
        //        HmdPtr = IntPtr.Zero;
        //        OVR_SetHMD(ref HmdPtr);
        //    }
        //}

		// Destroys the resources associated with HMD.
		// No member methods should be called after Destroy.
		public void Destroy()
		{
			ovrHmd_Destroy(HmdPtr);
			HmdPtr = IntPtr.Zero;
            OVR_SetHMD(ref HmdPtr);
		}

		// Returns last error for HMD state. Returns null for no error.
		public string GetLastError()
		{
			return ovrHmd_GetLastError(HmdPtr);
		}

#if false
        public bool AttachToWindow(ovrRecti destMirrorRect, ovrRecti sourceRenderTargetRect)
        {
            return ovrHmd_AttachToWindow(HmdPtr, IntPtr.Zero, destMirrorRect, sourceRenderTargetRect);
        }
#endif

		public uint GetEnabledCaps()
		{
			return ovrHmd_GetEnabledCaps(HmdPtr);
		}

		public void SetEnabledCaps(uint capsBits)
		{
			ovrHmd_SetEnabledCaps(HmdPtr, capsBits);
		}

		public ovrHmdDesc GetDesc()
		{
			ovrHmdDesc_Raw rawDesc = (ovrHmdDesc_Raw)Marshal.PtrToStructure(HmdPtr, typeof(ovrHmdDesc_Raw));
			return new ovrHmdDesc(rawDesc);
		}

		//-------------------------------------------------------------------------------------
		// ***** Tracking Interface

		// All tracking interface functions are thread-safe, allowing sensor state to be sampled
		// from different threads.

		// ConfigureTracking starts sensor sampling, enabling specified capabilities, described by ovrTrackingCaps.
		//  - supportedTrackingCaps specifies support that is requested. The function will succeed even
		//    if these caps are not available (i.e. sensor or camera is unplugged). Support will
		//    automatically be enabled if such device is plugged in later. Software should check
		//    ovrTrackingState.StatusFlags for real-time status.
		// - requiredTrackingCaps specify sensor capabilities required at the time of the call. If they
		//   are not available, the function will fail. Pass 0 if only specifying SupportedTrackingCaps.
		// - Pass 0 for both supportedTrackingCaps and requiredTrackingCaps to disable tracking.
		public bool ConfigureTracking(uint supportedTrackingCaps, uint requiredTrackingCaps)
		{
			return ovrHmd_ConfigureTracking(HmdPtr, supportedTrackingCaps, requiredTrackingCaps);
		}

		// Re-centers the sensor orientation.
		// Normally it will recenter the (x,y,z) translational components,
		// and it will recenter the yaw component of orientation.
		public void RecenterPose()
		{
			ovrHmd_RecenterPose(HmdPtr);
		}

		// Returns sensor state reading based on the specified absolute system time.
		// Pass absTime value of 0.0 to request the most recent sensor reading; in this case
		// both HeadPose and SamplePose will have the same value.
		// ovrHmd_GetEyePose relies on this internally.
		// This may also be used for more refined timing of FrontBuffer rendering logic, etc.
		public ovrTrackingState GetTrackingState(double absTime = 0.0d)
		{
			return ovrHmd_GetTrackingState(HmdPtr, absTime);
		}

		//-------------------------------------------------------------------------------------
		// ***** Graphics Setup

		// Calculates texture size recommended for rendering one eye within HMD, given FOV cone.
		// Higher FOV will generally require larger textures to maintain quality.
		//  - pixelsPerDisplayPixel specifies that number of render target pixels per display
		//    pixel at center of distortion; 1.0 is the default value. Lower values
		//    can improve performance.
		public ovrSizei GetFovTextureSize(ovrEyeType eye, ovrFovPort fov, float pixelsPerDisplayPixel = 1.0f)
		{
			return ovrHmd_GetFovTextureSize(HmdPtr, eye, fov, pixelsPerDisplayPixel);
		}

#if false
	//TODO: ovrHmd_ConfigureRendering().
		public ovrEyeRenderDesc? ConfigureRendering(ovrEyeDesc[] eyeDescIn, uint distortionCaps)
		{
			ovrEyeRenderDesc[] eyeRenderDesc = new ovrEyeRenderDesc[] { new ovrEyeRenderDesc(), new ovrEyeRenderDesc() };
			ovrRenderAPIConfig renderAPIConfig = new ovrRenderAPIConfig();

			if (ovrHmd_ConfigureRendering(HmdPtr, renderAPIConfig, distortionCaps, eyeDescIn, eyeRenderDesc))
				return eyeRenderDesc;
			return null;
		}
#endif

		// Begins a frame, returning timing and orientation information.
		// This should be called in the very beginning of game rendering loop (on render thread),
		// ideally immediately after prior frame buffer swap (Present) was flushed and synced.
		// Pass 0 for for frame index if not using GetFrameTiming.
		public ovrFrameTiming BeginFrame(uint frameIndex = 0)
		{
			ovrFrameTiming_Raw raw = ovrHmd_BeginFrame(HmdPtr, frameIndex);
			return new ovrFrameTiming(raw);
		}

		// Ends frame, rendering textures to frame buffer. This performs distortion and scaling internally.
		// Must be called on the same thread as BeginFrame.
		public void EndFrame()
		{
			ovrHmd_EndFrame(HmdPtr);
		}

		public ovrEyeRenderDesc GetRenderDesc(ovrEyeType eyeType, ovrFovPort fov)
		{
			return ovrHmd_GetRenderDesc(HmdPtr, eyeType, fov);
		}

		// Generate distortion mesh per eye.
		// Distortion capabilities will depend on 'distortionCaps' flags; user should rely on
		// appropriate shaders based on their settings.
		// Distortion mesh data will be allocated and stored into the ovrDistortionMesh data structure,
		// which should be explicitly freed with ovrHmd_DestroyDistortionMesh.
		// Users should call ovrHmd_GetRenderScaleAndOffset to get uvScale and Offset values for rendering.
		// The function shouldn't fail unless theres is a configuration or memory error, in which case
		// ovrDistortionMesh values will be set to null.
		// This is the only function in the SDK reliant on eye relief, currently imported from profiles,
		// or overriden here.
		public ovrDistortionMesh? CreateDistortionMesh(ovrEyeType eye,
													   ovrFovPort fov,
													   uint distortionCaps)
		{
			ovrDistortionMesh_Raw rawMesh = new ovrDistortionMesh_Raw();

			if (!ovrHmd_CreateDistortionMesh(HmdPtr, eye, fov, distortionCaps, out rawMesh))
			{
				return null;
			}

			ovrDistortionMesh mesh = new ovrDistortionMesh(rawMesh);
			ovrHmd_DestroyDistortionMesh(ref rawMesh);
			return mesh;
		}

		// Computes updated 'uvScaleOffsetOut' to be used with a distortion if render target size or
		// viewport changes after the fact. This can be used to adjust render size every frame, if desired.
		public ovrVector2f[] GetRenderScaleAndOffset(ovrFovPort fov,
													 ovrSizei textureSize,
													 ovrRecti renderViewport)
		{
			ovrVector2f[] uvScaleOffsetOut;
			ovrHmd_GetRenderScaleAndOffset(fov, textureSize, renderViewport, out uvScaleOffsetOut);
			return uvScaleOffsetOut;
		}

		// Thread-safe timing function for the main thread. Caller should increment frameIndex
		// with every frame and pass the index to RenderThread for processing.
		public ovrFrameTiming GetFrameTiming(uint frameIndex)
		{
			ovrFrameTiming_Raw raw = ovrHmd_GetFrameTiming(HmdPtr, frameIndex);
			return new ovrFrameTiming(raw);
		}

		// Called at the beginning of the frame on the Render Thread.
		// Pass frameIndex == 0 if ovrHmd_GetFrameTiming isn't being used. Otherwise,
		// pass the same frame index as was used for GetFrameTiming on the main thread.
		public ovrFrameTiming BeginFrameTiming(uint frameIndex)
		{
			ovrFrameTiming_Raw raw = ovrHmd_BeginFrameTiming(HmdPtr, frameIndex);
			return new ovrFrameTiming(raw);
		}

		// Marks the end of game-rendered frame, tracking the necessary timing information. This
		// function must be called immediately after Present/SwapBuffers + GPU sync. GPU sync is important
		// before this call to reduce latency and ensure proper timing.
		public void EndFrameTiming()
		{
			ovrHmd_EndFrameTiming(HmdPtr);
		}

		// Initializes and resets frame time tracking. This is typically not necessary, but
		// is helpful if game changes vsync state or video mode. vsync is assumed to be on if this
		// isn't called. Resets internal frame index to the specified number.
		public void ResetFrameTiming(uint frameIndex)
		{
			ovrHmd_ResetFrameTiming(HmdPtr, frameIndex);
		}

		// Predicts and returns Pose that should be used rendering the specified eye.
		// Must be called between ovrHmd_BeginFrameTiming & ovrHmd_EndFrameTiming.
		public ovrPosef GetEyePose(ovrEyeType eye)
		{
			return ovrHmd_GetEyePose(HmdPtr, eye);
		}

		// Computes timewarp matrices used by distortion mesh shader, these are used to adjust
		// for orientation change since the last call to ovrHmd_GetEyePose for this eye.
		// The ovrDistortionVertex::TimeWarpFactor is used to blend between the matrices,
		// usually representing two different sides of the screen.
		// Must be called on the same thread as ovrHmd_BeginFrameTiming.
		public ovrMatrix4f[] ovrHmd_GetEyeTimewarpMatrices(ovrEyeType eye, ovrPosef renderPose)
		{
			ovrMatrix4f_Raw[] rawMats = {new ovrMatrix4f_Raw(), new ovrMatrix4f_Raw()};
			ovrHmd_GetEyeTimewarpMatrices(HmdPtr, eye, renderPose, out rawMats);

			ovrMatrix4f[] mats = {new ovrMatrix4f(rawMats[0]), new ovrMatrix4f(rawMats[1])};
			return mats;
		}

		// -----------------------------------------------------------------------------------
		// ***** Latency Test interface

		// Does latency test processing, returning rgb[3] color array if color should
		// be used to clear the screen. Return null if no clear is needed.
		public byte[] ProcessLatencyTest()
		{
			if (ovrHmd_ProcessLatencyTest(HmdPtr, out LatencyTestRgb))
				return LatencyTestRgb;
			return null;
		}

		// Returns non-null string once with latency test result, when it is available.
		// Returns null for no result.
		public string GetLatencyTestResult()
		{
			IntPtr p = ovrHmd_GetLatencyTestResult(HmdPtr);
			return (p == IntPtr.Zero) ? null : Marshal.PtrToStringAnsi(p);
		}

		//-------------------------------------------------------------------------------------
		// ***** Health and Safety Warning Display interface

		// Returns the current state of the HSW display. If the application is doing the rendering of
		// the HSW display then this function serves to indicate that the the warning should be
		// currently displayed. If the application is using SDK-based eye rendering then the SDK by
		// default automatically handles the drawing of the HSW display. An application that uses
		// application-based eye rendering should use this function to know when to start drawing the
		// HSW display itself and can optionally use it in conjunction with ovrHmd_DismissHSWDisplay
		// as described below.
		//
		// Example usage for application-based rendering:
		//    bool HSWDisplayCurrentlyDisplayed = false; // global or class member variable
		//    ovrHSWDisplayState hswDisplayState;
		//    ovrHmd_GetHSWDisplayState(Hmd, &hswDisplayState);
		//
		//    if (hswDisplayState.Displayed && !HSWDisplayCurrentlyDisplayed) {
		//        <insert model into the scene that stays in front of the user>
		//        HSWDisplayCurrentlyDisplayed = true;
		//    }
		public ovrHSWDisplayState GetHSWDisplayState()
		{
			ovrHSWDisplayState hswDisplayState;
			ovrHmd_GetHSWDisplayState(HmdPtr, out hswDisplayState);
			return hswDisplayState;
		}

		// Dismisses the HSW display if the warning is dismissible and the earliest dismissal time
		// has occurred. Returns true if the display is valid and could be dismissed. The application
		// should recognize that the HSW display is being displayed (via ovrHmd_GetHSWDisplayState)
		// and if so then call this function when the appropriate user input to dismiss the warning
		// occurs.
		//
		// Example usage :
		//    void ProcessEvent(int key) {
		//        if(key == escape) {
		//            ovrHSWDisplayState hswDisplayState;
		//            ovrHmd_GetHSWDisplayState(hmd, &hswDisplayState);
		//
		//            if(hswDisplayState.Displayed && ovrHmd_DismissHSWDisplay(hmd)) {
		//                <remove model from the scene>
		//                HSWDisplayCurrentlyDisplayed = false;
		//            }
		//        }
		//    }
		public bool DismissHSWDisplay()
		{
			return ovrHmd_DismissHSWDisplay(HmdPtr);
		}

		// -----------------------------------------------------------------------------------
		// ***** Property Access

		// These allow accessing different properties of the HMD and profile.
		// Some of the properties may go away with profile/HMD versions, so software should
		// use defaults and/or proper fallbacks.

		// Get bool property. Returns first element if property is a bool array.
		// Returns defaultValue if property doesn't exist.
		public bool GetBool(string propertyName, bool defaultVal = false)
		{
			return ovrHmd_GetBool(HmdPtr, propertyName, defaultVal);
		}

		// Get int property. Returns first element if property is an int array.
		// Returns defaultValue if property doesn't exist.
		public int GetInt(string propertyName, int defaultVal = 0)
		{
			return ovrHmd_GetInt(HmdPtr, propertyName, defaultVal);
		}

		// Get float property. Returns first element if property is a float array.
		// Returns defaultValue if property doesn't exist.
		public float GetFloat(string propertyName, float defaultVal = 0.0f)
		{
			return ovrHmd_GetFloat(HmdPtr, propertyName, defaultVal);
		}

		// Get float[] property. Returns null array if property doesn't exist.
		// Maximum of arraySize elements will be written.
		public float[] GetFloatArray(string propertyName, float[] values)
		{
			if (values == null)
				return null;

			ovrHmd_GetFloatArray(HmdPtr, propertyName, values, (uint)values.Length);
			return values;
		}

		// Get string property. Returns first element if property is a string array.
		// Returns defaultValue if property doesn't exist.
		// String memory is guaranteed to exist until next call to GetString or GetStringArray, or HMD is destroyed.
		public string GetString(string propertyName, string defaultVal = null)
		{
			IntPtr p = ovrHmd_GetString(HmdPtr, propertyName, null);
			if (p == IntPtr.Zero)
				return defaultVal;
			return Marshal.PtrToStringAnsi(p);
		}

		public const string LibFile = "OculusPlugin";

		// Imported functions from
		// OVRPlugin.dll 	(PC)
		// OVRPlugin.bundle (OSX)
		// OVRPlugin.so 	(Linux, Android)

		// -----------------------------------------------------------------------------------
		// ***** Private Interface to OculusPlugin

		// Unity Functions
		[DllImport(LibFile)]
		private static extern void OVR_SetHMD(ref IntPtr hmdPtr);
		[DllImport(LibFile)]
		private static extern void OVR_GetHMD(ref IntPtr hmdPtr);

		// -----------------------------------------------------------------------------------
		// ***** Private Interface to libOVR

		[DllImport(LibFile)]
		private static extern bool ovr_Initialize();
		[DllImport(LibFile)]
		private static extern void ovr_Shutdown();
		[DllImport(LibFile)]
		private static extern int ovrHmd_Detect();
		[DllImport(LibFile)]
		private static extern IntPtr ovrHmd_Create(int index);
		[DllImport(LibFile)]
		private static extern void ovrHmd_Destroy(IntPtr hmd);
		[DllImport(LibFile)]
		private static extern IntPtr ovrHmd_CreateDebug(ovrHmdType type);
		[DllImport(LibFile)]
		private static extern string ovrHmd_GetLastError(IntPtr hmd);
        [DllImport(LibFile)]
        private static extern bool ovrHmd_AttachToWindow(IntPtr hmd, IntPtr window, ovrRecti destMirrorRect, ovrRecti sourceRenderTargetRect);
		[DllImport(LibFile)]
		private static extern uint ovrHmd_GetEnabledCaps(IntPtr hmd);
		[DllImport(LibFile)]
		private static extern void ovrHmd_SetEnabledCaps(IntPtr hmd, uint capsBits);

		//-------------------------------------------------------------------------------------
		// ***** Sensor Interface

		[DllImport(LibFile)]
		private static extern bool ovrHmd_ConfigureTracking(IntPtr hmd, uint supportedTrackingCaps, uint requiredTrackingCaps);
		[DllImport(LibFile)]
		private static extern void ovrHmd_RecenterPose(IntPtr hmd);
		[DllImport(LibFile)]
		private static extern ovrTrackingState ovrHmd_GetTrackingState(IntPtr hmd, double absTime);

		//-------------------------------------------------------------------------------------
		// ***** Graphics Setup

		[DllImport(LibFile)]
		private static extern ovrSizei ovrHmd_GetFovTextureSize(IntPtr hmd, ovrEyeType eye, ovrFovPort fov, float pixelsPerDisplayPixel);
		[DllImport(LibFile)]
		private static extern ovrFrameTiming_Raw ovrHmd_BeginFrame(IntPtr hmd, uint frameIndex);
		[DllImport(LibFile)]
		private static extern void ovrHmd_EndFrame(IntPtr hmd);
		[DllImport(LibFile)]
		private static extern ovrEyeRenderDesc ovrHmd_GetRenderDesc(IntPtr hmd, ovrEyeType eye, ovrFovPort fov);

		//-------------------------------------------------------------------------------------
		// Stateless math setup functions

		// Used to generate projection from ovrEyeDesc::Fov
		[DllImport(LibFile)]
		private static extern ovrMatrix4f_Raw ovrMatrix4f_Projection(ovrFovPort fov, float znear, float zfar, bool rightHanded);
		[DllImport(LibFile)]
		private static extern ovrMatrix4f_Raw ovrMatrix4f_OrthoSubProjection(ovrMatrix4f projection,
																		 ovrVector2f orthoScale,
																		 float orthoDistance,
																		 float eyeViewAdjustX);
		[DllImport(LibFile)]
		private static extern double ovr_GetTimeInSeconds();
		[DllImport(LibFile)]
		private static extern double ovr_WaitTillTime(double absTime);

		// -----------------------------------------------------------------------------------
		// **** Game-side rendering API

		[DllImport(LibFile)]
		private static extern bool ovrHmd_CreateDistortionMesh(IntPtr hmd,
															   ovrEyeType eye,
															   ovrFovPort fov,
															   uint distortionCaps,
															   [Out] out ovrDistortionMesh_Raw meshData);
		[DllImport(LibFile)]
		private static extern void ovrHmd_DestroyDistortionMesh(ref ovrDistortionMesh_Raw meshData);
		[DllImport(LibFile)]
		private static extern void ovrHmd_GetRenderScaleAndOffset(ovrFovPort fov,
																  ovrSizei textureSize,
																  ovrRecti renderViewport,
																  [MarshalAs(UnmanagedType.LPArray, SizeConst = 2)]
																  [Out] out ovrVector2f[] uvScaleOffsetOut);
		[DllImport(LibFile)]
		private static extern ovrFrameTiming_Raw ovrHmd_GetFrameTiming(IntPtr hmd, uint frameIndex);
		[DllImport(LibFile)]
		private static extern ovrFrameTiming_Raw ovrHmd_BeginFrameTiming(IntPtr hmd, uint frameIndex);
		[DllImport(LibFile)]
		private static extern void ovrHmd_EndFrameTiming(IntPtr hmd);
		[DllImport(LibFile)]
		private static extern void ovrHmd_ResetFrameTiming(IntPtr hmd, uint frameIndex);
		[DllImport(LibFile)]
		private static extern ovrPosef ovrHmd_GetEyePose(IntPtr hmd, ovrEyeType eye);
		[DllImport(LibFile)]
		private static extern void ovrHmd_GetEyeTimewarpMatrices(IntPtr hmd, ovrEyeType eye, ovrPosef renderPose,
																 [MarshalAs(UnmanagedType.LPArray, SizeConst = 2)]
																 [Out] out ovrMatrix4f_Raw[] twnOut);

		// -----------------------------------------------------------------------------------
		// ***** Latency Test interface

		[DllImport(LibFile)]
		private static extern bool ovrHmd_ProcessLatencyTest(IntPtr hmd,
															 [MarshalAs(UnmanagedType.LPArray, SizeConst = 3)]
															 [Out] out byte[] rgbColorOut);
		// Returns IntPtr to avoid allocation.
		[DllImport(LibFile)]
		private static extern IntPtr ovrHmd_GetLatencyTestResult(IntPtr hmd);

		//-------------------------------------------------------------------------------------
		// ***** Health and Safety Warning Display interface

		[DllImport(LibFile)]
		private static extern void ovrHmd_GetHSWDisplayState(IntPtr hmd, [Out] out ovrHSWDisplayState hasWarningState);
		[DllImport(LibFile)]
		private static extern bool ovrHmd_DismissHSWDisplay(IntPtr hmd);

		// -----------------------------------------------------------------------------------
		// ***** Property Access

		// TODO: Expose SetBool,SetFloat,etc.

		[DllImport(LibFile)]
		private static extern bool ovrHmd_GetBool(IntPtr hmd,
												  [MarshalAs(UnmanagedType.LPStr)]
												  string propertyName,
												  bool defaultVal);
		[DllImport(LibFile)]
		private static extern int ovrHmd_GetInt(IntPtr hmd,
												[MarshalAs(UnmanagedType.LPStr)]
												string propertyName,
												int defaultVal);
		[DllImport(LibFile)]
		private static extern float ovrHmd_GetFloat(IntPtr hmd,
													[MarshalAs(UnmanagedType.LPStr)]
													string propertyName,
													float defaultVal);
		[DllImport(LibFile)]
		private static extern uint ovrHmd_GetFloatArray(IntPtr hmd,
														[MarshalAs(UnmanagedType.LPStr)]
														string propertyName,
														float[] values, // TBD: Passing var size?
														uint arraySize);
		[DllImport(LibFile)]
		private static extern IntPtr ovrHmd_GetString(IntPtr hmd,
													  [MarshalAs(UnmanagedType.LPStr)]
													  string propertyName,
													  [MarshalAs(UnmanagedType.LPStr)]
													  string defaultVal);
	}
}

redpajama_set_name: RedPajamaGithub