---
abstract: |
    The goal of this work is to develop an application that enables music producers to use their voice to create drum patterns when composing in Digital Audio Workstations (DAWs). An easy-to-use and user-oriented system capable of automatically transcribing vocalisations of percussion sounds, called LVT - Live Vocalised Transcription, is presented.[^1] LVT is developed as a Max for Live device which follows the “segment-and-classify” methodology for drum transcription, and includes three modules: i) an onset detector to segment events in time; ii) a module that extracts relevant features from the audio content; and iii) a machine-learning component that implements the k-Nearest Neighbours (kNN) algorithm for the classification of vocalised drum timbres.

    Due to the wide differences in vocalisations from distinct users for the same drum sound, a user-specific approach to vocalised transcription is proposed. In this perspective, a given end-user trains the algorithm with their own vocalisations for each drum sound before inputting their desired pattern into the DAW. The user adaption is achieved via a new Max external which implements Sequential Forward Selection (SFS) for choosing the most relevant features for a given set of input drum sounds. The evaluation of LVT addresses two objectives. First, to investigate the improvement in performance with user-specific training, and second, to assess if LVT can provide an optimised workflow for music production in Ableton Live when compared to existing drum transcription algorithms. Obtained results demonstrate that both objectives are met.
bibliography:
- 'egbib.bib'
title: User Specific Adaptation in Automatic Transcription of Vocalised Percussion
---

Introduction {#sec:intro}
============

The development of computers’ performance capacity, and the consequent possibility for real-time Digital Signal Processing (DSP) for audio, led to the appearance of Digital Audio Workstations (DAWs), making the creation of computer music available to the general public. Following these advances, many new instruments and interfaces for creating electronic music have surfaced. With changes in music culture, music production and how musicians work with their instruments has also changed. In other words, the ability to invent and reinvent the way to produce music is key to progress. Consequently, new proposals are necessary, such as designing new techniques for the composition of music. Within the genre of Electronic Music, sequencing drum patterns plays a critical role. However, inputting drum patterns into DAWs often requires high technical skill on the part of the user, either by physically performing the patterns by tapping them on MIDI drum pads, or manually entering events via music editing software. For non-expert users both options can be very challenging, and can thus provide a barrier to entry. However, the voice is an important and powerful instrument of rhythm production, so it can be used to express or “perform” drum patterns in a very intuitive way - so called “beatboxing.” In order to leverage this concept within a computational system, our goal is towards a system to help users (both expert musicians and amateur enthusiasts) input rhythm patterns they have in mind into a sequencer via the automatic transcription of vocalised percussion. Our proposed tool is beneficial both from the perspective of workflow optimisation (by providing accurate real-time transcriptions), but also as means to encourage users to engage with technology in the pursuit of creative activities. From a technical standpoint, we seek to build on the state of the techniques from the domain of music information retrieval (MIR) for drum transcription [@matthew; @gilletrichard] but actively targeted towards end-users and real-world music content production scenarios.

Methodology
===========

A vocalised drum transcription software, LVT, able to be trained with the user vocalisations is proposed. LVT is developed as a Max for Live project – a visual programming environment, based on Max 7[^2], which allows users to build instruments and effects for use within the Ableton Live[^3] DAW. To develop LVT, a dataset of vocalised percussion was compiled. A group of 20 participants (11 male, 9 female) were asked to record two short vocalised percussion tracks, one identical for all participants, and the other, an improvised pattern. These input percussion tracks were recorded three times: on a low quality laptop microphone, on an iPad microphone, and using a studio quality microphone (AKG c4000b). All recorded audio tracks were manually annotated using Sonic Visualiser[^4], a free application for viewing and analysing the contents of music audio files. The participants spanned a wide range of experience in beatboxing (from beatboxing experts, to those who had never vocalised drum patterns before), and covered a wide age range. Thus, we consider the annotated dataset to be representative of a wide range of potential users of the system, and highly heterogeneous in terms of the types of drum sounds.

Our proposed vocalised percussion transcription system was developed following a user-specific approach. LVT follows the “segment and classify” method for drum transcription [@gilletrichard] and integrates three main elements: i) an onset detector – to identify when each drum sound occurs, ii) a component that extracts features for each event, and iii) a machine learning component to classify the drum sounds. In the Max for Live environment, the onset detection was performed with [AubioOnset]{}$\sim$ [^5]. Feature extraction was performed in real-time using existing Max objects: [Zsa.mfcc]{}$\sim$ – to characterise the timbre, [Zsa.descriptors]{} [@zsa] – to provide spectral centroid, spread, slope, decrease and rolloff features [@zsa], and finally the zero crossing rate and number of zero crossings were calculated with the [zerox]{}$\sim$ object. The machine learning component is trained with the user’s preferred vocalisation and the features are selected which give the best results for the provided input. This is achieved using the Sequential Forward Selection method [@Whitney] along with a k-Nearest Neighbours classification algorithm, with the most significant features selected by the accuracy obtained from testing the training data (in our case, the annotated improvised patterns from each participant). SFS works by selecting the most significant feature, according to a specific parameter (in this case the classification accuracy), and adding it to an initially empty set until there are no improvements or no features remain. The k-NN algorithm was implemented using timbreID[@timbre], and a new external for Max was developed to implement the SFS. A user interface was created in Max for Live to facilitate the utilisation of the application by end-users. A screenshot of the interface of LVT is shown in Fig. \[fig:1\]. It demonstrates the user-specific training stage – where a user inputs a set number of the drum timbres they intend to use, after which their vocalised percussion is transcribed and rendered as a MIDI file for subsequent synthesis.

![User interface of the LVT device.[]{data-label="fig:1"}](LVT){width=".6\linewidth"}

To operate LVT, a user loads the device in Ableton Live and then vocalises the set of desired drum sounds they intend to use, e.g. five kick sounds followed by five snare sounds, followed by five hi-hat sounds. Once the expected number of drum sounds have been detected, the SFS algorithm then identifies the subset of features which best separate the drum sounds for the user. After training, the user can then vocalise rhythmic patterns which are automatically converted from audio to a MIDI representation in the DAW for later synthesis and editing.

Results
=======

The evaluation of LVT was designed to serve two purposes. First, to understand how a user-specific trained system performs against state of the art drum transcription system (which have been optimised over large datasets without any user-specific training), and second, to explore how LVT could improve a producer’s workflow. We compared LVT against two existing drum transcription algorithms: LDT [@matthew], and Ableton Live’s built-in “Convert Drums to MIDI” function. For validation data we used the non-improvised vocalised patterns from our annotated dataset.

To compare the accuracy of the systems we use the F-measure of the transcriptions. Then, to investigate how our system could improve a producers workflow, the “effort” to get an accurate transcription was calculated by counting the number of editing operations required to obtain the desired patterns. These operations are as follows: to *modify*, to *add*, or to *remove* a MIDI note.

  --------- -------- ----- -------- ------- ------- --------

             Modify   Add   Remove   Kick    Snare   Hi-hat
  Ableton      33     12     296     0.518   0.470   0.297
  LDT          52     24     206     0.538   0.204   0.419
  LVT          39      7      15     0.914   0.691   0.802
  --------- -------- ----- -------- ------- ------- --------

  : Number of operations and F-measure for the AKG microphone.[]{data-label="tab:1"}

Table \[tab:1\] summarises the results obtained from counting the total number of operations needed to obtain the desired pattern for the testing data recorded on the studio quality AKG c4000b microphone and the corresponding F-measure per vocalised drum sound, on the three drum transcription systems. The results demonstrate that, for the studio quality microphone, vocalised drum transcription accuracy for LVT is substantially higher than the other systems, and far fewer modifications were required to obtain the desired patterns when editing the automatic transcriptions.

To see the effect of user-specific training on the performance of LVT, an example is provided where LVT is trained on one user and tested on another – and vice-versa. When training the LVT with a different person with different vocalisations, the accuracy of the transcription is decreased as shown in Fig. \[fig:combined\]. In the upper part of each screenshot is the transcription of the user when trained with its own vocalisations, while the bottom part corresponds to the transcription when trained with the other user. As can be seen, without the user-specific training, many misclassifications occur.

By examining the previously obtained results, we infer that LVT can provide a transcription closer to the ground truth than the existing state of the art systems, as shown by the higher F-measure. In addition to LVT being trained per individual user, these results may also derive from the fact that LVT does not try to detect polyphonic events (more than one drum vocalisation at the same time) as the other systems do. Furthermore, LVT does not detect as many events as the other systems, and this has a strong influence on the number of false positives, and hence the F-measure. The number of events to achieve the desired transcription, presented in Table \[tab:1\], shows that the end-user of the system does not have to perform as many actions when producing music, which has a positive impact on the workflow, leaving more time for creative experimentation.

![(top) First user vocalisations trained with the second user. (bottom) Second user vocalisations trained with the first user.[]{data-label="fig:combined"}](combined.png){width=".9\linewidth"}

Conclusions
===========

In this paper, we have presented LVT – a new interface for assistive music content creation. LVT allows Ableton Live users to sequence MIDI patterns that can be used for designing and performing rhythms with their voice. Existing state of the art systems, including one already in Ableton Live, are not able to transcribe vocalised percussion as effectively because these tools are trained for general recorded drum sounds which are typically not vocalised. Indeed, because different people vocalise drum sounds in different ways, LVT explicitly seeks to model and capture this behaviour via user-specific training. Our evaluation shows LVT to be very effective for wide range of users and vocalisations, outperforming existing systems. Furthermore, we believe LVT can be applied to any kinds of arbitrary non-pitched percussive sounds – provided that the training sound types are sufficiently different from one another, and can thus be well separated in the audio feature space using SFS. LVT is implemented as a Max for Live device, and thus fully integrates into Ableton Live, allowing users of all ability ranges to experiment with music sequencing driven by their own personal percussion vocalisations within an easy-to-use graphical user interface.

Acknowledgements
================

This work is financed by the ERDF - European Regional Development Fund through the Operational Programme for Competitiveness and Internationalisation - COMPETE 2020 Programme within project POCI-01-0145-FEDER-006961, and by National Funds through the FCT - Fundação para a Ciência e a Tecnologia (Portuguese Foundation for Science and Technology) as part of project UID/EEA/50014/2013.

Project TEC4Growth-Pervasive Intelligence, Enhancers and Proofs of Concept with Industrial Impact/NORTE-01-0145-FEDER-000020 is financed by the North Portugal Regional Operational Programme (NORTE 2020), under the PORTUGAL 2020 Partnership Agreement, and through the European Regional Development Fund (ERDF).

[^1]: This work is derived from the MSc dissertation of António Ramires, conducted in the Department of Electrical and Computer Engineering in the Faculty of Engineering, University of Porto.

[^2]: www.cycling74.com

[^3]: http://www.ableton.com/en/

[^4]: http://www.sonicvisualiser.org/

[^5]: https://aubio.org/manpages/latest/aubioonset.1.html


/*
 * Copyright (C) 2011 Steven Luo
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.spartacusrex.spartacuside;

import java.util.Iterator;

import android.content.Context;
import android.util.AttributeSet;
import android.view.Gravity;
import android.view.View;
import android.widget.Toast;
import android.widget.ViewFlipper;

public class TermViewFlipper extends ViewFlipper implements Iterable<View> {
    private Context context;
    private Toast mToast;

    class ViewFlipperIterator implements Iterator<View> {
        int pos = 0;

        public boolean hasNext() {
            return (pos < getChildCount());
        }

        public View next() {
            return getChildAt(pos++);
        }

        public void remove() {
            throw new UnsupportedOperationException();
        }
    }

    public TermViewFlipper(Context context) {
        super(context);
        this.context = context;
    }

    public TermViewFlipper(Context context, AttributeSet attrs) {
        super(context, attrs);
        this.context = context;
    }

    public Iterator<View> iterator() {
        return new ViewFlipperIterator();
    }

    public void pauseCurrentView() {
        EmulatorView view = (EmulatorView) getCurrentView();
        if (view == null) {
            return;
        }
        view.onPause();
    }

    public void resumeCurrentView() {
        EmulatorView view = (EmulatorView) getCurrentView();
        if (view == null) {
            return;
        }
        view.onResume();
    }

    private void showTitle() {
        if (getChildCount() == 0) {
            return;
        }
        String title = "Terminal " + (getDisplayedChild()+1);
        if (mToast == null) {
            mToast = Toast.makeText(context, title, Toast.LENGTH_SHORT);
        } else {
            mToast.setText(title);
        }
        mToast.setGravity(Gravity.CENTER, 0, 0);
        mToast.show();
    }

    @Override
    public void showPrevious() {
        pauseCurrentView();
        super.showPrevious();
        showTitle();
        resumeCurrentView();
    }

    @Override
    public void showNext() {
        pauseCurrentView();
        super.showNext();
        showTitle();
        resumeCurrentView();
    }

    @Override
    public void setDisplayedChild(int position) {
        pauseCurrentView();
        super.setDisplayedChild(position);
        showTitle();
        resumeCurrentView();
    }
}


Mobile communications networks are an increasingly popular way for their users to communicate with one another. The number of mobile subscribers is increasing, and with more and more applications and media content available to the subscribers, the amount of data traffic that each subscriber sends or receives is also increasing. Increasing numbers of subscribers and increasing amounts of data traffic place a burden on mobile communications networks. Mobile networks have limitations on their capacity per geographical area (e.g., cell), and so require careful distribution of resources for data traffic.
If the amount of data traffic in a mobile network exceeds a certain limit, then the mobile network can become congested, as the available radio resources, as well as other resources, are finite. Congestion impacts the quality of service received by subscribers if data becomes dropped or delayed. Furthermore, congestion can impact the total amount of traffic carried by the network, since certain applications that get lower access rate in peak hours might not be possible to compensate at times when there is free capacity.
Some client applications can tolerate delays of up to several seconds, minutes or even hours. For example, a subscriber may wish to download a movie for later viewing. The subscriber may wait until a time when there is no congestion in the network before beginning the download, to ensure that they get a faster download rate. Similarly, in machine to machine (M2M) applications, it may be acceptable for sensors reporting measurement to delay transmission to a period when there is no congestion in the network. A third example is an application that regularly generates keep-alive messages. Keep-alive messages cannot be delayed for hours, but can typically be delayed for several seconds without adversely affecting the application. A further example of data traffic that can tolerate a delay is regular news updates to the subscriber.
In order to best utilize the network resources, and to ensure that all subscribers get a required best Quality of Service (QoS) if they are sending or receiving data traffic (such as a live media stream) which cannot tolerate delay, it would be beneficial to reduce congestion by avoiding transmitting data traffic that can tolerate some delay at congestion periods, and to transmit such data traffic them at low-traffic periods instead.
A simple way to address the problem of congestion is for network operators to update their networks and provide more bandwidth and hardware to handle the increase in data traffic. This solution is expensive.
Another known way to address the problem is to limit data traffic of a certain type that is known to be bandwidth-intensive. For example, peer to peer (P2P) data traffic typically consumes a lot of resources, making those resources unavailable for other applications such as Web browsing. Operators therefore typically install certain tools/logic/policy control into their system which throttles P2P traffic during predetermined times of congestion. This works by limiting the total amount of bandwidth available to P2P traffic to a relatively low value for all users in a particular cell during the predetermined times of congestion.
A problem with P2P throttling is that it is performed on a whole class of traffic, and is not performed on the basis of an individual subscriber, cell, or time-of-day basis. Instead, throttling is applied to all subscribers in all cells in the predetermined time period. P2P traffic is not throttled dynamically, so cannot take account of congestion or QoS degradation in periods outside the predetermined time period.
Another approach to mitigate the problem of congestion, described in WO 2005/022941, is to explicitly define a download time for a not so urgent object download. The download time is set in advance by the user manually, for example to a night hour when congestion is less likely. Some operators provide financial incentives for users to schedule their data traffic at low-traffic periods. For example, in mobile networks that charge per minute, prices are typically lower at night, when congestion is less likely, than during the day.
Many subscribers schedule their data traffic at low-traffic time periods manually, simply to obtain faster data traffic rates. For example, P2P users who notice that data transfer speeds are higher in the early morning hours can schedule their P2P applications accordingly.
The delayed download mechanisms rely on the subscriber's knowledge of times of low congestion or times when per-minute charging is lower. If the download time is set in advance, there is no guarantee that there will be no congestion at the set time.


AKE SAFETY EQUIPMENT

Profile

STOP-FYRE is the only multi-shot, clean agent fire extinguisher on the market. Firefighters love it because it quickly gets to those hard-to-reach fires that traditional methods don't. Farmers love it because it's so effective and does not cause damage to machinery. Our customers love it because it works - PERIOD. STOP-FYRE saves lives and property, saving you money, hassle, and tragedy. And with a lifetime guarantee, STOP-FYRE gives you Peace-Of-Mind. We call it the "Worlds BEST Fire Extinguisher" for a reason. Stop by for a demonstration and see why people are choosing STOP-FYRE.


Q:

Modifying parameter passed by value has no effect on caller's variable

I'm trying to make a function that scales the controls of a window with its parent window when I resize that window, in order to accomplish this I embedded CreateWindowEx() into my own function createscalingwindow
int createscalingwindow (HWND cswpara0,DWORD cswpara1,const CHAR* cswpara2,
const CHAR* cswpara3,DWORD cswpara4,int cswpara5,int cswpara6,int cswpara7,
int cswpara8,HWND cswpara9,HMENU cswpara10,HINSTANCE cswpara11,LPVOID cswpara12)
              {
               cswpara0 = CreateWindowEx (cswpara1, cswpara2, cswpara3, cswpara4,
                                          cswpara5,cswpara6,cswpara7,cswpara8,
                                         cswpara9,cswpara10,cswpara11,cswpara12);
               return 0;
              }

After changing this code in winmain
    mainwin = CreateWindowEx(
       0,
       mainclassname,
       "Mafia Online",
       WS_OVERLAPPED|WS_CAPTION|WS_THICKFRAME|WS_MINIMIZEBOX|WS_MAXIMIZEBOX
      |WS_SYSMENU,
       CW_USEDEFAULT,
       CW_USEDEFAULT,
       544,
       375,
       NULL,
       playmenu,
       hThisInstance,
       NULL
       );

To the following code
createscalingwindow (mainwin, 0, mainclassname, "Mafia Online",
WS_OVERLAPPED|WS_CAPTION|WS_THICKFRAME|WS_MINIMIZEBOX|WS_MAXIMIZEBOX|WS_SYSMENU,
CW_USEDEFAULT, CW_USEDEFAULT, 544, 375, NULL, playmenu, hThisInstance, NULL);
ShowWindow (mainwin, nCmdShow);

The main window no longer shows up at all. Calling GetLastError() after the embedded CreateWindowEx() returns error_success.
After examining both variants of the program in ollydbg, I noticed something strange, the execution of the program using the prototype doesn't work the way I'd expect. The program calls to CreateWindowEx and then returns from the call to an entirely different destination.
Here's how I would expect the program to execute (this is the program that doesn't use createscalingwindow):
(I am not allowed to post images as a new user, so if a mod or someone could fix these for me that would be nice.)
http://s8.postimage.org/qo8tqt5h1/mainnormal.png
Here's how it executes:
http://s8.postimage.org/fa8ytr7qt/mainweird.png
Any effort you put forth into helping me is appreciated, so thanks in advance.

A:

By default, function arguments are passed by value, meaning that the function gets its own copy of the variable, and not a reference to the caller's variable. Any modifications made to the local copy will not affect whatever was passed to the function.
If you want a reference, then pass by reference:
int createscalingwindow (HWND & cswpara0 /* etc. */)
                              ^

Now any modifications you make to the function argument will also modify the caller's variable.


Whether evoking the spirit of ‘90s club-kid nostalgia, or – deep breaths everyone – the quintessential ‘dad shoe’, there’s no doubt that chunky, sort-of kind-of ugly (there we said it!) trainers are having their moment.

This season, Balenciaga divided opinion with its Triple S sneaker – XXL and grubby-looking… yet still somehow ridiculously cool; the Fila Disruptors have seen a revival like no other; and brands like Acne Studios, Stella McCartney and Vetements have all been keen to grab a slice of the hulky, bulky trainer pie.

If all that fuss wasn’t enough to make you quake in your kicks, now the Buffalo – once a favourite of the Spice Girls – is back. (Zig-a-zig-ahhhhh!) The brand recently relaunched its platform sneaker at Opening Ceremony stateside, and nowBrownshave nabbed the exclusive on them on this side of the pond.

OK, with their eye-watering seven-centimetre wedge, they’ll take some backbone to pull off. But no guts no glory, right?! We’re wearing ours with the season’s ubiquitous kick-flare frayed jeans and sugary pink heart-adorned socks (to take the edge off).

Love them or hate them, they'll certainly make an impression – and, once we'd adjusted to the ‘90s fever filling the room, we felt ready and rearing to hit a rave!

Shop the Buffalo platforms and other chunky It trainers below:

JavaScript is currently disabled in this browser. Reactivate it to view this content.


Young Kwak/Associated Press

For the third time in four seasons, it's becoming increasingly difficult in the middle of February to come up with any reason not to pick Gonzaga to win the men's college basketball national championship.

And with all due respect to San Diego State's Brian Dutcher, Penn State's Pat Chambers and Baylor's Scott Drew, Mark Few deserves to be the runaway favorite for 2019-20 Naismith College Coach of the Year for making this particular pack of Bulldogs one of the top title candidates.

After a 2018-19 campaign with 33 wins and almost the second trip to the Final Four in program history, Gonzaga lost nearly everyone. Starting point guard Josh Perkins and key reserves Geno Crandall and Jeremy Jones all graduated. Rui Hachimura and Brandon Clarke both left a year early and were selected in the first round of the NBA draft. Zach Norvell Jr. left two years early but went undrafted.

That sextet was responsible for 79.2 percent of the team's scoring, as well as better than 78 percent of its assists, steals and blocks.

It's one thing to plug a few holes. It's another to build a new boat from scratch, especially in Spokane, Washington.

That's par for the course for Duke and Kentucky, but most teams can't withstand that much attrition and keep on trucking because most teams aren't in a position to sign an entire starting lineup of 5-star standouts every doggone year.

Take North Carolina, Virginia, Texas Tech and Tennessee, for example.

Each of those major-conference teams also lost three players as early entrants to the 2019 NBA draft following an outstanding season, and look at how woefully they've fallen short of expectations. Those teams were Nos. 9, 11, 13 and "28," respectively, in the preseason AP Top 25, but the only one comfortably in projected brackets at this point is Texas Tech. And even the Red Raiders—a No. 8 seed, per Bracket Matrix—are a far cry from the Big 12 title contender we were promised.

But Gonzaga?

The Bulldogs didn't even skip a beat and might be a bigger threat to win it all than they were as a No. 1 seed one year ago.

Young Kwak/Associated Press

Last season, Gonzaga led the nation at 87.6 points per game and had an average scoring margin of 22.7 points per game. The next-closest team in that latter category was Wofford at 16.7. Take it with a West Coast Conference grain of salt if you so choose, but it was still a ridiculous display of dominance on a nightly basis.

Now, lather, rinse and repeat.

Gonzaga is No. 1 in scoring at 88.5 points per game this year, and even undefeated San Diego State (plus-17.5 PPG) isn't a close first runner-up to the Zags' average scoring margin of 21.6 points.

Consider this: Gonzaga could lose its next game by 87 points, and it would still lead the nation in average scoring margin.

Saturday night's trip to Moraga to face Saint Mary's was supposed to be Gonzaga's stiffest competition since mid-December wins over Washington, Arizona and North Carolina. Instead, the Zags slaughtered the Gaels by 30 in a vivid reminder that this program has become a well-oiled juggernaut.

How has Few done it?

First of all, sophomore big man Filip Petrusev has become a star.

He was given a baptism by fire last year when forced into action as Killian Tillie missed the first two months of the season with an injury, but it wasn't until Clarke and Hachimura left this offseason that Petrusev became a prominent presence in the paint. Maybe that start to his freshman season helped or maybe he was always going to be a force once given the opportunity, but he is leading the Zags with 17.2 points and 7.9 rebounds per game.

Adding the right transfers to Petrusev's supporting cast was just as important.

Both Admon Gilder (Texas A&M) and Ryan Woolridge (North Texas) rank among the seven Bulldogs averaging better than 10 points per game, and they fit beautifully into a system in which everyone does a little bit of everything.

All seven—a list that also includes Tillie, Joel Ayayi, Drew Timme and Corey Kispert—snag three or more rebounds per game and average at least 2.0 assists and 1.0 steals per 40 minutes. Petrusev and Timme rarely venture out to the perimeter, but the other five each shoot better than 35 percent from deep and make more than one triple per game. They also all value the ball and strive to defend without fouling, ranking among the nation's top 10 in both turnover percentage on offense and free-throw rate on defense, per KenPom.com.

Just in the past 14 games, each of those seven players has tallied 20 or more points at least once.

It's unfathomable that we're still talking about a team that lost roughly 80 percent of its production from last season, but it's also little wonder that this team is 25-1 and has scored at least 83 points in 16 of its last 17 games.

How the heck are you supposed to slow down an offense with that many options?

Young Kwak/Associated Press

Aside from a couple of games against Oregon and Michigan in a dimly lit ballroom in the Bahamas during November, no one has been able to solve that riddle. You almost have to prepare for a game in the 80s—in part because Gonzaga is playing at a faster tempo than ever before under Few—and hope your offense can keep pace against a defense that has been good but not great.

Michigan, North Carolina and Arizona each reached 80 against Gonzaga. San Francisco got to 79 in the process of becoming the only team to put up a fight against the Zags in the past month. Even though the highly efficient offenses of BYU and Saint Mary's haven't come close thus far this season, it can clearly be done.

But like North Carolina in most years (not the current one, of course), it almost feels like Gonzaga is just baiting opponents into a trap: "Oh yeah, you can score against us. Let's run a track meet together. I'm sure it'll end well for you and that you totally won't commit more turnovers and take more rushed three-point attempts than usual."

Even better, the Zags will get to set that trap in their hometown for the first two rounds of the NCAA tournament.

The games in the Spokane pod won't actually be home games for Gonzaga. Instead of at McCarthey Athletic Center—better known as The Kennel—games will be about two miles down the road at Spokane Veterans Memorial Arena. But with the exception of Oregon, no other team in the projected field is located within 575 miles of Spokane. So, yeah, there's going to be a geographical advantage here.

Thanks to Saturday's Top 16 reveal, we also now know that Gonzaga—not San Diego State—is in the driver's seat for the top spot in the West Region, which is equally huge.

While Spokane isn't exactly walking distance from Los Angeles, getting to play the Sweet 16 and Elite Eight games there would be a heck of a lot better than being shipped some 2,000 miles east to potentially go through No. 4 seed Villanova and No. 2 seed Duke in New York City just to reach the Final Four.

Does that necessarily mean Gonzaga is finally going to win a national championship in its 23rd consecutive season with at least 23 wins?

Of course not.

But if the Zags can maintain their grip on that No. 1 seed in the West, they should have the easiest path to the Final Four and arguably deserve to be the odds-on favorite to win it all.

Kerry Miller covers men's college basketball and college football for Bleacher Report. You can follow him on Twitter, @kerrancejames.


Real Atmosphere Laboratory Measurements of the 118-GHz Oxygen Line: Shape, Shift, and Broadening of the Line.
For the first time the 118-GHz line of the oxygen molecule was investigated in the laboratory under a real atmosphere. The experiment was carried out by modern resonator spectroscopy methods on the laboratory air at atmospheric pressure. The shape of the line under the real atmosphere was found to fit the Van Vleck-Weisskopf profile within experimental accuracy. The air broadening parameter value was defined as 2.14+/-0.07 MHz/Torr. The observed atmosphere oxygen line central frequency was found to be shifted down at about 150 MHz from the line center measured at low pressures, which gives a value of -0.19+/-0.08 MHz/Torr for the air shift parameter. A comparison with previous investigations is presented and reprocessing of some experimental results of other authors was carried out. Results of reprocessing agree with the findings of the present paper. Copyright 2001 Academic Press.


//   Copyright 2012,2013 Vaughn Vernon
//
//   Licensed under the Apache License, Version 2.0 (the "License");
//   you may not use this file except in compliance with the License.
//   You may obtain a copy of the License at
//
//       http://www.apache.org/licenses/LICENSE-2.0
//
//   Unless required by applicable law or agreed to in writing, software
//   distributed under the License is distributed on an "AS IS" BASIS,
//   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
//   See the License for the specific language governing permissions and
//   limitations under the License.

package com.saasovation.collaboration.domain.model.calendar;

import java.util.Date;

import com.saasovation.collaboration.domain.model.tenant.Tenant;
import com.saasovation.common.domain.model.DomainEvent;

public class CalendarEntryRescheduled implements DomainEvent {

    private Alarm alarm;
    private CalendarEntryId calendarEntryId;
    private CalendarId calendarId;
    private int eventVersion;
    private Date occurredOn;
    private Repetition repetition;
    private Tenant tenant;
    private TimeSpan timeSpan;

    public CalendarEntryRescheduled(
            Tenant aTenant,
            CalendarId aCalendarId,
            CalendarEntryId aCalendarEntryId,
            TimeSpan aTimeSpan,
            Repetition aRepetition,
            Alarm anAlarm) {

        super();

        this.alarm = anAlarm;
        this.calendarEntryId = aCalendarEntryId;
        this.calendarId = aCalendarId;
        this.eventVersion = 1;
        this.occurredOn = new Date();
        this.repetition = aRepetition;
        this.tenant = aTenant;
        this.timeSpan = aTimeSpan;
    }

    public Alarm alarm() {
        return this.alarm;
    }

    public CalendarEntryId calendarEntryId() {
        return this.calendarEntryId;
    }

    public CalendarId calendarId() {
        return this.calendarId;
    }

    @Override
    public int eventVersion() {
        return this.eventVersion;
    }

    @Override
    public Date occurredOn() {
        return this.occurredOn;
    }

    public Repetition repetition() {
        return this.repetition;
    }

    public Tenant tenant() {
        return this.tenant;
    }

    public TimeSpan timeSpan() {
        return this.timeSpan;
    }
}


---
title: 比较 GUID 和 uniqueidentifier 值
description: 了解如何创建和比较 SQL Server 的 .NET Framework 数据提供程序中的 GUID 值，这些值由 uniqueidentifier 数据类型表示。
ms.date: 03/30/2017
dev_langs:
- csharp
- vb
ms.assetid: aababd75-2335-43e3-ace8-4b7ae84191a8
ms.openlocfilehash: 649093259747d045945c55e39edb1391708940cf
ms.sourcegitcommit: 5b475c1855b32cf78d2d1bbb4295e4c236f39464
ms.translationtype: MT
ms.contentlocale: zh-CN
ms.lasthandoff: 09/24/2020
ms.locfileid: "91173570"
---
# 比较 GUID 和 uniqueidentifier 值

SQL Server 中的全局唯一标识符 (GUID) 数据类型由 `uniqueidentifier` 数据类型表示，该数据类型存储 16 字节的二进制值。 GUID 是一个二进制数，它主要用作一个标识符，此标识符必须在一个在多个站点上具有多台计算机的网络中是惟一的。 可以通过调用 Transact-SQL NEWID 函数来生成 GUID，并保证其在全球是唯一的。 有关详细信息，请参阅 [uniqueidentifier (Transact-SQL)](/sql/t-sql/data-types/uniqueidentifier-transact-sql)。

## 使用 SqlGuid 值

 由于 GUID 值很长且不明确，因此它们对用户没有意义。 如果随机生成的 GUID 用于键值，并且插入大量的行，则会在索引中获得随机 I/O，这会对性能产生负面影响。 与其他数据类型相比，GUID 也相对较大。 通常，我们建议仅将 GUID 用于任何其他数据类型都不适合的极窄方案。

### 比较 GUID 值

 比较运算符可与 `uniqueidentifier` 值一起使用。 不过，排序不是通过比较两个值的位模式来实现的。 允许对值进行的唯一操作 `uniqueidentifier` 是比较 (=、 <>、 \<, > 、 \<=, > =) 和检查 NULL (为 null，并且不是 null) 。 不允许使用任何其他算术运算符。

 <xref:System.Guid> 和 <xref:System.Data.SqlTypes.SqlGuid> 都具有用于比较不同 GUID 值的 `CompareTo` 方法。 但 `System.Guid.CompareTo` 和 `SqlTypes.SqlGuid.CompareTo` 的实现方式不同。 <xref:System.Data.SqlTypes.SqlGuid> 使用 SQL Server 行为实现 `CompareTo`，一个值的最后 6 个字节是最重要的。 <xref:System.Guid> 计算全部 16 个字节。 下面的示例对这种行为差异进行了演示。 代码的第一部分显示未排序的 <xref:System.Guid> 值，第二部分显示已排序的 <xref:System.Guid> 值。 第三部分显示已排序的 <xref:System.Data.SqlTypes.SqlGuid> 值。 输出显示在代码清单下方。

 [!code-csharp[DataWorks SqlTypes.Guid#1](../../../../../samples/snippets/csharp/VS_Snippets_ADO.NET/DataWorks SqlTypes.Guid/CS/source.cs#1)]
 [!code-vb[DataWorks SqlTypes.Guid#1](../../../../../samples/snippets/visualbasic/VS_Snippets_ADO.NET/DataWorks SqlTypes.Guid/VB/source.vb#1)]

 此示例生成以下结果。

```output
Unsorted Guids:
3aaaaaaa-bbbb-cccc-dddd-2eeeeeeeeeee
2aaaaaaa-bbbb-cccc-dddd-1eeeeeeeeeee
1aaaaaaa-bbbb-cccc-dddd-3eeeeeeeeeee

Sorted Guids:
1aaaaaaa-bbbb-cccc-dddd-3eeeeeeeeeee
2aaaaaaa-bbbb-cccc-dddd-1eeeeeeeeeee
3aaaaaaa-bbbb-cccc-dddd-2eeeeeeeeeee

Sorted SqlGuids:
2aaaaaaa-bbbb-cccc-dddd-1eeeeeeeeeee
3aaaaaaa-bbbb-cccc-dddd-2eeeeeeeeeee
1aaaaaaa-bbbb-cccc-dddd-3eeeeeeeeeee
```

## 请参阅

- [SQL Server 数据类型和 ADO.NET](sql-server-data-types.md)
- [ADO.NET 概述](../ado-net-overview.md)


Join 3e Travel for a unique trekking adventure in the Prokletije Mountains, shared by Montenegro, Albania and Kosovo.

The Peaks of the Balkans Trail is in the wild mountainous region of the Western Balkans, until twenty years ago, almost inaccessible for visitors.

Experience an authentic cultural adventure while trekking in incredible mountain scenery in one of the most remote corners of Europe.

Following old shepherd paths and footways across the “Cursed Mountains”, the trail winds through high alpine mountains up to 2,300 metres above sea level. Hike through the green valleys to crystal-clear mountain lakes, waterfalls, rivers and remote picturesque mountain villages.

3e Adventure Travel have been organising cross border tours in this region since 2008. Experienced guides will give you an insight into the mountain culture in this hidden corner of Europe.

Group departures (min. 6 pax) running in June and September 2014. At other times this trek can be tailor made.

The Destination Stewardship award was won by Peaks of the Balkans – Municipality of Peja, Kosovo. This award is bestowed on organisations that have implemented a sustainable tourism programme at a destination level. This incorporates social, cultural, environmental and economic benefits, as well as engagement amongst multiple stakeholders.


Go ahead and use drones to track down criminals, to combat illegal immigration or for search-and-rescue missions. But to issue traffic citations?

No way, say Americans.

A recent Monmouth University poll showed there was overwhelming support for using unmanned aircraft in a variety of circumstances, but routine police work was not one of them.

Fewer than a quarter of the 1,708 adults surveyed last week said they would OK the use of drones to issue speeding tickets. Sixty-seven percent said they opposed the idea, and 10% had no opinion. The poll has a margin of error of plus or minus 2.4 percentage points (view a PDF here).

Compare that with the approval ratings for other drone applications: illegal immigration (64%), rescue missions (80%) and locating criminals (67%). The poll also indicates that 64% of Americans would be concerned about their privacy if U.S. law enforcement agencies began using drones with high-tech cameras.

Under the FAA Modernization and Reform Act, which President Barack Obama signed in February, the Federal Aviation Administration is charged with developing a plan ‚Äúfor the safe integration of civil unmanned aircraft systems into the national airspace system as soon as practicable, but not later than September 30, 2015.‚ÄĚ

The act is in response to the strict FAA regulations on drone use. It loosens those restrictions, allowing many government agencies to get swifter FAA permission to operate the unmanned aerial vehicles. It also allows any "government public safety agency to operate unmanned aircraft weighing 4.4 pounds or less," if certain criteria are met.

Drone uses vary greatly, according to an FAA document issued in March that outlines how drones will be used in six test ranges.

Not only can their objectives encompass everything from surveillance to searches to air quality testing, they can take many forms. Wingspans range from 6 inches to 240 feet. Weights run the gamut from 4 ounces to 16 tons.

"One thing they have in common is that their numbers and uses are growing dramatically. In the United States alone, approximately 50 companies, universities and government organizations are developing and producing some 155 unmanned aircraft designs,‚ÄĚ according to the FAA.

Outside the U.S., however, there has been widespread opposition to American reliance on drones to take out terrorists. A recent Pew Research Center poll showed that the U.S. was the only country among 20 surveyed that approved of using drones to kill extremist leaders in countries such as Pakistan, Yemen and Somalia.

‚ÄúMany drones are designed to carry surveillance equipment, including video cameras, thermal imagers, radar and wireless network ‚Äėsniffers,‚Äô ‚ÄĚ the representatives wrote. ‚ÄúThe surveillance power of drones is amplified when the information from on-board sensors is used in conjunction with facial recognition, behavior analysis, license plate recognition or any other system than can identify and track individuals as they go about their daily lives.‚ÄĚ

The congressmen closed by asking several questions. Among them: How does the FAA grant temporary licenses? Who has been certified in the past? Have any applications been denied, and if so, why? Is the public notified about where the drones are used? Who operates the drones? What data are collected? How does the FAA plan to make its drone use transparent?

The American Civil Liberties union also chimed in last year, saying that as drones become increasingly cheaper, law enforcement would ramp up its use of the technology, according to the December report, ‚ÄúProtecting Privacy From Aerial Surveillance: Recommendations for Government Use of Drone Aircraft.‚ÄĚ

If the FAA cannot ensure people‚Äôs privacy, Congress should take action, the report demanded.

‚ÄúThe deployment of drone technology domestically could easily lead to police fishing expeditions and invasive, all-encompassing surveillance that would seriously erode the privacy that we have always had as Americans,‚ÄĚ attorney Catherine Crump, one of the report‚Äôs co-authors, said.

In February, as the Senate considered HR 658 (the would-be FAA Modernization and Reform Act), the ACLU warned that Congress was trying to ‚Äúfast-track domestic drone use‚ÄĚ at the expense of Americans‚Äô privacy.

‚ÄúThis bill would push the nation willy-nilly toward an era of aerial surveillance without any steps to protect the traditional privacy that Americans have always enjoyed and expected," wrote senior policy analyst Jay Stanley.

‚ÄúWe don‚Äôt want to wonder, every time we step out our front door, whether some eye in the sky is watching our every move.‚ÄĚ

soundoff(863 Responses)

De

I want to see the cost benefit analysis where this is profitable (including operating costs, training pilot & mech., upkeep, as well as the cost for damages/loss of life if one happens to crash...), and at what point does this become invasion of privacy since it has a camera that is able to zoom in on license plates, and is just as capable of looking into peoples homes/residences. Their are already cameras at lights and intersections at what point does this become "to much". Seriously. Use it to patrol the borders and sea's to keep drug smuggling out and care a little less about some one that is for the most part an upstanding who decides to go crazy and go 5mph over the limit. Give me a break. Find a better use for 4million dollars, like education.

About This Blog

This blog ‚Äď This Just In ‚Äď will no longer be updated. Looking for the freshest news from CNN? Go to our ever-popular CNN.com homepage on your desktop or your mobile device, and join the party at @cnnbrk, the world's most-followed account for news.


Q:

How can I create a hide on scroll down and show on scroll up menu whitout jquery or other dependencies

I am working on a website that needs to be fast and light.
I used this script before on other websites but with jquery library.
For this specific website I need to run very fast since most of the users have  low mobile internet speed.
For this reason I want just plain javascript to do this task.
I'm not very familiar with javascript so I need some help that's why I'm asking for.
Can anyone help me whit this please?
Thank you,
John

// Hide Header on on scroll down
var didScroll;
var lastScrollTop = 0;
var delta = 5;
var navbarHeight = $('header').outerHeight();

$(window).scroll(function(event){
    didScroll = true;
});

setInterval(function() {
    if (didScroll) {
        hasScrolled();
        didScroll = false;
    }
}, 250);

function hasScrolled() {
    var st = $(this).scrollTop();

    // Make sure they scroll more than delta
    if(Math.abs(lastScrollTop - st) <= delta)
        return;

    // If they scrolled down and are past the navbar, add class .nav-up.
    // This is necessary so you never see what is "behind" the navbar.
    if (st > lastScrollTop && st > navbarHeight){
        // Scroll Down
        $('header').removeClass('nav-down').addClass('nav-up');
    } else {
        // Scroll Up
        if(st + $(window).height() < $(document).height()) {
            $('header').removeClass('nav-up').addClass('nav-down');
        }
    }

    lastScrollTop = st;
}
body {
    padding-top: 40px;
}

header {
    background: #f5b335;
    height: 40px;
    position: fixed;
    top: 0;
    transition: top 0.2s ease-in-out;
    width: 100%;
}

.nav-up {
    top: -40px;
}

main {
   background:url(
data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAAPklEQVQYV2O8dOnSfwYg0NPTYwTRuAAj0QqxmYBNM1briFaIzRbi3UiRZ75uNgUHGbfvabgfsHqGaIXYPAMAD8wgC/DOrZ4AAAAASUVORK5CYII=
   ) repeat;
    height: 2000px;
}

footer { background: #ddd;}
* { color: transparent}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<header class="nav-down">
    This is your menu.
</header>
<main>
    This is your body.
</main>
<footer>
    This is your footer.
</footer>

A:

You can use this:
var mousewheelevt = (/Firefox/i.test(navigator.userAgent)) ? "DOMMouseScroll" : "mousewheel" //FF doesn't recognize mousewheel as of FF3.x
window.addEventListener(mousewheelevt, function(e){

var evt = window.event || e //equalize event object
evt = evt.originalEvent ? evt.originalEvent : evt; //convert to  originalEvent if possible
var delta = evt.detail ? evt.detail*(-40) : evt.wheelDelta //check for detail first, because it is used by Opera and FF

  if(delta > 0) {
    document.getElementById('menu').style.display = "block";
  }
  else{
    if(window.pageYOffset > 250)
       document.getElementById('menu').style.display = "none";
  }
});


@import "bootstrap.min.css";
@import "hint.css";
@import "animate.css";
@import "sweetalert.css";

body {
  /*background-color: #f4f5f7;*/
  background-color: #e8e8e8;
  font-size: 13px;
  font-family: "Open Sans", "Helvetica Neue", Helvetica, Arial, sans-serif;
  text-rendering: optimizeLegibility;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  overflow-x: hidden;
}

a {
  color: #1d7cf4;
}

main {
  padding-bottom: 20px;
}

ol, ul {
  margin-bottom: 0;
}

h1, h2, h3, h4, h5, h6 {
  font-family: "Raleway", "Helvetica Neue", Helvetica, Arial, sans-serif;
  font-weight: 300;
}

h3 {
  font-size: 32px;
  line-height: 40px;
  margin-bottom: 40px;
}

h6 {
  font-family: "Raleway", "Helvetica Neue", Helvetica, Arial, sans-serif;
  font-size: 12px;
  line-height: 34px;
  text-transform: uppercase;
  letter-spacing: 2px;
  font-weight: 700;
}

hr {
  border: none;
  border-top: 1px solid #ccc;
  margin: 0 0 24px 0;
  width: 100%;
}

.sweet-alert h2 {
  color: #333;
}
.sweet-alert p {
  font-size: 13px;
}

.placeholder {
  white-space: pre-wrap;
}

/* Should stay above connected dots canvas so that links could be clicked */
.hero-container {
  position: relative;
}

.carbon-ads-blocked {
  margin-bottom: 20px;
}

.carbon-ads-blocked .fa {
  vertical-align: sub;
}

.text-normal {
  color: #333;
}

.text-danger {
  color: #db2828;
}

.footnote {
  position: absolute;
  bottom: 0;
}

.footnote.left {
  left: 15px;
}

.footnote.right {
  right: 15px;
}

.footnote a {
  color: #fff;
}

.footnote .time-ago {
  display: inline-block;
}

.hero {
  position: relative;
  padding: 0;
  padding-bottom: 20px;
  color: rgba(255, 255, 255, .7);
  overflow: hidden;
  text-align: center;
  text-shadow: 0 1px 0 rgba(0, 0, 0, .1);
  /*background: #6f5499 linear-gradient(135deg, #271b38, #563d7c, #7952b3);*/
  background: url('https://megaboilerplate.blob.core.windows.net/megaboilerplate/img/hero-bg.jpg') 0 50%, linear-gradient(224deg, #2B8BE3 0%, #663FB5 100%);
  background-size: cover;
  /*background-position: 0;*/
  box-shadow: inset 0 0 50px rgba(0, 0, 0, 0.45);
}

.hero .highlight {
  background-color: transparent;
  color: #fff;
  font-weight: 600;
}

.hero .lead a {
  color: rgba(255, 255, 255, .7);
  transition: .2s all;
}

.hero .lead a:hover {
  text-decoration: none;
  color: #fff;
}

.hero .btn {
  font-size: 13px;
  color: rgba(255, 255, 255, 0.6);
  background-color: transparent;
  letter-spacing: .1rem;
  border-radius: 4px;
  text-transform: uppercase;
  font-weight: bold;
  text-shadow: none;
  border: 2px solid rgba(255, 255, 255, 0.6);
  padding: 10px 18px;
}

.hero .btn .fa {
  font-size: 150%;
  vertical-align: middle;
}

.btn-outline:hover {
  color: #6c59b4 !important;
  background-color: #fff;
  text-shadow: none;
}

.hero h1 {
  margin-top: 0;
  color: #fff;
}

.hero-arrow {
  width: 47px;
  height: 32px;
  vertical-align: baseline;
  margin-right: 2px;
  margin-left: 280px;
}

.hero-logo {
  text-align: center;
  height: 75px;
  margin-top: 5px;
  margin-bottom: 5px;
}

label span + i {
  color: #4F8EF7;
  margin-left: 4px;
  cursor: help;
}

.help {
  cursor: help;
}

.bd-booticon {
  display: block;
  width: 9rem;
  height: 9rem;
  font-size: 6.5rem;
  line-height: 9rem;
  color: #fff;
  text-align: center;
  cursor: default;
  background-color: #563d7c;
  border-radius: 15%;
}

.bd-booticon.outline {
  background-color: transparent;
  border: 1px solid #cdbfe3;
}

.hero .bd-booticon {
  margin: 0 auto 2rem;
  color: #cdbfe3;
  border-color: #cdbfe3;
}

/*Carbon Ads*/
.carbon-container,
#carbonads {
  max-width: 320px;
  height: 120px;
  background-color: rgba(0, 0, 0, 0.25);
  padding: 10px;
  box-shadow: inset 0 2px 2px rgba(0, 0, 0, 0.05);
  border-radius: 4px;
  margin: 20px auto 20px;
  animation: 0.5s 0.2s zoomIn backwards;
}

.carbon-container {
  height: inherit;
}

.carbon-img {
  float: left;
  margin-right: 15px;
}

.carbon-text {
  display: block;
  font-size: 12px;
  line-height: 1.5;
  color: #fff !important;
  text-shadow: 0 1px 4px rgba(0, 0, 0, 0.25), 0 0 1px rgba(0, 0, 0, 0.5);
  text-decoration: none !important;
}

.carbon-poweredby {
  font-size: 75%;
  color: rgba(255, 255, 255, 0.85) !important;
  text-decoration: none !important;
  text-shadow: 0 1px 4px rgba(0, 0, 0, 0.25), 0 0 1px rgba(0, 0, 0, 0.5);
}

/*Navbar*/
.navbar {
  margin-bottom: 0;
  border: 0;
  border-radius: 0;
}

i.arrow {
  position: absolute;
  font-size: 24px;
  line-height: 13px;
  margin-top: -1px;
}

.navbar-default .navbar-brand {
  font-family: "Raleway", "Helvetica Neue", Helvetica, Arial, sans-serif;
  font-weight: 300;
  color: rgba(255, 255, 255, .7);
  padding: 10px 15px;
  transition: color .2s;
}

.navbar-default .navbar-brand:hover,
.navbar-default .navbar-brand:focus {
  color: #fff;
}

.navbar-brand svg {
  vertical-align: middle;
  fill: rgba(255, 255, 255, .7);
  transition: fill .2s;
}

.navbar-brand > span {
  margin-left: 10px;
}

.navbar-brand:hover svg {
  fill: rgba(255, 255, 255, 1);
}

.navbar-default {
  background-color: transparent;
}

.navbar-inverse {
  background: #6f5499 linear-gradient(135deg, #271b38, #563d7c, #7952b3);
}

.navbar-default .navbar-nav > li > a,
.navbar-inverse .navbar-nav > li > a {
  font-family: "Raleway", "Helvetica Neue", Helvetica, Arial, sans-serif;
  color: rgba(255, 255, 255, .7);
  font-size: 11px;
  text-transform: uppercase;
  font-weight: 600;
  letter-spacing: 1px;
  border-bottom: 1px solid transparent;
  margin-bottom: -1px;
  transition: .2s all;
}

.navbar-default .navbar-nav > li > a:hover,
.navbar-default .navbar-nav > li > a:focus {
  color: #fff;
  /*border-bottom: 1px solid #fff;*/
  /*margin-bottom: -1px;*/
}

/*.navbar-default .navbar-nav > li:not(:last-child) {*/
/*border-right: 1px solid rgba(255, 255, 255, .2);*/
/*}*/

.navbar-icon {
  font-size: 32px !important;
  line-height: 32px !important;
  padding-top: 10px !important;
  padding-bottom: 0 !important;
  padding-left: 0 !important
}

/** Labels **/
.label {
  padding: .15em .6em .2em;
  font-size: 12px;
  /*font-family: "Raleway", "Helvetica Neue", Helvetica, Arial, sans-serif;*/
  /*text-transform: uppercase;*/
  /*font-weight: 700;*/
  /*letter-spacing: 1px;*/
  /*border-radius: 0;*/
  /*font-size: 10px;*/
}

.label-danger {
  background-color: #db2828;
}

.form-control[readonly] {
  background-color: #fff;
}

/*Radios*/
.radio input[type="radio"]:focus + label::before {
  outline: none;
}

/*Buttons*/
button {
  outline: 0 !important;
}

.btn {
  position: relative;
  font-size: 13px;
  border-radius: 2px;
  transition: all 0.3s ease;
}

.btn:active, .btn.active {
  box-shadow: none;
  top: 1px;
}

.input-group-btn .btn {
  padding: 7px 12px;
}

.btn-default {
  color: #333;
  background-color: #fcfcfc;
}

.input-group-btn button {
  outline: 0 !important;
}

.input-group-btn .btn-default:focus {
  /*background-color: #fcfcfc;*/
  border-color: #ccc;
}

.clipboard {
  margin-top: -5px;
  position: relative;
}

.btn-group > .btn {
  /*background-color: #f5f5f5;*/
  font-family: "Raleway", "Helvetica Neue", Helvetica, Arial, sans-serif;
  font-size: 12px;
  line-height: 24px;
  border-radius: 2px;
  text-transform: uppercase;
  letter-spacing: 1px;
  font-weight: 700;
}

.btn-group > .btn.active {
  color: #fff;
  background-color: #47b475;
}

.btn-success {
  border-color: #47b475;
  background-color: #47b475;
}

.btn-primary {
  border-color: #1d7cf4;
  background-color: #1d7cf4;
}

.btn-mega {
  position: relative;
  height: 50px;
  line-height: 48px;
  border: 2px solid transparent;
  color: #fff;
  font-size: 11px;
  text-transform: uppercase;
  font-weight: bold;
  letter-spacing: 1px;
  border-radius: 2px;
  padding: 0;
  margin-bottom: 10px;
  box-shadow: 0 2px 6px 0 rgba(0, 0, 0, .2);
  outline: 0 !important;
  transition: all .35s cubic-bezier(.25, .25, .315, 1.35);
}

.btn-mega:active {
  top: 1px;
}

.btn-mega.btn-success:hover,
.btn-mega.btn-success:focus {
  border-color: #41a46b;
  background: #41a46b;
  color: #fff;
}

.btn-mega.btn-primary:hover,
.btn-mega.btn-primary:focus {
  border-color: #0a64d6;
  background: #0a64d6;
  color: #fff;
}

.btn-mega svg {
  margin-top: 8px;
}

/*CSS Logos*/
/*.express-logo {*/
/*display: block;*/
/*font-size: 32px;*/
/*font-weight: 100;*/
/*font-family: "Helvetica Neue", "Raleway", Helvetica, Arial, sans-serif;*/
/*line-height: 50px;*/
/*letter-spacing: 1px;*/
/*-webkit-font-smoothing: initial;*/
/*}*/

.btn-logo {
  max-height: 50px;
  max-width: 140px;
  display: block;
  padding-bottom: 10px;
  margin: 0 auto;
}

.btn-logo.disabled {
  opacity: 0.4;
}

.btn-logo.express {
  padding-bottom: 2px;
}

.btn-logo.small {
  height: 40px;
  padding-bottom: 5px;
}

.radio-group {
  margin-top: 15px;
  margin-bottom: 15px;
}

.radio > label,
.checkbox-inline,
.radio-inline {
  text-align: center;
  line-height: 22px;
  border-radius: 0;
  vertical-align: baseline;
}

.radio-inline .label,
.checkbox-inline .label {
  position: absolute;
  left: 0;
  /*margin-left: 30px;*/
  margin-top: 2px;
}

.checkbox-inline+.checkbox-inline,
.radio-inline+.radio-inline {
    margin-left: 0px;
    margin-bottom: 30px;
}

.checkbox-inline {
  margin-top: 10px;
  margin-bottom: 10px;
}

.checkbox label, .radio label {
  padding-left: 0;
}

section {
  /*padding-top: 50px;*/
  padding-bottom: 10px;
}

.subcategory {
  font-weight: 400;
  letter-spacing: 2px;
  text-transform: uppercase;
  line-height: 24px;
  margin-top: 24px;
  margin-bottom: 24px;
}

.info-icon {
  height: 18px;
  vertical-align: text-bottom;
  margin-right: 4px;
}

.category-icon {
  height: 16px;
  margin-right: 8px;
}

.category-panel {
  cursor: pointer;
  text-align: center;
  transition: .2s all;
}

.category-panel img {
  margin-bottom: 10px;
}

.category-panel:hover {
  color: #fff;
  background-color: #47b475;
}

.category-panel.active {
  color: #fff;
  background-color: #47b475;
}

.separator {
  border-left: 1px solid #ddd;
  border-right: 1px solid #ddd;
}

.next-steps-icon {
  position: relative;
  width: 80px;
  height: auto;
  margin-bottom: 10px;
  transition: all 0.3s;
}

[class^="col-"]:hover .next-steps-icon {
  transform: translateY(-10px);
}

/*Footer*/

footer {
  padding: 20px 0;
  position: relative;
  overflow: hidden;
  /*line-height: 24px;*/
}

/*Slideshow*/
.slick-slide img {
  display: inline-block;
}

.slick-slider {
  margin-top: 10px;
  margin-bottom: 10px;
}

.nav-stacked {
  margin-top: 20px;
}

.nav-stacked > li + li {
  margin-top: 0;
}

.nav-stacked > li > a {
  padding: 0;
  color: #333;
}

a > i[class^="fa"] {
  margin-right: 5px;
}

.nav-stacked > li a > span + i {
  margin-left: 5px;
}

.panel-collapse {
  padding: 0 20px;
}

.nav-stacked > li > a:hover,
.nav-stacked > li > a:focus {
  background-color: transparent;
}

/*Connected Dots*/
canvas {
  position: absolute;
  width: 100%;
  height: 100%;
  top: 0;
  right: 0;
  bottom: 0;
  left: 0;
}

.facebook-like-button {
  margin-left: 5px;
  padding-top: 15px;
  padding-bottom: 15px;
}

.facebook-share-button {
  margin-left: 5px;
  margin-right: 5px;
  padding-top: 15px;
  padding-bottom: 15px;
}

.plusone-button,
.linkedin-button,
.tweet-button {
  padding-top: 15px;
  padding-bottom: 15px;
  height: 50px;
}

.twitter-share-button {
  padding: 0 !important;
}

/* ANimated stack */
.wrapper {
  width: 320px;
  height: 210px;
  margin: 0 auto;
}

.wrapper:hover .upper {
  top: -3em;
}

.wrapper:hover .lower {
  top: 3em;
}

.box, .upper, .middle, .lower {
  padding: 15px;
  margin: 0 auto;
  left: 0;
  right: 0;
  top: 0;
  bottom: 0;
  margin-top: -35px;
  height: 290px;
  width: 275px;
  position: absolute;
  background: #cfd9db;
  z-index: 50;
  border-radius: 15px;
  transform: rotate(-25deg) scale(0.5) skew(45deg);
  box-shadow: -5px 5px 10px rgba(51, 51, 51, .8);
  transition: all 0.25s ease;
}

.upper {
  top: -2em;
  z-index: 60;
  background-color: #617d8c;
  background-image: linear-gradient(to top, #ffffff, #d9d9d9);
  border-color: #d6d6d6;
}

.upper:hover {
  left: 2em;
  cursor: pointer;
}

.middle {
  background-color: #1ad28f;
  background-image: linear-gradient(to top, #1ad28f, #128e61);
  border-color: #11895e;
}

.middle:hover {
  left: 2em;
  cursor: pointer;
}

.lower {
  top: 2em;
  z-index: 45;
  background-color: #28ace2;
  background-image: linear-gradient(to top, #28ace2, #177da7);
  border-color: #167aa2;
}

.lower:hover {
  left: 2em;
  cursor: pointer;
}

/*Paper stacks*/
.paper-container {
  top: -70px;
  margin: 0 auto;
  margin-bottom: 90px;
  position: relative;
  width: 75px;
  height: 75px;
}

.paper {
  display: block;
  width: 90px;
  height: 90px;
  position: absolute;
  top: -120px;
  border-radius: 8px;
  -webkit-transform: rotate(-28deg) skewX(48deg);
  transform: rotate(-28deg) skewX(48deg);
  box-shadow: -12px 8px 20px 0px rgba(0, 0, 0, 0.4);
  border-bottom: 5px solid #031f63;
  border-left: 7px solid #031f63;
  opacity: 0;
  -webkit-transition: all 400ms ease;
  transition: all 400ms ease;
}

.paper.stacked {
  opacity: 1;
}

.paper-bottom {
  background-color: #28ace2;
  background-image: -webkit-linear-gradient(bottom, #28ace2, #177da7);
  background-image: linear-gradient(to top, #28ace2, #177da7);
  border-color: #167aa2;
}

.paper-bottom.stacked {
  top: 140px;
}

.paper-middle {
  background-color: #1ad28f;
  background-image: -webkit-linear-gradient(bottom, #1ad28f, #128e61);
  background-image: linear-gradient(to top, #1ad28f, #128e61);
  border-color: #11895e;
}

.paper-middle.stacked {
  top: 110px;
}

.paper-top {
  background-image: -webkit-linear-gradient(bottom, #ffffff, #d9d9d9);
  background-image: linear-gradient(to top, #ffffff, #d9d9d9);
  border-color: #d6d6d6;
}

.paper-top.stacked {
  top: 80px;
}

/*.tooltip-inner {*/
/*max-width: 300px;*/
/*width: 300px;*/
/*}*/

/*Headings Styles*/

.electron-logo {
  color: #74b1be;
}

.electron-logo:hover {
  color: #9feaf9;
}

.svg-stroke {
  stroke: currentColor;
  stroke-width: 1.2;
  stroke-linecap: round;
}

.svg-fill {
  fill: currentColor;
}

.node .panel-heading {
  background: #83cd29;
  border-color: #83cd29;
}

.python .panel-heading {
  background: #ffd344;
  border-color: transparent;
}

.html5 .panel-heading {
  color: #fff;
  background: #e64c18;
  border-color: transparent;
}

.electron .panel-heading {
  color: #74b1be;
  background:#2f3241;
  border-color: transparent;
}

.electron .panel-heading svg {
  color: #74b1be;
  fill: currentColor;
}

.jekyll .panel-heading {
  color: #ddd;
  background: #333;
  border-color: transparent;
}

.jekyll svg {
  color: #ddd;
  fill: currentColor;
}

.middleman .panel-heading {
  color: #4c515f;
  background: #f3c859;
  border-color: transparent;
}

.middleman svg {
  color: #4c515f;
  fill: currentColor;
}

.metalsmith .panel-heading {
  color: #4c515f;
  background: #ededed;
  border-color: transparent;
}

.metalsmith svg {
  color: #4c515f;
  fill: currentColor;
}

.library .panel-heading {
  color: #fff;
  background: #6464E2;
  border-color: transparent;
}

.library .panel-heading svg {
  color: #fff;
  fill: currentColor;
}

.express .panel-heading {
  color: #fff;
  background: #000;
  border-color: transparent;
}

.express svg {
  color: #fff;
  fill: currentColor;
}

.sails .panel-heading {
  color: #fff;
  background: #41bac2 linear-gradient(135deg, #41bac2 0, #0b8fa2 100%);
  border-color: transparent;
}

.sails svg {
  color: #fff;
  fill: currentColor;
}

.meteor .panel-heading {
  color: #fff;
  background: #de4f4f;
  border-color: transparent;
}

.meteor svg {
  color: #fff;
  fill: currentColor;
}

.handlebars .panel-heading {
  color: #fff;
  background: #f7931e radial-gradient(at top center, #f7931e, #f15a24 750px);
  border-color: transparent;
}

.handlebars svg {
  color: #fff;
  fill: currentColor;
}

.jade .panel-heading {
  color: #fff;
  background: #448B6F;
  border-color: transparent;
}

.jade svg {
  color: #fff;
  fill: currentColor;
}

.nunjucks .panel-heading {
  color: #fff;
  background: #1e4514;
  border-color: transparent;
}

.nunjucks svg {
  color: #fff;
  fill: currentColor;
}

.bootstrap .panel-heading {
  color: #fff;
  background: #6f5499 linear-gradient(135deg, #271b38, #563d7c, #7952b3);
  border-color: transparent;
}

.bootstrap svg {
  color: #fff;
  fill: currentColor;
}

.foundation .panel-heading {
  color: #fff;
  background: #777;
  border-color: transparent;
}

.foundation svg {
  color: #fff;
  fill: currentColor;
}

.bourbonNeat .panel-heading {
  color: #fff;
  background: #53aee0 linear-gradient(#53aee0, #3da4dc);
  border-color: transparent;
}

.bourbonNeat svg {
  color: #fff;
  fill: currentColor;
}

.sass .panel-heading {
  color: #fff;
  background: #c6538c;
  border-color: transparent;
}

.sass svg {
  color: #fff;
  fill: currentColor;
}

.less .panel-heading {
  color: #fff;
  background: #1d365d;
  border-color: transparent;
}

.less svg {
  color: #fff;
  fill: currentColor;
}

.postcss .panel-heading {
  color: #fff;
  background: #dd3735;
  border-color: transparent;
}

.postcss svg {
  color: #fff;
  fill: currentColor;
}

.stylus .panel-heading {
  color: #fff;
  background: #ff6347;
  border-color: transparent;
}

.stylus svg {
  color: #fff;
  fill: currentColor;
}

.cssnext .panel-heading {
  color: #fff;
  background: linear-gradient(160deg, rgba(115, 64, 196, .9), rgba(49, 142, 223, .9));
  border-color: transparent;
}

.cssnext svg {
  color: #fff;
  fill: currentColor;
}

.mongodb .panel-heading {
  color: #fff;
  background: #69b241;
  border-color: transparent;
}

.mongodb svg {
  color: #fff;
  fill: currentColor;
}

.sqlite .panel-heading {
  color: #fff;
  background: #0f80cc;
  border-color: transparent;
}

.sqlite svg {
  color: #fff;
  fill: currentColor;
}

.mysql .panel-heading {
  color: #fff;
  background: #f59620;
  border-color: transparent;
}

.mysql svg {
  color: #fff;
  fill: currentColor;
}

.postgresql .panel-heading {
  color: #fff;
  background: #0085b0;
  border-color: transparent;
}

.postgresql svg {
  color: #fff;
  fill: currentColor;
}

.react .panel-heading {
  color: #61dafb;
  background: #2d2d2d;
  border-color: transparent;
}

.react svg {
  color: #61dafb;
  fill: currentColor;
}

.angular .panel-heading {
  color: #fff;
  background: #1976d2;
  border-color: transparent;
}

.angular svg {
  color: #fff;
  fill: currentColor;
}

.angularjs .panel-heading {
  color: #fff;
  background: #1976d2;
  border-color: transparent;
}

.angularjs svg {
  color: #fff;
  fill: currentColor;
}

.polymer .panel-heading {
  color: #fff;
  background: #3f51b5;
  border-color: transparent;
}

.polymer svg {
  color: #fff;
  fill: currentColor;
}

.vue .panel-heading {
  color: #fff;
  background: #42b983;
  border-color: transparent;
}

.vue svg {
  color: #fff;
  fill: currentColor;
}

.authentication .panel-heading {
  color: #fff;
  background: #1f1c2c linear-gradient(to left, #1f1c2c, #928dab);
  border-color: transparent;
}

.authentication svg {
  color: #fff;
  fill: currentColor;
}

.heroku .panel-heading {
  color: #fff;
  background: #430098;
  border-color: transparent;
}

.heroku svg {
  color: #fff;
  fill: currentColor;
}

.azure .panel-heading {
  color: #fff;
  background: #00adef;
  border-color: transparent;
}

.azure svg {
  color: #fff;
  fill: currentColor;
}

.gulp .panel-heading {
  color: #fff;
  background: #cf4646;
  border-color: transparent;
}

.gulp svg {
  color: #fff;
  fill: currentColor;
}

.webpack .panel-heading {
  background: #7ea9e8;
  border-color: transparent;
}

.webpack svg {
  fill: currentColor;
}

.npm .panel-heading {
  color: #fff;
  background: #cb3837;
  border-color: transparent;
}

.npm svg {
  color: #fff;
  fill: currentColor;
}

.jasmine .panel-heading {
  color: #fff;
  background: #8a4182;
  border-color: transparent;
}

.jasmine svg {
  color: #fff;
  fill: currentColor;
}

.mocha .panel-heading {
  color: #fff;
  background: #a07a5c;
  border-color: transparent;
}

.mocha svg {
  color: #fff;
  fill: currentColor;
}

.digitalOcean .panel-heading {
  color: #fff;
  background: #288feb;
  border-color: transparent;
}

.digitalOcean svg {
  color: #fff;
  fill: currentColor;
}

.icon {
  display: inline-block;
  position: relative;
  top: -0.0625em;
  fill: currentColor;
  height: 1em;
  width: 1em;
  vertical-align: middle;
}

.panel {
  position: relative;
  margin-bottom: 20px;
  background-color: #fff;
  /*border: 1px solid #ddd;*/
  border-radius: 3px;
  /*box-shadow: 0 1px 1px rgba(0, 0, 0, .05);*/
  box-shadow: 0 4px 8px rgba(0, 0, 0, .125);

  /*border: 0;*/
  /*border-radius: 5px;*/
  /*box-shadow: 0 0px 8px 0 rgba(0, 0, 0, 0.06), 0 1px 0px 0 rgba(0, 0, 0, 0.02);*/
  transition: box-shadow .15s linear;
}

.panel:hover {
  box-shadow: 0 5px 10px rgba(0, 0, 0, .175);
  /*box-shadow: 0 10px 20px rgba(0, 0, 0, 0.15);*/
}

.panel-heading {
  padding: 0 15px;
  border-bottom: 1px solid #ddd;
  margin: -1px -1px 0;
}

.panel-heading h6 {
  display: inline-block;
  margin-top: 0;
  margin-bottom: 0;
}

.panel-body h4 {
  margin-top: 0;
}

.panel-heading h6 svg {
  margin-right: 6px;
  /*vertical-align: sub;*/
  vertical-align: middle;
}

/*Semantic UI starts*/

.ui.header > .image + .content, .ui.header > img + .content {
  display: inline-block;
  padding-left: 10px;
  font-size: 15px;
  font-weight: bold;
  vertical-align: middle;
  line-height: 19px;
}

.ui.basic.table td {
  vertical-align: middle;
}

.ui.table tr.active, .ui.table td.active {
  background: #f8ffff !important;
}

h3.ui.header, h4.ui.header {
  margin: 0;
}

h3.ui.header .sub.header, h4.ui.header .sub.header {
  font-size: 14px;
  display: block;
  font-weight: 400;
  padding: 0;
  margin: 0;
  line-height: 1.2em;
  color: rgba(0, 0, 0, .6);
}

.ui.mini.image, .ui.mini.images .image, .ui.mini.images img, .ui.mini.images svg {
  max-width: 35px !important;
  height: 35px;
}

.ui.table td {
  padding: 10px;
  text-align: inherit;
}

/*Semantic UI ends*/

.panel-body {
  /*padding-bottom: 0;*/
}

/*.panel-body .fa {*/
  /*margin-right: 5px;*/
/*}*/

strong .fa {
  font-weight: bold;
}

.transparent {
  opacity: 0;
}

.options {
  cursor: pointer;
  user-select: none;
}

.options span {
  background-image: linear-gradient(to bottom, rgba(0, 0, 0, 0) 50%, rgba(0, 0, 0, 0.6) 50%);
  background-repeat: repeat-x;
  background-size: 2px 2px;
  background-position: 0 16px;
}

.options span:hover {
  color: rgb(29, 124, 244);
  background-image: linear-gradient(to bottom, rgba(29, 124, 244, 0) 50%, rgba(29, 124, 244, 0.6) 50%);
}

.options img {
  margin-right: 5px;
  vertical-align: sub;
}

.options img.animated {
  animation-name: spin;
  animation-duration: 4000ms;
  animation-iteration-count: infinite;
  animation-timing-function: linear;
}

.options img.animated.fast {
  animation-duration: 1000ms;
}

@-webkit-keyframes spin {
  from {
    transform: rotate(0deg);
  }
  to {
    transform: rotate(360deg);
  }
}

@keyframes spin {
  from {
    transform: rotate(0deg);
  }
  to {
    transform: rotate(360deg);
  }
}

/*Checkbox*/
input[type=checkbox] {
  opacity: 0;
  position: absolute;
  z-index: 12;
  width: 18px;
  height: 18px;
}

input[type=checkbox]:checked,
input[type=checkbox]:focus {
  outline: none !important;
}

input[type=checkbox] + span {
  position: relative;
  z-index: 11;
  display: inline-block;
  margin: 0;
  line-height: 20px;
  min-height: 14px;
  min-width: 14px;
  font-weight: normal;
}

input[type=checkbox] + span::before {
  font-family: fontAwesome;
  font-weight: normal;
  font-size: 11px;
  color: transparent;
  content: '\f00c';
  background-color: #eff1f3;
  border: 2px solid #c2c7d0;
  box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
  border-radius: 0;
  display: inline-block;
  text-align: center;
  vertical-align: middle;
  height: 18px;
  line-height: 16px;
  min-width: 18px;
  margin-right: 0.75em;
  margin-top: -5px;
  transition: all .1s ease-out;
  /*border-radius: 50%;*/
}

input[type=checkbox]:checked + span::before {
  transition: all .1s ease-out;
  display: inline-block;
  content: '\f00c';
  color: #fff;
  border-color: #398e5c;
  background-color: #47b475;
  box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05), inset 0px -15px 10px -12px rgba(0, 0, 0, 0.05), inset 15px 10px -12px rgba(255, 255, 255, 0.1);
}

.locked input[type=checkbox]:checked + span::before {
  border-color: #0a64d6;
  background-color: #1d7cf4;
}

input[type=checkbox]:hover:not(:checked) + span::before,
input[type=checkbox]:not(:checked) + span:hover::before {
  border-color: #398e5c;
}

input[type=checkbox]:active + span::before,
input[type=checkbox]:checked:active + span::before {
  box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05), inset 0px 1px 3px rgba(0, 0, 0, 0.1);
}

input[type=checkbox]:disabled + span::before,
input[type=checkbox][disabled] + span::before,
input[type=checkbox].disabled + span::before {
  background-color: #DDD !important;
  border-color: #CCC !important;
  box-shadow: none !important;
  color: #BBB;
}

/*Radio*/
.radio-inline span > img {
  margin-top: -3px;
}

[type="radio"] {
  border: 0;
  clip: rect(0 0 0 0);
  height: 1px;
  margin: -1px;
  overflow: hidden;
  padding: 0;
  position: absolute;
  width: 1px;
}

/* One radio button per line */

/*[type="radio"] + span {*/
/*display: block;*/
/*}*/

/* the basic, unchecked style */
[type="radio"] + span:before {
  content: '';
  display: inline-block;
  width: 13px;
  height: 13px;
  vertical-align: -0.25em;
  border-radius: 1em;
  border: 2px solid #fff;
  box-shadow: 0 0 0 0.125em rgba(0, 0, 0, 0.54);
  margin-right: 0.75em;
  transition: all .2s ease-out;
}

[type="radio"]:hover + span:before {
  box-shadow: 0 0 0 0.125em rgb(29, 124, 244);
}

[type="radio"]:active + span:before {
  box-shadow: 0 0 0 0.125em #1d7cf4;
  background: #1d7cf4;
}

/* the checked style using the :checked pseudo class */
[type="radio"]:checked + span:before {
  background: #000;
  box-shadow: 0 0 0 0.125em #000;
}

.featuring {
  margin-bottom: 10px;
}

.typed-cursor {
  opacity: 1;
  animation: blink 0.7s infinite;
}

@keyframes blink {
  0% {
    opacity: 1;
  }
  50% {
    opacity: 0;
  }
  100% {
    opacity: 1;
  }
}

@keyframes zoomIn {
  from {
    transform: scale(1.05);
    opacity: 0
  }
}

@keyframes zoomIn2 {
  0% { transform: scale(1.1); opacity: 0 }
  100% { transform: scale(1); opacity: 1 }
}

.zoomIn {
  animation: 0.5s 0.2s zoomIn;
}

.zoomInBackwards {
  animation: 0.5s 0.2s zoomIn backwards;
}

code {
  line-height: 1;
}

.form-control {
  border-radius: 2px;
}

.loader {
  margin-bottom: 25px;
}

.loader svg {
  position: relative;
  top: 8px;
  right: 4px;
}

.animate-float {
  animation: float 2.8s forwards ease infinite;
}

@keyframes float {
  0% {
    transform: translateZ(0)
  }

  40% {
    transform: translate3d(0, -6px, 0)
  }

  to {
    transform: translateZ(0)
  }
}

@-webkit-keyframes float {
  0% {
    transform: translateZ(0)
  }

  40% {
    transform: translate3d(0, -6px, 0)
  }

  to {
    transform: translateZ(0)
  }
}

/* Live demo and modal styles */

.modal {
  animation: zoomIn .35s ease-out;
}

.modal-content {
  border: none;
  border-radius: 3px;
}

.modal-body {
  padding: 10px 0;
}

.modal-backdrop {
  background-color: rgba(0, 0, 0, 0.6);
}

.modal-backdrop.in {
  opacity: 1;
}

.modal-content {
  box-shadow: 0 1px 8px rgba(0, 0, 0, .35), 0 1px 2px rgba(0, 0, 0, .25) !important;
}

.modal {
  text-align: center;
  padding: 0!important;
}

.modal:before {
  content: '';
  display: inline-block;
  height: 100%;
  vertical-align: middle;
  margin-right: -4px;
}

.modal-dialog {
  display: inline-block;
  text-align: left;
  vertical-align: middle;
}

.demo-container {
  position: relative;
  display: block;
  padding: 10px 15px 15px;
  border-left: 9px solid;
  border-color: transparent;
  transition: all .2s;
}

.demo-container p > span {
  background-image: linear-gradient(to bottom, rgba(29, 124, 244, 0) 50%, rgba(29, 124, 244, 0.6) 50%);
  background-repeat: repeat-x;
  background-size: 2px 2px;
  background-position: 0 16px;
  color: rgb(29, 124, 244);

}

.demo-container:focus,
.demo-container:hover {
  color: rgb(29, 124, 244);
  text-decoration: none;
  outline: none;
}

.demo-container.demo1:focus,
.demo-container.demo1:hover {
  border-color: #83cd29;
}

.demo-container.demo2:focus,
.demo-container.demo2:hover {
  border-color: #dd1b16;
}

.demo-container.demo3:focus,
.demo-container.demo3:hover {
  border-color: #61dafb;
}

.demo-container.demo4:focus,
.demo-container.demo4:hover {
  border-color: #333;
}

.demo-container.demo5:focus,
.demo-container.demo5:hover {
  border-color: #f3c859;
}

.demo-container img {
  margin-right: 10px;
}

.demo-container img:last-child {
  margin-right: 0;
}


313 S.W.3d 734 (2010)
STATE of Missouri, Respondent,
v.
Thomas REANDO, Appellant.
No. WD 70472.
Missouri Court of Appeals, Western District.
June 29, 2010.
*737 William J. Swift, Esq., Columbia, MO, for appellant.
Shaun J. Mackelprang, Esq., and James B. Fransworth, Esq., Jefferson City, MO, for respondent.
Before Division One: LISA WHITE HARDWICK, Presiding Judge, JAMES M. SMART, JR., and ALOK AHUJA, Judges.
LISA WHITE HARDWICK, Judge.
Thomas Reando appeals his convictions for second-degree involuntary manslaughter and two counts of second-degree assault. Following a bench trial, he contends the circuit court erred in entering judgment on all three of the offenses because: (1) the convictions violated his right against double jeopardy; and (2) the charging information was defective in failing to apprise him of the mental state the State was required to prove. For reasons explained herein, we affirm.

FACTUAL AND PROCEDURAL HISTORY
On April 4, 2007, Reando was driving westbound on Route N in Harrison County with his younger brother, Dustin Lambert, and their friend, C.B., as passengers. Reando had been drinking. Despite the hills, curves, and a posted speed limit of 55 mph on Route N, Reando was travelling at about 65 mph.
Cathy Holliday was eastbound on Route N as she rounded the curve at the top of a hill and saw Reando's vehicle in her lane. Holliday attempted to veer left, but Reando's vehicle collided with the passenger side of Holliday's vehicle. Dustin was killed in the collision; Holliday and C.B. were seriously injured.
In November 2007, the Harrison County Prosecutor filed an information charging Reando with second-degree involuntary manslaughter for the death of Dustin Lambert, and two counts of second-degree assault for injuries to Holliday and C.B. With regard to each offense, the information alleged that Reando acted with criminal negligence by operating a motor vehicle on the wrong side of the road. At Reando's request, venue was transferred to Grundy County, where on April 22, 2008, an amended information was filed with the same charges and allegations.
On May 24, 2008, the Missouri Highway Patrol issued Reando multiple traffic citations arising from the accident, including a ticket for failing to drive on the right half of the roadway, a misdemeanor offense pursuant to Section 304.015.2.[1] While the felony charges were pending in Grundy County, Reando pleaded guilty to the misdemeanor and was sentenced to thirty days in the county jail.
Reando then filed a motion to dismiss the felony charges, arguing that his continued prosecution for the felonies violated his right to be free from double jeopardy. He claimed the "failure to drive on the right half of the road" as charged under Section 302.015 was a lesser-included offense of involuntary manslaughter and second degree assault. The Grundy County *738 Circuit Court took the motion under advisement.
The State sought leave to file a Second Amended information that included the same three charges but alleged criminal negligence by operating a motor vehicle in a careless and imprudent manner. The circuit court overruled Reando's objections to the timeliness of the amendment and granted leave to file the Second Amended Information.
Reando waived a jury and consented to a bench trial. The circuit court denied Reando's motion to dismiss, finding no double jeopardy. After hearing the evidence, the court found Reando guilty on all counts and sentenced him to a total of fourteen years in prison. Reando appeals.

ANALYSIS

Double Jeopardy
In his first point on appeal, Reando contends the circuit court violated his right against double jeopardy by entering judgment on the convictions for involuntary manslaughter and two counts of second-degree assault. Because he had previously pled guilty to the misdemeanor offense of failing to drive on the right half of the road, Reando argues that same misconduct is a lesser included offense of the three felonies and that he has been improperly subjected to double punishment. Our review of this double jeopardy claim is de novo and, thus, without deference to the circuit court's determination. State v. Kamaka, 277 S.W.3d 807, 810 (Mo.App.2009).
"The Fifth Amendment to the United States Constitution guarantees the right against double jeopardy, and the Due Process Clause in the Fourteenth Amendment extends that protection to the state prosecutions." State v. George, 277 S.W.3d 805, 807 (Mo.App.2009). "The doctrine of double jeopardy generally protects defendants from successive prosecutions for the same offense after an acquittal or conviction and from multiple punishments for the same offense." Id.
Double jeopardy principles do not, however, automatically preclude prosecution for multiple offenses arising out of the same conduct. If the conduct establishes commission of more than one offense, a person may be prosecuted for each offense unless one is "included in the other." Section 556.041. One offense is considered "included" in another if "[i]t is established by proof of the same or less than all the facts required to establish the commission of the offense charged[.]" Section 556.046.1(1). "An offense is a lesser included offense if it is impossible to commit the greater without necessarily committing the lesser." State v. Derenzy, 89 S.W.3d 472, 474 (Mo.banc 2002).
In considering whether one offense is included in another, our courts apply the "same elements" test established in Blockburger v. United States, 284 U.S. 299, 304, 52 S.Ct. 180, 76 L.Ed. 306 (1932) and codified at Section 556.041 and 556.046.1(1). State v. Burns, 877 S.W.2d 111, 112 (Mo.banc 1994).
"[W]e simply determine the elements of the offenses at issue and compare them. If this comparison establishes that they do not each have an element that the other offense lacks, the guarantee against double jeopardy bars the prosecution of the second offense. If both offenses have elements that the other lacks, the guarantee does not bar the subsequent prosecution."
State v. Clark, 263 S.W.3d 666, 671 (Mo. App.2008) (internal citations omitted). "[O]nly the statutory elements of the offenses are relevant, not the evidence adduced at trial." State v. Dennis, 153 S.W.3d 910, 919 (Mo.App.2005).
*739 Reando pled guilty to a misdemeanor traffic offense under Section 304.015.2, which provides in relevant part:
Upon all public roads or highways of sufficient width a vehicle shall be driven upon the right half of the roadway, except as follows:
(1) When overtaking and passing another vehicle proceeding in the same direction pursuant to the rules governing such movement;
(2) When placing a vehicle in a position for and when such vehicle is lawfully making a left turn in compliance with the provisions of section 304.014 to 304.025 or traffic regulations thereunder or of municipalities;
(3) When the right half of the roadway is closed to traffic while under construction or repair;
(4) Upon a roadway designated by local ordinance as a one-way street and marked or signed for one-way traffic.
This offense requires proof of three elements: (1) that Reando was driving a vehicle on "a public road or highway of sufficient width"; (2) that he failed to drive on the right half of the road; and (3) that none of the four listed exceptions apply.
These elements differ significantly from the felony offenses for which Reando was convicted. "A person commits the crime of involuntary manslaughter in the second degree if he acts with criminal negligence to cause the death of any person." Section 565.024.3. Thus, the State was required to prove: (1) that Reando acted with criminal negligence; (2) to cause the death of any person. And, as charged in Reando's case, "[a] person commits the crime of assault in the second degree if he: ... [r]ecklessly causes serious physical injury to another person[.]" Section 565.060.1(3). This offense also required proof of two elements: (1) that Reando acted recklessly; (2) to cause serious physical injury to another person.
Based on the statutory elements of the offenses, it is clear that failing to drive on the right half of the road is not a lesser included offense of either second-degree involuntary manslaughter or second-degree assault. The misdemeanor offense contains elementsdriving on a public roadway and failing to remain on the right half of the roadwhich are not necessary elements of either second degree involuntary manslaughter or second degree assault. The felony crimes can be committed without proof that a defendant was driving at all. Additionally, the felony offenses require proof of death or serious physical injury, while the misdemeanor violation does not require proof of any injury. Because the misdemeanor has elements the felony offenses lack and vice versa, the Double Jeopardy Clause does not bar Reando's prosecution on the felonies. See Kamaka, 277 S.W.3d at 813.
Reando argues that the misdemeanor offense is a lesser included offense of the felonies because the State would have been unable to prove criminal negligence or recklessness without first proving he drove on the wrong side of the road. This argument relies upon the evidence or facts the State used to prove the felony offenses, not on the elements of those offensesan approach that was expressly rejected by the Supreme Court in United States v. Dixon, 509 U.S. 688, 703-04, 113 S.Ct. 2849, 125 L.Ed.2d 556 (1993).[2] Driving on *740 the wrong side of the road is not an inherent part of the proof required to show criminal negligence or recklessness; thus, it is not a necessary fact to establish any of the felonies and does not qualify as a lesser-included offense under the provisions of Section 556.046.1(1). See Kamaka, 277 S.W.3d at 814-15. Here, for example, the State presented additional evidence that Reando acted negligently and recklessly by driving at an excessive speed after he had been drinking. The State's case was not solely based on the fact that Reando drove on the side of the road, and none of the elements of the felony charges either expressly or implicitly required proof that Reando drove on the wrong side of the road.
Reando relies on Clark, 263 S.W.3d 666 and State v. Steck, 68 S.W.3d 625 (Mo.App. 2002), two cases that applied the Blockburger "same elements" test to identify lesser-included offenses. In Clark, this court held the defendant's conviction on a "resisting a lawful stop" violated the Double Jeopardy Clause because the first two elements of the charge were the same as those to which he had already pled guilty under a city ordinance requiring drivers to pull over when an emergency vehicle approaches. 263 S.W.3d at 673-74.[3] In Steck, the court found a municipal conviction for DWI barred a subsequent state prosecution for second-degree assault charged under Section 565.060.1(4) (for driving in an intoxicated state and causing injury to another) because the DWI was a lesser included offense. 68 S.W.3d at 626. Because the elements of the second degree assault as pleaded entirely encompassed the elements of the municipal DWI, the prosecution was barred under the "same elements" test of Blockburger. Id. at 626-27.
Unlike the situations in Clark and Steck, the elements of Reando's misdemeanor offense are not included in any of his charged felony offenses. His failure to drive on the right side of the road was evidence of his criminal negligence and recklessness, but that conduct was not an *741 "element" of those crimes. See Hoover v. Denton, 335 S.W.2d 46, 48-49 (Mo.1960), and Daws, 311 S.W.3d at 809. Accordingly, the circuit court did not put him in double jeopardy by entering judgment on the convictions for second-degree involuntary manslaughter and second-degree assault. Point I is denied.

Sufficiency of the Information
In Point II, Reando contends the Second Amended Information failed to apprise him of the mental state the State was required to prove to convict him of the involuntary manslaughter and assault charges. The Second Amended Information alleged, in pertinent part, the following:
[The State] charges that the defendant, in violation of Section 565.024 RSMo, committed the class D felony of involuntary manslaughter in the second degree... in that on or about April 4, 2007, ... the defendant caused the death of Dustin Lambert by being the driver of an automobile in which Dustin Lambert was a passenger, by operating the motor vehicle with criminal negligence in that the defendant was operating the motor vehicle in a careless and imprudent manner, causing an accident[.]
[The State] charges that the defendant, in violation of Section 565.060, RSMo, committed the class C felony of assault in the second degree ... in that on or about April 4, 2007, ... the defendant recklessly caused serious physical injury to Kathy (sic) Holliday acting with criminal negligence in that the defendant was operating the motor vehicle in a careless and imprudent manner causing it to strike the vehicle that Kathy (sic) Holliday was driving, causing serious physical injury to Kathy (sic) Holliday[.]
[The State] charges that the defendant, in violation of Section 565.060 RSMo, committed the class C felony of assault in the second degree ... in that on or about April 4, 2007, ... the defendant recklessly caused serious physical injury to C.B. by acting with criminal negligence in that the defendant was operating a motor vehicle that C.B. was a passenger in; in a careless and imprudent manner and caused the vehicle to strike another vehicle, causing serious physical injury to C.B.
Reando claims prejudice because he was required to defend against multiple mental states as to each count. He also asserts the use of multiple mental states reduced the State's burden of proof on the felony offenses.
Although Reando objected to the State's request for leave to file the Second Amended Information and raised the claim in his new trial motion, the basis for his objection was timeliness and not the sufficiency of the charge. Consequently, his newly raised claim on appeal is subject to a narrow scope of review for actual prejudice.
An information or indictment will be deemed insufficient, where the issue is raised for the first time after a verdict or judgment, "only if it is so defective that (1) it does not by any reasonable construction charge the offense of which the defendant was convicted or (2) the substantial rights of the defendant to prepare a defense and plead former jeopardy in the event of acquittal are prejudiced."
A defendant is only entitled to relief based on a post-trial claim that the information is insufficient if the defendant demonstrates actual prejudice.
State v. Williams, 126 S.W.3d 377, 380-81 (Mo.banc 2004) (internal citations omitted).
To test the sufficiency of an indictment, we must consider whether it contains all of the essential elements of the *742 statutory offense and clearly informs the defendant of the facts constituting the offense. State v. Hodges, 829 S.W.2d 604, 606 (Mo.App.1992). Here, the charging document cited the statutes under which Reando was charged and the level of culpability required for his conviction. That level of culpability was reflected in the information under each count: criminal negligence for second degree involuntary manslaughter and recklessness for second degree assault. It alleged the date of the offenses and the specific acts providing the factual basis for the charges. The Second Amended Information was adequate to inform Reando of the charges against him.
Although the Information further alleged that Reando had driven his vehicle in a "careless and imprudent manner," this general description of his conduct did not misstate the necessary culpable mental state. The language was used to broadly describe the conduct leading to the charges. Such language is surplusage and does not entitle Reando to a new trial. Section 545.030.1(14).
The State v. Ricker case on which Reando relies is distinguishable. 936 S.W.2d 167 (Mo.App.1996). In Ricker, the information charged the defendant with acting "recklessly" when the first-degree assault statute required that he act "knowingly." 936 S.W.2d at 170. The court reversed the conviction because the necessary culpable mental state was misstated in the charging document. Id. at 171. The misstatement reduced the State's burden of proof and allowed the jury to convict the defendant of first degree assault for acting recklessly instead of knowingly. Id. By contrast, the information in Reando's case included the requisite mental state and also provided a statutory reference to which the circuit court could refer if there was any question about the applicable standard.[4] The inclusion of additional factual information in the information did not lower the State's burden of proof, particularly in this bench-tried case where the circuit court is presumed to understand and apply the proper mental state. State v. Poole, 216 S.W.3d 271, 277 (Mo.App.2007).
Reando further argues his defense was hampered because he was forced to defend against the multiple and contradictory mental states in the Second Amended Information. His defense was that his brother's death and the injuries to Cathy Holliday and C.B. were the result of a tragic unfortunate accident for which he lacked the requisite mental state. As explained herein, the Second Amended Information was sufficient to apprise Reando of the charges against him, the requisite mental states, and the factual bases for the allegations. Although there were separate mental states listed for each offense, there was nothing to contradict the State's obligation to prove criminal negligence for second degree involuntary manslaughter and recklessness for second degree assault. Reando has not demonstrated how he would have defended the matter differently if the information had not contained the additional facts on which his charges were based. In the absence of any specific indication that his defense was hindered by the alleged defects in the information, Reando is not entitled to relief. See Williams, 126 S.W.3d at 381.
Reando has failed to demonstrate any defects in the Second Amended Information *743 that resulted in actual prejudice. Accordingly, we find no error and deny his second point on appeal.

CONCLUSION
We affirm the circuit court's judgment.
All Concur.
NOTES
[1]  All statutory references are to Revised Statutes of Missouri (2000) as updated by the Cumulative Supplement (2009) unless otherwise noted.
[2]  Notably, Dixon overruled the Supreme Court's prior holding in Grady v. Corbin, 495 U.S. 508, 110 S.Ct. 2084, 109 L.Ed.2d 548 (1990), a case with remarkably similar facts to those before us.

In Grady, the defendant drove his car over the double yellow line and crashed into oncoming traffic, killing one person and seriously injuring another. 495 U.S. at 511, 110 S.Ct. 2084. He pled guilty to misdemeanor traffic tickets for DWI and failing to keep right of the median. Id. at 512-13, 110 S.Ct. 2084. Later, he was charged with manslaughter and assault for reckless conduct that included driving too fast for the road conditions and operating a vehicle while intoxicated. Id. at 513, 110 S.Ct. 2084. Grady argued the felony prosecutions were barred by double jeopardy because the State would rely on the prior traffic offenses to prove the manslaughter and assault charges. Id. at 514-15, 110 S.Ct. 2084. The Supreme Court agreed, concluding that even though the charges survived the Blockburger "elements" test, "the Double Jeopardy Clause bars any subsequent prosecution in which the government, to establish an essential element of an offense charged in that prosecution, will prove conduct that constitutes an offense for which the defendant has already been prosecuted." Id. at 521, 110 S.Ct. 2084.
Three years later, the Court overruled Grady finding its "same conduct" rule to be inconsistent with earlier Court precedent and "the clear common-law understanding of double jeopardy." Dixon, 509 U.S. at 704, 113 S.Ct. 2849. The Court concluded the government could bring charges against a defendant even if the charges depend on proof of conduct for which that defendant had already been prosecuted, unless those charges are barred by the Blockburger "same elements" test. Id. at 703-04, 712, 113 S.Ct. 2849; State v. Burns, 877 S.W.2d 111, 112 (Mo.banc 1994).
[3]  The reasoning in Clark was recently overruled in State v. Daws, 311 S.W.3d 806 (Mo. banc 2010), wherein the Court held that the presumption of flight (arising from the failure to heed emergency signals) is merely an evidentiary rule and not an "element" of the offense of resisting arrest. Id. at 809. Therefore, the "elements" of the two charges were not the same and would not support a double jeopardy claim. Id.
[4]  In State v. Parkhurst, 845 S.W.2d 31, 35 (Mo.banc 1992), the Supreme Court determined that failing to include the "knowingly" level of culpability in an information was not a fatal defect under circumstances such as we have here. The statute containing the mental state was included in the information and other factual allegations gave the defendant adequate notice of the crime with which he was charged. Id


export = async (req, res, scope) => {
  req.mid = 'mid';
};