text:
Click here for PDF version
I. 1850 – 1874 – Educated Women
Northwestern Female College is founded by William P. Jones, Jr. and J. Wesley Jones to provide higher education for women in Evanston.
Northwestern Female College opens. The institution includes a college for women and a preparatory school for boys and girls.
The Women's Educational Aid Association is formed to promote the establishment of a college for women.
Northwestern University becomes coeducational.
Evanston College for Ladies is founded by the Women's Educational Aid Association, taking over from the struggling Northwestern Female College. The new college is entirely staffed and run by women.
Evanston resident Frances Willard is elected president of the Evanston College for Ladies. 1871
Evanston College for Ladies opens.
Evanston College for Ladies is absorbed by Northwestern and becomes the Woman's College of Northwestern University.
Frances Willard is named Dean of Women at Northwestern.
II. 1875 – 1899 – Reforming a Community
The Pro and Con Club is formed by Elizabeth Boynton Harbert as an outlet for discussion of women's suffrage issues.
The Benevolent Society of Evanston is formed by Sarah Blanchard to provide relief for families in need. The society is made up of three committees: sewing, relief and investigation, and fundraising.
The Woman's Club of Evanston is founded by Elizabeth Boynton Harbert to address social reform issues within the community such as housing, public education, and healthcare.
Louise Brockaway Stanwood is elected to the District 75 school board, becoming the first Evanston woman to hold public office. This election was also the first in which Evanston women could vote.
The King's Daughters is founded by Mary Spencer Gardner to provide young women with the opportunity to undertake charitable work within the community. Early projects include sewing clothes for families in need and raising funds for other charitable organizations.
Evanston resident Catharine Waugh McCulloch drafts a bill for woman's suffrage in Illinois. The bill is eventually enacted into law in 1913, making Illinois the first state east of the Mississippi River to grant women the right to vote in national and municipal elections.
The Fresh Air Home for Working Girls is opened by the King's Daughters to provide a twoweek sojourn during the summer for young women living and working in Chicago.
The Visiting Nurse Association of Evanston is founded by Jessie Chandler, Nancy Lutkin, and Kate McMullen to provide health services to those within the community who might not otherwise be able to afford medical care. The association focuses on infant mortality, inadequate sanitation, and the spread of infectious diseases.
III. 1900 – 1924 – Reform Becomes Work
Evanston resident Isabella Garnett graduates with a medical degree from the College of Physicians and Surgeons (now the University of Illinois College of Medicine), making her one of the first female African American physicians in Illinois.
Catharine Waugh McCulloch is elected Justice of the Peace in Evanston becoming the first woman in Illinois to be elected to the position.
The North End Mothers' Club is formed by a group of women from North Evanston to bring parents and schools together to improve children's education and welfare.
The Girls' League of Evanston (later known as the Young Women's Community Club) is founded to provide a place for young working women to gather on their lunch breaks or days off, to learn new skills and socialize with other working girls.
Dr. Isabella Garnett and her husband, Dr. Arthur Butler, open the Evanston Sanitarium and Training School in their house at 1918 Asbury Avenue. It is one of only four hospitals in the Chicago area that accept African American patients and physicians.
The Iroquois League is founded by Eva Rouse to provide African American working women with safe, economic housing. Later led by Cora Watson, the Iroquois League provided a place for young, single working girls to socialize with each other and learn new skills.
The Children's School (now Baker Demonstration School) at National College of Education is founded in Chicago by Evanston residents Edna Dean Baker and Clara Belle Baker. Clara Belle Baker becomes director of the Children's School.
The Evanston Community Kitchen is established to provide meals to families affected by the influenza epidemic and to address the "servant problem." The organization delivers hot dinners to families daily for small a fee.
Edna Dean Baker is elected president of National Kindergarten and Elementary College (now National Louis University). During her 29-year tenure, she develops new standards for early childhood education and teacher training.
The Young Women's Community Club opens a boarding house at 615 Church Street for young working women who are new to Evanston. The home provides residents with a sense of community and companionship.
The Cradle is founded by Evanston resident Florence Walrath to care for infants awaiting adoption and to find loving homes for them. It is among the nation's first private adoption agencies and becomes a leader in the effort to dignify adoption and improve the quality of infant care.
Evanston resident Dr. Gladys Dick and her husband, Dr. George Dick, develop a skin test (known as the Dick test) to determine susceptibility to scarlet fever as well as a toxin and antitoxin for the prevention and treatment of the disease.
The Iroquois League opens a boarding house and community center at 1125 Garnett Place for working African American females.
IV. 1925 – 1949 – Work Becomes More
Northwestern University professor Winifred Ward starts the Children's Theatre of Evanston, one of the first theaters for youth performance in the US. The theatre serves as a laboratory for university students studying "creative dramatics" and provides local children with the opportunity to watch or participate in theatrical productions.
The Children's School (now Baker Demonstration School) at National College of Education is relocated from the south side of Chicago to Evanston, becoming one of the first nursery schools in Chicago's northern suburbs.
Butler Memorial Hospital and the Community Hospital of Evanston merge to form a new organization for the promotion of a modern hospital for primarily African American patients and physicians. The resulting organization assumes the name Community Hospital of Evanston.
Clara, Lu, and Em is broadcast for the first time on WGN. Created by Northwestern University alumni Louise Starkey Mead, Isobel Carothers Berolzheimer, and Helen King Mitchell, the program becomes the nation's first radio soap opera.
The Community Hospital of Evanston opens in the remodeled home of Dr. Rudolph Penn at 2026 Brown Avenue with Dr. Isabella Garnett as superintendent. The hospital has 18 beds, two operating rooms, x-ray facilities, and a contagious disease ward.
Daisy Sandidge is elected alderman to the Fifth Ward, making her the first female alderman in Evanston.
Evanston native and Community Hospital staff member Dr. Elizabeth Webb Hill forms a woman's auxiliary to raise operating funds for the improvement of Community Hospital. The Woman's Auxiliary becomes a primary source of funding for the hospital.
The Delta Chi Omega Chapter of the national African American sorority Alpha Kappa Alpha is founded to provide African American college women with scholarships and community service opportunities.
Evanston Township High School graduate and Northwestern University alumna Kay Davis (Kathryn McDonald Wimp) joins the Duke Ellington Orchestra as a vocalist.
V. 1950 – Present – Politics and Activism
Community Hospital opens in a new facility to more adequately meet the needs of Evanston's growing African American population. The hospital has fifty-four beds, a nursery with twelve bassinets, two operating rooms, and two delivery rooms. Dr. Elizabeth Webb Hill is chief of staff, having been appointed to the position in the mid-1940s. She is the first African American female to be named to such a position in Illinois.
Mayme Spencer is elected alderman to the Fifth Ward, making her the first African American female alderman in Evanston.
Community Hospital is forced to close. The facility is converted into an apartment complex for adults with disabilities and dedicated in 1986 as the Hill Arboretum Apartments in memory of Elizabeth Webb Hill.
Joan Barr is elected mayor of Evanston, becoming the first woman elected to the position.
Lorraine Morton is elected mayor of Evanston, becoming the first African American elected to the position. She is the city's longest-serving mayor when she retires in 2009. Upon her retirement, City Hall is renamed the Lorraine H. Morton Civic Center in her honor.


1970s Slingerland Classic Rock Kit, Virtual Drum/Percussion from Drumdrops.
Drum Drops will launch tomorrow at 16H BST a new 1970s Slingerland drum kit for Kontakt that 15 of you can get for free.
The new Drum Drops 1970s Slingerland Classic Rock Kit sampled drums for Kontakt comprises a 24" kick, three 12", 13" and 15" rack toms, an 18" floor tom and a Slingerland Radio King 14"x7" snare with dampen, non dampened, center, rim, cross stick and edge articulations. Cymbals used used on this kit are from Zildjian, with a 22" K Custom ride, two 18" K Dark Medium Thin and 16" Vintage Cie crashes as well as New Beat 16" hi-hats.
The kit was recorded with 16 velocity layers and 5 round robins for each drum, 10 velocity layers and (12 for hi-hats) and 5 round robins for the cymbals. Recordings were performed in the Miloco The Pool studio by engineer Ben Thackeray and then mixed by Alan Moulder (Nine Inch Nails, The Killers, Foo Fighters, Led Zeppelin, Arctic Monkeys…) at Assault and Battery 1.
The 1970s Slingerland Classic Rock Kit collection is already available in Multi-Velocity, Single Hits, Drum Replacement, All Samples and One Shot Sample Packs, a BFD edition is on its way and the Kontakt 5 Pack will be released at tomorrow, May 13th at 4pm BST.
This specific edition includes 6,825 samples in total and the custom GUI for the Native Instruments sampler gives you a mixer and a Mic Blend feature to manage the microphones, multiple convolution reverbs from different studios and gears used by Drum Drops, a randomize tool for the round robins, a 4-band EQ and transient master on each channel, a stereo bus with compressor, an 8 channel step sequencer and a collection of MIDI grooves. Drum Drops also included MIDI mapping for V-Drums.
The kit will be free for the 15 first who add the kit to the cart on drumdrops.com ; the next 50 purchasers will benefit from the special price of £15, then the price will rise to £20 for the next 50, then £30 for 50 more and if you're late, you'll pay the full price of £40.
The SampleRobot Volca-X edition is out Announced last March, the Skylife SampleRobot Volca-X special edition for the Korg Volca Sample is now available with an early bird offer.
The WNP Channel Strip E871 for $9.99 WNP Sounds offers a great discount off its Channel Strip E871 VST plug-in for Windows for a limited time.
Universal Audio updates UAD Software to v8.1 Universal Audio adds three new plug-ins to the UAD-2 and Apollo platforms in the newly released UAD Software v8.1 update.


I joined the team at Watson Realty Corp in Deland in 2011, and it has proved to be a fantastic opportunity for me to stay connected with all the educational and technical resources that are so greatly valued in today�s modern world of Real Estate. I strive to continuously attend educational courses, attend real estate meetings and study market trends. I have successfully taken courses regarding working with investors, working with HUD and REO properties. I am happy to work with buyers of all ages helping match an individual or family to the specific property that suits their needs, wants and budget. Sellers can count on me to find the correct value of their property whether it be a single family home, New Construction, Condo, Townhome, Manufactured home, Vacant Land or Commercial property. List with Watson and your property will be on the internet the same day with enhanced Realtor.com, as well of dozens of other local national and International Property search websites. Watson is a part of �Leading Real Estate Companies of the World� as well as �Luxury Portfolio�. I can help with Referrals for buyers, sellers, as well as renters moving to or from any where in the world. Feel confident when you choose me to be your Realtor as well as Watson Realty Corp. to be there every step of the way. I will work to maintain a high standard and a professional image and to make your dream become a reality.
Bonnie has handled numerous real estate transactions for me. I was delighted with her performance. She is a real estate professional to be trusted and admired. I hope the future holds more business for us in order to work together.
Bonnie was there for me being I was a first time home buyer. Bonnie was there for me when I needed her. She answered any questions I had. She helped me with things I did not understand. If I need to sell or buy a home again I will definitely use Bonnie again. Bonnie is very professional and no matter what question I had she would answer it.
Bonnie was a wonderful realtor to work with. She was always available for viewings and guided us through our first time home buying process. She cared about us and made us feel as we were her number one priority.
Bonnie was extremely helpful in my search for my first home. She was very thorough and was always there. It didn't take long for her to find what I now call home!
SNS Home Inspections LLC has worked with Bonnie on numerous transactions. She is one of the most compassionate and caring Realtors we have met. Always attentive to her buyers needs and professionally guiding them to find their perfect home. It has been a great pleasure working with her and highly recommend Bonnie to any buyer or seller looking for that extra attention and care that she provides.


EaglePro serves two distinct markets: Proprietary products for the consumer electronics and telecommunications industry and a full service contract manufacturer. Our facility is located in jackson, MI stratetically situated on the I-94 corridor between chicago and detroit to serve all customers. our equipment fits a diverse range of tonnage allowing us to be an "extension" to your manufacturing needs.
metal stamping Our metal stamping operation is equipped and staffed to serve all of your project requirements. We provide unparalleled service through dedication, competitiveness, quality, on time deliveries, and pride in customer satisfaction.
fabricationLeveraging over 80 years combined experience, EaglePro Communications is ready to manage your most challenging metals project.
EaglePro's powder coating division is committed to quality. With two fully automated lines designed to run at 12 feet per minute, capacity has reached new levels. The lines contain a 5-stage iron phosphate pre-treatment system with non-chrome seal, a wash system equipped with controllers and levers, and automatic reciprocating powder guns.
In addition to manufacturing, EaglePro Communications has mastered the art of the assembly line with dozens of years experience in the telecommunications industry.


Richard M. Rogers, PE has been named Regional Director of Energy in Larson Design Group's Morgantown, WV office.
Rogers is a registered professional engineer and has more than 17 years of experience in project management, environmental permitting, oil and gas, mining, geotechnical, and construction management.
He earned a Bachelor of Science in Chemical Engineering from West Virginia University and is a 2013 graduate of Leadership West Virginia.
As a Fairmont, WV native, Rogers is active in the community. He has been a youth sports coach in Marion County for nearly ten years and has served as the president and vice president of Fairmont Little League. He is also a member of several professional organizations including WVONGA, ASHE, and the Chamber of Commerce for Monongalia and Marion Counties.
Larson Design Group is a growing, employee-owned engineering, architecture, and survey firm that teams with clients to provide responsive, innovative solutions to facility, transportation, land development, and environmental needs.
I was impressed with the consistent understanding and passion with which the culture and vision of LDG was relayed to me during conversations with employees prior to accepting the position.


text:
Oscar Wilde's former street named the most expensive in England
December 22, 2021December 22, 2021By admin
It was once home to literary and artistic greats including Oscar Wilde, but now Tite Street in west London has a new claim to fame after Halifax named it the most expensive street in England and Wales, with an average house price of £28.9m.
The mortgage lender said the top 10 priciest streets in 2021 were all in the capital, mainly in Westminster or the borough of Kensington and Chelsea, where Tite Street is situated.
However, its £28.9m average property price is 5% lower than the £30.5m recorded for the most expensive street a year ago – Avenue Road in London's St John's Wood.
Halifax added that desirable roads outside the capital had seen prices increase at a faster rate. London has typically not experienced the same property boom as other regions this year, as pandemic-fuelled desires for a new lifestyle led many to quit big cities for homes elsewhere with more space and bigger gardens.
The average price of a home on one of the 10 most expensive streets in the north of England and the West Midlands increased by 11% in a year, making them the two best-performing regions, said the Halifax. In the north-west, prices have typically increased by 5%, followed by the East Midlands at 4%. London, by contrast, experienced just a 1% rise.
Tite Street, lined with red brick mansion blocks and set between the banks of the River Thames to the south and Kings Road to the north, has risen from No 2 on the list last year to the top spot. However, you do not need to spend close to £30m to own a slice of this prime real estate: a two-bedroom flat in the street is currently for sale and has been reduced to £1.65m, according to property website Rightmove.
Wilde was the street's most famous resident, reaching the height of his fame while living at No 34, where he wrote The Picture of Dorian Gray and The Importance of Being Earnest. Other notable residents included the American artists James McNeill Whistler and John Singer Sargent.
On 27 November 1974, the IRA carried out two bomb attacks in Tite Street. A small bomb exploded in a post box and was followed by a larger one that went off behind a hedge, injuring 20, including six police officers and two ambulance workers. Twenty years later, Diana, Princess of Wales posed for a portrait at No 33.
Last week, Halifax forecast that the boom in UK house prices was likely to end next year as household finances become increasingly stretched. Rightmove said earlier this month that the UK's housing market was likely to return to more normal levels of activity in 2022 but would still be "busy".
Halifax said its latest data was based on transactions between January 2016 and September 2021 recorded on the Land Registry database and compiled from more than 1.78m postcodes. Only locations where there have been at least two transactions over the period are included.
The most expensive street in each region
Greater London – Tite Street, Chelsea: average price of a home £28,902,000
South-east England – South Ridge, Weybridge, Surrey: £7,125,000
North-west England – Barrow Lane, Hale, Altrincham, Greater Manchester: £3,706,000
East Anglia – Chaucer Road, Cambridge: £3,610,000
South-west England – Pearce Avenue, Poole, Dorset: £3,478,000
East Midlands – Benscliffe Road, Newtown Linford, Leicester: £3,288,000
West Midlands – Carpenter Road, Edgbaston, Birmingham: £3,088,000
North of England – Old Hall Road, Windermere, Cumbria: £2,508,000
Wales – Benar Headland, Pwllheli, Gwynedd: £2,152,000
Yorkshire and the Humber – Fulwith Mill Lane, Harrogate, North Yorkshire: £1,797,000
House prices, Housing market
Previous postTaylor Wimpey drops costly leasehold terms after investigationNext postOne dead and dozens feared missing after boat sinks off Greek island

redpajama_set_name: RedPajamaCommonCrawl


The Republic is at war! They desperately need credits to fund their armies and assure the continuation of clones! Equestria is at war with the Griffons! Equestria needs more allies. Will the two factions click? Cody will be the judge of that!
Thank u for the fave!!


Swing into action with our Happy Sloth Enamel Keyring. In classic shades of brown with a bright pop of green to bring our little friend to life, this fashion accessory is a fun and adorable addition to your key set! We all know someone who is obsessed with these lovely creatures, so why not treat them to this perfect gift?!


text:
876 Matching Results
Results: 1 - 24 of 876 next
Partners 3 Collections 12 Serial/Series Titles 16 Resource Types 13 World Regions 2 Countries 2 U.S. States 2 Counties 7 Months 12 Days 31 Languages 6 Access 2 Departments 8 Degree Discipline 8 Degree Level 2
County: Dallas County, TX Year: 1996 Clear All Filters
[Medium shot of a man smiling and posing for the camera, with his arms crossed]
Description: Medium shot photograph of a man smiling and posing for the camera, with his arms crossed, taken at a production of "He Say...She Say...But What Does God Say?" directed by David Talbert sponsored by The Black Academy of Arts and Letters in Dallas, Texas. The man is wearing a fedora, a watch on his left hand's wrist, and holding sunglasses with his right hand.
[Medium shot of a man with his arms out, smiling and posing for the camera]
Description: Medium shot photograph of a man with his arms out, smiling and posing for the camera, taken at a production of "He Say...She Say...But What Does God Say?" directed by David Talbert sponsored by The Black Academy of Arts and Letters in Dallas, Texas. In the background, there are clothes and dressing stands.
[A man in a suit, walking on the stage, with another man crocheting on his right]
Description: Low angle photograph of a man standing on a stage, taken at a production of "He Say...She Say...But What Does God Say?" directed by David Talbert sponsored by The Black Academy of Arts and Letters in Dallas, Texas. Another man sits to his right while BernNadette is laying on the couch to the man's left.This production took place at the Dallas Convention Center Theatre.
[A man is standing on stage with his arms above him, with his mouth open]]
Description: Photograph of a man, with his eyes closed, raising his arms, taken at a production of "He Say...She Say...But What Does God Say?" directed by David Talbert sponsored by The Black Academy of Arts and Letters in Dallas, Texas. This production took place at the Dallas Convention Center Theatre. A theatre prop is placed on the man's left side.
[Medium shot of Tammy Collins and Franklin Kirk in mid-hug]
Description: Photograph of Tammy Collins and Franklin Kirk, hugging each other by their sides, and smiling at the camera, taken at a production of "He Say...She Say...But What Does God Say?" directed by David Talbert sponsored by The Black Academy of Arts and Letters in Dallas, Texas. This production took place at the Dallas Convention Center Theatre.
[Low angle shot from the corner of a stage, focusing on three men and a woman standing on the stage]
Description: Low angle shot photograph from the corner of a stage, focusing on three men and a woman standing on the stage, taken at a production of "He Say...She Say...But What Does God Say?" directed by David Talbert sponsored by The Black Academy of Arts and Letters in Dallas, Texas. The man on the left is standing next to a microphone while the man closest to the camera is clapping.
[High angle shot of a man, looking back to the camera with a smile, holding a water bottle]
Description: High angle photograph of a man, looking back to the camera with a smile, holding a water bottle, taken at a production of "He Say...She Say...But What Does God Say?" directed by David Talbert sponsored by The Black Academy of Arts and Letters in Dallas, Texas. Plant leaves cover the man's right eye while in the background, another man sits in a chair.
[Medium shot of a man smiling at the camera, wearing a sweater, smiling at the camera]
Description: Medium shot photograph of a man smiling at the camera, wearing a sweater, taken at a production of "He Say...She Say...But What Does God Say?" directed by David Talbert sponsored by The Black Academy of Arts and Letters in Dallas, Texas.
[High angle shot of a man sitting in a chair, putting on make-up and staring at the camera]
Description: High angle photograph of a man sitting in a chair, applying make-up with his right hand, while looking at the camera, taken at a production of "He Say...She Say...But What Does God Say?" directed by David Talbert sponsored by The Black Academy of Arts and Letters in Dallas, Texas. The man's body is slightly turned towards the camera and a beverage lies next to his left arm.
[Medium shot of a woman staring at the camera and clasping her hand together]
Description: Medium shot photograph of a woman staring at the camera and clasping her hand together, taken at a production of "He Say...She Say...But What Does God Say?" directed by David Talbert sponsored by The Black Academy of Arts and Letters in Dallas, Texas.
[Medium shot photograph of a woman smiling and leaning to her right]
Description: Medium shot photograph of a woman smiling at the camera and slightly leaning to her right, taken at a production of "He Say...She Say...But What Does God Say?" directed by David Talbert sponsored by The Black Academy of Arts and Letters in Dallas, Texas.
[Cowboy shot of a woman preparing David E. Talbert, sitting in a chair in the dressing room]
Description: Cowboy shot photograph of a woman preparing David E. Talbert, sitting in a chair in the dressing room, taken at a production of "He Say...She Say...But What Does God Say?" directed by David Talbert sponsored by The Black Academy of Arts and Letters in Dallas, Texas. In the background, there are some chairs and dressing stands.
[Medium shot of David E. Talbert, posing and smiling for the camera]
Description: Medium shot photograph of David E. Talbert smiling and posing for the camera, taken at a production of "He Say...She Say...But What Does God Say?" directed by David Talbert sponsored by The Black Academy of Arts and Letters in Dallas, Texas.
[Left-angled low angle of five people standing on a stage]
Description: Left-angled high angle shot photograph of five people standing on a stage, taken at a production of "He Say...She Say...But What Does God Say?" directed by David Talbert sponsored by The Black Academy of Arts and Letters in Dallas, Texas. A woman stands in the middle of the group while the man to her right holds a microphone.
[Medium shot of a woman, with her mouth open, holding a microphone and curling her right hand]
Description: Medium shot photograph of a woman, with her mouth open, holding a microphone and curling her right hand, taken at a production of "He Say...She Say...But What Does God Say?" directed by David Talbert sponsored by The Black Academy of Arts and Letters in Dallas, Texas. The woman is staring to the right and away from the camera.
[Right-angled medium close-up of a woman, wearing a badge labeled Jowi]
Description: Medium close-up photograph of a woman, wearing a badge labeled Jowi, taken at a production of "He Say...She Say...But What Does God Say?" directed by David Talbert sponsored by The Black Academy of Arts and Letters in Dallas, Texas. The woman is wearing a decorative vest and head scarf.
[BernNadette Stanis laying on a couch while a man reaches over to kiss her right cheek]
Description: Photograph of BernNadette Stanis, playing as lady Margerine, laying on a couch as a man is kissing her cheek, taken at a production of "He Say...She Say...But What Does God Say?" directed by David Talbert sponsored by The Black Academy of Arts and Letters in Dallas, Texas. Another man watches them as he sits to the pair's right. This production took place at the Dallas Convention Center Theatre.
[Photograph of a man clapping and smiling]
Description: Photograph of a man, angled towards the left, clapping and smiling, taken at a production of "He Say...She Say...But What Does God Say?" directed by David Talbert sponsored by The Black Academy of Arts and Letters in Dallas, Texas. An arm from someone emerges from the left side of the photograph.
[Photograph of BernNadette Stanis posing for the camera]
Description: Photograph of BernNadette Stanis, posing at a right angle for the camera. The picture was taken at a production of "He Say...She Say...But What Does God Say?" directed by David Talbert, sponsored by The Black Academy of Arts and Letters in Dallas, Texas.
[Photograph of Tammy Collins and Franklin Kirk, hugging each other]
Description: Photograph of Tammy Collins and Franklin Kirk posing for the camera, taken at a production of "He Say...She Say...But What Does God Say?" directed by David Talbert sponsored by The Black Academy of Arts and Letters in Dallas, Texas. This production took place at the Dallas Convention Center Theatre.
[Four people standing on stage, three men and one woman]
Description: This photograph is of three men and one woman taken at a production of "He Say...She Say...But What Does God Say?" directed by David Talbert sponsored by The Black Academy of Arts and Letters in Dallas, Texas. The theatre highlight is set on the man on the left and the closest man and woman on his right. This production took place at the Dallas Convention Center Theatre.
[Full shot of Kirk Franklin performing with other actors]
Description: Full shot photograph taken of a scene from the play with Kirk Franklin acting as Pastor Steven Jackson, at a production of "He Say...She Say...But What Does God Say?" directed by David Talbert sponsored by The Black Academy of Arts and Letters in Dallas, Texas. The photograph also shows a cast of performers sitting on church pews, acting as church members. This production took place at the Dallas Convention Center Theatre.
[Photograph of Ernest Thomas]
Description: Photograph of Ernest Thomas, with his right hand up against a wall and his body slightly turned towards the camera, taken at a production of "He Say...She Say...But What Does God Say?" directed by David Talbert sponsored by The Black Academy of Arts and Letters in Dallas, Texas. A plant covers Ernest Thomas' right hand.
[Photograph of Sid Burston]
Description: Photograph of Sid Burston, with his body angled towards the camera, taken at a production of "He Say...She Say...But What Does God Say?" directed by David Talbert sponsored by The Black Academy of Arts and Letters in Dallas, Texas. Sid Burston is wearing a suit and is standing in front of a sign for the women's restroom.
Partners 3
Serial/Series Titles 16
Resource Types 13
Days 31
Degree Level 2
Filter: Partners
This dialog allows you to filter your current search. Each of the Partners listed note their name and the number of records that will be limited down to if you choose that option.
UNT Libraries 19 19 UNT Libraries Special Collections 854 854 UNT Music Library 3 3
This dialog allows you to filter your current search. Each of the Collections listed note their name and the number of records that will be limited down to if you choose that option. The list can be sorted by name or the count.
Sort Collections
The Black Academy of Arts and Letters Records 454 454 College of Music Recordings 3 3 The Dallas Voice Newspaper 51 51 Dennis Vercher Collection (The Dallas Way) 26 26 Donald F. Baker Collection (The Dallas Way) 30 30 Dallas/Fort Worth American Chemical Society Publications 9 9 KXAS-NBC 5 News Collection 281 281 LGBT Collections 119 119 Resource Center LGBT Collection of the UNT Libraries 7 7 Texas Digital Newspaper Program 51 51 Texas Human Rights Foundation Collection (The Dallas Way) 5 5 UNT Theses and Dissertations 10 10
This dialog allows you to filter your current search. Each of the Serial/Series Titles listed note their name and the number of records that will be limited down to if you choose that option. The list can be sorted by name or the count.
Having trouble finding an option within the list of Serial/Series Titles? Start typing and we'll update the list to show only those items that match your needs. Try limiting with other filters first or use this comprehensive list of titles as an alternative starting point.
Sort Serial/Series Titles
Dallas/Fort Worth Black Living Legends 284 284 NBC News Clips 281 281 Dallas/Fort Worth Black Living Legends, 1996 191 191 Black Music and the Civil Rights Movement Concert 114 114 Dallas Voice 51 51 He Say...She Say...But What Does God Say? 33 33 Emerging Spirit Exhibition 23 23 Romer v Evans Majority Opinion, 1996 11 11 Southwest Retort 9 9 Protease Inhibitors, 1996 6 6 AIDS - Vancouver Conference, 1996 4 4 Ensemble Concerts 3 3 "Confide" and "Orasure", 1996 2 2 AIDS Update, 1996-03 1 1 Able vs. USA (challenging DADT), 1997 1 1 Film: It's in the Water, 1996 1 1
This dialog allows you to filter your current search. Each of the Resource Types listed note their name and the number of records that will be limited down to if you choose that option. The list can be sorted by name or the count.
Sort Resource Types
Artwork 2 2 Photograph 455 455 Presentation 1 1 Physical Object 2 2 Sound 3 3 Text 28 28 Clipping 8 8 Thesis or Dissertation 10 10 Journal/Magazine/Newsletter 11 11 Letter 19 19 Newspaper 51 51 Pamphlet 5 5 Video 281 281
North America 876 876 South Asia 1 1
Nepal 1 1 United States 876 876
Illinois 1 1 Texas 876 876
Austin County, TX 1 1 Collin County, TX 2 2 Cook County, IL 1 1 Denton County, TX 2 2 Kerr County, TX 2 2 Lubbock County, TX 1 1 Tarrant County, TX 21 21
This dialog allows you to filter your current search. Each of the Months listed note their name and the number of records that will be limited down to if you choose that option. The list can be sorted by name or the count.
Sort Months
January 42 42 February 16 16 March 24 24 April 12 12 May 55 55 June 111 111 July 43 43 August 25 25 September 16 16 October 43 43 November 36 36 December 35 35
This dialog allows you to filter your current search. Each of the Days listed note their name and the number of records that will be limited down to if you choose that option. The list can be sorted by name or the count.
Having trouble finding an option within the list of Days? Start typing and we'll update the list to show only those items that match your needs.
Sort Days
1st 11 11 2nd 38 38 3rd 10 10 4th 11 11 5th 11 11 6th 12 12 7th 8 8 8th 14 14 9th 45 45 10th 15 15 11th 6 6 12th 11 11 13th 6 6 14th 10 10 15th 12 12 16th 12 12 17th 11 11 18th 15 15 19th 26 26 20th 18 18 21st 14 14 22nd 13 13 23rd 13 13 24th 10 10 25th 15 15 26th 12 12 27th 10 10 28th 13 13 29th 12 12 30th 7 7 31st 10 10
This dialog allows you to filter your current search. Each of the Languages listed note their name and the number of records that will be limited down to if you choose that option. The list can be sorted by name or the count.
Sort Languages
English 419 419 Latin 1 1 No Language 455 455 Other 1 1 Portuguese 1 1 Spanish 1 1
Filter: Rights Access
This dialog allows you to filter your current search. Each of the Rights Access listed note their name and the number of records that will be limited down to if you choose that option.
Public 873 873 Use restricted to UNT Community 3 3
Filter: Department
This dialog allows you to filter your current search. Each of the Department listed note their name and the number of records that will be limited down to if you choose that option. The list can be sorted by name or the count.
Sort Department
Department of Psychology 4 4 Music 3 3 College of Merchandising and Hospitality Management 1 1 Department of Counseling, Development and Higher Education 1 1 Department of Political Science 1 1 Department of Sociology 1 1 Department of Teacher Education and Administration 1 1 Department of Technology 1 1
This dialog allows you to filter your current search. Each of the Discipline listed note their name and the number of records that will be limited down to if you choose that option. The list can be sorted by name or the count.
Sort Discipline
Psychology 3 3 Clinical Psychology 1 1 College Teaching 1 1 Elementary Education 1 1 Hotel and Restaurant Management 1 1 Political Science 1 1 Sociology 1 1 Special Education 1 1
Filter: Degree Level
This dialog allows you to filter your current search. Each of the Degree Level listed note their name and the number of records that will be limited down to if you choose that option.
Doctoral 8 8 Master's 2 2


Across a starfield as vast as it is unexplored, two pinpricks of light crawl. Getting closer, their crawling progress is revealed to be a trick of distance. Both specks are moving at tremendous speed.
I feel a tear splash onto the back of my hand.
Across a starfield as vast as it is unexplored, a pinprick of light hurtles. Far behind, a cluster of pinpricks mill about for a while, then turn away.
Enjoyable – a flash style (the dialogue-driven) you perform very well.


text:
Participant Stories: Julie Patterson
Gaisce2021-07-14T10:27:12+01:00April 8th, 2015|Participant Stories|
Julie first encountered Gaisce in Transition Year, and achieved her Bronze award in 2007. Almost a year later saw her achieve the Silver award. Difficulties in finding a PAL at Marino College led to Julie starting her Gold award in her second year of college, in 2011. There were more problems to come, as her PAL moved onto another post; but as Julie was approaching the end of her Gold experience, Gaisce PAL & Development Officer Marion Irwin-Gowran stepped in and reignited her enthusiasm to finish the last part of her award.
Julie's personal skill was knitting. She progressed quickly in the knitting group in her college. They concluded that the first project should be a hand – as they were knitting by hand. The finished products were exhibited in the college grounds for all to see. The group moved onto another project – guerrilla knitting: a type of street art that is installed using colourful displays of knitted or crocheted yarn. Julie's guerrilla knitting project was several colourful pieces sewed together, attached around the bark of a fir tree, on a country road in Sligo! Julie said, "It looked like a little cosy scarf on such a strong, tall tree!" Knitting was a great form of relaxation for Julie, as she made new friends in her knitting group.
"A sense of unity, a sense of purpose, a sense of community, a sense of well-being… The Gaisce Gold Award has rewarded me with each of these senses, along with one important other – that sense of loving life!!"
For her physical recreation Julie took up running, having done cross country races during her school years. She joined the local athletics club to train for her own enjoyment and satisfaction. As she preferred long-distance running, Julie had to learn how to pace herself, a skill which was very therapeutic and rewarding. Julie helped organise a 6km fun run in aid of Marcus Moore Leukaemia Treatment fund. The athletic club in college encouraged her to keep running as the dark evenings began more frequent. She took part in the Flora Women's Mini-Marathon to raise money for Acquired Brain Injury Ireland.
Julie is a parish volunteer in Drumcliffe where she paints, draws, and decorates, cooks, cleans, and on occasion plays the organ during mass. She assisted at Summer Holiday Camps and drama rehearsals for the annual nativity play; this is all welcomed by Julie, as she loves working with children. She was a member of the organising committee for a fundraising Cabaret Dinner in January 2012. She jumped at the opportunity to design artworks for events organised in her community, such as a Barn Dance within the parish, and displays around Easter & Harvest Time. Julie was delighted to take part in helping out her parish as it has given her a valuable sense of belonging, and she has since joined the Parish Visiting Team.
In June 2011, Julie travelled to Romania to complete a mission trip with The Smiles Foundation. Visiting the families within the community was one her favourite days. Along with a social worker, she sorted through donated clothes and food and distributed them to the poor families. One of the most memorable moments was after saying goodbye to one of the families, a teenage girl ran after her with a small bunch of hand-picked flowers to say thank you. Of the trip, Julie said,
"The entire project gave me the chance to re-evaluate my background and give thanks for the life I have. It has taught me to count my many blessings. I gained a sense of unity as fellow volunteers and I were all there to share our time and our love with those less fortunate. The trip taught me to be more open and it reminded me that time is an important resource that everyone may share with others if they wish"
Julie completed her adventure journey in the Wicklow Way, along with her brother who was also completing his Gold Award! They agreed upon a trail from Marlay Park to Glenmalure. The second day proved troublesome, as they missed their turn off for their trail and spent a lot of time trying to find it again. Although, like true Gaisce awardees, they learned from their mistake and became more observant. Conditions weren't helpful but they pushed through and arrived at their hostel for the night. The group were always encouraging and helpful towards one another. The entire experience gave her a great a sense of achievement, as well as a sense of pride, as she became more familiar with another part of this marvellous island.
Gaisce is hiring – CEO of Gaisce – The President's Award
Gaisce is hiring – Full-Time Project Officer
European Parliament Competition 2023


A life-size lone female in an institutional space gazes out a window at a creeping barge along the ocean horizon line, while several speed boats whiz past it. "Room to See" is an animated video composite that presents different modes and speeds of looking at still images like painting versus time-based moving images. Part hand-rendered pastel drawing, part video footage, this work challenges the viewer to slow down their looking and allow room to see anew.


text:
Following the Nazi invasion of Poland in September 1939, much of Western Poland was incorporated into Germany. Large parts of occupied central and southern Poland came under a new, German administrative region called the General Government. Krakow became the capital of the General Government and its governor, Hans Frank, established his headquarters in Wawel Castle.
Extermination camps, which were established for the sole purpose of murdering Jews and other groups deemed undesirable by the Nazis, and concentration or labour camps, were built across occupied Poland. Two of the most notorious camps, Auschwitz-Birkenau and Plaszow, were constructed close to Krakow.
Auschwitz is perhaps the most infamous of the Nazi camps built in Poland. It consisted of three main camps and up to 45 satellite camps constructed in and around the town of Oswiecim, approximately 50 kilometres west of Krakow.
Auschwitz I, the original camp, was a prototype for other extermination and labour camps. It was here that some of the first Nazi experiments in mass murder took place, and also where many non-Jewish Poles were imprisoned and executed. Auschwitz II-Birkenau was purely an extermination camp. Auschwitz III-Monowitz was a labour camp. The Nazi labour camps were intended to provide slave labour to German industry rather than to kill, but the poor conditions meant that many of the inmates perished. Many more were killed when no longer able to work.
The Nazi concentration camp at Plaszow, a district of Krakow on the south bank of the Vistula, was a labour camp. It also had several sub-camps, one of which was Oskar Schindler's factory on Lipowa Street. The main Plaszow camp was completely dismantled by the Germans as Soviet troops neared Krakow in 1945, and the bodies of thousands of its victims were disinterred and burned in an attempt to eradicate evidence.


This sounds like it will be a nice gathering of developers that care about results more than what language a solution is programmed in.
CodeMash is a unique event that will educate developers on current practices, methodologies and technology trends in variety of platforms and development languages such as Java, .NET, Ruby and PHP. Held January 18-19, 2007 at the lush Kalahari resort in Sandusky, Ohio, attendees will be able to attend a world-class technical conference amid Ohio's largest indoor waterpark. So nobody will frown if you show up in shorts, sandals, and your loudest t-shirt. You might even win a prize for doing so.
I probably won't be there, so I don't think I can win the Zune for blogging about it, but I figured it was worth a mention anyway.


Safeway Coupon Match-ups 8/3-8/9: Eggs Only $0.49 a Dozen + More!
Here are your Safeway deals for the week of Wednesday, August 3rd through Tuesday, August 9th.
Previous Post *HOT* FREE Paper Mate Pens and Mechanical Pencils at King Soopers & Kroger!
Next Post Sprouts Coupon Match-ups 8/3-8/10: Natural Chicken $1.69/lb + More!


This strip center is a wonderful location for a bakery, retail store, pharmacy, real estate office, nail salon, florist, etc. Great location off State road 52, close to US highway 19. Retail strip center with great visibility off State Road 52!
US 19 to State Road 52.
The approximate monthly Principal & Interest payment for this property would be $250. This payment is based on a 30-year loan at a fixed rate of 4.12 % with a down payment of $0. Actual lender interest rates and loan programs may vary.


text:
Q: Custom form validation in laravel 5.4 wihtout using AppServiceProvider boot() method Currently I have a form I am validating like so:
class AppServiceProvider extends ServiceProvider
{
    public function boot()
    {
        \Validator::extend('custom_validation',function($attribute, $value, $parameters){
             //validation logic
      });
    }
...

But is there a way I avoid having to place this method in the AppServiceProvider (or any service provide for that matter)?
Is there a way for me to insert it somewhere in the controller class for example (for simplicity's sake)?
I like a variant like using a making a request class (extending FormRequest) but not sure how to add the custom method to the request class.
Any suggestions would be greatly appreciated. Thanks

A: Factor out the validation rule into a class that implements Illuminate\Contracts\Validation\Rule contract. (See the section about "Using Rule Objects" 1.)
namespace App\Rules;

use Illuminate\Contracts\Validation\Rule;

class CustomValidation implements Rule
{
    public function passes($attribute, $value)
    {
        // validation logic
    }

    public function message()
    {
        return 'validation error';
    }
}

Then have a custom form request extend Illuminate\Foundation\Http\FormRequest 2
namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;
use App\Rules\CustomValidation;

class CustomFormRequest extends FormRequest
{

    public function rules()
    {
        return [
            // include rules for other fields
            'custom' => new CustomValidation,
        ];
    }
}

Carryout validation in the related controller using rules declared in your custom form request by type hinting the request on the controller method
namespace App\Http\Controllers;

use App\Http\Controllers\Controller;

class CustomActionController extends Controller
{

    protected function create(CustomFormRequest $request)
    {

    }
}

redpajama_set_name: RedPajamaStackExchange


I love to fold and dye random designs... this 2X Long Sleeve tee is Intentionally Random and unique. I use Procion dyes which are professional strength commercial dyes, the colors stay bright for years. I work with Gildan Ultra tees, they are 6.1 oz, 100% pre-shrunk cotton.


text:
Published on March 12, 2019 by David Wylie
Radio personality delivers 'potcast'
Gary Johnston has spent a lot of years in radio — and a lot of years in cannabis culture.
Now he's rolled both of those passions together into The Cannabis Potcast.
A lot has changed since the Okanagan radio personality started to fill the FM Airwaves with his dulcet tones. He used to edit clips with scissors and tape. Now he uses Adobe Audition software in his basement studio to produce his show – a task he finds even more enjoyable after a few tokes.
"Give me a good strain of sativa, give me a good project to edit, and I am gone because that's where the real joy is for me," he said.
Since launching the weekly podcast, he's put out 14 episodes exploring the ever changing landscape of Canadian cannabis culture. He's talked about senior citizen stoners, interviewed some high-profile guests and educated listeners on terpenes.
Johnston's favourite interview so far took place in episode 1, when he spoke to Newfoundlander Ian Power, the first person to purchase legal cannabis in Canada.
"It was his energy that I found really infectious," he said.
Finding his voice
For three years, Johnston has been running a voice over business, called Strong Voice Media.
"I realize that in three years, I spent a lot of time trying to convey other people's messages and my message got lost," he said.
"Cannabis has always been a big part of me. As soon as I started that first episode and knew that I was recording something for myself, it all changed in my head. It all became much more real, tangible and connected."
The original name was "Canucks on Cannabis," but he wasn't sure how the hockey club – or its fans – would react.
His son Ian was a guest on his first show and they joked about it being a "potcast." The name stuck.
Johnston said he's surprised at how many people have listened to date, adding he's looking forward to continuing to build a community as people get to know him.
As for why he enjoys cannabis:
"You don't use it because you need to make yourself feel better about stuff," said Johnston. "I don't use cannabis because I'm trying to get away from something. I don't use cannabis because I need to feel better about life. I don't need to use cannabis for all of those other reasons that people put forth.
"I use cannabis because it takes what I am doing in any particular circumstance and makes it better. For me cannabis is an enhancement. I'm already enjoying what I'm doing. I can do it without cannabis and do quite often."
Green Christmas in the Okanagan?
Flowr: Just say 'no' to irradiated pot
oz. staff • January 15, 2019


Nothing beats Hickory's small-town charm, scenic rural landscape, and convenience to both Pittsburgh and Washington, PA. Just over 740 people call this community home, making it easy to get to know your neighbors and enjoy peaceful, quiet living. Hickory residents are close to a variety of amenities in the Washington County area: Cross Creek County Park, local farms, The Meadows Racetrack & Casino, Fort Cherry Golf Club, and Consol Energy Park, to name a few.
Homes in Hickory tend to offer more interior and exterior space than properties in the city. You can find real estate ranging from 2-bedroom homes under $100,000 to multimillion-dollar estate homes with acreage in this area. According to US Census data, the average home values in Hickory are just shy of $160,000.
For those who need to commute to Pittsburgh, the drive from Hickory to Pittsburgh is about 25 miles (35 minutes). This township is also convenient to Washington, which is about a 20-minute drive away and offers public transit to Pittsburgh.
Hickory is home to the Mt. Pleasant Township Community Center, Birch Grove Farm Equestrian Training Center, and several local farms. Residents can participate in several community events, including the locally famous Hickory Apple Festival, which draws crowds from Hickory and Mt. Pleasant Township in support of the Mt. Pleasant Township Volunteer Fire Company. In nearby Washington are plenty of modern amenities, including parks, golf courses, major shopping malls and grocery stores, and a variety of other attractions. View the map below to find your favorite things to do near Hickory.
Want to know even more about residential life in rural Hickory, Pennsylvania? You don't have to look far. As your Greater Pittsburgh real estate experts, we know the details about home values, market trends, and fun things to do in this area. Feel free to contact us with any questions you might have!
Interested in living in Hickory? We can help you find the home that meets your criteria and handle all the details of buying a home. Call us at 724.941.8680 to schedule a showing! If you're still searching for home buying resources, we have a wealth of information to help you relocate to Greater Pittsburgh, calculate your mortgage payments, and receive emails about properties that might interest you. Reach out to our real estate experts if you have any questions.


text:
(function (api) {
    "use strict";

    // Globals
    var fullscreen, config;

    // Default config
    var defaults = {
        enabled:                true,
        debug:                  false,
        seekTime:               10,
        volume:                 5,
        click:                  true,
        selectors: {
            container:          ".player",
            controls:           ".player-controls",
            buttons: {
                seek:           "[data-player='seek']",
                play:           "[data-player='play']",
                pause:          "[data-player='pause']",
                restart:        "[data-player='restart']",
                rewind:         "[data-player='rewind']",
                forward:        "[data-player='fast-forward']",
                mute:           "[data-player='mute']",
                volume:         "[data-player='volume']",
                captions:       "[data-player='captions']",
                fullscreen:     "[data-player='fullscreen']"
            },
            progress: {
                container:      ".player-progress",
                buffer:         ".player-progress-buffer",
                played:         ".player-progress-played"
            },
            captions:           ".player-captions",
            duration:           ".player-duration"
        },
        classes: {
            video:              "player-video",
            videoWrapper:       "player-video-wrapper",
            audio:              "player-audio",
            stopped:            "stopped",
            playing:            "playing",
            muted:              "muted",
            captions: {
                enabled:        "captions-enabled",
                active:         "captions-active"
            },
            fullscreen: {
                enabled:        "fullscreen-enabled",
                active:         "fullscreen-active"
            }
        },
        captions: {
            defaultActive:      false
        },
        fullscreen: {
            enabled:            true,
            fallback:           true
        },
        storage: {
            enabled:            true
        },
        html: (function() {
            return [
                "
",
                    "
",
                        "Seek",
                        "<input id='seek{id}' class='player-progress-seek' type='range' min='0' max='100' step='0.5' value='0' data-player='seek'>",
                        "<progress class='player-progress-played' max='100' value='0'>",
                            "0% played",
                        "</progress>",
                        "<progress class='player-progress-buffer' max='100' value='0'>",
                            "0% buffered",
                        "</progress>",
                    "
",
                    "",
                        "<button type='button' data-player='restart'>",
                            "<svg><use xlink:href='#icon-restart'></use></svg>",
                            "Restart",
                        "</button>",
                        "<button type='button' data-player='rewind'>",
                            "<svg><use xlink:href='#icon-rewind'></use></svg>",
                            "Rewind {seektime} seconds",
                        "</button>",
                        "<button type='button' data-player='play'>",
                            "<svg><use xlink:href='#icon-play'></use></svg>",
                            "Play",
                        "</button>",
                        "<button type='button' data-player='pause'>",
                            "<svg><use xlink:href='#icon-pause'></use></svg>",
                            "Pause",
                        "</button>",
                        "<button type='button' data-player='fast-forward'>",
                            "<svg><use xlink:href='#icon-fast-forward'></use></svg>",
                            "Fast forward {seektime} seconds",
                        "</button>",
                        "",
                            "Time",
                            "00:00",
                        "",
                    "",
                    "",
                        "<input class='inverted sr-only' id='mute{id}' type='checkbox' data-player='mute'>",
                        "",
                            "<svg class='icon-muted'><use xlink:href='#icon-muted'></use></svg>",
                            "<svg><use xlink:href='#icon-volume'></use></svg>",
                            "Toggle Mute",
                        "",
                        "Volume",
                        "<input id='volume{id}' class='player-volume' type='range' min='0' max='10' value='5' data-player='volume'>",
                        "<input class='sr-only' id='captions{id}' type='checkbox' data-player='captions'>",
                        "",
                            "<svg class='icon-captions-on'><use xlink:href='#icon-captions-on'></use></svg>",
                            "<svg><use xlink:href='#icon-captions-off'></use></svg>",
                            "Toggle Captions",
                        "",
                        "<button type='button' data-player='fullscreen'>",
                            "<svg class='icon-exit-fullscreen'><use xlink:href='#icon-exit-fullscreen'></use></svg>",
                            "<svg><use xlink:href='#icon-enter-fullscreen'></use></svg>",
                            "Toggle fullscreen",
                        "</button>",
                    "",
                "
"
            ].join("\n");
    })()
    };

    // Debugging
    function _log(text, error) {
        if(config.debug && window.console) {
            console[(error ? "error" : "log")](text);
        }
    }

    // Credits: http://paypal.github.io/accessible-html5-video-player/
    // Unfortunately, due to scattered support, browser sniffing is required
    function _browserSniff() {
        var nAgt = navigator.userAgent,
            browserName = navigator.appName,
            fullVersion = ""+parseFloat(navigator.appVersion),
            majorVersion = parseInt(navigator.appVersion,10),
            nameOffset,
            verOffset,
            ix;

        // MSIE 11
        if ((navigator.appVersion.indexOf("Windows NT") !== -1) && (navigator.appVersion.indexOf("rv:11") !== -1)) {
            browserName = "IE";
            fullVersion = "11;";
        }
        // MSIE
        else if ((verOffset=nAgt.indexOf("MSIE")) !== -1) {
            browserName = "IE";
            fullVersion = nAgt.substring(verOffset+5);
        }
        // Chrome
        else if ((verOffset=nAgt.indexOf("Chrome")) !== -1) {
            browserName = "Chrome";
            fullVersion = nAgt.substring(verOffset+7);
        }
        // Safari
        else if ((verOffset=nAgt.indexOf("Safari")) !== -1) {
            browserName = "Safari";
            fullVersion = nAgt.substring(verOffset+7);
            if ((verOffset=nAgt.indexOf("Version")) !== -1) {
                fullVersion = nAgt.substring(verOffset+8);
            }
        }
        // Firefox
        else if ((verOffset=nAgt.indexOf("Firefox")) !== -1) {
            browserName = "Firefox";
            fullVersion = nAgt.substring(verOffset+8);
        }
        // In most other browsers, "name/version" is at the end of userAgent
        else if ( (nameOffset=nAgt.lastIndexOf(" ")+1) < (verOffset=nAgt.lastIndexOf("/")) ) {
            browserName = nAgt.substring(nameOffset,verOffset);
            fullVersion = nAgt.substring(verOffset+1);
            if (browserName.toLowerCase()==browserName.toUpperCase()) {
                browserName = navigator.appName;
            }
        }
        // Trim the fullVersion string at semicolon/space if present
        if ((ix=fullVersion.indexOf(";")) !== -1) {
            fullVersion=fullVersion.substring(0,ix);
        }
        if ((ix=fullVersion.indexOf(" ")) !== -1) {
            fullVersion=fullVersion.substring(0,ix);
        }
        // Get major version
        majorVersion = parseInt(""+fullVersion,10);
        if (isNaN(majorVersion)) {
            fullVersion = ""+parseFloat(navigator.appVersion);
            majorVersion = parseInt(navigator.appVersion,10);
        }
        // Return data
        return [browserName, majorVersion];
    }

    // Replace all
    function _replaceAll(string, find, replace) {
        return string.replace(new RegExp(find.replace(/([.*+?^=!:${}()|\[\]\/\\])/g, "\\$1"), "g"), replace);
    }

    // Wrap an element
    function _wrap(elements, wrapper) {
        // Convert `elms` to an array, if necessary.
        if (!elements.length) {
            elements = [elements];
        }

        // Loops backwards to prevent having to clone the wrapper on the
        // first element (see `child` below).
        for (var i = elements.length - 1; i >= 0; i--) {
            var child = (i > 0) ? wrapper.cloneNode(true) : wrapper;
            var el    = elements[i];

            // Cache the current parent and sibling.
            var parent  = el.parentNode;
            var sibling = el.nextSibling;

            // Wrap the element (is automatically removed from its current
            // parent).
            child.appendChild(el);

            // If the element had a sibling, insert the wrapper before
            // the sibling to maintain the HTML structure; otherwise, just
            // append it to the parent.
            if (sibling) {
                parent.insertBefore(child, sibling);
            } else {
                parent.appendChild(child);
            }
        }
    }

    // Toggle class on an element
    function _toggleClass(element, name, state) {
        if(element){
            if(element.classList) {
                element.classList[state ? "add" : "remove"](name);
            }
            else {
                var className = (" " + element.className + " ").replace(/\s+/g, " ").replace(" " + name + " ", "");
                element.className = className + (state ? " " + name : "");
            }
        }
    }

    // Toggle event
    function _toggleHandler(element, events, callback, toggle) {
        events = events.split(" ");

        for (var i = 0; i < events.length; i++) {
            element[toggle ? "addEventListener" : "removeEventListener"](events[i], callback, false);
        }
    }

    // Bind event
    function _on(element, events, callback) {
        _toggleHandler(element, events, callback, true);
    }

    // Unbind event
    function _off(element, events, callback) {
        _toggleHandler(element, events, callback, false);
    }

    // Get percentage
    function _getPercentage(current, max) {
        return ((current / max) * 100).toFixed(2);
    }

    // Deep extend/merge two Objects
    // http://andrewdupont.net/2009/08/28/deep-extending-objects-in-javascript/
    // Removed call to arguments.callee (used explicit function name instead)
    function _extend(destination, source) {
        for (var property in source) {
            if (source[property] && source[property].constructor && source[property].constructor === Object) {
                destination[property] = destination[property] || {};
                _extend(destination[property], source[property]);
            }
            else {
                destination[property] = source[property];
            }
        }
        return destination;
    }

    // Fullscreen API
    function _fullscreen() {
        var fullscreen = {
                supportsFullScreen: false,
                isFullScreen: function() { return false; },
                requestFullScreen: function() {},
                cancelFullScreen: function() {},
                fullScreenEventName: "",
                element: null,
                prefix: ""
            },
            browserPrefixes = "webkit moz o ms khtml".split(" ");

        // check for native support
        if (typeof document.cancelFullScreen != "undefined") {
            fullscreen.supportsFullScreen = true;
        }
        else {
            // check for fullscreen support by vendor prefix
            for (var i = 0, il = browserPrefixes.length; i < il; i++ ) {
                fullscreen.prefix = browserPrefixes[i];

                if (typeof document[fullscreen.prefix + "CancelFullScreen"] != "undefined") {
                    fullscreen.supportsFullScreen = true;
                    break;
                }
                // Special case for MS (when isn't it?)
                else if (typeof document.msExitFullscreen != "undefined" && document.msFullscreenEnabled) {
                    fullscreen.prefix = "ms";
                    fullscreen.supportsFullScreen = true;
                    break;
                }
            }
        }

        // Safari doesn't support the ALLOW_KEYBOARD_INPUT flag so set it to not supported
        // https://bugs.webkit.org/show_bug.cgi?id=121496
        if(fullscreen.prefix === "webkit" && !!navigator.userAgent.match(/Version\/[\d\.]+.*Safari/)) {
             fullscreen.supportsFullScreen = false;
        }

        // Update methods to do something useful
        if (fullscreen.supportsFullScreen) {
            // Yet again Microsoft awesomeness,
            // Sometimes the prefix is "ms", sometimes "MS" to keep you on your toes
            fullscreen.fullScreenEventName = (fullscreen.prefix == "ms" ? "MSFullscreenChange" : fullscreen.prefix + "fullscreenchange");

            fullscreen.isFullScreen = function() {
                switch (this.prefix) {
                    case "":
                        return document.fullScreen;
                    case "webkit":
                        return document.webkitIsFullScreen;
                    case "ms":
                        // Docs say document.msFullScreenElement returns undefined
                        // if no element is full screem but it returns null, cheers
                        // https://msdn.microsoft.com/en-us/library/ie/dn265028%28v=vs.85%29.aspx
                        return (document.msFullscreenElement !== null);
                    default:
                        return document[this.prefix + "FullScreen"];
                }
            };
            fullscreen.requestFullScreen = function(element) {
                return (this.prefix === "") ? element.requestFullScreen() : element[this.prefix + (this.prefix == "ms" ? "RequestFullscreen" : "RequestFullScreen")](this.prefix === "webkit" ? element.ALLOW_KEYBOARD_INPUT : null);
            };
            fullscreen.cancelFullScreen = function() {
                return (this.prefix === "") ? document.cancelFullScreen() : document[this.prefix + (this.prefix == "ms" ? "ExitFullscreen" : "CancelFullScreen")]();
            };
            fullscreen.element = function() {
                return (this.prefix === "") ? document.fullscreenElement : document[this.prefix + "FullscreenElement"];
            };
        }

        return fullscreen;
    }

    // Local storage
    function _storage() {
        var storage = {
            supported: (function() {
                try {
                    return "localStorage" in window && window.localStorage !== null;
                }
                catch(e) {
                    return false;
                }
            })()
        }
        return storage;
    }

    // Player instance
    function Plyr(container) {
        var player = this;
        player.container = container;

        // Captions functions
        // Credits: http://paypal.github.io/accessible-html5-video-player/

        // For "manual" captions, adjust caption position when play time changed (via rewind, clicking progress bar, etc.)
        function _adjustManualCaptions() {
            player.subcount = 0;
            while (_timecodeMax(player.captions[player.subcount][0]) < player.media.currentTime.toFixed(1)) {
                player.subcount++;
                if (player.subcount > player.captions.length-1) {
                    player.subcount = player.captions.length-1;
                    break;
                }
            }
        }
        // Display captions container and button (for initialization)
        function _showCaptions() {
            _toggleClass(player.container, config.classes.captions.enabled, true);

            if (config.captions.defaultActive) {
                _toggleClass(player.container, config.classes.captions.active, true);
                player.buttons.captions.setAttribute("checked", "checked");
            }
        }
        // Utilities for caption time codes
        function _timecodeMin(tc) {
            var tcpair = [];
            tcpair = tc.split(" --> ");
            return _subTcSecs(tcpair[0]);
        }
        function _timecodeMax(tc) {
            var tcpair = [];
            tcpair = tc.split(" --> ");
            return _subTcSecs(tcpair[1]);
        }
        function _subTcSecs(tc) {
            if (tc === null || tc === undefined) {
                return 0;
            }
            else {
                var tc1 = [],
                    tc2 = [],
                    seconds;
                tc1 = tc.split(",");
                tc2 = tc1[0].split(":");
                seconds = Math.floor(tc2[0]*60*60) + Math.floor(tc2[1]*60) + Math.floor(tc2[2]);
                return seconds;
            }
        }

        // Find all elements
        function _getElements(selector) {
            return player.container.querySelectorAll(selector);
        }

        // Find a single element
        function _getElement(selector) {
            return _getElements(selector)[0];
        }

        // Determine if we're in an iframe
        function _inFrame() {
            try {
                return window.self !== window.top;
            }
            catch (e) {
                return true;
            }
        }

        // Insert controls
        function _injectControls() {
            // Insert custom video controls
            _log("Injecting custom controls.");

            // Use specified html
            // Need to do a default?
            var html = config.html;

            // Replace seek time instances
            html = _replaceAll(html, "{seektime}", config.seekTime);

            // Replace all id references
            html = _replaceAll(html, "{id}", player.random);

            // Inject into the container
            player.container.insertAdjacentHTML("beforeend", html);
        }

        // Find the UI controls and store references
        function _findElements() {
            try {
                player.controls                 = _getElement(config.selectors.controls);

                // Buttons
                player.buttons = {};
                player.buttons.seek             = _getElement(config.selectors.buttons.seek);
                player.buttons.play             = _getElement(config.selectors.buttons.play);
                player.buttons.pause            = _getElement(config.selectors.buttons.pause);
                player.buttons.restart          = _getElement(config.selectors.buttons.restart);
                player.buttons.rewind           = _getElement(config.selectors.buttons.rewind);
                player.buttons.forward          = _getElement(config.selectors.buttons.forward);
                player.buttons.mute             = _getElement(config.selectors.buttons.mute);
                player.buttons.captions         = _getElement(config.selectors.buttons.captions);
                player.buttons.fullscreen       = _getElement(config.selectors.buttons.fullscreen);

                // Progress
                player.progress = {};
                player.progress.container       = _getElement(config.selectors.progress.container);

                // Progress - Buffering
                player.progress.buffer          = {};
                player.progress.buffer.bar      = _getElement(config.selectors.progress.buffer);
                player.progress.buffer.text     = player.progress.buffer.bar.getElementsByTagName("span")[0];

                // Progress - Played
                player.progress.played          = {};
                player.progress.played.bar      = _getElement(config.selectors.progress.played);
                player.progress.played.text     = player.progress.played.bar.getElementsByTagName("span")[0];

                // Volume
                player.volume                   = _getElement(config.selectors.buttons.volume);

                // Timing
                player.duration                 = _getElement(config.selectors.duration);
                player.seekTime                 = _getElements(config.selectors.seekTime);

                return true;
            }
            catch(e) {
                _log("It looks like there's a problem with your controls html. Bailing.", true);
                return false;
            }
        }

        // Setup aria attributes
        function _setupAria() {
            var label = player.buttons.play.innerText || "Play";

            // If there's a media title set, use that for the label
            if (typeof(config.title) !== "undefined" && config.title.length) {
                label += ", " + config.title;
            }

            player.buttons.play.setAttribute("aria-label", label);
        }

        // Setup media
        function _setupMedia() {
            player.media = player.container.querySelectorAll("audio, video")[0];

            // If there's no media, bail
            if(!player.media) {
                _log("No audio or video element found!", true);
                return false;
            }

            // Remove native video controls
            player.media.removeAttribute("controls");

            // Set media type
            player.type = (player.media.tagName.toLowerCase() == "video" ? "video" : "audio");

            // Add type class
            _toggleClass(player.container, config.classes[player.type], true);

            // If there's no autoplay attribute, assume the video is stopped and add state class
            _toggleClass(player.container, config.classes.stopped, (player.media.getAttribute("autoplay") === null));

            // Inject the player wrapper
            if(player.type === "video") {
                // Create the wrapper div
                var wrapper = document.createElement("div");
                wrapper.setAttribute("class", config.classes.videoWrapper);

                // Wrap the video in a container
                _wrap(player.media, wrapper);

                // Cache the container
                player.videoContainer = wrapper;
            }
        }

        // Setup captions
        function _setupCaptions() {
            if(player.type === "video") {
                // Inject the container
                player.videoContainer.insertAdjacentHTML("afterbegin", "

");

                // Cache selector
                player.captionsContainer = _getElement(config.selectors.captions);

                // Determine if HTML5 textTracks is supported
                player.isTextTracks = false;
                if (player.media.textTracks) {
                    player.isTextTracks = true;
                }

                // Get URL of caption file if exists
                var captionSrc = "",
                    kind,
                    children = player.media.childNodes;

                for (var i = 0; i < children.length; i++) {
                    if (children[i].nodeName.toLowerCase() === "track") {
                        kind = children[i].getAttribute("kind");
                        if (kind === "captions") {
                            captionSrc = children[i].getAttribute("src");
                        }
                    }
                }

                // Record if caption file exists or not
                player.captionExists = true;
                if (captionSrc === "") {
                    player.captionExists = false;
                    _log("No caption track found.");
                }
                else {
                    _log("Caption track found; URI: " + captionSrc);
                }

                // If no caption file exists, hide container for caption text
                if (!player.captionExists) {
                    _toggleClass(player.container, config.classes.captions.enabled);
                }
                // If caption file exists, process captions
                else {
                    // Turn off native caption rendering to avoid double captions
                    // This doesn't seem to work in Safari 7+, so the <track> elements are removed from the dom below
                    var tracks = player.media.textTracks;
                    for (var x=0; x < tracks.length; x++) {
                        tracks[x].mode = "hidden";
                    }

                    // Enable UI
                    _showCaptions(player);

                    // If IE 10/11 or Firefox 31+ or Safari 7+, don"t use native captioning (still doesn"t work although they claim it"s now supported)
                    if ((player.browserName === "IE" && player.browserMajorVersion === 10) ||
                            (player.browserName === "IE" && player.browserMajorVersion === 11) ||
                            (player.browserName === "Firefox" && player.browserMajorVersion >= 31) ||
                            (player.browserName === "Safari" && player.browserMajorVersion >= 7)) {
                        // Debugging
                        _log("Detected IE 10/11 or Firefox 31+ or Safari 7+.");

                        // Set to false so skips to "manual" captioning
                        player.isTextTracks = false;
                    }

                    // Rendering caption tracks
                    // Native support required - http://caniuse.com/webvtt
                    if (player.isTextTracks) {
                        _log("TextTracks supported.");

                        for (var y=0; y < tracks.length; y++) {
                            var track = tracks[y];

                            if (track.kind === "captions") {
                                _on(track, "cuechange", function() {
                                    if (this.activeCues[0]) {
                                        if (this.activeCues[0].hasOwnProperty("text")) {
                                            player.captionsContainer.innerHTML = this.activeCues[0].text;
                                        }
                                    }
                                });
                            }
                        }
                    }
                    // Caption tracks not natively supported
                    else {
                        _log("TextTracks not supported so rendering captions manually.");

                        // Render captions from array at appropriate time
                        player.currentCaption = "";
                        player.subcount = 0;
                        player.captions = [];

                        _on(player.media, "timeupdate", function() {
                            // Check if the next caption is in the current time range
                            if (player.media.currentTime.toFixed(1) > _timecodeMin(player.captions[player.subcount][0]) &&
                                player.media.currentTime.toFixed(1) < _timecodeMax(player.captions[player.subcount][0])) {
                                    player.currentCaption = player.captions[player.subcount][1];
                            }
                            // Is there a next timecode?
                            if (player.media.currentTime.toFixed(1) > _timecodeMax(player.captions[player.subcount][0]) &&
                                player.subcount < (player.captions.length-1)) {
                                    player.subcount++;
                            }
                            // Render the caption
                            player.captionsContainer.innerHTML = player.currentCaption;
                        });

                        if (captionSrc !== "") {
                            // Create XMLHttpRequest Object
                            var xhr = new XMLHttpRequest();

                            xhr.onreadystatechange = function() {
                                if (xhr.readyState === 4) {
                                    if (xhr.status === 200) {
                                        var records = [],
                                            record,
                                            req = xhr.responseText;

                                        records = req.split("\n\n");

                                        for (var r=0; r < records.length; r++) {
                                            record = records[r];
                                            player.captions[r] = [];
                                            player.captions[r] = record.split("\n");
                                        }

                                        // Remove first element ("VTT")
                                        player.captions.shift();

                                        _log("Successfully loaded the caption file via AJAX.");
                                    }
                                    else {
                                        _log("There was a problem loading the caption file via AJAX.", true);
                                    }
                                }
                            }

                            xhr.open("get", captionSrc, true);

                            xhr.send();
                        }
                    }

                    // If Safari 7+, removing track from DOM [see "turn off native caption rendering" above]
                    if (player.browserName === "Safari" && player.browserMajorVersion >= 7) {
                        _log("Safari 7+ detected; removing track from DOM.");

                        // Find all <track> elements
                        tracks = player.media.getElementsByTagName("track");

                        // Loop through and remove one by one
                        for (var t=0; t < tracks.length; t++) {
                            player.media.removeChild(tracks[t]);
                        }
                    }
                }
            }
        }

        // Setup fullscreen
        function _setupFullscreen() {
            if(player.type === "video" && config.fullscreen.enabled) {
                // Check for native support
                var nativeSupport = fullscreen.supportsFullScreen;

                if(nativeSupport || (config.fullscreen.fallback && !_inFrame())) {
                    _log((nativeSupport ? "Native" : "Fallback") + " fullscreen enabled.");

                    // Add styling hook
                    _toggleClass(player.container, config.classes.fullscreen.enabled, true);
                }
                else {
                    _log("Fullscreen not supported and fallback disabled.");
                }
            }
        }

        // Play media
        function _play() {
            player.media.play();
        }

        // Pause media
        function _pause() {
            player.media.pause();
        }

        // Restart playback
        function _restart() {
            // Move to beginning
            player.media.currentTime = 0;

            // Special handling for "manual" captions
            if (!player.isTextTracks) {
                player.subcount = 0;
            }

            // Play and ensure the play button is in correct state
            _play();
        }

        // Rewind
        function _rewind(seekTime) {
            // Use default if needed
            if(typeof seekTime !== "number") {
                seekTime = config.seekTime;
            }
            _seek(player.media.currentTime - seekTime);
        }

        // Fast forward
        function _forward(seekTime) {
            // Use default if needed
            if(typeof seekTime !== "number") {
                seekTime = config.seekTime;
            }
            _seek(player.media.currentTime + seekTime);
        }

        // Seek to time
        var _seek = function(input) {
            //var value = config.seekTime;
            var targetTime = 0;

            // If no event or time is passed, bail
            if (typeof input === "undefined") {
                return;
            }
            // Explicit position
            else if (typeof input === "number") {
                targetTime = input;
            }
            // Event
            else if (input.type === "change" || input.type === "input") {
                // It's the seek slider
                // Seek to the selected time
                targetTime = ((this.value / this.max) * player.media.duration).toFixed(1);
            }

            // Set the current time
            player.media.currentTime = targetTime;

            // Logging
            _log("Seeking to " + player.media.currentTime + " seconds");

            // Special handling for "manual" captions
            if (!player.isTextTracks && player.type === "video") {
                _adjustManualCaptions(player);
            }
        }

        // Check playing state
        function _checkPlaying() {
            _toggleClass(player.container, config.classes.playing, !player.media.paused);
            _toggleClass(player.container, config.classes.stopped, player.media.paused);
        }

        // Toggle fullscreen
        function _toggleFullscreen(event) {
            // Check for native support
            var nativeSupport = fullscreen.supportsFullScreen;

            // If it's a fullscreen change event, it's probably a native close
            if(event && event.type === fullscreen.fullScreenEventName) {
                config.fullscreen.active = fullscreen.isFullScreen();
            }
            // If there's native support, use it
            else if(nativeSupport) {
                // Request fullscreen
                if(!fullscreen.isFullScreen()) {
                    fullscreen.requestFullScreen(player.container);
                }
                // Bail from fullscreen
                else {
                    fullscreen.cancelFullScreen();
                }

                // Check if we're actually full screen (it could fail)
                config.fullscreen.active = fullscreen.isFullScreen();
            }
            else {
                // Otherwise, it's a simple toggle
                config.fullscreen.active = !config.fullscreen.active;

                // Bind/unbind escape key
                if(config.fullscreen.active) {
                    _on(document, "keyup", _handleEscapeFullscreen);
                    document.body.style.overflow = "hidden";
                }
                else {
                    _off(document, "keyup", _handleEscapeFullscreen);
                    document.body.style.overflow = "";
                }
            }

            // Set class hook
            _toggleClass(player.container, config.classes.fullscreen.active, config.fullscreen.active);
        }

        // Bail from faux-fullscreen
        function _handleEscapeFullscreen(event) {
            // If it's a keypress and not escape, bail
            if((event.which || event.charCode || event.keyCode) === 27 && config.fullscreen.active) {
                _toggleFullscreen();
            }
        }

        // Set volume
        function _setVolume(volume) {
            // Use default if needed
            if(typeof volume === "undefined") {
                if(config.storage.enabled && _storage().supported) {
                    volume = window.localStorage.plyr_volume || config.volume;
                }
                else {
                    volume = config.volume;
                }
            }
            // Maximum is 10
            if(volume > 10) {
                volume = 10;
            }

            player.volume.value = volume;
            player.media.volume = parseFloat(volume / 10);
            _checkMute();

            // Store the volume in storage
            if(config.storage.enabled && _storage().supported) {
                window.localStorage.plyr_volume = volume;
            }
        }

        // Mute
        function _toggleMute(muted) {
            // If the method is called without parameter, toggle based on current value
            if(typeof active === "undefined") {
                muted = !player.media.muted;
                player.buttons.mute.checked = muted;
            }

            player.media.muted = muted;
            _checkMute();
        }

        // Toggle captions
        function _toggleCaptions(active) {
            // If the method is called without parameter, toggle based on current value
            if(typeof active === "undefined") {
                active = (player.container.className.indexOf(config.classes.captions.active) === -1);
                player.buttons.captions.checked = active;
            }

            if (active) {
                _toggleClass(player.container, config.classes.captions.active, true);
            }
            else {
                _toggleClass(player.container, config.classes.captions.active);
            }
        }

        // Check mute state
        function _checkMute() {
            _toggleClass(player.container, config.classes.muted, (player.media.volume === 0 || player.media.muted));
        }

        // Update <progress> elements
        function _updateProgress(event) {
            var progress, text, value = 0;

            switch(event.type) {
                // Video playing
                case "timeupdate":
                case "seeking":
                    progress    = player.progress.played.bar;
                    text        = player.progress.played.text;
                    value       = _getPercentage(player.media.currentTime, player.media.duration);

                    // Set seek range value only if it's a "natural" time event
                    if(event.type == "timeupdate") {
                        player.buttons.seek.value = value;
                    }

                    break;

                // Events from seek range
                case "change":
                case "input":
                    progress    = player.progress.played.bar;
                    text        = player.progress.played.text;
                    value       = event.target.value;
                    break;

                // Check buffer status
                case "playing":
                case "progress":
                    progress    = player.progress.buffer.bar;
                    text        = player.progress.buffer.text;
                    value       = (function() {
                                    var buffered = player.media.buffered;

                                    if(buffered.length) {
                                        return _getPercentage(buffered.end(0), player.media.duration);
                                    }

                                    return 0;
                                })();
                    break;
            }

            if (progress && value > 0) {
                progress.value = value;
                text.innerHTML = value;
            }

            //_log(event);
        }

        // Update the displayed play time
        function _updateTimeDisplay() {
            player.secs = parseInt(player.media.currentTime % 60);
            player.mins = parseInt((player.media.currentTime / 60) % 60);

            // Ensure it"s two digits. For example, 03 rather than 3.
            player.secs = ("0" + player.secs).slice(-2);
            player.mins = ("0" + player.mins).slice(-2);

            // Render
            player.duration.innerHTML = player.mins + ":" + player.secs;
        }

        function _timeUpdate(event) {
            // Duration
            _updateTimeDisplay();
            // Playing progress
            _updateProgress(event);
        }

        // Listen for events
        function _listeners() {
            // Play
            _on(player.buttons.play, "click", function() {
                _play();
                setTimeout(function() { player.buttons.pause.focus(); }, 100);
            });

            // Pause
            _on(player.buttons.pause, "click", function() {
                _pause();
                setTimeout(function() { player.buttons.play.focus(); }, 100);
            });

            // Restart
            _on(player.buttons.restart, "click", _restart);

            // Rewind
            _on(player.buttons.rewind, "click", _rewind);

            // Fast forward
            _on(player.buttons.forward, "click", _forward);

            // Get the HTML5 range input element and append audio volume adjustment on change/input
            // IE10 doesn't support the "input" event so they have to wait for change
            _on(player.volume, "change input", function() {
                _setVolume(this.value);
            });

            // Mute
            _on(player.buttons.mute, "change", function() {
                _toggleMute(this.checked);
            });

            // Fullscreen
            _on(player.buttons.fullscreen, "click", _toggleFullscreen);

            // Handle user exiting fullscreen by escaping etc
            _on(document, fullscreen.fullScreenEventName, _toggleFullscreen);

            // Click video
            if(player.type === "video" && config.click) {
                _on(player.videoContainer, "click", function() {
                    if(player.media.paused) {
                        _play();
                    }
                    else if(player.media.ended) {
                        _restart();
                    }
                    else {
                        _pause();
                    }
                });
            }

            // Time change on media
            _on(player.media, "timeupdate seeking", _timeUpdate);

            // Seek
            _on(player.buttons.seek, "change input", _seek);

            // Captions
            _on(player.buttons.captions, "click", function() {
                _toggleCaptions(this.checked);
            });

            // Clear captions at end of video
            _on(player.media, "ended", function() {
                if(player.type === "video") {
                    player.captionsContainer.innerHTML = "";
                }
                _checkPlaying();
            });

            // Check for buffer progress
            _on(player.media, "progress", _updateProgress);

            // Also check on start of playing
            _on(player.media, "playing", _updateProgress);

            // Handle native mute
            _on(player.media, "volumechange", _checkMute);

            // Handle native play/pause
            _on(player.media, "play pause", _checkPlaying);
        }

        function _init() {
            // Setup the fullscreen api
            fullscreen = _fullscreen();

            // Sniff
            player.browserInfo = _browserSniff();
            player.browserName = player.browserInfo[0];
            player.browserMajorVersion = player.browserInfo[1];

            // Debug info
            _log(player.browserName + " " + player.browserMajorVersion);

            // If IE8, stop customization (use fallback)
            // If IE9, stop customization (use native controls)
            if (player.browserName === "IE" && (player.browserMajorVersion === 8 || player.browserMajorVersion === 9) ) {
                _log("Browser not suppported.", true);
                return false;
            }

            // Setup media
            _setupMedia();

            // Generate random number for id/for attribute values for controls
            player.random = Math.floor(Math.random() * (10000));

            // Inject custom controls
            _injectControls();

            // Find the elements
            if(!_findElements()) {
                return false;
            }

            // Set up aria-label for Play button with the title option
            _setupAria();

            // Captions
            _setupCaptions();

            // Set volume
            _setVolume();

            // Setup fullscreen
            _setupFullscreen();

            // Listeners
            _listeners();
        }

        _init();

        return {
            media:              player.media,
            play:               _play,
            pause:              _pause,
            restart:            _restart,
            rewind:             _rewind,
            forward:            _forward,
            seek:               _seek,
            setVolume:          _setVolume,
            toggleMute:         _toggleMute,
            toggleCaptions:     _toggleCaptions
        }
    }

    // Expose setup function
    api.setup = function(options){
        // Extend the default options with user specified
        config = _extend(defaults, options);

        // If enabled carry on
        // You may want to disable certain UAs etc
        if(!config.enabled) {
            return false;
        }

        // Get the players
        var elements = document.querySelectorAll(config.selectors.container), players = [];

        // Create a player instance for each element
        for (var i = elements.length - 1; i >= 0; i--) {
            // Get the current element
            var element = elements[i];

            // Setup a player instance and add to the element
            if(typeof element.plyr === "undefined") {
                element.plyr = new Plyr(element);
            }

            // Add to return array
            players.push(element.plyr);
        }

        return players;
    }
}(this.plyr = this.plyr || {}));

redpajama_set_name: RedPajamaGithub