packages feed

Yablog (empty) → 0.0.1.1

raw patch · 47 files changed

+8269/−0 lines, 47 filesdep +basedep +blaze-builderdep +bytestringsetup-changedbinary-added

Dependencies added: base, blaze-builder, bytestring, case-insensitive, clientsession, hamlet, hjsmin, http-conduit, http-types, mime-mail, monad-control, old-locale, pandoc, pandoc-types, persistent, persistent-mongoDB, shakespeare-css, shakespeare-js, shakespeare-text, template-haskell, text, time, wai-extra, xml-conduit, xml-hamlet, yaml, yesod, yesod-auth, yesod-core, yesod-default, yesod-form, yesod-newsfeed, yesod-platform, yesod-static

Files

+ Application.hs view
@@ -0,0 +1,64 @@+{-# OPTIONS_GHC -fno-warn-orphans #-}+module Application+    ( getApplication+    , getApplicationDev+    ) where++import Import+import Settings+import Yesod.Auth+import Yesod.Default.Config+import Yesod.Default.Main+import Yesod.Default.Handlers+#if DEVELOPMENT+import Yesod.Logger (Logger, logBS)+import Network.Wai.Middleware.RequestLogger (logCallbackDev)+#else+import Yesod.Logger (Logger, logBS, toProduction)+import Network.Wai.Middleware.RequestLogger (logCallback)+#endif+import qualified Database.Persist.Store+import Network.HTTP.Conduit (newManager, def)++-- Import all relevant handler modules here.+import Handler.Root+import Handler.Blog+import Handler.User++-- This line actually creates our YesodSite instance. It is the second half+-- of the call to mkYesodData which occurs in Foundation.hs. Please see+-- the comments there for more details.+mkYesodDispatch "Yablog" resourcesYablog++-- This function allocates resources (such as a database connection pool),+-- performs initialization and creates a WAI application. This is also the+-- place to put your migrate statements to have automatic database+-- migrations handled by Yesod.+getApplication :: AppConfig DefaultEnv Extra -> Logger -> IO Application+getApplication conf logger = do+    manager <- newManager def+    s <- staticSite+    dbconf <- withYamlEnvironment "config/mongoDB.yml" (appEnv conf)+              Database.Persist.Store.loadConfig >>=+              Database.Persist.Store.applyEnv+    p <- Database.Persist.Store.createPoolConfig (dbconf :: Settings.PersistConfig)+    let foundation = Yablog conf setLogger s p manager dbconf+    app <- toWaiAppPlain foundation+    return $ logWare app+  where+#ifdef DEVELOPMENT+    logWare = logCallbackDev (logBS setLogger)+    setLogger = logger+#else+    setLogger = toProduction logger -- by default the logger is set for development+    logWare = logCallback (logBS setLogger)+#endif++-- for yesod devel+getApplicationDev :: IO (Int, Application)+getApplicationDev =+    defaultDevelApp loader getApplication+  where+    loader = loadConfig (configSettings Development)+        { csParseExtra = parseExtra+        }
+ Forms.hs view
@@ -0,0 +1,176 @@+module Forms ( articleForm, articleForm', commentDeleteForm+             , commentForm, commentForm', trackbackForm+             , trackbackDeleteForm+             ) where+import Yesod.Form+import Prelude+import Model+import Control.Applicative+import Foundation+import Yesod hiding (Route(..))+import Data.Text (Text)+import Data.Time+import Control.Monad+import Data.Maybe+import Control.Arrow+import Markups+import Yesod.Default.Config+import qualified Data.Text as T++type URL = String+articleForm :: Form (Article, [Text], [URL])+articleForm = articleForm' Nothing Nothing++articleForm' :: Maybe Article -> Maybe [Text] -> Form (Article, [Text], [URL])+articleForm' mart mtags htm = do+  Entity usrId usr <- lift requireAuth+  lift $ do+    accessible <- isAdmin usr+    unless accessible $ do+      permissionDenied "You are not in admins"+  now  <- liftIO getCurrentTime+  markup <- extraMarkup . appExtra . settings <$> lift getYesod+  ident <- maybe (lift newIdent) return $ articleIdent <$> mart+  let day  = utctDay now+      time = timeToTimeOfDay $ utctDayTime now+  if maybe False ((/= usrId) . articleAuthor) mart+     then lift $ permissionDenied "You cannot edit that article."+     else flip renderBootstrap htm $+            let titleSettings = FieldSettings { fsLabel = SomeMessage MsgTitle+                                              , fsName = Just "title"+                                              , fsId = Just "title"+                                              , fsAttrs = [("class", "span8")]+                                              , fsTooltip = Nothing+                                              }+                bodySettings  = FieldSettings { fsLabel = SomeMessage MsgArticle+                                              , fsId = Just "src"+                                              , fsName = Just "src"+                                              , fsAttrs = [("class", "span8")]+                                              , fsTooltip = Nothing+                                              }+                tagsSettings  = FieldSettings { fsLabel = SomeMessage MsgTags+                                              , fsId = Just "tags"+                                              , fsName = Just "tags"+                                              , fsAttrs = [("class", "span8")]+                                              , fsTooltip = Nothing+                                              }+                identSettings = FieldSettings { fsLabel = SomeMessage MsgIdentifier+                                              , fsId = Just "ident"+                                              , fsName = Just "ident"+                                              , fsAttrs = [("class", "span8")]+                                              , fsTooltip = Nothing+                                              }+                cDateSettings = FieldSettings { fsLabel = SomeMessage MsgCreatedDate+                                              , fsId = Just "created_date"+                                              , fsName = Just "created_date"+                                              , fsAttrs = []+                                              , fsTooltip = Nothing+                                              }+                cTimeSettings = FieldSettings { fsLabel   = SomeMessage MsgCreatedTime+                                              , fsName    = Just "created_time"+                                              , fsId      = Just "created_time"+                                              , fsAttrs   = []+                                              , fsTooltip = Nothing+                                              }+                markupSettings = FieldSettings { fsLabel = "Markup"+                                               , fsName  = Just "markup"+                                               , fsId    = Just "markup"+                                               , fsAttrs = []+                                               , fsTooltip = Nothing+                                               }+                trackbackUrls = FieldSettings { fsLabel = "Trackback(s)"+                                              , fsName  = Just "trackbacks"+                                              , fsId    = Just "trackbacks"+                                              , fsAttrs = [("class", "span8")]+                                              , fsTooltip = Nothing+                                              }+                art = Article <$> pure usrId+                              <*> areq textField titleSettings (articleTitle <$> mart)+                              <*> areq textField identSettings (Just ident)+                              <*> aopt (selectFieldList $ map ((T.pack &&& id).fst) readers) markupSettings+                                       (Just $ (articleMarkup =<< mart) <|> markup)+                              <*> (T.unpack . T.filter (/='\r') . unTextarea <$>+                                    areq textareaField bodySettings+                                             (Textarea . T.pack . articleBody <$> mart))+                              <*> (fromEnum . fromMaybe day <$> aopt dayField cDateSettings+                                                (Just $ toEnum . articleCreatedDate <$> mart))+                              <*> (fromEnum . timeOfDayToTime . fromMaybe time <$> aopt timeField cTimeSettings+                                                (Just $ timeToTimeOfDay . toEnum . articleCreatedTime <$> mart))+                              <*> pure (articleModifiedAt =<< mart)+                tags = T.words . fromMaybe "" <$> aopt textField tagsSettings (Just . T.unwords <$> mtags)+                tbs  = maybe [] (lines . T.unpack . unTextarea) <$> aopt textareaField trackbackUrls Nothing+            in (,,) <$> art <*> tags <*> tbs++commentDeleteForm :: ArticleId -> Form [Comment]+commentDeleteForm art html = do+  let commentSettings = FieldSettings { fsLabel = SomeMessage MsgComments+                                      , fsAttrs = [("class", "span8")]+                                      , fsName  = Just "delete-contents"+                                      , fsId    = Just "delete-contents"+                                      , fsTooltip = Nothing+                                      }+  cs <- lift $ runDB $ selectList [CommentArticle ==. art] []+  flip renderBootstrap html $+    areq (multiSelectFieldList [(mkOptName c, c) | Entity _ c <- cs]) commentSettings Nothing+  where+    mkOptName c = T.concat [ commentBody c, " - ", commentAuthor c, " / "+                           , T.pack$ show $ commentCreatedAt c+                           ]++trackbackDeleteForm :: ArticleId -> Form [Trackback]+trackbackDeleteForm art html = do+  let tbsSettings = FieldSettings { fsLabel = SomeMessage MsgTrackbacks+                                  , fsAttrs = [("class", "span8")]+                                  , fsName  = Just "delete-tbs"+                                  , fsId    = Just "delete-tbs"+                                  , fsTooltip = Nothing+                                  }+  cs <- lift $ runDB $ selectList [TrackbackArticle ==. art] []+  flip renderBootstrap html $+    areq (multiSelectFieldList [(mkOptName c, c) | Entity _ c <- cs]) tbsSettings Nothing+  where+    mkOptName t = fromMaybe (fromMaybe (trackbackUrl t) $ trackbackBlogName t) $+                    trackbackTitle t+++commentForm' :: Maybe Comment -> ArticleId -> Form Comment+commentForm' mcom art html = do+  musr <- lift  maybeAuth+  time <- liftIO getCurrentTime+  let commentField = FieldSettings { fsLabel = SomeMessage MsgComment+                                   , fsAttrs = [("class", "span8")]+                                   , fsName  = Just "comment-contents"+                                   , fsId    = Just "comment-contents"+                                   , fsTooltip = Nothing+                                   }+      nameField    = FieldSettings { fsLabel = SomeMessage MsgName+                                   , fsAttrs = []+                                   , fsId    = Just "comment-author"+                                   , fsName  = Just "comment-author"+                                   , fsTooltip = Nothing+                                   }+  flip renderBootstrap html $+    Comment <$> areq textField nameField (userScreenName . entityVal <$> musr)+            <*> (unTextarea <$> areq textareaField commentField (Textarea . commentBody <$> mcom))+            <*> pure (commentPassword =<< mcom)+            <*> pure time+            <*> pure art++commentForm :: Maybe Comment -> Article -> Form Comment+commentForm mcom art html = do+  Entity key _ <- lift $ runDB $ getBy404 $+                    UniqueArticle (articleCreatedDate art) (articleIdent art)+  commentForm' mcom key html++trackbackForm :: ArticleId -> Form Trackback+trackbackForm aid = renderBootstrap $+  Trackback <$> pure aid+            <*> aopt textField titleSettings Nothing+            <*> (liftM unTextarea <$> aopt textareaField excerptSettings Nothing)+            <*> areq textField urlSettings Nothing+            <*> aopt textField blogSettings Nothing+  where+    titleSettings   = "title" { fsName = Just "title" }+    excerptSettings = "excerpt" { fsName = Just "excerpt" }+    urlSettings     = "url" { fsName = Just "url" }+    blogSettings    = "blog_name" { fsName = Just "blog_name" }
+ Foundation.hs view
@@ -0,0 +1,259 @@+module Foundation+    ( Yablog (..)+    , Route (..)+    , YablogMessage (..)+    , resourcesYablog+    , Handler+    , Widget+    , Form+    , YablogDate (..)+    , YablogDay  (..)+    , maybeAuth+    , requireAuth+    , module Settings+    , module Model+    , getBlogTitle+    , getBlogDescription+    , markupRender+    , isAdmin+    , notice+    , commentAnchor+    ) where++import Prelude+import Yesod+import Yesod.Static+import Settings.StaticFiles+import Yesod.RssFeed+import Yesod.AtomFeed+import Yesod.Auth+import Yesod.Auth.BrowserId+import Yesod.Auth.GoogleEmail+import Yesod.Default.Config+import Yesod.Default.Util (addStaticContentExternal)+import Yesod.Logger (Logger, logMsg, formatLogText)+import Network.HTTP.Conduit (Manager)+import qualified Settings+import qualified Data.ByteString.Lazy as L+import qualified Database.Persist.Store+import Database.Persist.MongoDB hiding (master)+import Settings (widgetFile, Extra (..))+import Model+import Text.Jasmine (minifym)+import Web.ClientSession (getKey)+import Text.Hamlet (hamletFile)+import Data.List (nub, sort)+import Data.Maybe+import Network.Mail.Mime+import Data.Time+import System.Locale+import Control.Applicative+import qualified Data.Text as T+import qualified Data.Text.Encoding as T+import Markups+import Network.HTTP.Types+import qualified Data.ByteString.Lazy.Char8 as LBS++-- | The site argument for your application. This can be a good place to+-- keep settings and values requiring initialization before your application+-- starts running, such as database connections. Every handler will have+-- access to the data present here.+data Yablog = Yablog+    { settings :: AppConfig DefaultEnv Extra+    , getLogger :: Logger+    , getStatic :: Static -- ^ Settings for static file serving.+    , connPool :: Database.Persist.Store.PersistConfigPool Settings.PersistConfig -- ^ Database connection pool.+    , httpManager :: Manager+    , persistConfig :: Settings.PersistConfig+    }++-- Set up i18n messages. See the message folder.+mkMessage "Yablog" "messages" "en"++-- This is where we define all of the routes in our application. For a full+-- explanation of the syntax, please see:+-- http://www.yesodweb.com/book/handler+--+-- This function does three things:+--+-- * Creates the route datatype YablogRoute. Every valid URL in your+--   application can be represented as a value of this type.+-- * Creates the associated type:+--       type instance Route Yablog = YablogRoute+-- * Creates the value resourcesYablog which contains information on the+--   resources declared below. This is used in Handler.hs by the call to+--   mkYesodDispatch+--+-- What this function does *not* do is create a YesodSite instance for+-- Yablog. Creating that instance requires all of the handler functions+-- for our application to be in scope. However, the handler functions+-- usually require access to the YablogRoute datatype. Therefore, we+-- split these actions into two functions and place them in separate files.+mkYesodData "Yablog" $(parseRoutesFile "config/routes")++type Form x = Html -> MForm Yablog Yablog (FormResult x, Widget)++getBlogTitle :: GHandler sub Yablog T.Text+getBlogTitle = extraTitle . appExtra . settings <$> getYesod++getBlogDescription :: GHandler sub Yablog T.Text+getBlogDescription = extraDescription . appExtra . settings <$> getYesod++isAdmin :: User -> GHandler sub Yablog Bool+isAdmin usr = do+  as <- extraAdmins . appExtra . settings <$> getYesod+  return $ userIdent usr `elem` as++markupRender :: Maybe String -> Article -> GHandler sub Yablog Html+markupRender mid article = do+  extra <- appExtra . settings <$> getYesod+  usr <- runDB $ get404 $ articleAuthor article+  let markup = fromMaybe "markdown" $ articleMarkup article <|> extraMarkup extra+      trans  = maybe id (addAmazonAssociateLink . T.unpack) $ userAmazon usr+  return $ renderMarkup mid markup trans $ articleBody article++-- Please see the documentation for the Yesod typeclass. There are a number+-- of settings which can be configured by overriding methods here.+instance Yesod Yablog where+    approot = ApprootMaster $ appRoot . settings++    -- Place the session key file in the config folder+    makeSessionBackend _ = do+        key <- getKey "config/client_session_key.aes"+        return . Just $ clientSessionBackend key 120++    defaultLayout widget = do+        musr <- maybeAuth+        let rss  = rssLink FeedR "RSS Link"+            atom = atomLink FeedR "Atom Link"+        accessible <- maybe (return False) (isAdmin . entityVal) musr+        master <- getYesod+        mmsg <- getMessage+        blogTitle <- getBlogTitle+        description <- getBlogDescription+        let mcse = case extraGoogleCSE (appExtra $ settings master) of+                     Just cse -> Just $(widgetFile "search")+                     Nothing  -> Nothing+        comments <- runDB $ do+          cs <- map entityVal <$> selectList [] [LimitTo 10, Desc CommentCreatedAt]+          as <- mapM (get404 . commentArticle) cs+          return $ zip cs as+        articles <- map entityVal <$> runDB (selectList [] [LimitTo 5, Desc ArticleCreatedDate, Desc ArticleCreatedTime])+        tags <- sort . nub . map (tagName . entityVal) <$> runDB (selectList [] [])+        -- We break up the default layout into two components:+        -- default-layout is the contents of the body tag, and+        -- default-layout-wrapper is the entire page. Since the final+        -- value passed to hamletToRepHtml cannot be a widget, this allows+        -- you to use normal widget features in default-layout.+        pc <- widgetToPageContent $ do+            addScriptRemote "https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"+            addScriptRemote "http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML"+            addScript $ StaticR js_bootstrap_js+            addStylesheet $ StaticR css_bootstrap_responsive_css+            addStylesheet $ StaticR css_bootstrap_css+            setTitle $ toHtml blogTitle+            $(widgetFile "normalize")+            $(widgetFile "default-layout")+        hamletToRepHtml $(hamletFile "templates/default-layout-wrapper.hamlet")++    -- This is done to provide an optimization for serving static files from+    -- a separate domain. Please see the staticRoot setting in Settings.hs+    urlRenderOverride y (StaticR s) =+        Just $ uncurry (joinPath y (Settings.staticRoot $ settings y)) $ renderRoute s+    urlRenderOverride _ _ = Nothing++    -- The page to be redirected to when authentication is required.+    authRoute _ = Just $ AuthR LoginR++    messageLogger y loc level msg =+      formatLogText (getLogger y) loc level msg >>= logMsg (getLogger y)++    -- This function creates static content files in the static folder+    -- and names them based on a hash of their content. This allows+    -- expiration dates to be set far in the future without worry of+    -- users receiving stale content.+    addStaticContent = addStaticContentExternal minifym base64md5 Settings.staticDir (StaticR . flip StaticRoute [])++    -- Place Javascript at bottom of the body tag so the rest of the page loads first+    jsLoader _ = BottomOfBody++-- How to run database actions.+instance YesodPersist Yablog where+    type YesodPersistBackend Yablog = Action+    runDB f = do+        master <- getYesod+        Database.Persist.Store.runPool+            (persistConfig master)+            f+            (connPool master)++instance YesodAuth Yablog where+    type AuthId Yablog = UserId++    -- Where to send a user after successful login+    loginDest _ = RootR+    -- Where to send a user after logout+    logoutDest _ = RootR++    getAuthId creds = runDB $ do+        x <- getBy $ UniqueUser $ credsIdent creds+        case x of+            Just (Entity uid _) -> return $ Just uid+            Nothing -> do+                fmap Just $ insert $+                  User (credsIdent creds) (credsIdent creds) Nothing Nothing "ja" "" Nothing++    -- You can add other plugins like BrowserID, email or OAuth here+    authPlugins _ = [authBrowserId, authGoogleEmail]++    authHttpManager = httpManager++-- Sends off your mail. Requires sendmail in production!+deliver :: Yablog -> L.ByteString -> IO ()+deliver _ = sendmail++-- This instance is required to use forms. You can modify renderMessage to+-- achieve customized and internationalized form validation messages.+instance RenderMessage Yablog FormMessage where+    renderMessage _ _ = defaultFormMessage++newtype YablogDate = YablogDate { fromYablogDate :: UTCTime }+    deriving (Eq, Ord, FormatTime, ParseTime)++instance Show YablogDate where+  show = formatTime defaultTimeLocale "%Y-%m-%d"++instance Read YablogDate where+  readsPrec _ = readsTime defaultTimeLocale "%Y-%m-%d"++newtype YablogDay = YablogDay { unYablogDay :: Day }+    deriving (Show, Eq, Ord, ParseTime, Read, Enum)++instance PathPiece YablogDay where+  toPathPiece = T.pack . formatTime defaultTimeLocale "%Y%m%d" . unYablogDay+  fromPathPiece = Data.Time.parseTime defaultTimeLocale "%Y%m%d" . T.unpack++notice :: UserId -> T.Text -> T.Text -> Handler ()+notice usrId title msg = do+  usr <- runDB $ get404 usrId+  extra <- appExtra . settings <$> getYesod+  case (,) <$> extraMailAddress extra <*> userEmail usr of+    Just (addr, to) -> do+      let body = Part "text/plain; charset=utf-8" QuotedPrintableText Nothing [] $ LBS.fromChunks [T.encodeUtf8 msg]+          mail = Mail { mailFrom = Address (Just $ extraTitle extra) addr+                      , mailTo   = [Address (Just $ userScreenName usr) to]+                      , mailHeaders = [("Subject", title)]+                      , mailCc      = []+                      , mailBcc     = []+                      , mailParts   = [[body]]+                      }+      -- liftIO $ LBS.putStrLn =<< renderMail' mail+      liftIO $ renderSendMail mail+    Nothing -> return ()++commentAnchor :: Comment -> T.Text+commentAnchor c = T.concat [ "comment-"+                           , T.decodeUtf8 $ urlEncode True $ T.encodeUtf8 $ commentAuthor c+                           , "-"+                           , T.pack $ formatTime defaultTimeLocale "%Y-%m-%d-%H-%M-%S" $ commentCreatedAt c+                           ]
+ Handler/Blog.hs view
@@ -0,0 +1,352 @@+module Handler.Blog where+import Data.Time+import Import+import Control.Monad+import Yesod.Auth+import qualified Data.Text as T+import qualified Data.Text.Encoding as T+import qualified Data.Text.Lazy as LT+import qualified Data.Text.Lazy.Encoding as LT+import qualified Data.ByteString as BS+import qualified Data.ByteString.Lazy as LBS+import Data.List (sortBy)+import Data.Function+import Text.Hamlet.XML+import Text.XML+import Text.XML.Cursor+import Blaze.ByteString.Builder+import Data.Maybe+import Network.HTTP.Conduit+import Network.HTTP.Types++postCreateR :: Handler RepHtml+postCreateR = do+  ((result, widget), enctype) <- runFormPost articleForm+  case result of+    FormSuccess (article, tags, tbs) -> do+      usr <- requireAuthId+      when (articleAuthor article /= usr) $ redirect RootR+      success <- runDB $ do+        ans <- insertBy article+        case ans of+          Right key -> do+            mapM_ (insertBy . Tag key) tags+            return True+          Left  _ -> return False+      if success+         then do+           errs <- catMaybes <$> mapM (pingTrackback article) tbs+           unless (null errs) $ setMessageI $ T.unlines errs+           redirect $ ArticleR (toEnum $ articleCreatedDate article) (articleIdent article)+         else do+           setMessageI $ MsgAlreadyExists $ articleTitle article+           defaultLayout $(widgetFile "post-article")+    _ -> do+      setMessageI MsgInvalidInput+      defaultLayout $(widgetFile "post-article")++getCreateR :: Handler RepHtml+getCreateR = do+  (widget, enctype) <- generateFormPost articleForm+  defaultLayout $ do+    $(widgetFile "post-article")++getArticleR :: YablogDay -> Text -> Handler RepHtml+getArticleR (YablogDay date) ident = do+  musr <- maybeAuthId+  (article, comments, trackbacks, mprev, mnext) <- runDB $ do+    Entity key article <- getBy404 (UniqueArticle (fromEnum date) ident)+    cs <- map entityVal <$> selectList [CommentArticle ==. key] []+    ts <- map entityVal <$> selectList [TrackbackArticle ==. key] []+    mnext <- selectFirst [ ArticleCreatedDate >=. articleCreatedDate article+                         , FilterOr [ ArticleCreatedDate >. articleCreatedDate article+                                    , ArticleCreatedTime >. articleCreatedTime article+                                    ]+                         ]+                         [ Asc ArticleCreatedDate, Asc ArticleCreatedTime]+    mprev <- selectFirst [ ArticleCreatedDate <=. articleCreatedDate article+                         , FilterOr [ ArticleCreatedDate <. articleCreatedDate article+                                    , ArticleCreatedTime <. articleCreatedTime article+                                    ]+                         ]+                         [ Desc ArticleCreatedDate, Desc ArticleCreatedTime ]+    return (article, cs, ts, entityVal <$> mprev, entityVal <$> mnext)+  (cWidget, cEnctype) <- generateFormPost $ commentForm Nothing article+  let mCommentForm = Just (cWidget, cEnctype)+  blogTitle <- getBlogTitle+  render <- getUrlRender+  defaultLayout $ do+    when (isJust mprev) $ do+      let prev = fromJust mprev+      toWidgetHead+        [hamlet|+          <link rel="prev previous" href=@{articleLink prev} title=#{articleTitle prev}>+        |]+    when (isJust mnext) $ do+      let next = fromJust mnext+      toWidgetHead+        [hamlet|+          <link rel="next" href=@{articleLink next} title=#{articleTitle next}>+        |]+    setTitle $ toHtml $ T.concat [articleTitle article, " - ", blogTitle]+    $(widgetFile "article")++pingTrackback :: Article -> String -> Handler (Maybe T.Text)+pingTrackback article tb = do+  renderUrl <- getUrlRender+  master <- getYesod+  blogName <- getBlogTitle+  let meta = [("title", T.encodeUtf8 $ articleTitle article)+             ,("excerpt", T.encodeUtf8 $ T.take 255 $ T.pack $ articleBody article)+             ,("url", T.encodeUtf8 $ renderUrl $ articleLink article)+             ,("blog_name", T.encodeUtf8 blogName)+             ]+      man = httpManager master+  rsp <- lift $ flip httpLbs man . urlEncodedBody meta =<< parseUrl tb+  if responseStatus rsp /= status200+    then return $ Just $ T.concat [ T.pack tb+                                  , ": HTTP Error: "+                                  , T.concat (LT.toChunks $ LT.decodeUtf8 $ responseBody rsp)+                                  ]+    else do+      case fromDocument <$> parseLBS def (responseBody rsp) of+        Right root -> do+          let code = T.concat $ root $// checkName (== "error") >=> descendant >=> content+              msgs = T.concat $ root $// checkName (== "message") >=> descendant >=> content+          if code == "0"+             then return Nothing+             else return $ Just $ T.concat [T.pack tb, ": ", msgs]+        Left  _ -> return $ Just $ T.concat [T.pack tb, ": malformed response"]++putArticleR :: YablogDay -> Text -> Handler RepHtml+putArticleR (YablogDay day) ident = do+  ((result, widget), enctype) <- runFormPost articleForm+  usrId <- requireAuthId+  time  <- liftIO getCurrentTime+  case result of+    FormSuccess (article, tags, tbs) -> do+      suc <- runDB $ do+        Entity key old <- getBy404 $ UniqueArticle (fromEnum day) ident+        if articleAuthor old == usrId+          then do+            replace key article { articleModifiedAt = Just time }+            mapM_ (delete . entityKey) =<< selectList [TagArticle ==. key] []+            mapM_ (insert . Tag key) tags+            return True+          else return False+      if suc+         then do+           errs <- catMaybes <$> mapM (pingTrackback article) tbs+           unless (null errs) $ setMessageI $ T.unlines errs+           redirect $ ArticleR (YablogDay day) $ articleIdent article+         else permissionDenied "You are not allowed to edit this article."+    _ -> do+      setMessageI MsgInvalidInput+      let mCommentTrackbackForm = Nothing :: Maybe (Widget, Text, Widget, Text)+      defaultLayout $(widgetFile "edit-article")++getDeleteR :: YablogDay -> Text -> Handler RepHtml+getDeleteR = deleteArticleR ++getModifyR :: YablogDay -> Text -> Handler RepHtml+getModifyR (YablogDay day) ident = do+  (artId, art, tags) <- runDB $ do+    Entity key art <- getBy404 $ UniqueArticle (fromEnum day) ident+    tags <- map (tagName . entityVal) <$> selectList [TagArticle ==. key] []+    return (key, art, tags)+  (widget, enctype) <- generateFormPost $ articleForm' (Just art) (Just tags)+  (cWidget, cEnctype) <- generateFormPost $ commentDeleteForm artId+  (tWidget, tEnctype) <- generateFormPost $ trackbackDeleteForm artId+  let mCommentTrackbackForm = Just (cWidget, cEnctype, tWidget, tEnctype)+  defaultLayout $ do+    setTitleI $ MsgEdit $ articleTitle art+    $(widgetFile "edit-article")++postDeleteCommentR :: YablogDay -> Text -> Handler ()+postDeleteCommentR = deleteCommentR++postModifyR :: YablogDay -> Text -> Handler RepHtml+postModifyR = putArticleR++deleteArticleR :: YablogDay -> Text -> Handler RepHtml+deleteArticleR (YablogDay day) ident = do+  usrId  <- requireAuthId+  Entity key art <- runDB $ getBy404 $ UniqueArticle (fromEnum day) ident+  if articleAuthor art == usrId+    then do+      runDB $ do+        mapM_ (delete . entityKey) =<< selectList [TagArticle ==. key] []+        delete key+      redirect RootR+    else do+      permissionDenied "You are not allowed to delete that article."++postCommentR :: YablogDay -> Text -> Handler RepHtml+postCommentR (YablogDay date) ident = do+  Entity key article <- runDB $ getBy404 $ UniqueArticle (fromEnum date) ident+  ((result, _), _) <- runFormPost $ commentForm' Nothing key+  case result of+    FormSuccess comment -> do+      ans <- runDB $ insertBy comment+      case ans of+        Right _ -> do+           render <- getUrlRender+           let anchor = commentAnchor comment+           let url = T.concat [render $ ArticleR (toEnum $ articleCreatedDate article) (articleIdent article)+                              , "#", anchor+                              ]+           msgRender <- getMessageRender+           notice (articleAuthor article) (msgRender MsgNewComment) $+             T.unlines [ msgRender (MsgYouHaveNewCommentFor url)+                       , ""+                       , "\"" `T.append` commentBody comment `T.append` "\""+                       , "\nby " `T.append` commentAuthor comment+                       ]+           redirect url+        Left _ -> do+           setMessageI $ MsgAlreadyExists $ articleTitle article+           redirect $ ArticleR (toEnum $ articleCreatedDate article) (articleIdent article)+    _ -> do+      setMessageI MsgInvalidInput+      redirect $ ArticleR (toEnum $ articleCreatedDate article) (articleIdent article)++putCommentR :: YablogDay -> Text -> Handler ()+putCommentR = undefined++deleteTrackbackR :: YablogDay -> Text -> Handler ()+deleteTrackbackR (YablogDay day) ident = do+  Entity uid _ <- requireAuth+  Entity aid art <- runDB $ getBy404 $ UniqueArticle (fromEnum day) ident+  ((result, _), _) <- runFormPost $ trackbackDeleteForm aid+  when (uid /= articleAuthor art) $ do+    permissionDenied "You are not allowed to delete those comment(s)."+  case result of+    FormSuccess cs -> do+      when (any ((/= aid) . trackbackArticle) cs) $ permissionDenied "You can't delete that comment."+      runDB $ mapM_ (\c -> deleteBy $ UniqueTrackback aid (trackbackUrl c)) cs+      redirect $ ArticleR (YablogDay day) (articleIdent art)+    _ -> do+      setMessageI MsgInvalidInput+      redirect $ ModifyR (YablogDay day) (articleIdent art)++postDeleteTrackbackR :: YablogDay -> Text -> Handler ()+postDeleteTrackbackR = deleteTrackbackR++deleteCommentR :: YablogDay -> Text -> Handler ()+deleteCommentR (YablogDay day) ident = do+  Entity uid _ <- requireAuth+  Entity aid art <- runDB $ getBy404 $ UniqueArticle (fromEnum day) ident+  ((result, _), _) <- runFormPost $ commentDeleteForm aid+  when (uid /= articleAuthor art) $ do+    permissionDenied "You are not allowed to delete those comment(s)."+  case result of+    FormSuccess cs -> do+      when (any ((/= aid) . commentArticle) cs) $ permissionDenied "You can't delete that comment."+      runDB $ mapM_ (\c -> deleteBy $ UniqueComment aid (commentAuthor c) (commentCreatedAt c)) cs+      redirect $ ArticleR (YablogDay day) (articleIdent art)+    _ -> do+      setMessageI MsgInvalidInput+      redirect $ ModifyR (YablogDay day) (articleIdent art)++postPreviewR :: Handler RepHtml+postPreviewR = do+  author <- userScreenName . entityVal <$> requireAuth+  ((result, _), _) <- runFormPost articleForm+  case result of+    FormSuccess (article, tags, tbs) -> do+      let editable = False+          comments = []+          mCommentTrackbackForm = Nothing :: Maybe (Widget, Text, Widget, Text)+          title    = articleTitle article+          posted = show $ UTCTime (toEnum $ articleCreatedDate article) (toEnum $ articleCreatedTime article)+          date     = toEnum $ articleCreatedDate article :: Day+          route    = Nothing :: Maybe Text+          ident    = articleIdent article+          mnext    = Nothing+          mprev    = Nothing+      blogTitle <- getBlogTitle+      body <- markupRender Nothing article+      defaultLayout $ do+        $(widgetFile "article-view")+    _ -> notFound++getTagR :: Text -> Handler RepHtml+getTagR tag = do+  articles <- runDB $ do+    mapM (get404 . tagArticle . entityVal) =<< selectList [TagName ==. tag] []+  when (null articles) notFound+  defaultLayout $ do+    setTitleI $ MsgArticlesForTag tag+    $(widgetFile "tag")++postTrackbackR :: YablogDay -> Text -> Handler RepXml+postTrackbackR (YablogDay date) ident = do+  Entity aid _ <- runDB $ getBy404 $ UniqueArticle (fromEnum date) ident+  trackback <- runInputPost $+    Trackback aid <$> iopt textField "title"+                  <*> (liftM unTextarea <$> iopt textareaField "excerpt")+                  <*> ireq textField "url"+                  <*> iopt textField "blog_name"+  man <- httpManager <$> getYesod+  curUrl <- getUrlRender <*> pure (ArticleR (YablogDay date) ident)+  alert <- lift $ do+    rsp <- flip httpLbs man =<< parseUrl (T.unpack $ trackbackUrl trackback)+    if responseStatus rsp == status200+       then+         if T.encodeUtf8 curUrl `BS.isInfixOf` BS.concat (LBS.toChunks (responseBody rsp))+         then return Nothing+         else return $ Just "Your page does not include link to my page."+       else return $ Just "HTTP Error"+  case alert of+    Nothing -> do+      runDB $ do+      ans <- insertBy trackback+      case ans of+        Right _ -> return ()+        Left (Entity k _) -> replace k trackback+      return $ mkXmlResponse [xml|<error>0|]+    Just err ->+        return $ mkXmlResponse [xml|<error>1+                                    <message>#{err}+                               |]++getTrackbackR :: YablogDay -> Text -> Handler RepXml+getTrackbackR (YablogDay date) ident = do+  (art, ts) <- runDB $ do+    Entity aid art <- getBy404 $ UniqueArticle (fromEnum date) ident+    ts <- map entityVal <$> selectList [TrackbackArticle ==. aid] []+    return (art, ts)+  render <- getUrlRender+  desc <- getBlogDescription+  bTitle <- getBlogTitle+  return $ mkXmlResponse [xml|+      <error>+        0+      <rss version="0.91">+        <channel>+          <title>+            #{articleTitle art} - #{bTitle}+          <link>+            #{render $ ArticleR (YablogDay date) ident}+          <description>+            #{articleTitle art} - #{bTitle}+          <language>+            ja+          $forall t <- ts+            <item>+              <title>+                #{fromMaybe (trackbackUrl t) $ trackbackTitle t}+              <link>+                #{trackbackUrl t}+              $maybe e <- trackbackExcerpt t+                <description>+                  #{e}+    |]++mkXmlResponse :: [Node] -> RepXml+mkXmlResponse nodes = RepXml $+  ContentBuilder (fromLazyByteString $ renderLBS def $+                     Document (Prologue [] Nothing []) body [])+                 Nothing+  where+    body = Element "response" [] nodes
+ Handler/Root.hs view
@@ -0,0 +1,70 @@+module Handler.Root where+import qualified Data.Text as T+import Import+import Yesod.Feed+import Control.Arrow+import Data.Time+import Data.Maybe+import Data.List (last)++-- This is a handler function for the GET request method on the RootR+-- resource pattern. All of your resource patterns are defined in+-- config/routes+--+-- The majority of the code you will write in Yesod lives in these handler+-- functions. You can spread them across multiple files if you are so+-- inclined, or create a single monolithic file.+getRootR :: Handler RepHtml+getRootR = do+  offset <- fromMaybe 0 <$> runInputGet (iopt intField "of")+  (articles, hasMore) <- runDB $ do+    as <- selectList [] [OffsetBy offset, LimitTo 5, Desc ArticleCreatedDate, Desc ArticleCreatedTime]+    hasMore <-+      if null as+        then return False+        else do+          let anc = entityVal $ last as+          olds <- count [ ArticleCreatedDate <=. articleCreatedDate anc+                        , FilterOr [ ArticleCreatedDate <.  articleCreatedDate anc+                                   , ArticleCreatedTime <.   articleCreatedTime anc+                                   ]+                        ]+          return (olds > 0)+    cs <- mapM (\(Entity key _) -> count [CommentArticle ==. key]) as+    ts <- mapM (\(Entity key _) -> count [TrackbackArticle ==. key]) as+    return $ (zip [1 :: Int ..] $ zip3 (map entityVal as) cs ts, hasMore)+  title <- getBlogTitle+  defaultLayout $ do+    setTitle $ toHtml $ "Home - " `T.append` title+    $(widgetFile "homepage")++getFeedR :: Handler RepAtomRss+getFeedR = do+  bTitle <- getBlogTitle+  desc <- getBlogDescription+  arts <- runDB $ map entityVal <$> selectList [] [ LimitTo 5+                                              , Desc ArticleCreatedDate+                                              , Desc ArticleCreatedTime+                                              ]+  let ts = map (uncurry UTCTime . ((toEnum . articleCreatedDate) &&& (toEnum . articleCreatedTime))) arts+           ++ mapMaybe articleModifiedAt arts+  es <- mapM toFeedEntry arts+  time <- if null ts then liftIO getCurrentTime else return $ maximum ts+  newsFeed $ Feed { feedTitle = bTitle+                  , feedLinkSelf = FeedR+                  , feedLinkHome = RootR+                  , feedDescription = toHtml desc+                  , feedLanguage = "ja"+                  , feedUpdated = time+                  , feedEntries = es+                  }++toFeedEntry :: Article -> Handler (FeedEntry (Route Yablog))+toFeedEntry art = do+  body <- markupRender Nothing art+  let time = UTCTime (toEnum $ articleCreatedDate art) (toEnum $ articleCreatedTime art)+  return FeedEntry { feedEntryLink    = ArticleR (toEnum $ articleCreatedDate art) (articleTitle art)+                   , feedEntryUpdated = fromMaybe time $ articleModifiedAt art+                   , feedEntryTitle   = articleTitle art+                   , feedEntryContent = body+                   }
+ Handler/User.hs view
@@ -0,0 +1,44 @@+module Handler.User where+import Import+import qualified Data.Text as T++userForm :: Form User+userForm html = do+  Entity _ user <- lift requireAuth+  let ident      = userIdent user+      screenName = userScreenName user+      email      = userEmail user+      locale     = userLocale user+      profile    = userProfile user+      amazon     = userAmazon user+      langs      = [("Japanese" :: Text, "ja"), ("English", "en")]+  flip renderBootstrap html $ do+    User <$> pure ident+         <*> areq textField "screen_name" (Just screenName)+         <*> pure Nothing+         <*> aopt textField "email" (Just email)+         <*> areq (selectFieldList langs ) "locale" (Just locale)+         <*> (T.filter (/= '\r') . unTextarea <$> areq textareaField "profile" (Just $ Textarea profile))+         <*> aopt textField "Amazon Associate" (Just amazon)++getUserSettingsR :: Handler RepHtml+getUserSettingsR = do+  Entity key usr <- requireAuth+  (widget, enctype) <- generateFormPost userForm+  defaultLayout $ do+    setTitle "Settings"+    $(widgetFile "user-settings")++postUserSettingsR :: Handler RepHtml+postUserSettingsR = putUserSettingsR++putUserSettingsR :: Handler RepHtml+putUserSettingsR = do+  Entity key _ <- requireAuth+  ((result, _), _) <- runFormPost userForm+  liftIO $ print result+  case result of+    FormSuccess newUser -> do+         runDB $ replace key newUser+         redirect UserSettingsR+    _ -> permissionDenied "!!!!YOU ARE NOT ALLOWED TO EDIT OTHER'S PROFILE!!!!"
+ Import.hs view
@@ -0,0 +1,63 @@+module Import+    ( module Prelude+    , module Yesod+    , module Foundation+    , module Data.Monoid+    , module Control.Applicative+    , module Settings.StaticFiles+    , module Text.Pandoc+    , module Forms+    , Text+    , articleView+    , articleLink+    , makeSnippet+#if __GLASGOW_HASKELL__ < 740+    , (<>)+#endif+    ) where++import Prelude hiding (writeFile, readFile, head, tail, init, last)+import Yesod   hiding (Route(..), Header(..))+import Foundation+import Data.Monoid (Monoid (mappend, mempty, mconcat))+import Control.Applicative ((<$>), (<*>), pure)+import Data.Text (Text)+import qualified Data.Text as T+import Settings.StaticFiles+import Text.Pandoc hiding (Null)+import Yesod.Auth+import Data.Time+import Forms++articleView :: Maybe String -> Article -> Widget+articleView mid article = do+  render <- lift getUrlRender+  let route = Just $ render $ ArticleR (toEnum $ articleCreatedDate article) (articleIdent article)+  musr <- lift maybeAuthId+  (author, tags) <- lift $ runDB $ do+    Entity key _ <- getBy404 $ UniqueArticle (articleCreatedDate article) (articleIdent article)+    author <- get404 (articleAuthor article)+    tags <- map (tagName . entityVal) <$> selectList [TagArticle ==. key] []+    return (userScreenName author, tags)+  body <- lift $ markupRender mid article+  blogTitle <- lift getBlogTitle+  let title  = articleTitle article+      editable = maybe False (== articleAuthor article) musr+      date = toEnum $ articleCreatedDate article+      posted = show $ UTCTime date (toEnum $ articleCreatedTime article)+      ident = articleIdent article+  $(widgetFile "article-view")++articleLink :: Article -> Route Yablog+articleLink article = ArticleR (toEnum $ articleCreatedDate article)+                               (articleIdent article)++makeSnippet :: Int -> Text -> Text+makeSnippet len t | T.length t <= len = t+                  | otherwise         = T.take len t `T.append` "..."++#if __GLASGOW_HASKELL__ < 740+infixr 5 <>+(<>) :: Monoid m => m -> m -> m+(<>) = mappend+#endif
+ LICENSE view
@@ -0,0 +1,25 @@+The following license covers this documentation, and the source code, except+where otherwise indicated.++Copyright 2012, Hiromi ISHII. All rights reserved.++Redistribution and use in source and binary forms, with or without+modification, are permitted provided that the following conditions are met:++* Redistributions of source code must retain the above copyright notice, this+  list of conditions and the following disclaimer.++* Redistributions in binary form must reproduce the above copyright notice,+  this list of conditions and the following disclaimer in the documentation+  and/or other materials provided with the distribution.++THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS "AS IS" AND ANY EXPRESS OR+IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO+EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY DIRECT, INDIRECT,+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,+OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE+OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF+ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ Markups.hs view
@@ -0,0 +1,66 @@+{-# LANGUAGE PatternGuards, OverloadedStrings #-}+module Markups (addAmazonAssociateLink, readers, renderMarkup) where+import Text.Pandoc.Generic+import qualified Data.ByteString.Char8 as BS+import qualified Data.Text as T+import Network.HTTP.Types+import Data.List+import qualified Data.CaseInsensitive as CI+import Blaze.ByteString.Builder+import Text.Pandoc+import Yesod hiding (insert)+import Data.Maybe+import Prelude+import Data.Char++renderTwitterLink :: Pandoc -> Pandoc+renderTwitterLink = bottomUp go+  where+    go (Link is (url, title))+         | ("twitter":xs) <- T.split (==':') $ T.pack url+         = Link is (T.unpack $ T.append "http://twitter.com/#!/" $ T.intercalate ":" xs, title)+    go i = i++addAmazonAssociateLink :: String -> Pandoc -> Pandoc+addAmazonAssociateLink = bottomUp . procAmazon++renderMarkup :: Maybe String+             -> String             -- ^ markup language+             -> (Pandoc -> Pandoc) -- ^ pandoc transformer+             -> String             -- ^ source+             -> Html               -- ^ Html+renderMarkup mid lang trans =+    writeHtml opts+                  . trans . renderTwitterLink+                  . fromMaybe readMarkdown (lookup (map toLower lang) readers) defaultParserState+  where+    opts = defaultWriterOptions+           { writerHTMLMathMethod =+               MathJax "http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML"+           , writerHighlight = True+           , writerHtml5 = True+           , writerIdentifierPrefix = fromMaybe "" mid+           }+++procAmazon :: String -> Inline -> Inline+procAmazon tag (Link is (url, title))  = Link is (attachTo tag url, title)+procAmazon tag (Image is (url, title)) = Image is (attachTo tag url, title)+procAmazon _   il                      = il++amazons :: [T.Text]+amazons = "www.amazon.com":"amazon.com":concatMap (\cc -> [T.concat [www,"amazon.",co,cc] | www <- ["","www."], co <- ["co.", ""]]) ccTLDs++attachTo :: String -> String -> String+attachTo key url | (p@("http:":"":amazon:paths), qs) <- decodePath (BS.pack url)+                 , amazon `elem` amazons+                 , let cipath = map CI.mk paths+                 , ["o", "asin"] `isPrefixOf` cipath || "dp" `elem` cipath+                                  || ["gp", "product"] `isPrefixOf` cipath+                 , isNothing (lookup "tag" qs)+                 = tail $ BS.unpack $ toByteString $ encodePath p (("tag",Just $ BS.pack key):qs)+attachTo _   url = url+++ccTLDs :: [T.Text]+ccTLDs = ["ac", "ad", "ae", "af", "ag", "ai", "al", "am", "an", "ao", "aq", "ar", "as", "at", "au", "aw", "az", "ba", "bb", "bd", "be", "bf", "bg", "bh", "bi", "bj", "bm", "bn", "bo", "br", "bs", "bt", "bv", "bw", "by", "bz", "ca", "cc", "cd", "cf", "cg", "ch", "ci", "ck", "cl", "cm", "cn", "co", "cr", "cu", "cv", "cx", "cy", "cz", "de", "dj", "dk", "dm", "do", "dz", "ec", "ee", "eg", "eh", "er", "es", "et", "fi", "fj", "fk", "fm", "fo", "fr", "ga", "gd", "ge", "gf", "gg", "gh", "gi", "gl", "gm", "gn", "gp", "gq", "gr", "gs", "gt", "gu", "gw", "gy", "hk", "hm", "hn", "hr", "ht", "hu", "id", "ie", "il", "im", "in", "io", "iq", "ir", "is", "it", "je", "jm", "jo", "jp", "ke", "kg", "kh", "ki", "km", "kn", "kp", "kr", "kw", "ky", "kz", "la", "lb", "lc", "li", "lk", "lr", "ls", "lt", "lu", "lv", "ly", "ma", "mc", "md", "mg", "mh", "mk", "ml", "mm", "mn", "mo", "mp", "mq", "mr", "ms", "mt", "mu", "mv", "mw", "mx", "my", "mz", "na", "nc", "ne", "nf", "ng", "ni", "nl", "no", "np", "nr", "nu", "nz", "om", "pa", "pe", "pf", "pg", "ph", "pk", "pl", "pm", "pn", "pr", "ps", "pt", "pw", "py", "qa", "re", "ro", "ru", "rw", "sa", "sb", "sc", "sd", "se", "sg", "sh", "si", "sj", "sk", "sl", "sm", "sn", "so", "sr", "st", "sv", "sy", "sz", "tc", "td", "tf", "tg", "th", "tj", "tk", "tm", "tn", "to", "tp", "tr", "tt", "tv", "tw", "tz", "ua", "ug", "uk", "um", "us", "uy", "uz", "va", "vc", "ve", "vg", "vi", "vn", "vu", "wf", "ws", "ye", "yt", "yu", "za", "zm", "zw"]
+ Model.hs view
@@ -0,0 +1,16 @@+module Model where++import Prelude+import Yesod+import Data.Text (Text)+import Database.Persist.Quasi+import Database.Persist.MongoDB+import Language.Haskell.TH.Syntax+import Data.Time++-- You can define all of your database entities in the entities file.+-- You can find more information on persistent and how to declare entities+-- at:+-- http://www.yesodweb.com/book/persistent/+share [mkPersist MkPersistSettings { mpsBackend = ConT ''Action }, mkMigrate "migrateAll"]+    $(persistFileWith lowerCaseSettings "config/models")
+ Settings.hs view
@@ -0,0 +1,84 @@+-- | Settings are centralized, as much as possible, into this file. This+-- includes database connection settings, static file locations, etc.+-- In addition, you can configure a number of different aspects of Yesod+-- by overriding methods in the Yesod typeclass. That instance is+-- declared in the Foundation.hs file.+module Settings+    ( widgetFile+    , PersistConfig+    , staticRoot+    , staticDir+    , Extra (..)+    , parseExtra+    ) where++import Prelude+import Text.Shakespeare.Text (st)+import Language.Haskell.TH.Syntax+import Database.Persist.MongoDB (MongoConf)+import Yesod.Default.Config+import qualified Yesod.Default.Util+import Data.Text (Text)+import Data.Yaml+import Control.Applicative++-- | Which Persistent backend this site is using.+type PersistConfig = MongoConf++-- Static setting below. Changing these requires a recompile++-- | The location of static files on your system. This is a file system+-- path. The default value works properly with your scaffolded site.+staticDir :: FilePath+staticDir = "static"++-- | The base URL for your static files. As you can see by the default+-- value, this can simply be "static" appended to your application root.+-- A powerful optimization can be serving static files from a separate+-- domain name. This allows you to use a web server optimized for static+-- files, more easily set expires and cache values, and avoid possibly+-- costly transference of cookies on static files. For more information,+-- please see:+--   http://code.google.com/speed/page-speed/docs/request.html#ServeFromCookielessDomain+--+-- If you change the resource pattern for StaticR in Foundation.hs, you will+-- have to make a corresponding change here.+--+-- To see how this value is used, see urlRenderOverride in Foundation.hs+staticRoot :: AppConfig DefaultEnv x -> Text+staticRoot conf = [st|#{appRoot conf}/static|]+++-- The rest of this file contains settings which rarely need changing by a+-- user.++widgetFile :: String -> Q Exp+#if DEVELOPMENT+widgetFile = Yesod.Default.Util.widgetFileReload+#else+widgetFile = Yesod.Default.Util.widgetFileNoReload+#endif++data Extra = Extra+    { extraCopyright   :: Text+    , extraAnalytics   :: Maybe Text -- ^ Google Analytics+    , extraHatenaStar  :: Maybe Text -- ^ Google Analytics+    , extraAdmins      :: [Text]+    , extraTitle       :: Text+    , extraDescription :: Text+    , extraMarkup      :: Maybe String+    , extraMailAddress :: Maybe Text+    , extraGoogleCSE   :: Maybe Text+    } deriving Show++parseExtra :: DefaultEnv -> Object -> Parser Extra+parseExtra _ o = Extra+    <$> o .:  "copyright"+    <*> o .:? "analytics"+    <*> o .:? "hatenastar"+    <*> o .:  "admins"+    <*> o .:  "title"+    <*> o .:  "description"+    <*> o .:? "markup"+    <*> o .:? "admin-mail"+    <*> o .:? "google-cse"
+ Settings/StaticFiles.hs view
@@ -0,0 +1,21 @@+module Settings.StaticFiles where++import Prelude (IO)+import Yesod.Static+import qualified Yesod.Static as Static+import Settings (staticDir)++-- | use this to create your static file serving site+staticSite :: IO Static.Static+staticSite =+#ifdef DEVELOPMENT+  Static.staticDevel staticDir+#else+  Static.static staticDir+#endif++-- | This generates easy references to files in the static directory at compile time,+--   giving you compile-time verification that referenced files exist.+--   Warning: any files added to your static directory during run-time can't be+--   accessed this way. You'll have to use their FilePath or URL to access them.+$(staticFiles Settings.staticDir)
+ Setup.hs view
@@ -0,0 +1,2 @@+import Distribution.Simple+main = defaultMain
+ Yablog.cabal view
@@ -0,0 +1,130 @@+name:              Yablog+version:           0.0.1.1+license:           BSD3+license-file:      LICENSE+author:            Hiromi ISHII+maintainer:        Hiromi ISHII+synopsis:          A simple blog engine powered by Yesod.+description:       A simple blog engine powered by Yesod.+category:          Web+stability:         Experimental+cabal-version:     >= 1.6+build-type:        Simple+homepage:          http://Yablog.yesodweb.com/++extra-source-files:+  config/models, config/routes, messages/*.msg,+  templates/*.hamlet, templates/*.julius, templates/*.lucius+data-files:+  config/mongoDB.yml, config/settings.yml, config/robots.txt,+  static/css/*.css, static/img/*.png, static/js/*.js+Flag dev+    Description:   Turn on development settings, like auto-reload templates.+    Default:       False++Flag library-only+    Description:   Build for use with "yesod devel"+    Default:       False+++library+    if flag(library-only)+        Buildable: True+    else+        Buildable: False++    exposed-modules: Application+    other-modules:   Foundation+                     Import+                     Model+                     Markups+                     Forms+                     Settings+                     Settings.StaticFiles+                     Handler.Root+                     Handler.Blog+                     Handler.User++    ghc-options:   -Wall -threaded -O0+    cpp-options:   -DDEVELOPMENT++    extensions: TemplateHaskell+                QuasiQuotes+                OverloadedStrings+                NoImplicitPrelude+                CPP+                MultiParamTypeClasses+                TypeFamilies+                GADTs+                GeneralizedNewtypeDeriving+                FlexibleContexts+                EmptyDataDecls++executable         Yablog+    if flag(library-only)+        Buildable: False++    if flag(dev)+        cpp-options:   -DDEVELOPMENT+        ghc-options:   -Wall -threaded -O0+    else+        ghc-options:   -Wall -threaded -O2++    main-is:       main.hs++    extensions: TemplateHaskell+                QuasiQuotes+                OverloadedStrings+                NoImplicitPrelude+                CPP+                OverloadedStrings+                MultiParamTypeClasses+                TypeFamilies+                GADTs+                GeneralizedNewtypeDeriving+                FlexibleContexts+                EmptyDataDecls++    build-depends: base                          >= 4          && < 5+                 , yesod-platform                == 1.0.1+                 , yesod                         >= 1.0        && < 1.1+                 , yesod-core                    >= 1.0        && < 1.1+                 , yesod-auth                    >= 1.0        && < 1.1+                 , yesod-static                  >= 1.0        && < 1.1+                 , yesod-default                 >= 1.0        && < 1.1+                 , yesod-form                    >= 1.0        && < 1.1+                 , yesod-newsfeed                >= 1.0        && < 1.1+                 , mime-mail                     >= 0.3.0.3    && < 0.5+                 , clientsession                 >= 0.7.3      && < 0.8+                 , bytestring                    >= 0.9        && < 0.10+                 , blaze-builder                 >= 0.3        && < 0.4+                 , text                          >= 0.11       && < 0.12+                 , persistent                    >= 0.9        && < 0.10+                 , case-insensitive              >= 0.4        && < 0.5+                 , http-types                    >= 0.6        && < 0.7+                 , persistent-mongoDB            >= 0.9        && < 0.10+                 , template-haskell+                 , hamlet                        >= 1.0        && < 1.1+                 , shakespeare-css               >= 1.0        && < 1.1+                 , shakespeare-js                >= 1.0        && < 1.1+                 , shakespeare-text              >= 1.0        && < 1.1+                 , hjsmin                        >= 0.1        && < 0.2+                 , monad-control                 >= 0.3        && < 0.4+                 , wai-extra                     >= 1.2        && < 1.3+                 , yaml                          >= 0.7        && < 0.8+                 , http-conduit                  >= 1.4        && < 1.5+                 , time                          >= 1.2        && < 1.3+                 , old-locale                    >= 1.0        && < 1.1+                 , pandoc                        >= 1.9        && < 1.10+                 , pandoc-types                  >= 1.9        && < 2.0+                 , xml-hamlet                    >= 0.3        && < 0.4+                 , xml-conduit                   >= 0.7        && < 0.8++source-repository head+  type:     git+  location: http://gitweb.konn-san.com/repo/Yablog/tree/master++source-repository this+  type:     git+  location: https://github.com/konn/Yablog+  tag: 0.0.1.1
+ config/models view
@@ -0,0 +1,48 @@+User+    ident Text+    screenName Text+    password Text Maybe+    email Text Maybe+    locale Text default="ja"+    profile Text default=""+    amazon Text Maybe+    UniqueUser ident+    UserName screenName+  deriving Show Eq++Article+  author     UserId  Eq+  title      Text  Eq+  ident      Text Eq+  markup     String Maybe+  body       String+  createdDate Int Gt Lt Eq Desc+  createdTime Int Gt Lt Eq Desc+  modifiedAt  UTCTime Maybe Gt Lt Eq Desc+  UniqueArticle createdDate ident+  deriving Show Eq++Comment+  author    Text Eq+  body      Text+  password  Text Maybe+  createdAt UTCTime Asc+  article   ArticleId+  UniqueComment article author createdAt+  deriving Show Eq++Tag+  article ArticleId Eq+  name    Text Eq+  deriving Show Eq++Trackback+  article ArticleId Eq+  title Text Eq Maybe+  excerpt Text Maybe+  url Text Eq+  blogName Text Maybe+  UniqueTrackback article url+  deriving Show Eq++ -- By default this file is used in Model.hs (which is imported by Foundation.hs)
+ config/mongoDB.yml view
@@ -0,0 +1,24 @@+Default: &defaults+  user: Yablog+  password: Yablog+  host: localhost+  port: 27017+  database: Yablog+  poolsize: 10++Development:+  <<: *defaults++Test:+  database: Yablog_test+  <<: *defaults++Staging:+  database: Yablog_staging+  poolsize: 100+  <<: *defaults++Production:+  database: Yablog_production+  poolsize: 100+  <<: *defaults
+ config/robots.txt view
@@ -0,0 +1,1 @@+User-agent: *
+ config/routes view
@@ -0,0 +1,20 @@+/static StaticR Static getStatic+/auth   AuthR   Auth   getAuth++/favicon.ico FaviconR GET+/robots.txt RobotsR GET+/feed FeedR GET+/ RootR GET++/preview PreviewR POST+/article/create CreateR GET POST+/article/#YablogDay/#T.Text/edit ModifyR GET POST+/article/#YablogDay/#T.Text ArticleR GET PUT DELETE+/article/#YablogDay/#T.Text/delete DeleteR GET+/article/#YablogDay/#T.Text/comment CommentR POST PUT DELETE+/tag/#T.Text TagR GET+/article/#YablogDay/#T.Text/comment/delete DeleteCommentR POST+/article/#YablogDay/#T.Text/trackback TrackbackR GET POST DELETE+/article/#YablogDay/#T.Text/trackback/delete DeleteTrackbackR POST++/user/settings UserSettingsR GET PUT POST
+ config/settings.yml view
@@ -0,0 +1,28 @@+Default: &defaults+  host: "127.0.0.1"+  port: 3000+  copyright: Insert copyright here+  title: "My Great Blog"+  admins: [] # specify users' idents who can write articles.+             # For example, for Gmail or BrowserId, email-address must be used.+  description: "This is my tiny little blog."+  # analytics: PUT-UA-CODEHERE+  # amazon-associate: amazon-associate-code+  markup: markdown # default markup language+  #hatenastar: "" # hatenastar-id+  admin-mail: "email@example.com" # admin mail+  # google-cse: "" # ids for google cse++Development:+  port: 3000+  <<: *defaults++Testing:+  <<: *defaults++Staging:+  <<: *defaults++Production:+  approot: "http://localhost:3000"+  <<: *defaults
+ main.hs view
@@ -0,0 +1,8 @@+import Prelude              (IO)+import Yesod.Default.Config (fromArgs)+import Yesod.Default.Main   (defaultMain)+import Settings             (parseExtra)+import Application          (getApplication)++main :: IO ()+main = defaultMain (fromArgs parseExtra) getApplication
+ messages/en.msg view
@@ -0,0 +1,34 @@+Edit msg@T.Text: Edit #{msg}+EditArticle: Edit an article+LoggedInAs name@T.Text: You are logged in as #{name}.+NotLoggedIn: You are not logged in.+Login: Login+Logout: Logout+DeleteArticle: DELETE+EditOn: Edit+PostArticle: Post a new article+Comments: Comment(s)+Preview: Preview+InvalidInput: Invalid inputs. Try it again.+AlreadyExists title@T.Text: The article "#{title}" already exists.+ArticlesForTag tag@T.Text: Articles tagged with "#{tag}"+Articles: Articles+LeaveComment: Leave a comment+Article: Article+Title: Title+Tags: Tags+CreatedDate: Created date+CreatedTime: Created time+Name: Name+Comment: Comment+DeleteComment: Delete Comments+DeleteTrackback: Delete Trackbacks+DeleteCommentTrackback: Delete Trackbacks and Comments+Tweet: Tweet+NoComments: No Comments+Trackbacks: Trackbacks+NoTrackbacks: No Trackbacks+Identifier: Identifier+NewComment: You have new comment+YouHaveNewCommentFor url@T.Text: You have new comment for: #{url}+Search: Search
+ messages/ja.msg view
@@ -0,0 +1,34 @@+Edit msg@T.Text: 編集: #{msg}+EditArticle: 記事を編集+LoggedInAs name@T.Text: #{name} としてログイン中。+NotLoggedIn: ログインしていません。+Login: ログイン+Logout: ログアウト+DeleteArticle: 削除+PostArticle: 新しい記事を投稿+Comments: コメント+EditOn: 編集+Preview: プレビュー+InvalidInput: 入力が不正です。+AlreadyExists title@T.Text: 「#{title}」と既に同名の記事が存在します。+ArticlesForTag tag@T.Text: 「#{tag}」タグの記事一覧+Articles: 記事一覧+LeaveComment: コメントする+Article: 内容+Title: タイトル+Tags: タグ+CreatedDate: 作成日+CreatedTime: 作成時間+Name: 名前+Comment: コメント+DeleteCommentTrackback: コメント・トラックバック削除+DeleteComment: コメント削除+DeleteTrackback: トラックバック削除+Tweet: ツイート+NoComments: コメントなし+Trackbacks: トラックバック+NoTrackbacks: トラックバックなし+Identifier: 識別子+NewComment: 新規コメントのお知らせ+YouHaveNewCommentFor url@T.Text: あなたの記事にコメントが付きました: #{url}+Search: 検索
+ static/css/bootstrap-responsive.css view
@@ -0,0 +1,581 @@+/*!+ * Bootstrap Responsive v2.0.1+ *+ * Copyright 2012 Twitter, Inc+ * Licensed under the Apache License v2.0+ * http://www.apache.org/licenses/LICENSE-2.0+ *+ * Designed and built with all the love in the world @twitter by @mdo and @fat.+ */+.clearfix {+  *zoom: 1;+}+.clearfix:before, .clearfix:after {+  display: table;+  content: "";+}+.clearfix:after {+  clear: both;+}+.hidden {+  display: none;+  visibility: hidden;+}+@media (max-width: 480px) {+  .nav-collapse {+    -webkit-transform: translate3d(0, 0, 0);+  }+  .page-header h1 small {+    display: block;+    line-height: 18px;+  }+  input[class*="span"],+  select[class*="span"],+  textarea[class*="span"],+  .uneditable-input {+    display: block;+    width: 100%;+    min-height: 28px;+    /* Make inputs at least the height of their button counterpart */+  +    /* Makes inputs behave like true block-level elements */+  +    -webkit-box-sizing: border-box;+    /* Older Webkit */+  +    -moz-box-sizing: border-box;+    /* Older FF */+  +    -ms-box-sizing: border-box;+    /* IE8 */+  +    box-sizing: border-box;+    /* CSS3 spec*/+  +  }+  .input-prepend input[class*="span"], .input-append input[class*="span"] {+    width: auto;+  }+  input[type="checkbox"], input[type="radio"] {+    border: 1px solid #ccc;+  }+  .form-horizontal .control-group > label {+    float: none;+    width: auto;+    padding-top: 0;+    text-align: left;+  }+  .form-horizontal .controls {+    margin-left: 0;+  }+  .form-horizontal .control-list {+    padding-top: 0;+  }+  .form-horizontal .form-actions {+    padding-left: 10px;+    padding-right: 10px;+  }+  .modal {+    position: absolute;+    top: 10px;+    left: 10px;+    right: 10px;+    width: auto;+    margin: 0;+  }+  .modal.fade.in {+    top: auto;+  }+  .modal-header .close {+    padding: 10px;+    margin: -10px;+  }+  .carousel-caption {+    position: static;+  }+}+@media (max-width: 767px) {+  .container {+    width: auto;+    padding: 0 20px;+  }+  .row-fluid {+    width: 100%;+  }+  .row {+    margin-left: 0;+  }+  .row > [class*="span"], .row-fluid > [class*="span"] {+    float: none;+    display: block;+    width: auto;+    margin: 0;+  }+}+@media (min-width: 768px) and (max-width: 979px) {+  .row {+    margin-left: -20px;+    *zoom: 1;+  }+  .row:before, .row:after {+    display: table;+    content: "";+  }+  .row:after {+    clear: both;+  }+  [class*="span"] {+    float: left;+    margin-left: 20px;+  }+  .span1 {+    width: 42px;+  }+  .span2 {+    width: 104px;+  }+  .span3 {+    width: 166px;+  }+  .span4 {+    width: 228px;+  }+  .span5 {+    width: 290px;+  }+  .span6 {+    width: 352px;+  }+  .span7 {+    width: 414px;+  }+  .span8 {+    width: 476px;+  }+  .span9 {+    width: 538px;+  }+  .span10 {+    width: 600px;+  }+  .span11 {+    width: 662px;+  }+  .span12, .container {+    width: 724px;+  }+  .offset1 {+    margin-left: 82px;+  }+  .offset2 {+    margin-left: 144px;+  }+  .offset3 {+    margin-left: 206px;+  }+  .offset4 {+    margin-left: 268px;+  }+  .offset5 {+    margin-left: 330px;+  }+  .offset6 {+    margin-left: 392px;+  }+  .offset7 {+    margin-left: 454px;+  }+  .offset8 {+    margin-left: 516px;+  }+  .offset9 {+    margin-left: 578px;+  }+  .offset10 {+    margin-left: 640px;+  }+  .offset11 {+    margin-left: 702px;+  }+  .row-fluid {+    width: 100%;+    *zoom: 1;+  }+  .row-fluid:before, .row-fluid:after {+    display: table;+    content: "";+  }+  .row-fluid:after {+    clear: both;+  }+  .row-fluid > [class*="span"] {+    float: left;+    margin-left: 2.762430939%;+  }+  .row-fluid > [class*="span"]:first-child {+    margin-left: 0;+  }+  .row-fluid > .span1 {+    width: 5.801104972%;+  }+  .row-fluid > .span2 {+    width: 14.364640883%;+  }+  .row-fluid > .span3 {+    width: 22.928176794%;+  }+  .row-fluid > .span4 {+    width: 31.491712705%;+  }+  .row-fluid > .span5 {+    width: 40.055248616%;+  }+  .row-fluid > .span6 {+    width: 48.618784527%;+  }+  .row-fluid > .span7 {+    width: 57.182320438000005%;+  }+  .row-fluid > .span8 {+    width: 65.74585634900001%;+  }+  .row-fluid > .span9 {+    width: 74.30939226%;+  }+  .row-fluid > .span10 {+    width: 82.87292817100001%;+  }+  .row-fluid > .span11 {+    width: 91.436464082%;+  }+  .row-fluid > .span12 {+    width: 99.999999993%;+  }+  input.span1, textarea.span1, .uneditable-input.span1 {+    width: 32px;+  }+  input.span2, textarea.span2, .uneditable-input.span2 {+    width: 94px;+  }+  input.span3, textarea.span3, .uneditable-input.span3 {+    width: 156px;+  }+  input.span4, textarea.span4, .uneditable-input.span4 {+    width: 218px;+  }+  input.span5, textarea.span5, .uneditable-input.span5 {+    width: 280px;+  }+  input.span6, textarea.span6, .uneditable-input.span6 {+    width: 342px;+  }+  input.span7, textarea.span7, .uneditable-input.span7 {+    width: 404px;+  }+  input.span8, textarea.span8, .uneditable-input.span8 {+    width: 466px;+  }+  input.span9, textarea.span9, .uneditable-input.span9 {+    width: 528px;+  }+  input.span10, textarea.span10, .uneditable-input.span10 {+    width: 590px;+  }+  input.span11, textarea.span11, .uneditable-input.span11 {+    width: 652px;+  }+  input.span12, textarea.span12, .uneditable-input.span12 {+    width: 714px;+  }+}+@media (max-width: 979px) {+  body {+    padding-top: 0;+  }+  .navbar-fixed-top {+    position: static;+    margin-bottom: 18px;+  }+  .navbar-fixed-top .navbar-inner {+    padding: 5px;+  }+  .navbar .container {+    width: auto;+    padding: 0;+  }+  .navbar .brand {+    padding-left: 10px;+    padding-right: 10px;+    margin: 0 0 0 -5px;+  }+  .navbar .nav-collapse {+    clear: left;+  }+  .navbar .nav {+    float: none;+    margin: 0 0 9px;+  }+  .navbar .nav > li {+    float: none;+  }+  .navbar .nav > li > a {+    margin-bottom: 2px;+  }+  .navbar .nav > .divider-vertical {+    display: none;+  }+  .navbar .nav .nav-header {+    color: #999999;+    text-shadow: none;+  }+  .navbar .nav > li > a, .navbar .dropdown-menu a {+    padding: 6px 15px;+    font-weight: bold;+    color: #999999;+    -webkit-border-radius: 3px;+    -moz-border-radius: 3px;+    border-radius: 3px;+  }+  .navbar .dropdown-menu li + li a {+    margin-bottom: 2px;+  }+  .navbar .nav > li > a:hover, .navbar .dropdown-menu a:hover {+    background-color: #222222;+  }+  .navbar .dropdown-menu {+    position: static;+    top: auto;+    left: auto;+    float: none;+    display: block;+    max-width: none;+    margin: 0 15px;+    padding: 0;+    background-color: transparent;+    border: none;+    -webkit-border-radius: 0;+    -moz-border-radius: 0;+    border-radius: 0;+    -webkit-box-shadow: none;+    -moz-box-shadow: none;+    box-shadow: none;+  }+  .navbar .dropdown-menu:before, .navbar .dropdown-menu:after {+    display: none;+  }+  .navbar .dropdown-menu .divider {+    display: none;+  }+  .navbar-form, .navbar-search {+    float: none;+    padding: 9px 15px;+    margin: 9px 0;+    border-top: 1px solid #222222;+    border-bottom: 1px solid #222222;+    -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);+    -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);+    box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);+  }+  .navbar .nav.pull-right {+    float: none;+    margin-left: 0;+  }+  .navbar-static .navbar-inner {+    padding-left: 10px;+    padding-right: 10px;+  }+  .btn-navbar {+    display: block;+  }+  .nav-collapse {+    overflow: hidden;+    height: 0;+  }+}+@media (min-width: 980px) {+  .nav-collapse.collapse {+    height: auto !important;+  }+}+@media (min-width: 1200px) {+  .row {+    margin-left: -30px;+    *zoom: 1;+  }+  .row:before, .row:after {+    display: table;+    content: "";+  }+  .row:after {+    clear: both;+  }+  [class*="span"] {+    float: left;+    margin-left: 30px;+  }+  .span1 {+    width: 70px;+  }+  .span2 {+    width: 170px;+  }+  .span3 {+    width: 270px;+  }+  .span4 {+    width: 370px;+  }+  .span5 {+    width: 470px;+  }+  .span6 {+    width: 570px;+  }+  .span7 {+    width: 670px;+  }+  .span8 {+    width: 770px;+  }+  .span9 {+    width: 870px;+  }+  .span10 {+    width: 970px;+  }+  .span11 {+    width: 1070px;+  }+  .span12, .container {+    width: 1170px;+  }+  .offset1 {+    margin-left: 130px;+  }+  .offset2 {+    margin-left: 230px;+  }+  .offset3 {+    margin-left: 330px;+  }+  .offset4 {+    margin-left: 430px;+  }+  .offset5 {+    margin-left: 530px;+  }+  .offset6 {+    margin-left: 630px;+  }+  .offset7 {+    margin-left: 730px;+  }+  .offset8 {+    margin-left: 830px;+  }+  .offset9 {+    margin-left: 930px;+  }+  .offset10 {+    margin-left: 1030px;+  }+  .offset11 {+    margin-left: 1130px;+  }+  .row-fluid {+    width: 100%;+    *zoom: 1;+  }+  .row-fluid:before, .row-fluid:after {+    display: table;+    content: "";+  }+  .row-fluid:after {+    clear: both;+  }+  .row-fluid > [class*="span"] {+    float: left;+    margin-left: 2.564102564%;+  }+  .row-fluid > [class*="span"]:first-child {+    margin-left: 0;+  }+  .row-fluid > .span1 {+    width: 5.982905983%;+  }+  .row-fluid > .span2 {+    width: 14.529914530000001%;+  }+  .row-fluid > .span3 {+    width: 23.076923077%;+  }+  .row-fluid > .span4 {+    width: 31.623931624%;+  }+  .row-fluid > .span5 {+    width: 40.170940171000005%;+  }+  .row-fluid > .span6 {+    width: 48.717948718%;+  }+  .row-fluid > .span7 {+    width: 57.264957265%;+  }+  .row-fluid > .span8 {+    width: 65.81196581200001%;+  }+  .row-fluid > .span9 {+    width: 74.358974359%;+  }+  .row-fluid > .span10 {+    width: 82.905982906%;+  }+  .row-fluid > .span11 {+    width: 91.45299145300001%;+  }+  .row-fluid > .span12 {+    width: 100%;+  }+  input.span1, textarea.span1, .uneditable-input.span1 {+    width: 60px;+  }+  input.span2, textarea.span2, .uneditable-input.span2 {+    width: 160px;+  }+  input.span3, textarea.span3, .uneditable-input.span3 {+    width: 260px;+  }+  input.span4, textarea.span4, .uneditable-input.span4 {+    width: 360px;+  }+  input.span5, textarea.span5, .uneditable-input.span5 {+    width: 460px;+  }+  input.span6, textarea.span6, .uneditable-input.span6 {+    width: 560px;+  }+  input.span7, textarea.span7, .uneditable-input.span7 {+    width: 660px;+  }+  input.span8, textarea.span8, .uneditable-input.span8 {+    width: 760px;+  }+  input.span9, textarea.span9, .uneditable-input.span9 {+    width: 860px;+  }+  input.span10, textarea.span10, .uneditable-input.span10 {+    width: 960px;+  }+  input.span11, textarea.span11, .uneditable-input.span11 {+    width: 1060px;+  }+  input.span12, textarea.span12, .uneditable-input.span12 {+    width: 1160px;+  }+  .thumbnails {+    margin-left: -30px;+  }+  .thumbnails > li {+    margin-left: 30px;+  }+}
+ static/css/bootstrap.css view
@@ -0,0 +1,3496 @@+/*!+ * Bootstrap v2.0.1+ *+ * Copyright 2012 Twitter, Inc+ * Licensed under the Apache License v2.0+ * http://www.apache.org/licenses/LICENSE-2.0+ *+ * Designed and built with all the love in the world @twitter by @mdo and @fat.+ */+article,+aside,+details,+figcaption,+figure,+footer,+header,+hgroup,+nav,+section {+  display: block;+}+audio, canvas, video {+  display: inline-block;+  *display: inline;+  *zoom: 1;+}+audio:not([controls]) {+  display: none;+}+html {+  font-size: 100%;+  -webkit-text-size-adjust: 100%;+  -ms-text-size-adjust: 100%;+}+a:focus {+  outline: thin dotted #333;+  outline: 5px auto -webkit-focus-ring-color;+  outline-offset: -2px;+}+a:hover, a:active {+  outline: 0;+}+sub, sup {+  position: relative;+  font-size: 75%;+  line-height: 0;+  vertical-align: baseline;+}+sup {+  top: -0.5em;+}+sub {+  bottom: -0.25em;+}+img {+  max-width: 100%;+  height: auto;+  border: 0;+  -ms-interpolation-mode: bicubic;+}+button,+input,+select,+textarea {+  margin: 0;+  font-size: 100%;+  vertical-align: middle;+}+button, input {+  *overflow: visible;+  line-height: normal;+}+button::-moz-focus-inner, input::-moz-focus-inner {+  padding: 0;+  border: 0;+}+button,+input[type="button"],+input[type="reset"],+input[type="submit"] {+  cursor: pointer;+  -webkit-appearance: button;+}+input[type="search"] {+  -webkit-appearance: textfield;+  -webkit-box-sizing: content-box;+  -moz-box-sizing: content-box;+  box-sizing: content-box;+}+input[type="search"]::-webkit-search-decoration, input[type="search"]::-webkit-search-cancel-button {+  -webkit-appearance: none;+}+textarea {+  overflow: auto;+  vertical-align: top;+}+.clearfix {+  *zoom: 1;+}+.clearfix:before, .clearfix:after {+  display: table;+  content: "";+}+.clearfix:after {+  clear: both;+}+body {+  margin: 0;+  font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;+  font-size: 13px;+  line-height: 18px;+  color: #333333;+  background-color: #ffffff;+}+a {+  color: #0088cc;+  text-decoration: none;+}+a:hover {+  color: #005580;+  text-decoration: underline;+}+.row {+  margin-left: -20px;+  *zoom: 1;+}+.row:before, .row:after {+  display: table;+  content: "";+}+.row:after {+  clear: both;+}+[class*="span"] {+  float: left;+  margin-left: 20px;+}+.span1 {+  width: 60px;+}+.span2 {+  width: 140px;+}+.span3 {+  width: 220px;+}+.span4 {+  width: 300px;+}+.span5 {+  width: 380px;+}+.span6 {+  width: 460px;+}+.span7 {+  width: 540px;+}+.span8 {+  width: 620px;+}+.span9 {+  width: 700px;+}+.span10 {+  width: 780px;+}+.span11 {+  width: 860px;+}+.span12, .container {+  width: 940px;+}+.offset1 {+  margin-left: 100px;+}+.offset2 {+  margin-left: 180px;+}+.offset3 {+  margin-left: 260px;+}+.offset4 {+  margin-left: 340px;+}+.offset5 {+  margin-left: 420px;+}+.offset6 {+  margin-left: 500px;+}+.offset7 {+  margin-left: 580px;+}+.offset8 {+  margin-left: 660px;+}+.offset9 {+  margin-left: 740px;+}+.offset10 {+  margin-left: 820px;+}+.offset11 {+  margin-left: 900px;+}+.row-fluid {+  width: 100%;+  *zoom: 1;+}+.row-fluid:before, .row-fluid:after {+  display: table;+  content: "";+}+.row-fluid:after {+  clear: both;+}+.row-fluid > [class*="span"] {+  float: left;+  margin-left: 2.127659574%;+}+.row-fluid > [class*="span"]:first-child {+  margin-left: 0;+}+.row-fluid > .span1 {+  width: 6.382978723%;+}+.row-fluid > .span2 {+  width: 14.89361702%;+}+.row-fluid > .span3 {+  width: 23.404255317%;+}+.row-fluid > .span4 {+  width: 31.914893614%;+}+.row-fluid > .span5 {+  width: 40.425531911%;+}+.row-fluid > .span6 {+  width: 48.93617020799999%;+}+.row-fluid > .span7 {+  width: 57.446808505%;+}+.row-fluid > .span8 {+  width: 65.95744680199999%;+}+.row-fluid > .span9 {+  width: 74.468085099%;+}+.row-fluid > .span10 {+  width: 82.97872339599999%;+}+.row-fluid > .span11 {+  width: 91.489361693%;+}+.row-fluid > .span12 {+  width: 99.99999998999999%;+}+.container {+  width: 940px;+  margin-left: auto;+  margin-right: auto;+  *zoom: 1;+}+.container:before, .container:after {+  display: table;+  content: "";+}+.container:after {+  clear: both;+}+.container-fluid {+  padding-left: 20px;+  padding-right: 20px;+  *zoom: 1;+}+.container-fluid:before, .container-fluid:after {+  display: table;+  content: "";+}+.container-fluid:after {+  clear: both;+}+p {+  margin: 0 0 9px;+  font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;+  font-size: 13px;+  line-height: 18px;+}+p small {+  font-size: 11px;+  color: #999999;+}+.lead {+  margin-bottom: 18px;+  font-size: 20px;+  font-weight: 200;+  line-height: 27px;+}+h1,+h2,+h3,+h4,+h5,+h6 {+  margin: 0;+  font-weight: bold;+  color: #333333;+  text-rendering: optimizelegibility;+}+h1 small,+h2 small,+h3 small,+h4 small,+h5 small,+h6 small {+  font-weight: normal;+  color: #999999;+}+h1 {+  font-size: 30px;+  line-height: 36px;+}+h1 small {+  font-size: 18px;+}+h2 {+  font-size: 24px;+  line-height: 36px;+}+h2 small {+  font-size: 18px;+}+h3 {+  line-height: 27px;+  font-size: 18px;+}+h3 small {+  font-size: 14px;+}+h4, h5, h6 {+  line-height: 18px;+}+h4 {+  font-size: 14px;+}+h4 small {+  font-size: 12px;+}+h5 {+  font-size: 12px;+}+h6 {+  font-size: 11px;+  color: #999999;+  text-transform: uppercase;+}+.page-header {+  padding-bottom: 17px;+  margin: 18px 0;+  border-bottom: 1px solid #eeeeee;+}+.page-header h1 {+  line-height: 1;+}+ul, ol {+  padding: 0;+  margin: 0 0 9px 25px;+}+ul ul,+ul ol,+ol ol,+ol ul {+  margin-bottom: 0;+}+ul {+  list-style: disc;+}+ol {+  list-style: decimal;+}+li {+  line-height: 18px;+}+ul.unstyled, ol.unstyled {+  margin-left: 0;+  list-style: none;+}+dl {+  margin-bottom: 18px;+}+dt, dd {+  line-height: 18px;+}+dt {+  font-weight: bold;+}+dd {+  margin-left: 9px;+}+hr {+  margin: 18px 0;+  border: 0;+  border-top: 1px solid #eeeeee;+  border-bottom: 1px solid #ffffff;+}+strong {+  font-weight: bold;+}+em {+  font-style: italic;+}+.muted {+  color: #999999;+}+abbr {+  font-size: 90%;+  text-transform: uppercase;+  border-bottom: 1px dotted #ddd;+  cursor: help;+}+blockquote {+  padding: 0 0 0 15px;+  margin: 0 0 18px;+  border-left: 5px solid #eeeeee;+}+blockquote p {+  margin-bottom: 0;+  font-size: 16px;+  font-weight: 300;+  line-height: 22.5px;+}+blockquote small {+  display: block;+  line-height: 18px;+  color: #999999;+}+blockquote small:before {+  content: '\2014 \00A0';+}+blockquote.pull-right {+  float: right;+  padding-left: 0;+  padding-right: 15px;+  border-left: 0;+  border-right: 5px solid #eeeeee;+}+blockquote.pull-right p, blockquote.pull-right small {+  text-align: right;+}+q:before,+q:after,+blockquote:before,+blockquote:after {+  content: "";+}+address {+  display: block;+  margin-bottom: 18px;+  line-height: 18px;+  font-style: normal;+}+small {+  font-size: 100%;+}+cite {+  font-style: normal;+}+code, pre {+  padding: 0 3px 2px;+  font-family: Menlo, Monaco, "Courier New", monospace;+  font-size: 12px;+  color: #333333;+  -webkit-border-radius: 3px;+  -moz-border-radius: 3px;+  border-radius: 3px;+}+code {+  padding: 3px 4px;+  color: #d14;+  background-color: #f7f7f9;+  border: 1px solid #e1e1e8;+}+pre {+  display: block;+  padding: 8.5px;+  margin: 0 0 9px;+  font-size: 12px;+  line-height: 18px;+  background-color: #f5f5f5;+  border: 1px solid #ccc;+  border: 1px solid rgba(0, 0, 0, 0.15);+  -webkit-border-radius: 4px;+  -moz-border-radius: 4px;+  border-radius: 4px;+  white-space: pre;+  white-space: pre-wrap;+  word-break: break-all;+  word-wrap: break-word;+}+pre.prettyprint {+  margin-bottom: 18px;+}+pre code {+  padding: 0;+  color: inherit;+  background-color: transparent;+  border: 0;+}+.pre-scrollable {+  max-height: 340px;+  overflow-y: scroll;+}+form {+  margin: 0 0 18px;+}+fieldset {+  padding: 0;+  margin: 0;+  border: 0;+}+legend {+  display: block;+  width: 100%;+  padding: 0;+  margin-bottom: 27px;+  font-size: 19.5px;+  line-height: 36px;+  color: #333333;+  border: 0;+  border-bottom: 1px solid #eee;+}+legend small {+  font-size: 13.5px;+  color: #999999;+}+label,+input,+button,+select,+textarea {+  font-size: 13px;+  font-weight: normal;+  line-height: 18px;+}+input,+button,+select,+textarea {+  font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;+}+label {+  display: block;+  margin-bottom: 5px;+  color: #333333;+}+input,+textarea,+select,+.uneditable-input {+  display: inline-block;+  width: 210px;+  height: 18px;+  padding: 4px;+  margin-bottom: 9px;+  font-size: 13px;+  line-height: 18px;+  color: #555555;+  border: 1px solid #ccc;+  -webkit-border-radius: 3px;+  -moz-border-radius: 3px;+  border-radius: 3px;+}+.uneditable-textarea {+  width: auto;+  height: auto;+}+label input, label textarea, label select {+  display: block;+}+input[type="image"], input[type="checkbox"], input[type="radio"] {+  width: auto;+  height: auto;+  padding: 0;+  margin: 3px 0;+  *margin-top: 0;+  /* IE7 */++  line-height: normal;+  cursor: pointer;+  -webkit-border-radius: 0;+  -moz-border-radius: 0;+  border-radius: 0;+  border: 0 \9;+  /* IE9 and down */++}+input[type="image"] {+  border: 0;+}+input[type="file"] {+  width: auto;+  padding: initial;+  line-height: initial;+  border: initial;+  background-color: #ffffff;+  background-color: initial;+  -webkit-box-shadow: none;+  -moz-box-shadow: none;+  box-shadow: none;+}+input[type="button"], input[type="reset"], input[type="submit"] {+  width: auto;+  height: auto;+}+select, input[type="file"] {+  height: 28px;+  /* In IE7, the height of the select element cannot be changed by height, only font-size */++  *margin-top: 4px;+  /* For IE7, add top margin to align select with labels */++  line-height: 28px;+}+input[type="file"] {+  line-height: 18px \9;+}+select {+  width: 220px;+  background-color: #ffffff;+}+select[multiple], select[size] {+  height: auto;+}+input[type="image"] {+  -webkit-box-shadow: none;+  -moz-box-shadow: none;+  box-shadow: none;+}+textarea {+  height: auto;+}+input[type="hidden"] {+  display: none;+}+.radio, .checkbox {+  padding-left: 18px;+}+.radio input[type="radio"], .checkbox input[type="checkbox"] {+  float: left;+  margin-left: -18px;+}+.controls > .radio:first-child, .controls > .checkbox:first-child {+  padding-top: 5px;+}+.radio.inline, .checkbox.inline {+  display: inline-block;+  padding-top: 5px;+  margin-bottom: 0;+  vertical-align: middle;+}+.radio.inline + .radio.inline, .checkbox.inline + .checkbox.inline {+  margin-left: 10px;+}+input, textarea {+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);+  -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);+  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);+  -webkit-transition: border linear 0.2s, box-shadow linear 0.2s;+  -moz-transition: border linear 0.2s, box-shadow linear 0.2s;+  -ms-transition: border linear 0.2s, box-shadow linear 0.2s;+  -o-transition: border linear 0.2s, box-shadow linear 0.2s;+  transition: border linear 0.2s, box-shadow linear 0.2s;+}+input:focus, textarea:focus {+  border-color: rgba(82, 168, 236, 0.8);+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6);+  -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6);+  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6);+  outline: 0;+  outline: thin dotted \9;+  /* IE6-9 */++}+input[type="file"]:focus,+input[type="radio"]:focus,+input[type="checkbox"]:focus,+select:focus {+  -webkit-box-shadow: none;+  -moz-box-shadow: none;+  box-shadow: none;+  outline: thin dotted #333;+  outline: 5px auto -webkit-focus-ring-color;+  outline-offset: -2px;+}+.input-mini {+  width: 60px;+}+.input-small {+  width: 90px;+}+.input-medium {+  width: 150px;+}+.input-large {+  width: 210px;+}+.input-xlarge {+  width: 270px;+}+.input-xxlarge {+  width: 530px;+}+input[class*="span"],+select[class*="span"],+textarea[class*="span"],+.uneditable-input {+  float: none;+  margin-left: 0;+}+input.span1, textarea.span1, .uneditable-input.span1 {+  width: 50px;+}+input.span2, textarea.span2, .uneditable-input.span2 {+  width: 130px;+}+input.span3, textarea.span3, .uneditable-input.span3 {+  width: 210px;+}+input.span4, textarea.span4, .uneditable-input.span4 {+  width: 290px;+}+input.span5, textarea.span5, .uneditable-input.span5 {+  width: 370px;+}+input.span6, textarea.span6, .uneditable-input.span6 {+  width: 450px;+}+input.span7, textarea.span7, .uneditable-input.span7 {+  width: 530px;+}+input.span8, textarea.span8, .uneditable-input.span8 {+  width: 610px;+}+input.span9, textarea.span9, .uneditable-input.span9 {+  width: 690px;+}+input.span10, textarea.span10, .uneditable-input.span10 {+  width: 770px;+}+input.span11, textarea.span11, .uneditable-input.span11 {+  width: 850px;+}+input.span12, textarea.span12, .uneditable-input.span12 {+  width: 930px;+}+input[disabled],+select[disabled],+textarea[disabled],+input[readonly],+select[readonly],+textarea[readonly] {+  background-color: #f5f5f5;+  border-color: #ddd;+  cursor: not-allowed;+}+.control-group.warning > label, .control-group.warning .help-block, .control-group.warning .help-inline {+  color: #c09853;+}+.control-group.warning input, .control-group.warning select, .control-group.warning textarea {+  color: #c09853;+  border-color: #c09853;+}+.control-group.warning input:focus, .control-group.warning select:focus, .control-group.warning textarea:focus {+  border-color: #a47e3c;+  -webkit-box-shadow: 0 0 6px #dbc59e;+  -moz-box-shadow: 0 0 6px #dbc59e;+  box-shadow: 0 0 6px #dbc59e;+}+.control-group.warning .input-prepend .add-on, .control-group.warning .input-append .add-on {+  color: #c09853;+  background-color: #fcf8e3;+  border-color: #c09853;+}+.control-group.error > label, .control-group.error .help-block, .control-group.error .help-inline {+  color: #b94a48;+}+.control-group.error input, .control-group.error select, .control-group.error textarea {+  color: #b94a48;+  border-color: #b94a48;+}+.control-group.error input:focus, .control-group.error select:focus, .control-group.error textarea:focus {+  border-color: #953b39;+  -webkit-box-shadow: 0 0 6px #d59392;+  -moz-box-shadow: 0 0 6px #d59392;+  box-shadow: 0 0 6px #d59392;+}+.control-group.error .input-prepend .add-on, .control-group.error .input-append .add-on {+  color: #b94a48;+  background-color: #f2dede;+  border-color: #b94a48;+}+.control-group.success > label, .control-group.success .help-block, .control-group.success .help-inline {+  color: #468847;+}+.control-group.success input, .control-group.success select, .control-group.success textarea {+  color: #468847;+  border-color: #468847;+}+.control-group.success input:focus, .control-group.success select:focus, .control-group.success textarea:focus {+  border-color: #356635;+  -webkit-box-shadow: 0 0 6px #7aba7b;+  -moz-box-shadow: 0 0 6px #7aba7b;+  box-shadow: 0 0 6px #7aba7b;+}+.control-group.success .input-prepend .add-on, .control-group.success .input-append .add-on {+  color: #468847;+  background-color: #dff0d8;+  border-color: #468847;+}+input:focus:required:invalid, textarea:focus:required:invalid, select:focus:required:invalid {+  color: #b94a48;+  border-color: #ee5f5b;+}+input:focus:required:invalid:focus, textarea:focus:required:invalid:focus, select:focus:required:invalid:focus {+  border-color: #e9322d;+  -webkit-box-shadow: 0 0 6px #f8b9b7;+  -moz-box-shadow: 0 0 6px #f8b9b7;+  box-shadow: 0 0 6px #f8b9b7;+}+.form-actions {+  padding: 17px 20px 18px;+  margin-top: 18px;+  margin-bottom: 18px;+  background-color: #f5f5f5;+  border-top: 1px solid #ddd;+}+.uneditable-input {+  display: block;+  background-color: #ffffff;+  border-color: #eee;+  -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025);+  -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025);+  box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025);+  cursor: not-allowed;+}+:-moz-placeholder {+  color: #999999;+}+::-webkit-input-placeholder {+  color: #999999;+}+.help-block {+  display: block;+  margin-top: 5px;+  margin-bottom: 0;+  color: #999999;+}+.help-inline {+  display: inline-block;+  *display: inline;+  /* IE7 inline-block hack */++  *zoom: 1;+  margin-bottom: 9px;+  vertical-align: middle;+  padding-left: 5px;+}+.input-prepend, .input-append {+  margin-bottom: 5px;+  *zoom: 1;+}+.input-prepend:before,+.input-append:before,+.input-prepend:after,+.input-append:after {+  display: table;+  content: "";+}+.input-prepend:after, .input-append:after {+  clear: both;+}+.input-prepend input,+.input-append input,+.input-prepend .uneditable-input,+.input-append .uneditable-input {+  -webkit-border-radius: 0 3px 3px 0;+  -moz-border-radius: 0 3px 3px 0;+  border-radius: 0 3px 3px 0;+}+.input-prepend input:focus,+.input-append input:focus,+.input-prepend .uneditable-input:focus,+.input-append .uneditable-input:focus {+  position: relative;+  z-index: 2;+}+.input-prepend .uneditable-input, .input-append .uneditable-input {+  border-left-color: #ccc;+}+.input-prepend .add-on, .input-append .add-on {+  float: left;+  display: block;+  width: auto;+  min-width: 16px;+  height: 18px;+  margin-right: -1px;+  padding: 4px 5px;+  font-weight: normal;+  line-height: 18px;+  color: #999999;+  text-align: center;+  text-shadow: 0 1px 0 #ffffff;+  background-color: #f5f5f5;+  border: 1px solid #ccc;+  -webkit-border-radius: 3px 0 0 3px;+  -moz-border-radius: 3px 0 0 3px;+  border-radius: 3px 0 0 3px;+}+.input-prepend .active, .input-append .active {+  background-color: #a9dba9;+  border-color: #46a546;+}+.input-prepend .add-on {+  *margin-top: 1px;+  /* IE6-7 */++}+.input-append input, .input-append .uneditable-input {+  float: left;+  -webkit-border-radius: 3px 0 0 3px;+  -moz-border-radius: 3px 0 0 3px;+  border-radius: 3px 0 0 3px;+}+.input-append .uneditable-input {+  border-left-color: #eee;+  border-right-color: #ccc;+}+.input-append .add-on {+  margin-right: 0;+  margin-left: -1px;+  -webkit-border-radius: 0 3px 3px 0;+  -moz-border-radius: 0 3px 3px 0;+  border-radius: 0 3px 3px 0;+}+.input-append input:first-child {+  *margin-left: -160px;+}+.input-append input:first-child + .add-on {+  *margin-left: -21px;+}+.search-query {+  padding-left: 14px;+  padding-right: 14px;+  margin-bottom: 0;+  -webkit-border-radius: 14px;+  -moz-border-radius: 14px;+  border-radius: 14px;+}+.form-search input,+.form-inline input,+.form-horizontal input,+.form-search textarea,+.form-inline textarea,+.form-horizontal textarea,+.form-search select,+.form-inline select,+.form-horizontal select,+.form-search .help-inline,+.form-inline .help-inline,+.form-horizontal .help-inline,+.form-search .uneditable-input,+.form-inline .uneditable-input,+.form-horizontal .uneditable-input {+  display: inline-block;+  margin-bottom: 0;+}+.form-search .hide, .form-inline .hide, .form-horizontal .hide {+  display: none;+}+.form-search label,+.form-inline label,+.form-search .input-append,+.form-inline .input-append,+.form-search .input-prepend,+.form-inline .input-prepend {+  display: inline-block;+}+.form-search .input-append .add-on,+.form-inline .input-prepend .add-on,+.form-search .input-append .add-on,+.form-inline .input-prepend .add-on {+  vertical-align: middle;+}+.form-search .radio,+.form-inline .radio,+.form-search .checkbox,+.form-inline .checkbox {+  margin-bottom: 0;+  vertical-align: middle;+}+.control-group {+  margin-bottom: 9px;+}+legend + .control-group {+  margin-top: 18px;+  -webkit-margin-top-collapse: separate;+}+.form-horizontal .control-group {+  margin-bottom: 18px;+  *zoom: 1;+}+.form-horizontal .control-group:before, .form-horizontal .control-group:after {+  display: table;+  content: "";+}+.form-horizontal .control-group:after {+  clear: both;+}+.form-horizontal .control-label {+  float: left;+  width: 140px;+  padding-top: 5px;+  text-align: right;+}+.form-horizontal .controls {+  margin-left: 160px;+}+.form-horizontal .form-actions {+  padding-left: 160px;+}+table {+  max-width: 100%;+  border-collapse: collapse;+  border-spacing: 0;+}+.table {+  width: 100%;+  margin-bottom: 18px;+}+.table th, .table td {+  padding: 8px;+  line-height: 18px;+  text-align: left;+  vertical-align: top;+  border-top: 1px solid #ddd;+}+.table th {+  font-weight: bold;+}+.table thead th {+  vertical-align: bottom;+}+.table thead:first-child tr th, .table thead:first-child tr td {+  border-top: 0;+}+.table tbody + tbody {+  border-top: 2px solid #ddd;+}+.table-condensed th, .table-condensed td {+  padding: 4px 5px;+}+.table-bordered {+  border: 1px solid #ddd;+  border-collapse: separate;+  *border-collapse: collapsed;+  -webkit-border-radius: 4px;+  -moz-border-radius: 4px;+  border-radius: 4px;+}+.table-bordered th + th,+.table-bordered td + td,+.table-bordered th + td,+.table-bordered td + th {+  border-left: 1px solid #ddd;+}+.table-bordered thead:first-child tr:first-child th, .table-bordered tbody:first-child tr:first-child th, .table-bordered tbody:first-child tr:first-child td {+  border-top: 0;+}+.table-bordered thead:first-child tr:first-child th:first-child, .table-bordered tbody:first-child tr:first-child td:first-child {+  -webkit-border-radius: 4px 0 0 0;+  -moz-border-radius: 4px 0 0 0;+  border-radius: 4px 0 0 0;+}+.table-bordered thead:first-child tr:first-child th:last-child, .table-bordered tbody:first-child tr:first-child td:last-child {+  -webkit-border-radius: 0 4px 0 0;+  -moz-border-radius: 0 4px 0 0;+  border-radius: 0 4px 0 0;+}+.table-bordered thead:last-child tr:last-child th:first-child, .table-bordered tbody:last-child tr:last-child td:first-child {+  -webkit-border-radius: 0 0 0 4px;+  -moz-border-radius: 0 0 0 4px;+  border-radius: 0 0 0 4px;+}+.table-bordered thead:last-child tr:last-child th:last-child, .table-bordered tbody:last-child tr:last-child td:last-child {+  -webkit-border-radius: 0 0 4px 0;+  -moz-border-radius: 0 0 4px 0;+  border-radius: 0 0 4px 0;+}+.table-striped tbody tr:nth-child(odd) td, .table-striped tbody tr:nth-child(odd) th {+  background-color: #f9f9f9;+}+.table tbody tr:hover td, .table tbody tr:hover th {+  background-color: #f5f5f5;+}+table .span1 {+  float: none;+  width: 44px;+  margin-left: 0;+}+table .span2 {+  float: none;+  width: 124px;+  margin-left: 0;+}+table .span3 {+  float: none;+  width: 204px;+  margin-left: 0;+}+table .span4 {+  float: none;+  width: 284px;+  margin-left: 0;+}+table .span5 {+  float: none;+  width: 364px;+  margin-left: 0;+}+table .span6 {+  float: none;+  width: 444px;+  margin-left: 0;+}+table .span7 {+  float: none;+  width: 524px;+  margin-left: 0;+}+table .span8 {+  float: none;+  width: 604px;+  margin-left: 0;+}+table .span9 {+  float: none;+  width: 684px;+  margin-left: 0;+}+table .span10 {+  float: none;+  width: 764px;+  margin-left: 0;+}+table .span11 {+  float: none;+  width: 844px;+  margin-left: 0;+}+table .span12 {+  float: none;+  width: 924px;+  margin-left: 0;+}+[class^="icon-"], [class*=" icon-"] {+  display: inline-block;+  width: 14px;+  height: 14px;+  line-height: 14px;+  vertical-align: text-top;+  background-image: url("../img/glyphicons-halflings.png");+  background-position: 14px 14px;+  background-repeat: no-repeat;+  *margin-right: .3em;+}+[class^="icon-"]:last-child, [class*=" icon-"]:last-child {+  *margin-left: 0;+}+.icon-white {+  background-image: url("../img/glyphicons-halflings-white.png");+}+.icon-glass {+  background-position: 0      0;+}+.icon-music {+  background-position: -24px 0;+}+.icon-search {+  background-position: -48px 0;+}+.icon-envelope {+  background-position: -72px 0;+}+.icon-heart {+  background-position: -96px 0;+}+.icon-star {+  background-position: -120px 0;+}+.icon-star-empty {+  background-position: -144px 0;+}+.icon-user {+  background-position: -168px 0;+}+.icon-film {+  background-position: -192px 0;+}+.icon-th-large {+  background-position: -216px 0;+}+.icon-th {+  background-position: -240px 0;+}+.icon-th-list {+  background-position: -264px 0;+}+.icon-ok {+  background-position: -288px 0;+}+.icon-remove {+  background-position: -312px 0;+}+.icon-zoom-in {+  background-position: -336px 0;+}+.icon-zoom-out {+  background-position: -360px 0;+}+.icon-off {+  background-position: -384px 0;+}+.icon-signal {+  background-position: -408px 0;+}+.icon-cog {+  background-position: -432px 0;+}+.icon-trash {+  background-position: -456px 0;+}+.icon-home {+  background-position: 0 -24px;+}+.icon-file {+  background-position: -24px -24px;+}+.icon-time {+  background-position: -48px -24px;+}+.icon-road {+  background-position: -72px -24px;+}+.icon-download-alt {+  background-position: -96px -24px;+}+.icon-download {+  background-position: -120px -24px;+}+.icon-upload {+  background-position: -144px -24px;+}+.icon-inbox {+  background-position: -168px -24px;+}+.icon-play-circle {+  background-position: -192px -24px;+}+.icon-repeat {+  background-position: -216px -24px;+}+.icon-refresh {+  background-position: -240px -24px;+}+.icon-list-alt {+  background-position: -264px -24px;+}+.icon-lock {+  background-position: -287px -24px;+}+.icon-flag {+  background-position: -312px -24px;+}+.icon-headphones {+  background-position: -336px -24px;+}+.icon-volume-off {+  background-position: -360px -24px;+}+.icon-volume-down {+  background-position: -384px -24px;+}+.icon-volume-up {+  background-position: -408px -24px;+}+.icon-qrcode {+  background-position: -432px -24px;+}+.icon-barcode {+  background-position: -456px -24px;+}+.icon-tag {+  background-position: 0 -48px;+}+.icon-tags {+  background-position: -25px -48px;+}+.icon-book {+  background-position: -48px -48px;+}+.icon-bookmark {+  background-position: -72px -48px;+}+.icon-print {+  background-position: -96px -48px;+}+.icon-camera {+  background-position: -120px -48px;+}+.icon-font {+  background-position: -144px -48px;+}+.icon-bold {+  background-position: -167px -48px;+}+.icon-italic {+  background-position: -192px -48px;+}+.icon-text-height {+  background-position: -216px -48px;+}+.icon-text-width {+  background-position: -240px -48px;+}+.icon-align-left {+  background-position: -264px -48px;+}+.icon-align-center {+  background-position: -288px -48px;+}+.icon-align-right {+  background-position: -312px -48px;+}+.icon-align-justify {+  background-position: -336px -48px;+}+.icon-list {+  background-position: -360px -48px;+}+.icon-indent-left {+  background-position: -384px -48px;+}+.icon-indent-right {+  background-position: -408px -48px;+}+.icon-facetime-video {+  background-position: -432px -48px;+}+.icon-picture {+  background-position: -456px -48px;+}+.icon-pencil {+  background-position: 0 -72px;+}+.icon-map-marker {+  background-position: -24px -72px;+}+.icon-adjust {+  background-position: -48px -72px;+}+.icon-tint {+  background-position: -72px -72px;+}+.icon-edit {+  background-position: -96px -72px;+}+.icon-share {+  background-position: -120px -72px;+}+.icon-check {+  background-position: -144px -72px;+}+.icon-move {+  background-position: -168px -72px;+}+.icon-step-backward {+  background-position: -192px -72px;+}+.icon-fast-backward {+  background-position: -216px -72px;+}+.icon-backward {+  background-position: -240px -72px;+}+.icon-play {+  background-position: -264px -72px;+}+.icon-pause {+  background-position: -288px -72px;+}+.icon-stop {+  background-position: -312px -72px;+}+.icon-forward {+  background-position: -336px -72px;+}+.icon-fast-forward {+  background-position: -360px -72px;+}+.icon-step-forward {+  background-position: -384px -72px;+}+.icon-eject {+  background-position: -408px -72px;+}+.icon-chevron-left {+  background-position: -432px -72px;+}+.icon-chevron-right {+  background-position: -456px -72px;+}+.icon-plus-sign {+  background-position: 0 -96px;+}+.icon-minus-sign {+  background-position: -24px -96px;+}+.icon-remove-sign {+  background-position: -48px -96px;+}+.icon-ok-sign {+  background-position: -72px -96px;+}+.icon-question-sign {+  background-position: -96px -96px;+}+.icon-info-sign {+  background-position: -120px -96px;+}+.icon-screenshot {+  background-position: -144px -96px;+}+.icon-remove-circle {+  background-position: -168px -96px;+}+.icon-ok-circle {+  background-position: -192px -96px;+}+.icon-ban-circle {+  background-position: -216px -96px;+}+.icon-arrow-left {+  background-position: -240px -96px;+}+.icon-arrow-right {+  background-position: -264px -96px;+}+.icon-arrow-up {+  background-position: -289px -96px;+}+.icon-arrow-down {+  background-position: -312px -96px;+}+.icon-share-alt {+  background-position: -336px -96px;+}+.icon-resize-full {+  background-position: -360px -96px;+}+.icon-resize-small {+  background-position: -384px -96px;+}+.icon-plus {+  background-position: -408px -96px;+}+.icon-minus {+  background-position: -433px -96px;+}+.icon-asterisk {+  background-position: -456px -96px;+}+.icon-exclamation-sign {+  background-position: 0 -120px;+}+.icon-gift {+  background-position: -24px -120px;+}+.icon-leaf {+  background-position: -48px -120px;+}+.icon-fire {+  background-position: -72px -120px;+}+.icon-eye-open {+  background-position: -96px -120px;+}+.icon-eye-close {+  background-position: -120px -120px;+}+.icon-warning-sign {+  background-position: -144px -120px;+}+.icon-plane {+  background-position: -168px -120px;+}+.icon-calendar {+  background-position: -192px -120px;+}+.icon-random {+  background-position: -216px -120px;+}+.icon-comment {+  background-position: -240px -120px;+}+.icon-magnet {+  background-position: -264px -120px;+}+.icon-chevron-up {+  background-position: -288px -120px;+}+.icon-chevron-down {+  background-position: -313px -119px;+}+.icon-retweet {+  background-position: -336px -120px;+}+.icon-shopping-cart {+  background-position: -360px -120px;+}+.icon-folder-close {+  background-position: -384px -120px;+}+.icon-folder-open {+  background-position: -408px -120px;+}+.icon-resize-vertical {+  background-position: -432px -119px;+}+.icon-resize-horizontal {+  background-position: -456px -118px;+}+.dropdown {+  position: relative;+}+.dropdown-toggle {+  *margin-bottom: -3px;+}+.dropdown-toggle:active, .open .dropdown-toggle {+  outline: 0;+}+.caret {+  display: inline-block;+  width: 0;+  height: 0;+  text-indent: -99999px;+  *text-indent: 0;+  vertical-align: top;+  border-left: 4px solid transparent;+  border-right: 4px solid transparent;+  border-top: 4px solid #000000;+  opacity: 0.3;+  filter: alpha(opacity=30);+  content: "\2193";+}+.dropdown .caret {+  margin-top: 8px;+  margin-left: 2px;+}+.dropdown:hover .caret, .open.dropdown .caret {+  opacity: 1;+  filter: alpha(opacity=100);+}+.dropdown-menu {+  position: absolute;+  top: 100%;+  left: 0;+  z-index: 1000;+  float: left;+  display: none;+  min-width: 160px;+  _width: 160px;+  padding: 4px 0;+  margin: 0;+  list-style: none;+  background-color: #ffffff;+  border-color: #ccc;+  border-color: rgba(0, 0, 0, 0.2);+  border-style: solid;+  border-width: 1px;+  -webkit-border-radius: 0 0 5px 5px;+  -moz-border-radius: 0 0 5px 5px;+  border-radius: 0 0 5px 5px;+  -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);+  -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);+  box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);+  -webkit-background-clip: padding-box;+  -moz-background-clip: padding;+  background-clip: padding-box;+  *border-right-width: 2px;+  *border-bottom-width: 2px;+}+.dropdown-menu.bottom-up {+  top: auto;+  bottom: 100%;+  margin-bottom: 2px;+}+.dropdown-menu .divider {+  height: 1px;+  margin: 5px 1px;+  overflow: hidden;+  background-color: #e5e5e5;+  border-bottom: 1px solid #ffffff;+  *width: 100%;+  *margin: -5px 0 5px;+}+.dropdown-menu a {+  display: block;+  padding: 3px 15px;+  clear: both;+  font-weight: normal;+  line-height: 18px;+  color: #555555;+  white-space: nowrap;+}+.dropdown-menu li > a:hover, .dropdown-menu .active > a, .dropdown-menu .active > a:hover {+  color: #ffffff;+  text-decoration: none;+  background-color: #0088cc;+}+.dropdown.open {+  *z-index: 1000;+}+.dropdown.open .dropdown-toggle {+  color: #ffffff;+  background: #ccc;+  background: rgba(0, 0, 0, 0.3);+}+.dropdown.open .dropdown-menu {+  display: block;+}+.typeahead {+  margin-top: 2px;+  -webkit-border-radius: 4px;+  -moz-border-radius: 4px;+  border-radius: 4px;+}+.well {+  min-height: 20px;+  padding: 19px;+  margin-bottom: 20px;+  background-color: #f5f5f5;+  border: 1px solid #eee;+  border: 1px solid rgba(0, 0, 0, 0.05);+  -webkit-border-radius: 4px;+  -moz-border-radius: 4px;+  border-radius: 4px;+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);+  -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);+  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);+}+.well blockquote {+  border-color: #ddd;+  border-color: rgba(0, 0, 0, 0.15);+}+.fade {+  -webkit-transition: opacity 0.15s linear;+  -moz-transition: opacity 0.15s linear;+  -ms-transition: opacity 0.15s linear;+  -o-transition: opacity 0.15s linear;+  transition: opacity 0.15s linear;+  opacity: 0;+}+.fade.in {+  opacity: 1;+}+.collapse {+  -webkit-transition: height 0.35s ease;+  -moz-transition: height 0.35s ease;+  -ms-transition: height 0.35s ease;+  -o-transition: height 0.35s ease;+  transition: height 0.35s ease;+  position: relative;+  overflow: hidden;+  height: 0;+}+.collapse.in {+  height: auto;+}+.close {+  float: right;+  font-size: 20px;+  font-weight: bold;+  line-height: 18px;+  color: #000000;+  text-shadow: 0 1px 0 #ffffff;+  opacity: 0.2;+  filter: alpha(opacity=20);+}+.close:hover {+  color: #000000;+  text-decoration: none;+  opacity: 0.4;+  filter: alpha(opacity=40);+  cursor: pointer;+}+.btn {+  display: inline-block;+  padding: 4px 10px 4px;+  margin-bottom: 0;+  font-size: 13px;+  line-height: 18px;+  color: #333333;+  text-align: center;+  text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75);+  vertical-align: middle;+  background-color: #f5f5f5;+  background-image: -moz-linear-gradient(top, #ffffff, #e6e6e6);+  background-image: -ms-linear-gradient(top, #ffffff, #e6e6e6);+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#e6e6e6));+  background-image: -webkit-linear-gradient(top, #ffffff, #e6e6e6);+  background-image: -o-linear-gradient(top, #ffffff, #e6e6e6);+  background-image: linear-gradient(top, #ffffff, #e6e6e6);+  background-repeat: repeat-x;+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#e6e6e6', GradientType=0);+  border-color: #e6e6e6 #e6e6e6 #bfbfbf;+  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);+  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);+  border: 1px solid #ccc;+  border-bottom-color: #bbb;+  -webkit-border-radius: 4px;+  -moz-border-radius: 4px;+  border-radius: 4px;+  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);+  -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);+  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);+  cursor: pointer;+  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);+  *margin-left: .3em;+}+.btn:hover,+.btn:active,+.btn.active,+.btn.disabled,+.btn[disabled] {+  background-color: #e6e6e6;+}+.btn:active, .btn.active {+  background-color: #cccccc \9;+}+.btn:first-child {+  *margin-left: 0;+}+.btn:hover {+  color: #333333;+  text-decoration: none;+  background-color: #e6e6e6;+  background-position: 0 -15px;+  -webkit-transition: background-position 0.1s linear;+  -moz-transition: background-position 0.1s linear;+  -ms-transition: background-position 0.1s linear;+  -o-transition: background-position 0.1s linear;+  transition: background-position 0.1s linear;+}+.btn:focus {+  outline: thin dotted #333;+  outline: 5px auto -webkit-focus-ring-color;+  outline-offset: -2px;+}+.btn.active, .btn:active {+  background-image: none;+  -webkit-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);+  -moz-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);+  box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);+  background-color: #e6e6e6;+  background-color: #d9d9d9 \9;+  outline: 0;+}+.btn.disabled, .btn[disabled] {+  cursor: default;+  background-image: none;+  background-color: #e6e6e6;+  opacity: 0.65;+  filter: alpha(opacity=65);+  -webkit-box-shadow: none;+  -moz-box-shadow: none;+  box-shadow: none;+}+.btn-large {+  padding: 9px 14px;+  font-size: 15px;+  line-height: normal;+  -webkit-border-radius: 5px;+  -moz-border-radius: 5px;+  border-radius: 5px;+}+.btn-large [class^="icon-"] {+  margin-top: 1px;+}+.btn-small {+  padding: 5px 9px;+  font-size: 11px;+  line-height: 16px;+}+.btn-small [class^="icon-"] {+  margin-top: -1px;+}+.btn-mini {+  padding: 2px 6px;+  font-size: 11px;+  line-height: 14px;+}+.btn-primary,+.btn-primary:hover,+.btn-warning,+.btn-warning:hover,+.btn-danger,+.btn-danger:hover,+.btn-success,+.btn-success:hover,+.btn-info,+.btn-info:hover,+.btn-inverse,+.btn-inverse:hover {+  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);+  color: #ffffff;+}+.btn-primary.active,+.btn-warning.active,+.btn-danger.active,+.btn-success.active,+.btn-info.active,+.btn-dark.active {+  color: rgba(255, 255, 255, 0.75);+}+.btn-primary {+  background-color: #006dcc;+  background-image: -moz-linear-gradient(top, #0088cc, #0044cc);+  background-image: -ms-linear-gradient(top, #0088cc, #0044cc);+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc));+  background-image: -webkit-linear-gradient(top, #0088cc, #0044cc);+  background-image: -o-linear-gradient(top, #0088cc, #0044cc);+  background-image: linear-gradient(top, #0088cc, #0044cc);+  background-repeat: repeat-x;+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#0088cc', endColorstr='#0044cc', GradientType=0);+  border-color: #0044cc #0044cc #002a80;+  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);+  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);+}+.btn-primary:hover,+.btn-primary:active,+.btn-primary.active,+.btn-primary.disabled,+.btn-primary[disabled] {+  background-color: #0044cc;+}+.btn-primary:active, .btn-primary.active {+  background-color: #003399 \9;+}+.btn-warning {+  background-color: #faa732;+  background-image: -moz-linear-gradient(top, #fbb450, #f89406);+  background-image: -ms-linear-gradient(top, #fbb450, #f89406);+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406));+  background-image: -webkit-linear-gradient(top, #fbb450, #f89406);+  background-image: -o-linear-gradient(top, #fbb450, #f89406);+  background-image: linear-gradient(top, #fbb450, #f89406);+  background-repeat: repeat-x;+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fbb450', endColorstr='#f89406', GradientType=0);+  border-color: #f89406 #f89406 #ad6704;+  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);+  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);+}+.btn-warning:hover,+.btn-warning:active,+.btn-warning.active,+.btn-warning.disabled,+.btn-warning[disabled] {+  background-color: #f89406;+}+.btn-warning:active, .btn-warning.active {+  background-color: #c67605 \9;+}+.btn-danger {+  background-color: #da4f49;+  background-image: -moz-linear-gradient(top, #ee5f5b, #bd362f);+  background-image: -ms-linear-gradient(top, #ee5f5b, #bd362f);+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#bd362f));+  background-image: -webkit-linear-gradient(top, #ee5f5b, #bd362f);+  background-image: -o-linear-gradient(top, #ee5f5b, #bd362f);+  background-image: linear-gradient(top, #ee5f5b, #bd362f);+  background-repeat: repeat-x;+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ee5f5b', endColorstr='#bd362f', GradientType=0);+  border-color: #bd362f #bd362f #802420;+  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);+  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);+}+.btn-danger:hover,+.btn-danger:active,+.btn-danger.active,+.btn-danger.disabled,+.btn-danger[disabled] {+  background-color: #bd362f;+}+.btn-danger:active, .btn-danger.active {+  background-color: #942a25 \9;+}+.btn-success {+  background-color: #5bb75b;+  background-image: -moz-linear-gradient(top, #62c462, #51a351);+  background-image: -ms-linear-gradient(top, #62c462, #51a351);+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#51a351));+  background-image: -webkit-linear-gradient(top, #62c462, #51a351);+  background-image: -o-linear-gradient(top, #62c462, #51a351);+  background-image: linear-gradient(top, #62c462, #51a351);+  background-repeat: repeat-x;+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#62c462', endColorstr='#51a351', GradientType=0);+  border-color: #51a351 #51a351 #387038;+  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);+  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);+}+.btn-success:hover,+.btn-success:active,+.btn-success.active,+.btn-success.disabled,+.btn-success[disabled] {+  background-color: #51a351;+}+.btn-success:active, .btn-success.active {+  background-color: #408140 \9;+}+.btn-info {+  background-color: #49afcd;+  background-image: -moz-linear-gradient(top, #5bc0de, #2f96b4);+  background-image: -ms-linear-gradient(top, #5bc0de, #2f96b4);+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#2f96b4));+  background-image: -webkit-linear-gradient(top, #5bc0de, #2f96b4);+  background-image: -o-linear-gradient(top, #5bc0de, #2f96b4);+  background-image: linear-gradient(top, #5bc0de, #2f96b4);+  background-repeat: repeat-x;+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#5bc0de', endColorstr='#2f96b4', GradientType=0);+  border-color: #2f96b4 #2f96b4 #1f6377;+  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);+  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);+}+.btn-info:hover,+.btn-info:active,+.btn-info.active,+.btn-info.disabled,+.btn-info[disabled] {+  background-color: #2f96b4;+}+.btn-info:active, .btn-info.active {+  background-color: #24748c \9;+}+.btn-inverse {+  background-color: #393939;+  background-image: -moz-linear-gradient(top, #454545, #262626);+  background-image: -ms-linear-gradient(top, #454545, #262626);+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#454545), to(#262626));+  background-image: -webkit-linear-gradient(top, #454545, #262626);+  background-image: -o-linear-gradient(top, #454545, #262626);+  background-image: linear-gradient(top, #454545, #262626);+  background-repeat: repeat-x;+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#454545', endColorstr='#262626', GradientType=0);+  border-color: #262626 #262626 #000000;+  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);+  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);+}+.btn-inverse:hover,+.btn-inverse:active,+.btn-inverse.active,+.btn-inverse.disabled,+.btn-inverse[disabled] {+  background-color: #262626;+}+.btn-inverse:active, .btn-inverse.active {+  background-color: #0c0c0c \9;+}+button.btn, input[type="submit"].btn {+  *padding-top: 2px;+  *padding-bottom: 2px;+}+button.btn::-moz-focus-inner, input[type="submit"].btn::-moz-focus-inner {+  padding: 0;+  border: 0;+}+button.btn.large, input[type="submit"].btn.large {+  *padding-top: 7px;+  *padding-bottom: 7px;+}+button.btn.small, input[type="submit"].btn.small {+  *padding-top: 3px;+  *padding-bottom: 3px;+}+.btn-group {+  position: relative;+  *zoom: 1;+  *margin-left: .3em;+}+.btn-group:before, .btn-group:after {+  display: table;+  content: "";+}+.btn-group:after {+  clear: both;+}+.btn-group:first-child {+  *margin-left: 0;+}+.btn-group + .btn-group {+  margin-left: 5px;+}+.btn-toolbar {+  margin-top: 9px;+  margin-bottom: 9px;+}+.btn-toolbar .btn-group {+  display: inline-block;+  *display: inline;+  /* IE7 inline-block hack */++  *zoom: 1;+}+.btn-group .btn {+  position: relative;+  float: left;+  margin-left: -1px;+  -webkit-border-radius: 0;+  -moz-border-radius: 0;+  border-radius: 0;+}+.btn-group .btn:first-child {+  margin-left: 0;+  -webkit-border-top-left-radius: 4px;+  -moz-border-radius-topleft: 4px;+  border-top-left-radius: 4px;+  -webkit-border-bottom-left-radius: 4px;+  -moz-border-radius-bottomleft: 4px;+  border-bottom-left-radius: 4px;+}+.btn-group .btn:last-child, .btn-group .dropdown-toggle {+  -webkit-border-top-right-radius: 4px;+  -moz-border-radius-topright: 4px;+  border-top-right-radius: 4px;+  -webkit-border-bottom-right-radius: 4px;+  -moz-border-radius-bottomright: 4px;+  border-bottom-right-radius: 4px;+}+.btn-group .btn.large:first-child {+  margin-left: 0;+  -webkit-border-top-left-radius: 6px;+  -moz-border-radius-topleft: 6px;+  border-top-left-radius: 6px;+  -webkit-border-bottom-left-radius: 6px;+  -moz-border-radius-bottomleft: 6px;+  border-bottom-left-radius: 6px;+}+.btn-group .btn.large:last-child, .btn-group .large.dropdown-toggle {+  -webkit-border-top-right-radius: 6px;+  -moz-border-radius-topright: 6px;+  border-top-right-radius: 6px;+  -webkit-border-bottom-right-radius: 6px;+  -moz-border-radius-bottomright: 6px;+  border-bottom-right-radius: 6px;+}+.btn-group .btn:hover,+.btn-group .btn:focus,+.btn-group .btn:active,+.btn-group .btn.active {+  z-index: 2;+}+.btn-group .dropdown-toggle:active, .btn-group.open .dropdown-toggle {+  outline: 0;+}+.btn-group .dropdown-toggle {+  padding-left: 8px;+  padding-right: 8px;+  -webkit-box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);+  -moz-box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);+  box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);+  *padding-top: 5px;+  *padding-bottom: 5px;+}+.btn-group.open {+  *z-index: 1000;+}+.btn-group.open .dropdown-menu {+  display: block;+  margin-top: 1px;+  -webkit-border-radius: 5px;+  -moz-border-radius: 5px;+  border-radius: 5px;+}+.btn-group.open .dropdown-toggle {+  background-image: none;+  -webkit-box-shadow: inset 0 1px 6px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);+  -moz-box-shadow: inset 0 1px 6px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);+  box-shadow: inset 0 1px 6px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);+}+.btn .caret {+  margin-top: 7px;+  margin-left: 0;+}+.btn:hover .caret, .open.btn-group .caret {+  opacity: 1;+  filter: alpha(opacity=100);+}+.btn-primary .caret,+.btn-danger .caret,+.btn-info .caret,+.btn-success .caret,+.btn-inverse .caret {+  border-top-color: #ffffff;+  opacity: 0.75;+  filter: alpha(opacity=75);+}+.btn-small .caret {+  margin-top: 4px;+}+.alert {+  padding: 8px 35px 8px 14px;+  margin-bottom: 18px;+  text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);+  background-color: #fcf8e3;+  border: 1px solid #fbeed5;+  -webkit-border-radius: 4px;+  -moz-border-radius: 4px;+  border-radius: 4px;+}+.alert, .alert-heading {+  color: #c09853;+}+.alert .close {+  position: relative;+  top: -2px;+  right: -21px;+  line-height: 18px;+}+.alert-success {+  background-color: #dff0d8;+  border-color: #d6e9c6;+}+.alert-success, .alert-success .alert-heading {+  color: #468847;+}+.alert-danger, .alert-error {+  background-color: #f2dede;+  border-color: #eed3d7;+}+.alert-danger,+.alert-error,+.alert-danger .alert-heading,+.alert-error .alert-heading {+  color: #b94a48;+}+.alert-info {+  background-color: #d9edf7;+  border-color: #bce8f1;+}+.alert-info, .alert-info .alert-heading {+  color: #3a87ad;+}+.alert-block {+  padding-top: 14px;+  padding-bottom: 14px;+}+.alert-block > p, .alert-block > ul {+  margin-bottom: 0;+}+.alert-block p + p {+  margin-top: 5px;+}+.nav {+  margin-left: 0;+  margin-bottom: 18px;+  list-style: none;+}+.nav > li > a {+  display: block;+}+.nav > li > a:hover {+  text-decoration: none;+  background-color: #eeeeee;+}+.nav .nav-header {+  display: block;+  padding: 3px 15px;+  font-size: 11px;+  font-weight: bold;+  line-height: 18px;+  color: #999999;+  text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);+  text-transform: uppercase;+}+.nav li + .nav-header {+  margin-top: 9px;+}+.nav-list {+  padding-left: 14px;+  padding-right: 14px;+  margin-bottom: 0;+}+.nav-list > li > a, .nav-list .nav-header {+  margin-left: -15px;+  margin-right: -15px;+  text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);+}+.nav-list > li > a {+  padding: 3px 15px;+}+.nav-list .active > a, .nav-list .active > a:hover {+  color: #ffffff;+  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2);+  background-color: #0088cc;+}+.nav-list [class^="icon-"] {+  margin-right: 2px;+}+.nav-tabs, .nav-pills {+  *zoom: 1;+}+.nav-tabs:before,+.nav-pills:before,+.nav-tabs:after,+.nav-pills:after {+  display: table;+  content: "";+}+.nav-tabs:after, .nav-pills:after {+  clear: both;+}+.nav-tabs > li, .nav-pills > li {+  float: left;+}+.nav-tabs > li > a, .nav-pills > li > a {+  padding-right: 12px;+  padding-left: 12px;+  margin-right: 2px;+  line-height: 14px;+}+.nav-tabs {+  border-bottom: 1px solid #ddd;+}+.nav-tabs > li {+  margin-bottom: -1px;+}+.nav-tabs > li > a {+  padding-top: 9px;+  padding-bottom: 9px;+  border: 1px solid transparent;+  -webkit-border-radius: 4px 4px 0 0;+  -moz-border-radius: 4px 4px 0 0;+  border-radius: 4px 4px 0 0;+}+.nav-tabs > li > a:hover {+  border-color: #eeeeee #eeeeee #dddddd;+}+.nav-tabs > .active > a, .nav-tabs > .active > a:hover {+  color: #555555;+  background-color: #ffffff;+  border: 1px solid #ddd;+  border-bottom-color: transparent;+  cursor: default;+}+.nav-pills > li > a {+  padding-top: 8px;+  padding-bottom: 8px;+  margin-top: 2px;+  margin-bottom: 2px;+  -webkit-border-radius: 5px;+  -moz-border-radius: 5px;+  border-radius: 5px;+}+.nav-pills .active > a, .nav-pills .active > a:hover {+  color: #ffffff;+  background-color: #0088cc;+}+.nav-stacked > li {+  float: none;+}+.nav-stacked > li > a {+  margin-right: 0;+}+.nav-tabs.nav-stacked {+  border-bottom: 0;+}+.nav-tabs.nav-stacked > li > a {+  border: 1px solid #ddd;+  -webkit-border-radius: 0;+  -moz-border-radius: 0;+  border-radius: 0;+}+.nav-tabs.nav-stacked > li:first-child > a {+  -webkit-border-radius: 4px 4px 0 0;+  -moz-border-radius: 4px 4px 0 0;+  border-radius: 4px 4px 0 0;+}+.nav-tabs.nav-stacked > li:last-child > a {+  -webkit-border-radius: 0 0 4px 4px;+  -moz-border-radius: 0 0 4px 4px;+  border-radius: 0 0 4px 4px;+}+.nav-tabs.nav-stacked > li > a:hover {+  border-color: #ddd;+  z-index: 2;+}+.nav-pills.nav-stacked > li > a {+  margin-bottom: 3px;+}+.nav-pills.nav-stacked > li:last-child > a {+  margin-bottom: 1px;+}+.nav-tabs .dropdown-menu, .nav-pills .dropdown-menu {+  margin-top: 1px;+  border-width: 1px;+}+.nav-pills .dropdown-menu {+  -webkit-border-radius: 4px;+  -moz-border-radius: 4px;+  border-radius: 4px;+}+.nav-tabs .dropdown-toggle .caret, .nav-pills .dropdown-toggle .caret {+  border-top-color: #0088cc;+  margin-top: 6px;+}+.nav-tabs .dropdown-toggle:hover .caret, .nav-pills .dropdown-toggle:hover .caret {+  border-top-color: #005580;+}+.nav-tabs .active .dropdown-toggle .caret, .nav-pills .active .dropdown-toggle .caret {+  border-top-color: #333333;+}+.nav > .dropdown.active > a:hover {+  color: #000000;+  cursor: pointer;+}+.nav-tabs .open .dropdown-toggle, .nav-pills .open .dropdown-toggle, .nav > .open.active > a:hover {+  color: #ffffff;+  background-color: #999999;+  border-color: #999999;+}+.nav .open .caret, .nav .open.active .caret, .nav .open a:hover .caret {+  border-top-color: #ffffff;+  opacity: 1;+  filter: alpha(opacity=100);+}+.tabs-stacked .open > a:hover {+  border-color: #999999;+}+.tabbable {+  *zoom: 1;+}+.tabbable:before, .tabbable:after {+  display: table;+  content: "";+}+.tabbable:after {+  clear: both;+}+.tab-content {+  overflow: hidden;+}+.tabs-below .nav-tabs, .tabs-right .nav-tabs, .tabs-left .nav-tabs {+  border-bottom: 0;+}+.tab-content > .tab-pane, .pill-content > .pill-pane {+  display: none;+}+.tab-content > .active, .pill-content > .active {+  display: block;+}+.tabs-below .nav-tabs {+  border-top: 1px solid #ddd;+}+.tabs-below .nav-tabs > li {+  margin-top: -1px;+  margin-bottom: 0;+}+.tabs-below .nav-tabs > li > a {+  -webkit-border-radius: 0 0 4px 4px;+  -moz-border-radius: 0 0 4px 4px;+  border-radius: 0 0 4px 4px;+}+.tabs-below .nav-tabs > li > a:hover {+  border-bottom-color: transparent;+  border-top-color: #ddd;+}+.tabs-below .nav-tabs .active > a, .tabs-below .nav-tabs .active > a:hover {+  border-color: transparent #ddd #ddd #ddd;+}+.tabs-left .nav-tabs > li, .tabs-right .nav-tabs > li {+  float: none;+}+.tabs-left .nav-tabs > li > a, .tabs-right .nav-tabs > li > a {+  min-width: 74px;+  margin-right: 0;+  margin-bottom: 3px;+}+.tabs-left .nav-tabs {+  float: left;+  margin-right: 19px;+  border-right: 1px solid #ddd;+}+.tabs-left .nav-tabs > li > a {+  margin-right: -1px;+  -webkit-border-radius: 4px 0 0 4px;+  -moz-border-radius: 4px 0 0 4px;+  border-radius: 4px 0 0 4px;+}+.tabs-left .nav-tabs > li > a:hover {+  border-color: #eeeeee #dddddd #eeeeee #eeeeee;+}+.tabs-left .nav-tabs .active > a, .tabs-left .nav-tabs .active > a:hover {+  border-color: #ddd transparent #ddd #ddd;+  *border-right-color: #ffffff;+}+.tabs-right .nav-tabs {+  float: right;+  margin-left: 19px;+  border-left: 1px solid #ddd;+}+.tabs-right .nav-tabs > li > a {+  margin-left: -1px;+  -webkit-border-radius: 0 4px 4px 0;+  -moz-border-radius: 0 4px 4px 0;+  border-radius: 0 4px 4px 0;+}+.tabs-right .nav-tabs > li > a:hover {+  border-color: #eeeeee #eeeeee #eeeeee #dddddd;+}+.tabs-right .nav-tabs .active > a, .tabs-right .nav-tabs .active > a:hover {+  border-color: #ddd #ddd #ddd transparent;+  *border-left-color: #ffffff;+}+.navbar {+  overflow: visible;+  margin-bottom: 18px;+}+.navbar-inner {+  padding-left: 20px;+  padding-right: 20px;+  background-color: #2c2c2c;+  background-image: -moz-linear-gradient(top, #333333, #222222);+  background-image: -ms-linear-gradient(top, #333333, #222222);+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#333333), to(#222222));+  background-image: -webkit-linear-gradient(top, #333333, #222222);+  background-image: -o-linear-gradient(top, #333333, #222222);+  background-image: linear-gradient(top, #333333, #222222);+  background-repeat: repeat-x;+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#333333', endColorstr='#222222', GradientType=0);+  -webkit-border-radius: 4px;+  -moz-border-radius: 4px;+  border-radius: 4px;+  -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25), inset 0 -1px 0 rgba(0, 0, 0, 0.1);+  -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25), inset 0 -1px 0 rgba(0, 0, 0, 0.1);+  box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25), inset 0 -1px 0 rgba(0, 0, 0, 0.1);+}+.btn-navbar {+  display: none;+  float: right;+  padding: 7px 10px;+  margin-left: 5px;+  margin-right: 5px;+  background-color: #2c2c2c;+  background-image: -moz-linear-gradient(top, #333333, #222222);+  background-image: -ms-linear-gradient(top, #333333, #222222);+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#333333), to(#222222));+  background-image: -webkit-linear-gradient(top, #333333, #222222);+  background-image: -o-linear-gradient(top, #333333, #222222);+  background-image: linear-gradient(top, #333333, #222222);+  background-repeat: repeat-x;+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#333333', endColorstr='#222222', GradientType=0);+  border-color: #222222 #222222 #000000;+  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);+  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);+  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075);+  -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075);+  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075);+}+.btn-navbar:hover,+.btn-navbar:active,+.btn-navbar.active,+.btn-navbar.disabled,+.btn-navbar[disabled] {+  background-color: #222222;+}+.btn-navbar:active, .btn-navbar.active {+  background-color: #080808 \9;+}+.btn-navbar .icon-bar {+  display: block;+  width: 18px;+  height: 2px;+  background-color: #f5f5f5;+  -webkit-border-radius: 1px;+  -moz-border-radius: 1px;+  border-radius: 1px;+  -webkit-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25);+  -moz-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25);+  box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25);+}+.btn-navbar .icon-bar + .icon-bar {+  margin-top: 3px;+}+.nav-collapse.collapse {+  height: auto;+}+.navbar .brand:hover {+  text-decoration: none;+}+.navbar .brand {+  float: left;+  display: block;+  padding: 8px 20px 12px;+  margin-left: -20px;+  font-size: 20px;+  font-weight: 200;+  line-height: 1;+  color: #ffffff;+}+.navbar .navbar-text {+  margin-bottom: 0;+  line-height: 40px;+  color: #999999;+}+.navbar .navbar-text a:hover {+  color: #ffffff;+  background-color: transparent;+}+.navbar .btn, .navbar .btn-group {+  margin-top: 5px;+}+.navbar .btn-group .btn {+  margin-top: 0;+}+.navbar-form {+  margin-bottom: 0;+  *zoom: 1;+}+.navbar-form:before, .navbar-form:after {+  display: table;+  content: "";+}+.navbar-form:after {+  clear: both;+}+.navbar-form input, .navbar-form select {+  display: inline-block;+  margin-top: 5px;+  margin-bottom: 0;+}+.navbar-form .radio, .navbar-form .checkbox {+  margin-top: 5px;+}+.navbar-form input[type="image"], .navbar-form input[type="checkbox"], .navbar-form input[type="radio"] {+  margin-top: 3px;+}+.navbar-form .input-append, .navbar-form .input-prepend {+  margin-top: 6px;+  white-space: nowrap;+}+.navbar-form .input-append input, .navbar-form .input-prepend input {+  margin-top: 0;+}+.navbar-search {+  position: relative;+  float: left;+  margin-top: 6px;+  margin-bottom: 0;+}+.navbar-search .search-query {+  padding: 4px 9px;+  font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;+  font-size: 13px;+  font-weight: normal;+  line-height: 1;+  color: #ffffff;+  color: rgba(255, 255, 255, 0.75);+  background: #666;+  background: rgba(255, 255, 255, 0.3);+  border: 1px solid #111;+  -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0px rgba(255, 255, 255, 0.15);+  -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0px rgba(255, 255, 255, 0.15);+  box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0px rgba(255, 255, 255, 0.15);+  -webkit-transition: none;+  -moz-transition: none;+  -ms-transition: none;+  -o-transition: none;+  transition: none;+}+.navbar-search .search-query :-moz-placeholder {+  color: #eeeeee;+}+.navbar-search .search-query::-webkit-input-placeholder {+  color: #eeeeee;+}+.navbar-search .search-query:hover {+  color: #ffffff;+  background-color: #999999;+  background-color: rgba(255, 255, 255, 0.5);+}+.navbar-search .search-query:focus, .navbar-search .search-query.focused {+  padding: 5px 10px;+  color: #333333;+  text-shadow: 0 1px 0 #ffffff;+  background-color: #ffffff;+  border: 0;+  -webkit-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15);+  -moz-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15);+  box-shadow: 0 0 3px rgba(0, 0, 0, 0.15);+  outline: 0;+}+.navbar-fixed-top {+  position: fixed;+  top: 0;+  right: 0;+  left: 0;+  z-index: 1030;+}+.navbar-fixed-top .navbar-inner {+  padding-left: 0;+  padding-right: 0;+  -webkit-border-radius: 0;+  -moz-border-radius: 0;+  border-radius: 0;+}+.navbar .nav {+  position: relative;+  left: 0;+  display: block;+  float: left;+  margin: 0 10px 0 0;+}+.navbar .nav.pull-right {+  float: right;+}+.navbar .nav > li {+  display: block;+  float: left;+}+.navbar .nav > li > a {+  float: none;+  padding: 10px 10px 11px;+  line-height: 19px;+  color: #999999;+  text-decoration: none;+  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);+}+.navbar .nav > li > a:hover {+  background-color: transparent;+  color: #ffffff;+  text-decoration: none;+}+.navbar .nav .active > a, .navbar .nav .active > a:hover {+  color: #ffffff;+  text-decoration: none;+  background-color: #222222;+}+.navbar .divider-vertical {+  height: 40px;+  width: 1px;+  margin: 0 9px;+  overflow: hidden;+  background-color: #222222;+  border-right: 1px solid #333333;+}+.navbar .nav.pull-right {+  margin-left: 10px;+  margin-right: 0;+}+.navbar .dropdown-menu {+  margin-top: 1px;+  -webkit-border-radius: 4px;+  -moz-border-radius: 4px;+  border-radius: 4px;+}+.navbar .dropdown-menu:before {+  content: '';+  display: inline-block;+  border-left: 7px solid transparent;+  border-right: 7px solid transparent;+  border-bottom: 7px solid #ccc;+  border-bottom-color: rgba(0, 0, 0, 0.2);+  position: absolute;+  top: -7px;+  left: 9px;+}+.navbar .dropdown-menu:after {+  content: '';+  display: inline-block;+  border-left: 6px solid transparent;+  border-right: 6px solid transparent;+  border-bottom: 6px solid #ffffff;+  position: absolute;+  top: -6px;+  left: 10px;+}+.navbar .nav .dropdown-toggle .caret, .navbar .nav .open.dropdown .caret {+  border-top-color: #ffffff;+}+.navbar .nav .active .caret {+  opacity: 1;+  filter: alpha(opacity=100);+}+.navbar .nav .open > .dropdown-toggle, .navbar .nav .active > .dropdown-toggle, .navbar .nav .open.active > .dropdown-toggle {+  background-color: transparent;+}+.navbar .nav .active > .dropdown-toggle:hover {+  color: #ffffff;+}+.navbar .nav.pull-right .dropdown-menu {+  left: auto;+  right: 0;+}+.navbar .nav.pull-right .dropdown-menu:before {+  left: auto;+  right: 12px;+}+.navbar .nav.pull-right .dropdown-menu:after {+  left: auto;+  right: 13px;+}+.breadcrumb {+  padding: 7px 14px;+  margin: 0 0 18px;+  background-color: #fbfbfb;+  background-image: -moz-linear-gradient(top, #ffffff, #f5f5f5);+  background-image: -ms-linear-gradient(top, #ffffff, #f5f5f5);+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#f5f5f5));+  background-image: -webkit-linear-gradient(top, #ffffff, #f5f5f5);+  background-image: -o-linear-gradient(top, #ffffff, #f5f5f5);+  background-image: linear-gradient(top, #ffffff, #f5f5f5);+  background-repeat: repeat-x;+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#f5f5f5', GradientType=0);+  border: 1px solid #ddd;+  -webkit-border-radius: 3px;+  -moz-border-radius: 3px;+  border-radius: 3px;+  -webkit-box-shadow: inset 0 1px 0 #ffffff;+  -moz-box-shadow: inset 0 1px 0 #ffffff;+  box-shadow: inset 0 1px 0 #ffffff;+}+.breadcrumb li {+  display: inline-block;+  text-shadow: 0 1px 0 #ffffff;+}+.breadcrumb .divider {+  padding: 0 5px;+  color: #999999;+}+.breadcrumb .active a {+  color: #333333;+}+.pagination {+  height: 36px;+  margin: 18px 0;+}+.pagination ul {+  display: inline-block;+  *display: inline;+  /* IE7 inline-block hack */++  *zoom: 1;+  margin-left: 0;+  margin-bottom: 0;+  -webkit-border-radius: 3px;+  -moz-border-radius: 3px;+  border-radius: 3px;+  -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);+  -moz-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);+  box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);+}+.pagination li {+  display: inline;+}+.pagination a {+  float: left;+  padding: 0 14px;+  line-height: 34px;+  text-decoration: none;+  border: 1px solid #ddd;+  border-left-width: 0;+}+.pagination a:hover, .pagination .active a {+  background-color: #f5f5f5;+}+.pagination .active a {+  color: #999999;+  cursor: default;+}+.pagination .disabled a, .pagination .disabled a:hover {+  color: #999999;+  background-color: transparent;+  cursor: default;+}+.pagination li:first-child a {+  border-left-width: 1px;+  -webkit-border-radius: 3px 0 0 3px;+  -moz-border-radius: 3px 0 0 3px;+  border-radius: 3px 0 0 3px;+}+.pagination li:last-child a {+  -webkit-border-radius: 0 3px 3px 0;+  -moz-border-radius: 0 3px 3px 0;+  border-radius: 0 3px 3px 0;+}+.pagination-centered {+  text-align: center;+}+.pagination-right {+  text-align: right;+}+.pager {+  margin-left: 0;+  margin-bottom: 18px;+  list-style: none;+  text-align: center;+  *zoom: 1;+}+.pager:before, .pager:after {+  display: table;+  content: "";+}+.pager:after {+  clear: both;+}+.pager li {+  display: inline;+}+.pager a {+  display: inline-block;+  padding: 5px 14px;+  background-color: #fff;+  border: 1px solid #ddd;+  -webkit-border-radius: 15px;+  -moz-border-radius: 15px;+  border-radius: 15px;+}+.pager a:hover {+  text-decoration: none;+  background-color: #f5f5f5;+}+.pager .next a {+  float: right;+}+.pager .previous a {+  float: left;+}+.modal-open .dropdown-menu {+  z-index: 2050;+}+.modal-open .dropdown.open {+  *z-index: 2050;+}+.modal-open .popover {+  z-index: 2060;+}+.modal-open .tooltip {+  z-index: 2070;+}+.modal-backdrop {+  position: fixed;+  top: 0;+  right: 0;+  bottom: 0;+  left: 0;+  z-index: 1040;+  background-color: #000000;+}+.modal-backdrop.fade {+  opacity: 0;+}+.modal-backdrop, .modal-backdrop.fade.in {+  opacity: 0.8;+  filter: alpha(opacity=80);+}+.modal {+  position: fixed;+  top: 50%;+  left: 50%;+  z-index: 1050;+  max-height: 500px;+  overflow: auto;+  width: 560px;+  margin: -250px 0 0 -280px;+  background-color: #ffffff;+  border: 1px solid #999;+  border: 1px solid rgba(0, 0, 0, 0.3);+  *border: 1px solid #999;+  /* IE6-7 */++  -webkit-border-radius: 6px;+  -moz-border-radius: 6px;+  border-radius: 6px;+  -webkit-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);+  -moz-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);+  box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);+  -webkit-background-clip: padding-box;+  -moz-background-clip: padding-box;+  background-clip: padding-box;+}+.modal.fade {+  -webkit-transition: opacity .3s linear, top .3s ease-out;+  -moz-transition: opacity .3s linear, top .3s ease-out;+  -ms-transition: opacity .3s linear, top .3s ease-out;+  -o-transition: opacity .3s linear, top .3s ease-out;+  transition: opacity .3s linear, top .3s ease-out;+  top: -25%;+}+.modal.fade.in {+  top: 50%;+}+.modal-header {+  padding: 9px 15px;+  border-bottom: 1px solid #eee;+}+.modal-header .close {+  margin-top: 2px;+}+.modal-body {+  padding: 15px;+}+.modal-body .modal-form {+  margin-bottom: 0;+}+.modal-footer {+  padding: 14px 15px 15px;+  margin-bottom: 0;+  background-color: #f5f5f5;+  border-top: 1px solid #ddd;+  -webkit-border-radius: 0 0 6px 6px;+  -moz-border-radius: 0 0 6px 6px;+  border-radius: 0 0 6px 6px;+  -webkit-box-shadow: inset 0 1px 0 #ffffff;+  -moz-box-shadow: inset 0 1px 0 #ffffff;+  box-shadow: inset 0 1px 0 #ffffff;+  *zoom: 1;+}+.modal-footer:before, .modal-footer:after {+  display: table;+  content: "";+}+.modal-footer:after {+  clear: both;+}+.modal-footer .btn {+  float: right;+  margin-left: 5px;+  margin-bottom: 0;+}+.tooltip {+  position: absolute;+  z-index: 1020;+  display: block;+  visibility: visible;+  padding: 5px;+  font-size: 11px;+  opacity: 0;+  filter: alpha(opacity=0);+}+.tooltip.in {+  opacity: 0.8;+  filter: alpha(opacity=80);+}+.tooltip.top {+  margin-top: -2px;+}+.tooltip.right {+  margin-left: 2px;+}+.tooltip.bottom {+  margin-top: 2px;+}+.tooltip.left {+  margin-left: -2px;+}+.tooltip.top .tooltip-arrow {+  bottom: 0;+  left: 50%;+  margin-left: -5px;+  border-left: 5px solid transparent;+  border-right: 5px solid transparent;+  border-top: 5px solid #000000;+}+.tooltip.left .tooltip-arrow {+  top: 50%;+  right: 0;+  margin-top: -5px;+  border-top: 5px solid transparent;+  border-bottom: 5px solid transparent;+  border-left: 5px solid #000000;+}+.tooltip.bottom .tooltip-arrow {+  top: 0;+  left: 50%;+  margin-left: -5px;+  border-left: 5px solid transparent;+  border-right: 5px solid transparent;+  border-bottom: 5px solid #000000;+}+.tooltip.right .tooltip-arrow {+  top: 50%;+  left: 0;+  margin-top: -5px;+  border-top: 5px solid transparent;+  border-bottom: 5px solid transparent;+  border-right: 5px solid #000000;+}+.tooltip-inner {+  max-width: 200px;+  padding: 3px 8px;+  color: #ffffff;+  text-align: center;+  text-decoration: none;+  background-color: #000000;+  -webkit-border-radius: 4px;+  -moz-border-radius: 4px;+  border-radius: 4px;+}+.tooltip-arrow {+  position: absolute;+  width: 0;+  height: 0;+}+.popover {+  position: absolute;+  top: 0;+  left: 0;+  z-index: 1010;+  display: none;+  padding: 5px;+}+.popover.top {+  margin-top: -5px;+}+.popover.right {+  margin-left: 5px;+}+.popover.bottom {+  margin-top: 5px;+}+.popover.left {+  margin-left: -5px;+}+.popover.top .arrow {+  bottom: 0;+  left: 50%;+  margin-left: -5px;+  border-left: 5px solid transparent;+  border-right: 5px solid transparent;+  border-top: 5px solid #000000;+}+.popover.right .arrow {+  top: 50%;+  left: 0;+  margin-top: -5px;+  border-top: 5px solid transparent;+  border-bottom: 5px solid transparent;+  border-right: 5px solid #000000;+}+.popover.bottom .arrow {+  top: 0;+  left: 50%;+  margin-left: -5px;+  border-left: 5px solid transparent;+  border-right: 5px solid transparent;+  border-bottom: 5px solid #000000;+}+.popover.left .arrow {+  top: 50%;+  right: 0;+  margin-top: -5px;+  border-top: 5px solid transparent;+  border-bottom: 5px solid transparent;+  border-left: 5px solid #000000;+}+.popover .arrow {+  position: absolute;+  width: 0;+  height: 0;+}+.popover-inner {+  padding: 3px;+  width: 280px;+  overflow: hidden;+  background: #000000;+  background: rgba(0, 0, 0, 0.8);+  -webkit-border-radius: 6px;+  -moz-border-radius: 6px;+  border-radius: 6px;+  -webkit-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);+  -moz-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);+  box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);+}+.popover-title {+  padding: 9px 15px;+  line-height: 1;+  background-color: #f5f5f5;+  border-bottom: 1px solid #eee;+  -webkit-border-radius: 3px 3px 0 0;+  -moz-border-radius: 3px 3px 0 0;+  border-radius: 3px 3px 0 0;+}+.popover-content {+  padding: 14px;+  background-color: #ffffff;+  -webkit-border-radius: 0 0 3px 3px;+  -moz-border-radius: 0 0 3px 3px;+  border-radius: 0 0 3px 3px;+  -webkit-background-clip: padding-box;+  -moz-background-clip: padding-box;+  background-clip: padding-box;+}+.popover-content p, .popover-content ul, .popover-content ol {+  margin-bottom: 0;+}+.thumbnails {+  margin-left: -20px;+  list-style: none;+  *zoom: 1;+}+.thumbnails:before, .thumbnails:after {+  display: table;+  content: "";+}+.thumbnails:after {+  clear: both;+}+.thumbnails > li {+  float: left;+  margin: 0 0 18px 20px;+}+.thumbnail {+  display: block;+  padding: 4px;+  line-height: 1;+  border: 1px solid #ddd;+  -webkit-border-radius: 4px;+  -moz-border-radius: 4px;+  border-radius: 4px;+  -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.075);+  -moz-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.075);+  box-shadow: 0 1px 1px rgba(0, 0, 0, 0.075);+}+a.thumbnail:hover {+  border-color: #0088cc;+  -webkit-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25);+  -moz-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25);+  box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25);+}+.thumbnail > img {+  display: block;+  max-width: 100%;+  margin-left: auto;+  margin-right: auto;+}+.thumbnail .caption {+  padding: 9px;+}+.label {+  padding: 2px 4px 3px;+  font-size: 11.049999999999999px;+  font-weight: bold;+  color: #ffffff;+  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);+  background-color: #999999;+  -webkit-border-radius: 3px;+  -moz-border-radius: 3px;+  border-radius: 3px;+}+.label:hover {+  color: #ffffff;+  text-decoration: none;+}+.label-important {+  background-color: #b94a48;+}+.label-important:hover {+  background-color: #953b39;+}+.label-warning {+  background-color: #f89406;+}+.label-warning:hover {+  background-color: #c67605;+}+.label-success {+  background-color: #468847;+}+.label-success:hover {+  background-color: #356635;+}+.label-info {+  background-color: #3a87ad;+}+.label-info:hover {+  background-color: #2d6987;+}+@-webkit-keyframes progress-bar-stripes {+  from {+    background-position: 0 0;+  }+  to {+    background-position: 40px 0;+  }+}+@-moz-keyframes progress-bar-stripes {+  from {+    background-position: 0 0;+  }+  to {+    background-position: 40px 0;+  }+}+@keyframes progress-bar-stripes {+  from {+    background-position: 0 0;+  }+  to {+    background-position: 40px 0;+  }+}+.progress {+  overflow: hidden;+  height: 18px;+  margin-bottom: 18px;+  background-color: #f7f7f7;+  background-image: -moz-linear-gradient(top, #f5f5f5, #f9f9f9);+  background-image: -ms-linear-gradient(top, #f5f5f5, #f9f9f9);+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f5f5f5), to(#f9f9f9));+  background-image: -webkit-linear-gradient(top, #f5f5f5, #f9f9f9);+  background-image: -o-linear-gradient(top, #f5f5f5, #f9f9f9);+  background-image: linear-gradient(top, #f5f5f5, #f9f9f9);+  background-repeat: repeat-x;+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#f5f5f5', endColorstr='#f9f9f9', GradientType=0);+  -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);+  -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);+  box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);+  -webkit-border-radius: 4px;+  -moz-border-radius: 4px;+  border-radius: 4px;+}+.progress .bar {+  width: 0%;+  height: 18px;+  color: #ffffff;+  font-size: 12px;+  text-align: center;+  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);+  background-color: #0e90d2;+  background-image: -moz-linear-gradient(top, #149bdf, #0480be);+  background-image: -ms-linear-gradient(top, #149bdf, #0480be);+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#149bdf), to(#0480be));+  background-image: -webkit-linear-gradient(top, #149bdf, #0480be);+  background-image: -o-linear-gradient(top, #149bdf, #0480be);+  background-image: linear-gradient(top, #149bdf, #0480be);+  background-repeat: repeat-x;+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#149bdf', endColorstr='#0480be', GradientType=0);+  -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);+  -moz-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);+  box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);+  -webkit-box-sizing: border-box;+  -moz-box-sizing: border-box;+  box-sizing: border-box;+  -webkit-transition: width 0.6s ease;+  -moz-transition: width 0.6s ease;+  -ms-transition: width 0.6s ease;+  -o-transition: width 0.6s ease;+  transition: width 0.6s ease;+}+.progress-striped .bar {+  background-color: #62c462;+  background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));+  background-image: -webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);+  background-image: -moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);+  background-image: -ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);+  background-image: -o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);+  background-image: linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);+  -webkit-background-size: 40px 40px;+  -moz-background-size: 40px 40px;+  -o-background-size: 40px 40px;+  background-size: 40px 40px;+}+.progress.active .bar {+  -webkit-animation: progress-bar-stripes 2s linear infinite;+  -moz-animation: progress-bar-stripes 2s linear infinite;+  animation: progress-bar-stripes 2s linear infinite;+}+.progress-danger .bar {+  background-color: #dd514c;+  background-image: -moz-linear-gradient(top, #ee5f5b, #c43c35);+  background-image: -ms-linear-gradient(top, #ee5f5b, #c43c35);+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#c43c35));+  background-image: -webkit-linear-gradient(top, #ee5f5b, #c43c35);+  background-image: -o-linear-gradient(top, #ee5f5b, #c43c35);+  background-image: linear-gradient(top, #ee5f5b, #c43c35);+  background-repeat: repeat-x;+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ee5f5b', endColorstr='#c43c35', GradientType=0);+}+.progress-danger.progress-striped .bar {+  background-color: #ee5f5b;+  background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));+  background-image: -webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);+  background-image: -moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);+  background-image: -ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);+  background-image: -o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);+  background-image: linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);+}+.progress-success .bar {+  background-color: #5eb95e;+  background-image: -moz-linear-gradient(top, #62c462, #57a957);+  background-image: -ms-linear-gradient(top, #62c462, #57a957);+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#57a957));+  background-image: -webkit-linear-gradient(top, #62c462, #57a957);+  background-image: -o-linear-gradient(top, #62c462, #57a957);+  background-image: linear-gradient(top, #62c462, #57a957);+  background-repeat: repeat-x;+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#62c462', endColorstr='#57a957', GradientType=0);+}+.progress-success.progress-striped .bar {+  background-color: #62c462;+  background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));+  background-image: -webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);+  background-image: -moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);+  background-image: -ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);+  background-image: -o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);+  background-image: linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);+}+.progress-info .bar {+  background-color: #4bb1cf;+  background-image: -moz-linear-gradient(top, #5bc0de, #339bb9);+  background-image: -ms-linear-gradient(top, #5bc0de, #339bb9);+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#339bb9));+  background-image: -webkit-linear-gradient(top, #5bc0de, #339bb9);+  background-image: -o-linear-gradient(top, #5bc0de, #339bb9);+  background-image: linear-gradient(top, #5bc0de, #339bb9);+  background-repeat: repeat-x;+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#5bc0de', endColorstr='#339bb9', GradientType=0);+}+.progress-info.progress-striped .bar {+  background-color: #5bc0de;+  background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));+  background-image: -webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);+  background-image: -moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);+  background-image: -ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);+  background-image: -o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);+  background-image: linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);+}+.accordion {+  margin-bottom: 18px;+}+.accordion-group {+  margin-bottom: 2px;+  border: 1px solid #e5e5e5;+  -webkit-border-radius: 4px;+  -moz-border-radius: 4px;+  border-radius: 4px;+}+.accordion-heading {+  border-bottom: 0;+}+.accordion-heading .accordion-toggle {+  display: block;+  padding: 8px 15px;+}+.accordion-inner {+  padding: 9px 15px;+  border-top: 1px solid #e5e5e5;+}+.carousel {+  position: relative;+  margin-bottom: 18px;+  line-height: 1;+}+.carousel-inner {+  overflow: hidden;+  width: 100%;+  position: relative;+}+.carousel .item {+  display: none;+  position: relative;+  -webkit-transition: 0.6s ease-in-out left;+  -moz-transition: 0.6s ease-in-out left;+  -ms-transition: 0.6s ease-in-out left;+  -o-transition: 0.6s ease-in-out left;+  transition: 0.6s ease-in-out left;+}+.carousel .item > img {+  display: block;+  line-height: 1;+}+.carousel .active, .carousel .next, .carousel .prev {+  display: block;+}+.carousel .active {+  left: 0;+}+.carousel .next, .carousel .prev {+  position: absolute;+  top: 0;+  width: 100%;+}+.carousel .next {+  left: 100%;+}+.carousel .prev {+  left: -100%;+}+.carousel .next.left, .carousel .prev.right {+  left: 0;+}+.carousel .active.left {+  left: -100%;+}+.carousel .active.right {+  left: 100%;+}+.carousel-control {+  position: absolute;+  top: 40%;+  left: 15px;+  width: 40px;+  height: 40px;+  margin-top: -20px;+  font-size: 60px;+  font-weight: 100;+  line-height: 30px;+  color: #ffffff;+  text-align: center;+  background: #222222;+  border: 3px solid #ffffff;+  -webkit-border-radius: 23px;+  -moz-border-radius: 23px;+  border-radius: 23px;+  opacity: 0.5;+  filter: alpha(opacity=50);+}+.carousel-control.right {+  left: auto;+  right: 15px;+}+.carousel-control:hover {+  color: #ffffff;+  text-decoration: none;+  opacity: 0.9;+  filter: alpha(opacity=90);+}+.carousel-caption {+  position: absolute;+  left: 0;+  right: 0;+  bottom: 0;+  padding: 10px 15px 5px;+  background: #333333;+  background: rgba(0, 0, 0, 0.75);+}+.carousel-caption h4, .carousel-caption p {+  color: #ffffff;+}+.hero-unit {+  padding: 60px;+  margin-bottom: 30px;+  background-color: #f5f5f5;+  -webkit-border-radius: 6px;+  -moz-border-radius: 6px;+  border-radius: 6px;+}+.hero-unit h1 {+  margin-bottom: 0;+  font-size: 60px;+  line-height: 1;+  letter-spacing: -1px;+}+.hero-unit p {+  font-size: 18px;+  font-weight: 200;+  line-height: 27px;+}+.pull-right {+  float: right;+}+.pull-left {+  float: left;+}+.hide {+  display: none;+}+.show {+  display: block;+}+.invisible {+  visibility: hidden;+}
+ static/img/glyphicons-halflings-white.png view

binary file changed (absent → 4352 bytes)

+ static/img/glyphicons-halflings.png view

binary file changed (absent → 4352 bytes)

+ static/js/bootstrap.js view
@@ -0,0 +1,1720 @@+/* ===================================================+ * bootstrap-transition.js v2.0.1+ * http://twitter.github.com/bootstrap/javascript.html#transitions+ * ===================================================+ * Copyright 2012 Twitter, Inc.+ *+ * 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.+ * ========================================================== */++!function( $ ) {++  $(function () {++    "use strict"++    /* CSS TRANSITION SUPPORT (https://gist.github.com/373874)+     * ======================================================= */++    $.support.transition = (function () {+      var thisBody = document.body || document.documentElement+        , thisStyle = thisBody.style+        , support = thisStyle.transition !== undefined || thisStyle.WebkitTransition !== undefined || thisStyle.MozTransition !== undefined || thisStyle.MsTransition !== undefined || thisStyle.OTransition !== undefined++      return support && {+        end: (function () {+          var transitionEnd = "TransitionEnd"+          if ( $.browser.webkit ) {+          	transitionEnd = "webkitTransitionEnd"+          } else if ( $.browser.mozilla ) {+          	transitionEnd = "transitionend"+          } else if ( $.browser.opera ) {+          	transitionEnd = "oTransitionEnd"+          }+          return transitionEnd+        }())+      }+    })()++  })++}( window.jQuery );/* ==========================================================+ * bootstrap-alert.js v2.0.1+ * http://twitter.github.com/bootstrap/javascript.html#alerts+ * ==========================================================+ * Copyright 2012 Twitter, Inc.+ *+ * 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.+ * ========================================================== */+++!function( $ ){++  "use strict"++ /* ALERT CLASS DEFINITION+  * ====================== */++  var dismiss = '[data-dismiss="alert"]'+    , Alert = function ( el ) {+        $(el).on('click', dismiss, this.close)+      }++  Alert.prototype = {++    constructor: Alert++  , close: function ( e ) {+      var $this = $(this)+        , selector = $this.attr('data-target')+        , $parent++      if (!selector) {+        selector = $this.attr('href')+        selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7+      }++      $parent = $(selector)+      $parent.trigger('close')++      e && e.preventDefault()++      $parent.length || ($parent = $this.hasClass('alert') ? $this : $this.parent())++      $parent+        .trigger('close')+        .removeClass('in')++      function removeElement() {+        $parent+          .trigger('closed')+          .remove()+      }++      $.support.transition && $parent.hasClass('fade') ?+        $parent.on($.support.transition.end, removeElement) :+        removeElement()+    }++  }+++ /* ALERT PLUGIN DEFINITION+  * ======================= */++  $.fn.alert = function ( option ) {+    return this.each(function () {+      var $this = $(this)+        , data = $this.data('alert')+      if (!data) $this.data('alert', (data = new Alert(this)))+      if (typeof option == 'string') data[option].call($this)+    })+  }++  $.fn.alert.Constructor = Alert+++ /* ALERT DATA-API+  * ============== */++  $(function () {+    $('body').on('click.alert.data-api', dismiss, Alert.prototype.close)+  })++}( window.jQuery );/* ============================================================+ * bootstrap-button.js v2.0.1+ * http://twitter.github.com/bootstrap/javascript.html#buttons+ * ============================================================+ * Copyright 2012 Twitter, Inc.+ *+ * 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.+ * ============================================================ */++!function( $ ){++  "use strict"++ /* BUTTON PUBLIC CLASS DEFINITION+  * ============================== */++  var Button = function ( element, options ) {+    this.$element = $(element)+    this.options = $.extend({}, $.fn.button.defaults, options)+  }++  Button.prototype = {++      constructor: Button++    , setState: function ( state ) {+        var d = 'disabled'+          , $el = this.$element+          , data = $el.data()+          , val = $el.is('input') ? 'val' : 'html'++        state = state + 'Text'+        data.resetText || $el.data('resetText', $el[val]())++        $el[val](data[state] || this.options[state])++        // push to event loop to allow forms to submit+        setTimeout(function () {+          state == 'loadingText' ?+            $el.addClass(d).attr(d, d) :+            $el.removeClass(d).removeAttr(d)+        }, 0)+      }++    , toggle: function () {+        var $parent = this.$element.parent('[data-toggle="buttons-radio"]')++        $parent && $parent+          .find('.active')+          .removeClass('active')++        this.$element.toggleClass('active')+      }++  }+++ /* BUTTON PLUGIN DEFINITION+  * ======================== */++  $.fn.button = function ( option ) {+    return this.each(function () {+      var $this = $(this)+        , data = $this.data('button')+        , options = typeof option == 'object' && option+      if (!data) $this.data('button', (data = new Button(this, options)))+      if (option == 'toggle') data.toggle()+      else if (option) data.setState(option)+    })+  }++  $.fn.button.defaults = {+    loadingText: 'loading...'+  }++  $.fn.button.Constructor = Button+++ /* BUTTON DATA-API+  * =============== */++  $(function () {+    $('body').on('click.button.data-api', '[data-toggle^=button]', function ( e ) {+      var $btn = $(e.target)+      if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn')+      $btn.button('toggle')+    })+  })++}( window.jQuery );/* ==========================================================+ * bootstrap-carousel.js v2.0.1+ * http://twitter.github.com/bootstrap/javascript.html#carousel+ * ==========================================================+ * Copyright 2012 Twitter, Inc.+ *+ * 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.+ * ========================================================== */+++!function( $ ){++  "use strict"++ /* CAROUSEL CLASS DEFINITION+  * ========================= */++  var Carousel = function (element, options) {+    this.$element = $(element)+    this.options = $.extend({}, $.fn.carousel.defaults, options)+    this.options.slide && this.slide(this.options.slide)+  }++  Carousel.prototype = {++    cycle: function () {+      this.interval = setInterval($.proxy(this.next, this), this.options.interval)+      return this+    }++  , to: function (pos) {+      var $active = this.$element.find('.active')+        , children = $active.parent().children()+        , activePos = children.index($active)+        , that = this++      if (pos > (children.length - 1) || pos < 0) return++      if (this.sliding) {+        return this.$element.one('slid', function () {+          that.to(pos)+        })+      }++      if (activePos == pos) {+        return this.pause().cycle()+      }++      return this.slide(pos > activePos ? 'next' : 'prev', $(children[pos]))+    }++  , pause: function () {+      clearInterval(this.interval)+      this.interval = null+      return this+    }++  , next: function () {+      if (this.sliding) return+      return this.slide('next')+    }++  , prev: function () {+      if (this.sliding) return+      return this.slide('prev')+    }++  , slide: function (type, next) {+      var $active = this.$element.find('.active')+        , $next = next || $active[type]()+        , isCycling = this.interval+        , direction = type == 'next' ? 'left' : 'right'+        , fallback  = type == 'next' ? 'first' : 'last'+        , that = this++      if (!$next.length) return++      this.sliding = true++      isCycling && this.pause()++      $next = $next.length ? $next : this.$element.find('.item')[fallback]()++      if (!$.support.transition && this.$element.hasClass('slide')) {+        this.$element.trigger('slide')+        $active.removeClass('active')+        $next.addClass('active')+        this.sliding = false+        this.$element.trigger('slid')+      } else {+        $next.addClass(type)+        $next[0].offsetWidth // force reflow+        $active.addClass(direction)+        $next.addClass(direction)+        this.$element.trigger('slide')+        this.$element.one($.support.transition.end, function () {+          $next.removeClass([type, direction].join(' ')).addClass('active')+          $active.removeClass(['active', direction].join(' '))+          that.sliding = false+          setTimeout(function () { that.$element.trigger('slid') }, 0)+        })+      }++      isCycling && this.cycle()++      return this+    }++  }+++ /* CAROUSEL PLUGIN DEFINITION+  * ========================== */++  $.fn.carousel = function ( option ) {+    return this.each(function () {+      var $this = $(this)+        , data = $this.data('carousel')+        , options = typeof option == 'object' && option+      if (!data) $this.data('carousel', (data = new Carousel(this, options)))+      if (typeof option == 'number') data.to(option)+      else if (typeof option == 'string' || (option = options.slide)) data[option]()+      else data.cycle()+    })+  }++  $.fn.carousel.defaults = {+    interval: 5000+  }++  $.fn.carousel.Constructor = Carousel+++ /* CAROUSEL DATA-API+  * ================= */++  $(function () {+    $('body').on('click.carousel.data-api', '[data-slide]', function ( e ) {+      var $this = $(this), href+        , $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7+        , options = !$target.data('modal') && $.extend({}, $target.data(), $this.data())+      $target.carousel(options)+      e.preventDefault()+    })+  })++}( window.jQuery );/* =============================================================+ * bootstrap-collapse.js v2.0.1+ * http://twitter.github.com/bootstrap/javascript.html#collapse+ * =============================================================+ * Copyright 2012 Twitter, Inc.+ *+ * 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.+ * ============================================================ */++!function( $ ){++  "use strict"++  var Collapse = function ( element, options ) {+  	this.$element = $(element)+    this.options = $.extend({}, $.fn.collapse.defaults, options)++    if (this.options["parent"]) {+      this.$parent = $(this.options["parent"])+    }++    this.options.toggle && this.toggle()+  }++  Collapse.prototype = {++    constructor: Collapse++  , dimension: function () {+      var hasWidth = this.$element.hasClass('width')+      return hasWidth ? 'width' : 'height'+    }++  , show: function () {+      var dimension = this.dimension()+        , scroll = $.camelCase(['scroll', dimension].join('-'))+        , actives = this.$parent && this.$parent.find('.in')+        , hasData++      if (actives && actives.length) {+        hasData = actives.data('collapse')+        actives.collapse('hide')+        hasData || actives.data('collapse', null)+      }++      this.$element[dimension](0)+      this.transition('addClass', 'show', 'shown')+      this.$element[dimension](this.$element[0][scroll])++    }++  , hide: function () {+      var dimension = this.dimension()+      this.reset(this.$element[dimension]())+      this.transition('removeClass', 'hide', 'hidden')+      this.$element[dimension](0)+    }++  , reset: function ( size ) {+      var dimension = this.dimension()++      this.$element+        .removeClass('collapse')+        [dimension](size || 'auto')+        [0].offsetWidth++      this.$element.addClass('collapse')+    }++  , transition: function ( method, startEvent, completeEvent ) {+      var that = this+        , complete = function () {+            if (startEvent == 'show') that.reset()+            that.$element.trigger(completeEvent)+          }++      this.$element+        .trigger(startEvent)+        [method]('in')++      $.support.transition && this.$element.hasClass('collapse') ?+        this.$element.one($.support.transition.end, complete) :+        complete()+  	}++  , toggle: function () {+      this[this.$element.hasClass('in') ? 'hide' : 'show']()+  	}++  }++  /* COLLAPSIBLE PLUGIN DEFINITION+  * ============================== */++  $.fn.collapse = function ( option ) {+    return this.each(function () {+      var $this = $(this)+        , data = $this.data('collapse')+        , options = typeof option == 'object' && option+      if (!data) $this.data('collapse', (data = new Collapse(this, options)))+      if (typeof option == 'string') data[option]()+    })+  }++  $.fn.collapse.defaults = {+    toggle: true+  }++  $.fn.collapse.Constructor = Collapse+++ /* COLLAPSIBLE DATA-API+  * ==================== */++  $(function () {+    $('body').on('click.collapse.data-api', '[data-toggle=collapse]', function ( e ) {+      var $this = $(this), href+        , target = $this.attr('data-target')+          || e.preventDefault()+          || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') //strip for ie7+        , option = $(target).data('collapse') ? 'toggle' : $this.data()+      $(target).collapse(option)+    })+  })++}( window.jQuery );/* ============================================================+ * bootstrap-dropdown.js v2.0.1+ * http://twitter.github.com/bootstrap/javascript.html#dropdowns+ * ============================================================+ * Copyright 2012 Twitter, Inc.+ *+ * 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.+ * ============================================================ */+++!function( $ ){++  "use strict"++ /* DROPDOWN CLASS DEFINITION+  * ========================= */++  var toggle = '[data-toggle="dropdown"]'+    , Dropdown = function ( element ) {+        var $el = $(element).on('click.dropdown.data-api', this.toggle)+        $('html').on('click.dropdown.data-api', function () {+          $el.parent().removeClass('open')+        })+      }++  Dropdown.prototype = {++    constructor: Dropdown++  , toggle: function ( e ) {+      var $this = $(this)+        , selector = $this.attr('data-target')+        , $parent+        , isActive++      if (!selector) {+        selector = $this.attr('href')+        selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7+      }++      $parent = $(selector)+      $parent.length || ($parent = $this.parent())++      isActive = $parent.hasClass('open')++      clearMenus()+      !isActive && $parent.toggleClass('open')++      return false+    }++  }++  function clearMenus() {+    $(toggle).parent().removeClass('open')+  }+++  /* DROPDOWN PLUGIN DEFINITION+   * ========================== */++  $.fn.dropdown = function ( option ) {+    return this.each(function () {+      var $this = $(this)+        , data = $this.data('dropdown')+      if (!data) $this.data('dropdown', (data = new Dropdown(this)))+      if (typeof option == 'string') data[option].call($this)+    })+  }++  $.fn.dropdown.Constructor = Dropdown+++  /* APPLY TO STANDARD DROPDOWN ELEMENTS+   * =================================== */++  $(function () {+    $('html').on('click.dropdown.data-api', clearMenus)+    $('body').on('click.dropdown.data-api', toggle, Dropdown.prototype.toggle)+  })++}( window.jQuery );/* =========================================================+ * bootstrap-modal.js v2.0.1+ * http://twitter.github.com/bootstrap/javascript.html#modals+ * =========================================================+ * Copyright 2012 Twitter, Inc.+ *+ * 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.+ * ========================================================= */+++!function( $ ){++  "use strict"++ /* MODAL CLASS DEFINITION+  * ====================== */++  var Modal = function ( content, options ) {+    this.options = options+    this.$element = $(content)+      .delegate('[data-dismiss="modal"]', 'click.dismiss.modal', $.proxy(this.hide, this))+  }++  Modal.prototype = {++      constructor: Modal++    , toggle: function () {+        return this[!this.isShown ? 'show' : 'hide']()+      }++    , show: function () {+        var that = this++        if (this.isShown) return++        $('body').addClass('modal-open')++        this.isShown = true+        this.$element.trigger('show')++        escape.call(this)+        backdrop.call(this, function () {+          var transition = $.support.transition && that.$element.hasClass('fade')++          !that.$element.parent().length && that.$element.appendTo(document.body) //don't move modals dom position++          that.$element+            .show()++          if (transition) {+            that.$element[0].offsetWidth // force reflow+          }++          that.$element.addClass('in')++          transition ?+            that.$element.one($.support.transition.end, function () { that.$element.trigger('shown') }) :+            that.$element.trigger('shown')++        })+      }++    , hide: function ( e ) {+        e && e.preventDefault()++        if (!this.isShown) return++        var that = this+        this.isShown = false++        $('body').removeClass('modal-open')++        escape.call(this)++        this.$element+          .trigger('hide')+          .removeClass('in')++        $.support.transition && this.$element.hasClass('fade') ?+          hideWithTransition.call(this) :+          hideModal.call(this)+      }++  }+++ /* MODAL PRIVATE METHODS+  * ===================== */++  function hideWithTransition() {+    var that = this+      , timeout = setTimeout(function () {+          that.$element.off($.support.transition.end)+          hideModal.call(that)+        }, 500)++    this.$element.one($.support.transition.end, function () {+      clearTimeout(timeout)+      hideModal.call(that)+    })+  }++  function hideModal( that ) {+    this.$element+      .hide()+      .trigger('hidden')++    backdrop.call(this)+  }++  function backdrop( callback ) {+    var that = this+      , animate = this.$element.hasClass('fade') ? 'fade' : ''++    if (this.isShown && this.options.backdrop) {+      var doAnimate = $.support.transition && animate++      this.$backdrop = $('<div class="modal-backdrop ' + animate + '" />')+        .appendTo(document.body)++      if (this.options.backdrop != 'static') {+        this.$backdrop.click($.proxy(this.hide, this))+      }++      if (doAnimate) this.$backdrop[0].offsetWidth // force reflow++      this.$backdrop.addClass('in')++      doAnimate ?+        this.$backdrop.one($.support.transition.end, callback) :+        callback()++    } else if (!this.isShown && this.$backdrop) {+      this.$backdrop.removeClass('in')++      $.support.transition && this.$element.hasClass('fade')?+        this.$backdrop.one($.support.transition.end, $.proxy(removeBackdrop, this)) :+        removeBackdrop.call(this)++    } else if (callback) {+      callback()+    }+  }++  function removeBackdrop() {+    this.$backdrop.remove()+    this.$backdrop = null+  }++  function escape() {+    var that = this+    if (this.isShown && this.options.keyboard) {+      $(document).on('keyup.dismiss.modal', function ( e ) {+        e.which == 27 && that.hide()+      })+    } else if (!this.isShown) {+      $(document).off('keyup.dismiss.modal')+    }+  }+++ /* MODAL PLUGIN DEFINITION+  * ======================= */++  $.fn.modal = function ( option ) {+    return this.each(function () {+      var $this = $(this)+        , data = $this.data('modal')+        , options = $.extend({}, $.fn.modal.defaults, $this.data(), typeof option == 'object' && option)+      if (!data) $this.data('modal', (data = new Modal(this, options)))+      if (typeof option == 'string') data[option]()+      else if (options.show) data.show()+    })+  }++  $.fn.modal.defaults = {+      backdrop: true+    , keyboard: true+    , show: true+  }++  $.fn.modal.Constructor = Modal+++ /* MODAL DATA-API+  * ============== */++  $(function () {+    $('body').on('click.modal.data-api', '[data-toggle="modal"]', function ( e ) {+      var $this = $(this), href+        , $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7+        , option = $target.data('modal') ? 'toggle' : $.extend({}, $target.data(), $this.data())++      e.preventDefault()+      $target.modal(option)+    })+  })++}( window.jQuery );/* ===========================================================+ * bootstrap-tooltip.js v2.0.1+ * http://twitter.github.com/bootstrap/javascript.html#tooltips+ * Inspired by the original jQuery.tipsy by Jason Frame+ * ===========================================================+ * Copyright 2012 Twitter, Inc.+ *+ * 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.+ * ========================================================== */++!function( $ ) {++  "use strict"++ /* TOOLTIP PUBLIC CLASS DEFINITION+  * =============================== */++  var Tooltip = function ( element, options ) {+    this.init('tooltip', element, options)+  }++  Tooltip.prototype = {++    constructor: Tooltip++  , init: function ( type, element, options ) {+      var eventIn+        , eventOut++      this.type = type+      this.$element = $(element)+      this.options = this.getOptions(options)+      this.enabled = true++      if (this.options.trigger != 'manual') {+        eventIn  = this.options.trigger == 'hover' ? 'mouseenter' : 'focus'+        eventOut = this.options.trigger == 'hover' ? 'mouseleave' : 'blur'+        this.$element.on(eventIn, this.options.selector, $.proxy(this.enter, this))+        this.$element.on(eventOut, this.options.selector, $.proxy(this.leave, this))+      }++      this.options.selector ?+        (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) :+        this.fixTitle()+    }++  , getOptions: function ( options ) {+      options = $.extend({}, $.fn[this.type].defaults, options, this.$element.data())++      if (options.delay && typeof options.delay == 'number') {+        options.delay = {+          show: options.delay+        , hide: options.delay+        }+      }++      return options+    }++  , enter: function ( e ) {+      var self = $(e.currentTarget)[this.type](this._options).data(this.type)++      if (!self.options.delay || !self.options.delay.show) {+        self.show()+      } else {+        self.hoverState = 'in'+        setTimeout(function() {+          if (self.hoverState == 'in') {+            self.show()+          }+        }, self.options.delay.show)+      }+    }++  , leave: function ( e ) {+      var self = $(e.currentTarget)[this.type](this._options).data(this.type)++      if (!self.options.delay || !self.options.delay.hide) {+        self.hide()+      } else {+        self.hoverState = 'out'+        setTimeout(function() {+          if (self.hoverState == 'out') {+            self.hide()+          }+        }, self.options.delay.hide)+      }+    }++  , show: function () {+      var $tip+        , inside+        , pos+        , actualWidth+        , actualHeight+        , placement+        , tp++      if (this.hasContent() && this.enabled) {+        $tip = this.tip()+        this.setContent()++        if (this.options.animation) {+          $tip.addClass('fade')+        }++        placement = typeof this.options.placement == 'function' ?+          this.options.placement.call(this, $tip[0], this.$element[0]) :+          this.options.placement++        inside = /in/.test(placement)++        $tip+          .remove()+          .css({ top: 0, left: 0, display: 'block' })+          .appendTo(inside ? this.$element : document.body)++        pos = this.getPosition(inside)++        actualWidth = $tip[0].offsetWidth+        actualHeight = $tip[0].offsetHeight++        switch (inside ? placement.split(' ')[1] : placement) {+          case 'bottom':+            tp = {top: pos.top + pos.height, left: pos.left + pos.width / 2 - actualWidth / 2}+            break+          case 'top':+            tp = {top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2}+            break+          case 'left':+            tp = {top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth}+            break+          case 'right':+            tp = {top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width}+            break+        }++        $tip+          .css(tp)+          .addClass(placement)+          .addClass('in')+      }+    }++  , setContent: function () {+      var $tip = this.tip()+      $tip.find('.tooltip-inner').html(this.getTitle())+      $tip.removeClass('fade in top bottom left right')+    }++  , hide: function () {+      var that = this+        , $tip = this.tip()++      $tip.removeClass('in')++      function removeWithAnimation() {+        var timeout = setTimeout(function () {+          $tip.off($.support.transition.end).remove()+        }, 500)++        $tip.one($.support.transition.end, function () {+          clearTimeout(timeout)+          $tip.remove()+        })+      }++      $.support.transition && this.$tip.hasClass('fade') ?+        removeWithAnimation() :+        $tip.remove()+    }++  , fixTitle: function () {+      var $e = this.$element+      if ($e.attr('title') || typeof($e.attr('data-original-title')) != 'string') {+        $e.attr('data-original-title', $e.attr('title') || '').removeAttr('title')+      }+    }++  , hasContent: function () {+      return this.getTitle()+    }++  , getPosition: function (inside) {+      return $.extend({}, (inside ? {top: 0, left: 0} : this.$element.offset()), {+        width: this.$element[0].offsetWidth+      , height: this.$element[0].offsetHeight+      })+    }++  , getTitle: function () {+      var title+        , $e = this.$element+        , o = this.options++      title = $e.attr('data-original-title')+        || (typeof o.title == 'function' ? o.title.call($e[0]) :  o.title)++      title = title.toString().replace(/(^\s*|\s*$)/, "")++      return title+    }++  , tip: function () {+      return this.$tip = this.$tip || $(this.options.template)+    }++  , validate: function () {+      if (!this.$element[0].parentNode) {+        this.hide()+        this.$element = null+        this.options = null+      }+    }++  , enable: function () {+      this.enabled = true+    }++  , disable: function () {+      this.enabled = false+    }++  , toggleEnabled: function () {+      this.enabled = !this.enabled+    }++  , toggle: function () {+      this[this.tip().hasClass('in') ? 'hide' : 'show']()+    }++  }+++ /* TOOLTIP PLUGIN DEFINITION+  * ========================= */++  $.fn.tooltip = function ( option ) {+    return this.each(function () {+      var $this = $(this)+        , data = $this.data('tooltip')+        , options = typeof option == 'object' && option+      if (!data) $this.data('tooltip', (data = new Tooltip(this, options)))+      if (typeof option == 'string') data[option]()+    })+  }++  $.fn.tooltip.Constructor = Tooltip++  $.fn.tooltip.defaults = {+    animation: true+  , delay: 0+  , selector: false+  , placement: 'top'+  , trigger: 'hover'+  , title: ''+  , template: '<div class="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>'+  }++}( window.jQuery );/* ===========================================================+ * bootstrap-popover.js v2.0.1+ * http://twitter.github.com/bootstrap/javascript.html#popovers+ * ===========================================================+ * Copyright 2012 Twitter, Inc.+ *+ * 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.+ * =========================================================== */+++!function( $ ) {++ "use strict"++  var Popover = function ( element, options ) {+    this.init('popover', element, options)+  }++  /* NOTE: POPOVER EXTENDS BOOTSTRAP-TOOLTIP.js+     ========================================== */++  Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype, {++    constructor: Popover++  , setContent: function () {+      var $tip = this.tip()+        , title = this.getTitle()+        , content = this.getContent()++      $tip.find('.popover-title')[ $.type(title) == 'object' ? 'append' : 'html' ](title)+      $tip.find('.popover-content > *')[ $.type(content) == 'object' ? 'append' : 'html' ](content)++      $tip.removeClass('fade top bottom left right in')+    }++  , hasContent: function () {+      return this.getTitle() || this.getContent()+    }++  , getContent: function () {+      var content+        , $e = this.$element+        , o = this.options++      content = $e.attr('data-content')+        || (typeof o.content == 'function' ? o.content.call($e[0]) :  o.content)++      content = content.toString().replace(/(^\s*|\s*$)/, "")++      return content+    }++  , tip: function() {+      if (!this.$tip) {+        this.$tip = $(this.options.template)+      }+      return this.$tip+    }++  })+++ /* POPOVER PLUGIN DEFINITION+  * ======================= */++  $.fn.popover = function ( option ) {+    return this.each(function () {+      var $this = $(this)+        , data = $this.data('popover')+        , options = typeof option == 'object' && option+      if (!data) $this.data('popover', (data = new Popover(this, options)))+      if (typeof option == 'string') data[option]()+    })+  }++  $.fn.popover.Constructor = Popover++  $.fn.popover.defaults = $.extend({} , $.fn.tooltip.defaults, {+    placement: 'right'+  , content: ''+  , template: '<div class="popover"><div class="arrow"></div><div class="popover-inner"><h3 class="popover-title"></h3><div class="popover-content"><p></p></div></div></div>'+  })++}( window.jQuery );/* =============================================================+ * bootstrap-scrollspy.js v2.0.1+ * http://twitter.github.com/bootstrap/javascript.html#scrollspy+ * =============================================================+ * Copyright 2012 Twitter, Inc.+ *+ * 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.+ * ============================================================== */++!function ( $ ) {++  "use strict"++  /* SCROLLSPY CLASS DEFINITION+   * ========================== */++  function ScrollSpy( element, options) {+    var process = $.proxy(this.process, this)+      , $element = $(element).is('body') ? $(window) : $(element)+      , href+    this.options = $.extend({}, $.fn.scrollspy.defaults, options)+    this.$scrollElement = $element.on('scroll.scroll.data-api', process)+    this.selector = (this.options.target+      || ((href = $(element).attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7+      || '') + ' .nav li > a'+    this.$body = $('body').on('click.scroll.data-api', this.selector, process)+    this.refresh()+    this.process()+  }++  ScrollSpy.prototype = {++      constructor: ScrollSpy++    , refresh: function () {+        this.targets = this.$body+          .find(this.selector)+          .map(function () {+            var href = $(this).attr('href')+            return /^#\w/.test(href) && $(href).length ? href : null+          })++        this.offsets = $.map(this.targets, function (id) {+          return $(id).position().top+        })+      }++    , process: function () {+        var scrollTop = this.$scrollElement.scrollTop() + this.options.offset+          , offsets = this.offsets+          , targets = this.targets+          , activeTarget = this.activeTarget+          , i++        for (i = offsets.length; i--;) {+          activeTarget != targets[i]+            && scrollTop >= offsets[i]+            && (!offsets[i + 1] || scrollTop <= offsets[i + 1])+            && this.activate( targets[i] )+        }+      }++    , activate: function (target) {+        var active++        this.activeTarget = target++        this.$body+          .find(this.selector).parent('.active')+          .removeClass('active')++        active = this.$body+          .find(this.selector + '[href="' + target + '"]')+          .parent('li')+          .addClass('active')++        if ( active.parent('.dropdown-menu') )  {+          active.closest('li.dropdown').addClass('active')+        }+      }++  }+++ /* SCROLLSPY PLUGIN DEFINITION+  * =========================== */++  $.fn.scrollspy = function ( option ) {+    return this.each(function () {+      var $this = $(this)+        , data = $this.data('scrollspy')+        , options = typeof option == 'object' && option+      if (!data) $this.data('scrollspy', (data = new ScrollSpy(this, options)))+      if (typeof option == 'string') data[option]()+    })+  }++  $.fn.scrollspy.Constructor = ScrollSpy++  $.fn.scrollspy.defaults = {+    offset: 10+  }+++ /* SCROLLSPY DATA-API+  * ================== */++  $(function () {+    $('[data-spy="scroll"]').each(function () {+      var $spy = $(this)+      $spy.scrollspy($spy.data())+    })+  })++}( window.jQuery );/* ========================================================+ * bootstrap-tab.js v2.0.1+ * http://twitter.github.com/bootstrap/javascript.html#tabs+ * ========================================================+ * Copyright 2012 Twitter, Inc.+ *+ * 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.+ * ======================================================== */+++!function( $ ){++  "use strict"++ /* TAB CLASS DEFINITION+  * ==================== */++  var Tab = function ( element ) {+    this.element = $(element)+  }++  Tab.prototype = {++    constructor: Tab++  , show: function () {+      var $this = this.element+        , $ul = $this.closest('ul:not(.dropdown-menu)')+        , selector = $this.attr('data-target')+        , previous+        , $target++      if (!selector) {+        selector = $this.attr('href')+        selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7+      }++      if ( $this.parent('li').hasClass('active') ) return++      previous = $ul.find('.active a').last()[0]++      $this.trigger({+        type: 'show'+      , relatedTarget: previous+      })++      $target = $(selector)++      this.activate($this.parent('li'), $ul)+      this.activate($target, $target.parent(), function () {+        $this.trigger({+          type: 'shown'+        , relatedTarget: previous+        })+      })+    }++  , activate: function ( element, container, callback) {+      var $active = container.find('> .active')+        , transition = callback+            && $.support.transition+            && $active.hasClass('fade')++      function next() {+        $active+          .removeClass('active')+          .find('> .dropdown-menu > .active')+          .removeClass('active')++        element.addClass('active')++        if (transition) {+          element[0].offsetWidth // reflow for transition+          element.addClass('in')+        } else {+          element.removeClass('fade')+        }++        if ( element.parent('.dropdown-menu') ) {+          element.closest('li.dropdown').addClass('active')+        }++        callback && callback()+      }++      transition ?+        $active.one($.support.transition.end, next) :+        next()++      $active.removeClass('in')+    }+  }+++ /* TAB PLUGIN DEFINITION+  * ===================== */++  $.fn.tab = function ( option ) {+    return this.each(function () {+      var $this = $(this)+        , data = $this.data('tab')+      if (!data) $this.data('tab', (data = new Tab(this)))+      if (typeof option == 'string') data[option]()+    })+  }++  $.fn.tab.Constructor = Tab+++ /* TAB DATA-API+  * ============ */++  $(function () {+    $('body').on('click.tab.data-api', '[data-toggle="tab"], [data-toggle="pill"]', function (e) {+      e.preventDefault()+      $(this).tab('show')+    })+  })++}( window.jQuery );/* =============================================================+ * bootstrap-typeahead.js v2.0.1+ * http://twitter.github.com/bootstrap/javascript.html#typeahead+ * =============================================================+ * Copyright 2012 Twitter, Inc.+ *+ * 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.+ * ============================================================ */++!function( $ ){++  "use strict"++  var Typeahead = function ( element, options ) {+    this.$element = $(element)+    this.options = $.extend({}, $.fn.typeahead.defaults, options)+    this.matcher = this.options.matcher || this.matcher+    this.sorter = this.options.sorter || this.sorter+    this.highlighter = this.options.highlighter || this.highlighter+    this.$menu = $(this.options.menu).appendTo('body')+    this.source = this.options.source+    this.shown = false+    this.listen()+  }++  Typeahead.prototype = {++    constructor: Typeahead++  , select: function () {+      var val = this.$menu.find('.active').attr('data-value')+      this.$element.val(val)+      return this.hide()+    }++  , show: function () {+      var pos = $.extend({}, this.$element.offset(), {+        height: this.$element[0].offsetHeight+      })++      this.$menu.css({+        top: pos.top + pos.height+      , left: pos.left+      })++      this.$menu.show()+      this.shown = true+      return this+    }++  , hide: function () {+      this.$menu.hide()+      this.shown = false+      return this+    }++  , lookup: function (event) {+      var that = this+        , items+        , q++      this.query = this.$element.val()++      if (!this.query) {+        return this.shown ? this.hide() : this+      }++      items = $.grep(this.source, function (item) {+        if (that.matcher(item)) return item+      })++      items = this.sorter(items)++      if (!items.length) {+        return this.shown ? this.hide() : this+      }++      return this.render(items.slice(0, this.options.items)).show()+    }++  , matcher: function (item) {+      return ~item.toLowerCase().indexOf(this.query.toLowerCase())+    }++  , sorter: function (items) {+      var beginswith = []+        , caseSensitive = []+        , caseInsensitive = []+        , item++      while (item = items.shift()) {+        if (!item.toLowerCase().indexOf(this.query.toLowerCase())) beginswith.push(item)+        else if (~item.indexOf(this.query)) caseSensitive.push(item)+        else caseInsensitive.push(item)+      }++      return beginswith.concat(caseSensitive, caseInsensitive)+    }++  , highlighter: function (item) {+      return item.replace(new RegExp('(' + this.query + ')', 'ig'), function ($1, match) {+        return '<strong>' + match + '</strong>'+      })+    }++  , render: function (items) {+      var that = this++      items = $(items).map(function (i, item) {+        i = $(that.options.item).attr('data-value', item)+        i.find('a').html(that.highlighter(item))+        return i[0]+      })++      items.first().addClass('active')+      this.$menu.html(items)+      return this+    }++  , next: function (event) {+      var active = this.$menu.find('.active').removeClass('active')+        , next = active.next()++      if (!next.length) {+        next = $(this.$menu.find('li')[0])+      }++      next.addClass('active')+    }++  , prev: function (event) {+      var active = this.$menu.find('.active').removeClass('active')+        , prev = active.prev()++      if (!prev.length) {+        prev = this.$menu.find('li').last()+      }++      prev.addClass('active')+    }++  , listen: function () {+      this.$element+        .on('blur',     $.proxy(this.blur, this))+        .on('keypress', $.proxy(this.keypress, this))+        .on('keyup',    $.proxy(this.keyup, this))++      if ($.browser.webkit || $.browser.msie) {+        this.$element.on('keydown', $.proxy(this.keypress, this))+      }++      this.$menu+        .on('click', $.proxy(this.click, this))+        .on('mouseenter', 'li', $.proxy(this.mouseenter, this))+    }++  , keyup: function (e) {+      e.stopPropagation()+      e.preventDefault()++      switch(e.keyCode) {+        case 40: // down arrow+        case 38: // up arrow+          break++        case 9: // tab+        case 13: // enter+          if (!this.shown) return+          this.select()+          break++        case 27: // escape+          this.hide()+          break++        default:+          this.lookup()+      }++  }++  , keypress: function (e) {+      e.stopPropagation()+      if (!this.shown) return++      switch(e.keyCode) {+        case 9: // tab+        case 13: // enter+        case 27: // escape+          e.preventDefault()+          break++        case 38: // up arrow+          e.preventDefault()+          this.prev()+          break++        case 40: // down arrow+          e.preventDefault()+          this.next()+          break+      }+    }++  , blur: function (e) {+      var that = this+      e.stopPropagation()+      e.preventDefault()+      setTimeout(function () { that.hide() }, 150)+    }++  , click: function (e) {+      e.stopPropagation()+      e.preventDefault()+      this.select()+    }++  , mouseenter: function (e) {+      this.$menu.find('.active').removeClass('active')+      $(e.currentTarget).addClass('active')+    }++  }+++  /* TYPEAHEAD PLUGIN DEFINITION+   * =========================== */++  $.fn.typeahead = function ( option ) {+    return this.each(function () {+      var $this = $(this)+        , data = $this.data('typeahead')+        , options = typeof option == 'object' && option+      if (!data) $this.data('typeahead', (data = new Typeahead(this, options)))+      if (typeof option == 'string') data[option]()+    })+  }++  $.fn.typeahead.defaults = {+    source: []+  , items: 8+  , menu: '<ul class="typeahead dropdown-menu"></ul>'+  , item: '<li><a href="#"></a></li>'+  }++  $.fn.typeahead.Constructor = Typeahead+++ /* TYPEAHEAD DATA-API+  * ================== */++  $(function () {+    $('body').on('focus.typeahead.data-api', '[data-provide="typeahead"]', function (e) {+      var $this = $(this)+      if ($this.data('typeahead')) return+      e.preventDefault()+      $this.typeahead($this.data())+    })+  })++}( window.jQuery );
+ static/js/modernizr.js view
@@ -0,0 +1,4 @@+/* Modernizr 2.0.6 (Custom Build) | MIT & BSD+ * Build: http://www.modernizr.com/download/#-fontface-backgroundsize-borderimage-borderradius-boxshadow-flexbox-hsla-multiplebgs-opacity-rgba-textshadow-cssanimations-csscolumns-generatedcontent-cssgradients-cssreflections-csstransforms-csstransforms3d-csstransitions-applicationcache-canvas-canvastext-draganddrop-hashchange-history-audio-video-indexeddb-input-inputtypes-localstorage-postmessage-sessionstorage-websockets-websqldatabase-webworkers-geolocation-inlinesvg-smil-svg-svgclippaths-touch-webgl-iepp-cssclasses-teststyles-testprop-testallprops-hasevent-prefixes-domprefixes-load+ */+;window.Modernizr=function(a,b,c){function H(){e.input=function(a){for(var b=0,c=a.length;b<c;b++)t[a[b]]=a[b]in l;return t}("autocomplete autofocus list placeholder max min multiple pattern required step".split(" ")),e.inputtypes=function(a){for(var d=0,e,f,h,i=a.length;d<i;d++)l.setAttribute("type",f=a[d]),e=l.type!=="text",e&&(l.value=m,l.style.cssText="position:absolute;visibility:hidden;",/^range$/.test(f)&&l.style.WebkitAppearance!==c?(g.appendChild(l),h=b.defaultView,e=h.getComputedStyle&&h.getComputedStyle(l,null).WebkitAppearance!=="textfield"&&l.offsetHeight!==0,g.removeChild(l)):/^(search|tel)$/.test(f)||(/^(url|email)$/.test(f)?e=l.checkValidity&&l.checkValidity()===!1:/^color$/.test(f)?(g.appendChild(l),g.offsetWidth,e=l.value!=m,g.removeChild(l)):e=l.value!=m)),s[a[d]]=!!e;return s}("search tel url email datetime date month week time datetime-local number range color".split(" "))}function F(a,b){var c=a.charAt(0).toUpperCase()+a.substr(1),d=(a+" "+p.join(c+" ")+c).split(" ");return E(d,b)}function E(a,b){for(var d in a)if(k[a[d]]!==c)return b=="pfx"?a[d]:!0;return!1}function D(a,b){return!!~(""+a).indexOf(b)}function C(a,b){return typeof a===b}function B(a,b){return A(o.join(a+";")+(b||""))}function A(a){k.cssText=a}var d="2.0.6",e={},f=!0,g=b.documentElement,h=b.head||b.getElementsByTagName("head")[0],i="modernizr",j=b.createElement(i),k=j.style,l=b.createElement("input"),m=":)",n=Object.prototype.toString,o=" -webkit- -moz- -o- -ms- -khtml- ".split(" "),p="Webkit Moz O ms Khtml".split(" "),q={svg:"http://www.w3.org/2000/svg"},r={},s={},t={},u=[],v=function(a,c,d,e){var f,h,j,k=b.createElement("div");if(parseInt(d,10))while(d--)j=b.createElement("div"),j.id=e?e[d]:i+(d+1),k.appendChild(j);f=["&shy;","<style>",a,"</style>"].join(""),k.id=i,k.innerHTML+=f,g.appendChild(k),h=c(k,a),k.parentNode.removeChild(k);return!!h},w=function(){function d(d,e){e=e||b.createElement(a[d]||"div"),d="on"+d;var f=d in e;f||(e.setAttribute||(e=b.createElement("div")),e.setAttribute&&e.removeAttribute&&(e.setAttribute(d,""),f=C(e[d],"function"),C(e[d],c)||(e[d]=c),e.removeAttribute(d))),e=null;return f}var a={select:"input",change:"input",submit:"form",reset:"form",error:"img",load:"img",abort:"img"};return d}(),x,y={}.hasOwnProperty,z;!C(y,c)&&!C(y.call,c)?z=function(a,b){return y.call(a,b)}:z=function(a,b){return b in a&&C(a.constructor.prototype[b],c)};var G=function(c,d){var f=c.join(""),g=d.length;v(f,function(c,d){var f=b.styleSheets[b.styleSheets.length-1],h=f.cssRules&&f.cssRules[0]?f.cssRules[0].cssText:f.cssText||"",i=c.childNodes,j={};while(g--)j[i[g].id]=i[g];e.touch="ontouchstart"in a||j.touch.offsetTop===9,e.csstransforms3d=j.csstransforms3d.offsetLeft===9,e.generatedcontent=j.generatedcontent.offsetHeight>=1,e.fontface=/src/i.test(h)&&h.indexOf(d.split(" ")[0])===0},g,d)}(['@font-face {font-family:"font";src:url("https://")}',["@media (",o.join("touch-enabled),("),i,")","{#touch{top:9px;position:absolute}}"].join(""),["@media (",o.join("transform-3d),("),i,")","{#csstransforms3d{left:9px;position:absolute}}"].join(""),['#generatedcontent:after{content:"',m,'";visibility:hidden}'].join("")],["fontface","touch","csstransforms3d","generatedcontent"]);r.flexbox=function(){function c(a,b,c,d){a.style.cssText=o.join(b+":"+c+";")+(d||"")}function a(a,b,c,d){b+=":",a.style.cssText=(b+o.join(c+";"+b)).slice(0,-b.length)+(d||"")}var d=b.createElement("div"),e=b.createElement("div");a(d,"display","box","width:42px;padding:0;"),c(e,"box-flex","1","width:10px;"),d.appendChild(e),g.appendChild(d);var f=e.offsetWidth===42;d.removeChild(e),g.removeChild(d);return f},r.canvas=function(){var a=b.createElement("canvas");return!!a.getContext&&!!a.getContext("2d")},r.canvastext=function(){return!!e.canvas&&!!C(b.createElement("canvas").getContext("2d").fillText,"function")},r.webgl=function(){return!!a.WebGLRenderingContext},r.touch=function(){return e.touch},r.geolocation=function(){return!!navigator.geolocation},r.postmessage=function(){return!!a.postMessage},r.websqldatabase=function(){var b=!!a.openDatabase;return b},r.indexedDB=function(){for(var b=-1,c=p.length;++b<c;)if(a[p[b].toLowerCase()+"IndexedDB"])return!0;return!!a.indexedDB},r.hashchange=function(){return w("hashchange",a)&&(b.documentMode===c||b.documentMode>7)},r.history=function(){return!!a.history&&!!history.pushState},r.draganddrop=function(){return w("dragstart")&&w("drop")},r.websockets=function(){for(var b=-1,c=p.length;++b<c;)if(a[p[b]+"WebSocket"])return!0;return"WebSocket"in a},r.rgba=function(){A("background-color:rgba(150,255,150,.5)");return D(k.backgroundColor,"rgba")},r.hsla=function(){A("background-color:hsla(120,40%,100%,.5)");return D(k.backgroundColor,"rgba")||D(k.backgroundColor,"hsla")},r.multiplebgs=function(){A("background:url(https://),url(https://),red url(https://)");return/(url\s*\(.*?){3}/.test(k.background)},r.backgroundsize=function(){return F("backgroundSize")},r.borderimage=function(){return F("borderImage")},r.borderradius=function(){return F("borderRadius")},r.boxshadow=function(){return F("boxShadow")},r.textshadow=function(){return b.createElement("div").style.textShadow===""},r.opacity=function(){B("opacity:.55");return/^0.55$/.test(k.opacity)},r.cssanimations=function(){return F("animationName")},r.csscolumns=function(){return F("columnCount")},r.cssgradients=function(){var a="background-image:",b="gradient(linear,left top,right bottom,from(#9f9),to(white));",c="linear-gradient(left top,#9f9, white);";A((a+o.join(b+a)+o.join(c+a)).slice(0,-a.length));return D(k.backgroundImage,"gradient")},r.cssreflections=function(){return F("boxReflect")},r.csstransforms=function(){return!!E(["transformProperty","WebkitTransform","MozTransform","OTransform","msTransform"])},r.csstransforms3d=function(){var a=!!E(["perspectiveProperty","WebkitPerspective","MozPerspective","OPerspective","msPerspective"]);a&&"webkitPerspective"in g.style&&(a=e.csstransforms3d);return a},r.csstransitions=function(){return F("transitionProperty")},r.fontface=function(){return e.fontface},r.generatedcontent=function(){return e.generatedcontent},r.video=function(){var a=b.createElement("video"),c=!1;try{if(c=!!a.canPlayType){c=new Boolean(c),c.ogg=a.canPlayType('video/ogg; codecs="theora"');var d='video/mp4; codecs="avc1.42E01E';c.h264=a.canPlayType(d+'"')||a.canPlayType(d+', mp4a.40.2"'),c.webm=a.canPlayType('video/webm; codecs="vp8, vorbis"')}}catch(e){}return c},r.audio=function(){var a=b.createElement("audio"),c=!1;try{if(c=!!a.canPlayType)c=new Boolean(c),c.ogg=a.canPlayType('audio/ogg; codecs="vorbis"'),c.mp3=a.canPlayType("audio/mpeg;"),c.wav=a.canPlayType('audio/wav; codecs="1"'),c.m4a=a.canPlayType("audio/x-m4a;")||a.canPlayType("audio/aac;")}catch(d){}return c},r.localstorage=function(){try{return!!localStorage.getItem}catch(a){return!1}},r.sessionstorage=function(){try{return!!sessionStorage.getItem}catch(a){return!1}},r.webworkers=function(){return!!a.Worker},r.applicationcache=function(){return!!a.applicationCache},r.svg=function(){return!!b.createElementNS&&!!b.createElementNS(q.svg,"svg").createSVGRect},r.inlinesvg=function(){var a=b.createElement("div");a.innerHTML="<svg/>";return(a.firstChild&&a.firstChild.namespaceURI)==q.svg},r.smil=function(){return!!b.createElementNS&&/SVG/.test(n.call(b.createElementNS(q.svg,"animate")))},r.svgclippaths=function(){return!!b.createElementNS&&/SVG/.test(n.call(b.createElementNS(q.svg,"clipPath")))};for(var I in r)z(r,I)&&(x=I.toLowerCase(),e[x]=r[I](),u.push((e[x]?"":"no-")+x));e.input||H(),A(""),j=l=null,a.attachEvent&&function(){var a=b.createElement("div");a.innerHTML="<elem></elem>";return a.childNodes.length!==1}()&&function(a,b){function s(a){var b=-1;while(++b<g)a.createElement(f[b])}a.iepp=a.iepp||{};var d=a.iepp,e=d.html5elements||"abbr|article|aside|audio|canvas|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",f=e.split("|"),g=f.length,h=new RegExp("(^|\\s)("+e+")","gi"),i=new RegExp("<(/*)("+e+")","gi"),j=/^\s*[\{\}]\s*$/,k=new RegExp("(^|[^\\n]*?\\s)("+e+")([^\\n]*)({[\\n\\w\\W]*?})","gi"),l=b.createDocumentFragment(),m=b.documentElement,n=m.firstChild,o=b.createElement("body"),p=b.createElement("style"),q=/print|all/,r;d.getCSS=function(a,b){if(a+""===c)return"";var e=-1,f=a.length,g,h=[];while(++e<f){g=a[e];if(g.disabled)continue;b=g.media||b,q.test(b)&&h.push(d.getCSS(g.imports,b),g.cssText),b="all"}return h.join("")},d.parseCSS=function(a){var b=[],c;while((c=k.exec(a))!=null)b.push(((j.exec(c[1])?"\n":c[1])+c[2]+c[3]).replace(h,"$1.iepp_$2")+c[4]);return b.join("\n")},d.writeHTML=function(){var a=-1;r=r||b.body;while(++a<g){var c=b.getElementsByTagName(f[a]),d=c.length,e=-1;while(++e<d)c[e].className.indexOf("iepp_")<0&&(c[e].className+=" iepp_"+f[a])}l.appendChild(r),m.appendChild(o),o.className=r.className,o.id=r.id,o.innerHTML=r.innerHTML.replace(i,"<$1font")},d._beforePrint=function(){p.styleSheet.cssText=d.parseCSS(d.getCSS(b.styleSheets,"all")),d.writeHTML()},d.restoreHTML=function(){o.innerHTML="",m.removeChild(o),m.appendChild(r)},d._afterPrint=function(){d.restoreHTML(),p.styleSheet.cssText=""},s(b),s(l);d.disablePP||(n.insertBefore(p,n.firstChild),p.media="print",p.className="iepp-printshim",a.attachEvent("onbeforeprint",d._beforePrint),a.attachEvent("onafterprint",d._afterPrint))}(a,b),e._version=d,e._prefixes=o,e._domPrefixes=p,e.hasEvent=w,e.testProp=function(a){return E([a])},e.testAllProps=F,e.testStyles=v,g.className=g.className.replace(/\bno-js\b/,"")+(f?" js "+u.join(" "):"");return e}(this,this.document),function(a,b,c){function k(a){return!a||a=="loaded"||a=="complete"}function j(){var a=1,b=-1;while(p.length- ++b)if(p[b].s&&!(a=p[b].r))break;a&&g()}function i(a){var c=b.createElement("script"),d;c.src=a.s,c.onreadystatechange=c.onload=function(){!d&&k(c.readyState)&&(d=1,j(),c.onload=c.onreadystatechange=null)},m(function(){d||(d=1,j())},H.errorTimeout),a.e?c.onload():n.parentNode.insertBefore(c,n)}function h(a){var c=b.createElement("link"),d;c.href=a.s,c.rel="stylesheet",c.type="text/css";if(!a.e&&(w||r)){var e=function(a){m(function(){if(!d)try{a.sheet.cssRules.length?(d=1,j()):e(a)}catch(b){b.code==1e3||b.message=="security"||b.message=="denied"?(d=1,m(function(){j()},0)):e(a)}},0)};e(c)}else c.onload=function(){d||(d=1,m(function(){j()},0))},a.e&&c.onload();m(function(){d||(d=1,j())},H.errorTimeout),!a.e&&n.parentNode.insertBefore(c,n)}function g(){var a=p.shift();q=1,a?a.t?m(function(){a.t=="c"?h(a):i(a)},0):(a(),j()):q=0}function f(a,c,d,e,f,h){function i(){!o&&k(l.readyState)&&(r.r=o=1,!q&&j(),l.onload=l.onreadystatechange=null,m(function(){u.removeChild(l)},0))}var l=b.createElement(a),o=0,r={t:d,s:c,e:h};l.src=l.data=c,!s&&(l.style.display="none"),l.width=l.height="0",a!="object"&&(l.type=d),l.onload=l.onreadystatechange=i,a=="img"?l.onerror=i:a=="script"&&(l.onerror=function(){r.e=r.r=1,g()}),p.splice(e,0,r),u.insertBefore(l,s?null:n),m(function(){o||(u.removeChild(l),r.r=r.e=o=1,j())},H.errorTimeout)}function e(a,b,c){var d=b=="c"?z:y;q=0,b=b||"j",C(a)?f(d,a,b,this.i++,l,c):(p.splice(this.i++,0,a),p.length==1&&g());return this}function d(){var a=H;a.loader={load:e,i:0};return a}var l=b.documentElement,m=a.setTimeout,n=b.getElementsByTagName("script")[0],o={}.toString,p=[],q=0,r="MozAppearance"in l.style,s=r&&!!b.createRange().compareNode,t=r&&!s,u=s?l:n.parentNode,v=a.opera&&o.call(a.opera)=="[object Opera]",w="webkitAppearance"in l.style,x=w&&"async"in b.createElement("script"),y=r?"object":v||x?"img":"script",z=w?"img":y,A=Array.isArray||function(a){return o.call(a)=="[object Array]"},B=function(a){return Object(a)===a},C=function(a){return typeof a=="string"},D=function(a){return o.call(a)=="[object Function]"},E=[],F={},G,H;H=function(a){function f(a){var b=a.split("!"),c=E.length,d=b.pop(),e=b.length,f={url:d,origUrl:d,prefixes:b},g,h;for(h=0;h<e;h++)g=F[b[h]],g&&(f=g(f));for(h=0;h<c;h++)f=E[h](f);return f}function e(a,b,e,g,h){var i=f(a),j=i.autoCallback;if(!i.bypass){b&&(b=D(b)?b:b[a]||b[g]||b[a.split("/").pop().split("?")[0]]);if(i.instead)return i.instead(a,b,e,g,h);e.load(i.url,i.forceCSS||!i.forceJS&&/css$/.test(i.url)?"c":c,i.noexec),(D(b)||D(j))&&e.load(function(){d(),b&&b(i.origUrl,h,g),j&&j(i.origUrl,h,g)})}}function b(a,b){function c(a){if(C(a))e(a,h,b,0,d);else if(B(a))for(i in a)a.hasOwnProperty(i)&&e(a[i],h,b,i,d)}var d=!!a.test,f=d?a.yep:a.nope,g=a.load||a.both,h=a.callback,i;c(f),c(g),a.complete&&b.load(a.complete)}var g,h,i=this.yepnope.loader;if(C(a))e(a,0,i,0);else if(A(a))for(g=0;g<a.length;g++)h=a[g],C(h)?e(h,0,i,0):A(h)?H(h):B(h)&&b(h,i);else B(a)&&b(a,i)},H.addPrefix=function(a,b){F[a]=b},H.addFilter=function(a){E.push(a)},H.errorTimeout=1e4,b.readyState==null&&b.addEventListener&&(b.readyState="loading",b.addEventListener("DOMContentLoaded",G=function(){b.removeEventListener("DOMContentLoaded",G,0),b.readyState="complete"},0)),a.yepnope=d()}(this,this.document),Modernizr.load=function(){yepnope.apply(window,[].slice.call(arguments,0))};
+ templates/article-view.hamlet view
@@ -0,0 +1,40 @@+<article .article>+  <h1 .article-title>+    <a href=@{articleLink article}>+      #{title}+  <div .article-desc>+    <div .author>+      <i .icon-user>+      \ written by #{author}+    <div .posted-date>+      <i .icon-calendar>+      \ posted on #{posted}+    $maybe d <- articleModifiedAt article+      <div .modified-date>+        <i .icon-upload>+        \ modified on #{show d}+    $if not (null tags)+      <div .tags>+        <i .icon-tags> #+        <ul .tag-list>+          $forall tag <- tags+            <li>+              <a href=@{TagR tag}>+                #{tag}+    $maybe r <- route+      <div .social>+        <i .icon-bookmark> #+        <div .social-item class="fb-like" data-href="#{r}" data-send="false" data-show-faces="false" data-layout="button_count">+        <a .social-item href="http://b.hatena.ne.jp/entry/#{r}" class="hatena-bookmark-button" data-hatena-bookmark-title="#{title} - #{blogTitle}" data-hatena-bookmark-layout="standard" title="このエントリーをはてなブックマークに追加">+          <img src="http://b.st-hatena.com/images/entry-button/button-only.gif" alt="このエントリーをはてなブックマークに追加" width="20" height="20" style="border: none;"> #+        <span .social-item>+          <g:plusone href=#{r}></g:plusone>+        <a href="https://twitter.com/share" class="twitter-share-button" data-url="#{r}" data-text="#{title} - #{blogTitle}" data-via="mr_konn" data-lang="ja">+          _{MsgTweet}+        <script>+         !function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0];if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src="//platform.twitter.com/widgets.js";fjs.parentNode.insertBefore(js,fjs);}}(document,"script","twitter-wjs");+  <div .article-body .show-grid>+    #{body}+    $if editable+      <div style="text-align: right;">+        <a href=@{ModifyR (YablogDay date) ident} .btn>_{MsgEditArticle} #
+ templates/article-view.lucius view
@@ -0,0 +1,22 @@+.article-desc {+  margin: 1em;+}++.article-body {+}++.tag-list {+  display: inline;+  margin: 0px;+  padding: 0px;+  list-style: none;+}++.tag-list > li {+  margin-left: 1em;+  display: inline;+}++.social .social-item {+  margin-left: 1em;+}
+ templates/article.hamlet view
@@ -0,0 +1,68 @@+<ul .pager>+  $maybe prev <- mprev+    <li .previous>+      <a href=@{articleLink prev}>+        &larr; #{makeSnippet 15 $ articleTitle prev}+  $maybe next <- mnext+    <li .next>+      <a href=@{articleLink next}>+        #{makeSnippet 15 $ articleTitle next} &rarr;++^{articleView Nothing article}++$if (not $ null trackbacks)+  <h2>+    <a name="trackbacks">+    _{MsgTrackbacks}+  <div>+    Trackback URL:+    <input type="url" value="#{render $ TrackbackR (YablogDay date) ident}">+  <ul .trackbacks>+    $forall t <- trackbacks+      <li .trackback>+        <a href="#{trackbackUrl t}">+          #{fromMaybe (trackbackUrl t) $ trackbackTitle t}+$else+  <h2>+    <a name="trackbacks">+    _{MsgNoTrackbacks}+  <div>+    Trackback URL:+    <input type="url" value="#{render $ TrackbackR (YablogDay date) ident}">++$if (not $ null comments)+    <h2>+      <a name="comments">+      _{MsgComments}+    $forall c <- comments+      <article .comment .well ##{commentAnchor c}>+        <div .comment-body>+          #{commentBody c}+        <div .comment-desc>+          <div .comment-author>+            <i .icon-user>+            #{commentAuthor c}+          <div .comment-date>+            <i .icon-calendar>+            <a href="##{commentAnchor c}">+              #{show $ commentCreatedAt c}+$else+  <h2>+    <a name="comments">+    _{MsgNoComments}  ++$maybe (widget, enc) <- mCommentForm+    <h2>_{MsgLeaveComment}+    <form method=post action=@{CommentR (YablogDay date) ident} enctype=#{enc}>+      ^{widget}+      <input type=submit>++<ul .pager>+  $maybe prev <- mprev+    <li .previous>+      <a href=@{articleLink prev}>+        &larr; #{makeSnippet 15 $ articleTitle prev}+  $maybe next <- mnext+    <li .next>+      <a href=@{articleLink next}>+        #{makeSnippet 15 $ articleTitle next} &rarr;
+ templates/article.lucius view
@@ -0,0 +1,9 @@+.comment-desc {+  text-align: right;+}++.article-body {+  border: 1px;+  border-style: solid;+  padding: 20px;+}
+ templates/default-layout-wrapper.hamlet view
@@ -0,0 +1,94 @@+\<!doctype html>+\<!--[if lt IE 7]> <html class="no-js ie6 oldie" lang="en"> <![endif]-->+\<!--[if IE 7]>    <html class="no-js ie7 oldie" lang="en"> <![endif]-->+\<!--[if IE 8]>    <html class="no-js ie8 oldie" lang="en"> <![endif]-->+\<!--[if gt IE 8]><!-->+<html class="no-js" lang="en"> <!--<![endif]-->+    <head>+        <meta charset="UTF-8">++        <title>#{pageTitle pc}+        <meta name="description" content="">+        <meta name="author" content="">++        <meta name="viewport" content="width=device-width,initial-scale=1">+        <link href="@{FeedR}" type="application/atom+xml" rel="alternate" title="Blog Feed">+        <link rel="contents toc index home start top origin" href=@{RootR}>+        ^{pageHead pc}++        \<!--[if lt IE 9]>+        \<script src="http://html5shiv.googlecode.com/svn/trunk/html5.js"></script>+        \<![endif]-->++        <script>+          document.documentElement.className = document.documentElement.className.replace(/\bno-js\b/,'js');+        $maybe hatenastar <- extraHatenaStar $ appExtra $ settings master+          <script type="text/javascript" src="http://s.hatena.ne.jp/js/HatenaStar.js">+          <script type="text/javascript">+            Hatena.Star.Token = '#{hatenastar}';+            Hatena.Star.SiteConfig = {+              entryNodes: {+                'article.article': {+                  uri: 'h1.article-title a',+                  title: 'h1.article-title',+                  container: 'h1.article-title'+                }+              }+            };+        <script type="text/javascript" src="http://b.st-hatena.com/js/bookmark_button_wo_al.js" charset="utf-8" async="async">+        $maybe analytics <- extraAnalytics $ appExtra $ settings master+          <script type="text/javascript">+            var _gaq = _gaq || [];+            _gaq.push(['_setAccount', '#{analytics}']);+            _gaq.push(['_trackPageview']);+          +            (function() {+              var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;+              ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';+              var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);+            })();+    <body>+        <div id="fb-root"></div>+        <script>+          (function(d, s, id) {+            var js, fjs = d.getElementsByTagName(s)[0];+            if (d.getElementById(id)) return;+            js = d.createElement(s); js.id = id;+            js.src = "//connect.facebook.net/ja_JP/all.js#xfbml=1";+            fjs.parentNode.insertBefore(js, fjs);+          }(document, 'script', 'facebook-jssdk'));+        <div .container>+            ^{pageBody pc}+            <footer>+                Powered by #+                <a href="http://www.yesodweb.com/">+                  Yesod+                , #+                <a href="http://johnmacfarlane.net/pandoc/">+                  Pandoc+                , #+                <a href="http://twitter.github.com/bootstrap">+                  Bootstrap+                , #+                <a href="http://www.mongodb.org/">+                  MongoDB+                \ and #+                <a href="http://www.haskell.org/">+                  Haskell+                \.<br>+                #{extraCopyright $ appExtra $ settings master}++        <script type="text/javascript">+          window.___gcfg = {lang: 'ja'};+        +          (function() {+            var po = document.createElement('script'); po.type = 'text/javascript'; po.async = true;+            po.src = 'https://apis.google.com/js/plusone.js';+            var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(po, s);+          })();+        \<!-- Prompt IE 6 users to install Chrome Frame. Remove this if you want to support IE 6.  chromium.org/developers/how-tos/chrome-frame-getting-started -->+        \<!--[if lt IE 7 ]>+            <script src="//ajax.googleapis.com/ajax/libs/chrome-frame/1.0.3/CFInstall.min.js">+            <script>+                window.attachEvent('onload',function(){CFInstall.check({mode:'overlay'})})+        \<![endif]-->
+ templates/default-layout.hamlet view
@@ -0,0 +1,63 @@+<header .hero-unit>+    <h1>+      <a href=@{RootR}>+        #{blogTitle}+    <p .lead>#{description}++$maybe msg <- mmsg+      <div #message .alert .alert-info .row8 .offest2>#{msg}+<div .row>+    <div .span4>+      <ul .nav .nav-list .well>+        <li .nav-header>+          <i .icon-book> #+          Recent Posts+        $forall art <- articles+          <li>+            <a href=@{ArticleR (toEnum $ articleCreatedDate art) (articleIdent art)}>+              #{articleTitle art}+        <li .nav-header>+          <i .icon-tags> #+          Tags+        $forall tag <- tags+          <li>+            <a href=@{TagR tag}>+              #{tag}+        <li .nav-header>+          <i .icon-comment> #+          Recent Comments+        $forall (comment, article) <- comments+          <li>+            <a href="@{ArticleR (toEnum $ articleCreatedDate article) (articleIdent article)}##{commentAnchor comment}">+              #{show $ utctDay $ commentCreatedAt comment} #{commentAuthor comment}+        $maybe cse <- mcse+          <li .nav-header>+            <i .icon-search> #+            Search+          <li>+            ^{cse}+        <li .nav-header>+          Control+        $if accessible+          <li>+            <a href=@{UserSettingsR}>+              <i .icon-cog> #+              Settings+          <li>+            <a href=@{CreateR}>+              <i .icon-pencil> #+              Post new article++        $maybe usr <- musr+          <li>+            <a href=@{AuthR LogoutR}>+              <i .icon-arrow-left> #+              Logout+        $nothing+          <li>+            <a href=@{AuthR LoginR}>+              <i .icon-arrow-right> #+              Login++    <div .span8>+      ^{widget}
+ templates/default-layout.lucius view
@@ -0,0 +1,22 @@+body {+    font-family: sans-serif;+}++table.sourceCode, tr.sourceCode, td.lineNumbers, td.sourceCode {+  margin: 0; padding: 0; vertical-align: baseline; border: none; }+table.sourceCode { width: 100%; }+td.lineNumbers { text-align: right; padding-right: 4px; padding-left: 4px; color: #aaaaaa; border-right: 1px solid #aaaaaa; }+td.sourceCode { padding-left: 5px; }+code > span.kw { color: #007020; font-weight: bold; }+code > span.dt { color: #902000; }+code > span.dv { color: #40a070; }+code > span.bn { color: #40a070; }+code > span.fl { color: #40a070; }+code > span.ch { color: #4070a0; }+code > span.st { color: #4070a0; }+code > span.co { color: #60a0b0; font-style: italic; }+code > span.ot { color: #007020; }+code > span.al { color: #ff0000; font-weight: bold; }+code > span.fu { color: #06287e; }+code > span.er { color: #ff0000; font-weight: bold; }+
+ templates/edit-article.hamlet view
@@ -0,0 +1,34 @@+<h1>_{MsgEditArticle}+<div .tabbalble>+  <ul .nav .nav-tabs>+    <li .active>+      <a href="#editor" data-toggle="tab">+        _{MsgEditOn}+    <li>+      <a href="#preview" data-toggle="tab" #show-preview>+        _{MsgPreview}+    $maybe _ <- mCommentTrackbackForm+      <li>+        <a href="#comment-delete" data-toggle="tab" #show-comment-view>+          _{MsgDeleteCommentTrackback}+    <li>+      <a href="#delete-article" data-toggle="tab" #show-delete-article>+        _{MsgDeleteArticle}+  <div .tab-content>+    <div .active .tab-pane #editor>+      <form method=post action=@{ModifyR (YablogDay day) ident} enctype=#{enctype} #edit-form>+        ^{widget}+        <input type=submit .btn>+    <div .tab-pane #preview>+      <iframe src=@{PreviewR} #preview-contents .span7 height="400px">+    $maybe (cWidget, cEnctype, tWidget, tEnctype) <- mCommentTrackbackForm+      <div .tab-pane #comment-delete>+        <form action=@{DeleteCommentR (YablogDay day) ident} method=post enctype=#{cEnctype}>+          ^{cWidget}+          <input type=submit value=_{MsgDeleteComment}>+        <form action=@{DeleteTrackbackR (YablogDay day) ident} method=post enctype=#{tEnctype}>+          ^{tWidget}+          <input type=submit value=_{MsgDeleteTrackback}>+    <div .tab-pane #delete-article>+      <form action=@{DeleteR (YablogDay day) ident} method=get enctype=#{enctype}>+        <input type=submit value=_{MsgDeleteArticle} .btn .btn-danger>
+ templates/edit-article.julius view
@@ -0,0 +1,11 @@+$(document).ready(function(){+    function updatePreview(data, type) {+	$("#preview-contents").html(data);+    }+    function reloadPreview() {+	var src = $('#src').val();+	var title = $('#title').val()+	$("#preview-contents").contents().find("html").load("/preview", $("#edit-form").serializeArray());+    }+    $('#show-preview').click(function(){ reloadPreview(); });+});
+ templates/edit-article.lucius view
@@ -0,0 +1,3 @@+textarea#src {+  height: 250px;+}
+ templates/homepage.hamlet view
@@ -0,0 +1,38 @@+<h2>Recent Articles+<ul .pager>+  $if (>) offset 0+    <li .next>+      <a href="@{RootR}?of=#{max 0 $ subtract offset 5}">+         Newer Articles &rarr;+  $if hasMore+    <li .previous>+      <a href="@{RootR}?of=#{(+) offset 5}">+        &larr; Older Articles+$forall (no, ents) <- articles+ $with (art, cs, ts) <-  ents+  <div .well>+    ^{articleView (Just $ (++) "art" $ (++) (show no) "-") art}+    <div .navi-links>+      <a href=@{articleLink art}>+        Permalink+      \ | #+      <a href="@{articleLink art}#comments">+        $if (==) cs 0+          _{MsgNoComments}+        $else+          _{MsgComments} (#{cs})+      \ | #+      <a href="@{articleLink art}#trackbacks">+        $if (==) ts 0+          _{MsgNoTrackbacks}+        $else+          _{MsgTrackbacks} (#{ts})+<ul class="pager">+  $if (>) offset 0+    <li .next>+      <a href="@{RootR}?of=#{max 0 (subtract offset 5)}">+         Newer Articles &rarr;+  $if hasMore+    <li .previous>+      <a href="@{RootR}?of=#{(+) offset 5}">+        &larr; Older Articles
+ templates/homepage.lucius view
@@ -0,0 +1,3 @@+.navi-links {+  text-align: right;+}
+ templates/normalize.lucius view
@@ -0,0 +1,439 @@+/*! normalize.css 2011-08-12T17:28 UTC · http://github.com/necolas/normalize.css */++/* =============================================================================+   HTML5 display definitions+   ========================================================================== */++/*+ * Corrects block display not defined in IE6/7/8/9 & FF3+ */++article,+aside,+details,+figcaption,+figure,+footer,+header,+hgroup,+nav,+section {+    display: block;+}++/*+ * Corrects inline-block display not defined in IE6/7/8/9 & FF3+ */++audio,+canvas,+video {+    display: inline-block;+    *display: inline;+    *zoom: 1;+}++/*+ * Prevents modern browsers from displaying 'audio' without controls+ */++audio:not([controls]) {+    display: none;+}++/*+ * Addresses styling for 'hidden' attribute not present in IE7/8/9, FF3, S4+ * Known issue: no IE6 support+ */++[hidden] {+    display: none;+}+++/* =============================================================================+   Base+   ========================================================================== */++/*+ * 1. Corrects text resizing oddly in IE6/7 when body font-size is set using em units+ *    http://clagnut.com/blog/348/#c790+ * 2. Keeps page centred in all browsers regardless of content height+ * 3. Prevents iOS text size adjust after orientation change, without disabling user zoom+ *    www.456bereastreet.com/archive/201012/controlling_text_size_in_safari_for_ios_without_disabling_user_zoom/+ */++html {+    font-size: 100%; /* 1 */+    overflow-y: scroll; /* 2 */+    -webkit-text-size-adjust: 100%; /* 3 */+    -ms-text-size-adjust: 100%; /* 3 */+}++/*+ * Addresses margins handled incorrectly in IE6/7+ */++body {+    margin: 0;+}++/* + * Addresses font-family inconsistency between 'textarea' and other form elements.+ */++body,+button,+input,+select,+textarea {+    font-family: sans-serif;+}+++/* =============================================================================+   Links+   ========================================================================== */++a {+    color: #00e;+}++a:visited {+    color: #551a8b;+}++/*+ * Addresses outline displayed oddly in Chrome+ */++a:focus {+    outline: thin dotted;+}++/*+ * Improves readability when focused and also mouse hovered in all browsers+ * people.opera.com/patrickl/experiments/keyboard/test+ */++a:hover,+a:active {+    outline: 0;+}+++/* =============================================================================+   Typography+   ========================================================================== */++/*+ * Addresses styling not present in IE7/8/9, S5, Chrome+ */++abbr[title] {+    border-bottom: 1px dotted;+}++/*+ * Addresses style set to 'bolder' in FF3/4, S4/5, Chrome+*/++b, +strong { +    font-weight: bold; +}++blockquote {+    margin: 1em 40px;+}++/*+ * Addresses styling not present in S5, Chrome+ */++dfn {+    font-style: italic;+}++/*+ * Addresses styling not present in IE6/7/8/9+ */++mark {+    background: #ff0;+    color: #000;+}++/*+ * Corrects font family set oddly in IE6, S4/5, Chrome+ * en.wikipedia.org/wiki/User:Davidgothberg/Test59+ */++pre,+code,+kbd,+samp {+    font-family: monospace, serif;+    _font-family: 'courier new', monospace;+    font-size: 1em;+}++/*+ * Improves readability of pre-formatted text in all browsers+ */++pre {+    white-space: pre;+    white-space: pre-wrap;+    word-wrap: break-word;+}++/*+ * 1. Addresses CSS quotes not supported in IE6/7+ * 2. Addresses quote property not supported in S4+ */++/* 1 */++q {+    quotes: none;+}++/* 2 */++q:before,+q:after {+    content: '';+    content: none;+}++small {+    font-size: 75%;+}++/*+ * Prevents sub and sup affecting line-height in all browsers+ * gist.github.com/413930+ */++sub,+sup {+    font-size: 75%;+    line-height: 0;+    position: relative;+    vertical-align: baseline;+}++sup {+    top: -0.5em;+}++sub {+    bottom: -0.25em;+}+++/* =============================================================================+   Lists+   ========================================================================== */++ul,+ol {+    margin: 1em 0;+    padding: 0 0 0 40px;+}++dd {+    margin: 0 0 0 40px;+}++nav ul,+nav ol {+    list-style: none;+    list-style-image: none;+}+++/* =============================================================================+   Embedded content+   ========================================================================== */++/*+ * 1. Removes border when inside 'a' element in IE6/7/8/9+ * 2. Improves image quality when scaled in IE7+ *    code.flickr.com/blog/2008/11/12/on-ui-quality-the-little-things-client-side-image-resizing/+ */++img {+    border: 0; /* 1 */+    -ms-interpolation-mode: bicubic; /* 2 */+}++/*+ * Corrects overflow displayed oddly in IE9 + */++svg:not(:root) {+    overflow: hidden;+}+++/* =============================================================================+   Figures+   ========================================================================== */++/*+ * Addresses margin not present in IE6/7/8/9, S5, O11+ */++figure {+    margin: 0;+}+++/* =============================================================================+   Forms+   ========================================================================== */++/*+ * Corrects margin displayed oddly in IE6/7+ */++form {+    margin: 0;+}++/*+ * Define consistent margin and padding+ */++fieldset {+    margin: 0 2px;+    padding: 0.35em 0.625em 0.75em;+}++/*+ * 1. Corrects color not being inherited in IE6/7/8/9+ * 2. Corrects alignment displayed oddly in IE6/7+ */++legend {+    border: 0; /* 1 */+    *margin-left: -7px; /* 2 */+}++/*+ * 1. Corrects font size not being inherited in all browsers+ * 2. Addresses margins set differently in IE6/7, F3/4, S5, Chrome+ * 3. Improves appearance and consistency in all browsers+ */++button,+input,+select,+textarea {+    font-size: 100%; /* 1 */+    margin: 0; /* 2 */+    vertical-align: baseline; /* 3 */+    *vertical-align: middle; /* 3 */+}++/*+ * 1. Addresses FF3/4 setting line-height using !important in the UA stylesheet+ * 2. Corrects inner spacing displayed oddly in IE6/7+ */++button,+input {+    line-height: normal; /* 1 */+    *overflow: visible;  /* 2 */+}++/*+ * Corrects overlap and whitespace issue for buttons and inputs in IE6/7+ * Known issue: reintroduces inner spacing+ */++table button,+table input {+    *overflow: auto;+}++/*+ * 1. Improves usability and consistency of cursor style between image-type 'input' and others+ * 2. Corrects inability to style clickable 'input' types in iOS+ */++button,+html input[type="button"], +input[type="reset"], +input[type="submit"] {+    cursor: pointer; /* 1 */+    -webkit-appearance: button; /* 2 */+}++/*+ * 1. Addresses box sizing set to content-box in IE8/9+ * 2. Addresses excess padding in IE8/9+ */++input[type="checkbox"],+input[type="radio"] {+    box-sizing: border-box; /* 1 */+    padding: 0; /* 2 */+}++/*+ * 1. Addresses appearance set to searchfield in S5, Chrome+ * 2. Addresses box sizing set to border-box in S5, Chrome (include -moz to future-proof)+ */++input[type="search"] {+    -webkit-appearance: textfield; /* 1 */+    -moz-box-sizing: content-box;+    -webkit-box-sizing: content-box; /* 2 */+    box-sizing: content-box;+}++/*+ * Corrects inner padding displayed oddly in S5, Chrome on OSX+ */++input[type="search"]::-webkit-search-decoration {+    -webkit-appearance: none;+}++/*+ * Corrects inner padding and border displayed oddly in FF3/4+ * www.sitepen.com/blog/2008/05/14/the-devils-in-the-details-fixing-dojos-toolbar-buttons/+ */++button::-moz-focus-inner,+input::-moz-focus-inner {+    border: 0;+    padding: 0;+}++/*+ * 1. Removes default vertical scrollbar in IE6/7/8/9+ * 2. Improves readability and alignment in all browsers+ */++textarea {+    overflow: auto; /* 1 */+    vertical-align: top; /* 2 */+}+++/* =============================================================================+   Tables+   ========================================================================== */++/* + * Remove most spacing between table cells+ */++table {+    border-collapse: collapse;+    border-spacing: 0;+}
+ templates/post-article.hamlet view
@@ -0,0 +1,17 @@+<h1>_{MsgPostArticle}+<form method=post action=@{CreateR} enctype=#{enctype} #edit-form>+  <div .tabbalble>+    <ul .nav .nav-tabs>+      <li .active>+        <a href="#editor" data-toggle="tab">+          _{MsgEditOn}+      <li>+        <a href="#preview" data-toggle="tab" #show-preview>+          _{MsgPreview}+    <div .tab-content>+      <div .active .tab-pane #editor>+        ^{widget}++      <div .tab-pane #preview>+        <iframe src=@{PreviewR} #preview-contents .span7 height="400px">+  <input type=submit .btn>
+ templates/post-article.julius view
@@ -0,0 +1,11 @@+$(document).ready(function(){+    function updatePreview(data, type) {+	$("#preview-contents").html(data);+    }+    function reloadPreview() {+	var src = $('#src').val();+	var title = $('#title').val()+	$("#preview-contents").contents().find("html").load("/preview", $("#edit-form").serializeArray());+    }+    $('#show-preview').click(function(){ reloadPreview(); });+});
+ templates/post-article.lucius view
@@ -0,0 +1,3 @@+textarea#src {+  height: 250px;+}
+ templates/search.hamlet view
@@ -0,0 +1,9 @@+<form action="http://www.google.com/cse" id="cse-search-box">+  <div>+    <input type="hidden" name="cx" value="#{cse}">+    <input type="hidden" name="ie" value="UTF-8">+    <div .input-append>+      <input type="text" name="q" .span2>+      <button type="submit" name="sa" .btn>+        _{MsgSearch}+<script type="text/javascript" src="http://www.google.com/cse/brand?form=cse-search-box&amp">
+ templates/tag.hamlet view
@@ -0,0 +1,8 @@+<h1>_{MsgArticlesForTag tag}+<ul>+  $forall art <- sortBy (flip $ on compare articleCreatedDate) articles+    <li>+      <a href=@{ArticleR (toEnum $ articleCreatedDate art) (articleIdent art)}>+        #{show $ ModifiedJulianDay $ toInteger $ articleCreatedDate art}+        \ #{show $ timeToTimeOfDay $ toEnum $ articleCreatedTime art}+        \ - #{articleTitle art}
+ templates/user-settings.hamlet view
@@ -0,0 +1,5 @@+<h2>+  Settings+<form method=post action=@{UserSettingsR} enctype=#{enctype}>+  ^{widget}+  <input type=submit>