The Conformance Machining Engineer will be tasked with both supporting current production and providing improvements as well as implementing NPI work. Taking a hands-on approach to work and developing methods and processes is essential along with excellent problem-solving skills. An understanding of Lean/Six Sigma types techniques to support the continued quality improvements is required. CAD/CAM skills are essential to being successful within the role.
* Develop Machining Methods and Practices with stage drawings to support.
* Support in verifying customer bids and checking theoretical models.
* First Article evaluations and reporting, including utilisation of IPI VISUAL FAIR Software.
* New Product Introduction evaluation to standards both customer and internal.
* Design of jigs and fixtures to support robust processes.
* Work within the supply chain to get best results for projects.
* Closed loop feedback of production data with the operations team to foster continuous improvement.
* Planning and prioritising of own workload ensuring customer satisfaction.
* Write and implement capex proposals to generate value from investment, recommending improvement projects.
* Participate in R&D projects as necessary to further business interests.
* Build PPAP portfolios for new parts ensuring process.
* Support SQDCP, MRB, ANDON and participate in completing Team Value Plan activities.
* CAD/CAM Engineering experience / Conformance Engineering within a manufacturing Environment (Delcam software experience a distinct advantage).
* HNC in Engineering discipline.
* CNC Process experience and /or Programming.
* Competence of systemic link to IPI Visual FAIR.
Salary - £30'000 - £35'000 dependent on experience.


Faith Lutheran Church was founded in 1947, to minister to the people of south Arlington Heights. Worship at Faith runs the full gamut from traditional, liturgical worship to blended worship, to contemporary, informal worship. With the help of Synod and District, Faith has embarked on a revitalization program that seeks to help each member grow as a disciple of Jesus and as one sent by our Lord to share the Good News of His death and resurrection.


text:
Q: jQuery hosted on Google CDN: why is Internet access still needed? I am using jQuery from google CDN.
I looked at the cache-control and it seems the browser should fully cache the jQuery version for a long time.
However when I disable Internet access my webpages stop working. Why? Is it because even though jQuery is cached, the browser still needs to resolve DNS?

A: Your brower doesn't need to respect the cache-control header. That is mostly used by proxies. If you want to check whether your browser is keeping a local copy of the script, go into offline mode (in your browser) and try if your website still works.
In addition you might want to enable the Firebug (if you're using Firefox) Net panel to see the exact request your browser sends to the server (and what the response is).

A: There are a few layers of cache. Just because it is cached for a long time doesn't mean it won't ask the server and check to see if it is the latest edition.
Additionally, offline mode in your browser may not even attempt to load files that it determines to be non local.

redpajama_set_name: RedPajamaStackExchange


In Vol. 5 of this series we address the techniques of wing closeouts and how to teach them within the principles of pressure man defense.
Most of the attention thus far in this series has been on the sideline checkpoint of the "Rooftop" principle. The stance angle when the ball is above the free throw line is key to preventing the kind of straight line drives that lead to easy baskets.
When the ball is on the side of the floor and at or above the free throw line, the rooftop rules, stance angle and checkpoint all change. Closing out the wing and keeping the ball channeled towards the proper checkpoint requires practice.
But the message to the on-ball defender is the same no matter the language: force to the baseline checkpoint. In the graphic below, you can see the location of the baseline checkpoint. It is a spot three to four feet off the lane line. Place a cone or tape an "X" on this spot during defensive drills to help develop stance angle.
It should be noted that the on-ball wing defender does not "allow" or "give up" baseline. He/she makes every effort to angle any baseline attack to the checkpoint. Ideally the offensive player picks up their dribble or reverse pivots at the checkpoint. Influencing the ball handler to the baseline checkpoint, but not getting beat baseline allows the defense to remain intact and not go into rotation.
Keep the language simple with your players. "Influence to the baseline checkpoint" conveys messages about stance, closeout angle and how to protect the middle of the defense.
The all-purpose drill below was featured in an earlier entry into this series while discussing off the ball defense. But with an advancement, it is used for teaching wing closeouts as well. Players attempt to channel to the baseline checkpoint and force the ball handler to pick up their dribble or reverse pivot at the checkpoint. Should the on-the-ball defender get beat to the baseline, techniques for helping are drilled as well.
Closing out on the side or wing can be drilled in many different ways, but the angles you teach and where you what to influence the ball should be a matter of philosophy that is a constant within your program.


text:
«Сме́рть Ка́їна»  — поема українського поета Івана Франка. Написана у 1888 році. Вперше надрукована наступного року за кошти автора у серії «Літературно-наукова бібліотека». Поема була передрукована у збірці «З вершин і низин» (1893). У цій збірці вона була поставлена першою в розділі «Легенди».

Передумови написання
Над поемою І. Франко працював кілька років. У листі до М. Драгоманова від 20 березня 1889 року поет писав:
«Він [ Каїн ] сидів мені в мозку ще від часу, коли я перекладував байронівського "Каїна", і тільки торік я осилив якось сю жидівську легенду, домішавши до неї шматок з легенди про Фауста, котрий з вершин Кавказу оглядав рай. З обробкою, сміло скажу, намучивсь я щиро: цілість перероблював два рази з ґрунту, так що з первісно написаного ледве чи осталось нетиканих зо 200 віршів — деякі часто перероблював і три, й чотири рази, майструючи зовсім нахолодно, по-столярськи».

Відмінності образу Каїна у І.Франка, Д.Байрона та в Біблії
Поема І. Франка «Смерть Каїна» — яскравий приклад якісного руйнування традиційної семантики й аксіологічних домінант міфологічного матеріалу. У біблійній легенді заздрість і ворожнеча приводить Каїна до першозлочину, до братовбивства, що на більш глибокому рівні має зв'язок з мотивом гріхопадіння людини. Біблійний Каїн покірно несе свій вічний тягар, поки його хтось не вб'є. Домінантний мотив братовбивства з канонічного варіанту у Франка виявляється вторинним, несуттєвим, на перший план виходить мотив покарання і безсмертя. Франків Каїн сприймається як особистість, яка прагне пізнання сенсу людського буття. Для нього виявляються вторинними зовнішні атрибути (схильність до злочину, злість, ненависть до людей і до Бога). Його доля стає джерелом душевних переживань і трагічних суперечностей. Каїн Франка — не одиничний приклад такої трансформації семантичної наповненості.. Щодо сюжету, то Франкова легенда є начебто продовженням Байронової містерії, яка закінчується вбивством Авеля й прокляттям Каїна. Франків твір починається з блукань братовбивця Каїна по світі. Але Франкова легенда — не просто продовження Байронової містерії. Якщо Байронів Каїн у запереченні несправедливого світу залишається гордим індивідуалістом, то Каїн І. Франка виступає в кінці твору як невід'ємна від людської громади особистість, яка має чимало спільного з Франковим ідеалом «цілого чоловіка».

Символізм в поемі
Переосмислення образу Каїна в поемі І.Франка було таким сміливим, що наразило поета на прокляття з амвона. Першим радикальним кроком І.Франка в інтерпритації Каїна стала подача цього образу у розвитку, що суперечить самій природі символу-характеру. Поет перетворює Каїна, проклятого людоненависника, на мислителя та шукача істини, руйнуючи таким чином архетип братовбивці.

Центральним у поемі є мотив утраченого раю. Туга за втраченим раєм виступає і рушієм дії, і причиною внутрішнього переродження героя. У пустелі перед Каїном з'являється видіння раю, яке він відразу упізнає. І. Франко змальовує втрачений рай через ряд символів. Найперше, це символ саду, лише три автор згадує інший символ раю — місто. Ще один символ раю — Царство Небесне. При згадці про Боже Царство автор підкреслює, що рай — не стільки місце, стільки стан душі. Усвідомлення саме цієї істини перероджує Каїна — з братовбивці він перетворюється на носія спасенної ідеї, усвідомлює себе месією.

Виноски

Посилання
 http://www.i-franko.name/uk/Poems/SmertKajina.html
 Франко І. Я. Зібрання творів у 50-и томах. — К.: Наукова думка, 1976 р., т. 1, с. 386—403.

Див. також
 Джордж Гордон Байрон
 Біблія

Поеми
Поетичні твори Івана Франка
Літературні твори 1889

redpajama_set_name: RedPajamaWikipedia


text:
Dr Chiam Toon Lim Paul
English, Hainanese, Hokkien, Mandarin
Insurance Panel
AIA, AXA, Great Eastern, NTUC Income, Singlife with Aviva
Became the first Asian proctor for the Edwards Lifesciences TAVR programme
Became the first Asian proctor for the Medtronic CoreValve TAVR programme
Performed the first transcatheter aortic valve replacement (TAVR) procedure in Asia
Dr Paul Chiam is a cardiologist at Mount Elizabeth Hospitals, Singapore.
He is one of the few surgeons in Singapore with experience in performing transcatheter aortic valve replacements (TAVR).
Dr Chiam subspecialises in interventional cardiology, and previously spent 18 months at the Lenox Hill Heart and Vascular Institute of New York gaining hands-on experience in complex coronary angioplasty, carotid artery stenting, peripheral artery angioplasty, and structural heart disease (heart valve) interventions.
He later spent 3 months training in intracranial angioplasty and stenting in the department of endovascular neurosurgery at the University of Buffalo.
He graduated on the Dean's list from the National University of Singapore, and completed his postgraduate Master of Medicine examination, where he won the G.A. Ransome Gold Medal.
He is an adjunct associate professor at the National University of Singapore.
He was the secretary general of the Asian Pacific Society of Interventional Cardiology (APSIC) from 2016 – 2019 and is the current co-chair of the APSIC Scientific Committee. He was also a member of the American College of Cardiology (ACC) Peripheral Vascular Disease Section Leadership Council from 2014 – 2017.
Dr Chiam is well-recognised in the field of interventional cardiology, and has been invited as a guest faculty or speaker to major international cardiovascular conferences such as the American College of Cardiology Scientific Sessions, and American Heart Association Scientific Sessions.
He has also been invited as a case operator to conduct workshops and to perform cases during 'live transmissions' in complex coronary interventions, peripheral artery interventions and mitral valvuloplasties in Vietnam, Myanmar, Indonesia, Bangladesh, Sri Lanka, India, Taiwan and China.
He has published extensively in cardiovascular journals, and won the SingHealth Publish! Award in 2012 for a paper published in a major cardiovascular journal.
Associated treatments
Carotid stenting
Coronary atherectomy / rotablation
Coronary balloon angioplasty including coronary stenting
Percutaneous transluminal mitral commissurotomy (PTMC)
Peripheral transluminal angioplasty / thrombolysis
Service Quality Bronze Award, National Heart Centre Singapore
Gordon Ransome Gold Medal, National University of Singapore
Dean's List, National University of Singapore
Bachelor of Medicine, Bachelor of Surgery, National University of Singapore
Member of the Royal College of Physicians, UK
Master in Medicine, National University of Singapore
Fellow of the Royal College of Physicians, Edinburgh, UK
Fellow of the Academy of Medicine, Singapore
Fellow of the European Society of Cardiology
Fellow of the American College of Cardiology
Fellow of the Society for Cardiovascular Angiography and Interventions
Jl. Sukamulya 44C (Terusan Pasteur), Bandung, 40163, Indonesia
Main line:
bandung.id@ihhhealthcare.com
Jakarta and Other Cities
Ruko Dharmawangsa Square No. 18 Jl. Dharmawangsa VI, Kebayoran Baru Jakarta Selatan 12160, Indonesia
jakarta.id@ihhhealthcare.com
Jl. S. Parman No. 103 / 317-A Medan 20153, Indonesia
medan.id@ihhhealthcare.com
Jl. Ahmad Yani I No. 34 Samarinda 75117, Indonesia
samarinda.id@ihhhealthcare.com
Jl. Erlangga Tengah No. 18 C Semarang 50241, Indonesia
+62 24 8417183 / +62 24 8417184
semarang.id@ihhhealthcare.com
Ruko Puncak Bukit Golf Unit RBS, Jl. Mayjend Jono Soewojo No. 1, Pradahkali Kendal, Dukuh Pakis, Surabaya 60226
surabaya.id@ihhhealthcare.com
Jl. R M Said No. 156 Solo 57132, Indonesia
solo.id@ihhhealthcare.com
Jl. Monjali 161B Yogyakarta 55284, Indonesia
yogyakarta.id@ihhhealthcare.com
The Heart And Vascular Centre
The Heart & Vascular Centre (Novena)
View media coverage about Dr Chiam Toon Lim Paul

redpajama_set_name: RedPajamaCommonCrawl


text:
Сollections
The best places to enjoy contemporary art
A concise guide to the capital's contemporary art galleries
From the first state museum to a gallery complex in a luxury hotel building, here are the best places to experience contemporary art.
Multimedia Art Museum (MAMM)
From Banksy to Rodchenko: the legends of contemporary art
16 Ostozhenka Street
Tue, Wed, Thu, Fri, Sat, Sun 12:00 — 21:00
mamm-mdf.ru
The first art museum in post-Soviet Moscow with a rich collection of Alexander Rodchenko's works and archival documents from his family. Historically, the MAMM (Multimedia Art Museum, Moscow) has specialized in contemporary photography exhibitions, but it is not limited to them alone. The main part of the exhibition space is occupied by temporary exhibitions: works by Banksy, Andy Warhol, and Jean-Michel Basquiat have been displayed here at different times.
Lumière Brothers Center for Photography
Russia's major photogallery
61 Bolshaya Polyanka Street, Bldg. 1
lumiere.ru
For a long time, the gallery was located at Krasny Oktyabr, but in 2021, it moved to a 19th-century mansion on Polyanka. Now there are two exhibition halls, a café, and a bookstore. The center organizes exhibitions by notable photographers such as Robert Mapplethorpe, Annie Leibovitz, and others, as well as those by young artists. You can also visit the gallery as part of a guided tour, which covers not only the exhibition space, but also the vault, archive, and office.
Garage Museum of Contemporary Art
An expo center, an educational hub and a bookstore
9 Krymsky Val Street, Bldg. 32
garagemca.org
The most popular museum of contemporary art in Moscow, with an educational center, a café, and a laboratory for young artists. Garage regularly hosts exhibitions by the stars of contemporary art — Marina Abramovich, Raymond Pettibon, Yayoi Kusama, and others. The translucent museum complex was designed by the famous Dutch architect Rem Koolhaas. Since it opened in 2008, the museum has changed several locations, finally settling in the building of the former Four Seasons restaurant with its mosaic panels. In addition to exhibitions, Garage often hosts concerts right in its galleries and lectures by internationally renowned art critics in its lecture hall. There is also a summer cinema, Garage Screen, which runs from May till September in the courtyard.
Moscow Museum of Modern Art (MMOMA)
Plunge into the avant-garde
25 Petrovka Street
mmoma.ru
Russia's first state museum of contemporary art, offering a large collection of avant-garde art. Most of it consists of works by domestic artists, but there are also works by European masters — visual works by Pablo Picasso, Juan Miró, and Giorgio de Chirico, sculptures by Salvador Dali, and paintings by Henri Rousseau. Also, the courtyard of the museum is decorated with sculptures by Zurab Tsereteli, one of the founders of the museum.
MARS Center of Contemporary Art
Media performances, sound art and other forms of digital art
5 Pushkarev Lane
centermars.ru
One of Moscow's most unusual galleries: it specializes in works created with the help of digital technologies. The works of masters of video and audio art, media, and performance art are exhibited here, and almost all the exhibitions have an interactive format. The center has a permanent exhibition where visitors can, for example, interact with digital paintings or sit in a space chair. M'ARS also organizes annual events: the comics festival CoMissiya, the youth project Field of MARS, and the exhibition ArtDigita.
Cube.Moscow
Experimental Contemporary Art Space
3 Tverskaya Street, -2nd floor
An art space on the first floor of The Ritz-Carlton Hotel designed for artists, curators, and collectors to share their experiences. The complex consists of several galleries — most of them are usually occupied by short-term exhibitions and curatorial projects, but there are also permanent residents. Several times a year, the gallery hosts contemporary art auctions and conferences.
#moscowfromhome
Around VDNKh
The country's major exhibition
Learn about the history of Moscow and find an original tour


text:
Family run restaurant specialising in steak in Stockton Heath has big ambitions
Bavette Steak House in Stockton Heath is now open
By Jack Heale @Jack_Heale Trainee Reporter
Emrah Bal (left) and Guven Serce, owners of Bavette Steak House have thanked the community for being so welcoming
A FAMILY run restaurant which specialises in steak in Stockton Heath is now open.
Bavette Steak House, on London Road, recently opened and wants to add to the attraction of the village.
"We came a couple of years ago to the village and we saw the potential here. We see that it is a nice place for steak," Emrah Bal, 35, said.
"Our background is kitchen and hospitality but we do specialise in steak. The way we do steaks and fresh cooking is the difference.
"We see this as an opportunity for people to have a good steak. "The difference is that we dry out meat out for 28 days, we have dry aged fridges in the restaurant then we cook it.
"There are a lot of good restaurants, it's always busy and everyone comes to Stockton Heath for nice food. We are different and we want to add to the potential of Stockton Heath and provide more food here."
Inside the Stockton Heath restaurant
Bavette also has a steakhouse in Woolton, Liverpool for the past year, near to where Emrah is based. He also has a background in Turkish restaurants in Liverpool too for the past 10 years.
And Emrah says that people travel 50 – 60 miles to Woolton for their food and he has the same ambitions in Stockton Heath in time.
"People want to come from far away for food here," he continued.
"I think we are going to do the same in Stockton Heath so people will come from Manchester and Leeds I believe when we establish it properly."
Emrah – who works with his brothers and cousins – thanks the community for their support so far following their six weeks of renovations.
He added: "I am so pleased that everyone has been so welcoming. Everyone has been so supportive so we will do the same in return for the Stockton Heath community.
"The opening weekend was great with good feedback.
Bavette are specialists in steak
"Everyone's been really welcome since we've been doing the building.
"It feels like a long time coming. With the pandemic, nothing was easy but we are fighting well."


Municipalities in Monroe County's four airport districts must ensure that any structures built in the future aren't tall enough to interfere with aircraft taking off or landing.
That's according to a model zoning ordinance for airport district overlays, copies of which the Monroe County Planning Commission is circulating among 12 municipalities identified as being in public or private airport districts, county senior planner Christine Meinhart said.
Flying Dollar and Rocky Hill airports, both in Barrett Township, whose districts include Barrett, Paradise and Price townships. Pocono Mountains Municipal in Coolbaugh Township, whose district includes Coolbaugh, Tobyhanna, Paradise and Pocono townships and Mount Pocono Borough. Stroudsburg-Pocono in Smithfield Township, whose district includes Smithfield, Middle Smithfield and Stroud townships and East Stroudsburg Borough.
Barrett Township became the first of the 12 municipalities to receive a copy of the ordinance from the commission.
The ordinance grew out of the Pennsylvania Airport Hazard Zoning Act, or Act 164. Passed in 1984, the act involves a partnership between the Federal Aviation Administration and Pennsylvania Department of Transportation in efforts to reduce the risk of tall structures interfering with aircraft navigation.
For years, municipalities resisted the act, and it could not be effectively enforced, PennDOT spokeswoman Erin Waters said. That was until the 2007 Pennsylvania Supreme Court ruling in the case of Chanceford Aviation vs. Chanceford Township in York County, Waters said.
Levere and Loretta Baublitz started Chanceford Aviation, a private airport, in Chanceford Township in 1979, prior to the township's adoption of a zoning ordinance. The couple in 1991 notified the township of its obligation to adopt an Act 164 ordinance, but the township did not do so.
After Levere Baublitz's death in 2000, Loretta Baublitz continued efforts to get an ordinance adopted. The matter went to trial in York County Court in 2004 and Baublitz won. The township successfully appealed. Baublitz then appealed in state Supreme Court, which upheld the county court decision.
The Supreme Court ruling now makes it harder for Pennsylvania's airport district municipalities to ignore their obligations to adopt such an ordinance, Waters said.
Some of the 12 municipalities here have airport district provisions in their zoning ordinances, Meinhart said.
The restrictions vary with each municipality, but the municipality should ensure provisions impose proper height restrictions on any future construction, Meinhart said.
"The farther away you are from the airport, the lesser the height restriction," Basila said.


"I feel like I am in the minority and everyone else seems happy with how things are going."
I think you brought up a good point, because I guess most of the people on the forums enjoy what is happening in the beta, but people like you, who are just waiting for the release, don't post that often or at all. If you don't follow the development, I can see how it is frustrating or simply not interesting anymore.
It would be interesting to know how many people who have preordered didn't play at all until now.
Maybe, if a newsletter doesn't work, it's a good idea to place a sticky with the current stage of development for people who just check in every half year.
As for web.de, I used to send newsletters and most of the mails that bounced back or where the mailspace was full were from web.de.
I pre-ordered, but haven't played in many months. I primarily want to be able to play it on my laptop, and I am rarely online with it. It's getting very frustrating.
Im frustrated too.I pre-ordered since 2011 i think, i played a little because i can't be online all the time.It's very sad but its a game made for money and decision made by pre-ordering was worst in my life .I know its a lost cause i will never see a standalone or an offline version.
hempsader wrote: Im frustrated too.I pre-ordered since 2011 i think, i played a little because i can't be online all the time.It's very sad but its a game made for money and decision made by pre-ordering was worst in my life .I know its a lost cause i will never see a standalone or an offline version.
If you're that upset, are you sure you don't want a refund?
Well i think work to update even if was released on steam too,like most games does.Well i don't want a refund im just curious how long will pass till steam version.(probably years ) .The main problem for me is unity, on laptop is working very hard,its consume alot of cpu thats make my laptop to overheat( is not a hight end laptop ),and im not always connected to internet.
I think that's harsh Hempsader, although we are all hoping for a stand alone release, there is no way you can say Desktop Dungeons is a "lost cause", there aren't any grounds for that.
As much as I share your frustration around the length of time between pre-order and delivery.. I think you need a little perspective and note the hard work the team are putting in to make the game as good as it can be.
We've already been over communication on this thread, and that wasn't an intentional snub by QCF on the community, so as a gamer like you, I'd appreciate it if you had some perspective on your comments or at the very least make them constructive.
I don't wish to start an argument, but I hope you understand that I can't help jump to the defense of QCF who have been nothing but gracious and understanding of the concerns expressed on their forum, which is a rarity among developers and studios and something we should be applauding and grateful for, especially when it's a small team who actually have the bravery to make something a little different like Desktop Dungeons.
Riaktion wrote: I don't wish to start an argument, but I hope you understand that I can't help jump to the defense of QCF who have been nothing but gracious and understanding of the concerns expressed on their forum, which is a rarity among developers and studios and something we should be applauding and grateful for, especially when it's a small team who actually have the bravery to make something a little different like Desktop Dungeons.
Well ok i understand,i don't know how hard is too work on a game however i think pre-order was too early.Well i guess im gonna wait for it. And sorry ,i don't want to argue i just say what worries me.
I guess it has a lot to do with expectations. When the beta started I didn't buy it because I didn't want to play a game in progress but rather the finished game. Later I looked at the forums and saw that there is a very interesting development going on and that the testers are not just chasing bugs but are also discussing game mechanics, Items, dungeons and so on. And all that in a very friendly manner. So I joined knowing it would still be a while until the game is finished but am enjoying the process.
If I had bought it at the beginning only wanting the full game I would be getting frustrated as well, I guess.
I still think a sticky with current state of development, what is done and what still needs to be done, even without a time frame would be nice.


text:
Home/Free Expert Sports Picks/Louisville Cardinals at Virginia Cavaliers Betting Preview
College Basketball PicksFree Expert Sports Picks
Louisville Cardinals at Virginia Cavaliers Betting Preview
RyanLast Updated: March 7, 2020
The No. 10 Louisville Cardinals (24-6, 15-4) travel east to take on the No. 22 Virginia Cavaliers (22-7, 14-5) in an Atlantic Coast Conference matchup on Saturday. Tip-off is 4 pm EST inside John Paul Jones Arena in Charlottesville, Va.
The tilt is the final game of the regular season for both teams. A win Saturday would give the Cardinals at least a share of their first conference regular-season title since joining the ACC in 2014. The host will try to conclude an eight-game winning streak to close out the regular season.
Louisville took down the Cavaliers by seven (80-73) at home earlier this season. Virginia is a one-point favorite in the conference showdown.
What to Know – Louisville
Louisville has tripped up down the stretch, going 3-3 after a 10-game winning streak. The Cardinals have had nearly a week off since a 16-point drubbing of Virginia Tech on Sunday, March 1st. Louisville brings a respectable 6-4 road record into this weekend's contest.
Sophomore forward Jordan Nwora (18.0 ppg) continues to pace the Louisville offense. Nwora led the Cardinals against the Cavaliers the last time these teams met, pouring in 22 points and grabbing 12 rebounds in the victory.
Behind Nwora, the Cardinals feature a balanced attack with five players averaging over 8.7 points or more per contest. Redshirt senior Dwayne Sutton has averaged 11.2 points and 8.0 rebounds per game over the last six games.
The Cardinals are scoring at an average of 74.7 points per game and are second in the league allowing 63.9 per game. Louisville ranks 18th in the nation in 3-point field goal percentage (37.6%), making nine or more treys in 17 games this season.
The visitors also hold their own on the defensive end, allowing teams to shoot just 38.6% from the field. That percentage is 13th in the nation.
What to Know – Virginia
The Cavaliers are one of the hottest teams in college basketball, winning 10 of their last 11 contests. Virginia has been effective at home this season, sporting a 13-3 record in Charlottesville.
Virginia is 7-1 all-time against Louisville at home, including a perfect 5-0 inside JPJ Arena. Tony Bennett is 10-2 against the Cardinals as head coach of the Cavaliers.
Virginia possesses the league's lowest-scoring offense and ranks 348th nationally, averaging 57.0 points per game. Senior redshirt forward Mamadi Diakite (13.6 ppg) is the Cavaliers' leading scorer and will be playing in his final home game in a Virginia uniform.
Sophomore guard Kihei Clark (10.6 ppg) and senior guard Braxton Key (10.0 ppg) also average in double figures for the host.
What Virginia lacks in offense, it makes up for on the defensive side of the ball with the nation's top scoring defense. The Cavaliers allow just 52.3 points per game and hold opponents to 36.9% shooting from the field. Virginia is
The Pick is In
This one is a toss-up just as the line reflects. The last time these two teams met, the Cavaliers tallied a season-high 73 points but also allowed a season-high 80 in the loss. Four of Louisville's five losses have come on the road this year. Give us the home team in the toss-up. We like the Virginia Cavaliers -1.
college basketball college basketball picks Louisville Cardinals Virginia Cavaliers
NFL Week 15 Bears at Vikings Pick and Betting Preview
Redbox Bowl – Oregon Ducks vs Michigan State Spartans
NFL Monday Night Football Over Under Free Pick
College Basketball Spread Pick – USC Trojans vs #23 Arizona Wildcats
NCAAF Pick – #17 Miami Hurricanes vs #18 Louisville Cardinals


Check out our latest Circle City Curling Club Newsletter in our News Section.
Your source for all things curling in the Circle City. Who's curling? Where and when are they curling? Who's having fun? What are people doing off the ice?


text:
#include "AssemblerX64.h"
#include "StubCode.h"
#include "CodeDescriptors.h"

static void generateBlockValuePrimitive(CodeGenerator *generator, uint8_t args);
static void movArg(AssemblerBuffer *buffer, ptrdiff_t index, Register dst);
static MemoryOperand arg(ptrdiff_t index);

static void generateCCallPrimitive(CodeGenerator *generator, PrimitiveResult (*cFunction)(), size_t argsSize)
{
	AssemblerBuffer *buffer = &generator->buffer;
	AssemblerLabel failed;
	asmInitLabel(&failed);

	for (size_t i = 0; i < argsSize; i++) {
		movArg(buffer, i, ArgumentsRegisters[i]);
	}
	asmMovq(buffer, R11, R13);
	generateCCall(generator, (intptr_t) cFunction, argsSize, 0);
	asmTestq(buffer, RDX, RDX);
	asmJ(buffer, COND_NOT_ZERO, &failed);
	asmRet(buffer);
	asmLabelBind(buffer, &failed, asmOffset(buffer));
	asmMovq(buffer, R13, R11);
}

static void loadClass(CodeGenerator *generator, Register src, Register dst)
{
	asmMovqMem(&generator->buffer, asmMem(src, NO_REGISTER, SS_1, -1), dst);
}

static void testInt(CodeGenerator *generator, ByteRegister reg)
{
	asmTestbImm(&generator->buffer, reg, 3);
}

static void primitveNotImplemented(void)
{
	printf("Error: Primitive is not implemented\n");
	exit(EXIT_FAILURE);
}

static void generateNotImplementedPrimitive(CodeGenerator *generator)
{
	AssemblerBuffer *buffer = &generator->buffer;
	asmMovqImm(buffer, (uint64_t) primitveNotImplemented, TMP);
	asmCallq(buffer, TMP);
}

static void generateInstVarAtPrimitive(CodeGenerator *generator)
{
	AssemblerBuffer *buffer = &generator->buffer;
	AssemblerLabel notInt;
	AssemblerLabel outOfBounds;
	ptrdiff_t offset = offsetof(RawClass, instanceShape);
	ptrdiff_t sizeOffset = offset + offsetof(InstanceShape, varsSize);
	ptrdiff_t isIndexedOffset = offset + offsetof(InstanceShape, isIndexed);
	ptrdiff_t payloadSizeOffset = offset + offsetof(InstanceShape, payloadSize);

	asmInitLabel(&notInt);
	asmInitLabel(&outOfBounds);

	movArg(buffer, 0, RDI);
	movArg(buffer, 1, RSI);

	testInt(generator, SIL);
	asmJ(buffer, COND_NOT_ZERO, &notInt);

	loadClass(generator, RDI, RCX);
	asmShrqImm(buffer, RSI, 2);
	asmDecq(buffer, RSI);
	asmCmpbMem(buffer, asmMem(RCX, NO_REGISTER, SS_1, sizeOffset), SIL);
	asmJ(buffer, COND_ABOVE_EQUAL, &outOfBounds);

	asmAddbMem(buffer, asmMem(RCX, NO_REGISTER, SS_1, isIndexedOffset), SIL);
	asmAddbMem(buffer, asmMem(RCX, NO_REGISTER, SS_1, payloadSizeOffset), SIL);
	asmMovqMem(buffer, asmMem(RDI, RSI, SS_8, HEADER_SIZE - 1), RAX);
	asmRet(buffer);

	asmLabelBind(buffer, &outOfBounds, asmOffset(buffer));
	asmIncq(buffer, RSI);
	asmShlqImm(buffer, RSI, 2);

	asmLabelBind(buffer, &notInt, asmOffset(buffer));
}

static void generateInstVarAtPutPrimitive(CodeGenerator *generator)
{
	AssemblerBuffer *buffer = &generator->buffer;
	AssemblerLabel notInt;
	AssemblerLabel outOfBounds;
	ptrdiff_t offset = offsetof(RawClass, instanceShape);
	ptrdiff_t sizeOffset = offset + offsetof(InstanceShape, varsSize);
	ptrdiff_t isIndexedOffset = offset + offsetof(InstanceShape, isIndexed);
	ptrdiff_t payloadSizeOffset = offset + offsetof(InstanceShape, payloadSize);

	asmInitLabel(&notInt);
	asmInitLabel(&outOfBounds);

	movArg(buffer, 0, RDI);
	movArg(buffer, 1, RSI);
	movArg(buffer, 2, RAX);

	testInt(generator, SIL);
	asmJ(buffer, COND_NOT_ZERO, &notInt);

	loadClass(generator, RDI, RCX);
	asmShrqImm(buffer, RSI, 2);
	asmDecq(buffer, RSI);
	asmCmpbMem(buffer, asmMem(RCX, NO_REGISTER, SS_1, sizeOffset), SIL);
	asmJ(buffer, COND_ABOVE_EQUAL, &outOfBounds);

	asmAddbMem(buffer, asmMem(RCX, NO_REGISTER, SS_1, isIndexedOffset), SIL);
	asmAddbMem(buffer, asmMem(RCX, NO_REGISTER, SS_1, payloadSizeOffset), SIL);
	asmMovqToMem(buffer, RAX, asmMem(RDI, RSI, SS_8, HEADER_SIZE - 1));
	generateStoreCheck(generator, RDI, RAX);
	asmRet(buffer);

	asmLabelBind(buffer, &outOfBounds, asmOffset(buffer));
	asmIncq(buffer, RSI);
	asmShlqImm(buffer, RSI, 2);

	asmLabelBind(buffer, &notInt, asmOffset(buffer));
}

static void generateAtPrimitive(CodeGenerator *generator)
{
	AssemblerBuffer *buffer = &generator->buffer;
	AssemblerLabel notInt;
	AssemblerLabel notIndexable;
	AssemblerLabel outOfBounds;
	AssemblerLabel bytes;
	ptrdiff_t offset = offsetof(RawClass, instanceShape);
	ptrdiff_t payloadSizeOffset = offset + offsetof(InstanceShape, payloadSize);
	ptrdiff_t sizeOffset = offset + offsetof(InstanceShape, varsSize);
	ptrdiff_t isIndexedOffset = offset + offsetof(InstanceShape, isIndexed);
	ptrdiff_t isBytesOffset = offset + offsetof(InstanceShape, isBytes);
	ptrdiff_t valueTypeOffset = offset + offsetof(InstanceShape, valueType);

	asmInitLabel(&notInt);
	asmInitLabel(&notIndexable);
	asmInitLabel(&outOfBounds);
	asmInitLabel(&bytes);

	movArg(buffer, 0, RDI);
	movArg(buffer, 1, RSI);

	testInt(generator, SIL);
	asmJ(buffer, COND_NOT_ZERO, &notInt);

	loadClass(generator, RDI, RCX);
	asmTestbMemImm(buffer, asmMem(RCX, NO_REGISTER, SS_1, isIndexedOffset), 1);
	asmJ(buffer, COND_ZERO, &notIndexable);

	asmShrqImm(buffer, RSI, 2);
	asmDecq(buffer, RSI);
	asmCmpqMem(buffer, asmMem(RDI, NO_REGISTER, SS_1, offsetof(RawIndexedObject, size) - 1), RSI);
	asmJ(buffer, COND_ABOVE_EQUAL, &outOfBounds);

	asmTestbMemImm(buffer, asmMem(RCX, NO_REGISTER, SS_1, isBytesOffset), 1);
	asmJ(buffer, COND_NOT_ZERO, &bytes);

	asmAddbMem(buffer, asmMem(RCX, NO_REGISTER, SS_1, payloadSizeOffset), SIL);
	asmAddbMem(buffer, asmMem(RCX, NO_REGISTER, SS_1, sizeOffset), SIL);
	asmMovqMem(buffer, asmMem(RDI, RSI, SS_8, HEADER_SIZE + sizeof(Value) - 1), RAX);
	asmRet(buffer);

	asmLabelBind(buffer, &bytes, asmOffset(buffer));
	asmXorq(buffer, RAX, RAX);
	asmAddbMem(buffer, asmMem(RCX, NO_REGISTER, SS_1, payloadSizeOffset), AL);
	asmAddbMem(buffer, asmMem(RCX, NO_REGISTER, SS_1, sizeOffset), AL);
	asmLeaq(buffer, asmMem(RSI, RAX, SS_8, sizeof(Value)), RAX);
	asmMovzxbMemq(buffer, asmMem(RDI, RAX, SS_1, HEADER_SIZE - 1), RAX);
	asmShlqImm(buffer, RAX, 2);
	asmAddbMem(buffer, asmMem(RCX, NO_REGISTER, SS_1, valueTypeOffset), AL);
	asmRet(buffer);

	asmLabelBind(buffer, &outOfBounds, asmOffset(buffer));
	asmIncq(buffer, RSI);
	asmShlqImm(buffer, RSI, 2);

	asmLabelBind(buffer, &notInt, asmOffset(buffer));
	asmLabelBind(buffer, &notIndexable, asmOffset(buffer));
}

static void generateAtPutPrimitive(CodeGenerator *generator)
{
	AssemblerBuffer *buffer = &generator->buffer;
	AssemblerLabel notInt;
	AssemblerLabel notIndexable;
	AssemblerLabel outOfBounds;
	AssemblerLabel bytes;
	ptrdiff_t offset = offsetof(RawClass, instanceShape);
	ptrdiff_t payloadSizeOffset = offset + offsetof(InstanceShape, payloadSize);
	ptrdiff_t sizeOffset = offset + offsetof(InstanceShape, varsSize);
	ptrdiff_t isIndexedOffset = offset + offsetof(InstanceShape, isIndexed);
	ptrdiff_t isBytesOffset = offset + offsetof(InstanceShape, isBytes);
	ptrdiff_t valueTypeOffset = offset + offsetof(InstanceShape, valueType);

	asmInitLabel(&notInt);
	asmInitLabel(&notIndexable);
	asmInitLabel(&outOfBounds);
	asmInitLabel(&bytes);

	// load arguments
	movArg(buffer, 0, RDI);
	movArg(buffer, 1, RSI);
	movArg(buffer, 2, RDX);

	// value is result
	asmMovq(buffer, RDX, RAX);

	// check if index is int
	testInt(generator, SIL);
	asmJ(buffer, COND_NOT_ZERO, &notInt);

	// check if object is indexed
	loadClass(generator, RDI, RCX);
	asmTestbMemImm(buffer, asmMem(RCX, NO_REGISTER, SS_1, isIndexedOffset), 1);
	asmJ(buffer, COND_ZERO, &notIndexable);

	// untag and decrement index
	asmShrqImm(buffer, RSI, 2);
	asmDecq(buffer, RSI);

	// check bounds
	asmCmpqMem(buffer, asmMem(RDI, NO_REGISTER, SS_1, offsetof(RawIndexedObject, size) - 1), RSI);
	asmJ(buffer, COND_ABOVE_EQUAL, &outOfBounds);

	// check if object is bytes
	asmTestbMemImm(buffer, asmMem(RCX, NO_REGISTER, SS_1, isBytesOffset), 1);
	asmJ(buffer, COND_NOT_ZERO, &bytes);

	// compute offset
	asmAddbMem(buffer, asmMem(RCX, NO_REGISTER, SS_1, payloadSizeOffset), SIL);
	asmAddbMem(buffer, asmMem(RCX, NO_REGISTER, SS_1, sizeOffset), SIL);

	// set the value
	asmMovqToMem(buffer, RDX, asmMem(RDI, RSI, SS_8, HEADER_SIZE + sizeof(Value) - 1));
	generateStoreCheck(generator, RDI, RDX);
	asmRet(buffer);

	// bytes
	asmLabelBind(buffer, &bytes, asmOffset(buffer));

	// compute offset
	asmXorq(buffer, RBX, RBX);
	asmAddbMem(buffer, asmMem(RCX, NO_REGISTER, SS_1, payloadSizeOffset), AL);
	asmAddbMem(buffer, asmMem(RCX, NO_REGISTER, SS_1, sizeOffset), AL);
	asmLeaq(buffer, asmMem(RSI, RBX, SS_8, sizeof(Value)), RBX);

	// TODO: valueTypeOf(RDX) == RCX->instanceShape.valueType
	// untag and set the value
	asmShrqImm(buffer, RDX, 2);
	asmMovbToMem(buffer, DL, asmMem(RDI, RBX, SS_1, HEADER_SIZE - 1));
	asmRet(buffer);

	asmLabelBind(buffer, &outOfBounds, asmOffset(buffer));
	asmIncq(buffer, RSI);
	asmShlqImm(buffer, RSI, 2);

	asmLabelBind(buffer, &notInt, asmOffset(buffer));
	asmLabelBind(buffer, &notIndexable, asmOffset(buffer));
}

static void generateSizePrimitive(CodeGenerator *generator)
{
	AssemblerBuffer *buffer = &generator->buffer;
	AssemblerLabel notPointer;
	AssemblerLabel notIndexable;
	ptrdiff_t offset = offsetof(RawClass, instanceShape);
	ptrdiff_t isIndexedOffset = offset + offsetof(InstanceShape, isIndexed);

	asmInitLabel(&notPointer);
	asmInitLabel(&notIndexable);

	movArg(buffer, 0, RDI);

	asmMovb(buffer, DIL, SIL);
	asmAndbImm(buffer, SIL, 3);
	asmCmpbImm(buffer, SIL, VALUE_POINTER);
	asmJ(buffer, COND_NOT_EQUAL, &notPointer);

	loadClass(generator, RDI, RDX);
	asmTestbMemImm(buffer, asmMem(RDX, NO_REGISTER, SS_1, isIndexedOffset), 1);
	asmJ(buffer, COND_ZERO, &notIndexable);

	asmMovqMem(buffer, asmMem(RDI, NO_REGISTER, SS_1, offsetof(RawIndexedObject, size) - 1), RAX);
	asmShlqImm(buffer, RAX, 2);
	asmRet(buffer);

	asmLabelBind(buffer, &notPointer, asmOffset(buffer));
	asmLabelBind(buffer, &notIndexable, asmOffset(buffer));
	asmXorq(buffer, RAX, RAX);
	asmRet(buffer);
}

static void generateIdentityPrimitive(CodeGenerator *generator)
{
	AssemblerBuffer *buffer = &generator->buffer;
	AssemblerLabel equal;
	asmInitLabel(&equal);

	movArg(buffer, 0, RDI);
	asmCmpqMem(buffer, arg(1), RDI);
	asmJ(buffer, COND_EQUAL, &equal);
	generateLoadObject(buffer, Handles.false->raw, RAX, 1);
	asmRet(buffer);

	asmLabelBind(buffer, &equal, asmOffset(buffer));
	generateLoadObject(buffer, Handles.true->raw, RAX, 1);
	asmRet(buffer);
}

static void generateHashPrimitive(CodeGenerator *generator)
{
	AssemblerBuffer *buffer = &generator->buffer;
	movArg(buffer, 0, RDI);
	asmMovqMem(buffer, asmMem(RDI, NO_REGISTER, SS_1, /*offsetof(Object, hash)*/ sizeof(Value) - 1), RAX);
	asmMovqImm(buffer, 0xFFFFFFFF, TMP);
	asmAndq(buffer, TMP, RAX);
	asmShlqImm(buffer, RAX, 2);
	asmRet(buffer);
}

static void generateClassPrimitive(CodeGenerator *generator)
{
	AssemblerBuffer *buffer = &generator->buffer;
	movArg(buffer, 0, RDI);
	generateLoadClass(buffer, RDI, RAX);
	asmRet(buffer);
}

static void generateBehaviorNewPrimitive(CodeGenerator *generator)
{
	ptrdiff_t compiledCodeOffset = offsetof(NativeCode, compiledCode) - offsetof(NativeCode, insts);
	AssemblerBuffer *buffer = &generator->buffer;

	asmPushq(buffer, RBP);
	asmMovq(buffer, RSP, RBP);

	// save native code
	asmPushq(buffer, R11);
	generatePushDummyContext(buffer);

	asmMovqMem(buffer, asmMem(RBP, NO_REGISTER, SS_1, 2 * sizeof(intptr_t)), RSI);
	asmDecq(buffer, RSI);
	asmXorq(buffer, RDX, RDX);
	generateStubCall(generator, &AllocateStub);

	asmMovq(buffer, RBP, RSP);
	asmPopq(buffer, RBP);
	asmRet(buffer);
}

static void generateBehaviorNewSizePrimitive(CodeGenerator *generator)
{
	ptrdiff_t compiledCodeOffset = offsetof(NativeCode, compiledCode) - offsetof(NativeCode, insts);
	AssemblerBuffer *buffer = &generator->buffer;
	AssemblerLabel notInt;
	asmInitLabel(&notInt);

	asmPushq(buffer, RBP);
	asmMovq(buffer, RSP, RBP);

	// save native code
	asmPushq(buffer, R11);
	generatePushDummyContext(buffer);

	asmMovqMem(buffer, asmMem(RBP, NO_REGISTER, SS_1, 3 * sizeof(intptr_t)), RDX);

	// check if size is int
	testInt(generator, DL);
	asmJ(buffer, COND_NOT_ZERO, &notInt);

	asmMovqMem(buffer, asmMem(RBP, NO_REGISTER, SS_1, 2 * sizeof(intptr_t)), RSI);
	asmDecq(buffer, RSI);
	asmShrqImm(buffer, RDX, 2);
	generateStubCall(generator, &AllocateStub);

	asmMovq(buffer, RBP, RSP);
	asmPopq(buffer, RBP);
	asmRet(buffer);

	asmLabelBind(buffer, &notInt, asmOffset(buffer));
	asmMovq(buffer, RBP, RSP);
	asmPopq(buffer, RBP);
}

static void generateCharacterNewPrimitive(CodeGenerator *generator)
{
	AssemblerBuffer *buffer = &generator->buffer;
	AssemblerLabel notInt;
	asmInitLabel(&notInt);

	movArg(buffer, 1, RAX);
	testInt(generator, AL);
	asmJ(buffer, COND_NOT_ZERO, &notInt);

	asmAddqImm(buffer, RAX, VALUE_CHAR);
	asmRet(buffer);

	asmLabelBind(buffer, &notInt, asmOffset(buffer));
}

static void generateCharacterCodePrimitive(CodeGenerator *generator)
{
	AssemblerBuffer *buffer = &generator->buffer;
	movArg(buffer, 0, RAX);
	asmSubqImm(buffer, RAX, VALUE_CHAR);
	asmRet(buffer);
}

static void generateStringHashPrimitive(CodeGenerator *generator)
{
	AssemblerBuffer *buffer = &generator->buffer;
	movArg(buffer, 0, RDI);
	asmDecq(buffer, RDI);
	asmMovqImm(buffer, (uint64_t) computeRawStringHash, TMP);
	asmCallq(buffer, TMP);
	asmShlqImm(buffer, RAX, 2);
	asmRet(buffer);
}

static void generateInterruptPrimitive(CodeGenerator *generator)
{
	asmInt3(&generator->buffer);
}

static void generateExitPrimitive(CodeGenerator *generator)
{
	AssemblerBuffer *buffer = &generator->buffer;
	asmMovqImm(buffer, 1, RDI);
	asmMovqImm(buffer, (uint64_t) exit, TMP);
	asmCallq(buffer, TMP);
}

static NativeCodeEntry scopedGetNativeCode(Value vReceiver, Value vMethod)
{
	HandleScope scope;
	openHandleScope(&scope);

	Class *class = scopeHandle(getClassOf(vReceiver));
	CompiledMethod *method = scopeHandle(asObject(vMethod));
	NativeCodeEntry entry = (NativeCodeEntry) getNativeCode(class, method)->insts;

	closeHandleScope(&scope, NULL);
	return entry;
}

static void generateMethodSendPrimitive(CodeGenerator *generator)
{
	AssemblerBuffer *buffer = &generator->buffer;

	// prologue
	asmPushq(buffer, RBP);
	asmMovq(buffer, RSP, RBP);

	// save native code
	asmPushq(buffer, R11);
	generatePushDummyContext(buffer);

	// get native code for given method
	asmMovqMem(buffer, asmMem(RBP, NO_REGISTER, SS_1, 2 * sizeof(intptr_t)), RSI);
	asmMovqMem(buffer, asmMem(RBP, NO_REGISTER, SS_1, 3 * sizeof(intptr_t)), RDI);
	generateCCall(generator, (intptr_t) scopedGetNativeCode, 2, 1);
	// push receiver
	asmPushqMem(buffer, asmMem(RBP, NO_REGISTER, SS_1, 3 * sizeof(intptr_t)));
	// invoke method
	asmMovq(buffer, RAX, R11);
	asmCallq(buffer, R11);
	generateStackmap(generator);

	// epilogue
	asmAddqImm(buffer, RSP, 3 * sizeof(intptr_t));
	asmPopq(buffer, RBP);
	asmRet(buffer);
}

static void generateMethodSendArgsPrimitive(CodeGenerator *generator)
{
	AssemblerBuffer *buffer = &generator->buffer;
	AssemblerLabel invalidArgs;
	AssemblerLabel loop;
	AssemblerLabel zeroArgs;
	ptrdiff_t argsOffset = offsetof(RawCompiledMethod, header) + offsetof(CompiledCodeHeader, argsSize) - 1;

	asmInitLabel(&invalidArgs);
	asmInitLabel(&loop);
	asmInitLabel(&zeroArgs);

	// prologue
	asmPushq(buffer, RBP);
	asmMovq(buffer, RSP, RBP);

	// save native code
	asmPushq(buffer, R11);
	generatePushDummyContext(buffer);

	// get native code for given method
	asmMovqMem(buffer, asmMem(RBP, NO_REGISTER, SS_1, 2 * sizeof(intptr_t)), RSI);
	asmMovqMem(buffer, asmMem(RBP, NO_REGISTER, SS_1, 3 * sizeof(intptr_t)), RDI);
	generateCCall(generator, (intptr_t) scopedGetNativeCode, 2, 1);

	// load arguments array
	asmMovqMem(buffer, asmMem(RBP, NO_REGISTER, SS_1, 4 * sizeof(intptr_t)), RDI);
	// load arguments array size
	asmMovqMem(buffer, asmMem(RDI, NO_REGISTER, SS_1, varOffset(RawArray, size)), RBX);
	// load compiled method
	asmMovqMem(buffer, asmMem(RBP, NO_REGISTER, SS_1, 2 * sizeof(intptr_t)), TMP);
	// check arguments size
	asmCmpbMem(buffer, asmMem(TMP, NO_REGISTER, SS_1, argsOffset), BL);
	asmJ(buffer, COND_NOT_EQUAL, &invalidArgs);

	// push arguments on stack
	asmTestq(buffer, RBX, RBX);
	asmJ(buffer, COND_ZERO, &zeroArgs);
	asmLabelBind(buffer, &loop, asmOffset(buffer));
	asmDecq(buffer, RBX);
	asmPushqMem(buffer, asmMem(RDI, RBX, SS_8, varOffset(RawArray, vars)));
	asmJ(buffer, COND_NOT_ZERO, &loop);
	asmLabelBind(buffer, &zeroArgs, asmOffset(buffer));

	// push receiver
	asmPushqMem(buffer, asmMem(RBP, NO_REGISTER, SS_1, 3 * sizeof(intptr_t)));

	// invoke method
	asmMovq(buffer, RAX, R11);
	asmCallq(buffer, R11);
	generateStackmap(generator);

	// epilogue
	asmMovq(buffer, RBP, RSP);
	asmPopq(buffer, RBP);
	asmRet(buffer);

	asmLabelBind(buffer, &invalidArgs, asmOffset(buffer));
	asmMovq(buffer, RBP, RSP);
	asmPopq(buffer, RBP);
}

/*static void generateSmallIntCheck(buffer)
{
	asmMovq(buffer, RDI, TMP);
	asmOr(buffer, RSI, TMP);
	asmTestqRegImm(buffer, TMP, VALUE_INT);
	asmJ(buffer, COND_NO_ZERO, )
}*/

static void generateIntLessThanPrimitive(CodeGenerator *generator)
{
	AssemblerBuffer *buffer = &generator->buffer;
	AssemblerLabel less;
	AssemblerLabel notInt;
	asmInitLabel(&less);
	asmInitLabel(&notInt);

	movArg(buffer, 1, RSI);
	testInt(generator, SIL);
	asmJ(buffer, COND_NOT_ZERO, &notInt);

	movArg(buffer, 0, RAX);
	asmCmpq(buffer, RAX, RSI);

	asmJ(buffer, COND_LESS, &less);
	generateLoadObject(buffer, Handles.false->raw, RAX, 1);
	asmRet(buffer);

	asmLabelBind(buffer, &less, asmOffset(buffer));
	generateLoadObject(buffer, Handles.true->raw, RAX, 1);
	asmRet(buffer);

	asmLabelBind(buffer, &notInt, asmOffset(buffer));
}

static void generateIntAddPrimitive(CodeGenerator *generator)
{
	AssemblerBuffer *buffer = &generator->buffer;
	AssemblerLabel notInt;
	AssemblerLabel overflow;
	asmInitLabel(&notInt);
	asmInitLabel(&overflow);

	movArg(buffer, 1, RSI);
	testInt(generator, SIL);
	asmJ(buffer, COND_NOT_ZERO, &notInt);

	movArg(buffer, 0, RAX);
	asmAddq(buffer, RSI, RAX);
	asmJ(buffer, COND_OVERFLOW, &overflow);
	asmRet(buffer);

	asmLabelBind(buffer, &notInt, asmOffset(buffer));
	asmLabelBind(buffer, &overflow, asmOffset(buffer));
}

static void generateIntSubPrimitive(CodeGenerator *generator)
{
	AssemblerBuffer *buffer = &generator->buffer;
	AssemblerLabel notInt;
	AssemblerLabel overflow;
	asmInitLabel(&notInt);
	asmInitLabel(&overflow);

	movArg(buffer, 1, RSI);
	testInt(generator, SIL);
	asmJ(buffer, COND_NOT_ZERO, &notInt);

	movArg(buffer, 0, RAX);
	asmSubq(buffer, RSI, RAX);
	asmJ(buffer, COND_OVERFLOW, &overflow);
	asmRet(buffer);

	asmLabelBind(buffer, &notInt, asmOffset(buffer));
	asmLabelBind(buffer, &overflow, asmOffset(buffer));
}

static void generateIntMulPrimitive(CodeGenerator *generator)
{
	AssemblerBuffer *buffer = &generator->buffer;
	AssemblerLabel notInt;
	AssemblerLabel overflow;
	asmInitLabel(&notInt);
	asmInitLabel(&overflow);

	movArg(buffer, 1, RAX);
	testInt(generator, AL);
	asmJ(buffer, COND_NOT_ZERO, &notInt);

	asmShrqImm(buffer, RAX, 2);
	asmImulqMem(buffer, arg(0), RAX);
	asmJ(buffer, COND_OVERFLOW, &overflow);
	asmRet(buffer);

	asmLabelBind(buffer, &notInt, asmOffset(buffer));
	asmLabelBind(buffer, &overflow, asmOffset(buffer));
}

static void generateIntQuoPrimitive(CodeGenerator *generator)
{
	AssemblerBuffer *buffer = &generator->buffer;
	AssemblerLabel notInt;
	asmInitLabel(&notInt);

	movArg(buffer, 1, RSI);
	testInt(generator, SIL);
	asmJ(buffer, COND_NOT_ZERO, &notInt);

	movArg(buffer, 0, RAX);
	asmCqo(buffer);
	asmIdivq(buffer, RSI);
	asmShlqImm(buffer, RAX, 2);
	asmRet(buffer);

	asmLabelBind(buffer, &notInt, asmOffset(buffer));
}

static void generateIntModPrimitive(CodeGenerator *generator)
{
	AssemblerBuffer *buffer = &generator->buffer;
	AssemblerLabel notInt;
	AssemblerLabel negativeResult;
	AssemblerLabel negativeDivisor;
	asmInitLabel(&notInt);
	asmInitLabel(&negativeResult);
	asmInitLabel(&negativeDivisor);

	movArg(buffer, 1, RDI);
	testInt(generator, DIL);
	asmJ(buffer, COND_NOT_ZERO, &notInt);

	movArg(buffer, 0, RAX);
	asmCqo(buffer);
	asmIdivq(buffer, RDI);
	asmMovq(buffer, RDX, RAX);

	asmXorq(buffer, RDI, RDX);
	asmCmpqImm(buffer, RDX, 0);
	asmJ(buffer, COND_LESS, &negativeResult);
	asmRet(buffer);

	// negative
	asmLabelBind(buffer, &negativeResult, asmOffset(buffer));
	asmLabelBind(buffer, &negativeDivisor, asmOffset(buffer));
	asmAddq(buffer, RDI, RAX);
	asmRet(buffer);

	asmLabelBind(buffer, &notInt, asmOffset(buffer));
}

static void generateIntRemPrimitive(CodeGenerator *generator)
{
	AssemblerBuffer *buffer = &generator->buffer;
	AssemblerLabel notInt;
	asmInitLabel(&notInt);

	movArg(buffer, 1, RDI);
	testInt(generator, DIL);
	asmJ(buffer, COND_NOT_ZERO, &notInt);

	movArg(buffer, 0, RAX);
	asmCqo(buffer);
	asmIdivq(buffer, RDI);
	asmMovq(buffer, RDX, RAX);
	asmRet(buffer);

	asmLabelBind(buffer, &notInt, asmOffset(buffer));
}

static void generateIntNegPrimitive(CodeGenerator *generator)
{
	AssemblerBuffer *buffer = &generator->buffer;
	AssemblerLabel overflow;
	asmInitLabel(&overflow);

	movArg(buffer, 0, RAX);
	asmNegq(buffer, RAX);
	asmJ(buffer, COND_OVERFLOW, &overflow);
	asmRet(buffer);

	asmLabelBind(buffer, &overflow, asmOffset(buffer));
}

static void generateIntAndPrimitive(CodeGenerator *generator)
{
	AssemblerBuffer *buffer = &generator->buffer;
	AssemblerLabel notInt;
	asmInitLabel(&notInt);

	movArg(buffer, 1, RAX);
	testInt(generator, AL);
	asmJ(buffer, COND_NOT_ZERO, &notInt);

	asmAndqMem(buffer, arg(0), RAX);
	asmRet(buffer);

	asmLabelBind(buffer, &notInt, asmOffset(buffer));
}

static void generateIntOrPrimitive(CodeGenerator *generator)
{
	AssemblerBuffer *buffer = &generator->buffer;
	AssemblerLabel notInt;
	asmInitLabel(&notInt);

	movArg(buffer, 1, RAX);
	testInt(generator, AL);
	asmJ(buffer, COND_NOT_ZERO, &notInt);

	asmOrqMem(buffer, arg(0), RAX);
	asmRet(buffer);

	asmLabelBind(buffer, &notInt, asmOffset(buffer));
}

static void generateIntXorPrimitive(CodeGenerator *generator)
{
	AssemblerBuffer *buffer = &generator->buffer;
	AssemblerLabel notInt;
	asmInitLabel(&notInt);

	movArg(buffer, 1, RAX);
	testInt(generator, AL);
	asmJ(buffer, COND_NOT_ZERO, &notInt);

	asmXorqMem(buffer, arg(0), RAX);
	asmRet(buffer);

	asmLabelBind(buffer, &notInt, asmOffset(buffer));
}

static void generateIntShiftPrimitive(CodeGenerator *generator)
{
	AssemblerBuffer *buffer = &generator->buffer;
	AssemblerLabel notInt;
	AssemblerLabel rightShift;
	asmInitLabel(&notInt);
	asmInitLabel(&rightShift);

	movArg(buffer, 1, RSI);
	testInt(generator, SIL);
	asmJ(buffer, COND_NOT_ZERO, &notInt);

	movArg(buffer, 0, RAX);
	asmSarqImm(buffer, RSI, 2);
	asmMovb(buffer, SIL, CL);
	asmTestq(buffer, RSI, RSI);
	asmJ(buffer, COND_SIGN, &rightShift);
	asmShlq(buffer, RAX);
	asmRet(buffer);

	asmLabelBind(buffer, &rightShift, asmOffset(buffer));
	asmNegb(buffer, CL);
	asmShrq(buffer, RAX);
	asmAndqImm(buffer, RAX, ~3);
	asmRet(buffer);

	asmLabelBind(buffer, &notInt, asmOffset(buffer));
}

static void generateBlockValuePrimitive0Args(CodeGenerator *generator)
{
	generateBlockValuePrimitive(generator, 0);
}

static void generateBlockValuePrimitive1Args(CodeGenerator *generator)
{
	generateBlockValuePrimitive(generator, 1);
}

static void generateBlockValuePrimitive2Args(CodeGenerator *generator)
{
	generateBlockValuePrimitive(generator, 2);
}

static void generateBlockValuePrimitive3Args(CodeGenerator *generator)
{
	generateBlockValuePrimitive(generator, 3);
}

static void generateBlockValuePrimitive(CodeGenerator *generator, uint8_t args)
{
	AssemblerBuffer *buffer = &generator->buffer;
	AssemblerLabel invalidArgs;
	ptrdiff_t compiledCodeOffset = offsetof(NativeCode, compiledCode) - offsetof(NativeCode, insts);
	ptrdiff_t argsOffset = offsetof(RawCompiledBlock, header) + offsetof(CompiledCodeHeader, argsSize) - 1;
	uint8_t i;

	asmInitLabel(&invalidArgs);

	asmPushq(buffer, RBP);
	asmMovq(buffer, RSP, RBP);

	// save native code
	asmPushq(buffer, R11);
	// push current context
	asmPushq(buffer, CTX);

	// load compiled block
	asmMovqMem(buffer, asmMem(RBP, NO_REGISTER, SS_1, 2 * sizeof(intptr_t)), TMP);
	asmMovqMem(buffer, asmMem(TMP, NO_REGISTER, SS_1, varOffset(RawBlock, compiledBlock)), TMP);

	// check arguments size
	asmCmpbMemImm(buffer, asmMem(TMP, NO_REGISTER, SS_1, argsOffset), args);
	asmJ(buffer, COND_NOT_EQUAL, &invalidArgs);

	generateBlockContextAllocation(generator);

	// epilogue
	asmMovq(buffer, RBP, RSP);
	asmPopq(buffer, RBP);

	// replace receiver on stack
	asmMovqMem(buffer, asmMem(RDI, NO_REGISTER, SS_1, varOffset(RawBlock, receiver)), TMP);
	asmMovqToMem(buffer, TMP, arg(0));

	// call block
	asmMovqMem(buffer, asmMem(RDI, NO_REGISTER, SS_1, varOffset(RawBlock, nativeCode)), R11);
	asmAddqImm(buffer, R11, offsetof(NativeCode, insts));
	asmJmpq(buffer, R11);

	asmLabelBind(buffer, &invalidArgs, asmOffset(buffer));

	// epilogue
	asmMovq(buffer, RBP, RSP);
	asmPopq(buffer, RBP);
}

static void generateBlockValueArgsPrimitive(CodeGenerator *generator)
{
	AssemblerBuffer *buffer = &generator->buffer;
	AssemblerLabel invalidArgs;
	AssemblerLabel loop;
	AssemblerLabel zeroArgs;
	ptrdiff_t compiledCodeOffset = offsetof(NativeCode, compiledCode) - offsetof(NativeCode, insts);
	ptrdiff_t argsOffset = offsetof(RawCompiledBlock, header) + offsetof(CompiledCodeHeader, argsSize) - 1;
	uint8_t i;

	asmInitLabel(&invalidArgs);
	asmInitLabel(&loop);
	asmInitLabel(&zeroArgs);

	asmPushq(buffer, RBP);
	asmMovq(buffer, RSP, RBP);

	// save native code
	asmPushq(buffer, R11);
	// push current context
	asmPushq(buffer, CTX);

	// load block and arguments array
	asmMovqMem(buffer, asmMem(RBP, NO_REGISTER, SS_1, 2 * sizeof(intptr_t)), R13);
	asmMovqMem(buffer, asmMem(RBP, NO_REGISTER, SS_1, 3 * sizeof(intptr_t)), RSI);

	// load compiled block
	asmMovqMem(buffer, asmMem(R13, NO_REGISTER, SS_1, varOffset(RawBlock, compiledBlock)), TMP);

	// load array arguments size
	asmMovqMem(buffer, asmMem(RSI, NO_REGISTER, SS_1, varOffset(RawArray, size)), RBX);

	// check arguments size
	asmCmpbMem(buffer, asmMem(TMP, NO_REGISTER, SS_1, argsOffset), BL);
	asmJ(buffer, COND_NOT_EQUAL, &invalidArgs);

	// push arguments on stack
	asmTestq(buffer, RBX, RBX);
	asmJ(buffer, COND_ZERO, &zeroArgs);
	asmLabelBind(buffer, &loop, asmOffset(buffer));
	asmDecq(buffer, RBX);
	asmPushqMem(buffer, asmMem(RSI, RBX, SS_8, varOffset(RawArray, vars)));
	asmJ(buffer, COND_NOT_ZERO, &loop);
	asmLabelBind(buffer, &zeroArgs, asmOffset(buffer));

	// push receiver
	asmPushqMem(buffer, asmMem(R13, NO_REGISTER, SS_1, varOffset(RawBlock, receiver)));

	generateBlockContextAllocation(generator);

	// call block
	asmMovqMem(buffer, asmMem(R13, NO_REGISTER, SS_1, varOffset(RawBlock, nativeCode)), RAX);
	asmAddqImm(buffer, RAX, offsetof(NativeCode, insts));
	asmCallq(buffer, RAX);

	// epilogue
	asmMovq(buffer, RBP, RSP);
	asmPopq(buffer, RBP);
	asmRet(buffer);

	asmLabelBind(buffer, &invalidArgs, asmOffset(buffer));
	asmMovq(buffer, RBP, RSP);
	asmPopq(buffer, RBP);
}

static void generateBlockWhileTrue(CodeGenerator *generator)
{
	AssemblerBuffer *buffer = &generator->buffer;
	AssemblerLabel loop;
	AssemblerLabel notBoolean;
	asmInitLabel(&loop);
	asmInitLabel(&notBoolean);

	asmPushq(buffer, RBP);
	asmMovq(buffer, RSP, RBP);

	// save native code
	asmPushq(buffer, R11);
	generatePushDummyContext(buffer);

	generateLoadObject(buffer, (RawObject *) Handles.Block->raw, RDI, 1);
	generateLoadObject(buffer, (RawObject *) Handles.valueSymbol->raw, RSI, 0);
	generateMethodLookup(generator);

	asmPushq(buffer, R11);
	asmSubqImm(buffer, RSP, sizeof(intptr_t));

	// value block
	asmLabelBind(buffer, &loop, asmOffset(buffer));
	// copy receiver in loop again as #blockValue replaces it
	asmMovqMem(buffer, asmMem(RBP, NO_REGISTER, SS_1, 2 * sizeof(intptr_t)), TMP);
	asmMovqToMem(buffer, TMP, asmMem(RSP, NO_REGISTER, SS_1, 0));
	// call block native code
	asmMovqMem(buffer, asmMem(RSP, NO_REGISTER, SS_1, sizeof(intptr_t)), R11);
	asmCallq(buffer, R11);
	generateStackmap(generator);

	// repeat if result is true
	generateLoadObject(buffer, Handles.true->raw, TMP, 1);
	asmCmpq(buffer, RAX, TMP);
	asmJ(buffer, COND_EQUAL, &loop);

	// check if result is false
	generateLoadObject(buffer, Handles.false->raw, TMP, 1);
	asmCmpq(buffer, RAX, TMP);
	asmJ(buffer, COND_NOT_EQUAL, &notBoolean);

	// return receiver
	asmMovqMem(buffer, asmMem(RBP, NO_REGISTER, SS_1, 2 * sizeof(intptr_t)), RAX);
	asmAddqImm(buffer, RSP, 4 * sizeof(intptr_t));
	asmPopq(buffer, RBP);
	asmRet(buffer);

	// not boolean
	asmLabelBind(buffer, &notBoolean, asmOffset(buffer));
	asmAddqImm(buffer, RSP, 3 * sizeof(intptr_t));
	asmPopq(buffer, R11);
	asmPopq(buffer, RBP);
}

static void generateBlockWhileTrue2(CodeGenerator *generator)
{
	AssemblerBuffer *buffer = &generator->buffer;
	ptrdiff_t compiledCodeOffset = offsetof(NativeCode, compiledCode) - offsetof(NativeCode, insts);
	AssemblerLabel loop;
	AssemblerLabel end;
	AssemblerLabel notBoolean;
	asmInitLabel(&loop);
	asmInitLabel(&end);
	asmInitLabel(&notBoolean);

	asmPushq(buffer, RBP);
	asmMovq(buffer, RSP, RBP);

	// save native code
	asmPushq(buffer, R11);
	generatePushDummyContext(buffer);

	generateLoadObject(buffer, (RawObject *) Handles.Block->raw, RDI, 1);
	generateLoadObject(buffer, (RawObject *) Handles.valueSymbol->raw, RSI, 0);
	generateMethodLookup(generator);
	asmPushq(buffer, R11);

	// value block
	asmLabelBind(buffer, &loop, asmOffset(buffer));
	asmPushqMem(buffer, asmMem(RBP, NO_REGISTER, SS_1, 2 * sizeof(intptr_t)));
	asmMovqMem(buffer, asmMem(RSP, NO_REGISTER, SS_1, sizeof(intptr_t)), R11);
	asmCallq(buffer, R11);
	generateStackmap(generator);
	asmAddqImm(buffer, RSP, sizeof(intptr_t));

	// repeat if result is true
	generateLoadObject(buffer, Handles.true->raw, TMP, 1);
	asmCmpq(buffer, RAX, TMP);
	asmJ(buffer, COND_NOT_EQUAL, &end);

	// value second block
	asmPushqMem(buffer, asmMem(RBP, NO_REGISTER, SS_1, 3 * sizeof(intptr_t)));
	asmMovqMem(buffer, asmMem(RSP, NO_REGISTER, SS_1, sizeof(intptr_t)), R11);
	asmCallq(buffer, R11);
	generateStackmap(generator);
	asmAddqImm(buffer, RSP, sizeof(intptr_t));
	asmJmpLabel(buffer, &loop);

	// result is not true
	asmLabelBind(buffer, &end, asmOffset(buffer));

	// check if result is false
	generateLoadObject(buffer, Handles.false->raw, TMP, 1);
	asmCmpq(buffer, RAX, TMP);
	asmJ(buffer, COND_NOT_EQUAL, &notBoolean);

	// return receiver
	asmMovqMem(buffer, asmMem(RBP, NO_REGISTER, SS_1, 2 * sizeof(intptr_t)), RAX);
	asmAddqImm(buffer, RSP, 3 * sizeof(intptr_t));
	asmPopq(buffer, RBP);
	asmRet(buffer);

	// not boolean
	asmLabelBind(buffer, &notBoolean, asmOffset(buffer));
	asmAddqImm(buffer, RSP, 2 * sizeof(intptr_t));
	asmPopq(buffer, R11);
	asmPopq(buffer, RBP);
}

static void generateBlockOnExceptionPrimitive(CodeGenerator *generator)
{
	AssemblerBuffer *buffer = &generator->buffer;
	ptrdiff_t compiledCodeOffset = offsetof(NativeCode, compiledCode) - offsetof(NativeCode, insts);
	AssemblerFixup *ip;
	generator->frameSize = 2;

	// prologue
	asmPushq(buffer, RBP);
	asmMovq(buffer, RSP, RBP);
	asmSubqImm(buffer, RSP, generator->frameSize * sizeof(intptr_t));

	// save native code
	asmMovqToMem(buffer, R11, asmMem(RBP, NO_REGISTER, SS_1, -sizeof(intptr_t)));
	generateMethodContextAllocation(generator, 0);

	// allocate exception handler
	generateLoadObject(buffer, (RawObject *) Handles.ExceptionHandler->raw, RSI, 0);
	asmXorq(buffer, RDX, RDX);
	generateStubCall(generator, &AllocateStub);
	// setup return IP
	asmMovqImm(buffer, 0, TMP);
	ip = asmEmitFixup(buffer, ASM_FIXUP_IP, sizeof(intptr_t), asmOffset(buffer) - sizeof(intptr_t));
	asmMovqToMem(buffer, TMP, asmMem(RAX, NO_REGISTER, SS_1, varOffset(RawExceptionHandler, ip)));
	// setup context exception handler
	asmMovqMem(buffer, asmMem(RBP, NO_REGISTER, SS_1, -2 * sizeof(intptr_t)), R9);
	asmMovqToMem(buffer, R9, asmMem(RAX, NO_REGISTER, SS_1, varOffset(RawExceptionHandler, context)));
	// spill exception handler
	asmPushq(buffer, RAX);
	generator->frameSize++;

	// install exception handler
	asmMovqImm(buffer, (int64_t) &CurrentExceptionHandler, RDI);
	asmMovqMem(buffer, asmMem(RDI, NO_REGISTER, SS_1, 0), TMP);
	asmMovqToMem(buffer, TMP, asmMem(RAX, NO_REGISTER, SS_1, varOffset(RawExceptionHandler, parent)));
	asmMovqToMem(buffer, RAX, asmMem(RDI, NO_REGISTER, SS_1, 0));

	// value block
	generateLoadObject(buffer, (RawObject *) Handles.Block->raw, RDI, 1);
	generateLoadObject(buffer, (RawObject *) Handles.valueSymbol->raw, RSI, 0);
	asmPushqMem(buffer, asmMem(RBP, NO_REGISTER, SS_1, 2 * sizeof(intptr_t)));
	generator->frameSize++;
	generateMethodLookup(generator);
	generator->frameSize--;
	asmCallq(buffer, R11);
	generateStackmap(generator);

	// unregister exception handler
	asmMovqMem(buffer, asmMem(RBP, NO_REGISTER, SS_1, -3 * sizeof(intptr_t)), TMP);
	asmMovqMem(buffer, asmMem(TMP, NO_REGISTER, SS_1, varOffset(RawExceptionHandler, parent)), TMP);
	asmMovqImm(buffer, (int64_t) &CurrentExceptionHandler, RDI);
	asmMovqToMem(buffer, TMP, asmMem(RDI, NO_REGISTER, SS_1, 0));

	// epilogue
	asmMovqMem(&generator->buffer, asmMem(CTX, NO_REGISTER, SS_1, varOffset(RawContext, parent)), CTX);
	asmAddqImm(buffer, RSP, 4 * sizeof(intptr_t));
	asmPopq(buffer, RBP);
	asmRet(buffer);

	// jumped from exception signal
	// RBP, RSP are restored by exception signal
	ip->value = asmOffset(buffer) - ip->offset;
	generator->frameSize = 5; // native code + context + backtrace + exception + block

	// restore context
	asmMovqMem(buffer, asmMem(RBP, NO_REGISTER, SS_1, -2 * sizeof(intptr_t)), CTX);

	// value exception block
	asmPushqMem(buffer, asmMem(RBP, NO_REGISTER, SS_1, 4 * sizeof(intptr_t)));
	generateLoadObject(buffer, (RawObject *) Handles.Block->raw, RDI, 1);
	generateMethodLookup(generator);
	generator->frameSize -= 3;
	asmCallq(buffer, R11);
	generateStackmap(generator);

	// epilogue
	asmMovqMem(&generator->buffer, asmMem(CTX, NO_REGISTER, SS_1, varOffset(RawContext, parent)), CTX);
	asmAddqImm(buffer, RSP, 5 * sizeof(intptr_t));
	asmPopq(buffer, RBP);
	asmRet(buffer);
}

static void generateExceptionSignalPrimitive(CodeGenerator *generator)
{
	AssemblerBuffer *buffer = &generator->buffer;
	AssemblerLabel handlerNotFound;
	AssemblerLabel skipBacktrace;
	asmInitLabel(&handlerNotFound);
	asmInitLabel(&skipBacktrace);

	// prologue
	asmPushq(buffer, RBP);
	asmMovq(buffer, RSP, RBP);

	// save native code
	asmPushq(buffer, R11);
	generatePushDummyContext(buffer);

	asmMovq(buffer, R11, R13);

	asmMovqMem(buffer, asmMem(RBP, NO_REGISTER, SS_1, 2 * sizeof(intptr_t)), RDI);
	asmDecq(buffer, RDI);

	generateCCall(generator, (intptr_t) unwindExceptionHandler, 1, 1);
	asmTestq(buffer, RAX, RAX);
	asmJ(buffer, COND_ZERO, &handlerNotFound);

	// load context
	asmMovqMem(buffer, asmMem(RAX, NO_REGISTER, SS_1, varOffset(RawExceptionHandler, context)), CTX);
	// load handler frame
	asmMovqMem(buffer, asmMem(CTX, NO_REGISTER, SS_1, varOffset(RawContext, frame)), TMP);
	// load handler block
	asmMovqMem(buffer, asmMem(TMP, NO_REGISTER, SS_1, 4 * sizeof(intptr_t)), TMP);
	// load compiled block
	asmMovqMem(buffer, asmMem(TMP, NO_REGISTER, SS_1, varOffset(RawBlock, compiledBlock)), TMP);
	// check if block accepts backtrace in second argument
	ptrdiff_t argsSizeOffset = varOffset(RawCompiledBlock, header) + offsetof(CompiledCodeHeader, argsSize);
	asmCmpbMemImm(buffer, asmMem(TMP, NO_REGISTER, SS_1, argsSizeOffset), 2);
	asmJ(buffer, COND_LESS, &skipBacktrace);

	asmPushq(buffer, RAX);
	generator->frameSize++;

	// generate backtrace
	asmMovqMem(buffer, asmMem(RBP, NO_REGISTER, SS_1, 2 * sizeof(intptr_t)), TMP);
	asmPushq(buffer, TMP);
	generator->frameSize++;
	generateLoadClass(buffer, TMP, RDI);
	generateLoadObject(buffer, (RawObject *) Handles.generateBacktraceSymbol->raw, RSI, 0);
	generateMethodLookup(generator);
	generator->frameSize--;
	asmCallq(buffer, R11);
	generateStackmap(generator);

	asmAddqImm(buffer, RSP, sizeof(intptr_t));
	asmPopq(buffer, RDI);
	generator->frameSize--;

	// load signaled exception as this stack frame is later destroyed
	asmMovqMem(buffer, asmMem(RBP, NO_REGISTER, SS_1, 2 * sizeof(intptr_t)), R9);
	// load context
	asmMovqMem(buffer, asmMem(RDI, NO_REGISTER, SS_1, varOffset(RawExceptionHandler, context)), CTX);
	// restore SP and BP
	asmMovqMem(buffer, asmMem(CTX, NO_REGISTER, SS_1, varOffset(RawContext, frame)), RBP);
	asmLeaq(buffer, asmMem(RBP, NO_REGISTER, SS_1, -2 * sizeof(intptr_t)), RSP);
	asmPushq(buffer, RAX); // push generated backtrace
	asmPushq(buffer, R9); // push signaled exception
	// load #value:value: as backtrace is not passed to the handler block
	generateLoadObject(buffer, (RawObject *) Handles.valueValueSymbol->raw, RSI, 0);
	// jump to handler
	asmMovqMem(buffer, asmMem(RDI, NO_REGISTER, SS_1, varOffset(RawExceptionHandler, ip)), TMP);
	asmJmpq(buffer, TMP);

	asmLabelBind(buffer, &skipBacktrace, asmOffset(buffer));

	// load signaled exception as this stack frame is later destroyed
	asmMovqMem(buffer, asmMem(RBP, NO_REGISTER, SS_1, 2 * sizeof(intptr_t)), R9);
	// restore SP and BP
	asmMovqMem(buffer, asmMem(CTX, NO_REGISTER, SS_1, varOffset(RawContext, frame)), RBP);
	asmLeaq(buffer, asmMem(RBP, NO_REGISTER, SS_1, -2 * sizeof(intptr_t)), RSP);
	asmPushq(buffer, R9); // not used argument
	asmPushq(buffer, R9); // push signaled exception
	// load #value: as backtrace is not passed to the handler block
	generateLoadObject(buffer, (RawObject *) Handles.value_Symbol->raw, RSI, 0);
	// jump to handler
	asmMovqMem(buffer, asmMem(RAX, NO_REGISTER, SS_1, varOffset(RawExceptionHandler, ip)), TMP);
	asmJmpq(buffer, TMP);

	// return to smalltalk code
	asmLabelBind(buffer, &handlerNotFound, asmOffset(buffer));
	asmAddqImm(buffer, RSP, 2 * sizeof(intptr_t));
	asmPopq(buffer, RBP);
	asmMovq(buffer, R13, R11);
}

static PrimitiveResult contextParentPrimitive(Value vContext)
{
	RawContext *context = (RawContext *) asObject(vContext);
	if (!contextHasValidFrame(context)) {
		return primSuccess(getTaggedPtr(Handles.nil));
	}

	StackFrame *frame = context->frame;
	RawContext *parent = stackFrameGetParentContext(frame);

	if (parent == NULL) {
		return primSuccess(getTaggedPtr(Handles.nil));
	} else if (parent->class == Handles.MethodContext->raw || parent->class == Handles.BlockContext->raw) {
		return primSuccess(tagPtr(parent));
	} else {
		return primFailed();
	}
}

static PrimitiveResult contextArgumentAt(Value vContext, Value vIndex)
{
	RawContext *context = (RawContext *) asObject(vContext);
	if (!contextHasValidFrame(context)) {
		return primSuccess(getTaggedPtr(Handles.nil));
	}
	RawCompiledMethod *code = (RawCompiledMethod *) asObject(context->code);
	intptr_t index = asCInt(vIndex);
	if (index < 0 || index > code->header.argsSize) {
		return primFailed();
	}
	return primSuccess(stackFrameGetArg(context->frame, index));
}

static PrimitiveResult contextTemporaryAt(Value vContext, Value vIndex)
{
	RawContext *context = (RawContext *) asObject(vContext);
	if (!contextHasValidFrame(context)) {
		return primSuccess(getTaggedPtr(Handles.nil));
	}
	RawCompiledMethod *code = (RawCompiledMethod *) asObject(context->code);
	intptr_t index = asCInt(vIndex);
	if (index < context->size) {
		return primSuccess(context->vars[index]);
	} else if (context->ic == getTaggedPtr(Handles.nil)) {
		return primSuccess(getTaggedPtr(Handles.nil));
	} else {
		RawStackmap *stackmap = findStackmap(code->nativeCode, (ptrdiff_t) asCInt(context->ic));
		index = index - context->size + FRAME_VARS_OFFSET - 1;
		if (stackmapIncludes(stackmap, index)) {
			return primSuccess(stackFrameGetSlot(context->frame, index));
		} else {
			return primSuccess(getTaggedPtr(Handles.nil));
		}
	}
	return primFailed();
}

static void movArg(AssemblerBuffer *buffer, ptrdiff_t index, Register dst)
{
	asmMovqMem(buffer, arg(index), dst);
}

static MemoryOperand arg(ptrdiff_t index)
{
	return asmMem(RSP, NO_REGISTER, SS_1, (index + 1) * sizeof(intptr_t));
}

redpajama_set_name: RedPajamaGithub


Purple House is the 2018 NT Telstra Business of the Year as announced at a ceremony in Darwin in August.
Recognised for being a strong Indigenous-run and controlled organisation, Purple House provides dialysis in 14 remote clinics as well as the Purple Truck, a mobile dialysis service.
The award recognises the tireless work of Purple House staff, volunteers, patients and their families, who have worked to build an organisation that supports Aboriginal people suffering from end-stage kidney disease, enabling them to return home to their communities and families while continuing dialysis treatment.
"They want fire for the smell of wood smoke going through the air. They want to smell the flowers after the rain," a Purple House Board Member told the judging panel.
Nominated in the 'Social Change Maker' category, the judges said that they were inspired by the way in which Purple House has made a significant impact on the health care system and on the lives of the population living in regional communities.
"Our members are from the most remote part of Australia, the desert, and they had this one thing that they wanted to sort. A community problem was causing them great heartache, which was people having to leave their community and not having their family around to look after them," said CEO, Sarah Brown.
"If our services aren't there, then people have to move off their country to a place that's owned by other people and life becomes all about waiting for your next dialysis day. That means that people are really likely to get sicker. What we found is that by providing services that are run by the community on community, that people are living longer, contributing to their local economies, teaching family their cultural knowledge, and really significantly contributing to the community," Sarah said.
Last year Purple House helped 157 people return home, providing a whole new model of care for dialysis patients in remote Australian communities.
"We've had to work really hard to attract philanthropic funding and to attract non-Aboriginal people to come and understand the issues that face remote communities," Sarah said.


High School Theatre Like You've Never Seen It Before.
adults alike still soar when the slipper fits.
May 4 and 5 at 2PM.
Performers. Lights. Costumers. Run Crew. Sound. Props. Stage Managers. Paint Captains. Directors. Front of House. Hairdressers. Parents. Businesses.


text:
Gearing Up for the Workplace Transparency Act: A Checklist for Illinois Employers
Illinois legislature recently approved the Workplace Transparency Act (WTA) – a sweeping piece of legislation that imposes a variety of restrictions and requirements on employers relating to workplace discrimination and harassment. With Governor Pritzker expected to sign the act into law, Illinois employers are facing a radically different labor and employment landscape starting in 2020.
Limitations on Employment Agreements
Under the WTA, employers are prohibited from entering into employee agreements (including separation or settlement agreements) that contain nondisclosure and/or non-disparagement clauses for claims of harassment or discrimination. However, employers can enter into separation or settlement agreements with nondisclosure and/or non-disparagement clauses if all the following conditions are present:
The claim at issue arose before the settlement/separation agreement was executed.
The parties both agree on the nondisclosure and/or non-disparagement clause.
The employee/applicant has 21 days to consider the agreement before executing.
The employee/applicant has seven calendar days following the execution of the agreement to revoke the agreement.
Limitations on Arbitration Agreements
Although employers are still permitted to use arbitration agreements, they may only do so if the arbitration agreement excludes discrimination and harassment claims. The prohibition on arbitration of discrimination and harassment claims appears to conflict with the Federal Arbitration Act. But, employers will be faced with uncertainty in how this provision will be enforced against employers until there is a judicial opinion addressing the conflict.
Expanded Definitions of Discrimination and Harassment
The WTA also amends the Illinois Human Rights Act (IHRA) to prohibit actual or perceived discrimination and/or harassment based on a protected characteristic under the IHRA, including: race, color, religion, national origin, ancestry, age, sex, marital status, order of protection status, disability, military status, sexual orientation, pregnancy, or unfavorable discharge from military service. Previously, causes of action for "perceived" discrimination or harassment were limited to disability claims. "Perceived" discrimination or harassment claims allow employees to allege that they were subject to unwelcome conduct based on a protected characteristic their employee "perceived" them to have, regardless of whether the individual actually has that characteristic.
Expanded Application of IHRA to Contractors
The WTA further amends the IHRA to specifically provide protections to "nonemployees," such as contractors and consultants. Consequently, employers could be held liable for harassing conduct that substantially interferes with contractors' work performance or creates an intimidating, hostile or offensive working environment for them as members of a protected class.
Employer Disclosure Requirements
Beginning July 1, 2020, employers and parties to a public contract in Illinois are required to disclose annually to the Illinois Department of Human Rights (IDHR):
Total number of settlements entered into during the preceding year by the employer or corporate executive of the employer that relate to any alleged act of sexual harassment or unlawful discrimination
Breakdown of the number of settlements based on protected characteristics
Total number of adverse judgments or administrative rulings during the preceding year
Whether any equitable relief was ordered against the employer in any adverse judgment or administrative ruling
Total number of adverse judgments or administrative rulings based on protected characteristics
The IDHR may use the information disclosed to open a preliminary investigation into pattern and practice violations. Noncompliance with reporting obligations could result in civil penalties up to $5,000 per offense.
Annual Sexual Harassment Prevention Training
Employers are now required to provide annual sexual harassment prevention training to all employees, which at minimum, must:
Define sexual harassment.
Provide examples of prohibited conduct.
Identify employer responsibility to prevent, investigate and address sexual harassment.
Summarize federal and state laws addressing sexual harassment, including available remedies.
The IDHR will make available a model sexual harassment prevention training program that meets these criteria. Employers must either use the model program or establish training that exceeds the minimum standards provided by the model training.
Noncompliance with this section may subject employers to civil penalties up to $5,000 per offense.
Recommended Next Steps
Once signed by Governor Pritzker, the WTA will largely go into effect on January 1, 2020 (with the exception of the employer disclosure requirement noted above).
Employers should be ready to immediately review their employment contracts, separation agreements, arbitration agreements, and policies on discrimination and harassment. Employers should also evaluate whether their internal sexual harassment training program meets the WTA's minimum requirements. Additionally, employers should prepare to comply with the mandatory reporting requirements.
Lindsey M. Hogan
lindsey.hogan@FaegreBD.com
Stacey L. Smiricky
stacey.smiricky@FaegreBD.com
Sylvia Bokyung St. Clair
sylvia.stclair@FaegreBD.com
Labor & Employment Employment Litigation HR Compliance, Training & Transactions Support


You'll always know what you're getting from us with a FREE estimate.
Our plumbing company is the area's best choice for repairs and service. We provide emergency services to both commercial and residential properties so don't hesitate to call us anytime for the services you need.
Bring your remodeling ideas to us today.


With 20 law schools in the U.S. now accepting the GRE in lieu of the LSAT, many applicants may be wondering which test is right for them.
Ilana Kowarski, a reporter at US News, recently discussed a few key differences between the two exams.
In terms of how the test is administered, the LSAT is a traditional paper exam whereas the GRE is administered on a computer.
GRE test takers should also be aware that the computerized exam is a personalized test — meaning that the difficulty of questions increases when test takers answer questions correctly.
Will Haynes, an Ohio-based test prep tutor manager for The Princeton Review, tells US News that the computer-adaptive format of the GRE may negatively influence test-takers.
"This can really change a student's approach or strategy and can mess with their psyche, not to mention there are random, unknown experimental sections that don't count," Haynes tells US News.
A number of law schools have begun embracing the GRE in order to reach a wider applicant pool. And that has a lot to do with how many times the test is administered in a year.
The GRE is offered year-round. On the other hand, the LSAT is only offered six times per calendar year, according to US News.
While the GRE is more widely offered, there is a limit to how many times applicants can take it.
Applicants can take the GRE once every 21 days and up to five times within any continuous rolling 12-month period, according to the Educational Testing Service (ETS). With the LSAT, there is no longer a limit to the number of times you can take the exam.
When it comes to score, the GRE offers test-takers the option of only sending their best score to law schools. But with the LSAT, the options are limited.
Additionally, since the GRE is computer-administered, scores are available to view immediately upon completion of the exam.
Experts say the GRE tests more general knowledge and focuses on skills such as critical thinking.
The LSAT, on the other hand, is much more specialized to focus on legal knowledge and skills such as logic.
If you're strong in math, however, it may be a wise decision to try taking the GRE, which includes quantitative reasoning sections.
With a number of differences, the LSAT and GRE are made for different test-takers. But which exam do admission officers prefer seeing? Either, according to Jessica Soban, associate dean for strategic initiatives and admissions at Harvard Law School.
"We are not in any way discouraging or encouraging one test versus the other," Soban told The Economist.


Anyone's Diary is ranked in the 25th percentile of games scored on OpenCritic.
Anyone's Diary may have left me confused about its story but I really enjoyed the visuals and puzzles. Sure, we do see the same mechanic for the puzzles repeated a few times as you travel through this artistic puzzle platformer, but each puzzle has its own spin on the mechanic and keeps you interested. The design choice to have everything made out of drawings and writing from your diary really helps create a surreal and symbolic experience in this twisted world.
Anyone's Diary is a great addition to the PlayStation VR game catalog, thanks to its artistic look and its proposal. However, because of its short duration, repetitive gameplay and lack of challenge, its experience is impaired.
An interesting VR proposal that convinces on the audiovisual and the narrative way to tell its story, but it suffers technical shortcommings and bugs (we had to restart some chapters a couple of times)... Nothing that cannot be fixed with a patch. It's not a long experience: the end can be reached in an hour (3 more runs to get all the trophies).
Anyone's Diary might be worth a look for anyone interested in game development and this game's particular history. The visuals on display are often impressive. But for the average player, I suspect that the game's bugs and short length will be deal breakers. When a game is regularly erasing your progress, the best intentions in the world won't save it.


text:
FHP searching for vehicle after 70-year-old Pensacola man killed in hit-and-run
Pensacola News Journal/USA TODAY NETWORK
The Florida Highway Patrol is asking for the public's help in locating a vehicle involved in a hit-and-run crash that left a 70-year-old Pensacola man dead Sunday afternoon.
The man was walking north on the shoulder of Mobile Highway just north of Ferlon Avenue at 2:57 p.m., according to an FHP report.
An unknown vehicle was traveling on Mobile Highway, also just north of Ferlon Avenue, when the driver failed to maintain their lane and ran off the road to the right, colliding with the pedestrian.
In case you missed it:Two dead, two in critical condition in fatal Beverly Parkway crash
In other news:FHP: Pensacola pedestrian critically injured by 15-year-old driver on U.S. 90
The driver, who might have pulled over after the crash before continuing westbound on Mobile Highway, is described as possibly a Black male. Authorities are looking for a possible black midsize passenger car with front-end damage.
Anyone with information about the suspect has been asked to contact law enforcement by calling Crime Stoppers at 850-433-7867 or *FHP.
Want more local news? If you're already a subscriber, thank you! If not, please subscribe and help keep coverage of the most important local news coming.


text:
In last week's budget speech, Financial Secretary John Tsang Chun-wah proposed to extend a government incentive scheme to March 2018 that halves the port facilities and light dues charged on ocean-going vessels that switch to low-sulphur fuel while at berth in Hong Kong. The extension is, the government explained, a means to help the shipping industry's transition to more stringent fuel regulation that is expected to come into effect later this year.
Vessels will be required by law to burn marine fuel with a sulphur content of 0.5 per cent or less, slashing at-berth sulphur dioxide and particulate emissions by up to 80 per cent.
Given the maritime industry's contribution to Hong Kong's economy, the proposal is a calculated attempt to prevent cost-conscious ship operators from going to Shenzhen and other neighbouring ports where regulation on marine fuel quality is lacking. Despite assurances from major shipping lines that they have no plans to bypass Hong Kong, the government is taking no chances.
It is debatable whether tighter environmental regulations will drive ships away. The government's concerns could be fuelled by Hong Kong's diminishing competitive advantage over neighbouring ports. That said, to think that introducing higher environmental standards will inevitably make Hong Kong's port less competitive is missing the bigger picture.
There is growing evidence that the maritime sector has become more responsive in recent years to the call for better environmental performance. For example, Koji Sekimizu, secretary general of the International Maritime Organisation, put forward in 2012 the concept of a sustainable maritime transport system. This was a wake-up call at the highest level that, despite its significant contribution to trade and economic growth, the sector has a major responsibility to reduce its environmental footprint.
Around the world, national, regional and local governments are working tirelessly together with the industry for innovative solutions – technical, financial and regulatory – to improve the energy efficiency of ships, and to reduce air pollution and greenhouse gas emissions. Here in Hong Kong, the shipping industry voluntarily initiated the Fair Winds Charter in 2011. We are expecting ship emission control regulation this year, and are pushing for the same across the region. The tide has turned.
The government's generosity in light of impending regulation has therefore raised a few eyebrows. Questions have been asked as to why it is planning to give away public money to polluters, who are only months away from complying with regulation with or without government incentives.
If the government insists on doling out the money, the scheme would only make sense with different incentives. Vessels meeting the regulation requirements should get a standard rebate, whereas carriers willing and ready to take the next step, such as burning fuel with 0.1 per cent sulphur content, should be rewarded with a higher rebate. This way, all industry players would receive some financial support from the government for switching fuel, the front runners would be motivated to reach for a higher standard, and Hong Kong as a whole would benefit from a green maritime sector in the long run.
SCMP: Moderate Voice
Civic Exchange Welcomes New at-Berth Fuel-Switching Regulation in Hong Kong
Author: Lawrence Iu


Authorities say the death of a 37-year-old woman found at the White Pines Golf Course in unincorporated DuPage County appears to be a homicide.
Charlie Dastych, chief deputy coroner in DuPage County, said the body was found by the course entrance at 500 W. Jefferson St. near Bensenville.
The Cook County sheriff's office released a statement saying the woman was believed to be the victim of a homicide that occurred in the 11500 block of Grand Avenue in unincorporated Cook County.
Several agencies are now involved in the investigation, authorities said.
Officials with the Bensenville Park District, which operates the course, could not be reached for comment.
Joe Sansone, 62, a retired police officer who lives across the street from the golf course entrance on Jefferson, said he saw detectives canvassing the neighborhood around 10:30 a.m.
Sansone said he works weekends at the golf course as a course ranger and that another employee told him that the victim had a large rose tattoo on her chest. He said the employee told him someone cutting the grass found the woman near the 16th green, which is just south of the course entrance.
He said nearly a half-dozen unmarked squad cars had parked in and around his neighborhood. Later Thursday afternoon, Sansone said he saw a marked Chicago police squad car at the scene.
Sansone said the course opens early in the morning, with some golfers starting while it's still dark. Wet weather may have kept some players away Thursday, though he said he saw people playing golf at the course in the later morning.


glacier water infused with oxygen deeply hydrate, protect from free-radical damage.
white cast and brightens skin for a naturally flawless finish.
Housed in a convenient compact, this cushion is excellent for everyday use.


text:
E3 2020 cancelled due to Coronavirus concerns
Bringing fans together in a far less toxic space: the internet.
Andi Garnett
12 March 2020, 8:27 am
Andi is the Lead News Writer at Gameplanet. When he's not thrashing away at his keyboard he's either shooting aliens in Destiny or binge-watching TV.
@Corvus_Snow
E3 2020 is officially cancelled, the ESA has confirmed this morning.
"After careful consultation with our member companies regarding the health and safety of everyone in our industry – our fans, our employees, our exhibitors, and our longtime E3 partners – we have made the difficult decision to cancel E3 2020, scheduled for June 9-11 in Los Angeles," reads a statement on the official site.
"Following increased and overwhelming concerns about the COVID-19 virus, we felt this was the best way to proceed during such an unprecedented global situation. We are very disappointed that we are unable to hold this event for our fans and supporters. But we know it's the right decision based on the information we have today."
The COVID-19 virus has now been declared a pandemic by the World Health Organisation.
Many were questioning whether E3 would continue after a state of emergency was declared in LA. Similar concerns have already seen the Game Developers Conference postponed until later in the year.
Xbox's Phil Spencer has already confirmed the company will be holding a digital event, while Ubisoft is "exploring other options for a digital experience."
Devolver Digital, which has typically thumbed its nose at the ESA has also stated plans for an online event around the time of E3 this year.
E3 2020 already had its fair share of blows this year, with Sony confirming that it would not be in attendance for the second year in a row, and notable industry personalities like Geoff Keighley choosing not to participate.
The ESA said it is moving forward with plans to host E3 in 2021.


text:
LWMDEP-The Death Penalty
Module Provider: School of Law
Number of credits: 10 [5 ECTS credits]
Terms in which taught: Spring term module
Co-requisites:
Module Convenor: Dr Mai Sato
Email: m.sato@reading.ac.uk
The course will discuss the issue of capital punishment from a domestic and international law perspective. Students will learn about the applicable human rights standards, as reflected in human rights treaties, and the extent to which defendants in capital cases are protected by due process and have access to qualified defence counsel, and where they lack protection from police abuse, unfair trials, and painful forms of execution. They will explore what happens when the due process safeguards fail and innocent people are convicted and sentenced to death. Further, they will consider whether capital punishment can ever be administered equitably, without discrimination on grounds of race, geography, gender or other non-legal variables. Students will also explore the politics of the abolitionist movement, including the arguments and forces that have been at work to achieve abolition and those that have been used to resist it. Students will discuss whether abolition can be achieved in those countries that still retain it and in particular, the role of public opinion.
The overall aim is to provide students with a good understanding of the scope and practice of capital punishment worldwide and the movement, backed by international organisations, human rights treaties and the domestic courts, to abolish the death penalty. Specific aims will involve exploring the relationship between international human rights law and the domestic protection of human rights and throughout the course students will be asked to draw on recent and controversial cases as well as social scientific literature. The module also aims to encourage students to explore the politics of the abolitionist movement, including the arguments and forces that have been at work to achieve abolition and those that have been used to resist it.
On completion of the module, students will be expected to be able to:??
•Explain and apply the theories and arguments that support the abolition of the death penalty and those that have been used to resist it. ??
•Identify and assess the international human rights standards that regulate the use of the death penalty.
•Explain and critically discuss the judgements from constitutional courts restricting the application of the death penalty.
•Demonstrate an understanding of the challenges in achieving abolition of the death penalty, including the role of public opinion.
•Draw upon a body of detailed substantive knowledge gained through both class participation and self-study, and apply this to contemporary dilemmas associated with capital punishment in an assessed piece of written work.
The small group teaching and independent study elements of this module will facilitate the development of high-level oral communication skills and the enhancement of individual critical analysis ability.
These outcomes are in addition to those listed in the School's "core skills statement".
The module will cover such topics as:
1.Abolition and Retention: a global perspective on the status of the death penalty
2.The influence of international law on the death penalty
3.The role of the domestic courts in restricting the use of the death penalty
4.Procedural Protections for the Accused, especially vulnerable defendants
5.Convicting and Sentencing the Innocent: the inevitability of error
6.The role of public opinion
Teaching in this module is designed to provide students with a range of resources on which they can draw in their learning. The main elements are:
A list of required and recommended readings with a list of notes and questions that will guide preparation and class discussion; and
Six weekly seminar classes of 2 hours each.
Seminars 12
Guided independent study 88
Total hours by term 100.00
Written assignment including essay 100
An assessed essay of 8 pages (formatted in accordance with the School of Law's Assessed Work Rules)
Students will have the opportunity to submit an essay plan to the Module Convenor prior to submission of the assessed essay.
Penalties for late submission on this module are in accordance with the University policy. Please refer to page 5 of the Postgraduate Guide to Assessment for further information: http://www.reading.ac.uk/internal/exams/student/exa-guidePG.aspx
50% overall
See School of Law PGT Programme Handbook


Would you and your game group pay money (a fair amount) to have a convenient and well managed space to game at every week?
I am just curious, because I know often times it is difficult to find a location for everyone to game at that has the minimum amount of distractions, has a good amount of space (this includes table space) for everyone, that everyone can get to. You can play at game stores, but not all game stores have separate game rooms and if they do they tend to be a little stuffy and small. Also the other draw back to playing at a store is the store's hours of operation.
Also I was wondering how much you have paid in the past for such spaces at game stores and whether that was a fair price in your mind?


You may have heard of or seen some other schemes for getting mathematics on the Web, like LaTeX2HTML, Hyperlatex, or the more recent Java script, WebEQ. Why use a new system like MINSE instead?
Clearly there is a need to be able to communicate mathematical and scientific ideas on the Web, but in many cases these concepts need to be represented symbolically. The sad fact is that practically every major browser manufacturer feels that mathematics support isn't important enough to their market share to bother implementing it (or perhaps that blinking, coloured, or scrolling text is more important than symbolic expression).
MINSE tries to fill this need with a solution that is easy to use immediately, but still leaves room for extension. One of the most important objectives is for the communication of such concepts to be accessible to as many people as possible, and to have it work right now. The only way to get equations to reliably show up in graphical browsers is to insert images, and in character-based browsers is to insert preformatted text.
Putting your raw PostScript online. This works only as long as your reader has either a PostScript printer or the means to view PostScript files, as with GhostScript, for example -- and the patience to wait for the download. In this case, however, your entire document is encapsulated in the PostScript file and immutable.
Writing HTML 3.0 math. As far as i can tell, only Arena supports this, and the HTML 3.0 draft has expired by now.
LaTEX-based packages like LaTeX2HTML or Hyperlatex. These are programs that try to convert documents from the popular LaTEX mathematics typesetting program to HTML format. Here are some of the differences between LaTEX conversion and MINSE.
WebEQ, a project at the UMN Geometry Center. This is a Java applet that you download and run in your browser, which renders the equations in your browser window. Here are some of the differences between WebEQ and MINSE.
If you need to put up a big LaTEX document on the web and you've already got all the necessary tools installed, it's probably worth the effort to try running it through a converter. But for quick and direct expression when you're authoring anything new, or if you're looking for something that will remain useful to the widest possible audience, i think MINSE has many advantages.
The expressions are right in your HTML document. There are no other files to edit or deal with. Making changes is easy.
Writing expressions with MINSE is simple and concise.
You don't need to install any software to use MINSE. All the work is done by the polymediator.
Your readers don't need to install any software to use MINSE. All the work is done by the polymediator.
You can look at your HTML source code and know what it will look like. You can preview it immediately if you want to be sure.
You don't need a workstation to use MINSE. All you need is a text editor, which you can find just as easily on a Macintosh or a DOS machine as on a Unix box.
...but this is just the first implementation, and since MINSE expressions contain the semantics of the communication, they will last while implementations may come and go. While support is being developed for other media or for other browsers, you can be confident that you don't need to change any of your documents to chase a moving target.