From 1b20a11bba8a88ad0d9d5ea5859f5177f1a848b7 Mon Sep 17 00:00:00 2001 From: Luke Vella Date: Mon, 26 Jan 2015 13:11:48 +0100 Subject: [PATCH] New Features - added notifications - added toggle switches - added delete feature - added email verification --- api/event/event.controller.js | 130 +- api/event/event.model.js | 42 +- api/event/index.js | 20 +- app.js | 11 +- bin/www | 4 +- bower.json | 4 +- communicator.js | 10 + config/main.js | 8 + config/main.sample.js | 8 + config/routes.js | 4 +- helpers/notification.helper.js | 196 + package.json | 3 +- public/build/app.js | 4 +- public/css/style.css | 4 +- public/css/style.css.map | 2 +- public/images/avatar.png | Bin 0 -> 1450 bytes public/images/chat.png | Bin 0 -> 3968 bytes public/js/controllers/account.controller.js | 6 + public/js/controllers/deletion.controller.js | 18 + public/js/controllers/editevent.controller.js | 24 +- public/js/controllers/event.controller.js | 96 +- public/js/controllers/newevent.controller.js | 22 +- .../js/controllers/verification.controller.js | 19 + public/js/directives/discussion.directive.js | 41 + public/js/directives/dropdown.directive.js | 27 + public/js/directives/form.directive.js | 50 +- public/js/directives/poll.directive.js | 65 + public/js/main.js | 21 +- public/js/services/notification.service.js | 23 + public/js/templates.js | 15 +- public/scss/modules/_vars.scss | 2 +- public/scss/partials/_applayout.scss | 1 - public/scss/partials/_topbar.scss | 37 +- public/scss/partials/old/_buttons.scss | 35 - public/scss/partials/old/_datepicker.scss | 209 - public/scss/partials/old/_event.scss | 117 - public/scss/partials/old/_eventsuccess.scss | 12 - public/scss/partials/old/_form.scss | 96 - public/scss/partials/old/_header.scss | 28 - public/scss/partials/old/_mixins.scss | 3 - public/scss/partials/old/_modal.scss | 44 - public/scss/partials/old/_newevent.scss | 1 - public/scss/partials/old/_type.scss | 38 - public/scss/partials/old/_vars.scss | 16 - public/scss/partials/pages/_event.scss | 23 +- public/scss/partials/ui/_box.scss | 1 + public/scss/partials/ui/_buttons.scss | 2 +- public/scss/partials/ui/_comments.scss | 137 + public/scss/partials/ui/_datepicker.scss | 4 +- public/scss/partials/ui/_dropdown.scss | 30 + public/scss/partials/ui/_form.scss | 3 - public/scss/partials/ui/_modal.scss | 2 +- public/scss/partials/ui/_notification.scss | 45 + public/scss/partials/ui/_poll.scss | 3 + public/scss/partials/ui/_switch.scss | 75 + public/scss/partials/ui/_tags.scss | 95 + public/scss/style.scss | 9 + public/templates/confirmmodal.html | 4 +- public/templates/directives/discussion.html | 34 + .../eventForm/participantsForm.html | 4 +- .../directives/eventForm/settingsForm.html | 53 + public/templates/directives/poll.html | 16 +- public/templates/editevent.html | 7 +- public/templates/event.html | 20 +- public/templates/newevent.html | 4 +- public/templates/notification.html | 8 + public/vendor/angular-animate/.bower.json | 20 + public/vendor/angular-animate/README.md | 77 + .../vendor/angular-animate/angular-animate.js | 2138 ++++++++++ .../angular-animate/angular-animate.min.js | 33 + .../angular-animate.min.js.map | 8 + public/vendor/angular-animate/bower.json | 9 + public/vendor/angular-animate/package.json | 26 + public/vendor/angular/.bower.json | 10 +- public/vendor/angular/angular.js | 3532 +++++++++-------- public/vendor/angular/angular.min.js | 434 +- public/vendor/angular/angular.min.js.gzip | Bin 45897 -> 45960 bytes public/vendor/angular/angular.min.js.map | 4 +- public/vendor/angular/bower.json | 2 +- public/vendor/angular/package.json | 2 +- public/vendor/ng-tags-input/.bower.json | 24 + public/vendor/ng-tags-input/README | 1 + public/vendor/ng-tags-input/bower.json | 14 + .../ng-tags-input/ng-tags-input.bootstrap.css | 166 + .../ng-tags-input.bootstrap.min.css | 1 + public/vendor/ng-tags-input/ng-tags-input.css | 133 + public/vendor/ng-tags-input/ng-tags-input.js | 867 ++++ .../ng-tags-input/ng-tags-input.min.css | 1 + .../vendor/ng-tags-input/ng-tags-input.min.js | 1 + views/error.ejs | 2 +- views/index.ejs | 15 +- 91 files changed, 6859 insertions(+), 2756 deletions(-) create mode 100644 communicator.js create mode 100644 config/main.js create mode 100644 config/main.sample.js create mode 100644 helpers/notification.helper.js create mode 100644 public/images/avatar.png create mode 100644 public/images/chat.png create mode 100644 public/js/controllers/account.controller.js create mode 100644 public/js/controllers/deletion.controller.js create mode 100644 public/js/controllers/verification.controller.js create mode 100644 public/js/directives/discussion.directive.js create mode 100644 public/js/directives/dropdown.directive.js create mode 100644 public/js/directives/poll.directive.js create mode 100644 public/js/services/notification.service.js delete mode 100644 public/scss/partials/old/_buttons.scss delete mode 100644 public/scss/partials/old/_datepicker.scss delete mode 100644 public/scss/partials/old/_event.scss delete mode 100644 public/scss/partials/old/_eventsuccess.scss delete mode 100644 public/scss/partials/old/_form.scss delete mode 100644 public/scss/partials/old/_header.scss delete mode 100644 public/scss/partials/old/_mixins.scss delete mode 100644 public/scss/partials/old/_modal.scss delete mode 100644 public/scss/partials/old/_newevent.scss delete mode 100644 public/scss/partials/old/_type.scss delete mode 100644 public/scss/partials/old/_vars.scss create mode 100644 public/scss/partials/ui/_comments.scss create mode 100644 public/scss/partials/ui/_dropdown.scss create mode 100644 public/scss/partials/ui/_notification.scss create mode 100644 public/scss/partials/ui/_switch.scss create mode 100644 public/scss/partials/ui/_tags.scss create mode 100644 public/templates/directives/discussion.html create mode 100644 public/templates/directives/eventForm/settingsForm.html create mode 100644 public/templates/notification.html create mode 100644 public/vendor/angular-animate/.bower.json create mode 100644 public/vendor/angular-animate/README.md create mode 100644 public/vendor/angular-animate/angular-animate.js create mode 100644 public/vendor/angular-animate/angular-animate.min.js create mode 100644 public/vendor/angular-animate/angular-animate.min.js.map create mode 100644 public/vendor/angular-animate/bower.json create mode 100644 public/vendor/angular-animate/package.json create mode 100644 public/vendor/ng-tags-input/.bower.json create mode 100644 public/vendor/ng-tags-input/README create mode 100644 public/vendor/ng-tags-input/bower.json create mode 100644 public/vendor/ng-tags-input/ng-tags-input.bootstrap.css create mode 100644 public/vendor/ng-tags-input/ng-tags-input.bootstrap.min.css create mode 100644 public/vendor/ng-tags-input/ng-tags-input.css create mode 100644 public/vendor/ng-tags-input/ng-tags-input.js create mode 100644 public/vendor/ng-tags-input/ng-tags-input.min.css create mode 100644 public/vendor/ng-tags-input/ng-tags-input.min.js diff --git a/api/event/event.controller.js b/api/event/event.controller.js index e6840484c..b47d8e658 100644 --- a/api/event/event.controller.js +++ b/api/event/event.controller.js @@ -1,12 +1,40 @@ var express = require('express'); var Event = require('./event.model'); -var debug = require('debug')('myapp'); +var debug = require('debug')('eventapi'); +var communicator = require('../../communicator'); -exports.create = function(req, res){ +var getRandomString = function(){ + return require('crypto').randomBytes(16).toString('hex'); +} + +exports.verifyEmail = function(req, res, next){ + var id = req.params.id, + code = req.params.code; + Event.update({ + '_id' : id, + '__private.verificationCode' : code + }, { + 'creator.isVerified' : true , + '__private.verificationCode' : getRandomString() + }, function(err, num){ + if (err) return handleError(res, err); + if (num == 0) return res.status(498).end(); + next(); + }); +} + +exports.create = function(req, res, next){ + var event = req.body; + event.__private = { + 'verificationCode' : getRandomString(), + 'deleteCode' : getRandomString() + } Event.create(req.body, function(err, event){ if (err) return handleError(res, err); if (!event) return res.status(404); - return res.json(event); + communicator.emit('event:create', event); + req.event = event; + next(); }); } @@ -14,34 +42,103 @@ exports.show = function(req, res, next){ Event.findById(req.params.id, function(err, event){ if (err) return handleError(res, err); if (!event) return res.status(404).end(); - return res.json(event); + req.event = event; + next(); }); } exports.update = function(req, res){ - req.body.updated = Date.now(); - Event.update({ '_id' : req.params.id }, req.body, function(){ - return res.status(204).end(); + var updatedEvent = req.body; + updatedEvent.updated = Date.now(); + Event.findById(req.params.id, function(err, event){ + if (err) return handleError(res, err); + if (!event) return res.status(404).end(); + // If the creator's email has changed OR the notifications setting has changed - start a new email confirmation transaction + if (event.creator.email != updatedEvent.creator.email || + (!event.creator.allowNotifications && updatedEvent.creator.allowNotifications)) { + updatedEvent.creator.isVerified = false; + updatedEvent.creator.allowNotifications = true; + updatedEvent.__private = event.__private; + communicator.emit('event:update:creator.email', updatedEvent, event); + } + Event.update({ '_id' : req.params.id }, updatedEvent, function(){ + communicator.emit('event:update', updatedEvent, event); + return res.status(204).end(); + }); }); } +exports.delete = function(req, res, next){ + var eventId = req.params.id, + code = req.params.code; + if (code){ + Event.update({ + '_id' : eventId, + '__private.deleteCode' : code + }, { + 'isDeleted' : true , + '__private.deleteCode' : getRandomString() + }, function(err, num){ + if (err) return handleError(res, err); + if (num == 0) return res.status(498).end(); + next(); + }); + } else { + Event.findById(eventId, function(err, event){ + if (err) return handleError(res, err); + if (!event) return res.status(404).end(); + communicator.emit('event:delete', event); + next(); + }); + } +} + +exports.createComment = function(req, res, next){ + var eventId = req.params.id, + comment = req.body; + Event.findById(eventId, function(err, event){ + if (err) return handleError(res, err); + event.comments.push(comment); + event.save(function(err, event){ + if (err) return next(err); + req.event = event; + next(); + }); + }); +} + +exports.deleteComment = function(req, res, next){ + var eventId = req.params.id, + commentId = req.params.cid; + Event.findById(eventId, function(err, event){ + if (err) return handleError(res, err); + event.comments.pull({ '_id' : commentId }); + event.save(function(err, event){ + req.event = event; + next(); + }) + }); +} + + exports.createParticipant = function(req, res, next){ - var eventId = req.params.id; - var participant = req.body; + var eventId = req.params.id, + participant = req.body; Event.findById(eventId, function(err, event){ if (err) return handleError(res, err); event.updated = Date.now(); event.participants.push(participant); event.save(function(err, event){ if (err) return next(err); - res.json(event); + req.event = event; + next(); }); }); } exports.updateParticipant = function(req, res, next){ - var eventId = req.params.id; - var participantId = req.params.pid; + var eventId = req.params.id, + participantId = req.params.pid; Event.update({ '_id' : eventId, 'participants._id': participantId @@ -51,20 +148,21 @@ exports.updateParticipant = function(req, res, next){ 'participants.$' : req.body } }, function(err, num){ - if (err) return next(err); + if (err) return handleError(res, err); res.status(204).end(); }); } exports.deleteParticipant = function(req, res, next){ - var eventId = req.params.id; - var participantId = req.params.pid; + var eventId = req.params.id, + participantId = req.params.pid; Event.findById(eventId, function(err, event){ if (err) return handleError(res, err); event.updated = Date.now(); event.participants.pull({ '_id' : participantId }); event.save(function(err, event){ - res.json(event); + req.event = event; + next(); }) }); } diff --git a/api/event/event.model.js b/api/event/event.model.js index 4425cc302..a79f341d1 100644 --- a/api/event/event.model.js +++ b/api/event/event.model.js @@ -8,7 +8,15 @@ var EventSchema = new Schema({ description : String, creator : { name : String, - email : String + email : String, + isVerified : { + type : Boolean, + default : false + }, + allowNotifications : { + type : Boolean, + default : true + } }, created : { type : Date, @@ -17,18 +25,38 @@ var EventSchema = new Schema({ updated : Date, title : String, dates : [Date], - emails : [String], + emails : [{ + email : String + }], + comments : [{ + id : Schema.Types.ObjectId, + author : { + name : String + }, + content : String, + created : { + type: Date, + default : Date.now + } + }], location: String, participants : [{ id : Schema.Types.ObjectId, name : String, dates : [Boolean] }], - comments : [{ - id : Schema.Types.ObjectId, - author : String, - comment : String, - }] + isClosed : { + type : Boolean, + default : false + }, + isDeleted : { + type : Boolean, + default : false + }, + __private : { + verificationCode : String, + deleteCode : String, + } }); var model = mongoose.model('Event', EventSchema); diff --git a/api/event/index.js b/api/event/index.js index 113e39091..5b009466b 100644 --- a/api/event/index.js +++ b/api/event/index.js @@ -6,8 +6,26 @@ var debug = require('debug')('api/event/index'); router.post('/', controller.create); router.get('/:id', controller.show); -router.post('/:id/participant', controller.createParticipant); router.put('/:id', controller.update); +router.delete('/:id', controller.delete); +router.delete('/:id/code/:code', controller.delete); +router.get('/:id/code/:code', controller.verifyEmail); + +router.post('/:id/comment', controller.createComment); +router.delete('/:id/comment/:cid', controller.deleteComment); + +router.post('/:id/participant', controller.createParticipant); router.delete('/:id/participant/:pid', controller.deleteParticipant); router.put('/:id/participant/:pid', controller.updateParticipant); + +router.all('/*', function(req, res){ + if (req.event){ + var event = req.event.toObject(); + delete event['__private']; + res.json(event); + } else { + res.status(204).end(); + } +}); + module.exports = router; diff --git a/app.js b/app.js index c1af74b99..b9f538904 100644 --- a/app.js +++ b/app.js @@ -6,20 +6,22 @@ var bodyParser = require('body-parser'); var debug = require('debug')('app'); var mongoose = require('mongoose'); -var app = express(); +var app = module.exports = express(); + +require('./config/main')(app); +require('./helpers/notification.helper'); // view engine setup app.set('views', path.join(__dirname, 'views')); app.set('view engine', 'ejs'); -// uncomment after placing your favicon in /public app.use(logger('dev')); app.use(bodyParser.json()); app.use(bodyParser.urlencoded({ extended: false })); app.use(cookieParser()); app.use(express.static(path.join(__dirname, 'public'))); -require('./config/routes')(app) +require('./config/routes')(app); var dbname = 'myapp'; mongoose.connect('mongodb://localhost/' + dbname); @@ -28,6 +30,3 @@ db.on('error', debug.bind(debug, 'connection error')); db.once('open', function(){ debug('connected successfully to db: ' + dbname); }); - - -module.exports = app; diff --git a/bin/www b/bin/www index 38a3b7aa6..2afd59ae2 100755 --- a/bin/www +++ b/bin/www @@ -1,9 +1,7 @@ #!/usr/bin/env node -var debug = require('debug')('rallly_app'); +var debug = require('debug')('www'); var app = require('../app'); -app.set('port', process.env.PORT || 3000); - var server = app.listen(app.get('port'), function() { debug('Express server listening on port ' + server.address().port); }); diff --git a/bower.json b/bower.json index c42dae78c..62c05b37b 100644 --- a/bower.json +++ b/bower.json @@ -23,6 +23,8 @@ "ngFx": "~1.0.5", "angular-modal": "~0.4.0", "jquery": "~2.1.3", - "angular-hotkeys": "~0.2.2" + "angular-hotkeys": "~0.2.2", + "ng-tags-input": "2.1.1", + "angular-animate": "~1.3.10" } } diff --git a/communicator.js b/communicator.js new file mode 100644 index 000000000..dd2011a15 --- /dev/null +++ b/communicator.js @@ -0,0 +1,10 @@ +var util = require('util'); +var EventEmitter = require('events').EventEmitter; + +function Communicator(){ + EventEmitter.call(this); +} + +util.inherits(Communicator, EventEmitter); + +module.exports = new Communicator(); diff --git a/config/main.js b/config/main.js new file mode 100644 index 000000000..a638f6e44 --- /dev/null +++ b/config/main.js @@ -0,0 +1,8 @@ +module.exports = function(app){ + app.set('port', 3000); + app.set('siteUrl', 'http://localhost'); + app.set('absoluteUrl', function(path){ + return app.get('siteUrl') + ':' + app.get('port') + '/' + path; + }); + app.set('mandrillAPIKey','suEKoTkjRDeYie0Wd16Knw'); +}; diff --git a/config/main.sample.js b/config/main.sample.js new file mode 100644 index 000000000..497e34534 --- /dev/null +++ b/config/main.sample.js @@ -0,0 +1,8 @@ +module.exports = function(app){ + app.set('port', 3000); + app.set('siteUrl', 'http://localhost'); + app.set('absoluteUrl', function(path){ + return app.get('siteUrl') + ':' + app.get('port') + '/' + path; + }); + app.set('mandrillAPIKey',''); // Put your Mandrill API Key Here. +}; diff --git a/config/routes.js b/config/routes.js index 75686efad..7507956bb 100644 --- a/config/routes.js +++ b/config/routes.js @@ -5,8 +5,8 @@ module.exports = function(app) { // All undefined asset or api routes should return a 404 // app.route('/:url(api|auth|components|app|bower_components|assets)/*') // .get(errors[404]); - - // All other routes should redirect to the index.html + + // All other routes should redirect to the app.route('/*') .get(function(req, res) { res.render('index.ejs'); diff --git a/helpers/notification.helper.js b/helpers/notification.helper.js new file mode 100644 index 000000000..9c927e63f --- /dev/null +++ b/helpers/notification.helper.js @@ -0,0 +1,196 @@ +/* + Email Notifications Helper Class +*/ + +var app = require('../app'); +var communicator = require('../communicator'); +var debug = require('debug')('notification'); +var mandrill = require('mandrill-api'); +var mandrill_client = new mandrill.Mandrill(app.get('mandrillAPIKey')); + +communicator.on('event:create', function(event){ + if (!event.creator.allowNotifications && event.isClosed) return; + sendEmailConfirmation(event); + sendInvites(event); +}); + +communicator.on('event:update:creator.email', function(event, oldEvent){ + if (!event.creator.allowNotifications && event.isClosed) return; + verifyEmail(event); +}); + +communicator.on('event:delete', function(event){ + deleteConfirmation(event); +}); + +// Send confirmation to the creator of the event with a link to verify the creators email address +var sendEmailConfirmation = function(event){ + var message = { + subject : "Rallly: " + event.title + " - Verify Email Address", + from_email : 'noreply@rallly.co', + from_name : 'Rallly', + to: [{ + 'email': event.creator.email + }], + global_merge_vars : [{ + 'name' : 'TITLE', + 'content' : 'Your event ' + event.title + ' has been created successfully.' + }, { + 'name' : 'MESSAGE', + 'content' : 'Hi ' + event.creator.name + ',

' + + 'An email has been sent to each participant with a link to the event.

' + + 'Important: To continue receiving email notifications about this event, please click the button below to verify your email address.' + }, { + 'name' : 'BUTTONTEXT', + 'content' : 'Verify Email Address' + }, { + 'name' : 'BUTTONLINK', + 'content' : app.get('absoluteUrl')('verify/'+event._id+'/code/'+event.__private.verificationCode) + }] + } + mandrill_client.messages.sendTemplate({ + message : message, + template_name : 'rallly-standard', + async : true, + template_content : [] + }, mandrillSuccessHandler, mandrillErrorHandler); +} + +// Send an invite to all participants of the evnet +var sendInvites = function(event){ + event.emails.forEach(function(item){ + var toEmail = item.email; + var message = { + subject : "Rallly: " + event.title, + from_email : 'noreply@rallly.co', + from_name : 'Rallly', + to: [{ + 'email': toEmail + }], + headers : { + 'Reply-To' : event.creator.email + }, + global_merge_vars : [{ + 'name' : 'TITLE', + 'content' : event.creator.name + ' has invited you to participate in their event: ' + event.title, }, { + 'name' : 'MESSAGE', + 'content' : 'Rallly is a free collaborative scheduling service that lets you and your friends vote on a date to host an event. ' + + 'Click on the button below to visit the event page and vote on the dates that best suit you. ' + }, { + 'name' : 'BUTTONTEXT', + 'content' : 'View Event' + }, { + 'name' : 'BUTTONLINK', + 'content' : app.get('absoluteUrl')(event._id) + }] + } + mandrill_client.messages.sendTemplate({ + message : message, + template_name : 'rallly-standard', + async : true, + template_content : [] + }, mandrillSuccessHandler, mandrillErrorHandler); + }) +} + +// This message is sent when the user want to verify an email address after the event has been created +var verifyEmail = function(event){ + var message = { + subject : "Rallly: " + event.title + " - Verify Email Address", + from_email : 'noreply@rallly.co', + from_name : 'Rallly', + to: [{ + 'email': event.creator.email + }], + global_merge_vars : [{ + 'name' : 'TITLE', + 'content' : 'Please verify your email address to receive updates from this event.' + }, { + 'name' : 'MESSAGE', + 'content' : 'Hi ' + event.creator.name + ',

' + + 'If you would like to receive email updates from this event, please click on the button below to verify your email address.' + }, { + 'name' : 'BUTTONTEXT', + 'content' : 'Verify Email Address' + }, { + 'name' : 'BUTTONLINK', + 'content' : app.get('absoluteUrl')('verify/'+event._id+'/code/'+event.__private.verificationCode) + }] + } + mandrill_client.messages.sendTemplate({ + message : message, + template_name : 'rallly-standard', + async : true, + template_content : [] + }, mandrillSuccessHandler, mandrillErrorHandler); +} + +var sendUpdate = function(event){ + var message = { + subject : "Rallly: " + event.title + " - Verify Email Address", + from_email : 'noreply@rallly.co', + from_name : 'Rallly', + to: [{ + 'email': event.creator.email + }], + global_merge_vars : [{ + 'name' : 'Name', + 'content' : event.creator.name + }, { + 'name' : 'Event', + 'content' : event.title + }, { + 'name' : 'VerifyUrl', + 'content' : app.get('absoluteUrl')('verify/'+event._id+'/code/'+event.creator.verificationCode) + }] + } + mandrill_client.messages.sendTemplate({ + message : message, + template_name : 'rallly-standard', + async : true, + template_content : [] + }, mandrillSuccessHandler, mandrillErrorHandler); +} + +var deleteConfirmation = function(event){ + var message = { + subject : "Rallly: " + event.title + " - Delete Request", + from_email : 'noreply@rallly.co', + from_name : 'Rallly', + to: [{ + 'email': event.creator.email + }], + global_merge_vars : [{ + 'name' : 'TITLE', + 'content' : 'Are you sure you want to delete ' + event.title + '?' + }, { + 'name' : 'MESSAGE', + 'content' : 'Hi ' + event.creator.name + ',

' + + 'A request has been made to delete this event. If you would like to delete it click the button below. If you did not make this request, please ignore this email.' + }, { + 'name' : 'BUTTONTEXT', + 'content' : 'Delete Event' + }, { + 'name' : 'BUTTONLINK', + 'content' : app.get('absoluteUrl')('delete/'+event._id+'/code/'+event.__private.deleteCode) + }] + } + mandrill_client.messages.sendTemplate({ + message : message, + template_name : 'rallly-standard', + async : true, + template_content : [] + }, mandrillSuccessHandler, mandrillErrorHandler); +} + +var mandrillSuccessHandler = function(result){ + if (result.length == 1) { + debug('Email sent to ' + result[0].email); + } else { + debug('Email sent to ' + result.length + ' recipients'); + } +} + +var mandrillErrorHandler = function(e){ + debug('A mandrill error occurred: ' + e.name + ' - ' + e.message); +} diff --git a/package.json b/package.json index 7bbe37f2a..e79c6aa38 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,7 @@ "version": "1.0.0", "private": true, "scripts": { - "start": "DEBUG=myapp nodemon ./bin/www" + "start": "DEBUG=eventapi nodemon ./bin/www" }, "dependencies": { "amdefine": "^0.1.0", @@ -14,6 +14,7 @@ "ejs": "^1.0.0", "express": "~4.9.0", "jade": "^1.6.0", + "mandrill-api": "^1.0.41", "mongoose": "^3.8.19", "mongoose-shortid": "^0.4.2", "morgan": "~1.3.0", diff --git a/public/build/app.js b/public/build/app.js index b1769d16d..ed7fa4e56 100644 --- a/public/build/app.js +++ b/public/build/app.js @@ -1,2 +1,2 @@ -angular.module("rallly",["ui.router","ngResource","ngFx","btford.modal"]).config(["$stateProvider","$urlRouterProvider","$locationProvider",function(e,t,n){n.html5Mode(!0),t.otherwise("/notfound"),e.state("index",{url:"/",templateUrl:"templates/home.html",controller:"HomeCtrl"}).state("newevent",{url:"/new",templateUrl:"templates/newevent.html",controller:"NewEventCtrl"}).state("about",{url:"/about",templateUrl:"templates/about.html",controller:"AboutCtrl"}).state("notfound",{url:"/notfound",templateUrl:"templates/notfound.html"}).state("event",{url:"/:id",templateUrl:"templates/event.html",controller:"EventCtrl"}).state("editevent",{url:"/:id/edit",templateUrl:"templates/editevent.html",controller:"EditEventCtrl"})}]).factory("Event",["$resource",function(e){return e("/api/event/:id",{id:"@_id"},{update:{method:"PUT"}})}]).factory("Participant",["$resource",function(e){return e("/api/event/:id/participant/:pid",{id:"@_id",pid:"@pid"},{update:{method:"PUT"}})}]).factory("Title",function(){return{set:function(e){document.title=e}}}),angular.module("rallly").run(["$templateCache",function(e){e.put("templates/about.html",'
\n

What is Rallly?

\n
Rallly is a collaborative scheduling service that makes deciding on a date fast and easy.
\n

Hi, I\'m Luke!

\n

\n I created Rallly as side project to help me learn some new technologies. I decided to publish it because I thought other people might find it useful. Rallly is a completely free service. In fact it is even open source. You can look at the latest source code on Github.\n

\n
\n'),e.put("templates/confirmmodal.html",'
\n\n
\n
{{modal.title}}
\n
\n {{modal.message}}\n
\n
\n \n \n
\n
\n'),e.put("templates/editevent.html",'
\n
\n\n
Edit Event
\n
\n You can makes changes to your existing event by changing the fields in the form below.\n
\n\n
\n\n
\n\n
\n\n
\n\n
\n
\n\n
\n
\n \n \n Done\n
\n\n
\n\n
\n\n
\n'),e.put("templates/event.html",'
\n
\n
\n
\n \n
\n
\n
\n {{event.title}}\n
\n
\n Created by {{event.creator.name}} • {{event.created | elapsed}}\n
\n
\n
\n \n
\n
\n
{{event.description}}
\n \n\n
\n
\n
\n
\n
\n
\n'),e.put("templates/home.html",'
\n
\n \n
\n
\n Schedule an Event\n
\n
\n Want to host an event but can’t decide on a date? Click on the button below to start!\n
\n \n
\n'),e.put("templates/newevent.html",'
\n
\n\n
Schedule a New Event
\n
\n Fill in the form below to create your event and share it with your friends and colleagues.\n
\n\n
\n
\n\n
\n\n
\n\n
\n\n
\n\n
\n\n
\n\n
\n\n
\n \n
\n\n
\n
\n
\n
\n
\n
\n \n
\n
Event Created
\n
\n Your event has been created successfully! Make sure you visit the page yourself and fill in the poll.\n
\n
\n
\n
\n \n GO\n
\n
\n
\n'),e.put("templates/notfound.html","

Error 404

\n

Not Found

\n"),e.put("templates/directives/poll.html",'
\n
\n {{event.participants.length}} participants\n
\n
\n
\n
\n {{date | date: \'EEE\'}}\n
\n
\n {{date | date: \'d\'}}\n
\n
\n {{date | date : \'MMM\'}}\n
\n {{selectedDate($index)}}\n
\n
\n
\n\n
\n
\n
\n
\n
\n
\n \n \n \n \n {{participant.name}}\n
\n
\n \n \n \n
\n
\n
\n Edit\n Delete\n \n Cancel\n
\n
\n
\n
\n
\n
\n \n \n \n \n
\n
\n \n
\n
\n
\n \n
\n
\n
\n
\n'),e.put("templates/directives/eventForm/dateForm.html",'
\n
Choose Dates
\n \n
\n
\n
\n
\n \n \n You need to select a few dates\n \n
\n\n
\n
\n
\n
\n'),e.put("templates/directives/eventForm/eventForm.html",'
\n
Event Details
\n
\n
\n
\n
\n
\n \n \n {{errors.title}}\n \n \n
\n
\n
\n
\n \n \n {{errors.location}}\n \n \n
\n
\n
\n
\n
\n \n \n
\n
\n
\n'),e.put("templates/directives/eventForm/participantsForm.html",'
\n
Invite Participants
\n
\n
\n
\n
\n \n \n
\n
\n
\n\n'),e.put("templates/directives/eventForm/userForm.html",'
\n
Your Details
\n
\n
\n
\n
\n
\n \n \n {{errors.name}}\n \n \n
\n
\n
\n
\n \n \n {{errors.email}}\n \n \n
\n
\n
\n
\n')}]),angular.module("rallly").controller("AboutCtrl",["Title",function(e){e.set("About Rallly")}]),angular.module("rallly").controller("EditEventCtrl",["$scope","$http","$state","$timeout","Event","ConfirmModal","Title",function(e,t,n,i,a,o,l){var r=n.params.id;e.event=a.get({id:r},function(){l.set("Edit: "+e.event.title),e.master=angular.copy(e.event)},function(){n.go("notfound")}),e.undoChanges=function(){e.event=angular.copy(e.master),resetDates()},e.didChange=function(){return JSON.stringify(e.master)!=JSON.stringify(e.event)},e.didChangeDates=function(){return JSON.stringify(e.master.dates)!=JSON.stringify(e.event.dates)},e.submit=function(){if(e.form.$valid)if(e.didChangeDates()){new o({title:"Hold up!",message:"Changing the dates will reset all entries by the participants. Are you sure you want to do that?",confirmText:"Yes, I'm sure",isDestructive:!0,confirm:function(){e.event.participants=[],s()}})}else s();else{new o({title:"Not so fast!",message:"Make sure you fill in all the required fields and try again.",cancelText:"OK"})}};var s=function(){a.update({id:r},e.event,function(){new o({title:"Event Updated",message:"Your changes have been saved successfully!",confirmText:"Back to Event Page",cancelText:"Stay here",confirm:function(){n.go("event",{id:e.event._id})}});e.master=angular.copy(e.event),e.didSave=i(function(){e.didSave=!1},2e3)})}}]),angular.module("rallly").controller("EventCtrl",["$scope","$http","$state","Title","Event",function(e,t,n,i,a){var o=n.params.id;e.participant={},e.event=a.get({id:o},function(){i.set(e.event.title),e.eventUrl=n.href("event",{id:e.event._id},{absolute:!0})},function(){n.go("notfound")}),e.editEvent=function(){n.go("editevent",{id:e.event._id})}}]).directive("poll",["Event","Participant","ConfirmModal",function(e,t,n){return{restrict:"A",templateUrl:"templates/directives/poll.html",scope:{event:"=",participant:"="},link:function(e){e.defaults=[];var i=[];e.delete=function(i){var a=new n({title:"Delete "+i.name+"?",message:"Are you sure you want to remove "+i.name+" from the poll?",confirmText:"Yes - delete",cancelText:"No - nevermind",isDestructive:!0,confirm:function(){t.remove({id:e.event._id,pid:i._id},function(t){e.event=t})}});a.show()},e.isTopDate=function(e){for(var t=i[e],n=0;nt)return!1;return!0},e.selectedDate=function(t){i[t]=0;for(var n=0;nt.getTime()?!0:!1}),i.$setViewValue(t,e)});var a=function(e,n){if(e&&n&&e.length!=n.length){for(var i=[],a=0;a30?"on "+e("date")(t,"MMMM d"):s>1?s+" days ago":1==s?"1 day ago":r>1?r+" hours ago":1==r?"an hour ago":l>1?l+" minutes ago":1==l?"a minute ago":"a few seconds ago"}}}]),angular.module("rallly").factory("ConfirmModal",["btfModal",function(e){return function(t){var n;n=e({templateUrl:"templates/confirmmodal.html",controllerAs:"modal",controller:function(){this.title=t.title,this.message=t.message,this.confirm=t.confirm?function(){t.confirm(),n.deactivate()}:!1,this.cancel=n.deactivate,this.confirmText=t.confirmText||"Confirm",this.cancelText=t.cancelText||"Cancel",this.isDestructive=t.isDestructive}}),n.activate(),this.destroy=function(){n.deactivate()}}}]); -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm1haW4uanMiLCJ0ZW1wbGF0ZXMuanMiLCJjb250cm9sbGVycy9hYm91dC5jb250cm9sbGVyLmpzIiwiY29udHJvbGxlcnMvZWRpdGV2ZW50LmNvbnRyb2xsZXIuanMiLCJjb250cm9sbGVycy9ldmVudC5jb250cm9sbGVyLmpzIiwiY29udHJvbGxlcnMvaG9tZS5jb250cm9sbGVyLmpzIiwiY29udHJvbGxlcnMvbmF2aWdhdGlvbi5jb250cm9sbGVyLmpzIiwiY29udHJvbGxlcnMvbmV3ZXZlbnQuY29udHJvbGxlci5qcyIsImRpcmVjdGl2ZXMvYmFja0ltZy5kaXJlY3RpdmUuanMiLCJkaXJlY3RpdmVzL2RhdGVwaWNrZXIuZGlyZWN0aXZlLmpzIiwiZGlyZWN0aXZlcy9mb3JtLmRpcmVjdGl2ZS5qcyIsImZpbHRlcnMvZWxhcHNlZC5maWx0ZXIuanMiLCJzZXJ2aWNlcy9tb2RhbC5zZXJ2aWNlLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFFBQUEsT0FBQSxVQUFBLFlBQUEsYUFBQSxPQUFBLGlCQUNBLFFBQUEsaUJBQUEscUJBQUEsb0JBQUEsU0FBQSxFQUFBLEVBQUEsR0FDQSxFQUFBLFdBQUEsR0FDQSxFQUFBLFVBQUEsYUFDQSxFQUNBLE1BQUEsU0FDQSxJQUFBLElBQ0EsWUFBQSxzQkFDQSxXQUFBLGFBRUEsTUFBQSxZQUNBLElBQUEsT0FDQSxZQUFBLDBCQUNBLFdBQUEsaUJBRUEsTUFBQSxTQUNBLElBQUEsU0FDQSxZQUFBLHVCQUNBLFdBQUEsY0FFQSxNQUFBLFlBQ0EsSUFBQSxZQUNBLFlBQUEsNEJBRUEsTUFBQSxTQUNBLElBQUEsT0FDQSxZQUFBLHVCQUNBLFdBQUEsY0FFQSxNQUFBLGFBQ0EsSUFBQSxZQUNBLFlBQUEsMkJBQ0EsV0FBQSxxQkFHQSxRQUFBLFNBQUEsWUFBQSxTQUFBLEdBQ0EsTUFBQSxHQUFBLGtCQUFBLEdBQUEsU0FDQSxRQUFBLE9BQUEsWUFHQSxRQUFBLGVBQUEsWUFBQSxTQUFBLEdBQ0EsTUFBQSxHQUFBLG1DQUFBLEdBQUEsT0FBQSxJQUFBLFNBQ0EsUUFBQSxPQUFBLFlBR0EsUUFBQSxRQUFBLFdBQ0EsT0FDQSxJQUFBLFNBQUEsR0FDQSxTQUFBLE1BQUEsTUNoREEsUUFBQSxPQUFBLFVBQUEsS0FBQSxpQkFBQSxTQUFBLEdBQUEsRUFBQSxJQUFBLHVCQUFBLDhnQkFDQSxFQUFBLElBQUEsOEJBQUEsdWdCQUNBLEVBQUEsSUFBQSwyQkFBQSxrbkNBQ0EsRUFBQSxJQUFBLHVCQUFBLGl0Q0FDQSxFQUFBLElBQUEsc0JBQUEsMlpBQ0EsRUFBQSxJQUFBLDBCQUFBLGlxREFDQSxFQUFBLElBQUEsMEJBQUEsNENBQ0EsRUFBQSxJQUFBLGlDQUFBLGtnSEFDQSxFQUFBLElBQUEsK0NBQUEsc3FDQUNBLEVBQUEsSUFBQSxnREFBQSxra0RBQ0EsRUFBQSxJQUFBLHVEQUFBLGdjQUNBLEVBQUEsSUFBQSwrQ0FBQSwwdkNDWEEsUUFBQSxPQUFBLFVBQ0EsV0FBQSxhQUFBLFFBQUEsU0FBQSxHQUNBLEVBQUEsSUFBQSxtQkNGQSxRQUFBLE9BQUEsVUFDQSxXQUFBLGlCQUFBLFNBQUEsUUFBQSxTQUFBLFdBQUEsUUFBQSxlQUFBLFFBQUEsU0FBQSxFQUFBLEVBQUEsRUFBQSxFQUFBLEVBQUEsRUFBQSxHQUNBLEdBQUEsR0FBQSxFQUFBLE9BQUEsRUFDQSxHQUFBLE1BQUEsRUFBQSxLQUFBLEdBQUEsR0FBQSxXQUNBLEVBQUEsSUFBQSxTQUFBLEVBQUEsTUFBQSxPQUNBLEVBQUEsT0FBQSxRQUFBLEtBQUEsRUFBQSxRQUNBLFdBQ0EsRUFBQSxHQUFBLGNBRUEsRUFBQSxZQUFBLFdBQ0EsRUFBQSxNQUFBLFFBQUEsS0FBQSxFQUFBLFFBQ0EsY0FFQSxFQUFBLFVBQUEsV0FDQSxNQUFBLE1BQUEsVUFBQSxFQUFBLFNBQUEsS0FBQSxVQUFBLEVBQUEsUUFFQSxFQUFBLGVBQUEsV0FDQSxNQUFBLE1BQUEsVUFBQSxFQUFBLE9BQUEsUUFBQSxLQUFBLFVBQUEsRUFBQSxNQUFBLFFBRUEsRUFBQSxPQUFBLFdBQ0EsR0FBQSxFQUFBLEtBQUEsT0FDQSxHQUFBLEVBQUEsaUJBQ0EsQ0FBQSxHQUFBLElBQ0EsTUFBQSxXQUNBLFFBQUEsbUdBQ0EsWUFBQSxnQkFDQSxlQUFBLEVBQ0EsUUFBQSxXQUNBLEVBQUEsTUFBQSxnQkFDQSxXQUtBLFNBR0EsQ0FBQSxHQUFBLElBQ0EsTUFBQSxlQUNBLFFBQUEsK0RBQ0EsV0FBQSxRQUlBLElBQUEsR0FBQSxXQUNBLEVBQUEsUUFDQSxHQUFBLEdBQ0EsRUFBQSxNQUNBLFdBQ0EsR0FBQSxJQUNBLE1BQUEsZ0JBQ0EsUUFBQSw2Q0FDQSxZQUFBLHFCQUNBLFdBQUEsWUFDQSxRQUFBLFdBQ0EsRUFBQSxHQUFBLFNBQUEsR0FBQSxFQUFBLE1BQUEsUUFHQSxHQUFBLE9BQUEsUUFBQSxLQUFBLEVBQUEsT0FDQSxFQUFBLFFBQUEsRUFBQSxXQUNBLEVBQUEsU0FBQSxHQUNBLFdDN0RBLFFBQUEsT0FBQSxVQUNBLFdBQUEsYUFBQSxTQUFBLFFBQUEsU0FBQSxRQUFBLFFBQUEsU0FBQSxFQUFBLEVBQUEsRUFBQSxFQUFBLEdBQ0EsR0FBQSxHQUFBLEVBQUEsT0FBQSxFQUNBLEdBQUEsZUFDQSxFQUFBLE1BQUEsRUFBQSxLQUFBLEdBQUEsR0FBQSxXQUNBLEVBQUEsSUFBQSxFQUFBLE1BQUEsT0FDQSxFQUFBLFNBQUEsRUFBQSxLQUFBLFNBQ0EsR0FBQSxFQUFBLE1BQUEsTUFFQSxVQUFBLEtBRUEsV0FDQSxFQUFBLEdBQUEsY0FHQSxFQUFBLFVBQUEsV0FDQSxFQUFBLEdBQUEsYUFBQSxHQUFBLEVBQUEsTUFBQSxVQUlBLFVBQUEsUUFBQSxRQUFBLGNBQUEsZUFBQSxTQUFBLEVBQUEsRUFBQSxHQUNBLE9BQ0EsU0FBQSxJQUNBLFlBQUEsaUNBQ0EsT0FDQSxNQUFBLElBQ0EsWUFBQSxLQUVBLEtBQUEsU0FBQSxHQUNBLEVBQUEsV0FDQSxJQUFBLEtBQ0EsR0FBQSxPQUFBLFNBQUEsR0FDQSxHQUFBLEdBQUEsR0FBQSxJQUNBLE1BQUEsVUFBQSxFQUFBLEtBQUEsSUFDQSxRQUFBLG1DQUFBLEVBQUEsS0FBQSxrQkFDQSxZQUFBLGVBQ0EsV0FBQSxpQkFDQSxlQUFBLEVBQ0EsUUFBQSxXQUNBLEVBQUEsUUFBQSxHQUFBLEVBQUEsTUFBQSxJQUFBLElBQUEsRUFBQSxLQUFBLFNBQUEsR0FDQSxFQUFBLE1BQUEsTUFJQSxHQUFBLFFBRUEsRUFBQSxVQUFBLFNBQUEsR0FFQSxJQUFBLEdBREEsR0FBQSxFQUFBLEdBQ0EsRUFBQSxFQUFBLEVBQUEsRUFBQSxPQUFBLElBQ0EsR0FBQSxFQUFBLEdBQUEsRUFBQSxPQUFBLENBRUEsUUFBQSxHQUVBLEVBQUEsYUFBQSxTQUFBLEdBQ0EsRUFBQSxHQUFBLENBQ0EsS0FBQSxHQUFBLEdBQUEsRUFBQSxFQUFBLEVBQUEsTUFBQSxhQUFBLE9BQUEsSUFDQSxFQUFBLE1BQUEsYUFBQSxHQUFBLE1BQUEsSUFBQSxFQUFBLElBRUEsT0FBQSxHQUFBLElBRUEsRUFBQSxPQUFBLFNBQUEsR0FDQSxFQUFBLFFBQ0EsR0FBQSxFQUFBLE1BQUEsSUFDQSxJQUFBLEVBQUEsS0FDQSxJQUVBLEVBQUEsS0FBQSxTQUFBLEdBQ0EsRUFBQSxTQUFBLEVBQUEsTUFBQSxhQUFBLFFBQUEsSUFBQSxRQUFBLEtBQUEsSUFFQSxFQUFBLE9BQUEsU0FBQSxHQUNBLEVBQUEsTUFBQSxhQUFBLEdBQUEsRUFBQSxTQUFBLElBRUEsRUFBQSxLQUFBLFNBQUEsR0FDQSxHQUFBLEVBQUEsUUFBQSxPQUFBLENBQ0EsR0FBQSxHQUFBLEdBQUEsR0FBQSxFQUNBLEdBQUEsT0FBQSxHQUFBLEVBQUEsTUFBQSxLQUFBLFNBQUEsR0FDQSxFQUFBLE1BQUEsRUFDQSxFQUFBLGlCQUVBLEVBQUEsUUFBQSxzQkMvRUEsUUFBQSxPQUFBLFVBQ0EsV0FBQSxZQUFBLFNBQUEsU0FBQSxRQUFBLFNBQUEsRUFBQSxFQUFBLEdBQ0EsRUFBQSxJQUFBLHFDQUVBLEVBQUEsU0FBQSxXQUNBLEVBQUEsR0FBQSxnQkNMQSxRQUFBLE9BQUEsVUFDQSxXQUFBLGtCQUFBLFNBQUEsWUFBQSxTQUFBLEVBQUEsR0FDQSxFQUFBLFNBQUEsU0FBQSxHQUNBLE1BQUEsR0FBQSxRQUFBLEdBQ0EsR0FFQSxNQ05BLFFBQUEsT0FBQSxVQUNBLFdBQUEsZ0JBQUEsU0FBQSxRQUFBLFNBQUEsUUFBQSxlQUFBLFNBQUEsRUFBQSxFQUFBLEVBQUEsRUFBQSxHQUVBLEVBQUEsTUFBQSx1QkFDQSxFQUFBLFlBQUEsNEZBRUEsSUFBQSxHQUFBLFNBQUEsRUFBQSxHQUNBLEdBQUEsSUFDQSxNQUFBLEdBQUEsZUFDQSxRQUFBLEdBQUEsK0RBQ0EsV0FBQSxPQUlBLEdBQUEsT0FBQSxXQUNBLEVBQUEsS0FBQSxPQUNBLEVBQUEsS0FBQSxhQUFBLEVBQUEsT0FDQSxRQUFBLFNBQUEsR0FDQSxFQUFBLE1BQUEsRUFDQSxFQUFBLFNBQUEsRUFBQSxLQUFBLFNBQ0EsR0FBQSxFQUFBLE1BQUEsTUFFQSxVQUFBLE1BR0EsTUFBQSxXQUNBLEVBQUEsU0FBQSxxRUFHQSxLQUlBLEVBQUEsV0FBQSxRQ2pDQSxRQUFBLE9BQUEsVUFDQSxVQUFBLFVBQUEsV0FDQSxNQUFBLFVBQUEsRUFBQSxFQUFBLEdBQ0EsR0FBQSxHQUFBLEVBQUEsT0FDQSxHQUFBLEtBQ0EsbUJBQUEsZUFBQSxFQUFBLGFDTEEsUUFBQSxPQUFBLFVBQ0EsVUFBQSxhQUFBLFdBQ0EsT0FDQSxTQUFBLElBQ0EsUUFBQSxVQUNBLE9BQ0EsTUFBQSxXQUNBLFFBQUEsS0FFQSxLQUFBLFNBQUEsRUFBQSxFQUFBLEVBQUEsR0FDQSxFQUFBLE1BQUEsRUFBQSxVQUNBLFFBQUEsUUFBQSxHQUFBLFlBQ0EsV0FBQSxFQUNBLGdCQUFBLElBRUEsR0FBQSxhQUFBLFNBQUEsR0FDQSxHQUFBLEdBQUEsRUFBQSxLQUNBLEdBQUEsS0FBQSxTQUFBLEVBQUEsR0FDQSxNQUFBLEdBQUEsVUFBQSxFQUFBLFdBQUEsR0FDQSxJQUVBLEVBQUEsY0FBQSxFQUFBLElBR0EsSUFBQSxHQUFBLFNBQUEsRUFBQSxHQUNBLEdBQUEsR0FBQSxHQUFBLEVBQUEsUUFBQSxFQUFBLE9BQUEsQ0FFQSxJQUFBLEdBREEsTUFDQSxFQUFBLEVBQUEsRUFBQSxFQUFBLE9BQUEsSUFDQSxFQUFBLEtBQUEsR0FBQSxNQUFBLEVBQUEsSUFFQSxTQUFBLFFBQUEsR0FBQSxXQUFBLFdBQUEsSUFFQSxHQUFBLGlCQUFBLFFBQUEsR0FFQSxFQUFBLFFBQUEsRUFBQSxZQUNBLEVBQUEsUUFBQSxVQUFBLFNBQUEsR0FDQSxHQUFBLEdBQUEsRUFBQSxNQUFBLFFBQUEsRUFDQSxHQUFBLE1BQUEsT0FBQSxFQUFBLElBR0EsRUFBQSxZQUFBLFNBQUEsU0FBQSxHQUNBLE1BQUEsSUFBQSxHQUFBLEVBQUEsUUFHQSxHQUZBLE9DMUNBLFFBQUEsT0FBQSxVQUNBLFFBQUEsYUFBQSxXQUNBLEtBQUEsWUFBQSxTQUFBLEVBQUEsR0FDQSxNQUFBLEdBQUEsU0FBQSxFQUFBLGVBQ0EsRUFBQSxRQUFBLEVBQUEsY0FDQSxFQUFBLFVBQUEsRUFBQSxnQkFDQSxLQUdBLFVBQUEsWUFBQSxhQUFBLFNBQUEsR0FDQSxPQUNBLE9BQ0EsTUFBQSxJQUNBLEtBQUEsS0FFQSxZQUFBLCtDQUNBLEtBQUEsU0FBQSxHQUNBLEVBQUEsVUFFQSxFQUFBLFdBQUEsc0NBRUEsRUFBQSxpQkFBQSxtQkFBQSxTQUFBLEdBQ0EsRUFBQSxPQUFBLEtBQUEsRUFBQSxZQUFBLEVBQUEsVUFHQSxFQUFBLGlCQUFBLG9CQUFBLFNBQUEsR0FDQSxFQUFBLE9BQUEsTUFBQSxFQUFBLFlBQUEsRUFBQSxnQkFLQSxVQUFBLGFBQUEsYUFBQSxTQUFBLEdBQ0EsT0FDQSxPQUNBLE1BQUEsSUFDQSxLQUFBLEtBRUEsWUFBQSxnREFDQSxLQUFBLFNBQUEsR0FDQSxFQUFBLFVBRUEsRUFBQSxpQkFBQSxvQkFBQSxTQUFBLEdBQ0EsRUFBQSxPQUFBLE1BQUEsRUFBQSxZQUFBLEVBQUEsV0FHQSxFQUFBLGlCQUFBLHVCQUFBLFNBQUEsR0FDQSxFQUFBLE9BQUEsU0FBQSxFQUFBLFlBQUEsRUFBQSxtQkFNQSxVQUFBLFdBQUEsV0FDQSxPQUNBLE9BQ0EsTUFBQSxJQUNBLEtBQUEsS0FFQSxZQUFBLGtEQUdBLFVBQUEsbUJBQUEsV0FDQSxPQUNBLE9BQ0EsTUFBQSxJQUNBLEtBQUEsS0FFQSxZQUFBLDBEQ25FQSxRQUFBLE9BQUEsVUFDQSxPQUFBLFdBQUEsVUFBQSxTQUFBLEdBQ0EsTUFBQSxVQUFBLEdBQ0EsR0FBQSxFQUFBLENBQ0EsR0FBQSxHQUFBLEtBQUEsTUFBQSxHQUNBLEdBQUEsR0FBQSxPQUFBLFVBQ0EsRUFBQSxFQUFBLEVBQ0EsRUFBQSxLQUFBLE1BQUEsRUFBQSxLQUNBLEVBQUEsS0FBQSxNQUFBLEVBQUEsSUFDQSxFQUFBLEtBQUEsTUFBQSxFQUFBLElBQ0EsRUFBQSxLQUFBLE1BQUEsRUFBQSxHQUNBLE9BQUEsR0FBQSxHQUNBLE1BQUEsRUFBQSxRQUFBLEVBQUEsVUFDQSxFQUFBLEVBQ0EsRUFBQSxZQUNBLEdBQUEsRUFDQSxZQUNBLEVBQUEsRUFDQSxFQUFBLGFBQ0EsR0FBQSxFQUNBLGNBQ0EsRUFBQSxFQUNBLEVBQUEsZUFDQSxHQUFBLEVBQ0EsZUFFQSx5QkMxQkEsUUFBQSxPQUFBLFVBQ0EsUUFBQSxnQkFBQSxXQUFBLFNBQUEsR0FFQSxNQUFBLFVBQUEsR0FDQSxHQUFBLEVBQ0EsR0FBQSxHQUNBLFlBQUEsOEJBQ0EsYUFBQSxRQUNBLFdBQUEsV0FDQSxLQUFBLE1BQUEsRUFBQSxNQUNBLEtBQUEsUUFBQSxFQUFBLFFBQ0EsS0FBQSxRQUFBLEVBQUEsUUFBQSxXQUFBLEVBQUEsVUFBQSxFQUFBLGVBQUEsRUFDQSxLQUFBLE9BQUEsRUFBQSxXQUNBLEtBQUEsWUFBQSxFQUFBLGFBQUEsVUFDQSxLQUFBLFdBQUEsRUFBQSxZQUFBLFNBQ0EsS0FBQSxjQUFBLEVBQUEsaUJBR0EsRUFBQSxXQUVBLEtBQUEsUUFBQSxXQUNBLEVBQUEiLCJmaWxlIjoicHVibGljL2J1aWxkL2FwcC5qcyIsInNvdXJjZXNDb250ZW50IjpbImFuZ3VsYXIubW9kdWxlKCdyYWxsbHknLCBbJ3VpLnJvdXRlcicsJ25nUmVzb3VyY2UnLCduZ0Z4JywnYnRmb3JkLm1vZGFsJ10pXG4gICAgLmNvbmZpZyhmdW5jdGlvbigkc3RhdGVQcm92aWRlciwgJHVybFJvdXRlclByb3ZpZGVyLCAkbG9jYXRpb25Qcm92aWRlcil7XG4gICAgICAgICRsb2NhdGlvblByb3ZpZGVyLmh0bWw1TW9kZSh0cnVlKTtcbiAgICAgICAgJHVybFJvdXRlclByb3ZpZGVyLm90aGVyd2lzZShcIi9ub3Rmb3VuZFwiKVxuICAgICAgICAkc3RhdGVQcm92aWRlclxuICAgICAgICAuc3RhdGUoJ2luZGV4Jyx7XG4gICAgICAgICAgICB1cmwgOiAnLycsXG4gICAgICAgICAgICB0ZW1wbGF0ZVVybCA6ICd0ZW1wbGF0ZXMvaG9tZS5odG1sJyxcbiAgICAgICAgICAgIGNvbnRyb2xsZXIgOiAnSG9tZUN0cmwnXG4gICAgICAgIH0pXG4gICAgICAgIC5zdGF0ZSgnbmV3ZXZlbnQnLHtcbiAgICAgICAgICAgIHVybCA6ICcvbmV3JyxcbiAgICAgICAgICAgIHRlbXBsYXRlVXJsIDogJ3RlbXBsYXRlcy9uZXdldmVudC5odG1sJyxcbiAgICAgICAgICAgIGNvbnRyb2xsZXIgOiAnTmV3RXZlbnRDdHJsJ1xuICAgICAgICB9KVxuICAgICAgICAuc3RhdGUoJ2Fib3V0Jywge1xuICAgICAgICAgICAgdXJsIDogJy9hYm91dCcsXG4gICAgICAgICAgICB0ZW1wbGF0ZVVybCA6ICd0ZW1wbGF0ZXMvYWJvdXQuaHRtbCcsXG4gICAgICAgICAgICBjb250cm9sbGVyIDogJ0Fib3V0Q3RybCdcbiAgICAgICAgfSlcbiAgICAgICAgLnN0YXRlKCdub3Rmb3VuZCcsIHtcbiAgICAgICAgICAgIHVybCA6ICcvbm90Zm91bmQnLFxuICAgICAgICAgICAgdGVtcGxhdGVVcmwgOiAndGVtcGxhdGVzL25vdGZvdW5kLmh0bWwnXG4gICAgICAgIH0pXG4gICAgICAgIC5zdGF0ZSgnZXZlbnQnLHtcbiAgICAgICAgICAgIHVybCA6ICcvOmlkJyxcbiAgICAgICAgICAgIHRlbXBsYXRlVXJsIDogJ3RlbXBsYXRlcy9ldmVudC5odG1sJyxcbiAgICAgICAgICAgIGNvbnRyb2xsZXIgOiAnRXZlbnRDdHJsJ1xuICAgICAgICB9KVxuICAgICAgICAuc3RhdGUoJ2VkaXRldmVudCcsIHtcbiAgICAgICAgICAgIHVybDogJy86aWQvZWRpdCcsXG4gICAgICAgICAgICB0ZW1wbGF0ZVVybCA6ICd0ZW1wbGF0ZXMvZWRpdGV2ZW50Lmh0bWwnLFxuICAgICAgICAgICAgY29udHJvbGxlciA6ICdFZGl0RXZlbnRDdHJsJ1xuICAgICAgICB9KVxuICAgIH0pXG4gICAgLmZhY3RvcnkoJ0V2ZW50JywgZnVuY3Rpb24oJHJlc291cmNlKXtcbiAgICAgICAgcmV0dXJuICRyZXNvdXJjZSgnL2FwaS9ldmVudC86aWQnLCB7IGlkIDogJ0BfaWQnIH0sIHtcbiAgICAgICAgICAgICd1cGRhdGUnIDogeyBtZXRob2QgOiAnUFVUJyB9XG4gICAgICAgIH0pO1xuICAgIH0pXG4gICAgLmZhY3RvcnkoJ1BhcnRpY2lwYW50JywgZnVuY3Rpb24oJHJlc291cmNlKXtcbiAgICAgICAgcmV0dXJuICRyZXNvdXJjZSgnL2FwaS9ldmVudC86aWQvcGFydGljaXBhbnQvOnBpZCcsIHsgaWQ6ICdAX2lkJywgcGlkIDogJ0BwaWQnfSwge1xuICAgICAgICAgICAgJ3VwZGF0ZScgOiB7IG1ldGhvZCA6ICdQVVQnIH1cbiAgICAgICAgfSk7XG4gICAgfSlcbiAgICAuZmFjdG9yeSgnVGl0bGUnLCBmdW5jdGlvbigpe1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc2V0IDogZnVuY3Rpb24odGl0bGUpe1xuICAgICAgICAgICAgICAgIGRvY3VtZW50LnRpdGxlID0gdGl0bGU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KTtcbiIsImFuZ3VsYXIubW9kdWxlKFwicmFsbGx5XCIpLnJ1bihbXCIkdGVtcGxhdGVDYWNoZVwiLCBmdW5jdGlvbigkdGVtcGxhdGVDYWNoZSkgeyR0ZW1wbGF0ZUNhY2hlLnB1dChcInRlbXBsYXRlcy9hYm91dC5odG1sXCIsXCI8ZGl2IHN0eWxlPVxcXCJtYXgtd2lkdGg6NjAwcHhcXFwiPlxcbiAgICA8aDE+V2hhdCBpcyBSYWxsbHk/PC9oMT5cXG4gICAgPGRpdiBjbGFzcz1cXFwicmwtcGFnZS1kZXNjXFxcIj5SYWxsbHkgaXMgYSBjb2xsYWJvcmF0aXZlIHNjaGVkdWxpbmcgc2VydmljZSB0aGF0IG1ha2VzIGRlY2lkaW5nIG9uIGEgZGF0ZSBmYXN0IGFuZCBlYXN5LjwvZGl2PlxcbiAgICA8aDI+SGksIElcXCdtIEx1a2UhPC9oMj5cXG4gICAgPHA+XFxuICAgICAgICBJIGNyZWF0ZWQgUmFsbGx5IGFzIHNpZGUgcHJvamVjdCB0byBoZWxwIG1lIGxlYXJuIHNvbWUgbmV3IHRlY2hub2xvZ2llcy4gSSBkZWNpZGVkIHRvIHB1Ymxpc2ggaXQgYmVjYXVzZSBJIHRob3VnaHQgb3RoZXIgcGVvcGxlIG1pZ2h0IGZpbmQgaXQgdXNlZnVsLiBSYWxsbHkgaXMgYSBjb21wbGV0ZWx5IGZyZWUgc2VydmljZS4gSW4gZmFjdCBpdCBpcyBldmVuIG9wZW4gc291cmNlLiBZb3UgY2FuIGxvb2sgYXQgdGhlIGxhdGVzdCBzb3VyY2UgY29kZSBvbiBHaXRodWIuXFxuICAgIDwvcD5cXG48L2Rpdj5cXG5cIik7XG4kdGVtcGxhdGVDYWNoZS5wdXQoXCJ0ZW1wbGF0ZXMvY29uZmlybW1vZGFsLmh0bWxcIixcIjxkaXYgY2xhc3M9XFxcInJsLW1vZGFsLW92ZXJsYXlcXFwiIG5nLWNsaWNrPVxcXCJtb2RhbC5jYW5jZWwoKVxcXCI+PC9kaXY+XFxuXFxuPGRpdiBjbGFzcz1cXFwicmwtbW9kYWxcXFwiPlxcbiAgICA8ZGl2IGNsYXNzPVxcXCJybC1tb2RhbC10aXRsZVxcXCI+e3ttb2RhbC50aXRsZX19PC9kaXY+XFxuICAgIDxkaXYgY2xhc3M9XFxcInJsLW1vZGFsLW1lc3NhZ2VcXFwiPlxcbiAgICAgICAge3ttb2RhbC5tZXNzYWdlfX1cXG4gICAgPC9kaXY+XFxuICAgIDxkaXYgY2xhc3M9XFxcInJsLW1vZGFsLWFjdGlvbnNcXFwiPlxcbiAgICAgICAgPGJ1dHRvbiBuZy1jbGljaz1cXFwibW9kYWwuY29uZmlybSgpXFxcIiBuZy1zaG93PVxcXCJtb2RhbC5jb25maXJtXFxcIiBjbGFzcz1cXFwiYnRuXFxcIiBuZy1jbGFzcz1cXFwie2RhbmdlciA6IG1vZGFsLmlzRGVzdHJ1Y3RpdmV9XFxcIj57e21vZGFsLmNvbmZpcm1UZXh0fX08L2J1dHRvbj5cXG4gICAgICAgIDxidXR0b24gbmctY2xpY2s9XFxcIm1vZGFsLmNhbmNlbCgpXFxcIiAgY2xhc3M9XFxcImJ0blxcXCI+e3ttb2RhbC5jYW5jZWxUZXh0fX08L2J1dHRvbj5cXG4gICAgPC9kaXY+XFxuPC9kaXY+XFxuXCIpO1xuJHRlbXBsYXRlQ2FjaGUucHV0KFwidGVtcGxhdGVzL2VkaXRldmVudC5odG1sXCIsXCI8ZGl2IG5nLXNob3c9XFxcImV2ZW50Ll9pZFxcXCI+XFxuICAgIDxkaXYgY2xhc3M9XFxcImJveFxcXCI+XFxuXFxuICAgICAgICA8ZGl2IGNsYXNzPVxcXCJib3gtdGl0bGVcXFwiPkVkaXQgRXZlbnQ8L2Rpdj5cXG4gICAgICAgIDxkaXYgY2xhc3M9XFxcImJveC1kZXNjcmlwdGlvblxcXCI+XFxuICAgICAgICAgICAgWW91IGNhbiBtYWtlcyBjaGFuZ2VzIHRvIHlvdXIgZXhpc3RpbmcgZXZlbnQgYnkgY2hhbmdpbmcgdGhlIGZpZWxkcyBpbiB0aGUgZm9ybSBiZWxvdy5cXG4gICAgICAgIDwvZGl2PlxcblxcbiAgICAgICAgPGZvcm0gbm92YWxpZGF0ZSBuYW1lPVxcXCJmb3JtXFxcIiBuZy1zdWJtaXQ9XFxcInN1Ym1pdCgpXFxcIj5cXG5cXG4gICAgICAgICAgICA8c2VjdGlvbiBjbGFzcz1cXFwiYm94LXNlY3Rpb25cXFwiIHVzZXItZm9ybSBmb3JtPVxcXCJmb3JtXFxcIiBldmVudD1cXFwiZXZlbnRcXFwiPlxcblxcbiAgICAgICAgICAgIDwvc2VjdGlvbj5cXG5cXG4gICAgICAgICAgICA8c2VjdGlvbiBjbGFzcz1cXFwiYm94LXNlY3Rpb25cXFwiIGV2ZW50LWZvcm0gZm9ybT1cXFwiZm9ybVxcXCIgZXZlbnQ9XFxcImV2ZW50XFxcIj5cXG5cXG4gICAgICAgICAgICA8L3NlY3Rpb24+XFxuICAgICAgICAgICAgPHNlY3Rpb24gY2xhc3M9XFxcImJveC1zZWN0aW9uXFxcIiBkYXRlLWZvcm0gZm9ybT1cXFwiZm9ybVxcXCIgZXZlbnQ9XFxcImV2ZW50XFxcIj5cXG5cXG4gICAgICAgICAgICA8L3NlY3Rpb24+XFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwiYm94LWNvbnRyb2xzIGJveC1ib3R0b20tc3RpY2t5XFxcIj5cXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVxcXCJzdWJtaXRcXFwiIG5nLXNob3c9XFxcImRpZENoYW5nZSgpXFxcIiBjbGFzcz1cXFwiYnRuIGJ0bi1wcmltYXJ5XFxcIiBuZy1jbGFzcz1cXFwie2Rpc2FibGVkIDogIWRpZENoYW5nZSgpfVxcXCI+XFxuICAgICAgICAgICAgICAgICAgICBTYXZlIENoYW5nZXNcXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XFxuICAgICAgICAgICAgICAgIDxidXR0b24gbmctY2xpY2s9XFxcInVuZG9DaGFuZ2VzKClcXFwiIGNsYXNzPVxcXCJidG5cXFwiIG5nLXNob3c9XFxcImRpZENoYW5nZSgpXFxcIj5VbmRvIENoYW5nZXM8L2J1dHRvbj5cXG4gICAgICAgICAgICAgICAgPGEgaHJlZj1cXFwiL3t7ZXZlbnQuX2lkfX1cXFwiIGNsYXNzPVxcXCJidG5cXFwiIG5nLWhpZGU9XFxcImRpZENoYW5nZSgpXFxcIj5Eb25lPC9hPlxcbiAgICAgICAgICAgIDwvZGl2PlxcblxcbiAgICAgICAgPC9mb3JtPlxcblxcbiAgICA8L2Rpdj5cXG5cXG48L2Rpdj5cXG5cIik7XG4kdGVtcGxhdGVDYWNoZS5wdXQoXCJ0ZW1wbGF0ZXMvZXZlbnQuaHRtbFwiLFwiPGRpdiBuZy1zaG93PVxcXCJldmVudC5faWRcXFwiPlxcbiAgICA8ZGl2IGNsYXNzPVxcXCJib3ggXFxcIj5cXG4gICAgICAgIDxkaXYgY2xhc3M9XFxcImV2ZW50LWhlYWRlclxcXCI+XFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwiYXZhdGFyXFxcIj5cXG4gICAgICAgICAgICAgICAgPGltZyBzcmM9XFxcIi9pbWFnZXMvZXZlbnRpY29uLnBuZ1xcXCIgd2lkdGg9XFxcIjMyICBcXFwiIC8+XFxuICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwiZGV0YWlsc1xcXCI+XFxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcInRpdGxlXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgIHt7ZXZlbnQudGl0bGV9fVxcbiAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwic3VidGl0bGVcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgQ3JlYXRlZCBieSA8YSBocmVmPVxcXCJtYWlsdG86e3tldmVudC5jcmVhdG9yLmVtYWlsfX1cXFwiPnt7ZXZlbnQuY3JlYXRvci5uYW1lfX08L2E+ICZidWxsOyB7e2V2ZW50LmNyZWF0ZWQgfCBlbGFwc2VkfX1cXG4gICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwiYWN0aW9uc1xcXCI+XFxuICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XFxcImJ0blxcXCIgbmctY2xpY2s9XFxcImVkaXRFdmVudCgpXFxcIj5FZGl0IEV2ZW50PC9idXR0b24+XFxuICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICA8L2Rpdj5cXG4gICAgICAgIDxkaXYgY2xhc3M9XFxcImJveC1zaWRlLXN0aWNreSBldmVudC1kZXNjcmlwdGlvblxcXCIgbmctc2hvdz1cXFwiZXZlbnQuZGVzY3JpcHRpb25cXFwiPnt7ZXZlbnQuZGVzY3JpcHRpb259fTwvZGl2PlxcbiAgICAgICAgPGRpdiBjbGFzcz1cXFwiYm94LWJvdHRvbS1zdGlja3kgZXZlbnQtbG9jYXRpb25cXFwiIG5nLXNob3c9XFxcImV2ZW50LmxvY2F0aW9uXFxcIj5cXG4gICAgICAgICAgICA8aW1nIHNyYz1cXFwiL2ltYWdlcy9sb2NhdGlvbi5wbmdcXFwiIHdpZHRoPVxcXCIxOFxcXCIgLz48YSBocmVmPVxcXCJodHRwOi8vZ29vZ2xlLmNvbS9tYXBzP3E9e3tldmVudC5sb2NhdGlvbn19XFxcIiB0YXJnZXQ9XFxcIl9ibGFua1xcXCI+e3tldmVudC5sb2NhdGlvbn19PC9hPlxcbiAgICAgICAgPC9kaXY+XFxuXFxuICAgIDwvZGl2PlxcbiAgICA8ZGl2IGNsYXNzPVxcXCJib3ggYm94LXgtc2Nyb2xsXFxcIj5cXG4gICAgICAgIDxkaXYgcG9sbCBldmVudD1cXFwiZXZlbnRcXFwiIGNsYXNzPVxcXCJwb2xsXFxcIiBwYXJ0aWNpcGFudD1cXFwicGFydGljaXBhbnRcXFwiPlxcbiAgICAgICAgPC9kaXY+XFxuICAgIDwvZGl2PlxcbjwvZGl2PlxcblwiKTtcbiR0ZW1wbGF0ZUNhY2hlLnB1dChcInRlbXBsYXRlcy9ob21lLmh0bWxcIixcIjxkaXYgY2xhc3M9XFxcInBhZ2UtcGxhY2Vob2xkZXJcXFwiPlxcbiAgICA8ZGl2IGNsYXNzPVxcXCJpbWFnZVxcXCI+XFxuICAgICAgICA8aW1nIHNyYz1cXFwiL2ltYWdlcy9tYXJrX2xhcmdlLnBuZ1xcXCIgd2lkdGg9XFxcIjY3XFxcIiAvPlxcbiAgICA8L2Rpdj5cXG4gICAgPGRpdiBjbGFzcz1cXFwidGl0bGVcXFwiPlxcbiAgICAgICAgU2NoZWR1bGUgYW4gRXZlbnRcXG4gICAgPC9kaXY+XFxuICAgIDxkaXYgY2xhc3M9XFxcImNvbnRlbnRcXFwiPlxcbiAgICAgICAgV2FudCB0byBob3N0IGFuIGV2ZW50IGJ1dCBjYW7igJl0IGRlY2lkZSBvbiBhIGRhdGU/IENsaWNrIG9uIHRoZSBidXR0b24gYmVsb3cgdG8gc3RhcnQhXFxuICAgIDwvZGl2PlxcbiAgICA8YnV0dG9uIG5nLWNsaWNrPVxcXCJuZXdFdmVudCgpXFxcIiBjbGFzcz1cXFwiYnRuXFxcIj5TY2hlZHVsZSBOZXcgRXZlbnQ8L2J1dHRvbj5cXG48L2Rpdj5cXG5cIik7XG4kdGVtcGxhdGVDYWNoZS5wdXQoXCJ0ZW1wbGF0ZXMvbmV3ZXZlbnQuaHRtbFwiLFwiPGRpdiBuZy1oaWRlPVxcXCJldmVudFVybFxcXCI+XFxuICAgIDxkaXYgY2xhc3M9XFxcImJveFxcXCIgbmctY2xhc3M9XFxcIntcXCdhbmltYXRlZCBzaGFrZVxcJzogZm9ybS4kc3VibWl0dGVkICYmIGZvcm0uJGludmFsaWQgfVxcXCI+XFxuXFxuICAgICAgICA8ZGl2IGNsYXNzPVxcXCJib3gtdGl0bGVcXFwiPlNjaGVkdWxlIGEgTmV3IEV2ZW50PC9kaXY+XFxuICAgICAgICA8ZGl2IGNsYXNzPVxcXCJib3gtZGVzY3JpcHRpb25cXFwiPlxcbiAgICAgICAgICAgIEZpbGwgaW4gdGhlIGZvcm0gYmVsb3cgdG8gY3JlYXRlIHlvdXIgZXZlbnQgYW5kIHNoYXJlIGl0IHdpdGggeW91ciBmcmllbmRzIGFuZCBjb2xsZWFndWVzLlxcbiAgICAgICAgPC9kaXY+XFxuXFxuICAgICAgICA8Zm9ybSBub3ZhbGlkYXRlIG5hbWU9XFxcImZvcm1cXFwiIG5nLXN1Ym1pdD1cXFwic3VibWl0KClcXFwiPlxcbiAgICAgICAgICAgIDxzZWN0aW9uIGNsYXNzPVxcXCJib3gtc2VjdGlvblxcXCIgdXNlci1mb3JtIGZvcm09XFxcImZvcm1cXFwiIGV2ZW50PVxcXCJldmVudFxcXCI+XFxuXFxuICAgICAgICAgICAgPC9zZWN0aW9uPlxcblxcbiAgICAgICAgICAgIDxzZWN0aW9uIGNsYXNzPVxcXCJib3gtc2VjdGlvblxcXCIgZXZlbnQtZm9ybSBmb3JtPVxcXCJmb3JtXFxcIiBldmVudD1cXFwiZXZlbnRcXFwiPlxcblxcbiAgICAgICAgICAgIDwvc2VjdGlvbj5cXG5cXG4gICAgICAgICAgICA8c2VjdGlvbiBjbGFzcz1cXFwiYm94LXNlY3Rpb25cXFwiIGRhdGUtZm9ybSBmb3JtPVxcXCJmb3JtXFxcIiBldmVudD1cXFwiZXZlbnRcXFwiPlxcblxcbiAgICAgICAgICAgIDwvc2VjdGlvbj5cXG5cXG4gICAgICAgICAgICA8c2VjdGlvbiBjbGFzcz1cXFwiYm94LXNlY3Rpb25cXFwiIHBhcnRpY2lwYW50cy1mb3JtIGZvcm09XFxcImZvcm1cXFwiIGV2ZW50PVxcXCJldmVudFxcXCI+XFxuXFxuICAgICAgICAgICAgPC9zZWN0aW9uPlxcblxcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcImJveC1jb250cm9scyBib3gtYm90dG9tLXN0aWNreVxcXCI+XFxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cXFwic3VibWl0XFxcIiBjbGFzcz1cXFwiYnRuIGJ0bi1wcmltYXJ5XFxcIj5DcmVhdGUgRXZlbnQ8L2J1dHRvbj5cXG4gICAgICAgICAgICA8L2Rpdj5cXG5cXG4gICAgICAgIDwvZm9ybT5cXG4gICAgPC9kaXY+XFxuPC9kaXY+XFxuPGRpdiBuZy1zaG93PVxcXCJldmVudFVybFxcXCIgY2xhc3M9XFxcImJveCBmeC1mYWRlLXVwXFxcIj5cXG4gICAgPGRpdiBjbGFzcz1cXFwiYm94LW1lc3NhZ2VcXFwiPlxcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcIm1haW4taW1hZ2VcXFwiPlxcbiAgICAgICAgICAgICAgICA8aW1nIHNyYz1cXFwiL2ltYWdlcy9zdWNjZXNzX2xhcmdlLnBuZ1xcXCIgd2lkdGg9XFxcIjEwMFxcXCIgLz5cXG4gICAgICAgICAgICA8L2Rpdj5cXG4gICAgPGRpdiBjbGFzcz1cXFwidGl0bGVcXFwiPkV2ZW50IENyZWF0ZWQ8L2Rpdj5cXG4gICAgPGRpdiBjbGFzcz1cXFwiY29udGVudFxcXCI+XFxuICAgICAgICBZb3VyIGV2ZW50IGhhcyBiZWVuIGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5ISBNYWtlIHN1cmUgeW91IHZpc2l0IHRoZSBwYWdlIHlvdXJzZWxmIGFuZCBmaWxsIGluIHRoZSBwb2xsLlxcbiAgICA8L2Rpdj5cXG4gICAgPGRpdiBjbGFzcz1cXFwibWluaS1kaXZpZGVyXFxcIj5cXG4gICAgPC9kaXY+XFxuICAgIDxkaXYgY2xhc3M9XFxcImZvcm0tZ3JvdXBcXFwiPlxcbiAgICAgICAgPGlucHV0IHR5cGU9XFxcInRleHRcXFwiIGNsYXNzPVxcXCJmb3JtLWNvbnRyb2xcXFwiIGRpc2FibGVkPVxcXCJ0cnVlXFxcIiB2YWx1ZT1cXFwie3tldmVudFVybH19XFxcIiAvPlxcbiAgICAgICAgPGEgaHJlZj1cXFwie3tldmVudFVybH19XFxcIiBjbGFzcz1cXFwiYnRuIGZvcm0tYnRuXFxcIj5HTzwvYT5cXG4gICAgPC9kaXY+XFxuICAgIDwvZGl2PlxcbjwvZGl2PlxcblwiKTtcbiR0ZW1wbGF0ZUNhY2hlLnB1dChcInRlbXBsYXRlcy9ub3Rmb3VuZC5odG1sXCIsXCI8aDE+RXJyb3IgNDA0PC9oMT5cXG48aDI+Tm90IEZvdW5kPC9oMj5cXG5cIik7XG4kdGVtcGxhdGVDYWNoZS5wdXQoXCJ0ZW1wbGF0ZXMvZGlyZWN0aXZlcy9wb2xsLmh0bWxcIixcIjxkaXYgY2xhc3M9XFxcInBvbGwtaGVhZGVyXFxcIj5cXG4gICAgPGRpdiBjbGFzcz1cXFwiaGVhZGVyIHBhcnRpY2lwYW50cy1oZWFkZXJcXFwiPlxcbiAgICAgICAge3tldmVudC5wYXJ0aWNpcGFudHMubGVuZ3RofX0gcGFydGljaXBhbnRzXFxuICAgIDwvZGl2PlxcbiAgICA8ZGl2IGNsYXNzPVxcXCJoZWFkZXIgZGF0ZS1oZWFkZXJcXFwiIG5nLXJlcGVhdD1cXFwiZGF0ZSBpbiBldmVudC5kYXRlc1xcXCI+XFxuICAgICAgICA8ZGl2IGNsYXNzPVxcXCJkYXRpY29uXFxcIj5cXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJkb3dcXFwiPlxcbiAgICAgICAgICAgICAgICB7e2RhdGUgfCBkYXRlOiBcXCdFRUVcXCd9fVxcbiAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcImRheVxcXCI+XFxuICAgICAgICAgICAgICAgIHt7ZGF0ZSB8IGRhdGU6IFxcJ2RcXCd9fVxcbiAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcIm1vbnRoXFxcIj5cXG4gICAgICAgICAgICAgICAge3tkYXRlIHwgZGF0ZSA6IFxcJ01NTVxcJ319XFxuICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XFxcImNvdW50XFxcIiBuZy1zaG93PVxcXCJzZWxlY3RlZERhdGUoJGluZGV4KVxcXCIgbmctY2xhc3M9e3RvcDppc1RvcERhdGUoJGluZGV4KX0+e3tzZWxlY3RlZERhdGUoJGluZGV4KX19PC9zcGFuPlxcbiAgICAgICAgPC9kaXY+XFxuICAgIDwvZGl2PlxcbiAgICA8ZGl2IGNsYXNzPVxcXCJoZWFkZXIgYWN0aW9ucy1oZWFkZXJcXFwiPlxcblxcbiAgICA8L2Rpdj5cXG48L2Rpdj5cXG48ZGl2IGNsYXNzPVxcXCJwb2xsLWJvZHlcXFwiPlxcbiAgICA8ZGl2IGNsYXNzPVxcXCJwb2xsLWVudHJ5XFxcIiBuZy1yZXBlYXQ9XFxcInBhcnRpY2lwYW50IGluIGV2ZW50LnBhcnRpY2lwYW50c1xcXCI+XFxuICAgICAgICA8Zm9ybSBub3ZhbGlkYXRlIG5nLXN1Ym1pdD1cXFwidXBkYXRlKHBhcnRpY2lwYW50KTsgZWRpdE1vZGUgPSBmYWxzZVxcXCI+XFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwiY2VsbCBuYW1lLWNlbGxcXFwiPlxcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cXFwiYXZhdGFyIHN0eWxlLXt7JGluZGV4ICsgMX19XFxcIj5cXG4gICAgICAgICAgICAgICAgICAgIDxpbWcgc3JjPVxcXCIvaW1hZ2VzL3VzZXIucG5nXFxcIiB3aWR0aD1cXFwiMTFcXFwiIC8+XFxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cXG4gICAgICAgICAgICAgICAgPGlucHV0IHJlcXVpcmVkIGF1dG9jb21wbGV0ZT1cXFwib2ZmXFxcIiB0eXBlPVxcXCJ0ZXh0XFxcIiBjbGFzcz1cXFwiZm9ybS1jb250cm9sXFxcIiBuZy1tb2RlbD1cXFwicGFydGljaXBhbnQubmFtZVxcXCIgbmctc2hvdz1cXFwiZWRpdE1vZGVcXFwiIHZhbHVlPVxcXCJwYXJ0aWNpcGFudC5uYW1lXFxcIi8+XFxuICAgICAgICAgICAgICAgIDxzcGFuIG5nLWhpZGU9XFxcImVkaXRNb2RlXFxcIiBjbGFzcz1cXFwibmFtZVxcXCIgbmctY2xpY2s9XFxcImVkaXRNb2RlID0gdHJ1ZTsgZWRpdChwYXJ0aWNpcGFudClcXFwiPnt7cGFydGljaXBhbnQubmFtZX19PC9zcGFuPlxcbiAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcImNlbGwgdm90ZS1jZWxsXFxcIiBuZy1yZXBlYXQ9XFxcImRhdGUgaW4gZXZlbnQuZGF0ZXNcXFwiPlxcbiAgICAgICAgICAgICAgICA8aW1nIHNyYz1cXFwiL2ltYWdlcy90aWNrQDJ4LnBuZ1xcXCIgIHdpZHRoPVxcXCIxNlxcXCIgbmctaGlkZT1cXFwiZWRpdE1vZGVcXFwiIG5nLWlmPVxcXCJwYXJ0aWNpcGFudC5kYXRlc1skaW5kZXhdXFxcIiAvPlxcbiAgICAgICAgICAgICAgICA8aW1nIHNyYz1cXFwiL2ltYWdlcy9ub3BlQDJ4LnBuZ1xcXCIgd2lkdGg9XFxcIjhcXFwiIG5nLWhpZGU9XFxcImVkaXRNb2RlXFxcIiBuZy1pZj1cXFwiIXBhcnRpY2lwYW50LmRhdGVzWyRpbmRleF1cXFwiIC8+XFxuICAgICAgICAgICAgICAgIDxpbnB1dCBuZy1tb2RlbD1cXFwicGFydGljaXBhbnQuZGF0ZXNbJGluZGV4XVxcXCIgbmctc2hvdz1cXFwiZWRpdE1vZGVcXFwiIG5nLWZhbHNlLXZhbHVlPVxcXCJmYWxzZVxcXCIgdHlwZT1cXFwiY2hlY2tib3hcXFwiIC8+XFxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcIm92ZXJsYXlcXFwiIG5nLXNob3c9XFxcImVkaXRNb2RlXFxcIiBuZy1jbGljaz1cXFwicGFydGljaXBhbnQuZGF0ZXNbJGluZGV4XSA9ICFwYXJ0aWNpcGFudC5kYXRlc1skaW5kZXhdXFxcIj48L2Rpdj5cXG4gICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJjZWxsIGFjdGlvbi1jZWxsXFxcIj5cXG4gICAgICAgICAgICAgICAgPGEgaHJlZj1cXFwiI1xcXCIgbmctaGlkZT1cXFwiZWRpdE1vZGVcXFwiIG5nLWNsaWNrPVxcXCJlZGl0TW9kZSA9IHRydWU7IGVkaXQocGFydGljaXBhbnQpXFxcIiBjbGFzcz1cXFwiYnRuIGhvdmVyXFxcIj5FZGl0PC9hPlxcbiAgICAgICAgICAgICAgICA8YSBocmVmPVxcXCIjXFxcIiBuZy1oaWRlPVxcXCJlZGl0TW9kZVxcXCIgbmctY2xpY2s9XFxcImRlbGV0ZShwYXJ0aWNpcGFudClcXFwiIGNsYXNzPVxcXCJidG4gZGFuZ2VyIGhvdmVyXFxcIj5EZWxldGU8L2E+XFxuICAgICAgICAgICAgICAgIDxidXR0b24gbmctc2hvdz1cXFwiZWRpdE1vZGVcXFwiIHR5cGU9XFxcInN1Ym1pdFxcXCIgY2xhc3M9XFxcImJ0blxcXCI+U2F2ZTwvYnV0dG9uPlxcbiAgICAgICAgICAgICAgICA8YSBocmVmPVxcXCIjXFxcIiBuZy1zaG93PVxcXCJlZGl0TW9kZVxcXCIgbmctY2xpY2s9XFxcImVkaXRNb2RlID0gZmFsc2U7IGNhbmNlbCgkaW5kZXgpXFxcIiAgY2xhc3M9XFxcImJ0blxcXCI+Q2FuY2VsPC9hPlxcbiAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgPC9mb3JtPlxcbiAgICA8L2Rpdj5cXG4gICAgPGRpdiBjbGFzcz1cXFwicG9sbC1lbnRyeSBoaWdobGlnaHRcXFwiPlxcbiAgICAgICAgPGZvcm0gbm92YWxpZGF0ZSBuYW1lPVxcXCJmb3JtbmV3XFxcIiBuZy1zdWJtaXQ9XFxcInNhdmUocGFydGljaXBhbnQpXFxcIj5cXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJjZWxsIG5hbWUtY2VsbFxcXCI+XFxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVxcXCJhdmF0YXIgc3R5bGUte3twYXJ0aWNpcGFudC5zdHlsZX19XFxcIj5cXG4gICAgICAgICAgICAgICAgICAgIDxpbWcgc3JjPVxcXCIvaW1hZ2VzL3VzZXIucG5nXFxcIiB3aWR0aD1cXFwiMTFcXFwiIC8+XFxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cXG4gICAgICAgICAgICAgICAgPGlucHV0IGF1dG9jb21wbGV0ZT1cXFwib2ZmXFxcIiBuYW1lPVxcXCJ1c2VybmFtZVxcXCIgdHlwZT1cXFwidGV4dFxcXCIgY2xhc3M9XFxcImZvcm0tY29udHJvbFxcXCIgcGxhY2Vob2xkZXI9XFxcIllvdXIgbmFtZS4uLlxcXCIgbmctbW9kZWw9XFxcInBhcnRpY2lwYW50Lm5hbWVcXFwiIHJlcXVpcmVkIHZhbHVlPVxcXCJwYXJ0aWNpcGFudC5uYW1lXFxcIi8+XFxuICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwiY2VsbCB2b3RlLWNlbGxcXFwiIG5nLXJlcGVhdD1cXFwiZGF0ZSBpbiBldmVudC5kYXRlc1xcXCI+XFxuICAgICAgICAgICAgICAgIDxpbnB1dCBuZy1tb2RlbD1cXFwicGFydGljaXBhbnQuZGF0ZXNbJGluZGV4XVxcXCIgbmctZmFsc2UtdmFsdWU9XFxcImZhbHNlXFxcIiB0eXBlPVxcXCJjaGVja2JveFxcXCIgLz5cXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwib3ZlcmxheVxcXCIgbmctY2xpY2s9XFxcInBhcnRpY2lwYW50LmRhdGVzWyRpbmRleF0gPSAhcGFydGljaXBhbnQuZGF0ZXNbJGluZGV4XVxcXCI+PC9kaXY+XFxuICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwiY2VsbCBhY3Rpb24tY2VsbFxcXCI+XFxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cXFwic3VibWl0XFxcIiBuZy1jbGFzcz1cXFwieyBcXCdhbmltYXRlZCBzaGFrZVxcJyA6IGZvcm1uZXcuJHN1Ym1pdHRlZCAmJiBmb3JtbmV3LiRpbnZhbGlkICB9XFxcIiBjbGFzcz1cXFwiYnRuXFxcIj5TYXZlPC9idXR0b24+XFxuICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICA8L2Zvcm0+XFxuICAgIDwvZGl2PlxcbjwvZGl2PlxcblwiKTtcbiR0ZW1wbGF0ZUNhY2hlLnB1dChcInRlbXBsYXRlcy9kaXJlY3RpdmVzL2V2ZW50Rm9ybS9kYXRlRm9ybS5odG1sXCIsXCI8ZGl2IGNsYXNzPVxcXCJzZWN0aW9uLWRldGFpbHNcXFwiPlxcbiAgICA8ZGl2IGNsYXNzPVxcXCJzZWN0aW9uLXRpdGxlXFxcIj5DaG9vc2UgRGF0ZXM8L2Rpdj5cXG4gICAgPHVsIGNsYXNzPVxcXCJkYXRpY29uLWxpc3RcXFwiPlxcbiAgICAgICAgPGxpIG5nLXJlcGVhdD1cXFwiZGF0ZSBpbiBldmVudC5kYXRlc1xcXCI+XFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwiZGF0aWNvblxcXCI+XFxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcImRvd1xcXCI+XFxuICAgICAgICAgICAgICAgICAgICB7e2RhdGUgfCBkYXRlOiBcXCdFRUVcXCd9fVxcbiAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwiZGF5XFxcIj5cXG4gICAgICAgICAgICAgICAgICAgIHt7ZGF0ZSB8IGRhdGU6IFxcJ2RcXCd9fVxcbiAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwibW9udGhcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAge3tkYXRlIHwgZGF0ZSA6IFxcJ01NTVxcJ319XFxuICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cXFwiZGVsZXRlXFxcIiBuZy1jbGljaz1cXFwiZGF0ZXBpY2tlci51bnNldERhdGUoZGF0ZSlcXFwiPjwvc3Bhbj5cXG4gICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgIDwvbGk+XFxuICAgIDwvdWw+XFxuPC9kaXY+XFxuPGRpdiBjbGFzcz1cXFwic2VjdGlvbi1tYWluXFxcIj5cXG4gICAgPGRpdiBjbGFzcz1cXFwiZm9ybS1yb3dcXFwiPlxcbiAgICAgICAgPGRpdiBjbGFzcz1cXFwiZm9ybS1ncm91cFxcXCI+XFxuICAgICAgICAgICAgPGxhYmVsIGZvcj1cXFwiZW1haWxcXFwiPkNhbGVuZGFyPC9sYWJlbD5cXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cXFwiZm9ybS1lcnJvclxcXCIgbmctc2hvdz1cXFwiKGZvcm0uZGF0ZXBpY2tlci4kZGlydHkgfHwgZm9ybS4kc3VibWl0dGVkKSAmJiBmb3JtLmRhdGVwaWNrZXIuJGVycm9yLnJlcXVpcmVkXFxcIj5cXG4gICAgICAgICAgICAgICAgPGltZyBzcmM9XFxcIi9pbWFnZXMvZXJyb3IucG5nXFxcIiB3aWR0aD1cXFwiMTRcXFwiIC8+IFlvdSBuZWVkIHRvIHNlbGVjdCBhIGZldyBkYXRlc1xcbiAgICAgICAgICAgIDwvc3Bhbj5cXG4gICAgICAgICAgICA8ZGl2IGRhdGVwaWNrZXIgcmVxdWlyZWQgbmFtZT1cXFwiZGF0ZXBpY2tlclxcXCIgY29udHJvbD1cXFwiZGF0ZXBpY2tlclxcXCIgbmctbW9kZWw9XFxcImV2ZW50LmRhdGVzXFxcIj5cXG5cXG4gICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgIDwvZGl2PlxcbiAgICA8L2Rpdj5cXG48L2Rpdj5cXG5cIik7XG4kdGVtcGxhdGVDYWNoZS5wdXQoXCJ0ZW1wbGF0ZXMvZGlyZWN0aXZlcy9ldmVudEZvcm0vZXZlbnRGb3JtLmh0bWxcIixcIjxkaXYgY2xhc3M9XFxcInNlY3Rpb24tZGV0YWlsc1xcXCI+XFxuICAgIDxkaXYgY2xhc3M9XFxcInNlY3Rpb24tdGl0bGVcXFwiPkV2ZW50IERldGFpbHM8L2Rpdj5cXG48L2Rpdj5cXG48ZGl2IGNsYXNzPVxcXCJzZWN0aW9uLW1haW5cXFwiPlxcbiAgICA8ZGl2IGNsYXNzPVxcXCJmb3JtLXJvd1xcXCI+XFxuICAgICAgICA8ZGl2IGNsYXNzPVxcXCJmb3JtLWNvbFxcXCI+XFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwiZm9ybS1ncm91cFxcXCI+XFxuICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XFxcInRpdGxlXFxcIj5UaXRsZTwvbGFiZWw+XFxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVxcXCJmb3JtLWVycm9yXFxcIiBuZy1zaG93PVxcXCIoZm9ybS50aXRsZS4kdG91Y2hlZCB8fCBmb3JtLiRzdWJtaXR0ZWQpICYmIGVycm9ycy50aXRsZVxcXCI+XFxuICAgICAgICAgICAgICAgICAgICA8aW1nIHNyYz1cXFwiL2ltYWdlcy9lcnJvci5wbmdcXFwiIHdpZHRoPVxcXCIxNFxcXCIgLz4ge3tlcnJvcnMudGl0bGV9fVxcbiAgICAgICAgICAgICAgICA8L3NwYW4+XFxuICAgICAgICAgICAgICAgIDxpbnB1dCBpZD1cXFwidGl0bGVcXFwiIG5hbWU9XFxcInRpdGxlXFxcIiBuZy1tYXhsZW5ndGg9XFxcIjMwXFxcIiByZXF1aXJlZCBuZy1tb2RlbD1cXFwiZXZlbnQudGl0bGVcXFwiIHR5cGU9XFxcInRleHRcXFwiIHBsYWNlaG9sZGVyPVxcXCJNb250aGx5IE1lZXR1cC4uLlxcXCIgY2xhc3M9XFxcImZvcm0tY29udHJvbCBleHRlbmRcXFwiLz5cXG4gICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgIDwvZGl2PlxcbiAgICAgICAgPGRpdiBjbGFzcz1cXFwiZm9ybS1jb2xcXFwiPlxcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcImZvcm0tZ3JvdXAgb3B0aW9uYWxcXFwiPlxcbiAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVxcXCJsb2NhdGlvblxcXCI+TG9jYXRpb248L2xhYmVsPlxcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cXFwiZm9ybS1lcnJvclxcXCIgbmctc2hvdz1cXFwiKGZvcm0ubG9jYXRpb24uJHRvdWNoZWQgfHwgZm9ybS4kc3VibWl0dGVkKSAmJiBlcnJvcnMubG9jYXRpb25cXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgPGltZyBzcmM9XFxcIi9pbWFnZXMvZXJyb3IucG5nXFxcIiB3aWR0aD1cXFwiMTRcXFwiIC8+IHt7ZXJyb3JzLmxvY2F0aW9ufX1cXG4gICAgICAgICAgICAgICAgPC9zcGFuPlxcbiAgICAgICAgICAgICAgICA8aW5wdXQgaWQ9XFxcImxvY2F0aW9uXFxcIiBuYW1lPVxcXCJsb2NhdGlvblxcXCIgbmctbW9kZWw9XFxcImV2ZW50LmxvY2F0aW9uXFxcIiBuZy1tYXhsZW5ndGg9XFxcIjUwXFxcIiB0eXBlPVxcXCJ0ZXh0XFxcIiBwbGFjZWhvbGRlcj1cXFwiUmlja1xcJ3MgQ2FmZS4uLlxcXCIgY2xhc3M9XFxcImZvcm0tY29udHJvbCBleHRlbmRcXFwiLz5cXG4gICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgIDwvZGl2PlxcbiAgICA8L2Rpdj5cXG4gICAgPGRpdiBjbGFzcz1cXFwiZm9ybS1yb3dcXFwiPlxcbiAgICAgICAgPGRpdiBjbGFzcz1cXFwiZm9ybS1ncm91cCBvcHRpb25hbFxcXCI+XFxuICAgICAgICAgICAgPGxhYmVsIGZvcj1cXFwiZGVzY3JpcHRpb25cXFwiID5EZXNjcmlwdGlvbjwvbGFiZWw+XFxuICAgICAgICAgICAgPHRleHRhcmVhIGlkPVxcXCJkZXNjcmlwdGlvblxcXCIgbmFtZT1cXFwiZGVzY3JpcHRpb25cXFwiIG5nLW1vZGVsPVxcXCJldmVudC5kZXNjcmlwdGlvblxcXCIgcGxhY2Vob2xkZXI9XFxcIkVudGVyIERlc2NyaXB0aW9uLi4uXFxcIiBjbGFzcz1cXFwiZm9ybS1jb250cm9sIGV4dGVuZFxcXCI+PC90ZXh0YXJlYT5cXG4gICAgICAgIDwvZGl2PlxcbiAgICA8L2Rpdj5cXG48L2Rpdj5cXG5cIik7XG4kdGVtcGxhdGVDYWNoZS5wdXQoXCJ0ZW1wbGF0ZXMvZGlyZWN0aXZlcy9ldmVudEZvcm0vcGFydGljaXBhbnRzRm9ybS5odG1sXCIsXCI8ZGl2IGNsYXNzPVxcXCJzZWN0aW9uLWRldGFpbHNcXFwiPlxcbiAgICA8ZGl2IGNsYXNzPVxcXCJzZWN0aW9uLXRpdGxlXFxcIj5JbnZpdGUgUGFydGljaXBhbnRzPC9kaXY+XFxuPC9kaXY+XFxuPGRpdiBjbGFzcz1cXFwic2VjdGlvbi1tYWluXFxcIj5cXG4gICAgPGRpdiBjbGFzcz1cXFwiZm9ybS1yb3dcXFwiPlxcbiAgICAgICAgPGRpdiBjbGFzcz1cXFwiZm9ybS1ncm91cCBvcHRpb25hbFxcXCI+XFxuICAgICAgICAgICAgPGxhYmVsIGZvcj1cXFwiZW1haWxzXFxcIj5QYXJ0aWNpcGFudFxcJ3MgRW1haWxzPC9sYWJlbD5cXG4gICAgICAgICAgICA8dGV4dGFyZWEgaWQ9XFxcImVtYWlsc1xcXCIgbmctbGlzdCBuZy1tb2RlbD1cXFwiZXZlbnQuZW1haWxzXFxcIiBwbGFjZWhvbGRlcj1cXFwiRW50ZXIgRW1haWxzLi4uXFxcIiBjbGFzcz1cXFwiZm9ybS1jb250cm9sIGV4dGVuZFxcXCI+PC90ZXh0YXJlYT5cXG4gICAgICAgIDwvZGl2PlxcbiAgICA8L2Rpdj5cXG48L2Rpdj5cXG48L3NlY3Rpb24+XFxuXCIpO1xuJHRlbXBsYXRlQ2FjaGUucHV0KFwidGVtcGxhdGVzL2RpcmVjdGl2ZXMvZXZlbnRGb3JtL3VzZXJGb3JtLmh0bWxcIixcIjxkaXYgY2xhc3M9XFxcInNlY3Rpb24tZGV0YWlsc1xcXCI+XFxuICAgIDxkaXYgY2xhc3M9XFxcInNlY3Rpb24tdGl0bGVcXFwiPllvdXIgRGV0YWlsczwvZGl2PlxcbjwvZGl2PlxcbjxkaXYgY2xhc3M9XFxcInNlY3Rpb24tbWFpblxcXCI+XFxuICAgIDxkaXYgY2xhc3M9XFxcImZvcm0tcm93XFxcIj5cXG4gICAgICAgIDxkaXYgY2xhc3M9XFxcImZvcm0tY29sXFxcIj5cXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJmb3JtLWdyb3VwXFxcIj5cXG4gICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cXFwibmFtZVxcXCI+TmFtZTwvbGFiZWw+XFxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVxcXCJmb3JtLWVycm9yXFxcIiBuZy1zaG93PVxcXCIoZm9ybS5uYW1lLiR0b3VjaGVkIHx8IGZvcm0uJHN1Ym1pdHRlZCkgJiYgZXJyb3JzLm5hbWVcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgPGltZyBzcmM9XFxcIi9pbWFnZXMvZXJyb3IucG5nXFxcIiB3aWR0aD1cXFwiMTRcXFwiIC8+IHt7ZXJyb3JzLm5hbWV9fVxcbiAgICAgICAgICAgICAgICA8L3NwYW4+XFxuICAgICAgICAgICAgICAgIDxpbnB1dCBpZD1cXFwibmFtZVxcXCIgbmFtZT1cXFwibmFtZVxcXCIgbmctbWF4bGVuZ3RoPVxcXCIzMFxcXCIgcmVxdWlyZWQgbmctbW9kZWw9XFxcImV2ZW50LmNyZWF0b3IubmFtZVxcXCIgdHlwZT1cXFwidGV4dFxcXCIgcGxhY2Vob2xkZXI9XFxcIkpvaG4gRG9lLi4uXFxcIiBjbGFzcz1cXFwiZm9ybS1jb250cm9sIGV4dGVuZFxcXCIvPlxcbiAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgPC9kaXY+XFxuICAgICAgICA8ZGl2IGNsYXNzPVxcXCJmb3JtLWNvbFxcXCI+XFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwiZm9ybS1ncm91cFxcXCI+XFxuICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XFxcImVtYWlsXFxcIj5FbWFpbDwvbGFiZWw+XFxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVxcXCJmb3JtLWVycm9yXFxcIiBuZy1zaG93PVxcXCIoZm9ybS5lbWFpbC4kdG91Y2hlZCB8fCBmb3JtLiRzdWJtaXR0ZWQpICYmIGVycm9ycy5lbWFpbFxcXCI+XFxuICAgICAgICAgICAgICAgICAgICA8aW1nIHNyYz1cXFwiL2ltYWdlcy9lcnJvci5wbmdcXFwiIHdpZHRoPVxcXCIxNFxcXCIgLz4ge3tlcnJvcnMuZW1haWx9fVxcbiAgICAgICAgICAgICAgICA8L3NwYW4+XFxuICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVxcXCJlbWFpbFxcXCIgaWQ9XFxcImVtYWlsXFxcIiBuYW1lPVxcXCJlbWFpbFxcXCIgbmctcGF0dGVybj1cXFwiZW1haWxSZWdleFxcXCIgcmVxdWlyZWQgbmctbW9kZWw9XFxcImV2ZW50LmNyZWF0b3IuZW1haWxcXFwiIHBsYWNlaG9sZGVyPVxcXCJqb2huLmRvZUBlbWFpbC5jb20uLi5cXFwiIGNsYXNzPVxcXCJmb3JtLWNvbnRyb2wgZXh0ZW5kXFxcIi8+XFxuICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICA8L2Rpdj5cXG4gICAgPC9kaXY+XFxuPC9kaXY+XFxuXCIpO31dKTsiLCJhbmd1bGFyLm1vZHVsZSgncmFsbGx5Jylcbi5jb250cm9sbGVyKCdBYm91dEN0cmwnLCBmdW5jdGlvbihUaXRsZSl7XG4gICAgVGl0bGUuc2V0KCdBYm91dCBSYWxsbHknKVxufSk7XG4iLCJhbmd1bGFyLm1vZHVsZSgncmFsbGx5Jylcbi5jb250cm9sbGVyKCdFZGl0RXZlbnRDdHJsJywgZnVuY3Rpb24oJHNjb3BlLCAkaHR0cCwgJHN0YXRlLCAkdGltZW91dCwgRXZlbnQsIENvbmZpcm1Nb2RhbCwgVGl0bGUpe1xuICAgIHZhciBpZCA9ICRzdGF0ZS5wYXJhbXMuaWRcbiAgICAkc2NvcGUuZXZlbnQgPSBFdmVudC5nZXQoe2lkOmlkfSwgZnVuY3Rpb24oZGF0YSl7XG4gICAgICAgIFRpdGxlLnNldChcIkVkaXQ6IFwiICsgJHNjb3BlLmV2ZW50LnRpdGxlKTtcbiAgICAgICAgJHNjb3BlLm1hc3RlciA9IGFuZ3VsYXIuY29weSgkc2NvcGUuZXZlbnQpO1xuICAgIH0sIGZ1bmN0aW9uKGUpe1xuICAgICAgICAkc3RhdGUuZ28oJ25vdGZvdW5kJyk7XG4gICAgfSk7XG4gICAgJHNjb3BlLnVuZG9DaGFuZ2VzID0gZnVuY3Rpb24oKXtcbiAgICAgICAgJHNjb3BlLmV2ZW50ID0gYW5ndWxhci5jb3B5KCRzY29wZS5tYXN0ZXIpO1xuICAgICAgICByZXNldERhdGVzKCk7XG4gICAgfVxuICAgICRzY29wZS5kaWRDaGFuZ2UgPSBmdW5jdGlvbigpe1xuICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoJHNjb3BlLm1hc3RlcikgIT0gSlNPTi5zdHJpbmdpZnkoJHNjb3BlLmV2ZW50KTtcbiAgICB9XG4gICAgJHNjb3BlLmRpZENoYW5nZURhdGVzID0gZnVuY3Rpb24oKXtcbiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KCRzY29wZS5tYXN0ZXIuZGF0ZXMpICE9IEpTT04uc3RyaW5naWZ5KCRzY29wZS5ldmVudC5kYXRlcyk7XG4gICAgfVxuICAgICRzY29wZS5zdWJtaXQgPSBmdW5jdGlvbigpe1xuICAgICAgICBpZiAoJHNjb3BlLmZvcm0uJHZhbGlkKXtcbiAgICAgICAgICAgIGlmICgkc2NvcGUuZGlkQ2hhbmdlRGF0ZXMoKSApe1xuICAgICAgICAgICAgICAgIHZhciBtb2RhbCA9IG5ldyBDb25maXJtTW9kYWwoe1xuICAgICAgICAgICAgICAgICAgICB0aXRsZSA6ICdIb2xkIHVwIScsXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgOiAnQ2hhbmdpbmcgdGhlIGRhdGVzIHdpbGwgcmVzZXQgYWxsIGVudHJpZXMgYnkgdGhlIHBhcnRpY2lwYW50cy4gQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRvIHRoYXQ/JyxcbiAgICAgICAgICAgICAgICAgICAgY29uZmlybVRleHQgOiAnWWVzLCBJXFwnbSBzdXJlJyxcbiAgICAgICAgICAgICAgICAgICAgaXNEZXN0cnVjdGl2ZSA6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIGNvbmZpcm0gOiBmdW5jdGlvbigpe1xuICAgICAgICAgICAgICAgICAgICAgICAgJHNjb3BlLmV2ZW50LnBhcnRpY2lwYW50cyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB1cGRhdGUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZhciBtb2RhbCA9IG5ldyBDb25maXJtTW9kYWwoe1xuICAgICAgICAgICAgICAgIHRpdGxlIDogJ05vdCBzbyBmYXN0IScsXG4gICAgICAgICAgICAgICAgbWVzc2FnZSA6ICdNYWtlIHN1cmUgeW91IGZpbGwgaW4gYWxsIHRoZSByZXF1aXJlZCBmaWVsZHMgYW5kIHRyeSBhZ2Fpbi4nLFxuICAgICAgICAgICAgICAgIGNhbmNlbFRleHQgOiAnT0snXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB2YXIgdXBkYXRlID0gZnVuY3Rpb24oKXtcbiAgICAgICAgRXZlbnQudXBkYXRlKHtcbiAgICAgICAgICAgIGlkIDogaWRcbiAgICAgICAgfSwgJHNjb3BlLmV2ZW50LFxuICAgICAgICBmdW5jdGlvbigpe1xuICAgICAgICAgICAgdmFyIG1vZGFsID0gbmV3IENvbmZpcm1Nb2RhbCh7XG4gICAgICAgICAgICAgICAgdGl0bGUgOiAnRXZlbnQgVXBkYXRlZCcsXG4gICAgICAgICAgICAgICAgbWVzc2FnZSA6ICdZb3VyIGNoYW5nZXMgaGF2ZSBiZWVuIHNhdmVkIHN1Y2Nlc3NmdWxseSEnLFxuICAgICAgICAgICAgICAgIGNvbmZpcm1UZXh0IDogJ0JhY2sgdG8gRXZlbnQgUGFnZScsXG4gICAgICAgICAgICAgICAgY2FuY2VsVGV4dCA6ICdTdGF5IGhlcmUnLFxuICAgICAgICAgICAgICAgIGNvbmZpcm0gOiBmdW5jdGlvbigpe1xuICAgICAgICAgICAgICAgICAgICAkc3RhdGUuZ28oJ2V2ZW50Jyx7aWQgOiAkc2NvcGUuZXZlbnQuX2lkfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAkc2NvcGUubWFzdGVyID0gYW5ndWxhci5jb3B5KCRzY29wZS5ldmVudCk7XG4gICAgICAgICAgICAkc2NvcGUuZGlkU2F2ZSA9ICR0aW1lb3V0KGZ1bmN0aW9uKCl7XG4gICAgICAgICAgICAgICAgJHNjb3BlLmRpZFNhdmUgPSBmYWxzZTtcbiAgICAgICAgICAgIH0sIDIwMDApO1xuICAgICAgICB9KTtcbiAgICB9XG59KTtcbiIsImFuZ3VsYXIubW9kdWxlKCdyYWxsbHknKVxuLmNvbnRyb2xsZXIoJ0V2ZW50Q3RybCcsIGZ1bmN0aW9uKCRzY29wZSwgJGh0dHAsICRzdGF0ZSwgVGl0bGUsIEV2ZW50KXtcbiAgICB2YXIgaWQgPSAkc3RhdGUucGFyYW1zLmlkO1xuICAgICRzY29wZS5wYXJ0aWNpcGFudCA9IHt9O1xuICAgICRzY29wZS5ldmVudCA9IEV2ZW50LmdldCh7aWQ6aWR9LCBmdW5jdGlvbihkYXRhKXtcbiAgICAgICAgVGl0bGUuc2V0KCRzY29wZS5ldmVudC50aXRsZSk7XG4gICAgICAgICRzY29wZS5ldmVudFVybCA9ICRzdGF0ZS5ocmVmKCdldmVudCcsIHtcbiAgICAgICAgICAgIGlkOiAkc2NvcGUuZXZlbnQuX2lkXG4gICAgICAgIH0sIHtcbiAgICAgICAgICAgIGFic29sdXRlIDogdHJ1ZVxuICAgICAgICB9KTtcbiAgICB9LCBmdW5jdGlvbihlKXtcbiAgICAgICAgJHN0YXRlLmdvKCdub3Rmb3VuZCcpO1xuICAgIH0pO1xuXG4gICAgJHNjb3BlLmVkaXRFdmVudCA9IGZ1bmN0aW9uKCl7XG4gICAgICAgICRzdGF0ZS5nbygnZWRpdGV2ZW50JywgeyBpZCA6ICRzY29wZS5ldmVudC5faWQgfSk7XG4gICAgfVxuXG59KVxuLmRpcmVjdGl2ZSgncG9sbCcsIGZ1bmN0aW9uKEV2ZW50LCBQYXJ0aWNpcGFudCwgQ29uZmlybU1vZGFsKXtcbiAgICByZXR1cm4ge1xuICAgICAgICByZXN0cmljdCA6ICdBJyxcbiAgICAgICAgdGVtcGxhdGVVcmwgOiAndGVtcGxhdGVzL2RpcmVjdGl2ZXMvcG9sbC5odG1sJyxcbiAgICAgICAgc2NvcGUgOiB7XG4gICAgICAgICAgICAnZXZlbnQnIDogJz0nLFxuICAgICAgICAgICAgJ3BhcnRpY2lwYW50JyA6ICc9J1xuICAgICAgICB9LFxuICAgICAgICBsaW5rIDogZnVuY3Rpb24oc2NvcGUsIGVsLCBhdHRycyl7XG4gICAgICAgICAgICBzY29wZS5kZWZhdWx0cyA9IFtdO1xuICAgICAgICAgICAgdmFyIGRhdGVzQ291bnQgPSBbXTtcbiAgICAgICAgICAgIHNjb3BlLmRlbGV0ZSA9IGZ1bmN0aW9uKHBhcnRpY2lwYW50KXtcbiAgICAgICAgICAgICAgICB2YXIgbW9kYWwgPSBuZXcgQ29uZmlybU1vZGFsKHtcbiAgICAgICAgICAgICAgICAgICAgdGl0bGUgOiAnRGVsZXRlICcgKyBwYXJ0aWNpcGFudC5uYW1lICsgJz8nLFxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlIDogJ0FyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byByZW1vdmUgJytwYXJ0aWNpcGFudC5uYW1lKycgZnJvbSB0aGUgcG9sbD8nLFxuICAgICAgICAgICAgICAgICAgICBjb25maXJtVGV4dCA6ICdZZXMgLSBkZWxldGUnLFxuICAgICAgICAgICAgICAgICAgICBjYW5jZWxUZXh0IDogJ05vIC0gbmV2ZXJtaW5kJyxcbiAgICAgICAgICAgICAgICAgICAgaXNEZXN0cnVjdGl2ZSA6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIGNvbmZpcm0gOiBmdW5jdGlvbigpe1xuICAgICAgICAgICAgICAgICAgICAgICAgUGFydGljaXBhbnQucmVtb3ZlKHsgaWQgOiBzY29wZS5ldmVudC5faWQgLCBwaWQgOiBwYXJ0aWNpcGFudC5faWQgfSwgZnVuY3Rpb24oZXZlbnQpe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjb3BlLmV2ZW50ID0gZXZlbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIG1vZGFsLnNob3coKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNjb3BlLmlzVG9wRGF0ZSA9IGZ1bmN0aW9uKGluZGV4KXtcbiAgICAgICAgICAgICAgICB2YXIgY291bnQgPSBkYXRlc0NvdW50W2luZGV4XTtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRhdGVzQ291bnQubGVuZ3RoOyBpKyspe1xuICAgICAgICAgICAgICAgICAgICBpZiAoZGF0ZXNDb3VudFtpXSA+IGNvdW50KSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc2NvcGUuc2VsZWN0ZWREYXRlID0gZnVuY3Rpb24oaW5kZXgpe1xuICAgICAgICAgICAgICAgIGRhdGVzQ291bnRbaW5kZXhdID0gMDtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNjb3BlLmV2ZW50LnBhcnRpY2lwYW50cy5sZW5ndGg7IGkrKyl7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzY29wZS5ldmVudC5wYXJ0aWNpcGFudHNbaV0uZGF0ZXNbaW5kZXhdKSBkYXRlc0NvdW50W2luZGV4XSsrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gZGF0ZXNDb3VudFtpbmRleF07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzY29wZS51cGRhdGUgPSBmdW5jdGlvbihwYXJ0aWNpcGFudCl7XG4gICAgICAgICAgICAgICAgUGFydGljaXBhbnQudXBkYXRlKHtcbiAgICAgICAgICAgICAgICAgICAgaWQgOiBzY29wZS5ldmVudC5faWQsXG4gICAgICAgICAgICAgICAgICAgIHBpZCA6IHBhcnRpY2lwYW50Ll9pZFxuICAgICAgICAgICAgICAgIH0sIHBhcnRpY2lwYW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNjb3BlLmVkaXQgPSBmdW5jdGlvbihwYXJ0aWNpcGFudCl7XG4gICAgICAgICAgICAgICAgc2NvcGUuZGVmYXVsdHNbc2NvcGUuZXZlbnQucGFydGljaXBhbnRzLmluZGV4T2YocGFydGljaXBhbnQpXSA9IGFuZ3VsYXIuY29weShwYXJ0aWNpcGFudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzY29wZS5jYW5jZWwgPSBmdW5jdGlvbihpbmRleCl7XG4gICAgICAgICAgICAgICAgc2NvcGUuZXZlbnQucGFydGljaXBhbnRzW2luZGV4XSA9IHNjb3BlLmRlZmF1bHRzW2luZGV4XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNjb3BlLnNhdmUgPSBmdW5jdGlvbihwYXJ0aWNpcGFudCl7XG4gICAgICAgICAgICAgICAgaWYgKHNjb3BlLmZvcm1uZXcuJHZhbGlkKXtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHBhcnRpY2lwYW50ID0gbmV3IFBhcnRpY2lwYW50KHBhcnRpY2lwYW50KTtcbiAgICAgICAgICAgICAgICAgICAgcGFydGljaXBhbnQuJHNhdmUoe2lkOnNjb3BlLmV2ZW50Ll9pZH0sIGZ1bmN0aW9uKGV2ZW50KXtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNjb3BlLmV2ZW50ID0gZXZlbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBzY29wZS5wYXJ0aWNpcGFudCA9IHt9O1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgc2NvcGUuZm9ybW5ldy4kc2V0UHJpc3RpbmUoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59KTtcbiIsImFuZ3VsYXIubW9kdWxlKCdyYWxsbHknKVxuLmNvbnRyb2xsZXIoJ0hvbWVDdHJsJywgZnVuY3Rpb24oJHNjb3BlLCAkc3RhdGUsIFRpdGxlKXtcbiAgICBUaXRsZS5zZXQoJ1JhbGxseSAtIENvbGxhYm9yYXRpdmUgU2NoZWR1bGluZycpXG5cbiAgICAkc2NvcGUubmV3RXZlbnQgPSBmdW5jdGlvbigpe1xuICAgICAgICAkc3RhdGUuZ28oJ25ld2V2ZW50Jyk7XG4gICAgfVxufSk7XG4iLCJhbmd1bGFyLm1vZHVsZSgncmFsbGx5Jylcbi5jb250cm9sbGVyKCdOYXZpZ2F0aW9uQ3RybCcsIGZ1bmN0aW9uKCRzY29wZSwgJGxvY2F0aW9uKXtcbiAgICAkc2NvcGUuaXNBY3RpdmUgPSBmdW5jdGlvbihwYXRoKSB7XG4gICAgICAgIGlmICgkbG9jYXRpb24ucGF0aCgpID09IHBhdGgpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgIH1cbiAgICB9XG59KVxuIiwiYW5ndWxhci5tb2R1bGUoJ3JhbGxseScpXG4uY29udHJvbGxlcignTmV3RXZlbnRDdHJsJywgZnVuY3Rpb24oJHNjb3BlLCAkaHR0cCwgJHN0YXRlLCBFdmVudCwgQ29uZmlybU1vZGFsKXtcblxuICAgICRzY29wZS50aXRsZSA9IFwiU2NoZWR1bGUgYSBOZXcgRXZlbnRcIjtcbiAgICAkc2NvcGUuZGVzY3JpcHRpb24gPSBcIkZpbGwgaW4gdGhlIGZvcm0gYmVsb3cgdG8gY3JlYXRlIHlvdXIgZXZlbnQgYW5kIHNoYXJlIGl0IHdpdGggeW91ciBmcmllbmRzIGFuZCBjb2xsZWFndWVzLlwiO1xuXG4gICAgdmFyIHNob3dNb2RhbCA9IGZ1bmN0aW9uKHRpdGxlLCBtZXNzYWdlKXtcbiAgICAgICAgdmFyIG1vZGFsID0gbmV3IENvbmZpcm1Nb2RhbCh7XG4gICAgICAgICAgICB0aXRsZSA6IHRpdGxlIHx8ICdOb3Qgc28gZmFzdCEnLFxuICAgICAgICAgICAgbWVzc2FnZSA6IG1lc3NhZ2UgfHwgJ01ha2Ugc3VyZSB5b3UgZmlsbCBpbiBhbGwgdGhlIHJlcXVpcmVkIGZpZWxkcyBhbmQgdHJ5IGFnYWluLicsXG4gICAgICAgICAgICBjYW5jZWxUZXh0IDogJ09LJ1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAkc2NvcGUuc3VibWl0ID0gZnVuY3Rpb24oKXtcbiAgICAgICAgaWYgKCRzY29wZS5mb3JtLiR2YWxpZCl7XG4gICAgICAgICAgICAkaHR0cC5wb3N0KCcvYXBpL2V2ZW50JywgJHNjb3BlLmV2ZW50KVxuICAgICAgICAgICAgLnN1Y2Nlc3MoZnVuY3Rpb24oZXZlbnQsIHN0YXR1cywgaGVhZGVycywgY29uZmlnKXtcbiAgICAgICAgICAgICAgICAkc2NvcGUuZXZlbnQgPSBldmVudDtcbiAgICAgICAgICAgICAgICAkc2NvcGUuZXZlbnRVcmwgPSAkc3RhdGUuaHJlZignZXZlbnQnLCB7XG4gICAgICAgICAgICAgICAgICAgIGlkOiAkc2NvcGUuZXZlbnQuX2lkXG4gICAgICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgICAgICBhYnNvbHV0ZSA6IHRydWVcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuZXJyb3IoZnVuY3Rpb24oKXtcbiAgICAgICAgICAgICAgICBzaG93TW9kYWwoJ1VoIG9oIScsICdUaGVyZSB3YXMgYW4gZXJyb3IgY3JlYXRpbmcgeW91ciBldmVudC4gUGxlYXNlIHRyeSBhZ2FpbiBsYXRlci4nKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc2hvd01vZGFsKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAkc2NvcGUuY2xlYXJEYXRlcyA9IG51bGxcbn0pO1xuIiwiYW5ndWxhci5tb2R1bGUoJ3JhbGxseScpXG4uZGlyZWN0aXZlKCdiYWNrSW1nJywgZnVuY3Rpb24oKXtcbiAgICByZXR1cm4gZnVuY3Rpb24oc2NvcGUsIGVsZW1lbnQsIGF0dHJzKXtcbiAgICAgICAgdmFyIHVybCA9IGF0dHJzLmJhY2tJbWc7XG4gICAgICAgIGVsZW1lbnQuY3NzKHtcbiAgICAgICAgICAgICdiYWNrZ3JvdW5kLWltYWdlJzogJ3VybCgvaW1hZ2VzLycgKyB1cmwgKycucG5nKSdcbiAgICAgICAgfSk7XG4gICAgfTtcbn0pXG4iLCJhbmd1bGFyLm1vZHVsZSgncmFsbGx5Jylcbi5kaXJlY3RpdmUoJ2RhdGVwaWNrZXInLCBmdW5jdGlvbigpe1xuICAgIHJldHVybiB7XG4gICAgICAgIHJlc3RyaWN0IDogJ0EnLFxuICAgICAgICByZXF1aXJlIDogJ25nTW9kZWwnLFxuICAgICAgICBzY29wZSA6IHtcbiAgICAgICAgICAgIG1vZGVsIDogJz1uZ01vZGVsJyxcbiAgICAgICAgICAgIGNvbnRyb2wgOiAnPSdcbiAgICAgICAgfSxcbiAgICAgICAgbGluayA6IGZ1bmN0aW9uKHNjb3BlLCBlbCwgYXR0cnMsIG5nTW9kZWwpe1xuICAgICAgICAgICAgc2NvcGUubW9kZWwgPSBzY29wZS5tb2RlbCB8fCBbXTtcbiAgICAgICAgICAgIGFuZ3VsYXIuZWxlbWVudChlbCkuZGF0ZXBpY2tlcih7XG4gICAgICAgICAgICAgICAgbXVsdGlkYXRlIDogdHJ1ZSxcbiAgICAgICAgICAgICAgICB0b2RheUhpZ2hsaWdodDogdHJ1ZVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5vbignY2hhbmdlRGF0ZScsIGZ1bmN0aW9uKGUpe1xuICAgICAgICAgICAgICAgIHZhciBkYXRlcyA9IGUuZGF0ZXM7XG4gICAgICAgICAgICAgICAgZGF0ZXMuc29ydChmdW5jdGlvbihhLCBiKXtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGEuZ2V0VGltZSgpID4gYi5nZXRUaW1lKCkpIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgbmdNb2RlbC4kc2V0Vmlld1ZhbHVlKGRhdGVzLCBlKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICB2YXIgdXBkYXRlID0gZnVuY3Rpb24obW9kZWxWYWx1ZSwgb2xkVmFsdWUpe1xuICAgICAgICAgICAgICAgIGlmICghbW9kZWxWYWx1ZSB8fCAhb2xkVmFsdWUgfHwgKG1vZGVsVmFsdWUubGVuZ3RoID09IG9sZFZhbHVlLmxlbmd0aCkpIHJldHVybjtcbiAgICAgICAgICAgICAgICB2YXIgZGF0ZXMgPSBbXTtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1vZGVsVmFsdWUubGVuZ3RoOyBpKyspe1xuICAgICAgICAgICAgICAgICAgICBkYXRlcy5wdXNoKG5ldyBEYXRlKG1vZGVsVmFsdWVbaV0pKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYW5ndWxhci5lbGVtZW50KGVsKS5kYXRlcGlja2VyKCdzZXREYXRlcycsIGRhdGVzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNjb3BlLiR3YXRjaENvbGxlY3Rpb24oJ21vZGVsJywgdXBkYXRlKTtcblxuICAgICAgICAgICAgc2NvcGUuY29udHJvbCA9IHNjb3BlLmNvbnRyb2wgfHwge307XG4gICAgICAgICAgICBzY29wZS5jb250cm9sLnVuc2V0RGF0ZSA9IGZ1bmN0aW9uKGRhdGUpe1xuICAgICAgICAgICAgICAgIHZhciBpbmRleCA9IHNjb3BlLm1vZGVsLmluZGV4T2YoZGF0ZSk7XG4gICAgICAgICAgICAgICAgc2NvcGUubW9kZWwuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbmdNb2RlbC4kdmFsaWRhdG9ycy5yZXF1aXJlZCA9IGZ1bmN0aW9uKG1vZGVsVmFsdWUsIHZpZXdWYWx1ZSl7XG4gICAgICAgICAgICAgICAgaWYgKCFtb2RlbFZhbHVlIHx8IG1vZGVsVmFsdWUubGVuZ3RoID09IDApe1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgIH1cbiAgICB9XG59KTtcbiIsImFuZ3VsYXIubW9kdWxlKCdyYWxsbHknKVxuLnNlcnZpY2UoJ0Zvcm1IZWxwZXInLCBmdW5jdGlvbigpe1xuICAgIHRoaXMucHJldHR5RXJyb3IgPSBmdW5jdGlvbihlcnJvcnMsIGZpZWxkKXtcbiAgICAgICAgaWYgKGVycm9ycy5yZXF1aXJlZCkgcmV0dXJuIGZpZWxkICsgXCIgaXMgcmVxdWlyZWRcIjtcbiAgICAgICAgaWYgKGVycm9ycy5wYXR0ZXJuKSByZXR1cm4gZmllbGQgKyBcIiBpcyBpbnZhbGlkXCIgO1xuICAgICAgICBpZiAoZXJyb3JzLm1heGxlbmd0aCkgcmV0dXJuIGZpZWxkICsgXCIgaXMgdG9vIGxvbmdcIjtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn0pXG4uZGlyZWN0aXZlKCd1c2VyRm9ybScsIGZ1bmN0aW9uKEZvcm1IZWxwZXIpe1xuICAgIHJldHVybiB7XG4gICAgICAgIHNjb3BlIDoge1xuICAgICAgICAgICAgZXZlbnQgOiAnPScsXG4gICAgICAgICAgICBmb3JtIDogJz0nXG4gICAgICAgIH0sXG4gICAgICAgIHRlbXBsYXRlVXJsIDogJ3RlbXBsYXRlcy9kaXJlY3RpdmVzL2V2ZW50Rm9ybS91c2VyRm9ybS5odG1sJyxcbiAgICAgICAgbGluayA6IGZ1bmN0aW9uKHNjb3BlLCBlbCwgYXR0cnMpIHtcbiAgICAgICAgICAgIHNjb3BlLmVycm9ycyA9IHt9O1xuXG4gICAgICAgICAgICBzY29wZS5lbWFpbFJlZ2V4ID0gL14oW1xcdy1cXC5dK0AoW1xcdy1dK1xcLikrW1xcdy1dezIsNH0pPyQvO1xuXG4gICAgICAgICAgICBzY29wZS4kd2F0Y2hDb2xsZWN0aW9uKCdmb3JtLm5hbWUuJGVycm9yJyxmdW5jdGlvbihlcnJvcnMpe1xuICAgICAgICAgICAgICAgIHNjb3BlLmVycm9ycy5uYW1lID0gRm9ybUhlbHBlci5wcmV0dHlFcnJvcihlcnJvcnMsIFwiTmFtZVwiKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBzY29wZS4kd2F0Y2hDb2xsZWN0aW9uKCdmb3JtLmVtYWlsLiRlcnJvcicsZnVuY3Rpb24oZXJyb3JzKXtcbiAgICAgICAgICAgICAgICBzY29wZS5lcnJvcnMuZW1haWwgPSBGb3JtSGVscGVyLnByZXR0eUVycm9yKGVycm9ycywgXCJFbWFpbFwiKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxufSlcbi5kaXJlY3RpdmUoJ2V2ZW50Rm9ybScsIGZ1bmN0aW9uKEZvcm1IZWxwZXIpe1xuICAgIHJldHVybiB7XG4gICAgICAgIHNjb3BlIDoge1xuICAgICAgICAgICAgZXZlbnQgOiAnPScsXG4gICAgICAgICAgICBmb3JtIDogJz0nXG4gICAgICAgIH0sXG4gICAgICAgIHRlbXBsYXRlVXJsIDogJ3RlbXBsYXRlcy9kaXJlY3RpdmVzL2V2ZW50Rm9ybS9ldmVudEZvcm0uaHRtbCcsXG4gICAgICAgIGxpbmsgOiBmdW5jdGlvbihzY29wZSwgZWwsIGF0dHJzKSB7XG4gICAgICAgICAgICBzY29wZS5lcnJvcnMgPSB7fTtcblxuICAgICAgICAgICAgc2NvcGUuJHdhdGNoQ29sbGVjdGlvbignZm9ybS50aXRsZS4kZXJyb3InLGZ1bmN0aW9uKGVycm9ycyl7XG4gICAgICAgICAgICAgICAgc2NvcGUuZXJyb3JzLnRpdGxlID0gRm9ybUhlbHBlci5wcmV0dHlFcnJvcihlcnJvcnMsIFwiVGl0bGVcIik7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgc2NvcGUuJHdhdGNoQ29sbGVjdGlvbignZm9ybS5sb2NhdGlvbi4kZXJyb3InLGZ1bmN0aW9uKGVycm9ycyl7XG4gICAgICAgICAgICAgICAgc2NvcGUuZXJyb3JzLmxvY2F0aW9uID0gRm9ybUhlbHBlci5wcmV0dHlFcnJvcihlcnJvcnMsIFwiTG9jYXRpb25cIik7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICB9XG4gICAgfVxufSlcbi5kaXJlY3RpdmUoJ2RhdGVGb3JtJywgZnVuY3Rpb24oKXtcbiAgICByZXR1cm4ge1xuICAgICAgICBzY29wZSA6IHtcbiAgICAgICAgICAgIGV2ZW50IDogJz0nLFxuICAgICAgICAgICAgZm9ybSA6ICc9J1xuICAgICAgICB9LFxuICAgICAgICB0ZW1wbGF0ZVVybCA6ICd0ZW1wbGF0ZXMvZGlyZWN0aXZlcy9ldmVudEZvcm0vZGF0ZUZvcm0uaHRtbCdcbiAgICB9XG59KVxuLmRpcmVjdGl2ZSgncGFydGljaXBhbnRzRm9ybScsIGZ1bmN0aW9uKCl7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgc2NvcGUgOiB7XG4gICAgICAgICAgICBldmVudCA6ICc9JyxcbiAgICAgICAgICAgIGZvcm0gOiAnPSdcbiAgICAgICAgfSxcbiAgICAgICAgdGVtcGxhdGVVcmwgOiAndGVtcGxhdGVzL2RpcmVjdGl2ZXMvZXZlbnRGb3JtL3BhcnRpY2lwYW50c0Zvcm0uaHRtbCdcbiAgICB9XG59KTtcbiIsImFuZ3VsYXIubW9kdWxlKCdyYWxsbHknKVxuLmZpbHRlcignZWxhcHNlZCcsIGZ1bmN0aW9uKCRmaWx0ZXIpe1xuICAgIHJldHVybiBmdW5jdGlvbihkYXRlKXtcbiAgICAgICAgaWYgKCFkYXRlKSByZXR1cm47XG4gICAgICAgIHZhciB0aW1lID0gRGF0ZS5wYXJzZShkYXRlKSxcbiAgICAgICAgICAgIHRpbWVOb3cgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKSxcbiAgICAgICAgICAgIGRpZmZlcmVuY2UgPSB0aW1lTm93IC0gdGltZSxcbiAgICAgICAgICAgIHNlY29uZHMgPSBNYXRoLmZsb29yKGRpZmZlcmVuY2UgLyAxMDAwKSxcbiAgICAgICAgICAgIG1pbnV0ZXMgPSBNYXRoLmZsb29yKHNlY29uZHMgLyA2MCksXG4gICAgICAgICAgICBob3VycyA9IE1hdGguZmxvb3IobWludXRlcyAvIDYwKSxcbiAgICAgICAgICAgIGRheXMgPSBNYXRoLmZsb29yKGhvdXJzIC8gMjQpO1xuICAgICAgICBpZiAoZGF5cyA+IDMwKSB7XG4gICAgICAgICAgICByZXR1cm4gJ29uICcgKyAkZmlsdGVyKCdkYXRlJykoZGF0ZSwgJ01NTU0gZCcpO1xuICAgICAgICB9IGVsc2UgaWYgKGRheXMgPiAxKSB7XG4gICAgICAgICAgICByZXR1cm4gZGF5cyArIFwiIGRheXMgYWdvXCI7XG4gICAgICAgIH0gZWxzZSBpZiAoZGF5cyA9PSAxKSB7XG4gICAgICAgICAgICByZXR1cm4gXCIxIGRheSBhZ29cIlxuICAgICAgICB9IGVsc2UgaWYgKGhvdXJzID4gMSkge1xuICAgICAgICAgICAgcmV0dXJuIGhvdXJzICsgXCIgaG91cnMgYWdvXCI7XG4gICAgICAgIH0gZWxzZSBpZiAoaG91cnMgPT0gMSkge1xuICAgICAgICAgICAgcmV0dXJuIFwiYW4gaG91ciBhZ29cIjtcbiAgICAgICAgfSBlbHNlIGlmIChtaW51dGVzID4gMSkge1xuICAgICAgICAgICAgcmV0dXJuIG1pbnV0ZXMgKyBcIiBtaW51dGVzIGFnb1wiO1xuICAgICAgICB9IGVsc2UgaWYgKG1pbnV0ZXMgPT0gMSl7XG4gICAgICAgICAgICByZXR1cm4gXCJhIG1pbnV0ZSBhZ29cIjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBcImEgZmV3IHNlY29uZHMgYWdvXCI7XG4gICAgICAgIH1cbiAgICB9XG59KVxuIiwiYW5ndWxhci5tb2R1bGUoJ3JhbGxseScpXG4uZmFjdG9yeSgnQ29uZmlybU1vZGFsJywgZnVuY3Rpb24oYnRmTW9kYWwpe1xuXG4gICAgcmV0dXJuIGZ1bmN0aW9uKGNvbmZpZyl7XG4gICAgICAgIHZhciBtb2RhbDtcbiAgICAgICAgbW9kYWwgPSBidGZNb2RhbCh7XG4gICAgICAgICAgICB0ZW1wbGF0ZVVybCA6ICd0ZW1wbGF0ZXMvY29uZmlybW1vZGFsLmh0bWwnLFxuICAgICAgICAgICAgY29udHJvbGxlckFzIDogJ21vZGFsJyxcbiAgICAgICAgICAgIGNvbnRyb2xsZXIgOiBmdW5jdGlvbigpe1xuICAgICAgICAgICAgICAgIHRoaXMudGl0bGUgPSBjb25maWcudGl0bGVcbiAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2UgPSBjb25maWcubWVzc2FnZTtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbmZpcm0gPSAoY29uZmlnLmNvbmZpcm0pID8gZnVuY3Rpb24oKXtjb25maWcuY29uZmlybSgpOyBtb2RhbC5kZWFjdGl2YXRlKCl9IDogZmFsc2U7XG4gICAgICAgICAgICAgICAgdGhpcy5jYW5jZWwgPSBtb2RhbC5kZWFjdGl2YXRlO1xuICAgICAgICAgICAgICAgIHRoaXMuY29uZmlybVRleHQgPSBjb25maWcuY29uZmlybVRleHQgfHwgJ0NvbmZpcm0nO1xuICAgICAgICAgICAgICAgIHRoaXMuY2FuY2VsVGV4dCA9IGNvbmZpZy5jYW5jZWxUZXh0IHx8ICdDYW5jZWwnO1xuICAgICAgICAgICAgICAgIHRoaXMuaXNEZXN0cnVjdGl2ZSA9IGNvbmZpZy5pc0Rlc3RydWN0aXZlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgbW9kYWwuYWN0aXZhdGUoKTtcbiAgICAgICAgXG4gICAgICAgIHRoaXMuZGVzdHJveSA9IGZ1bmN0aW9uKCl7XG4gICAgICAgICAgICBtb2RhbC5kZWFjdGl2YXRlKCk7XG4gICAgICAgIH1cbiAgICB9XG59KTtcbiJdLCJzb3VyY2VSb290IjoiL3NvdXJjZS8ifQ== \ No newline at end of file +angular.module("rallly",["ui.router","ngResource","ngFx","btford.modal","ngTagsInput","ngAnimate"]).config(["$stateProvider","$urlRouterProvider","$locationProvider",function(e,t,n){n.html5Mode(!0),t.otherwise("/notfound"),e.state("index",{url:"/",templateUrl:"templates/home.html",controller:"HomeCtrl"}).state("newevent",{url:"/new",templateUrl:"templates/newevent.html",controller:"NewEventCtrl"}).state("about",{url:"/about",templateUrl:"templates/about.html",controller:"AboutCtrl"}).state("notfound",{url:"/notfound",templateUrl:"templates/notfound.html"}).state("event",{url:"/:id",templateUrl:"templates/event.html",controller:"EventCtrl"}).state("editevent",{url:"/:id/edit",templateUrl:"templates/editevent.html",controller:"EditEventCtrl"}).state("verifyevent",{url:"/verify/:id/code/:code",controller:"VerificationCtrl"}).state("deleteevent",{url:"/delete/:id/code/:code",controller:"DeletionCtrl"})}]).factory("Event",["$resource",function(e){return e("/api/event/:id",{id:"@_id"},{update:{method:"PUT"},verify:{method:"GET",url:"/api/event/:id/code/:code"},destroy:{method:"DELETE",url:"/api/event/:id/code/:code"}})}]).factory("Participant",["$resource",function(e){return e("/api/event/:id/participant/:pid",{id:"@_id"},{update:{method:"PUT"}})}]).factory("Comment",["$resource",function(e){return e("/api/event/:id/comment/:cid",{id:"@_id"},{update:{method:"PUT"}})}]).factory("Title",function(){return{set:function(e){document.title=e}}}),angular.module("rallly").run(["$templateCache",function(e){e.put("templates/about.html",'
\n

What is Rallly?

\n
Rallly is a collaborative scheduling service that makes deciding on a date fast and easy.
\n

Hi, I\'m Luke!

\n

\n I created Rallly as side project to help me learn some new technologies. I decided to publish it because I thought other people might find it useful. Rallly is a completely free service. In fact it is even open source. You can look at the latest source code on Github.\n

\n
\n'),e.put("templates/confirmmodal.html",'
\n\n
\n
{{modal.title}}
\n
\n {{modal.message}}\n
\n
\n \n \n
\n
\n'),e.put("templates/editevent.html",'
\n
\n\n
Edit Event
\n
\n You can makes changes to your existing event by changing the fields in the form below.\n
\n\n
\n\n
\n\n
\n\n
\n\n
\n
\n\n
\n\n
\n\n
\n\n
\n \n \n Done\n
\n\n
\n\n
\n\n
\n'),e.put("templates/event.html",'
\n
\n
\n
\n \n
\n
\n
\n {{event.title}}\n Poll Closed\n Poll Open\n
\n
\n Created by {{event.creator.name}} • {{event.created | elapsed}}\n
\n
\n
\n \n
\n
\n
{{event.description}}
\n \n\n
\n
\n
\n
\n
\n\n
\n
\n Discussion\n
\n
\n You can discuss the event with your friends by leaving a comment below.\n
\n
\n\n
\n
\n
\n'),e.put("templates/home.html",'
\n
\n \n
\n
\n Schedule an Event\n
\n
\n Want to host an event but can’t decide on a date? Click on the button below to start!\n
\n \n
\n'),e.put("templates/newevent.html",'
\n
\n\n
Schedule a New Event
\n
\n Fill in the form below to create your event and share it with your friends and colleagues.\n
\n\n
\n
\n\n
\n\n
\n\n
\n\n
\n\n
\n\n
\n\n
\n\n
\n \n
\n\n
\n
\n
\n
\n
\n
\n \n
\n
Event Created
\n
\n Your event has been created successfully! You should receive an email shortly with instructions to verify your email address.\n
\n
\n
\n
\n \n GO\n
\n
\n
\n'),e.put("templates/notfound.html","

Error 404

\n

Not Found

\n"),e.put("templates/notification.html",'
\n
\n {{notification.title}}\n
\n
\n {{notification.message}}\n
\n
\n'),e.put("templates/directives/discussion.html",'
    \n
  • \n
    \n \n
    \n
    \n ×\n
    \n {{comment.author.name}}\n {{comment.created | elapsed}}\n
    \n
    {{comment.content}}
    \n
    \n
  • \n
\n
\n
\n \n
\n
\n
\n \n
\n
\n
\n \n \n \n Make sure you fill in all the fields.\n \n
\n
\n
\n
\n'),e.put("templates/directives/poll.html",'
\n
\n {{event.participants.length}} participants\n
\n
\n
\n
\n {{date | date: \'EEE\'}}\n
\n
\n {{date | date: \'d\'}}\n
\n
\n {{date | date : \'MMM\'}}\n
\n {{selectedDate($index)}}\n
\n
\n
\n\n
\n
\n
\n
\n
\n
\n \n \n \n \n {{participant.name}}\n
\n
\n \n \n \n
\n
\n
\n \n \n \n \n
\n
\n
\n
\n
\n
\n \n \n \n \n
\n
\n \n
\n
\n
\n \n
\n
\n
\n
\n'),e.put("templates/directives/eventForm/dateForm.html",'
\n
Choose Dates
\n
    \n
  • \n
    \n
    \n {{date | date: \'EEE\'}}\n
    \n
    \n {{date | date: \'d\'}}\n
    \n
    \n {{date | date : \'MMM\'}}\n
    \n \n
    \n
  • \n
\n
\n
\n
\n
\n \n \n You need to select a few dates\n \n
\n\n
\n
\n
\n
\n'),e.put("templates/directives/eventForm/eventForm.html",'
\n
Event Details
\n
\n
\n
\n
\n
\n \n \n {{errors.title}}\n \n \n
\n
\n
\n
\n \n \n {{errors.location}}\n \n \n
\n
\n
\n
\n
\n \n \n
\n
\n
\n'),e.put("templates/directives/eventForm/participantsForm.html",'
\n
Invite Participants
\n
\n
\n
\n
\n \n \n
\n
\n
\n\n'),e.put("templates/directives/eventForm/settingsForm.html",'
\n
Settings
\n
\n
\n
\n
\n
\n Poll Status\n
\n
\n Let people vote on the poll.\n
\n
\n
\n
\n {{event.isClosed ? \'Closed\' : \'Open\' }}\n
\n
\n
\n
\n
\n
\n
\n
\n Notifications\n
\n
\n Send email notifications to the creator of this event.\n
\n
\n
\n
\n {{event.creator.allowNotifications ? \'Enabled\' : \'Disabled\' }}\n
\n
\n
\n
\n
\n
\n
\n
\n Delete Event\n
\n
\n Once you delete an event it will no longer be accessible.\n
\n
\n
\n \n
\n
\n
\n\n'),e.put("templates/directives/eventForm/userForm.html",'
\n
Your Details
\n
\n
\n
\n
\n
\n \n \n {{errors.name}}\n \n \n
\n
\n
\n
\n \n \n {{errors.email}}\n \n \n
\n
\n
\n
\n')}]),angular.module("rallly").controller("AboutCtrl",["Title",function(e){e.set("About Rallly")}]),angular.module("rallly").controller("AccountCtrl",["$scope","ConfirmModal",function(e){e.showNotice=function(){}}]),angular.module("rallly").controller("DeletionCtrl",["$state","Notification","Event",function(e,t,n){n.destroy({id:e.params.id,code:e.params.code},function(){new t({title:"Event deleted",message:"This event has been deleted",type:"success",timeout:5e3})},function(){new t({title:"Deletion Failed",message:"The event could not be deleted. Make sure that it exists and that the url is correct",type:"error"})}),e.go("event",{id:e.params.id})}]),angular.module("rallly").controller("EditEventCtrl",["$scope","$http","$state","$timeout","Event","ConfirmModal","Notification","Title",function(e,t,n,i,o,a,l,s){var r=n.params.id;e.event=o.get({id:r},function(){s.set("Edit: "+e.event.title),e.master=angular.copy(e.event)},function(){n.go("notfound")}),e.undoChanges=function(){e.event=angular.copy(e.master)},e.didChange=function(){return JSON.stringify(e.master)!=JSON.stringify(e.event)},e.didChangeDates=function(){return JSON.stringify(e.master.dates)!=JSON.stringify(e.event.dates)},e.submit=function(){if(e.form.$valid)if(e.didChangeDates()){new a({title:"Hold up!",message:"Changing the dates will reset all entries by the participants. Are you sure you want to do that?",confirmText:"Yes, I'm sure",isDestructive:!0,confirm:function(){e.event.participants=[],c()}})}else c();else{new l({title:"Not so fast",message:"Make sure you fill in all the required fields and try again.",type:"error"})}};var c=function(){o.update({id:r},e.event,function(){new l({title:"Changes Saved",message:"Your changes have been saved successfully.",type:"success"});e.master=angular.copy(e.event)})}}]),angular.module("rallly").controller("EventCtrl",["$scope","$http","$state","Title","Event","ConfirmModal",function(e,t,n,i,o,a){var l=n.params.id;e.event=o.get({id:l},function(){i.set(e.event.title),e.eventUrl=n.href("event",{id:e.event._id},{absolute:!0})},function(){n.go("notfound")}),e.openEvent=function(){e.event.isClosed=!1,o.update({id:l},e.event,function(){new a({title:"Event Open",message:"People can vote and comment on this event.",cancelText:"OK"})})},e.closeEvent=function(){e.event.isClosed=!0,o.update({id:l},e.event,function(){new a({title:"Event Closed",message:"People can no longer vote or comment on this event.",cancelText:"OK"})})},e.editEvent=function(){n.go("editevent",{id:e.event._id})}}]),angular.module("rallly").controller("HomeCtrl",["$scope","$state","Title",function(e,t,n){n.set("Rallly - Collaborative Scheduling"),e.newEvent=function(){t.go("newevent")}}]),angular.module("rallly").controller("NavigationCtrl",["$scope","$location",function(e,t){e.isActive=function(e){return t.path()==e?!0:!1}}]),angular.module("rallly").controller("NewEventCtrl",["$scope","$http","$state","Event","ConfirmModal","Notification",function(e,t,n,i,o,a){e.title="Schedule a New Event",e.description="Fill in the form below to create your event and share it with your friends and colleagues.",e.submit=function(){if(e.form.$valid)t.post("/api/event",e.event).success(function(t){e.event=t,e.eventUrl=n.href("event",{id:e.event._id},{absolute:!0})}).error(function(){new o({title:"Uh oh!",message:"There was an error creating your event. Please try again later.",cancelText:"OK"})});else{new a({title:"Not so fast",message:"Make sure you fill in all the required fields and try again.",type:"error"})}},e.clearDates=null}]),angular.module("rallly").controller("VerificationCtrl",["Event","Notification","$state",function(e,t,n){e.verify({id:n.params.id,code:n.params.code},function(){new t({title:"Email Verified",message:"Your email has been verified. You will now be able to receive email notifications for this event",type:"success",timeout:5e3})},function(){new t({title:"Verification Failed",message:"Your verification code has expired.",type:"error"})}),n.go("event",{id:n.params.id})}]),angular.module("rallly").directive("backImg",function(){return function(e,t,n){var i=n.backImg;t.css({"background-image":"url(/images/"+i+".png)"})}}),angular.module("rallly").directive("datepicker",function(){return{restrict:"A",require:"ngModel",scope:{model:"=ngModel",control:"="},link:function(e,t,n,i){e.model=e.model||[],angular.element(t).datepicker({multidate:!0,todayHighlight:!0}).on("changeDate",function(e){var t=e.dates;t.sort(function(e,t){return e.getTime()>t.getTime()?!0:!1}),i.$setViewValue(t,e)});var o=function(e,n){if(e&&n&&e.length!=n.length){for(var i=[],o=0;o0;i||t.toggle()};t.toggle=function(){t.open=!t.open,t.open?(n.addClass("open"),e.bind("click",i)):(n.removeClass("open"),e.unbind("click",i))}}}}]),angular.module("rallly").service("FormHelper",function(){this.emailRegexString="^([\\w-\\.]+@([\\w-]+\\.)+[\\w-]{2,4})?$",this.emailRegex=new RegExp(this.emailRegexString),this.prettyError=function(e,t){return e.required?t+" is required":e.pattern?t+" is invalid":e.maxlength?t+" is too long":!1}}).directive("userForm",["FormHelper",function(e){return{scope:{event:"=",form:"="},templateUrl:"templates/directives/eventForm/userForm.html",link:function(t){t.errors={},t.emailRegex=e.emailRegex,t.$watchCollection("form.name.$error",function(n){t.errors.name=e.prettyError(n,"Name")}),t.$watchCollection("form.email.$error",function(n){t.errors.email=e.prettyError(n,"Email")})}}}]).directive("eventForm",["FormHelper",function(e){return{scope:{event:"=",form:"="},templateUrl:"templates/directives/eventForm/eventForm.html",link:function(t){t.errors={},t.$watchCollection("form.title.$error",function(n){t.errors.title=e.prettyError(n,"Title")}),t.$watchCollection("form.location.$error",function(n){t.errors.location=e.prettyError(n,"Location")})}}}]).directive("dateForm",function(){return{scope:{event:"=",form:"="},templateUrl:"templates/directives/eventForm/dateForm.html"}}).directive("participantsForm",["FormHelper",function(e){return{scope:{event:"=",form:"="},templateUrl:"templates/directives/eventForm/participantsForm.html",link:function(t){t.emailRegex=e.emailRegexString}}}]).directive("settingsForm",["Event",function(e){return{scope:{event:"=",form:"="},templateUrl:"templates/directives/eventForm/settingsForm.html",link:function(t){t.deleteEvent=function(){e.delete({id:t.event._id},function(){console.log("delete")})}}}}]).directive("switchToggle",function(){return{scope:{model:"=ngModel"},require:"ngModel",link:function(e,t,n,i){t.addClass("switch-toggle");var o=function(){e.model^"undefined"!=typeof n.invert?t.addClass("active"):t.removeClass("active")};e.$watch("model",o),t.bind("click",function(t){e.model=!e.model,i.$setViewValue(e.model,t)})}}}),angular.module("rallly").directive("poll",["Participant","ConfirmModal",function(e,t){return{restrict:"A",templateUrl:"templates/directives/poll.html",scope:{event:"="},link:function(n){n.defaults=[],n.participant={};var i=[];n.delete=function(i){new t({title:"Delete "+i.name+"?",message:"Are you sure you want to remove "+i.name+" from the poll?",confirmText:"Yes - delete",cancelText:"No - nevermind",isDestructive:!0,confirm:function(){e.remove({id:n.event._id,pid:i._id},function(e){n.event=e})}})},n.isTopDate=function(e){for(var t=i[e],n=0;nt)return!1;return!0},n.selectedDate=function(e){i[e]=0;for(var t=0;t30?"on "+e("date")(t,"MMMM d"):r>1?r+" days ago":1==r?"1 day ago":s>1?s+" hours ago":1==s?"an hour ago":l>1?l+" minutes ago":1==l?"a minute ago":"a few seconds ago"}}}]),angular.module("rallly").factory("ConfirmModal",["btfModal",function(e){return function(t){var n;n=e({templateUrl:"templates/confirmmodal.html",controllerAs:"modal",controller:function(){this.title=t.title,this.message=t.message,this.confirm=t.confirm?function(){t.confirm(),n.deactivate()}:!1,this.cancel=n.deactivate,this.confirmText=t.confirmText||"Confirm",this.cancelText=t.cancelText||"Cancel",this.isDestructive=t.isDestructive}}),n.activate(),this.destroy=function(){n.deactivate()}}}]),angular.module("rallly").factory("Notification",["$timeout","btfModal",function(e,t){return function(n){var i;i=t({templateUrl:"templates/notification.html",controllerAs:"notification",controller:function(){this.title=n.title,this.message=n.message,this.close=i.deactivate,this.type=n.type;var t=n.timeout||5e3;e(i.deactivate,t)}}),i.activate(),this.destroy=function(){i.deactivate()}}}]); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm1haW4uanMiLCJ0ZW1wbGF0ZXMuanMiLCJjb250cm9sbGVycy9hYm91dC5jb250cm9sbGVyLmpzIiwiY29udHJvbGxlcnMvYWNjb3VudC5jb250cm9sbGVyLmpzIiwiY29udHJvbGxlcnMvZGVsZXRpb24uY29udHJvbGxlci5qcyIsImNvbnRyb2xsZXJzL2VkaXRldmVudC5jb250cm9sbGVyLmpzIiwiY29udHJvbGxlcnMvZXZlbnQuY29udHJvbGxlci5qcyIsImNvbnRyb2xsZXJzL2hvbWUuY29udHJvbGxlci5qcyIsImNvbnRyb2xsZXJzL25hdmlnYXRpb24uY29udHJvbGxlci5qcyIsImNvbnRyb2xsZXJzL25ld2V2ZW50LmNvbnRyb2xsZXIuanMiLCJjb250cm9sbGVycy92ZXJpZmljYXRpb24uY29udHJvbGxlci5qcyIsImRpcmVjdGl2ZXMvYmFja0ltZy5kaXJlY3RpdmUuanMiLCJkaXJlY3RpdmVzL2RhdGVwaWNrZXIuZGlyZWN0aXZlLmpzIiwiZGlyZWN0aXZlcy9kaXNjdXNzaW9uLmRpcmVjdGl2ZS5qcyIsImRpcmVjdGl2ZXMvZHJvcGRvd24uZGlyZWN0aXZlLmpzIiwiZGlyZWN0aXZlcy9mb3JtLmRpcmVjdGl2ZS5qcyIsImRpcmVjdGl2ZXMvcG9sbC5kaXJlY3RpdmUuanMiLCJmaWx0ZXJzL2VsYXBzZWQuZmlsdGVyLmpzIiwic2VydmljZXMvbW9kYWwuc2VydmljZS5qcyIsInNlcnZpY2VzL25vdGlmaWNhdGlvbi5zZXJ2aWNlLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFFBQUEsT0FBQSxVQUFBLFlBQUEsYUFBQSxPQUFBLGVBQUEsY0FBQSxjQUNBLFFBQUEsaUJBQUEscUJBQUEsb0JBQUEsU0FBQSxFQUFBLEVBQUEsR0FDQSxFQUFBLFdBQUEsR0FDQSxFQUFBLFVBQUEsYUFDQSxFQUNBLE1BQUEsU0FDQSxJQUFBLElBQ0EsWUFBQSxzQkFDQSxXQUFBLGFBRUEsTUFBQSxZQUNBLElBQUEsT0FDQSxZQUFBLDBCQUNBLFdBQUEsaUJBRUEsTUFBQSxTQUNBLElBQUEsU0FDQSxZQUFBLHVCQUNBLFdBQUEsY0FFQSxNQUFBLFlBQ0EsSUFBQSxZQUNBLFlBQUEsNEJBRUEsTUFBQSxTQUNBLElBQUEsT0FDQSxZQUFBLHVCQUNBLFdBQUEsY0FFQSxNQUFBLGFBQ0EsSUFBQSxZQUNBLFlBQUEsMkJBQ0EsV0FBQSxrQkFFQSxNQUFBLGVBQ0EsSUFBQSx5QkFDQSxXQUFBLHFCQUVBLE1BQUEsZUFDQSxJQUFBLHlCQUNBLFdBQUEsb0JBR0EsUUFBQSxTQUFBLFlBQUEsU0FBQSxHQUNBLE1BQUEsR0FBQSxrQkFBQSxHQUFBLFNBQ0EsUUFBQSxPQUFBLE9BQ0EsUUFBQSxPQUFBLE1BQUEsSUFBQSw2QkFDQSxTQUFBLE9BQUEsU0FBQSxJQUFBLGtDQUdBLFFBQUEsZUFBQSxZQUFBLFNBQUEsR0FDQSxNQUFBLEdBQUEsbUNBQUEsR0FBQSxTQUNBLFFBQUEsT0FBQSxZQUdBLFFBQUEsV0FBQSxZQUFBLFNBQUEsR0FDQSxNQUFBLEdBQUEsK0JBQUEsR0FBQSxTQUNBLFFBQUEsT0FBQSxZQUdBLFFBQUEsUUFBQSxXQUNBLE9BQ0EsSUFBQSxTQUFBLEdBQ0EsU0FBQSxNQUFBLE1DL0RBLFFBQUEsT0FBQSxVQUFBLEtBQUEsaUJBQUEsU0FBQSxHQUFBLEVBQUEsSUFBQSx1QkFBQSw4Z0JBQ0EsRUFBQSxJQUFBLDhCQUFBLG1pQkFDQSxFQUFBLElBQUEsMkJBQUEsaXZDQUNBLEVBQUEsSUFBQSx1QkFBQSx1dkRBQ0EsRUFBQSxJQUFBLHNCQUFBLDJaQUNBLEVBQUEsSUFBQSwwQkFBQSw0c0RBQ0EsRUFBQSxJQUFBLDBCQUFBLDRDQUNBLEVBQUEsSUFBQSw4QkFBQSw0T0FDQSxFQUFBLElBQUEsdUNBQUEsa2tEQUNBLEVBQUEsSUFBQSxpQ0FBQSx3bUhBQ0EsRUFBQSxJQUFBLCtDQUFBLHNxQ0FDQSxFQUFBLElBQUEsZ0RBQUEsa2tEQUNBLEVBQUEsSUFBQSx1REFBQSx1ZkFDQSxFQUFBLElBQUEsbURBQUEsb3NEQUNBLEVBQUEsSUFBQSwrQ0FBQSwwdkNDZEEsUUFBQSxPQUFBLFVBQ0EsV0FBQSxhQUFBLFFBQUEsU0FBQSxHQUNBLEVBQUEsSUFBQSxtQkNGQSxRQUFBLE9BQUEsVUFDQSxXQUFBLGVBQUEsU0FBQSxlQUFBLFNBQUEsR0FDQSxFQUFBLFdBQUEsZ0JDRkEsUUFBQSxPQUFBLFVBQ0EsV0FBQSxnQkFBQSxTQUFBLGVBQUEsUUFBQSxTQUFBLEVBQUEsRUFBQSxHQUNBLEVBQUEsU0FBQSxHQUFBLEVBQUEsT0FBQSxHQUFBLEtBQUEsRUFBQSxPQUFBLE1BQUEsV0FDQSxHQUFBLElBQ0EsTUFBQSxnQkFDQSxRQUFBLDhCQUNBLEtBQUEsVUFDQSxRQUFBLE9BRUEsV0FDQSxHQUFBLElBQ0EsTUFBQSxrQkFDQSxRQUFBLHVGQUNBLEtBQUEsWUFHQSxFQUFBLEdBQUEsU0FBQSxHQUFBLEVBQUEsT0FBQSxRQ2hCQSxRQUFBLE9BQUEsVUFDQSxXQUFBLGlCQUFBLFNBQUEsUUFBQSxTQUFBLFdBQUEsUUFBQSxlQUFBLGVBQUEsUUFBQSxTQUFBLEVBQUEsRUFBQSxFQUFBLEVBQUEsRUFBQSxFQUFBLEVBQUEsR0FDQSxHQUFBLEdBQUEsRUFBQSxPQUFBLEVBQ0EsR0FBQSxNQUFBLEVBQUEsS0FBQSxHQUFBLEdBQUEsV0FDQSxFQUFBLElBQUEsU0FBQSxFQUFBLE1BQUEsT0FDQSxFQUFBLE9BQUEsUUFBQSxLQUFBLEVBQUEsUUFDQSxXQUNBLEVBQUEsR0FBQSxjQUVBLEVBQUEsWUFBQSxXQUNBLEVBQUEsTUFBQSxRQUFBLEtBQUEsRUFBQSxTQUVBLEVBQUEsVUFBQSxXQUNBLE1BQUEsTUFBQSxVQUFBLEVBQUEsU0FBQSxLQUFBLFVBQUEsRUFBQSxRQUVBLEVBQUEsZUFBQSxXQUNBLE1BQUEsTUFBQSxVQUFBLEVBQUEsT0FBQSxRQUFBLEtBQUEsVUFBQSxFQUFBLE1BQUEsUUFFQSxFQUFBLE9BQUEsV0FDQSxHQUFBLEVBQUEsS0FBQSxPQUNBLEdBQUEsRUFBQSxpQkFDQSxDQUFBLEdBQUEsSUFDQSxNQUFBLFdBQ0EsUUFBQSxtR0FDQSxZQUFBLGdCQUNBLGVBQUEsRUFDQSxRQUFBLFdBQ0EsRUFBQSxNQUFBLGdCQUNBLFdBS0EsU0FHQSxDQUFBLEdBQUEsSUFDQSxNQUFBLGNBQ0EsUUFBQSwrREFDQSxLQUFBLFdBSUEsSUFBQSxHQUFBLFdBQ0EsRUFBQSxRQUNBLEdBQUEsR0FDQSxFQUFBLE1BQ0EsV0FDQSxHQUFBLElBQ0EsTUFBQSxnQkFDQSxRQUFBLDZDQUNBLEtBQUEsV0FFQSxHQUFBLE9BQUEsUUFBQSxLQUFBLEVBQUEsYUNyREEsUUFBQSxPQUFBLFVBQ0EsV0FBQSxhQUFBLFNBQUEsUUFBQSxTQUFBLFFBQUEsUUFBQSxlQUFBLFNBQUEsRUFBQSxFQUFBLEVBQUEsRUFBQSxFQUFBLEdBQ0EsR0FBQSxHQUFBLEVBQUEsT0FBQSxFQUNBLEdBQUEsTUFBQSxFQUFBLEtBQUEsR0FBQSxHQUFBLFdBQ0EsRUFBQSxJQUFBLEVBQUEsTUFBQSxPQUNBLEVBQUEsU0FBQSxFQUFBLEtBQUEsU0FDQSxHQUFBLEVBQUEsTUFBQSxNQUVBLFVBQUEsS0FFQSxXQUNBLEVBQUEsR0FBQSxjQUdBLEVBQUEsVUFBQSxXQUNBLEVBQUEsTUFBQSxVQUFBLEVBQ0EsRUFBQSxRQUNBLEdBQUEsR0FDQSxFQUFBLE1BQ0EsV0FDQSxHQUFBLElBQ0EsTUFBQSxhQUNBLFFBQUEsNkNBQ0EsV0FBQSxVQUtBLEVBQUEsV0FBQSxXQUNBLEVBQUEsTUFBQSxVQUFBLEVBQ0EsRUFBQSxRQUNBLEdBQUEsR0FDQSxFQUFBLE1BQ0EsV0FDQSxHQUFBLElBQ0EsTUFBQSxlQUNBLFFBQUEsc0RBQ0EsV0FBQSxVQUtBLEVBQUEsVUFBQSxXQUNBLEVBQUEsR0FBQSxhQUFBLEdBQUEsRUFBQSxNQUFBLFVDM0NBLFFBQUEsT0FBQSxVQUNBLFdBQUEsWUFBQSxTQUFBLFNBQUEsUUFBQSxTQUFBLEVBQUEsRUFBQSxHQUNBLEVBQUEsSUFBQSxxQ0FFQSxFQUFBLFNBQUEsV0FDQSxFQUFBLEdBQUEsZ0JDTEEsUUFBQSxPQUFBLFVBQ0EsV0FBQSxrQkFBQSxTQUFBLFlBQUEsU0FBQSxFQUFBLEdBQ0EsRUFBQSxTQUFBLFNBQUEsR0FDQSxNQUFBLEdBQUEsUUFBQSxHQUNBLEdBRUEsTUNOQSxRQUFBLE9BQUEsVUFDQSxXQUFBLGdCQUFBLFNBQUEsUUFBQSxTQUFBLFFBQUEsZUFBQSxlQUFBLFNBQUEsRUFBQSxFQUFBLEVBQUEsRUFBQSxFQUFBLEdBRUEsRUFBQSxNQUFBLHVCQUNBLEVBQUEsWUFBQSw2RkFFQSxFQUFBLE9BQUEsV0FDQSxHQUFBLEVBQUEsS0FBQSxPQUNBLEVBQUEsS0FBQSxhQUFBLEVBQUEsT0FDQSxRQUFBLFNBQUEsR0FDQSxFQUFBLE1BQUEsRUFDQSxFQUFBLFNBQUEsRUFBQSxLQUFBLFNBQ0EsR0FBQSxFQUFBLE1BQUEsTUFFQSxVQUFBLE1BR0EsTUFBQSxXQUNBLEdBQUEsSUFDQSxNQUFBLFNBQ0EsUUFBQSxrRUFDQSxXQUFBLGFBSUEsQ0FBQSxHQUFBLElBQ0EsTUFBQSxjQUNBLFFBQUEsK0RBQ0EsS0FBQSxZQUtBLEVBQUEsV0FBQSxRQ2pDQSxRQUFBLE9BQUEsVUFDQSxXQUFBLG9CQUFBLFFBQUEsZUFBQSxTQUFBLFNBQUEsRUFBQSxFQUFBLEdBQ0EsRUFBQSxRQUFBLEdBQUEsRUFBQSxPQUFBLEdBQUEsS0FBQSxFQUFBLE9BQUEsTUFBQSxXQUNBLEdBQUEsSUFDQSxNQUFBLGlCQUNBLFFBQUEsbUdBQ0EsS0FBQSxVQUNBLFFBQUEsT0FFQSxXQUNBLEdBQUEsSUFDQSxNQUFBLHNCQUNBLFFBQUEsc0NBQ0EsS0FBQSxZQUdBLEVBQUEsR0FBQSxTQUFBLEdBQUEsRUFBQSxPQUFBLFFDaEJBLFFBQUEsT0FBQSxVQUNBLFVBQUEsVUFBQSxXQUNBLE1BQUEsVUFBQSxFQUFBLEVBQUEsR0FDQSxHQUFBLEdBQUEsRUFBQSxPQUNBLEdBQUEsS0FDQSxtQkFBQSxlQUFBLEVBQUEsYUNMQSxRQUFBLE9BQUEsVUFDQSxVQUFBLGFBQUEsV0FDQSxPQUNBLFNBQUEsSUFDQSxRQUFBLFVBQ0EsT0FDQSxNQUFBLFdBQ0EsUUFBQSxLQUVBLEtBQUEsU0FBQSxFQUFBLEVBQUEsRUFBQSxHQUNBLEVBQUEsTUFBQSxFQUFBLFVBQ0EsUUFBQSxRQUFBLEdBQUEsWUFDQSxXQUFBLEVBQ0EsZ0JBQUEsSUFFQSxHQUFBLGFBQUEsU0FBQSxHQUNBLEdBQUEsR0FBQSxFQUFBLEtBQ0EsR0FBQSxLQUFBLFNBQUEsRUFBQSxHQUNBLE1BQUEsR0FBQSxVQUFBLEVBQUEsV0FBQSxHQUNBLElBRUEsRUFBQSxjQUFBLEVBQUEsSUFHQSxJQUFBLEdBQUEsU0FBQSxFQUFBLEdBQ0EsR0FBQSxHQUFBLEdBQUEsRUFBQSxRQUFBLEVBQUEsT0FBQSxDQUVBLElBQUEsR0FEQSxNQUNBLEVBQUEsRUFBQSxFQUFBLEVBQUEsT0FBQSxJQUNBLEVBQUEsS0FBQSxHQUFBLE1BQUEsRUFBQSxJQUVBLFNBQUEsUUFBQSxHQUFBLFdBQUEsV0FBQSxJQUVBLEdBQUEsaUJBQUEsUUFBQSxHQUVBLEVBQUEsUUFBQSxFQUFBLFlBQ0EsRUFBQSxRQUFBLFVBQUEsU0FBQSxHQUNBLEdBQUEsR0FBQSxFQUFBLE1BQUEsUUFBQSxFQUNBLEdBQUEsTUFBQSxPQUFBLEVBQUEsSUFHQSxFQUFBLFlBQUEsU0FBQSxTQUFBLEdBQ0EsTUFBQSxJQUFBLEdBQUEsRUFBQSxRQUdBLEdBRkEsT0MxQ0EsUUFBQSxPQUFBLFVBQ0EsVUFBQSxjQUFBLFdBQUEsVUFBQSxlQUFBLFNBQUEsRUFBQSxFQUFBLEdBQ0EsT0FDQSxTQUFBLElBQ0EsWUFBQSx1Q0FDQSxPQUNBLE1BQUEsS0FFQSxLQUFBLFNBQUEsR0FDQSxFQUFBLFVBQ0EsSUFBQSxHQUFBLFFBQUEsUUFBQSxrQkFDQSxHQUFBLFdBQ0EsRUFBQSxVQUFBLEVBQUEsS0FBQSxtQkFFQSxFQUFBLGNBQUEsU0FBQSxHQUNBLEdBQUEsSUFDQSxNQUFBLGdCQUNBLFFBQUEsZ0RBQ0EsWUFBQSxlQUNBLFdBQUEsaUJBQ0EsZUFBQSxFQUNBLFFBQUEsV0FDQSxFQUFBLFFBQUEsR0FBQSxFQUFBLE1BQUEsSUFBQSxJQUFBLEVBQUEsS0FBQSxTQUFBLEdBQ0EsRUFBQSxNQUFBLFFBS0EsRUFBQSxZQUFBLFdBQ0EsR0FBQSxFQUFBLFlBQUEsT0FBQSxDQUNBLEdBQUEsR0FBQSxHQUFBLEdBQUEsRUFBQSxRQUNBLEdBQUEsT0FBQSxHQUFBLEVBQUEsTUFBQSxLQUFBLFNBQUEsR0FDQSxFQUFBLE1BQUEsRUFDQSxFQUFBLGFBRUEsRUFBQSxZQUFBLHNCQ25DQSxRQUFBLE9BQUEsVUFDQSxVQUFBLFlBQUEsWUFBQSxTQUFBLEdBQ0EsT0FDQSxTQUFBLElBQ0EsS0FBQSxTQUFBLEVBQUEsR0FDQSxFQUFBLFNBQUEsWUFDQSxFQUFBLE1BQUEsQ0FFQSxJQUFBLEdBQUEsU0FBQSxHQUNBLEdBQUEsR0FBQSxFQUFBLEtBQUEsRUFBQSxRQUFBLE9BQUEsQ0FDQSxJQUNBLEVBQUEsU0FHQSxHQUFBLE9BQUEsV0FDQSxFQUFBLE1BQUEsRUFBQSxLQUNBLEVBQUEsTUFDQSxFQUFBLFNBQUEsUUFDQSxFQUFBLEtBQUEsUUFBQSxLQUVBLEVBQUEsWUFBQSxRQUNBLEVBQUEsT0FBQSxRQUFBLFVDckJBLFFBQUEsT0FBQSxVQUNBLFFBQUEsYUFBQSxXQUNBLEtBQUEsaUJBQUEsMkNBQ0EsS0FBQSxXQUFBLEdBQUEsUUFBQSxLQUFBLGtCQUNBLEtBQUEsWUFBQSxTQUFBLEVBQUEsR0FDQSxNQUFBLEdBQUEsU0FBQSxFQUFBLGVBQ0EsRUFBQSxRQUFBLEVBQUEsY0FDQSxFQUFBLFVBQUEsRUFBQSxnQkFDQSxLQUdBLFVBQUEsWUFBQSxhQUFBLFNBQUEsR0FDQSxPQUNBLE9BQ0EsTUFBQSxJQUNBLEtBQUEsS0FFQSxZQUFBLCtDQUNBLEtBQUEsU0FBQSxHQUNBLEVBQUEsVUFFQSxFQUFBLFdBQUEsRUFBQSxXQUVBLEVBQUEsaUJBQUEsbUJBQUEsU0FBQSxHQUNBLEVBQUEsT0FBQSxLQUFBLEVBQUEsWUFBQSxFQUFBLFVBR0EsRUFBQSxpQkFBQSxvQkFBQSxTQUFBLEdBQ0EsRUFBQSxPQUFBLE1BQUEsRUFBQSxZQUFBLEVBQUEsZ0JBS0EsVUFBQSxhQUFBLGFBQUEsU0FBQSxHQUNBLE9BQ0EsT0FDQSxNQUFBLElBQ0EsS0FBQSxLQUVBLFlBQUEsZ0RBQ0EsS0FBQSxTQUFBLEdBQ0EsRUFBQSxVQUVBLEVBQUEsaUJBQUEsb0JBQUEsU0FBQSxHQUNBLEVBQUEsT0FBQSxNQUFBLEVBQUEsWUFBQSxFQUFBLFdBR0EsRUFBQSxpQkFBQSx1QkFBQSxTQUFBLEdBQ0EsRUFBQSxPQUFBLFNBQUEsRUFBQSxZQUFBLEVBQUEsbUJBTUEsVUFBQSxXQUFBLFdBQ0EsT0FDQSxPQUNBLE1BQUEsSUFDQSxLQUFBLEtBRUEsWUFBQSxrREFHQSxVQUFBLG9CQUFBLGFBQUEsU0FBQSxHQUNBLE9BQ0EsT0FDQSxNQUFBLElBQ0EsS0FBQSxLQUVBLFlBQUEsdURBQ0EsS0FBQSxTQUFBLEdBQ0EsRUFBQSxXQUFBLEVBQUEsc0JBSUEsVUFBQSxnQkFBQSxRQUFBLFNBQUEsR0FDQSxPQUNBLE9BQ0EsTUFBQSxJQUNBLEtBQUEsS0FFQSxZQUFBLG1EQUNBLEtBQUEsU0FBQSxHQUNBLEVBQUEsWUFBQSxXQUNBLEVBQUEsUUFBQSxHQUFBLEVBQUEsTUFBQSxLQUFBLFdBQ0EsUUFBQSxJQUFBLGtCQU1BLFVBQUEsZUFBQSxXQUNBLE9BQ0EsT0FDQSxNQUFBLFlBRUEsUUFBQSxVQUNBLEtBQUEsU0FBQSxFQUFBLEVBQUEsRUFBQSxHQUNBLEVBQUEsU0FBQSxnQkFDQSxJQUFBLEdBQUEsV0FDQSxFQUFBLE1BQUEsbUJBQUEsR0FBQSxPQUNBLEVBQUEsU0FBQSxVQUVBLEVBQUEsWUFBQSxVQUdBLEdBQUEsT0FBQSxRQUFBLEdBQ0EsRUFBQSxLQUFBLFFBQUEsU0FBQSxHQUNBLEVBQUEsT0FBQSxFQUFBLE1BQ0EsRUFBQSxjQUFBLEVBQUEsTUFBQSxTQzdHQSxRQUFBLE9BQUEsVUFDQSxVQUFBLFFBQUEsY0FBQSxlQUFBLFNBQUEsRUFBQSxHQUNBLE9BQ0EsU0FBQSxJQUNBLFlBQUEsaUNBQ0EsT0FDQSxNQUFBLEtBRUEsS0FBQSxTQUFBLEdBQ0EsRUFBQSxZQUNBLEVBQUEsY0FDQSxJQUFBLEtBQ0EsR0FBQSxPQUFBLFNBQUEsR0FDQSxHQUFBLElBQ0EsTUFBQSxVQUFBLEVBQUEsS0FBQSxJQUNBLFFBQUEsbUNBQUEsRUFBQSxLQUFBLGtCQUNBLFlBQUEsZUFDQSxXQUFBLGlCQUNBLGVBQUEsRUFDQSxRQUFBLFdBQ0EsRUFBQSxRQUFBLEdBQUEsRUFBQSxNQUFBLElBQUEsSUFBQSxFQUFBLEtBQUEsU0FBQSxHQUNBLEVBQUEsTUFBQSxRQUtBLEVBQUEsVUFBQSxTQUFBLEdBRUEsSUFBQSxHQURBLEdBQUEsRUFBQSxHQUNBLEVBQUEsRUFBQSxFQUFBLEVBQUEsT0FBQSxJQUNBLEdBQUEsRUFBQSxHQUFBLEVBQUEsT0FBQSxDQUVBLFFBQUEsR0FFQSxFQUFBLGFBQUEsU0FBQSxHQUNBLEVBQUEsR0FBQSxDQUNBLEtBQUEsR0FBQSxHQUFBLEVBQUEsRUFBQSxFQUFBLE1BQUEsYUFBQSxPQUFBLElBQ0EsRUFBQSxNQUFBLGFBQUEsR0FBQSxNQUFBLElBQUEsRUFBQSxJQUVBLE9BQUEsR0FBQSxJQUVBLEVBQUEsT0FBQSxTQUFBLEdBQ0EsRUFBQSxRQUNBLEdBQUEsRUFBQSxNQUFBLElBQ0EsSUFBQSxFQUFBLEtBQ0EsSUFFQSxFQUFBLEtBQUEsU0FBQSxHQUNBLEVBQUEsU0FBQSxFQUFBLE1BQUEsYUFBQSxRQUFBLElBQUEsUUFBQSxLQUFBLElBRUEsRUFBQSxPQUFBLFNBQUEsR0FDQSxFQUFBLE1BQUEsYUFBQSxHQUFBLEVBQUEsU0FBQSxJQUVBLEVBQUEsS0FBQSxXQUNBLEdBQUEsRUFBQSxRQUFBLE9BQUEsQ0FDQSxHQUFBLEdBQUEsR0FBQSxHQUFBLEVBQUEsWUFDQSxHQUFBLE9BQUEsR0FBQSxFQUFBLE1BQUEsS0FBQSxTQUFBLEdBQ0EsRUFBQSxNQUFBLEVBQ0EsRUFBQSxpQkFFQSxFQUFBLFFBQUEsc0JDM0RBLFFBQUEsT0FBQSxVQUNBLE9BQUEsV0FBQSxVQUFBLFNBQUEsR0FDQSxNQUFBLFVBQUEsR0FDQSxHQUFBLEVBQUEsQ0FDQSxHQUFBLEdBQUEsS0FBQSxNQUFBLEdBQ0EsR0FBQSxHQUFBLE9BQUEsVUFDQSxFQUFBLEVBQUEsRUFDQSxFQUFBLEtBQUEsTUFBQSxFQUFBLEtBQ0EsRUFBQSxLQUFBLE1BQUEsRUFBQSxJQUNBLEVBQUEsS0FBQSxNQUFBLEVBQUEsSUFDQSxFQUFBLEtBQUEsTUFBQSxFQUFBLEdBQ0EsT0FBQSxHQUFBLEdBQ0EsTUFBQSxFQUFBLFFBQUEsRUFBQSxVQUNBLEVBQUEsRUFDQSxFQUFBLFlBQ0EsR0FBQSxFQUNBLFlBQ0EsRUFBQSxFQUNBLEVBQUEsYUFDQSxHQUFBLEVBQ0EsY0FDQSxFQUFBLEVBQ0EsRUFBQSxlQUNBLEdBQUEsRUFDQSxlQUVBLHlCQzFCQSxRQUFBLE9BQUEsVUFDQSxRQUFBLGdCQUFBLFdBQUEsU0FBQSxHQUVBLE1BQUEsVUFBQSxHQUNBLEdBQUEsRUFDQSxHQUFBLEdBQ0EsWUFBQSw4QkFDQSxhQUFBLFFBQ0EsV0FBQSxXQUNBLEtBQUEsTUFBQSxFQUFBLE1BQ0EsS0FBQSxRQUFBLEVBQUEsUUFDQSxLQUFBLFFBQUEsRUFBQSxRQUFBLFdBQUEsRUFBQSxVQUFBLEVBQUEsZUFBQSxFQUNBLEtBQUEsT0FBQSxFQUFBLFdBQ0EsS0FBQSxZQUFBLEVBQUEsYUFBQSxVQUNBLEtBQUEsV0FBQSxFQUFBLFlBQUEsU0FDQSxLQUFBLGNBQUEsRUFBQSxpQkFHQSxFQUFBLFdBRUEsS0FBQSxRQUFBLFdBQ0EsRUFBQSxrQkNyQkEsUUFBQSxPQUFBLFVBQ0EsUUFBQSxnQkFBQSxXQUFBLFdBQUEsU0FBQSxFQUFBLEdBQ0EsTUFBQSxVQUFBLEdBQ0EsR0FBQSxFQUNBLEdBQUEsR0FDQSxZQUFBLDhCQUNBLGFBQUEsZUFDQSxXQUFBLFdBQ0EsS0FBQSxNQUFBLEVBQUEsTUFDQSxLQUFBLFFBQUEsRUFBQSxRQUNBLEtBQUEsTUFBQSxFQUFBLFdBQ0EsS0FBQSxLQUFBLEVBQUEsSUFDQSxJQUFBLEdBQUEsRUFBQSxTQUFBLEdBQ0EsR0FBQSxFQUFBLFdBQUEsTUFHQSxFQUFBLFdBRUEsS0FBQSxRQUFBLFdBQ0EsRUFBQSIsImZpbGUiOiJwdWJsaWMvYnVpbGQvYXBwLmpzIiwic291cmNlc0NvbnRlbnQiOlsiYW5ndWxhci5tb2R1bGUoJ3JhbGxseScsIFsndWkucm91dGVyJywnbmdSZXNvdXJjZScsJ25nRngnLCdidGZvcmQubW9kYWwnLCduZ1RhZ3NJbnB1dCcsJ25nQW5pbWF0ZSddKVxuICAgIC5jb25maWcoZnVuY3Rpb24oJHN0YXRlUHJvdmlkZXIsICR1cmxSb3V0ZXJQcm92aWRlciwgJGxvY2F0aW9uUHJvdmlkZXIpe1xuICAgICAgICAkbG9jYXRpb25Qcm92aWRlci5odG1sNU1vZGUodHJ1ZSk7XG4gICAgICAgICR1cmxSb3V0ZXJQcm92aWRlci5vdGhlcndpc2UoXCIvbm90Zm91bmRcIilcbiAgICAgICAgJHN0YXRlUHJvdmlkZXJcbiAgICAgICAgLnN0YXRlKCdpbmRleCcse1xuICAgICAgICAgICAgdXJsIDogJy8nLFxuICAgICAgICAgICAgdGVtcGxhdGVVcmwgOiAndGVtcGxhdGVzL2hvbWUuaHRtbCcsXG4gICAgICAgICAgICBjb250cm9sbGVyIDogJ0hvbWVDdHJsJ1xuICAgICAgICB9KVxuICAgICAgICAuc3RhdGUoJ25ld2V2ZW50Jyx7XG4gICAgICAgICAgICB1cmwgOiAnL25ldycsXG4gICAgICAgICAgICB0ZW1wbGF0ZVVybCA6ICd0ZW1wbGF0ZXMvbmV3ZXZlbnQuaHRtbCcsXG4gICAgICAgICAgICBjb250cm9sbGVyIDogJ05ld0V2ZW50Q3RybCdcbiAgICAgICAgfSlcbiAgICAgICAgLnN0YXRlKCdhYm91dCcsIHtcbiAgICAgICAgICAgIHVybCA6ICcvYWJvdXQnLFxuICAgICAgICAgICAgdGVtcGxhdGVVcmwgOiAndGVtcGxhdGVzL2Fib3V0Lmh0bWwnLFxuICAgICAgICAgICAgY29udHJvbGxlciA6ICdBYm91dEN0cmwnXG4gICAgICAgIH0pXG4gICAgICAgIC5zdGF0ZSgnbm90Zm91bmQnLCB7XG4gICAgICAgICAgICB1cmwgOiAnL25vdGZvdW5kJyxcbiAgICAgICAgICAgIHRlbXBsYXRlVXJsIDogJ3RlbXBsYXRlcy9ub3Rmb3VuZC5odG1sJ1xuICAgICAgICB9KVxuICAgICAgICAuc3RhdGUoJ2V2ZW50Jyx7XG4gICAgICAgICAgICB1cmwgOiAnLzppZCcsXG4gICAgICAgICAgICB0ZW1wbGF0ZVVybCA6ICd0ZW1wbGF0ZXMvZXZlbnQuaHRtbCcsXG4gICAgICAgICAgICBjb250cm9sbGVyIDogJ0V2ZW50Q3RybCdcbiAgICAgICAgfSlcbiAgICAgICAgLnN0YXRlKCdlZGl0ZXZlbnQnLCB7XG4gICAgICAgICAgICB1cmw6ICcvOmlkL2VkaXQnLFxuICAgICAgICAgICAgdGVtcGxhdGVVcmwgOiAndGVtcGxhdGVzL2VkaXRldmVudC5odG1sJyxcbiAgICAgICAgICAgIGNvbnRyb2xsZXIgOiAnRWRpdEV2ZW50Q3RybCdcbiAgICAgICAgfSlcbiAgICAgICAgLnN0YXRlKCd2ZXJpZnlldmVudCcsIHtcbiAgICAgICAgICAgIHVybCA6ICcvdmVyaWZ5LzppZC9jb2RlLzpjb2RlJyxcbiAgICAgICAgICAgIGNvbnRyb2xsZXIgOiAnVmVyaWZpY2F0aW9uQ3RybCdcbiAgICAgICAgfSlcbiAgICAgICAgLnN0YXRlKCdkZWxldGVldmVudCcsIHtcbiAgICAgICAgICAgIHVybCA6ICcvZGVsZXRlLzppZC9jb2RlLzpjb2RlJyxcbiAgICAgICAgICAgIGNvbnRyb2xsZXIgOiAnRGVsZXRpb25DdHJsJ1xuICAgICAgICB9KVxuICAgIH0pXG4gICAgLmZhY3RvcnkoJ0V2ZW50JywgZnVuY3Rpb24oJHJlc291cmNlKXtcbiAgICAgICAgcmV0dXJuICRyZXNvdXJjZSgnL2FwaS9ldmVudC86aWQnLCB7IGlkIDogJ0BfaWQnIH0sIHtcbiAgICAgICAgICAgICd1cGRhdGUnIDogeyBtZXRob2QgOiAnUFVUJyB9LFxuICAgICAgICAgICAgJ3ZlcmlmeScgOiB7IG1ldGhvZCA6ICdHRVQnLCB1cmwgOiAnL2FwaS9ldmVudC86aWQvY29kZS86Y29kZScgfSxcbiAgICAgICAgICAgICdkZXN0cm95JzogeyBtZXRob2QgOiAnREVMRVRFJywgdXJsOiAnL2FwaS9ldmVudC86aWQvY29kZS86Y29kZScgfVxuICAgICAgICB9KTtcbiAgICB9KVxuICAgIC5mYWN0b3J5KCdQYXJ0aWNpcGFudCcsIGZ1bmN0aW9uKCRyZXNvdXJjZSl7XG4gICAgICAgIHJldHVybiAkcmVzb3VyY2UoJy9hcGkvZXZlbnQvOmlkL3BhcnRpY2lwYW50LzpwaWQnLCB7IGlkOiAnQF9pZCd9LCB7XG4gICAgICAgICAgICAndXBkYXRlJyA6IHsgbWV0aG9kIDogJ1BVVCcgfVxuICAgICAgICB9KTtcbiAgICB9KVxuICAgIC5mYWN0b3J5KCdDb21tZW50JywgZnVuY3Rpb24oJHJlc291cmNlKXtcbiAgICAgICAgcmV0dXJuICRyZXNvdXJjZSgnL2FwaS9ldmVudC86aWQvY29tbWVudC86Y2lkJywgeyBpZCA6ICdAX2lkJyB9LCB7XG4gICAgICAgICAgICAndXBkYXRlJyA6IHsgbWV0aG9kIDogJ1BVVCcgfVxuICAgICAgICB9KVxuICAgIH0pXG4gICAgLmZhY3RvcnkoJ1RpdGxlJywgZnVuY3Rpb24oKXtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHNldCA6IGZ1bmN0aW9uKHRpdGxlKXtcbiAgICAgICAgICAgICAgICBkb2N1bWVudC50aXRsZSA9IHRpdGxlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG4iLCJhbmd1bGFyLm1vZHVsZShcInJhbGxseVwiKS5ydW4oW1wiJHRlbXBsYXRlQ2FjaGVcIiwgZnVuY3Rpb24oJHRlbXBsYXRlQ2FjaGUpIHskdGVtcGxhdGVDYWNoZS5wdXQoXCJ0ZW1wbGF0ZXMvYWJvdXQuaHRtbFwiLFwiPGRpdiBzdHlsZT1cXFwibWF4LXdpZHRoOjYwMHB4XFxcIj5cXG4gICAgPGgxPldoYXQgaXMgUmFsbGx5PzwvaDE+XFxuICAgIDxkaXYgY2xhc3M9XFxcInJsLXBhZ2UtZGVzY1xcXCI+UmFsbGx5IGlzIGEgY29sbGFib3JhdGl2ZSBzY2hlZHVsaW5nIHNlcnZpY2UgdGhhdCBtYWtlcyBkZWNpZGluZyBvbiBhIGRhdGUgZmFzdCBhbmQgZWFzeS48L2Rpdj5cXG4gICAgPGgyPkhpLCBJXFwnbSBMdWtlITwvaDI+XFxuICAgIDxwPlxcbiAgICAgICAgSSBjcmVhdGVkIFJhbGxseSBhcyBzaWRlIHByb2plY3QgdG8gaGVscCBtZSBsZWFybiBzb21lIG5ldyB0ZWNobm9sb2dpZXMuIEkgZGVjaWRlZCB0byBwdWJsaXNoIGl0IGJlY2F1c2UgSSB0aG91Z2h0IG90aGVyIHBlb3BsZSBtaWdodCBmaW5kIGl0IHVzZWZ1bC4gUmFsbGx5IGlzIGEgY29tcGxldGVseSBmcmVlIHNlcnZpY2UuIEluIGZhY3QgaXQgaXMgZXZlbiBvcGVuIHNvdXJjZS4gWW91IGNhbiBsb29rIGF0IHRoZSBsYXRlc3Qgc291cmNlIGNvZGUgb24gR2l0aHViLlxcbiAgICA8L3A+XFxuPC9kaXY+XFxuXCIpO1xuJHRlbXBsYXRlQ2FjaGUucHV0KFwidGVtcGxhdGVzL2NvbmZpcm1tb2RhbC5odG1sXCIsXCI8ZGl2IGNsYXNzPVxcXCJybC1tb2RhbC1vdmVybGF5XFxcIiBuZy1jbGljaz1cXFwibW9kYWwuY2FuY2VsKClcXFwiPjwvZGl2PlxcblxcbjxkaXYgY2xhc3M9XFxcInJsLW1vZGFsXFxcIj5cXG4gICAgPGRpdiBjbGFzcz1cXFwicmwtbW9kYWwtdGl0bGVcXFwiPnt7bW9kYWwudGl0bGV9fTwvZGl2PlxcbiAgICA8ZGl2IGNsYXNzPVxcXCJybC1tb2RhbC1tZXNzYWdlXFxcIj5cXG4gICAgICAgIHt7bW9kYWwubWVzc2FnZX19XFxuICAgIDwvZGl2PlxcbiAgICA8ZGl2IGNsYXNzPVxcXCJybC1tb2RhbC1hY3Rpb25zXFxcIj5cXG4gICAgICAgIDxidXR0b24gdHlwZT1cXFwiYnV0dG9uXFxcIiBuZy1jbGljaz1cXFwibW9kYWwuY29uZmlybSgpXFxcIiBuZy1zaG93PVxcXCJtb2RhbC5jb25maXJtXFxcIiBjbGFzcz1cXFwiYnRuXFxcIiBuZy1jbGFzcz1cXFwie2RhbmdlciA6IG1vZGFsLmlzRGVzdHJ1Y3RpdmV9XFxcIj57e21vZGFsLmNvbmZpcm1UZXh0fX08L2J1dHRvbj5cXG4gICAgICAgIDxidXR0b24gdHlwZT1cXFwiYnV0dG9uXFxcIiBuZy1jbGljaz1cXFwibW9kYWwuY2FuY2VsKClcXFwiICBjbGFzcz1cXFwiYnRuXFxcIj57e21vZGFsLmNhbmNlbFRleHR9fTwvYnV0dG9uPlxcbiAgICA8L2Rpdj5cXG48L2Rpdj5cXG5cIik7XG4kdGVtcGxhdGVDYWNoZS5wdXQoXCJ0ZW1wbGF0ZXMvZWRpdGV2ZW50Lmh0bWxcIixcIjxkaXYgbmctc2hvdz1cXFwiZXZlbnQuX2lkXFxcIj5cXG4gICAgPGRpdiBjbGFzcz1cXFwiYm94XFxcIj5cXG5cXG4gICAgICAgIDxkaXYgY2xhc3M9XFxcImJveC10aXRsZVxcXCI+RWRpdCBFdmVudDwvZGl2PlxcbiAgICAgICAgPGRpdiBjbGFzcz1cXFwiYm94LWRlc2NyaXB0aW9uXFxcIj5cXG4gICAgICAgICAgICBZb3UgY2FuIG1ha2VzIGNoYW5nZXMgdG8geW91ciBleGlzdGluZyBldmVudCBieSBjaGFuZ2luZyB0aGUgZmllbGRzIGluIHRoZSBmb3JtIGJlbG93LlxcbiAgICAgICAgPC9kaXY+XFxuXFxuICAgICAgICA8Zm9ybSBub3ZhbGlkYXRlIG5hbWU9XFxcImZvcm1cXFwiIG5nLXN1Ym1pdD1cXFwic3VibWl0KClcXFwiPlxcblxcbiAgICAgICAgICAgIDxzZWN0aW9uIGNsYXNzPVxcXCJib3gtc2VjdGlvblxcXCIgdXNlci1mb3JtIGZvcm09XFxcImZvcm1cXFwiIGV2ZW50PVxcXCJldmVudFxcXCI+XFxuXFxuICAgICAgICAgICAgPC9zZWN0aW9uPlxcblxcbiAgICAgICAgICAgIDxzZWN0aW9uIGNsYXNzPVxcXCJib3gtc2VjdGlvblxcXCIgZXZlbnQtZm9ybSBmb3JtPVxcXCJmb3JtXFxcIiBldmVudD1cXFwiZXZlbnRcXFwiPlxcblxcbiAgICAgICAgICAgIDwvc2VjdGlvbj5cXG4gICAgICAgICAgICA8c2VjdGlvbiBjbGFzcz1cXFwiYm94LXNlY3Rpb25cXFwiIGRhdGUtZm9ybSBmb3JtPVxcXCJmb3JtXFxcIiBldmVudD1cXFwiZXZlbnRcXFwiPlxcblxcbiAgICAgICAgICAgIDwvc2VjdGlvbj5cXG5cXG4gICAgICAgICAgICA8c2VjdGlvbiBjbGFzcz1cXFwiYm94LXNlY3Rpb25cXFwiIHNldHRpbmdzLWZvcm0gZm9ybT1cXFwiZm9ybVxcXCIgZXZlbnQ9XFxcImV2ZW50XFxcIj5cXG5cXG4gICAgICAgICAgICA8L3NlY3Rpb24+XFxuXFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwiYm94LWNvbnRyb2xzIGJveC1ib3R0b20tc3RpY2t5XFxcIj5cXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVxcXCJzdWJtaXRcXFwiIG5nLXNob3c9XFxcImRpZENoYW5nZSgpXFxcIiBjbGFzcz1cXFwiYnRuIGJ0bi1wcmltYXJ5XFxcIiBuZy1jbGFzcz1cXFwie2Rpc2FibGVkIDogIWRpZENoYW5nZSgpfVxcXCI+XFxuICAgICAgICAgICAgICAgICAgICBTYXZlIENoYW5nZXNcXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XFxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cXFwiYnV0dG9uXFxcIiBuZy1jbGljaz1cXFwidW5kb0NoYW5nZXMoKVxcXCIgY2xhc3M9XFxcImJ0blxcXCIgbmctc2hvdz1cXFwiZGlkQ2hhbmdlKClcXFwiPlVuZG8gQ2hhbmdlczwvYnV0dG9uPlxcbiAgICAgICAgICAgICAgICA8YSBocmVmPVxcXCIve3tldmVudC5faWR9fVxcXCIgY2xhc3M9XFxcImJ0blxcXCIgbmctaGlkZT1cXFwiZGlkQ2hhbmdlKClcXFwiPkRvbmU8L2E+XFxuICAgICAgICAgICAgPC9kaXY+XFxuXFxuICAgICAgICA8L2Zvcm0+XFxuXFxuICAgIDwvZGl2PlxcblxcbjwvZGl2PlxcblwiKTtcbiR0ZW1wbGF0ZUNhY2hlLnB1dChcInRlbXBsYXRlcy9ldmVudC5odG1sXCIsXCI8ZGl2IG5nLXNob3c9XFxcImV2ZW50Ll9pZCAmJiAhZXZlbnQuaXNEZWxldGVkXFxcIj5cXG4gICAgPGRpdiBjbGFzcz1cXFwiYm94IFxcXCI+XFxuICAgICAgICA8ZGl2IGNsYXNzPVxcXCJldmVudC1oZWFkZXJcXFwiPlxcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcImF2YXRhclxcXCI+XFxuICAgICAgICAgICAgICAgIDxpbWcgc3JjPVxcXCIvaW1hZ2VzL2V2ZW50aWNvbi5wbmdcXFwiIHdpZHRoPVxcXCIzMlxcXCIgLz5cXG4gICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJkZXRhaWxzXFxcIj5cXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwidGl0bGVcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAge3tldmVudC50aXRsZX19XFxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cXFwidGl0bGUtbGFiZWwgZGFuZ2VyXFxcIiBuZy1zaG93PVxcXCJldmVudC5pc0Nsb3NlZFxcXCI+UG9sbCBDbG9zZWQ8L3NwYW4+XFxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cXFwidGl0bGUtbGFiZWwgc3VjY2Vzc1xcXCIgbmctaGlkZT1cXFwiZXZlbnQuaXNDbG9zZWRcXFwiPlBvbGwgT3Blbjwvc3Bhbj5cXG4gICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcInN1YnRpdGxlXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgIENyZWF0ZWQgYnkgPGEgaHJlZj1cXFwibWFpbHRvOnt7ZXZlbnQuY3JlYXRvci5lbWFpbH19XFxcIj57e2V2ZW50LmNyZWF0b3IubmFtZX19PC9hPiAmYnVsbDsge3tldmVudC5jcmVhdGVkIHwgZWxhcHNlZH19XFxuICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcImFjdGlvbnNcXFwiPlxcbiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVxcXCJidG5cXFwiIG5nLWNsaWNrPVxcXCJlZGl0RXZlbnQoKVxcXCI+RWRpdCBFdmVudDwvYnV0dG9uPlxcbiAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgPC9kaXY+XFxuICAgICAgICA8ZGl2IGNsYXNzPVxcXCJib3gtc2lkZS1zdGlja3kgZXZlbnQtZGVzY3JpcHRpb25cXFwiIG5nLXNob3c9XFxcImV2ZW50LmRlc2NyaXB0aW9uXFxcIj57e2V2ZW50LmRlc2NyaXB0aW9ufX08L2Rpdj5cXG4gICAgICAgIDxkaXYgY2xhc3M9XFxcImJveC1ib3R0b20tc3RpY2t5IGV2ZW50LWxvY2F0aW9uXFxcIiBuZy1zaG93PVxcXCJldmVudC5sb2NhdGlvblxcXCI+XFxuICAgICAgICAgICAgPGltZyBzcmM9XFxcIi9pbWFnZXMvbG9jYXRpb24ucG5nXFxcIiB3aWR0aD1cXFwiMThcXFwiIC8+PGEgaHJlZj1cXFwiaHR0cDovL2dvb2dsZS5jb20vbWFwcz9xPXt7ZXZlbnQubG9jYXRpb259fVxcXCIgdGFyZ2V0PVxcXCJfYmxhbmtcXFwiPnt7ZXZlbnQubG9jYXRpb259fTwvYT5cXG4gICAgICAgIDwvZGl2PlxcblxcbiAgICA8L2Rpdj5cXG4gICAgPGRpdiBjbGFzcz1cXFwiYm94IGJveC14LXNjcm9sbFxcXCI+XFxuICAgICAgICA8ZGl2IHBvbGwgZXZlbnQ9XFxcImV2ZW50XFxcIiBjbGFzcz1cXFwicG9sbFxcXCI+XFxuICAgICAgICA8L2Rpdj5cXG4gICAgPC9kaXY+XFxuXFxuICAgIDxkaXYgY2xhc3M9XFxcImJveFxcXCIgbmctaGlkZT1cXFwiZXZlbnQuY29tbWVudHMubGVuZ3RoID09IDAgJiYgZXZlbnQuaXNDbG9zZWRcXFwiPlxcbiAgICAgICAgPGRpdiBjbGFzcz1cXFwiYm94LXRpdGxlXFxcIj5cXG4gICAgICAgICAgICBEaXNjdXNzaW9uXFxuICAgICAgICA8L2Rpdj5cXG4gICAgICAgIDxkaXYgY2xhc3M9XFxcImJveC1kZXNjcmlwdGlvblxcXCI+XFxuICAgICAgICAgICAgWW91IGNhbiBkaXNjdXNzIHRoZSBldmVudCB3aXRoIHlvdXIgZnJpZW5kcyBieSBsZWF2aW5nIGEgY29tbWVudCBiZWxvdy5cXG4gICAgICAgIDwvZGl2PlxcbiAgICAgICAgPGRpdiBkaXNjdXNzaW9uIGV2ZW50PVxcXCJldmVudFxcXCI+XFxuXFxuICAgICAgICA8L2Rpdj5cXG4gICAgPC9kaXY+XFxuPC9kaXY+XFxuXCIpO1xuJHRlbXBsYXRlQ2FjaGUucHV0KFwidGVtcGxhdGVzL2hvbWUuaHRtbFwiLFwiPGRpdiBjbGFzcz1cXFwicGFnZS1wbGFjZWhvbGRlclxcXCI+XFxuICAgIDxkaXYgY2xhc3M9XFxcImltYWdlXFxcIj5cXG4gICAgICAgIDxpbWcgc3JjPVxcXCIvaW1hZ2VzL21hcmtfbGFyZ2UucG5nXFxcIiB3aWR0aD1cXFwiNjdcXFwiIC8+XFxuICAgIDwvZGl2PlxcbiAgICA8ZGl2IGNsYXNzPVxcXCJ0aXRsZVxcXCI+XFxuICAgICAgICBTY2hlZHVsZSBhbiBFdmVudFxcbiAgICA8L2Rpdj5cXG4gICAgPGRpdiBjbGFzcz1cXFwiY29udGVudFxcXCI+XFxuICAgICAgICBXYW50IHRvIGhvc3QgYW4gZXZlbnQgYnV0IGNhbuKAmXQgZGVjaWRlIG9uIGEgZGF0ZT8gQ2xpY2sgb24gdGhlIGJ1dHRvbiBiZWxvdyB0byBzdGFydCFcXG4gICAgPC9kaXY+XFxuICAgIDxidXR0b24gbmctY2xpY2s9XFxcIm5ld0V2ZW50KClcXFwiIGNsYXNzPVxcXCJidG5cXFwiPlNjaGVkdWxlIE5ldyBFdmVudDwvYnV0dG9uPlxcbjwvZGl2PlxcblwiKTtcbiR0ZW1wbGF0ZUNhY2hlLnB1dChcInRlbXBsYXRlcy9uZXdldmVudC5odG1sXCIsXCI8ZGl2IG5nLWhpZGU9XFxcImV2ZW50VXJsXFxcIj5cXG4gICAgPGRpdiBjbGFzcz1cXFwiYm94XFxcIiBuZy1jbGFzcz1cXFwie1xcJ2FuaW1hdGVkIHNoYWtlXFwnOiBmb3JtLiRzdWJtaXR0ZWQgJiYgZm9ybS4kaW52YWxpZCB9XFxcIj5cXG5cXG4gICAgICAgIDxkaXYgY2xhc3M9XFxcImJveC10aXRsZVxcXCI+U2NoZWR1bGUgYSBOZXcgRXZlbnQ8L2Rpdj5cXG4gICAgICAgIDxkaXYgY2xhc3M9XFxcImJveC1kZXNjcmlwdGlvblxcXCI+XFxuICAgICAgICAgICAgRmlsbCBpbiB0aGUgZm9ybSBiZWxvdyB0byBjcmVhdGUgeW91ciBldmVudCBhbmQgc2hhcmUgaXQgd2l0aCB5b3VyIGZyaWVuZHMgYW5kIGNvbGxlYWd1ZXMuXFxuICAgICAgICA8L2Rpdj5cXG5cXG4gICAgICAgIDxmb3JtIG5vdmFsaWRhdGUgYXV0b2NvbXBsZXRlPVxcXCJvZmZcXFwiIG5hbWU9XFxcImZvcm1cXFwiIG5nLXN1Ym1pdD1cXFwic3VibWl0KClcXFwiPlxcbiAgICAgICAgICAgIDxzZWN0aW9uIGNsYXNzPVxcXCJib3gtc2VjdGlvblxcXCIgdXNlci1mb3JtIGZvcm09XFxcImZvcm1cXFwiIGV2ZW50PVxcXCJldmVudFxcXCI+XFxuXFxuICAgICAgICAgICAgPC9zZWN0aW9uPlxcblxcbiAgICAgICAgICAgIDxzZWN0aW9uIGNsYXNzPVxcXCJib3gtc2VjdGlvblxcXCIgZXZlbnQtZm9ybSBmb3JtPVxcXCJmb3JtXFxcIiBldmVudD1cXFwiZXZlbnRcXFwiPlxcblxcbiAgICAgICAgICAgIDwvc2VjdGlvbj5cXG5cXG4gICAgICAgICAgICA8c2VjdGlvbiBjbGFzcz1cXFwiYm94LXNlY3Rpb25cXFwiIGRhdGUtZm9ybSBmb3JtPVxcXCJmb3JtXFxcIiBldmVudD1cXFwiZXZlbnRcXFwiPlxcblxcbiAgICAgICAgICAgIDwvc2VjdGlvbj5cXG5cXG4gICAgICAgICAgICA8c2VjdGlvbiBjbGFzcz1cXFwiYm94LXNlY3Rpb25cXFwiIHBhcnRpY2lwYW50cy1mb3JtIGZvcm09XFxcImZvcm1cXFwiIGV2ZW50PVxcXCJldmVudFxcXCI+XFxuXFxuICAgICAgICAgICAgPC9zZWN0aW9uPlxcblxcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcImJveC1jb250cm9scyBib3gtYm90dG9tLXN0aWNreVxcXCI+XFxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cXFwic3VibWl0XFxcIiBjbGFzcz1cXFwiYnRuIGJ0bi1wcmltYXJ5XFxcIj5DcmVhdGUgRXZlbnQ8L2J1dHRvbj5cXG4gICAgICAgICAgICA8L2Rpdj5cXG5cXG4gICAgICAgIDwvZm9ybT5cXG4gICAgPC9kaXY+XFxuPC9kaXY+XFxuPGRpdiBuZy1zaG93PVxcXCJldmVudFVybFxcXCIgY2xhc3M9XFxcImJveCBmeC1mYWRlLXVwXFxcIj5cXG4gICAgPGRpdiBjbGFzcz1cXFwiYm94LW1lc3NhZ2VcXFwiPlxcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcIm1haW4taW1hZ2VcXFwiPlxcbiAgICAgICAgICAgICAgICA8aW1nIHNyYz1cXFwiL2ltYWdlcy9zdWNjZXNzX2xhcmdlLnBuZ1xcXCIgd2lkdGg9XFxcIjEwMFxcXCIgLz5cXG4gICAgICAgICAgICA8L2Rpdj5cXG4gICAgPGRpdiBjbGFzcz1cXFwidGl0bGVcXFwiPkV2ZW50IENyZWF0ZWQ8L2Rpdj5cXG4gICAgPGRpdiBjbGFzcz1cXFwiY29udGVudFxcXCI+XFxuICAgICAgICBZb3VyIGV2ZW50IGhhcyBiZWVuIGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5ISBZb3Ugc2hvdWxkIHJlY2VpdmUgYW4gZW1haWwgc2hvcnRseSB3aXRoIGluc3RydWN0aW9ucyB0byB2ZXJpZnkgeW91ciBlbWFpbCBhZGRyZXNzLlxcbiAgICA8L2Rpdj5cXG4gICAgPGRpdiBjbGFzcz1cXFwibWluaS1kaXZpZGVyXFxcIj5cXG4gICAgPC9kaXY+XFxuICAgIDxkaXYgY2xhc3M9XFxcImZvcm0tZ3JvdXBcXFwiPlxcbiAgICAgICAgPGlucHV0IHR5cGU9XFxcInRleHRcXFwiIGNsYXNzPVxcXCJmb3JtLWNvbnRyb2xcXFwiIGRpc2FibGVkPVxcXCJ0cnVlXFxcIiB2YWx1ZT1cXFwie3tldmVudFVybH19XFxcIiAvPlxcbiAgICAgICAgPGEgaHJlZj1cXFwie3tldmVudFVybH19XFxcIiBjbGFzcz1cXFwiYnRuIGZvcm0tYnRuXFxcIj5HTzwvYT5cXG4gICAgPC9kaXY+XFxuICAgIDwvZGl2PlxcbjwvZGl2PlxcblwiKTtcbiR0ZW1wbGF0ZUNhY2hlLnB1dChcInRlbXBsYXRlcy9ub3Rmb3VuZC5odG1sXCIsXCI8aDE+RXJyb3IgNDA0PC9oMT5cXG48aDI+Tm90IEZvdW5kPC9oMj5cXG5cIik7XG4kdGVtcGxhdGVDYWNoZS5wdXQoXCJ0ZW1wbGF0ZXMvbm90aWZpY2F0aW9uLmh0bWxcIixcIjxkaXYgY2xhc3M9XFxcIm5vdGlmaWNhdGlvbiB7e25vdGlmaWNhdGlvbi50eXBlfX1cXFwiIG5nLWNsaWNrPVxcXCJub3RpZmljYXRpb24uY2xvc2UoKVxcXCI+XFxuICAgIDxkaXYgY2xhc3M9XFxcInRpdGxlXFxcIj5cXG4gICAgICAgIHt7bm90aWZpY2F0aW9uLnRpdGxlfX1cXG4gICAgPC9kaXY+XFxuICAgIDxkaXYgY2xhc3M9XFxcIm1lc3NhZ2VcXFwiPlxcbiAgICAgICAge3tub3RpZmljYXRpb24ubWVzc2FnZX19XFxuICAgIDwvZGl2PlxcbjwvZGl2PlxcblwiKTtcbiR0ZW1wbGF0ZUNhY2hlLnB1dChcInRlbXBsYXRlcy9kaXJlY3RpdmVzL2Rpc2N1c3Npb24uaHRtbFwiLFwiPHVsIGNsYXNzPVxcXCJjb21tZW50LXRocmVhZFxcXCIgbmctc2hvdz1cXFwiZXZlbnQuY29tbWVudHMubGVuZ3RoXFxcIj5cXG4gICAgPGxpIG5nLXJlcGVhdD1cXFwiY29tbWVudCBpbiBldmVudC5jb21tZW50c1xcXCIgY2xhc3M9XFxcImNvbW1lbnRcXFwiPlxcbiAgICAgICAgPGRpdiBjbGFzcz1cXFwiYXZhdGFyLXNlY3Rpb25cXFwiPlxcbiAgICAgICAgICAgIDxpbWcgc3JjPVxcXCIvaW1hZ2VzL2F2YXRhci5wbmdcXFwiIC8+XFxuICAgICAgICA8L2Rpdj5cXG4gICAgICAgIDxkaXYgY2xhc3M9XFxcImNvbW1lbnQtc2VjdGlvblxcXCI+XFxuICAgICAgICAgICAgPGEgaHJlZj1cXFwiI1xcXCIgY2xhc3M9XFxcImNvbW1lbnQtZGVsZXRlXFxcIiBuZy1jbGljaz1cXFwiZGVsZXRlQ29tbWVudChjb21tZW50KVxcXCI+JnRpbWVzOzwvYT5cXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJtZXRhXFxcIj5cXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XFxcIm5hbWVcXFwiPnt7Y29tbWVudC5hdXRob3IubmFtZX19PC9zcGFuPlxcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cXFwidGltZVxcXCI+e3tjb21tZW50LmNyZWF0ZWQgfCBlbGFwc2VkfX08L3NwYW4+XFxuICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwiY29udGVudFxcXCI+e3tjb21tZW50LmNvbnRlbnR9fTwvZGl2PlxcbiAgICAgICAgPC9kaXY+XFxuICAgIDwvbGk+XFxuPC91bD5cXG48Zm9ybSBub3ZhbGlkYXRlIG5nLXN1Ym1pdD1cXFwicG9zdENvbW1lbnQoKVxcXCIgbmFtZT1cXFwiY29tbWVudEZvcm1cXFwiIGNsYXNzPVxcXCJjb21tZW50LWZvcm1cXFwiPlxcbiAgICA8ZGl2IGNsYXNzPVxcXCJhdmF0YXItc2VjdGlvblxcXCI+XFxuICAgICAgICA8aW1nIHNyYz1cXFwiL2ltYWdlcy9hdmF0YXIucG5nXFxcIiAvPlxcbiAgICA8L2Rpdj5cXG4gICAgPGRpdiBjbGFzcz1cXFwiaW5wdXQtc2VjdGlvbiBmb3JtLWdyb3VwXFxcIj5cXG4gICAgICAgIDxkaXYgY2xhc3M9XFxcImNvbnRlbnQtc2VjdGlvblxcXCI+XFxuICAgICAgICAgICAgPHRleHRhcmVhIGNsYXNzPVxcXCJmb3JtLWNvbnRyb2xcXFwiIHJlcXVpcmVkIG5nLW1vZGVsPVxcXCJjb21tZW50LmNvbnRlbnRcXFwiIHBsYWNlaG9sZGVyPVxcXCJXcml0ZSBhIGNvbW1lbnQuLi5cXFwiPjwvdGV4dGFyZWE+XFxuICAgICAgICA8L2Rpdj5cXG4gICAgICAgIDxkaXYgY2xhc3M9XFxcIm5hbWUtc2VjdGlvblxcXCI+XFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwibmFtZS1jb250YWluZXJcXFwiPlxcbiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cXFwidGV4dFxcXCIgY2xhc3M9XFxcImZvcm0tY29udHJvbFxcXCIgcmVxdWlyZWQgcGxhY2Vob2xkZXI9XFxcIllvdXIgTmFtZVxcXCIgbmctbW9kZWw9XFxcImNvbW1lbnQuYXV0aG9yLm5hbWVcXFwiIC8+XFxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cXFwic3VibWl0XFxcIiBjbGFzcz1cXFwiYnRuXFxcIj5Qb3N0IENvbW1lbnQ8L2J1dHRvbj5cXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XFxcImZvcm0tZXJyb3JcXFwiIG5nLXNob3c9XFxcImNvbW1lbnRGb3JtLiRzdWJtaXR0ZWQgJiYgY29tbWVudEZvcm0uJGVycm9yXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgIDxpbWcgc3JjPVxcXCIvaW1hZ2VzL2Vycm9yLnBuZ1xcXCIgd2lkdGg9XFxcIjE0XFxcIiAvPiBNYWtlIHN1cmUgeW91IGZpbGwgaW4gYWxsIHRoZSBmaWVsZHMuXFxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cXG4gICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgIDwvZGl2PlxcbiAgICA8L2Rpdj5cXG48L2Zvcm0+XFxuXCIpO1xuJHRlbXBsYXRlQ2FjaGUucHV0KFwidGVtcGxhdGVzL2RpcmVjdGl2ZXMvcG9sbC5odG1sXCIsXCI8ZGl2IGNsYXNzPVxcXCJwb2xsLWhlYWRlclxcXCI+XFxuICAgIDxkaXYgY2xhc3M9XFxcImhlYWRlciBwYXJ0aWNpcGFudHMtaGVhZGVyXFxcIj5cXG4gICAgICAgIHt7ZXZlbnQucGFydGljaXBhbnRzLmxlbmd0aH19IHBhcnRpY2lwYW50c1xcbiAgICA8L2Rpdj5cXG4gICAgPGRpdiBjbGFzcz1cXFwiaGVhZGVyIGRhdGUtaGVhZGVyXFxcIiBuZy1yZXBlYXQ9XFxcImRhdGUgaW4gZXZlbnQuZGF0ZXNcXFwiPlxcbiAgICAgICAgPGRpdiBjbGFzcz1cXFwiZGF0aWNvblxcXCI+XFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwiZG93XFxcIj5cXG4gICAgICAgICAgICAgICAge3tkYXRlIHwgZGF0ZTogXFwnRUVFXFwnfX1cXG4gICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJkYXlcXFwiPlxcbiAgICAgICAgICAgICAgICB7e2RhdGUgfCBkYXRlOiBcXCdkXFwnfX1cXG4gICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJtb250aFxcXCI+XFxuICAgICAgICAgICAgICAgIHt7ZGF0ZSB8IGRhdGUgOiBcXCdNTU1cXCd9fVxcbiAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVxcXCJjb3VudFxcXCIgbmctc2hvdz1cXFwic2VsZWN0ZWREYXRlKCRpbmRleClcXFwiIG5nLWNsYXNzPXt0b3A6aXNUb3BEYXRlKCRpbmRleCl9Pnt7c2VsZWN0ZWREYXRlKCRpbmRleCl9fTwvc3Bhbj5cXG4gICAgICAgIDwvZGl2PlxcbiAgICA8L2Rpdj5cXG4gICAgPGRpdiBjbGFzcz1cXFwiaGVhZGVyIGFjdGlvbnMtaGVhZGVyXFxcIj5cXG5cXG4gICAgPC9kaXY+XFxuPC9kaXY+XFxuPGRpdiBjbGFzcz1cXFwicG9sbC1ib2R5XFxcIj5cXG4gICAgPGRpdiBjbGFzcz1cXFwicG9sbC1lbnRyeVxcXCIgbmctcmVwZWF0PVxcXCJwYXJ0aWNpcGFudCBpbiBldmVudC5wYXJ0aWNpcGFudHNcXFwiPlxcbiAgICAgICAgPGZvcm0gbm92YWxpZGF0ZSBuZy1zdWJtaXQ9XFxcInVwZGF0ZShwYXJ0aWNpcGFudCk7IGVkaXRNb2RlID0gZmFsc2VcXFwiPlxcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcImNlbGwgbmFtZS1jZWxsXFxcIj5cXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XFxcImF2YXRhciBzdHlsZS17eyRpbmRleCArIDF9fVxcXCI+XFxuICAgICAgICAgICAgICAgICAgICA8aW1nIHNyYz1cXFwiL2ltYWdlcy91c2VyLnBuZ1xcXCIgd2lkdGg9XFxcIjExXFxcIiAvPlxcbiAgICAgICAgICAgICAgICA8L3NwYW4+XFxuICAgICAgICAgICAgICAgIDxpbnB1dCByZXF1aXJlZCBhdXRvY29tcGxldGU9XFxcIm9mZlxcXCIgdHlwZT1cXFwidGV4dFxcXCIgY2xhc3M9XFxcImZvcm0tY29udHJvbFxcXCIgbmctbW9kZWw9XFxcInBhcnRpY2lwYW50Lm5hbWVcXFwiIG5nLXNob3c9XFxcImVkaXRNb2RlXFxcIiB2YWx1ZT1cXFwicGFydGljaXBhbnQubmFtZVxcXCIvPlxcbiAgICAgICAgICAgICAgICA8c3BhbiBuZy1oaWRlPVxcXCJlZGl0TW9kZVxcXCIgY2xhc3M9XFxcIm5hbWVcXFwiIG5nLWNsaWNrPVxcXCJlZGl0TW9kZSA9IHRydWUgJiYgIWV2ZW50LmlzQ2xvc2VkOyBlZGl0KHBhcnRpY2lwYW50KVxcXCI+e3twYXJ0aWNpcGFudC5uYW1lfX08L3NwYW4+XFxuICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwiY2VsbCB2b3RlLWNlbGxcXFwiIG5nLXJlcGVhdD1cXFwiZGF0ZSBpbiBldmVudC5kYXRlc1xcXCI+XFxuICAgICAgICAgICAgICAgIDxpbWcgc3JjPVxcXCIvaW1hZ2VzL3RpY2tAMngucG5nXFxcIiAgd2lkdGg9XFxcIjE2XFxcIiBuZy1oaWRlPVxcXCJlZGl0TW9kZVxcXCIgbmctaWY9XFxcInBhcnRpY2lwYW50LmRhdGVzWyRpbmRleF1cXFwiIC8+XFxuICAgICAgICAgICAgICAgIDxpbWcgc3JjPVxcXCIvaW1hZ2VzL25vcGVAMngucG5nXFxcIiB3aWR0aD1cXFwiOFxcXCIgbmctaGlkZT1cXFwiZWRpdE1vZGVcXFwiIG5nLWlmPVxcXCIhcGFydGljaXBhbnQuZGF0ZXNbJGluZGV4XVxcXCIgLz5cXG4gICAgICAgICAgICAgICAgPGlucHV0IG5nLW1vZGVsPVxcXCJwYXJ0aWNpcGFudC5kYXRlc1skaW5kZXhdXFxcIiBuZy1zaG93PVxcXCJlZGl0TW9kZVxcXCIgbmctZmFsc2UtdmFsdWU9XFxcImZhbHNlXFxcIiB0eXBlPVxcXCJjaGVja2JveFxcXCIgLz5cXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwib3ZlcmxheVxcXCIgbmctc2hvdz1cXFwiZWRpdE1vZGVcXFwiIG5nLWNsaWNrPVxcXCJwYXJ0aWNpcGFudC5kYXRlc1skaW5kZXhdID0gIXBhcnRpY2lwYW50LmRhdGVzWyRpbmRleF1cXFwiPjwvZGl2PlxcbiAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcImNlbGwgYWN0aW9uLWNlbGxcXFwiIG5nLWhpZGU9XFxcImV2ZW50LmlzQ2xvc2VkXFxcIj5cXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVxcXCJidXR0b25cXFwiIG5nLWhpZGU9XFxcImVkaXRNb2RlXFxcIiBuZy1jbGljaz1cXFwiZWRpdE1vZGUgPSB0cnVlOyBlZGl0KHBhcnRpY2lwYW50KVxcXCIgY2xhc3M9XFxcImJ0biBob3ZlclxcXCI+RWRpdDwvYnV0dG9uPlxcbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XFxcImJ1dHRvblxcXCIgbmctaGlkZT1cXFwiZWRpdE1vZGVcXFwiIG5nLWNsaWNrPVxcXCJkZWxldGUocGFydGljaXBhbnQpXFxcIiBjbGFzcz1cXFwiYnRuIGRhbmdlciBob3ZlclxcXCI+RGVsZXRlPC9idXR0b24+XFxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cXFwic3VibWl0XFxcIiBuZy1zaG93PVxcXCJlZGl0TW9kZVxcXCIgY2xhc3M9XFxcImJ0blxcXCI+U2F2ZTwvYnV0dG9uPlxcbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XFxcImJ1dHRvblxcXCIgbmctc2hvdz1cXFwiZWRpdE1vZGVcXFwiIG5nLWNsaWNrPVxcXCJlZGl0TW9kZSA9IGZhbHNlOyBjYW5jZWwoJGluZGV4KVxcXCIgY2xhc3M9XFxcImJ0blxcXCI+Q2FuY2VsPC9idXR0b24+XFxuICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICA8L2Zvcm0+XFxuICAgIDwvZGl2PlxcbiAgICA8ZGl2IG5nLWhpZGU9XFxcImV2ZW50LmlzQ2xvc2VkXFxcIiBjbGFzcz1cXFwicG9sbC1lbnRyeSBoaWdobGlnaHRcXFwiPlxcbiAgICAgICAgPGZvcm0gbm92YWxpZGF0ZSBuYW1lPVxcXCJmb3JtbmV3XFxcIiBuZy1zdWJtaXQ9XFxcInNhdmUoKVxcXCI+XFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwiY2VsbCBuYW1lLWNlbGxcXFwiPlxcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cXFwiYXZhdGFyIHN0eWxlLXt7cGFydGljaXBhbnQuc3R5bGV9fVxcXCI+XFxuICAgICAgICAgICAgICAgICAgICA8aW1nIHNyYz1cXFwiL2ltYWdlcy91c2VyLnBuZ1xcXCIgd2lkdGg9XFxcIjExXFxcIiAvPlxcbiAgICAgICAgICAgICAgICA8L3NwYW4+XFxuICAgICAgICAgICAgICAgIDxpbnB1dCBhdXRvY29tcGxldGU9XFxcIm9mZlxcXCIgbmFtZT1cXFwidXNlcm5hbWVcXFwiIHR5cGU9XFxcInRleHRcXFwiIGNsYXNzPVxcXCJmb3JtLWNvbnRyb2xcXFwiIHBsYWNlaG9sZGVyPVxcXCJZb3VyIG5hbWUuLi5cXFwiIG5nLW1vZGVsPVxcXCJwYXJ0aWNpcGFudC5uYW1lXFxcIiByZXF1aXJlZCB2YWx1ZT1cXFwicGFydGljaXBhbnQubmFtZVxcXCIvPlxcbiAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcImNlbGwgdm90ZS1jZWxsXFxcIiBuZy1yZXBlYXQ9XFxcImRhdGUgaW4gZXZlbnQuZGF0ZXNcXFwiPlxcbiAgICAgICAgICAgICAgICA8aW5wdXQgbmctbW9kZWw9XFxcInBhcnRpY2lwYW50LmRhdGVzWyRpbmRleF1cXFwiIG5nLWZhbHNlLXZhbHVlPVxcXCJmYWxzZVxcXCIgdHlwZT1cXFwiY2hlY2tib3hcXFwiIC8+XFxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcIm92ZXJsYXlcXFwiIG5nLWNsaWNrPVxcXCJwYXJ0aWNpcGFudC5kYXRlc1skaW5kZXhdID0gIXBhcnRpY2lwYW50LmRhdGVzWyRpbmRleF1cXFwiPjwvZGl2PlxcbiAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcImNlbGwgYWN0aW9uLWNlbGxcXFwiPlxcbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XFxcInN1Ym1pdFxcXCIgbmctY2xhc3M9XFxcInsgXFwnYW5pbWF0ZWQgc2hha2VcXCcgOiBmb3JtbmV3LiRzdWJtaXR0ZWQgJiYgZm9ybW5ldy4kaW52YWxpZCAgfVxcXCIgY2xhc3M9XFxcImJ0blxcXCI+U2F2ZTwvYnV0dG9uPlxcbiAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgPC9mb3JtPlxcbiAgICA8L2Rpdj5cXG48L2Rpdj5cXG5cIik7XG4kdGVtcGxhdGVDYWNoZS5wdXQoXCJ0ZW1wbGF0ZXMvZGlyZWN0aXZlcy9ldmVudEZvcm0vZGF0ZUZvcm0uaHRtbFwiLFwiPGRpdiBjbGFzcz1cXFwic2VjdGlvbi1kZXRhaWxzXFxcIj5cXG4gICAgPGRpdiBjbGFzcz1cXFwic2VjdGlvbi10aXRsZVxcXCI+Q2hvb3NlIERhdGVzPC9kaXY+XFxuICAgIDx1bCBjbGFzcz1cXFwiZGF0aWNvbi1saXN0XFxcIj5cXG4gICAgICAgIDxsaSBuZy1yZXBlYXQ9XFxcImRhdGUgaW4gZXZlbnQuZGF0ZXNcXFwiPlxcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcImRhdGljb25cXFwiPlxcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJkb3dcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAge3tkYXRlIHwgZGF0ZTogXFwnRUVFXFwnfX1cXG4gICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcImRheVxcXCI+XFxuICAgICAgICAgICAgICAgICAgICB7e2RhdGUgfCBkYXRlOiBcXCdkXFwnfX1cXG4gICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcIm1vbnRoXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgIHt7ZGF0ZSB8IGRhdGUgOiBcXCdNTU1cXCd9fVxcbiAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XFxcImRlbGV0ZVxcXCIgbmctY2xpY2s9XFxcImRhdGVwaWNrZXIudW5zZXREYXRlKGRhdGUpXFxcIj48L3NwYW4+XFxuICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICA8L2xpPlxcbiAgICA8L3VsPlxcbjwvZGl2PlxcbjxkaXYgY2xhc3M9XFxcInNlY3Rpb24tbWFpblxcXCI+XFxuICAgIDxkaXYgY2xhc3M9XFxcImZvcm0tcm93XFxcIj5cXG4gICAgICAgIDxkaXYgY2xhc3M9XFxcImZvcm0tZ3JvdXBcXFwiPlxcbiAgICAgICAgICAgIDxsYWJlbCBmb3I9XFxcImVtYWlsXFxcIj5DYWxlbmRhcjwvbGFiZWw+XFxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XFxcImZvcm0tZXJyb3JcXFwiIG5nLXNob3c9XFxcIihmb3JtLmRhdGVwaWNrZXIuJGRpcnR5IHx8IGZvcm0uJHN1Ym1pdHRlZCkgJiYgZm9ybS5kYXRlcGlja2VyLiRlcnJvci5yZXF1aXJlZFxcXCI+XFxuICAgICAgICAgICAgICAgIDxpbWcgc3JjPVxcXCIvaW1hZ2VzL2Vycm9yLnBuZ1xcXCIgd2lkdGg9XFxcIjE0XFxcIiAvPiBZb3UgbmVlZCB0byBzZWxlY3QgYSBmZXcgZGF0ZXNcXG4gICAgICAgICAgICA8L3NwYW4+XFxuICAgICAgICAgICAgPGRpdiBkYXRlcGlja2VyIHJlcXVpcmVkIG5hbWU9XFxcImRhdGVwaWNrZXJcXFwiIGNvbnRyb2w9XFxcImRhdGVwaWNrZXJcXFwiIG5nLW1vZGVsPVxcXCJldmVudC5kYXRlc1xcXCI+XFxuXFxuICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICA8L2Rpdj5cXG4gICAgPC9kaXY+XFxuPC9kaXY+XFxuXCIpO1xuJHRlbXBsYXRlQ2FjaGUucHV0KFwidGVtcGxhdGVzL2RpcmVjdGl2ZXMvZXZlbnRGb3JtL2V2ZW50Rm9ybS5odG1sXCIsXCI8ZGl2IGNsYXNzPVxcXCJzZWN0aW9uLWRldGFpbHNcXFwiPlxcbiAgICA8ZGl2IGNsYXNzPVxcXCJzZWN0aW9uLXRpdGxlXFxcIj5FdmVudCBEZXRhaWxzPC9kaXY+XFxuPC9kaXY+XFxuPGRpdiBjbGFzcz1cXFwic2VjdGlvbi1tYWluXFxcIj5cXG4gICAgPGRpdiBjbGFzcz1cXFwiZm9ybS1yb3dcXFwiPlxcbiAgICAgICAgPGRpdiBjbGFzcz1cXFwiZm9ybS1jb2xcXFwiPlxcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcImZvcm0tZ3JvdXBcXFwiPlxcbiAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVxcXCJ0aXRsZVxcXCI+VGl0bGU8L2xhYmVsPlxcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cXFwiZm9ybS1lcnJvclxcXCIgbmctc2hvdz1cXFwiKGZvcm0udGl0bGUuJHRvdWNoZWQgfHwgZm9ybS4kc3VibWl0dGVkKSAmJiBlcnJvcnMudGl0bGVcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgPGltZyBzcmM9XFxcIi9pbWFnZXMvZXJyb3IucG5nXFxcIiB3aWR0aD1cXFwiMTRcXFwiIC8+IHt7ZXJyb3JzLnRpdGxlfX1cXG4gICAgICAgICAgICAgICAgPC9zcGFuPlxcbiAgICAgICAgICAgICAgICA8aW5wdXQgaWQ9XFxcInRpdGxlXFxcIiBuYW1lPVxcXCJ0aXRsZVxcXCIgbmctbWF4bGVuZ3RoPVxcXCIzMFxcXCIgcmVxdWlyZWQgbmctbW9kZWw9XFxcImV2ZW50LnRpdGxlXFxcIiB0eXBlPVxcXCJ0ZXh0XFxcIiBwbGFjZWhvbGRlcj1cXFwiTW9udGhseSBNZWV0dXAuLi5cXFwiIGNsYXNzPVxcXCJmb3JtLWNvbnRyb2wgZXh0ZW5kXFxcIi8+XFxuICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICA8L2Rpdj5cXG4gICAgICAgIDxkaXYgY2xhc3M9XFxcImZvcm0tY29sXFxcIj5cXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJmb3JtLWdyb3VwIG9wdGlvbmFsXFxcIj5cXG4gICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cXFwibG9jYXRpb25cXFwiPkxvY2F0aW9uPC9sYWJlbD5cXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XFxcImZvcm0tZXJyb3JcXFwiIG5nLXNob3c9XFxcIihmb3JtLmxvY2F0aW9uLiR0b3VjaGVkIHx8IGZvcm0uJHN1Ym1pdHRlZCkgJiYgZXJyb3JzLmxvY2F0aW9uXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgIDxpbWcgc3JjPVxcXCIvaW1hZ2VzL2Vycm9yLnBuZ1xcXCIgd2lkdGg9XFxcIjE0XFxcIiAvPiB7e2Vycm9ycy5sb2NhdGlvbn19XFxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cXG4gICAgICAgICAgICAgICAgPGlucHV0IGlkPVxcXCJsb2NhdGlvblxcXCIgbmFtZT1cXFwibG9jYXRpb25cXFwiIG5nLW1vZGVsPVxcXCJldmVudC5sb2NhdGlvblxcXCIgbmctbWF4bGVuZ3RoPVxcXCI1MFxcXCIgdHlwZT1cXFwidGV4dFxcXCIgcGxhY2Vob2xkZXI9XFxcIlJpY2tcXCdzIENhZmUuLi5cXFwiIGNsYXNzPVxcXCJmb3JtLWNvbnRyb2wgZXh0ZW5kXFxcIi8+XFxuICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICA8L2Rpdj5cXG4gICAgPC9kaXY+XFxuICAgIDxkaXYgY2xhc3M9XFxcImZvcm0tcm93XFxcIj5cXG4gICAgICAgIDxkaXYgY2xhc3M9XFxcImZvcm0tZ3JvdXAgb3B0aW9uYWxcXFwiPlxcbiAgICAgICAgICAgIDxsYWJlbCBmb3I9XFxcImRlc2NyaXB0aW9uXFxcIiA+RGVzY3JpcHRpb248L2xhYmVsPlxcbiAgICAgICAgICAgIDx0ZXh0YXJlYSBpZD1cXFwiZGVzY3JpcHRpb25cXFwiIG5hbWU9XFxcImRlc2NyaXB0aW9uXFxcIiBuZy1tb2RlbD1cXFwiZXZlbnQuZGVzY3JpcHRpb25cXFwiIHBsYWNlaG9sZGVyPVxcXCJFbnRlciBEZXNjcmlwdGlvbi4uLlxcXCIgY2xhc3M9XFxcImZvcm0tY29udHJvbCBleHRlbmRcXFwiPjwvdGV4dGFyZWE+XFxuICAgICAgICA8L2Rpdj5cXG4gICAgPC9kaXY+XFxuPC9kaXY+XFxuXCIpO1xuJHRlbXBsYXRlQ2FjaGUucHV0KFwidGVtcGxhdGVzL2RpcmVjdGl2ZXMvZXZlbnRGb3JtL3BhcnRpY2lwYW50c0Zvcm0uaHRtbFwiLFwiPGRpdiBjbGFzcz1cXFwic2VjdGlvbi1kZXRhaWxzXFxcIj5cXG4gICAgPGRpdiBjbGFzcz1cXFwic2VjdGlvbi10aXRsZVxcXCI+SW52aXRlIFBhcnRpY2lwYW50czwvZGl2PlxcbjwvZGl2PlxcbjxkaXYgY2xhc3M9XFxcInNlY3Rpb24tbWFpblxcXCI+XFxuICAgIDxkaXYgY2xhc3M9XFxcImZvcm0tcm93XFxcIj5cXG4gICAgICAgIDxkaXYgY2xhc3M9XFxcImZvcm0tZ3JvdXAgb3B0aW9uYWxcXFwiPlxcbiAgICAgICAgICAgIDxsYWJlbD5QYXJ0aWNpcGFudFxcJ3MgRW1haWxzPC9sYWJlbD5cXG4gICAgICAgICAgICAgICAgPHRhZ3MtaW5wdXQgbWF4LWxlbmd0aD1cXFwiNTBcXFwiIGFsbG93ZWQtdGFncy1wYXR0ZXJuPVxcXCJ7e2VtYWlsUmVnZXh9fVxcXCIgZGlzcGxheS1wcm9wZXJ0eT1cXFwiZW1haWxcXFwiIG5nLW1vZGVsPVxcXCJldmVudC5lbWFpbHNcXFwiIHBsYWNlaG9sZGVyPVxcXCJBZGQgYW4gRW1haWxcXFwiIHR5cGU9XFxcImVtYWlsXFxcIiBhdXRvY29tcGxldGU9XFxcIm9mZlxcXCI+PC90YWdzLWlucHV0PlxcbiAgICAgICAgPC9kaXY+XFxuICAgIDwvZGl2PlxcbjwvZGl2Plxcbjwvc2VjdGlvbj5cXG5cIik7XG4kdGVtcGxhdGVDYWNoZS5wdXQoXCJ0ZW1wbGF0ZXMvZGlyZWN0aXZlcy9ldmVudEZvcm0vc2V0dGluZ3NGb3JtLmh0bWxcIixcIjxkaXYgY2xhc3M9XFxcInNlY3Rpb24tZGV0YWlsc1xcXCI+XFxuICAgIDxkaXYgY2xhc3M9XFxcInNlY3Rpb24tdGl0bGVcXFwiPlNldHRpbmdzPC9kaXY+XFxuPC9kaXY+XFxuPGRpdiBjbGFzcz1cXFwic2VjdGlvbi1tYWluXFxcIj5cXG4gICAgPGRpdiBjbGFzcz1cXFwic3dpdGNoLXJvd1xcXCI+XFxuICAgICAgICA8ZGl2IGNsYXNzPVxcXCJzd2l0Y2gtZGV0YWlsc1xcXCI+XFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwidGl0bGVcXFwiPlxcbiAgICAgICAgICAgICAgICBQb2xsIFN0YXR1c1xcbiAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcImRlc2NyaXB0aW9uXFxcIj5cXG4gICAgICAgICAgICAgICAgTGV0IHBlb3BsZSB2b3RlIG9uIHRoZSBwb2xsLlxcbiAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgPC9kaXY+XFxuICAgICAgICA8ZGl2IGNsYXNzPVxcXCJzd2l0Y2hcXFwiPlxcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcInN3aXRjaC12YWx1ZVxcXCI+XFxuICAgICAgICAgICAgICAgIHt7ZXZlbnQuaXNDbG9zZWQgPyBcXCdDbG9zZWRcXCcgOiBcXCdPcGVuXFwnIH19XFxuICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgPGRpdiBzd2l0Y2gtdG9nZ2xlIG5nLW1vZGVsPVxcXCJldmVudC5pc0Nsb3NlZFxcXCIgaW52ZXJ0PlxcbiAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgPC9kaXY+XFxuICAgIDwvZGl2PlxcbiAgICA8ZGl2IGNsYXNzPVxcXCJzd2l0Y2gtcm93XFxcIj5cXG4gICAgICAgIDxkaXYgY2xhc3M9XFxcInN3aXRjaC1kZXRhaWxzXFxcIj5cXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJ0aXRsZVxcXCI+XFxuICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbnNcXG4gICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJkZXNjcmlwdGlvblxcXCI+XFxuICAgICAgICAgICAgICAgIFNlbmQgZW1haWwgbm90aWZpY2F0aW9ucyB0byB0aGUgY3JlYXRvciBvZiB0aGlzIGV2ZW50LlxcbiAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgPC9kaXY+XFxuICAgICAgICA8ZGl2IGNsYXNzPVxcXCJzd2l0Y2hcXFwiPlxcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcInN3aXRjaC12YWx1ZVxcXCI+XFxuICAgICAgICAgICAgICAgIHt7ZXZlbnQuY3JlYXRvci5hbGxvd05vdGlmaWNhdGlvbnMgPyBcXCdFbmFibGVkXFwnIDogXFwnRGlzYWJsZWRcXCcgfX1cXG4gICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICA8ZGl2IHN3aXRjaC10b2dnbGUgbmctbW9kZWw9XFxcImV2ZW50LmNyZWF0b3IuYWxsb3dOb3RpZmljYXRpb25zXFxcIj5cXG4gICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgIDwvZGl2PlxcbiAgICA8L2Rpdj5cXG4gICAgPGRpdiBjbGFzcz1cXFwic3dpdGNoLXJvd1xcXCI+XFxuICAgICAgICA8ZGl2IGNsYXNzPVxcXCJzd2l0Y2gtZGV0YWlsc1xcXCI+XFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwidGl0bGVcXFwiPlxcbiAgICAgICAgICAgICAgICBEZWxldGUgRXZlbnRcXG4gICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJkZXNjcmlwdGlvblxcXCI+XFxuICAgICAgICAgICAgICAgIE9uY2UgeW91IGRlbGV0ZSBhbiBldmVudCBpdCB3aWxsIG5vIGxvbmdlciBiZSBhY2Nlc3NpYmxlLlxcbiAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgPC9kaXY+XFxuICAgICAgICA8ZGl2IGNsYXNzPVxcXCJzd2l0Y2hcXFwiPlxcbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cXFwiYnV0dG9uXFxcIiBuZy1jbGljaz1cXFwiZGVsZXRlRXZlbnQoKVxcXCIgY2xhc3M9XFxcImJ0biBkYW5nZXJcXFwiPkRlbGV0ZSBFdmVudDwvYnV0dG9uPlxcbiAgICAgICAgPC9kaXY+XFxuICAgIDwvZGl2PlxcbjwvZGl2Plxcbjwvc2VjdGlvbj5cXG5cIik7XG4kdGVtcGxhdGVDYWNoZS5wdXQoXCJ0ZW1wbGF0ZXMvZGlyZWN0aXZlcy9ldmVudEZvcm0vdXNlckZvcm0uaHRtbFwiLFwiPGRpdiBjbGFzcz1cXFwic2VjdGlvbi1kZXRhaWxzXFxcIj5cXG4gICAgPGRpdiBjbGFzcz1cXFwic2VjdGlvbi10aXRsZVxcXCI+WW91ciBEZXRhaWxzPC9kaXY+XFxuPC9kaXY+XFxuPGRpdiBjbGFzcz1cXFwic2VjdGlvbi1tYWluXFxcIj5cXG4gICAgPGRpdiBjbGFzcz1cXFwiZm9ybS1yb3dcXFwiPlxcbiAgICAgICAgPGRpdiBjbGFzcz1cXFwiZm9ybS1jb2xcXFwiPlxcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcImZvcm0tZ3JvdXBcXFwiPlxcbiAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVxcXCJuYW1lXFxcIj5OYW1lPC9sYWJlbD5cXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XFxcImZvcm0tZXJyb3JcXFwiIG5nLXNob3c9XFxcIihmb3JtLm5hbWUuJHRvdWNoZWQgfHwgZm9ybS4kc3VibWl0dGVkKSAmJiBlcnJvcnMubmFtZVxcXCI+XFxuICAgICAgICAgICAgICAgICAgICA8aW1nIHNyYz1cXFwiL2ltYWdlcy9lcnJvci5wbmdcXFwiIHdpZHRoPVxcXCIxNFxcXCIgLz4ge3tlcnJvcnMubmFtZX19XFxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cXG4gICAgICAgICAgICAgICAgPGlucHV0IGlkPVxcXCJuYW1lXFxcIiBuYW1lPVxcXCJuYW1lXFxcIiBuZy1tYXhsZW5ndGg9XFxcIjMwXFxcIiByZXF1aXJlZCBuZy1tb2RlbD1cXFwiZXZlbnQuY3JlYXRvci5uYW1lXFxcIiB0eXBlPVxcXCJ0ZXh0XFxcIiBwbGFjZWhvbGRlcj1cXFwiSm9obiBEb2UuLi5cXFwiIGNsYXNzPVxcXCJmb3JtLWNvbnRyb2wgZXh0ZW5kXFxcIi8+XFxuICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICA8L2Rpdj5cXG4gICAgICAgIDxkaXYgY2xhc3M9XFxcImZvcm0tY29sXFxcIj5cXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJmb3JtLWdyb3VwXFxcIj5cXG4gICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cXFwiZW1haWxcXFwiPkVtYWlsPC9sYWJlbD5cXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XFxcImZvcm0tZXJyb3JcXFwiIG5nLXNob3c9XFxcIihmb3JtLmVtYWlsLiR0b3VjaGVkIHx8IGZvcm0uJHN1Ym1pdHRlZCkgJiYgZXJyb3JzLmVtYWlsXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgIDxpbWcgc3JjPVxcXCIvaW1hZ2VzL2Vycm9yLnBuZ1xcXCIgd2lkdGg9XFxcIjE0XFxcIiAvPiB7e2Vycm9ycy5lbWFpbH19XFxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cXG4gICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XFxcImVtYWlsXFxcIiBpZD1cXFwiZW1haWxcXFwiIG5hbWU9XFxcImVtYWlsXFxcIiBuZy1wYXR0ZXJuPVxcXCJlbWFpbFJlZ2V4XFxcIiByZXF1aXJlZCBuZy1tb2RlbD1cXFwiZXZlbnQuY3JlYXRvci5lbWFpbFxcXCIgcGxhY2Vob2xkZXI9XFxcImpvaG4uZG9lQGVtYWlsLmNvbS4uLlxcXCIgY2xhc3M9XFxcImZvcm0tY29udHJvbCBleHRlbmRcXFwiLz5cXG4gICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgIDwvZGl2PlxcbiAgICA8L2Rpdj5cXG48L2Rpdj5cXG5cIik7fV0pOyIsImFuZ3VsYXIubW9kdWxlKCdyYWxsbHknKVxuLmNvbnRyb2xsZXIoJ0Fib3V0Q3RybCcsIGZ1bmN0aW9uKFRpdGxlKXtcbiAgICBUaXRsZS5zZXQoJ0Fib3V0IFJhbGxseScpXG59KTtcbiIsImFuZ3VsYXIubW9kdWxlKCdyYWxsbHknKVxuLmNvbnRyb2xsZXIoJ0FjY291bnRDdHJsJywgZnVuY3Rpb24oJHNjb3BlLCBDb25maXJtTW9kYWwpe1xuICAgICRzY29wZS5zaG93Tm90aWNlID0gZnVuY3Rpb24oKXtcbiAgICAgICAgXG4gICAgfVxufSlcbiIsImFuZ3VsYXIubW9kdWxlKCdyYWxsbHknKVxuLmNvbnRyb2xsZXIoJ0RlbGV0aW9uQ3RybCcsIGZ1bmN0aW9uKCRzdGF0ZSwgTm90aWZpY2F0aW9uLCBFdmVudCl7XG4gICAgRXZlbnQuZGVzdHJveSh7aWQgOiAkc3RhdGUucGFyYW1zLmlkLCBjb2RlIDokc3RhdGUucGFyYW1zLmNvZGV9LCBmdW5jdGlvbigpe1xuICAgICAgICB2YXIgbm90aWZpY2F0aW9uID0gbmV3IE5vdGlmaWNhdGlvbih7XG4gICAgICAgICAgICB0aXRsZSA6ICdFdmVudCBkZWxldGVkJyxcbiAgICAgICAgICAgIG1lc3NhZ2UgOiAnVGhpcyBldmVudCBoYXMgYmVlbiBkZWxldGVkJyxcbiAgICAgICAgICAgIHR5cGUgOiAnc3VjY2VzcycsXG4gICAgICAgICAgICB0aW1lb3V0IDogNTAwMFxuICAgICAgICB9KTtcbiAgICB9LCBmdW5jdGlvbihlKXtcbiAgICAgICAgdmFyIG5vdGlmaWNhdGlvbiA9IG5ldyBOb3RpZmljYXRpb24oe1xuICAgICAgICAgICAgdGl0bGUgOiAnRGVsZXRpb24gRmFpbGVkJyxcbiAgICAgICAgICAgIG1lc3NhZ2UgOiAnVGhlIGV2ZW50IGNvdWxkIG5vdCBiZSBkZWxldGVkLiBNYWtlIHN1cmUgdGhhdCBpdCBleGlzdHMgYW5kIHRoYXQgdGhlIHVybCBpcyBjb3JyZWN0JyxcbiAgICAgICAgICAgIHR5cGUgOiAnZXJyb3InXG4gICAgICAgIH0pO1xuICAgIH0pO1xuICAgICRzdGF0ZS5nbygnZXZlbnQnLCB7IGlkIDogJHN0YXRlLnBhcmFtcy5pZCB9KTtcbn0pO1xuIiwiYW5ndWxhci5tb2R1bGUoJ3JhbGxseScpXG4uY29udHJvbGxlcignRWRpdEV2ZW50Q3RybCcsIGZ1bmN0aW9uKCRzY29wZSwgJGh0dHAsICRzdGF0ZSwgJHRpbWVvdXQsIEV2ZW50LCBDb25maXJtTW9kYWwsIE5vdGlmaWNhdGlvbiwgVGl0bGUpe1xuICAgIHZhciBpZCA9ICRzdGF0ZS5wYXJhbXMuaWRcbiAgICAkc2NvcGUuZXZlbnQgPSBFdmVudC5nZXQoe2lkOmlkfSwgZnVuY3Rpb24oZGF0YSl7XG4gICAgICAgIFRpdGxlLnNldChcIkVkaXQ6IFwiICsgJHNjb3BlLmV2ZW50LnRpdGxlKTtcbiAgICAgICAgJHNjb3BlLm1hc3RlciA9IGFuZ3VsYXIuY29weSgkc2NvcGUuZXZlbnQpO1xuICAgIH0sIGZ1bmN0aW9uKGUpe1xuICAgICAgICAkc3RhdGUuZ28oJ25vdGZvdW5kJyk7XG4gICAgfSk7XG4gICAgJHNjb3BlLnVuZG9DaGFuZ2VzID0gZnVuY3Rpb24oKXtcbiAgICAgICAgJHNjb3BlLmV2ZW50ID0gYW5ndWxhci5jb3B5KCRzY29wZS5tYXN0ZXIpO1xuICAgIH1cbiAgICAkc2NvcGUuZGlkQ2hhbmdlID0gZnVuY3Rpb24oKXtcbiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KCRzY29wZS5tYXN0ZXIpICE9IEpTT04uc3RyaW5naWZ5KCRzY29wZS5ldmVudCk7XG4gICAgfVxuICAgICRzY29wZS5kaWRDaGFuZ2VEYXRlcyA9IGZ1bmN0aW9uKCl7XG4gICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSgkc2NvcGUubWFzdGVyLmRhdGVzKSAhPSBKU09OLnN0cmluZ2lmeSgkc2NvcGUuZXZlbnQuZGF0ZXMpO1xuICAgIH1cbiAgICAkc2NvcGUuc3VibWl0ID0gZnVuY3Rpb24oKXtcbiAgICAgICAgaWYgKCRzY29wZS5mb3JtLiR2YWxpZCl7XG4gICAgICAgICAgICBpZiAoJHNjb3BlLmRpZENoYW5nZURhdGVzKCkgKXtcbiAgICAgICAgICAgICAgICB2YXIgbW9kYWwgPSBuZXcgQ29uZmlybU1vZGFsKHtcbiAgICAgICAgICAgICAgICAgICAgdGl0bGUgOiAnSG9sZCB1cCEnLFxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlIDogJ0NoYW5naW5nIHRoZSBkYXRlcyB3aWxsIHJlc2V0IGFsbCBlbnRyaWVzIGJ5IHRoZSBwYXJ0aWNpcGFudHMuIEFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBkbyB0aGF0PycsXG4gICAgICAgICAgICAgICAgICAgIGNvbmZpcm1UZXh0IDogJ1llcywgSVxcJ20gc3VyZScsXG4gICAgICAgICAgICAgICAgICAgIGlzRGVzdHJ1Y3RpdmUgOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBjb25maXJtIDogZnVuY3Rpb24oKXtcbiAgICAgICAgICAgICAgICAgICAgICAgICRzY29wZS5ldmVudC5wYXJ0aWNpcGFudHMgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZSgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdXBkYXRlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2YXIgbm90aWZpY2F0aW9uID0gbmV3IE5vdGlmaWNhdGlvbih7XG4gICAgICAgICAgICAgICAgdGl0bGUgOiAnTm90IHNvIGZhc3QnLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2UgOiAnTWFrZSBzdXJlIHlvdSBmaWxsIGluIGFsbCB0aGUgcmVxdWlyZWQgZmllbGRzIGFuZCB0cnkgYWdhaW4uJyxcbiAgICAgICAgICAgICAgICB0eXBlIDogJ2Vycm9yJ1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdmFyIHVwZGF0ZSA9IGZ1bmN0aW9uKCl7XG4gICAgICAgIEV2ZW50LnVwZGF0ZSh7XG4gICAgICAgICAgICBpZCA6IGlkXG4gICAgICAgIH0sICRzY29wZS5ldmVudCxcbiAgICAgICAgZnVuY3Rpb24oKXtcbiAgICAgICAgICAgIHZhciBub3RpZmljYXRpb24gPSBuZXcgTm90aWZpY2F0aW9uKHtcbiAgICAgICAgICAgICAgICB0aXRsZSA6ICdDaGFuZ2VzIFNhdmVkJyxcbiAgICAgICAgICAgICAgICBtZXNzYWdlIDogJ1lvdXIgY2hhbmdlcyBoYXZlIGJlZW4gc2F2ZWQgc3VjY2Vzc2Z1bGx5LicsXG4gICAgICAgICAgICAgICAgdHlwZSA6ICdzdWNjZXNzJ1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAkc2NvcGUubWFzdGVyID0gYW5ndWxhci5jb3B5KCRzY29wZS5ldmVudCk7XG4gICAgICAgIH0pO1xuICAgIH1cbn0pO1xuIiwiYW5ndWxhci5tb2R1bGUoJ3JhbGxseScpXG4uY29udHJvbGxlcignRXZlbnRDdHJsJywgZnVuY3Rpb24oJHNjb3BlLCAkaHR0cCwgJHN0YXRlLCBUaXRsZSwgRXZlbnQsIENvbmZpcm1Nb2RhbCl7XG4gICAgdmFyIGlkID0gJHN0YXRlLnBhcmFtcy5pZDtcbiAgICAkc2NvcGUuZXZlbnQgPSBFdmVudC5nZXQoe2lkOmlkfSwgZnVuY3Rpb24oZGF0YSl7XG4gICAgICAgIFRpdGxlLnNldCgkc2NvcGUuZXZlbnQudGl0bGUpO1xuICAgICAgICAkc2NvcGUuZXZlbnRVcmwgPSAkc3RhdGUuaHJlZignZXZlbnQnLCB7XG4gICAgICAgICAgICBpZDogJHNjb3BlLmV2ZW50Ll9pZFxuICAgICAgICB9LCB7XG4gICAgICAgICAgICBhYnNvbHV0ZSA6IHRydWVcbiAgICAgICAgfSk7XG4gICAgfSwgZnVuY3Rpb24oZSl7XG4gICAgICAgICRzdGF0ZS5nbygnbm90Zm91bmQnKTtcbiAgICB9KTtcblxuICAgICRzY29wZS5vcGVuRXZlbnQgPSBmdW5jdGlvbigpe1xuICAgICAgICAkc2NvcGUuZXZlbnQuaXNDbG9zZWQgPSBmYWxzZTtcbiAgICAgICAgRXZlbnQudXBkYXRlKHtcbiAgICAgICAgICAgIGlkIDogaWRcbiAgICAgICAgfSwgJHNjb3BlLmV2ZW50LFxuICAgICAgICBmdW5jdGlvbigpe1xuICAgICAgICAgICAgdmFyIG1vZGFsID0gbmV3IENvbmZpcm1Nb2RhbCh7XG4gICAgICAgICAgICAgICAgdGl0bGUgOiAnRXZlbnQgT3BlbicsXG4gICAgICAgICAgICAgICAgbWVzc2FnZSA6ICdQZW9wbGUgY2FuIHZvdGUgYW5kIGNvbW1lbnQgb24gdGhpcyBldmVudC4nLFxuICAgICAgICAgICAgICAgIGNhbmNlbFRleHQgOiAnT0snLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgICRzY29wZS5jbG9zZUV2ZW50ID0gZnVuY3Rpb24oKXtcbiAgICAgICAgJHNjb3BlLmV2ZW50LmlzQ2xvc2VkID0gdHJ1ZTtcbiAgICAgICAgRXZlbnQudXBkYXRlKHtcbiAgICAgICAgICAgIGlkIDogaWRcbiAgICAgICAgfSwgJHNjb3BlLmV2ZW50LFxuICAgICAgICBmdW5jdGlvbigpe1xuICAgICAgICAgICAgdmFyIG1vZGFsID0gbmV3IENvbmZpcm1Nb2RhbCh7XG4gICAgICAgICAgICAgICAgdGl0bGUgOiAnRXZlbnQgQ2xvc2VkJyxcbiAgICAgICAgICAgICAgICBtZXNzYWdlIDogJ1Blb3BsZSBjYW4gbm8gbG9uZ2VyIHZvdGUgb3IgY29tbWVudCBvbiB0aGlzIGV2ZW50LicsXG4gICAgICAgICAgICAgICAgY2FuY2VsVGV4dCA6ICdPSycsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgJHNjb3BlLmVkaXRFdmVudCA9IGZ1bmN0aW9uKCl7XG4gICAgICAgICRzdGF0ZS5nbygnZWRpdGV2ZW50JywgeyBpZCA6ICRzY29wZS5ldmVudC5faWQgfSk7XG4gICAgfVxuXG59KTtcbiIsImFuZ3VsYXIubW9kdWxlKCdyYWxsbHknKVxuLmNvbnRyb2xsZXIoJ0hvbWVDdHJsJywgZnVuY3Rpb24oJHNjb3BlLCAkc3RhdGUsIFRpdGxlKXtcbiAgICBUaXRsZS5zZXQoJ1JhbGxseSAtIENvbGxhYm9yYXRpdmUgU2NoZWR1bGluZycpXG5cbiAgICAkc2NvcGUubmV3RXZlbnQgPSBmdW5jdGlvbigpe1xuICAgICAgICAkc3RhdGUuZ28oJ25ld2V2ZW50Jyk7XG4gICAgfVxufSk7XG4iLCJhbmd1bGFyLm1vZHVsZSgncmFsbGx5Jylcbi5jb250cm9sbGVyKCdOYXZpZ2F0aW9uQ3RybCcsIGZ1bmN0aW9uKCRzY29wZSwgJGxvY2F0aW9uKXtcbiAgICAkc2NvcGUuaXNBY3RpdmUgPSBmdW5jdGlvbihwYXRoKSB7XG4gICAgICAgIGlmICgkbG9jYXRpb24ucGF0aCgpID09IHBhdGgpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgIH1cbiAgICB9XG59KVxuIiwiYW5ndWxhci5tb2R1bGUoJ3JhbGxseScpXG4uY29udHJvbGxlcignTmV3RXZlbnRDdHJsJywgZnVuY3Rpb24oJHNjb3BlLCAkaHR0cCwgJHN0YXRlLCBFdmVudCwgQ29uZmlybU1vZGFsLCBOb3RpZmljYXRpb24pe1xuXG4gICAgJHNjb3BlLnRpdGxlID0gXCJTY2hlZHVsZSBhIE5ldyBFdmVudFwiO1xuICAgICRzY29wZS5kZXNjcmlwdGlvbiA9IFwiRmlsbCBpbiB0aGUgZm9ybSBiZWxvdyB0byBjcmVhdGUgeW91ciBldmVudCBhbmQgc2hhcmUgaXQgd2l0aCB5b3VyIGZyaWVuZHMgYW5kIGNvbGxlYWd1ZXMuXCI7XG5cbiAgICAkc2NvcGUuc3VibWl0ID0gZnVuY3Rpb24oKXtcbiAgICAgICAgaWYgKCRzY29wZS5mb3JtLiR2YWxpZCl7XG4gICAgICAgICAgICAkaHR0cC5wb3N0KCcvYXBpL2V2ZW50JywgJHNjb3BlLmV2ZW50KVxuICAgICAgICAgICAgLnN1Y2Nlc3MoZnVuY3Rpb24oZXZlbnQsIHN0YXR1cywgaGVhZGVycywgY29uZmlnKXtcbiAgICAgICAgICAgICAgICAkc2NvcGUuZXZlbnQgPSBldmVudDtcbiAgICAgICAgICAgICAgICAkc2NvcGUuZXZlbnRVcmwgPSAkc3RhdGUuaHJlZignZXZlbnQnLCB7XG4gICAgICAgICAgICAgICAgICAgIGlkOiAkc2NvcGUuZXZlbnQuX2lkXG4gICAgICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgICAgICBhYnNvbHV0ZSA6IHRydWVcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuZXJyb3IoZnVuY3Rpb24oKXtcbiAgICAgICAgICAgICAgICB2YXIgbW9kYWwgPSBuZXcgQ29uZmlybU1vZGFsKHtcbiAgICAgICAgICAgICAgICAgICAgdGl0bGUgOiAnVWggb2ghJyxcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA6ICdUaGVyZSB3YXMgYW4gZXJyb3IgY3JlYXRpbmcgeW91ciBldmVudC4gUGxlYXNlIHRyeSBhZ2FpbiBsYXRlci4nLFxuICAgICAgICAgICAgICAgICAgICBjYW5jZWxUZXh0IDogJ09LJ1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2YXIgbm90aWZpY2F0aW9uID0gbmV3IE5vdGlmaWNhdGlvbih7XG4gICAgICAgICAgICAgICAgdGl0bGUgOiAnTm90IHNvIGZhc3QnLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2UgOiAnTWFrZSBzdXJlIHlvdSBmaWxsIGluIGFsbCB0aGUgcmVxdWlyZWQgZmllbGRzIGFuZCB0cnkgYWdhaW4uJyxcbiAgICAgICAgICAgICAgICB0eXBlIDogJ2Vycm9yJ1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAkc2NvcGUuY2xlYXJEYXRlcyA9IG51bGxcbn0pO1xuIiwiYW5ndWxhci5tb2R1bGUoJ3JhbGxseScpXG4uY29udHJvbGxlcignVmVyaWZpY2F0aW9uQ3RybCcsIGZ1bmN0aW9uKEV2ZW50LCBOb3RpZmljYXRpb24sICRzdGF0ZSl7XG4gICAgRXZlbnQudmVyaWZ5KHtpZCA6ICRzdGF0ZS5wYXJhbXMuaWQsIGNvZGUgOiRzdGF0ZS5wYXJhbXMuY29kZX0sIGZ1bmN0aW9uKCl7XG4gICAgICAgIHZhciBub3RpZmljYXRpb24gPSBuZXcgTm90aWZpY2F0aW9uKHtcbiAgICAgICAgICAgIHRpdGxlIDogJ0VtYWlsIFZlcmlmaWVkJyxcbiAgICAgICAgICAgIG1lc3NhZ2UgOiAnWW91ciBlbWFpbCBoYXMgYmVlbiB2ZXJpZmllZC4gWW91IHdpbGwgbm93IGJlIGFibGUgdG8gcmVjZWl2ZSBlbWFpbCBub3RpZmljYXRpb25zIGZvciB0aGlzIGV2ZW50JyxcbiAgICAgICAgICAgIHR5cGUgOiAnc3VjY2VzcycsXG4gICAgICAgICAgICB0aW1lb3V0IDogNTAwMFxuICAgICAgICB9KTtcbiAgICB9LCBmdW5jdGlvbihlKXtcbiAgICAgICAgdmFyIG5vdGlmaWNhdGlvbiA9IG5ldyBOb3RpZmljYXRpb24oe1xuICAgICAgICAgICAgdGl0bGUgOiAnVmVyaWZpY2F0aW9uIEZhaWxlZCcsXG4gICAgICAgICAgICBtZXNzYWdlIDogJ1lvdXIgdmVyaWZpY2F0aW9uIGNvZGUgaGFzIGV4cGlyZWQuJyxcbiAgICAgICAgICAgIHR5cGUgOiAnZXJyb3InXG4gICAgICAgIH0pO1xuICAgIH0pO1xuICAgICRzdGF0ZS5nbygnZXZlbnQnLCB7IGlkIDogJHN0YXRlLnBhcmFtcy5pZCB9KTtcblxufSk7XG4iLCJhbmd1bGFyLm1vZHVsZSgncmFsbGx5Jylcbi5kaXJlY3RpdmUoJ2JhY2tJbWcnLCBmdW5jdGlvbigpe1xuICAgIHJldHVybiBmdW5jdGlvbihzY29wZSwgZWxlbWVudCwgYXR0cnMpe1xuICAgICAgICB2YXIgdXJsID0gYXR0cnMuYmFja0ltZztcbiAgICAgICAgZWxlbWVudC5jc3Moe1xuICAgICAgICAgICAgJ2JhY2tncm91bmQtaW1hZ2UnOiAndXJsKC9pbWFnZXMvJyArIHVybCArJy5wbmcpJ1xuICAgICAgICB9KTtcbiAgICB9O1xufSlcbiIsImFuZ3VsYXIubW9kdWxlKCdyYWxsbHknKVxuLmRpcmVjdGl2ZSgnZGF0ZXBpY2tlcicsIGZ1bmN0aW9uKCl7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgcmVzdHJpY3QgOiAnQScsXG4gICAgICAgIHJlcXVpcmUgOiAnbmdNb2RlbCcsXG4gICAgICAgIHNjb3BlIDoge1xuICAgICAgICAgICAgbW9kZWwgOiAnPW5nTW9kZWwnLFxuICAgICAgICAgICAgY29udHJvbCA6ICc9J1xuICAgICAgICB9LFxuICAgICAgICBsaW5rIDogZnVuY3Rpb24oc2NvcGUsIGVsLCBhdHRycywgbmdNb2RlbCl7XG4gICAgICAgICAgICBzY29wZS5tb2RlbCA9IHNjb3BlLm1vZGVsIHx8IFtdO1xuICAgICAgICAgICAgYW5ndWxhci5lbGVtZW50KGVsKS5kYXRlcGlja2VyKHtcbiAgICAgICAgICAgICAgICBtdWx0aWRhdGUgOiB0cnVlLFxuICAgICAgICAgICAgICAgIHRvZGF5SGlnaGxpZ2h0OiB0cnVlXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLm9uKCdjaGFuZ2VEYXRlJywgZnVuY3Rpb24oZSl7XG4gICAgICAgICAgICAgICAgdmFyIGRhdGVzID0gZS5kYXRlcztcbiAgICAgICAgICAgICAgICBkYXRlcy5zb3J0KGZ1bmN0aW9uKGEsIGIpe1xuICAgICAgICAgICAgICAgICAgICBpZiAoYS5nZXRUaW1lKCkgPiBiLmdldFRpbWUoKSkgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBuZ01vZGVsLiRzZXRWaWV3VmFsdWUoZGF0ZXMsIGUpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHZhciB1cGRhdGUgPSBmdW5jdGlvbihtb2RlbFZhbHVlLCBvbGRWYWx1ZSl7XG4gICAgICAgICAgICAgICAgaWYgKCFtb2RlbFZhbHVlIHx8ICFvbGRWYWx1ZSB8fCAobW9kZWxWYWx1ZS5sZW5ndGggPT0gb2xkVmFsdWUubGVuZ3RoKSkgcmV0dXJuO1xuICAgICAgICAgICAgICAgIHZhciBkYXRlcyA9IFtdO1xuICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbW9kZWxWYWx1ZS5sZW5ndGg7IGkrKyl7XG4gICAgICAgICAgICAgICAgICAgIGRhdGVzLnB1c2gobmV3IERhdGUobW9kZWxWYWx1ZVtpXSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBhbmd1bGFyLmVsZW1lbnQoZWwpLmRhdGVwaWNrZXIoJ3NldERhdGVzJywgZGF0ZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc2NvcGUuJHdhdGNoQ29sbGVjdGlvbignbW9kZWwnLCB1cGRhdGUpO1xuXG4gICAgICAgICAgICBzY29wZS5jb250cm9sID0gc2NvcGUuY29udHJvbCB8fCB7fTtcbiAgICAgICAgICAgIHNjb3BlLmNvbnRyb2wudW5zZXREYXRlID0gZnVuY3Rpb24oZGF0ZSl7XG4gICAgICAgICAgICAgICAgdmFyIGluZGV4ID0gc2NvcGUubW9kZWwuaW5kZXhPZihkYXRlKTtcbiAgICAgICAgICAgICAgICBzY29wZS5tb2RlbC5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBuZ01vZGVsLiR2YWxpZGF0b3JzLnJlcXVpcmVkID0gZnVuY3Rpb24obW9kZWxWYWx1ZSwgdmlld1ZhbHVlKXtcbiAgICAgICAgICAgICAgICBpZiAoIW1vZGVsVmFsdWUgfHwgbW9kZWxWYWx1ZS5sZW5ndGggPT0gMCl7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfVxuICAgIH1cbn0pO1xuIiwiYW5ndWxhci5tb2R1bGUoJ3JhbGxseScpXG4uZGlyZWN0aXZlKCdkaXNjdXNzaW9uJywgZnVuY3Rpb24oJHRpbWVvdXQsIENvbW1lbnQsIENvbmZpcm1Nb2RhbCl7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgcmVzdHJpY3QgOiAnQScsXG4gICAgICAgIHRlbXBsYXRlVXJsIDogJ3RlbXBsYXRlcy9kaXJlY3RpdmVzL2Rpc2N1c3Npb24uaHRtbCcsXG4gICAgICAgIHNjb3BlIDoge1xuICAgICAgICAgICAgJ2V2ZW50JyA6ICc9J1xuICAgICAgICB9LFxuICAgICAgICBsaW5rIDogZnVuY3Rpb24oc2NvcGUsIGVsLCBhdHRycyl7XG4gICAgICAgICAgICBzY29wZS5jb21tZW50ID0ge307XG4gICAgICAgICAgICB2YXIgdGhyZWFkID0gYW5ndWxhci5lbGVtZW50KCcuY29tbWVudC10aHJlYWQnKTtcbiAgICAgICAgICAgICR0aW1lb3V0KGZ1bmN0aW9uKCl7XG4gICAgICAgICAgICAgICAgdGhyZWFkLnNjcm9sbFRvcCh0aHJlYWQucHJvcCgnc2Nyb2xsSGVpZ2h0JykpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBzY29wZS5kZWxldGVDb21tZW50ID0gZnVuY3Rpb24oY29tbWVudCl7XG4gICAgICAgICAgICAgICAgdmFyIG1vZGFsID0gbmV3IENvbmZpcm1Nb2RhbCh7XG4gICAgICAgICAgICAgICAgICAgIHRpdGxlIDogJ0FyZSB5b3Ugc3VyZT8nLFxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlIDogJ0FyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byByZW1vdmUgdGhpcyBjb21tZW50PycsXG4gICAgICAgICAgICAgICAgICAgIGNvbmZpcm1UZXh0IDogJ1llcyAtIGRlbGV0ZScsXG4gICAgICAgICAgICAgICAgICAgIGNhbmNlbFRleHQgOiAnTm8gLSBuZXZlcm1pbmQnLFxuICAgICAgICAgICAgICAgICAgICBpc0Rlc3RydWN0aXZlIDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgY29uZmlybSA6IGZ1bmN0aW9uKCl7XG4gICAgICAgICAgICAgICAgICAgICAgICBDb21tZW50LnJlbW92ZSh7IGlkIDogc2NvcGUuZXZlbnQuX2lkICwgY2lkIDogY29tbWVudC5faWQgfSwgZnVuY3Rpb24oZXZlbnQpe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjb3BlLmV2ZW50ID0gZXZlbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc2NvcGUucG9zdENvbW1lbnQgPSBmdW5jdGlvbigpe1xuICAgICAgICAgICAgICAgIGlmIChzY29wZS5jb21tZW50Rm9ybS4kdmFsaWQpe1xuICAgICAgICAgICAgICAgICAgICB2YXIgY29tbWVudCA9IG5ldyBDb21tZW50KHNjb3BlLmNvbW1lbnQpO1xuICAgICAgICAgICAgICAgICAgICBjb21tZW50LiRzYXZlKHtpZDpzY29wZS5ldmVudC5faWR9LCBmdW5jdGlvbihldmVudCl7XG4gICAgICAgICAgICAgICAgICAgICAgICBzY29wZS5ldmVudCA9IGV2ZW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgc2NvcGUuY29tbWVudCA9IHt9O1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgc2NvcGUuY29tbWVudEZvcm0uJHNldFByaXN0aW5lKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufSk7XG4iLCJhbmd1bGFyLm1vZHVsZSgncmFsbGx5Jylcbi5kaXJlY3RpdmUoJ2Ryb3Bkb3duJywgZnVuY3Rpb24oJGRvY3VtZW50KXtcbiAgICByZXR1cm4ge1xuICAgICAgICByZXN0cmljdCA6ICdBJyxcbiAgICAgICAgbGluayA6IGZ1bmN0aW9uKHNjb3BlLCBlbCwgYXR0cnMpe1xuICAgICAgICAgICAgZWwuYWRkQ2xhc3MoJ2Ryb3Bkb3duJyk7XG4gICAgICAgICAgICBzY29wZS5vcGVuID0gZmFsc2U7XG5cbiAgICAgICAgICAgIHZhciBjbGlja0hhbmRsZXIgPSBmdW5jdGlvbihldmVudCl7XG4gICAgICAgICAgICAgICAgdmFyIGlzQ2xpY2tlZEVsZW1lbnRDaGlsZE9mUG9wdXAgPSBlbC5maW5kKGV2ZW50LnRhcmdldCkubGVuZ3RoID4gMDtcbiAgICAgICAgICAgICAgICBpZiAoaXNDbGlja2VkRWxlbWVudENoaWxkT2ZQb3B1cCkgcmV0dXJuO1xuICAgICAgICAgICAgICAgIHNjb3BlLnRvZ2dsZSgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBzY29wZS50b2dnbGUgPSBmdW5jdGlvbigpe1xuICAgICAgICAgICAgICAgIHNjb3BlLm9wZW4gPSAhc2NvcGUub3BlbjtcbiAgICAgICAgICAgICAgICBpZiAoc2NvcGUub3Blbil7XG4gICAgICAgICAgICAgICAgICAgIGVsLmFkZENsYXNzKCdvcGVuJyk7XG4gICAgICAgICAgICAgICAgICAgICRkb2N1bWVudC5iaW5kKCdjbGljaycsIGNsaWNrSGFuZGxlcik7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZWwucmVtb3ZlQ2xhc3MoJ29wZW4nKTtcbiAgICAgICAgICAgICAgICAgICAgJGRvY3VtZW50LnVuYmluZCgnY2xpY2snLCBjbGlja0hhbmRsZXIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn0pO1xuIiwiYW5ndWxhci5tb2R1bGUoJ3JhbGxseScpXG4uc2VydmljZSgnRm9ybUhlbHBlcicsIGZ1bmN0aW9uKCl7XG4gICAgdGhpcy5lbWFpbFJlZ2V4U3RyaW5nID0gJ14oW1xcXFx3LVxcXFwuXStAKFtcXFxcdy1dK1xcXFwuKStbXFxcXHctXXsyLDR9KT8kJztcbiAgICB0aGlzLmVtYWlsUmVnZXggPSBuZXcgUmVnRXhwKHRoaXMuZW1haWxSZWdleFN0cmluZyk7XG4gICAgdGhpcy5wcmV0dHlFcnJvciA9IGZ1bmN0aW9uKGVycm9ycywgZmllbGQpe1xuICAgICAgICBpZiAoZXJyb3JzLnJlcXVpcmVkKSByZXR1cm4gZmllbGQgKyBcIiBpcyByZXF1aXJlZFwiO1xuICAgICAgICBpZiAoZXJyb3JzLnBhdHRlcm4pIHJldHVybiBmaWVsZCArIFwiIGlzIGludmFsaWRcIiA7XG4gICAgICAgIGlmIChlcnJvcnMubWF4bGVuZ3RoKSByZXR1cm4gZmllbGQgKyBcIiBpcyB0b28gbG9uZ1wiO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufSlcbi5kaXJlY3RpdmUoJ3VzZXJGb3JtJywgZnVuY3Rpb24oRm9ybUhlbHBlcil7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgc2NvcGUgOiB7XG4gICAgICAgICAgICBldmVudCA6ICc9JyxcbiAgICAgICAgICAgIGZvcm0gOiAnPSdcbiAgICAgICAgfSxcbiAgICAgICAgdGVtcGxhdGVVcmwgOiAndGVtcGxhdGVzL2RpcmVjdGl2ZXMvZXZlbnRGb3JtL3VzZXJGb3JtLmh0bWwnLFxuICAgICAgICBsaW5rIDogZnVuY3Rpb24oc2NvcGUsIGVsLCBhdHRycykge1xuICAgICAgICAgICAgc2NvcGUuZXJyb3JzID0ge307XG5cbiAgICAgICAgICAgIHNjb3BlLmVtYWlsUmVnZXggPSBGb3JtSGVscGVyLmVtYWlsUmVnZXg7XG5cbiAgICAgICAgICAgIHNjb3BlLiR3YXRjaENvbGxlY3Rpb24oJ2Zvcm0ubmFtZS4kZXJyb3InLGZ1bmN0aW9uKGVycm9ycyl7XG4gICAgICAgICAgICAgICAgc2NvcGUuZXJyb3JzLm5hbWUgPSBGb3JtSGVscGVyLnByZXR0eUVycm9yKGVycm9ycywgXCJOYW1lXCIpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHNjb3BlLiR3YXRjaENvbGxlY3Rpb24oJ2Zvcm0uZW1haWwuJGVycm9yJyxmdW5jdGlvbihlcnJvcnMpe1xuICAgICAgICAgICAgICAgIHNjb3BlLmVycm9ycy5lbWFpbCA9IEZvcm1IZWxwZXIucHJldHR5RXJyb3IoZXJyb3JzLCBcIkVtYWlsXCIpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG59KVxuLmRpcmVjdGl2ZSgnZXZlbnRGb3JtJywgZnVuY3Rpb24oRm9ybUhlbHBlcil7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgc2NvcGUgOiB7XG4gICAgICAgICAgICBldmVudCA6ICc9JyxcbiAgICAgICAgICAgIGZvcm0gOiAnPSdcbiAgICAgICAgfSxcbiAgICAgICAgdGVtcGxhdGVVcmwgOiAndGVtcGxhdGVzL2RpcmVjdGl2ZXMvZXZlbnRGb3JtL2V2ZW50Rm9ybS5odG1sJyxcbiAgICAgICAgbGluayA6IGZ1bmN0aW9uKHNjb3BlLCBlbCwgYXR0cnMpIHtcbiAgICAgICAgICAgIHNjb3BlLmVycm9ycyA9IHt9O1xuXG4gICAgICAgICAgICBzY29wZS4kd2F0Y2hDb2xsZWN0aW9uKCdmb3JtLnRpdGxlLiRlcnJvcicsZnVuY3Rpb24oZXJyb3JzKXtcbiAgICAgICAgICAgICAgICBzY29wZS5lcnJvcnMudGl0bGUgPSBGb3JtSGVscGVyLnByZXR0eUVycm9yKGVycm9ycywgXCJUaXRsZVwiKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBzY29wZS4kd2F0Y2hDb2xsZWN0aW9uKCdmb3JtLmxvY2F0aW9uLiRlcnJvcicsZnVuY3Rpb24oZXJyb3JzKXtcbiAgICAgICAgICAgICAgICBzY29wZS5lcnJvcnMubG9jYXRpb24gPSBGb3JtSGVscGVyLnByZXR0eUVycm9yKGVycm9ycywgXCJMb2NhdGlvblwiKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIH1cbiAgICB9XG59KVxuLmRpcmVjdGl2ZSgnZGF0ZUZvcm0nLCBmdW5jdGlvbigpe1xuICAgIHJldHVybiB7XG4gICAgICAgIHNjb3BlIDoge1xuICAgICAgICAgICAgZXZlbnQgOiAnPScsXG4gICAgICAgICAgICBmb3JtIDogJz0nXG4gICAgICAgIH0sXG4gICAgICAgIHRlbXBsYXRlVXJsIDogJ3RlbXBsYXRlcy9kaXJlY3RpdmVzL2V2ZW50Rm9ybS9kYXRlRm9ybS5odG1sJ1xuICAgIH1cbn0pXG4uZGlyZWN0aXZlKCdwYXJ0aWNpcGFudHNGb3JtJywgZnVuY3Rpb24oRm9ybUhlbHBlcil7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgc2NvcGUgOiB7XG4gICAgICAgICAgICBldmVudCA6ICc9JyxcbiAgICAgICAgICAgIGZvcm0gOiAnPSdcbiAgICAgICAgfSxcbiAgICAgICAgdGVtcGxhdGVVcmwgOiAndGVtcGxhdGVzL2RpcmVjdGl2ZXMvZXZlbnRGb3JtL3BhcnRpY2lwYW50c0Zvcm0uaHRtbCcsXG4gICAgICAgIGxpbmsgOiBmdW5jdGlvbihzY29wZSwgZWwsIGF0dHJzKXtcbiAgICAgICAgICAgIHNjb3BlLmVtYWlsUmVnZXggPSBGb3JtSGVscGVyLmVtYWlsUmVnZXhTdHJpbmc7XG4gICAgICAgIH1cbiAgICB9XG59KVxuLmRpcmVjdGl2ZSgnc2V0dGluZ3NGb3JtJywgZnVuY3Rpb24oRXZlbnQpe1xuICAgIHJldHVybiB7XG4gICAgICAgIHNjb3BlIDoge1xuICAgICAgICAgICAgZXZlbnQgOiAnPScsXG4gICAgICAgICAgICBmb3JtIDogJz0nXG4gICAgICAgIH0sXG4gICAgICAgIHRlbXBsYXRlVXJsIDogJ3RlbXBsYXRlcy9kaXJlY3RpdmVzL2V2ZW50Rm9ybS9zZXR0aW5nc0Zvcm0uaHRtbCcsXG4gICAgICAgIGxpbmsgOiBmdW5jdGlvbihzY29wZSwgZWwsIGF0dHJzKXtcbiAgICAgICAgICAgIHNjb3BlLmRlbGV0ZUV2ZW50ID0gZnVuY3Rpb24oKXtcbiAgICAgICAgICAgICAgICBFdmVudC5kZWxldGUoeydpZCcgOiBzY29wZS5ldmVudC5faWR9LCBmdW5jdGlvbigpe1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnZGVsZXRlJyk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59KVxuLmRpcmVjdGl2ZSgnc3dpdGNoVG9nZ2xlJywgZnVuY3Rpb24oKXtcbiAgICByZXR1cm4ge1xuICAgICAgICBzY29wZSA6IHtcbiAgICAgICAgICAgIG1vZGVsIDogJz1uZ01vZGVsJ1xuICAgICAgICB9LFxuICAgICAgICByZXF1aXJlIDogJ25nTW9kZWwnLFxuICAgICAgICBsaW5rIDogZnVuY3Rpb24oc2NvcGUsIGVsLCBhdHRycywgbmdNb2RlbCkge1xuICAgICAgICAgICAgZWwuYWRkQ2xhc3MoJ3N3aXRjaC10b2dnbGUnKTtcbiAgICAgICAgICAgIHZhciBzZXRDbGFzcyA9IGZ1bmN0aW9uKCl7XG4gICAgICAgICAgICAgICAgaWYgKHNjb3BlLm1vZGVsIF4gdHlwZW9mKGF0dHJzLmludmVydCkgIT09ICd1bmRlZmluZWQnKXtcbiAgICAgICAgICAgICAgICAgICAgZWwuYWRkQ2xhc3MoJ2FjdGl2ZScpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGVsLnJlbW92ZUNsYXNzKCdhY3RpdmUnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzY29wZS4kd2F0Y2goJ21vZGVsJywgc2V0Q2xhc3MpO1xuICAgICAgICAgICAgZWwuYmluZCgnY2xpY2snLCBmdW5jdGlvbihlKXtcbiAgICAgICAgICAgICAgICBzY29wZS5tb2RlbCA9ICFzY29wZS5tb2RlbDtcbiAgICAgICAgICAgICAgICBuZ01vZGVsLiRzZXRWaWV3VmFsdWUoc2NvcGUubW9kZWwsIGUpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG59KTtcbiIsImFuZ3VsYXIubW9kdWxlKCdyYWxsbHknKVxuLmRpcmVjdGl2ZSgncG9sbCcsIGZ1bmN0aW9uKFBhcnRpY2lwYW50LCBDb25maXJtTW9kYWwpe1xuICAgIHJldHVybiB7XG4gICAgICAgIHJlc3RyaWN0IDogJ0EnLFxuICAgICAgICB0ZW1wbGF0ZVVybCA6ICd0ZW1wbGF0ZXMvZGlyZWN0aXZlcy9wb2xsLmh0bWwnLFxuICAgICAgICBzY29wZSA6IHtcbiAgICAgICAgICAgICdldmVudCcgOiAnPSdcbiAgICAgICAgfSxcbiAgICAgICAgbGluayA6IGZ1bmN0aW9uKHNjb3BlLCBlbCwgYXR0cnMpe1xuICAgICAgICAgICAgc2NvcGUuZGVmYXVsdHMgPSBbXTtcbiAgICAgICAgICAgIHNjb3BlLnBhcnRpY2lwYW50ID0ge307XG4gICAgICAgICAgICB2YXIgZGF0ZXNDb3VudCA9IFtdO1xuICAgICAgICAgICAgc2NvcGUuZGVsZXRlID0gZnVuY3Rpb24ocGFydGljaXBhbnQpe1xuICAgICAgICAgICAgICAgIHZhciBtb2RhbCA9IG5ldyBDb25maXJtTW9kYWwoe1xuICAgICAgICAgICAgICAgICAgICB0aXRsZSA6ICdEZWxldGUgJyArIHBhcnRpY2lwYW50Lm5hbWUgKyAnPycsXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgOiAnQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIHJlbW92ZSAnK3BhcnRpY2lwYW50Lm5hbWUrJyBmcm9tIHRoZSBwb2xsPycsXG4gICAgICAgICAgICAgICAgICAgIGNvbmZpcm1UZXh0IDogJ1llcyAtIGRlbGV0ZScsXG4gICAgICAgICAgICAgICAgICAgIGNhbmNlbFRleHQgOiAnTm8gLSBuZXZlcm1pbmQnLFxuICAgICAgICAgICAgICAgICAgICBpc0Rlc3RydWN0aXZlIDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgY29uZmlybSA6IGZ1bmN0aW9uKCl7XG4gICAgICAgICAgICAgICAgICAgICAgICBQYXJ0aWNpcGFudC5yZW1vdmUoeyBpZCA6IHNjb3BlLmV2ZW50Ll9pZCAsIHBpZCA6IHBhcnRpY2lwYW50Ll9pZCB9LCBmdW5jdGlvbihldmVudCl7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NvcGUuZXZlbnQgPSBldmVudDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzY29wZS5pc1RvcERhdGUgPSBmdW5jdGlvbihpbmRleCl7XG4gICAgICAgICAgICAgICAgdmFyIGNvdW50ID0gZGF0ZXNDb3VudFtpbmRleF07XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkYXRlc0NvdW50Lmxlbmd0aDsgaSsrKXtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGVzQ291bnRbaV0gPiBjb3VudCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNjb3BlLnNlbGVjdGVkRGF0ZSA9IGZ1bmN0aW9uKGluZGV4KXtcbiAgICAgICAgICAgICAgICBkYXRlc0NvdW50W2luZGV4XSA9IDA7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzY29wZS5ldmVudC5wYXJ0aWNpcGFudHMubGVuZ3RoOyBpKyspe1xuICAgICAgICAgICAgICAgICAgICBpZiAoc2NvcGUuZXZlbnQucGFydGljaXBhbnRzW2ldLmRhdGVzW2luZGV4XSkgZGF0ZXNDb3VudFtpbmRleF0rKztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGRhdGVzQ291bnRbaW5kZXhdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc2NvcGUudXBkYXRlID0gZnVuY3Rpb24ocGFydGljaXBhbnQpe1xuICAgICAgICAgICAgICAgIFBhcnRpY2lwYW50LnVwZGF0ZSh7XG4gICAgICAgICAgICAgICAgICAgIGlkIDogc2NvcGUuZXZlbnQuX2lkLFxuICAgICAgICAgICAgICAgICAgICBwaWQgOiBwYXJ0aWNpcGFudC5faWRcbiAgICAgICAgICAgICAgICB9LCBwYXJ0aWNpcGFudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzY29wZS5lZGl0ID0gZnVuY3Rpb24ocGFydGljaXBhbnQpe1xuICAgICAgICAgICAgICAgIHNjb3BlLmRlZmF1bHRzW3Njb3BlLmV2ZW50LnBhcnRpY2lwYW50cy5pbmRleE9mKHBhcnRpY2lwYW50KV0gPSBhbmd1bGFyLmNvcHkocGFydGljaXBhbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc2NvcGUuY2FuY2VsID0gZnVuY3Rpb24oaW5kZXgpe1xuICAgICAgICAgICAgICAgIHNjb3BlLmV2ZW50LnBhcnRpY2lwYW50c1tpbmRleF0gPSBzY29wZS5kZWZhdWx0c1tpbmRleF07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzY29wZS5zYXZlID0gZnVuY3Rpb24oKXtcbiAgICAgICAgICAgICAgICBpZiAoc2NvcGUuZm9ybW5ldy4kdmFsaWQpe1xuICAgICAgICAgICAgICAgICAgICB2YXIgcGFydGljaXBhbnQgPSBuZXcgUGFydGljaXBhbnQoc2NvcGUucGFydGljaXBhbnQpO1xuICAgICAgICAgICAgICAgICAgICBwYXJ0aWNpcGFudC4kc2F2ZSh7aWQ6c2NvcGUuZXZlbnQuX2lkfSwgZnVuY3Rpb24oZXZlbnQpe1xuICAgICAgICAgICAgICAgICAgICAgICAgc2NvcGUuZXZlbnQgPSBldmVudDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNjb3BlLnBhcnRpY2lwYW50ID0ge307XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBzY29wZS5mb3JtbmV3LiRzZXRQcmlzdGluZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn0pO1xuIiwiYW5ndWxhci5tb2R1bGUoJ3JhbGxseScpXG4uZmlsdGVyKCdlbGFwc2VkJywgZnVuY3Rpb24oJGZpbHRlcil7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKGRhdGUpe1xuICAgICAgICBpZiAoIWRhdGUpIHJldHVybjtcbiAgICAgICAgdmFyIHRpbWUgPSBEYXRlLnBhcnNlKGRhdGUpLFxuICAgICAgICAgICAgdGltZU5vdyA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpLFxuICAgICAgICAgICAgZGlmZmVyZW5jZSA9IHRpbWVOb3cgLSB0aW1lLFxuICAgICAgICAgICAgc2Vjb25kcyA9IE1hdGguZmxvb3IoZGlmZmVyZW5jZSAvIDEwMDApLFxuICAgICAgICAgICAgbWludXRlcyA9IE1hdGguZmxvb3Ioc2Vjb25kcyAvIDYwKSxcbiAgICAgICAgICAgIGhvdXJzID0gTWF0aC5mbG9vcihtaW51dGVzIC8gNjApLFxuICAgICAgICAgICAgZGF5cyA9IE1hdGguZmxvb3IoaG91cnMgLyAyNCk7XG4gICAgICAgIGlmIChkYXlzID4gMzApIHtcbiAgICAgICAgICAgIHJldHVybiAnb24gJyArICRmaWx0ZXIoJ2RhdGUnKShkYXRlLCAnTU1NTSBkJyk7XG4gICAgICAgIH0gZWxzZSBpZiAoZGF5cyA+IDEpIHtcbiAgICAgICAgICAgIHJldHVybiBkYXlzICsgXCIgZGF5cyBhZ29cIjtcbiAgICAgICAgfSBlbHNlIGlmIChkYXlzID09IDEpIHtcbiAgICAgICAgICAgIHJldHVybiBcIjEgZGF5IGFnb1wiXG4gICAgICAgIH0gZWxzZSBpZiAoaG91cnMgPiAxKSB7XG4gICAgICAgICAgICByZXR1cm4gaG91cnMgKyBcIiBob3VycyBhZ29cIjtcbiAgICAgICAgfSBlbHNlIGlmIChob3VycyA9PSAxKSB7XG4gICAgICAgICAgICByZXR1cm4gXCJhbiBob3VyIGFnb1wiO1xuICAgICAgICB9IGVsc2UgaWYgKG1pbnV0ZXMgPiAxKSB7XG4gICAgICAgICAgICByZXR1cm4gbWludXRlcyArIFwiIG1pbnV0ZXMgYWdvXCI7XG4gICAgICAgIH0gZWxzZSBpZiAobWludXRlcyA9PSAxKXtcbiAgICAgICAgICAgIHJldHVybiBcImEgbWludXRlIGFnb1wiO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFwiYSBmZXcgc2Vjb25kcyBhZ29cIjtcbiAgICAgICAgfVxuICAgIH1cbn0pXG4iLCJhbmd1bGFyLm1vZHVsZSgncmFsbGx5Jylcbi5mYWN0b3J5KCdDb25maXJtTW9kYWwnLCBmdW5jdGlvbihidGZNb2RhbCl7XG5cbiAgICByZXR1cm4gZnVuY3Rpb24oY29uZmlnKXtcbiAgICAgICAgdmFyIG1vZGFsO1xuICAgICAgICBtb2RhbCA9IGJ0Zk1vZGFsKHtcbiAgICAgICAgICAgIHRlbXBsYXRlVXJsIDogJ3RlbXBsYXRlcy9jb25maXJtbW9kYWwuaHRtbCcsXG4gICAgICAgICAgICBjb250cm9sbGVyQXMgOiAnbW9kYWwnLFxuICAgICAgICAgICAgY29udHJvbGxlciA6IGZ1bmN0aW9uKCl7XG4gICAgICAgICAgICAgICAgdGhpcy50aXRsZSA9IGNvbmZpZy50aXRsZVxuICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZSA9IGNvbmZpZy5tZXNzYWdlO1xuICAgICAgICAgICAgICAgIHRoaXMuY29uZmlybSA9IChjb25maWcuY29uZmlybSkgPyBmdW5jdGlvbigpe2NvbmZpZy5jb25maXJtKCk7IG1vZGFsLmRlYWN0aXZhdGUoKX0gOiBmYWxzZTtcbiAgICAgICAgICAgICAgICB0aGlzLmNhbmNlbCA9IG1vZGFsLmRlYWN0aXZhdGU7XG4gICAgICAgICAgICAgICAgdGhpcy5jb25maXJtVGV4dCA9IGNvbmZpZy5jb25maXJtVGV4dCB8fCAnQ29uZmlybSc7XG4gICAgICAgICAgICAgICAgdGhpcy5jYW5jZWxUZXh0ID0gY29uZmlnLmNhbmNlbFRleHQgfHwgJ0NhbmNlbCc7XG4gICAgICAgICAgICAgICAgdGhpcy5pc0Rlc3RydWN0aXZlID0gY29uZmlnLmlzRGVzdHJ1Y3RpdmU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBtb2RhbC5hY3RpdmF0ZSgpO1xuICAgICAgICBcbiAgICAgICAgdGhpcy5kZXN0cm95ID0gZnVuY3Rpb24oKXtcbiAgICAgICAgICAgIG1vZGFsLmRlYWN0aXZhdGUoKTtcbiAgICAgICAgfVxuICAgIH1cbn0pO1xuIiwiYW5ndWxhci5tb2R1bGUoJ3JhbGxseScpXG4uZmFjdG9yeSgnTm90aWZpY2F0aW9uJywgZnVuY3Rpb24oJHRpbWVvdXQsIGJ0Zk1vZGFsKXtcbiAgICByZXR1cm4gZnVuY3Rpb24oY29uZmlnKXtcbiAgICAgICAgdmFyIG1vZGFsO1xuICAgICAgICBtb2RhbCA9IGJ0Zk1vZGFsKHtcbiAgICAgICAgICAgIHRlbXBsYXRlVXJsIDogJ3RlbXBsYXRlcy9ub3RpZmljYXRpb24uaHRtbCcsXG4gICAgICAgICAgICBjb250cm9sbGVyQXMgOiAnbm90aWZpY2F0aW9uJyxcbiAgICAgICAgICAgIGNvbnRyb2xsZXIgOiBmdW5jdGlvbigpe1xuICAgICAgICAgICAgICAgIHRoaXMudGl0bGUgPSBjb25maWcudGl0bGVcbiAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2UgPSBjb25maWcubWVzc2FnZTtcbiAgICAgICAgICAgICAgICB0aGlzLmNsb3NlID0gbW9kYWwuZGVhY3RpdmF0ZTtcbiAgICAgICAgICAgICAgICB0aGlzLnR5cGUgPSBjb25maWcudHlwZTtcbiAgICAgICAgICAgICAgICB2YXIgdGltZW91dCA9IGNvbmZpZy50aW1lb3V0IHx8IDUwMDA7XG4gICAgICAgICAgICAgICAgJHRpbWVvdXQobW9kYWwuZGVhY3RpdmF0ZSwgdGltZW91dCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBtb2RhbC5hY3RpdmF0ZSgpO1xuXG4gICAgICAgIHRoaXMuZGVzdHJveSA9IGZ1bmN0aW9uKCl7XG4gICAgICAgICAgICBtb2RhbC5kZWFjdGl2YXRlKCk7XG4gICAgICAgIH1cbiAgICB9XG59KTtcbiJdLCJzb3VyY2VSb290IjoiL3NvdXJjZS8ifQ== \ No newline at end of file diff --git a/public/css/style.css b/public/css/style.css index 71333966c..b0d8af332 100644 --- a/public/css/style.css +++ b/public/css/style.css @@ -1,7 +1,7 @@ -@import url(http://fonts.googleapis.com/css?family=Roboto:400,600,700);/*! normalize.css v3.0.2 | MIT License | git.io/normalize */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}dfn{font-style:italic}h1{font-size:2em;margin:0.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type="checkbox"],input[type="radio"]{box-sizing:border-box;padding:0}input[type="number"]::-webkit-inner-spin-button,input[type="number"]::-webkit-outer-spin-button{height:auto}input[type="search"]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid #c0c0c0;margin:0 2px;padding:0.35em 0.625em 0.75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:bold}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}html{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}*,*:before,*:after{-webkit-box-sizing:inherit;-moz-box-sizing:inherit;box-sizing:inherit}body{font-family:"Roboto","Helvetica Neue",Arial,sans-serif}.outer-container{width:100%;height:100%}body{background:#F5F6F8;color:#3D4043;min-width:820px}.main-navigation{width:100%;min-width:820px;color:white}.main-navigation .wrapper{width:100%;padding:0 40px}.main-content{background:#F5F6F8;min-height:100%}.main-content .main-view{height:100%;position:relative;padding:160px 40px 40px 40px;width:100%;min-height:600px}.top-bar{width:100%;box-shadow:0 1px 2px rgba(0,0,0,0.1);height:50px;line-height:50px}.main-navigation{position:fixed;width:100%;z-index:1000}.main-navigation .wrapper{min-width:600px;background:#2E3A54;height:3.75em}.main-navigation .logo{display:inline-block;vertical-align:middle;margin-top:15px}.main-navigation .navigation{display:inline-block;vertical-align:middle;margin-left:60px;margin-top:15px}.main-navigation .navigation .links{padding:0;margin:0;list-style:none;display:inline-block}.main-navigation .navigation .links li{display:inline-block;margin-right:1.25em}.main-navigation .navigation .links a{text-decoration:none;color:#616F8D;font-weight:bold;line-height:1.5em;font-size:0.9375em;opacity:0.7}.main-navigation .navigation .links a:hover{opacity:1;color:white}.main-navigation .navigation .links a:hover .icon{background-position:center bottom}.main-navigation .navigation .links a.active{opacity:1;color:white;cursor:default}.main-navigation .navigation .links a.active .icon{background-position:center bottom}.main-navigation .navigation .links a .text{vertical-align:middle}.main-navigation .navigation .links a .icon{display:inline-block;vertical-align:middle;margin-right:5px;width:16px;height:16px;background-size:16px 32px}.main-navigation .create-new{display:inline-block;float:right;padding:13px}.main-navigation .create-new a{display:block;-webkit-transition:background-color 0.1s ease-in-out;-moz-transition:background-color 0.1s ease-in-out;transition:background-color 0.1s ease-in-out;color:#f0f8ec;text-align:center;border-radius:2px;background-color:#86c766;background-image:-webkit-linear-gradient(#86c766, #74bf4f);background-image:linear-gradient(#86c766, #74bf4f);text-decoration:none;font-size:12px;font-weight:bold;padding:8px 15px 10px 12px}.main-navigation .create-new a:active{box-shadow:inset 0 2px 5px rgba(0,0,0,0.1),0 0 0 1px #20283a}.main-navigation .create-new a img{vertical-align:middle;margin-right:5px;margin-top:-2px}.top-bar{float:left;width:100%;background:rgba(255,255,255,0.9)}.top-bar .primary{list-style:none;margin:0;padding-left:40px;margin-top:-4px}.top-bar .primary .item img{display:inline-block;vertical-align:middle}.top-bar .primary .item .hoverable{padding:8px 12px;height:100%;text-decoration:none;color:#3D4043;font-size:0.75em;border:1px solid transparent;border-radius:3px;vertical-align:bottom;border-color:#D9DDE3}.top-bar .primary .item .hoverable span{vertical-align:middle}.top-bar .primary .item .hoverable:hover{border-color:#bcc3cd}.top-bar .primary .item .dropdown:after{content:"";width:6px;height:4px;margin-left:10px;display:inline-block;background-image:url("../images/dropdown_arrow.png");background-size:6px 4px;background-repeat:no-repeat}/*! +@import url(http://fonts.googleapis.com/css?family=Roboto:400,600,700);/*! normalize.css v3.0.2 | MIT License | git.io/normalize */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}dfn{font-style:italic}h1{font-size:2em;margin:0.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type="checkbox"],input[type="radio"]{box-sizing:border-box;padding:0}input[type="number"]::-webkit-inner-spin-button,input[type="number"]::-webkit-outer-spin-button{height:auto}input[type="search"]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid #c0c0c0;margin:0 2px;padding:0.35em 0.625em 0.75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:bold}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}html{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}*,*:before,*:after{-webkit-box-sizing:inherit;-moz-box-sizing:inherit;box-sizing:inherit}body{font-family:"Roboto","Helvetica Neue",Arial,sans-serif}a{color:#5AC4E5}.outer-container{width:100%;height:100%}body{background:#F5F6F8;color:#3D4043;min-width:820px}.main-navigation{width:100%;min-width:820px;color:white}.main-navigation .wrapper{width:100%;padding:0 40px}.main-content{background:#F5F6F8;min-height:100%}.main-content .main-view{position:relative;padding:160px 40px 40px 40px;width:100%;min-height:600px}.top-bar{width:100%;box-shadow:0 1px 2px rgba(0,0,0,0.1);height:50px;line-height:50px}.main-navigation{position:fixed;width:100%;z-index:1000}.main-navigation .wrapper{min-width:600px;background:#2E3A54;height:3.75em}.main-navigation .logo{display:inline-block;vertical-align:middle;margin-top:15px}.main-navigation .navigation{display:inline-block;vertical-align:middle;margin-left:60px;margin-top:15px}.main-navigation .navigation .links{padding:0;margin:0;list-style:none;display:inline-block}.main-navigation .navigation .links li{display:inline-block;margin-right:1.25em}.main-navigation .navigation .links a{text-decoration:none;color:#616F8D;font-weight:bold;line-height:1.5em;font-size:0.9375em;opacity:0.7}.main-navigation .navigation .links a:hover{opacity:1;color:white}.main-navigation .navigation .links a:hover .icon{background-position:center bottom}.main-navigation .navigation .links a.active{opacity:1;color:white;cursor:default}.main-navigation .navigation .links a.active .icon{background-position:center bottom}.main-navigation .navigation .links a .text{vertical-align:middle}.main-navigation .navigation .links a .icon{display:inline-block;vertical-align:middle;margin-right:5px;width:16px;height:16px;background-size:16px 32px}.main-navigation .create-new{display:inline-block;float:right;padding:13px}.main-navigation .create-new a{display:block;-webkit-transition:background-color 0.1s ease-in-out;-moz-transition:background-color 0.1s ease-in-out;transition:background-color 0.1s ease-in-out;color:#f0f8ec;text-align:center;border-radius:2px;background-color:#86c766;background-image:-webkit-linear-gradient(#86c766, #74bf4f);background-image:linear-gradient(#86c766, #74bf4f);text-decoration:none;font-size:12px;font-weight:bold;padding:8px 15px 10px 12px}.main-navigation .create-new a:active{box-shadow:inset 0 2px 5px rgba(0,0,0,0.1),0 0 0 1px #20283a}.main-navigation .create-new a img{vertical-align:middle;margin-right:5px;margin-top:-2px}.top-bar{float:left;width:100%;background:rgba(255,255,255,0.9)}.top-bar .primary{list-style:none;margin:0;padding-left:40px;margin-top:-4px}.top-bar .primary .item img{display:inline-block;vertical-align:middle}.top-bar .primary .item .hoverable{padding:8px 12px;height:100%;text-decoration:none;color:#3D4043;font-size:0.75em;border:1px solid transparent;border-radius:3px;vertical-align:bottom;border-color:#D9DDE3}.top-bar .primary .item .hoverable span{vertical-align:middle}.top-bar .primary .item .hoverable:hover{border-color:#bcc3cd}.top-bar .primary .item.dropdown.open .dropdown-toggle{border-bottom-left-radius:0;border-bottom-right-radius:0;border-color:#D9DDE3;border-bottom-color:white;position:relative;z-index:1001}.top-bar .primary .item .dropdown-menu{background:white;color:#3D4043;font-size:1em;line-height:1.5em;border:1px solid #D9DDE3;border-radius:3px;padding:20px;margin-top:-9px;border-top-left-radius:0;box-shadow:0 2px 3px #D9DDE3}.top-bar .primary .item .dropdown-menu .dropdown-title{font-weight:bold;font-size:0.9375em}.top-bar .primary .item .dropdown-menu .dropdown-content{font-size:0.875em;line-height:1.5em;color:#828B9A}/*! Animate.css - http://daneden.me/animate Licensed under the MIT license - http://opensource.org/licenses/MIT Copyright (c) 2014 Daniel Eden -*/.animated{-webkit-animation-duration:0.3s;animation-duration:0.3s;-webkit-animation-fill-mode:both;animation-fill-mode:both}.animated.infinite{-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite}.animated.hinge{-webkit-animation-duration:2s;animation-duration:2s}@-webkit-keyframes bounce{0%,20%,53%,80%,100%{-webkit-transition-timing-function:cubic-bezier(0.215, 0.61, 0.355, 1);transition-timing-function:cubic-bezier(0.215, 0.61, 0.355, 1);-webkit-transform:translate3d(0, 0, 0);transform:translate3d(0, 0, 0)}40%,43%{-webkit-transition-timing-function:cubic-bezier(0.755, 0.05, 0.855, 0.06);transition-timing-function:cubic-bezier(0.755, 0.05, 0.855, 0.06);-webkit-transform:translate3d(0, -30px, 0);transform:translate3d(0, -30px, 0)}70%{-webkit-transition-timing-function:cubic-bezier(0.755, 0.05, 0.855, 0.06);transition-timing-function:cubic-bezier(0.755, 0.05, 0.855, 0.06);-webkit-transform:translate3d(0, -15px, 0);transform:translate3d(0, -15px, 0)}90%{-webkit-transform:translate3d(0, -4px, 0);transform:translate3d(0, -4px, 0)}}@keyframes bounce{0%,20%,53%,80%,100%{-webkit-transition-timing-function:cubic-bezier(0.215, 0.61, 0.355, 1);transition-timing-function:cubic-bezier(0.215, 0.61, 0.355, 1);-webkit-transform:translate3d(0, 0, 0);transform:translate3d(0, 0, 0)}40%,43%{-webkit-transition-timing-function:cubic-bezier(0.755, 0.05, 0.855, 0.06);transition-timing-function:cubic-bezier(0.755, 0.05, 0.855, 0.06);-webkit-transform:translate3d(0, -30px, 0);transform:translate3d(0, -30px, 0)}70%{-webkit-transition-timing-function:cubic-bezier(0.755, 0.05, 0.855, 0.06);transition-timing-function:cubic-bezier(0.755, 0.05, 0.855, 0.06);-webkit-transform:translate3d(0, -15px, 0);transform:translate3d(0, -15px, 0)}90%{-webkit-transform:translate3d(0, -4px, 0);transform:translate3d(0, -4px, 0)}}.bounce{-webkit-animation-name:bounce;animation-name:bounce;-webkit-transform-origin:center bottom;-ms-transform-origin:center bottom;transform-origin:center bottom}@-webkit-keyframes flash{0%,50%,100%{opacity:1}25%,75%{opacity:0}}@keyframes flash{0%,50%,100%{opacity:1}25%,75%{opacity:0}}.flash{-webkit-animation-name:flash;animation-name:flash}@-webkit-keyframes pulse{0%{-webkit-transform:scale3d(1, 1, 1);transform:scale3d(1, 1, 1)}50%{-webkit-transform:scale3d(1.05, 1.05, 1.05);transform:scale3d(1.05, 1.05, 1.05)}100%{-webkit-transform:scale3d(1, 1, 1);transform:scale3d(1, 1, 1)}}@keyframes pulse{0%{-webkit-transform:scale3d(1, 1, 1);transform:scale3d(1, 1, 1)}50%{-webkit-transform:scale3d(1.05, 1.05, 1.05);transform:scale3d(1.05, 1.05, 1.05)}100%{-webkit-transform:scale3d(1, 1, 1);transform:scale3d(1, 1, 1)}}.pulse{-webkit-animation-name:pulse;animation-name:pulse}@-webkit-keyframes rubberBand{0%{-webkit-transform:scale3d(1, 1, 1);transform:scale3d(1, 1, 1)}30%{-webkit-transform:scale3d(1.25, 0.75, 1);transform:scale3d(1.25, 0.75, 1)}40%{-webkit-transform:scale3d(0.75, 1.25, 1);transform:scale3d(0.75, 1.25, 1)}50%{-webkit-transform:scale3d(1.15, 0.85, 1);transform:scale3d(1.15, 0.85, 1)}65%{-webkit-transform:scale3d(0.95, 1.05, 1);transform:scale3d(0.95, 1.05, 1)}75%{-webkit-transform:scale3d(1.05, 0.95, 1);transform:scale3d(1.05, 0.95, 1)}100%{-webkit-transform:scale3d(1, 1, 1);transform:scale3d(1, 1, 1)}}@keyframes rubberBand{0%{-webkit-transform:scale3d(1, 1, 1);transform:scale3d(1, 1, 1)}30%{-webkit-transform:scale3d(1.25, 0.75, 1);transform:scale3d(1.25, 0.75, 1)}40%{-webkit-transform:scale3d(0.75, 1.25, 1);transform:scale3d(0.75, 1.25, 1)}50%{-webkit-transform:scale3d(1.15, 0.85, 1);transform:scale3d(1.15, 0.85, 1)}65%{-webkit-transform:scale3d(0.95, 1.05, 1);transform:scale3d(0.95, 1.05, 1)}75%{-webkit-transform:scale3d(1.05, 0.95, 1);transform:scale3d(1.05, 0.95, 1)}100%{-webkit-transform:scale3d(1, 1, 1);transform:scale3d(1, 1, 1)}}.rubberBand{-webkit-animation-name:rubberBand;animation-name:rubberBand}@-webkit-keyframes shake{0%,100%{-webkit-transform:translate3d(0, 0, 0);transform:translate3d(0, 0, 0)}10%,30%,50%,70%,90%{-webkit-transform:translate3d(-10px, 0, 0);transform:translate3d(-10px, 0, 0)}20%,40%,60%,80%{-webkit-transform:translate3d(10px, 0, 0);transform:translate3d(10px, 0, 0)}}@keyframes shake{0%,100%{-webkit-transform:translate3d(0, 0, 0);transform:translate3d(0, 0, 0)}10%,30%,50%,70%,90%{-webkit-transform:translate3d(-10px, 0, 0);transform:translate3d(-10px, 0, 0)}20%,40%,60%,80%{-webkit-transform:translate3d(10px, 0, 0);transform:translate3d(10px, 0, 0)}}.shake{-webkit-animation-name:shake;animation-name:shake}@-webkit-keyframes swing{20%{-webkit-transform:rotate3d(0, 0, 1, 15deg);transform:rotate3d(0, 0, 1, 15deg)}40%{-webkit-transform:rotate3d(0, 0, 1, -10deg);transform:rotate3d(0, 0, 1, -10deg)}60%{-webkit-transform:rotate3d(0, 0, 1, 5deg);transform:rotate3d(0, 0, 1, 5deg)}80%{-webkit-transform:rotate3d(0, 0, 1, -5deg);transform:rotate3d(0, 0, 1, -5deg)}100%{-webkit-transform:rotate3d(0, 0, 1, 0deg);transform:rotate3d(0, 0, 1, 0deg)}}@keyframes swing{20%{-webkit-transform:rotate3d(0, 0, 1, 15deg);transform:rotate3d(0, 0, 1, 15deg)}40%{-webkit-transform:rotate3d(0, 0, 1, -10deg);transform:rotate3d(0, 0, 1, -10deg)}60%{-webkit-transform:rotate3d(0, 0, 1, 5deg);transform:rotate3d(0, 0, 1, 5deg)}80%{-webkit-transform:rotate3d(0, 0, 1, -5deg);transform:rotate3d(0, 0, 1, -5deg)}100%{-webkit-transform:rotate3d(0, 0, 1, 0deg);transform:rotate3d(0, 0, 1, 0deg)}}.swing{-webkit-transform-origin:top center;-ms-transform-origin:top center;transform-origin:top center;-webkit-animation-name:swing;animation-name:swing}@-webkit-keyframes tada{0%{-webkit-transform:scale3d(1, 1, 1);transform:scale3d(1, 1, 1)}10%,20%{-webkit-transform:scale3d(0.9, 0.9, 0.9) rotate3d(0, 0, 1, -3deg);transform:scale3d(0.9, 0.9, 0.9) rotate3d(0, 0, 1, -3deg)}30%,50%,70%,90%{-webkit-transform:scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg);transform:scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg)}40%,60%,80%{-webkit-transform:scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg);transform:scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg)}100%{-webkit-transform:scale3d(1, 1, 1);transform:scale3d(1, 1, 1)}}@keyframes tada{0%{-webkit-transform:scale3d(1, 1, 1);transform:scale3d(1, 1, 1)}10%,20%{-webkit-transform:scale3d(0.9, 0.9, 0.9) rotate3d(0, 0, 1, -3deg);transform:scale3d(0.9, 0.9, 0.9) rotate3d(0, 0, 1, -3deg)}30%,50%,70%,90%{-webkit-transform:scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg);transform:scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg)}40%,60%,80%{-webkit-transform:scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg);transform:scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg)}100%{-webkit-transform:scale3d(1, 1, 1);transform:scale3d(1, 1, 1)}}.tada{-webkit-animation-name:tada;animation-name:tada}@-webkit-keyframes wobble{0%{-webkit-transform:none;transform:none}15%{-webkit-transform:translate3d(-25%, 0, 0) rotate3d(0, 0, 1, -5deg);transform:translate3d(-25%, 0, 0) rotate3d(0, 0, 1, -5deg)}30%{-webkit-transform:translate3d(20%, 0, 0) rotate3d(0, 0, 1, 3deg);transform:translate3d(20%, 0, 0) rotate3d(0, 0, 1, 3deg)}45%{-webkit-transform:translate3d(-15%, 0, 0) rotate3d(0, 0, 1, -3deg);transform:translate3d(-15%, 0, 0) rotate3d(0, 0, 1, -3deg)}60%{-webkit-transform:translate3d(10%, 0, 0) rotate3d(0, 0, 1, 2deg);transform:translate3d(10%, 0, 0) rotate3d(0, 0, 1, 2deg)}75%{-webkit-transform:translate3d(-5%, 0, 0) rotate3d(0, 0, 1, -1deg);transform:translate3d(-5%, 0, 0) rotate3d(0, 0, 1, -1deg)}100%{-webkit-transform:none;transform:none}}@keyframes wobble{0%{-webkit-transform:none;transform:none}15%{-webkit-transform:translate3d(-25%, 0, 0) rotate3d(0, 0, 1, -5deg);transform:translate3d(-25%, 0, 0) rotate3d(0, 0, 1, -5deg)}30%{-webkit-transform:translate3d(20%, 0, 0) rotate3d(0, 0, 1, 3deg);transform:translate3d(20%, 0, 0) rotate3d(0, 0, 1, 3deg)}45%{-webkit-transform:translate3d(-15%, 0, 0) rotate3d(0, 0, 1, -3deg);transform:translate3d(-15%, 0, 0) rotate3d(0, 0, 1, -3deg)}60%{-webkit-transform:translate3d(10%, 0, 0) rotate3d(0, 0, 1, 2deg);transform:translate3d(10%, 0, 0) rotate3d(0, 0, 1, 2deg)}75%{-webkit-transform:translate3d(-5%, 0, 0) rotate3d(0, 0, 1, -1deg);transform:translate3d(-5%, 0, 0) rotate3d(0, 0, 1, -1deg)}100%{-webkit-transform:none;transform:none}}.wobble{-webkit-animation-name:wobble;animation-name:wobble}@-webkit-keyframes bounceIn{0%,20%,40%,60%,80%,100%{-webkit-transition-timing-function:cubic-bezier(0.215, 0.61, 0.355, 1);transition-timing-function:cubic-bezier(0.215, 0.61, 0.355, 1)}0%{opacity:0;-webkit-transform:scale3d(0.3, 0.3, 0.3);transform:scale3d(0.3, 0.3, 0.3)}20%{-webkit-transform:scale3d(1.1, 1.1, 1.1);transform:scale3d(1.1, 1.1, 1.1)}40%{-webkit-transform:scale3d(0.9, 0.9, 0.9);transform:scale3d(0.9, 0.9, 0.9)}60%{opacity:1;-webkit-transform:scale3d(1.03, 1.03, 1.03);transform:scale3d(1.03, 1.03, 1.03)}80%{-webkit-transform:scale3d(0.97, 0.97, 0.97);transform:scale3d(0.97, 0.97, 0.97)}100%{opacity:1;-webkit-transform:scale3d(1, 1, 1);transform:scale3d(1, 1, 1)}}@keyframes bounceIn{0%,20%,40%,60%,80%,100%{-webkit-transition-timing-function:cubic-bezier(0.215, 0.61, 0.355, 1);transition-timing-function:cubic-bezier(0.215, 0.61, 0.355, 1)}0%{opacity:0;-webkit-transform:scale3d(0.3, 0.3, 0.3);transform:scale3d(0.3, 0.3, 0.3)}20%{-webkit-transform:scale3d(1.1, 1.1, 1.1);transform:scale3d(1.1, 1.1, 1.1)}40%{-webkit-transform:scale3d(0.9, 0.9, 0.9);transform:scale3d(0.9, 0.9, 0.9)}60%{opacity:1;-webkit-transform:scale3d(1.03, 1.03, 1.03);transform:scale3d(1.03, 1.03, 1.03)}80%{-webkit-transform:scale3d(0.97, 0.97, 0.97);transform:scale3d(0.97, 0.97, 0.97)}100%{opacity:1;-webkit-transform:scale3d(1, 1, 1);transform:scale3d(1, 1, 1)}}.bounceIn{-webkit-animation-name:bounceIn;animation-name:bounceIn;-webkit-animation-duration:0.75s;animation-duration:0.75s}@-webkit-keyframes bounceInDown{0%,60%,75%,90%,100%{-webkit-transition-timing-function:cubic-bezier(0.215, 0.61, 0.355, 1);transition-timing-function:cubic-bezier(0.215, 0.61, 0.355, 1)}0%{opacity:0;-webkit-transform:translate3d(0, -3000px, 0);transform:translate3d(0, -3000px, 0)}60%{opacity:1;-webkit-transform:translate3d(0, 25px, 0);transform:translate3d(0, 25px, 0)}75%{-webkit-transform:translate3d(0, -10px, 0);transform:translate3d(0, -10px, 0)}90%{-webkit-transform:translate3d(0, 5px, 0);transform:translate3d(0, 5px, 0)}100%{-webkit-transform:none;transform:none}}@keyframes bounceInDown{0%,60%,75%,90%,100%{-webkit-transition-timing-function:cubic-bezier(0.215, 0.61, 0.355, 1);transition-timing-function:cubic-bezier(0.215, 0.61, 0.355, 1)}0%{opacity:0;-webkit-transform:translate3d(0, -3000px, 0);transform:translate3d(0, -3000px, 0)}60%{opacity:1;-webkit-transform:translate3d(0, 25px, 0);transform:translate3d(0, 25px, 0)}75%{-webkit-transform:translate3d(0, -10px, 0);transform:translate3d(0, -10px, 0)}90%{-webkit-transform:translate3d(0, 5px, 0);transform:translate3d(0, 5px, 0)}100%{-webkit-transform:none;transform:none}}.bounceInDown{-webkit-animation-name:bounceInDown;animation-name:bounceInDown}@-webkit-keyframes bounceInLeft{0%,60%,75%,90%,100%{-webkit-transition-timing-function:cubic-bezier(0.215, 0.61, 0.355, 1);transition-timing-function:cubic-bezier(0.215, 0.61, 0.355, 1)}0%{opacity:0;-webkit-transform:translate3d(-3000px, 0, 0);transform:translate3d(-3000px, 0, 0)}60%{opacity:1;-webkit-transform:translate3d(25px, 0, 0);transform:translate3d(25px, 0, 0)}75%{-webkit-transform:translate3d(-10px, 0, 0);transform:translate3d(-10px, 0, 0)}90%{-webkit-transform:translate3d(5px, 0, 0);transform:translate3d(5px, 0, 0)}100%{-webkit-transform:none;transform:none}}@keyframes bounceInLeft{0%,60%,75%,90%,100%{-webkit-transition-timing-function:cubic-bezier(0.215, 0.61, 0.355, 1);transition-timing-function:cubic-bezier(0.215, 0.61, 0.355, 1)}0%{opacity:0;-webkit-transform:translate3d(-3000px, 0, 0);transform:translate3d(-3000px, 0, 0)}60%{opacity:1;-webkit-transform:translate3d(25px, 0, 0);transform:translate3d(25px, 0, 0)}75%{-webkit-transform:translate3d(-10px, 0, 0);transform:translate3d(-10px, 0, 0)}90%{-webkit-transform:translate3d(5px, 0, 0);transform:translate3d(5px, 0, 0)}100%{-webkit-transform:none;transform:none}}.bounceInLeft{-webkit-animation-name:bounceInLeft;animation-name:bounceInLeft}@-webkit-keyframes bounceInRight{0%,60%,75%,90%,100%{-webkit-transition-timing-function:cubic-bezier(0.215, 0.61, 0.355, 1);transition-timing-function:cubic-bezier(0.215, 0.61, 0.355, 1)}0%{opacity:0;-webkit-transform:translate3d(3000px, 0, 0);transform:translate3d(3000px, 0, 0)}60%{opacity:1;-webkit-transform:translate3d(-25px, 0, 0);transform:translate3d(-25px, 0, 0)}75%{-webkit-transform:translate3d(10px, 0, 0);transform:translate3d(10px, 0, 0)}90%{-webkit-transform:translate3d(-5px, 0, 0);transform:translate3d(-5px, 0, 0)}100%{-webkit-transform:none;transform:none}}@keyframes bounceInRight{0%,60%,75%,90%,100%{-webkit-transition-timing-function:cubic-bezier(0.215, 0.61, 0.355, 1);transition-timing-function:cubic-bezier(0.215, 0.61, 0.355, 1)}0%{opacity:0;-webkit-transform:translate3d(3000px, 0, 0);transform:translate3d(3000px, 0, 0)}60%{opacity:1;-webkit-transform:translate3d(-25px, 0, 0);transform:translate3d(-25px, 0, 0)}75%{-webkit-transform:translate3d(10px, 0, 0);transform:translate3d(10px, 0, 0)}90%{-webkit-transform:translate3d(-5px, 0, 0);transform:translate3d(-5px, 0, 0)}100%{-webkit-transform:none;transform:none}}.bounceInRight{-webkit-animation-name:bounceInRight;animation-name:bounceInRight}@-webkit-keyframes bounceInUp{0%,60%,75%,90%,100%{-webkit-transition-timing-function:cubic-bezier(0.215, 0.61, 0.355, 1);transition-timing-function:cubic-bezier(0.215, 0.61, 0.355, 1)}0%{opacity:0;-webkit-transform:translate3d(0, 3000px, 0);transform:translate3d(0, 3000px, 0)}60%{opacity:1;-webkit-transform:translate3d(0, -20px, 0);transform:translate3d(0, -20px, 0)}75%{-webkit-transform:translate3d(0, 10px, 0);transform:translate3d(0, 10px, 0)}90%{-webkit-transform:translate3d(0, -5px, 0);transform:translate3d(0, -5px, 0)}100%{-webkit-transform:translate3d(0, 0, 0);transform:translate3d(0, 0, 0)}}@keyframes bounceInUp{0%,60%,75%,90%,100%{-webkit-transition-timing-function:cubic-bezier(0.215, 0.61, 0.355, 1);transition-timing-function:cubic-bezier(0.215, 0.61, 0.355, 1)}0%{opacity:0;-webkit-transform:translate3d(0, 3000px, 0);transform:translate3d(0, 3000px, 0)}60%{opacity:1;-webkit-transform:translate3d(0, -20px, 0);transform:translate3d(0, -20px, 0)}75%{-webkit-transform:translate3d(0, 10px, 0);transform:translate3d(0, 10px, 0)}90%{-webkit-transform:translate3d(0, -5px, 0);transform:translate3d(0, -5px, 0)}100%{-webkit-transform:translate3d(0, 0, 0);transform:translate3d(0, 0, 0)}}.bounceInUp{-webkit-animation-name:bounceInUp;animation-name:bounceInUp}@-webkit-keyframes bounceOut{20%{-webkit-transform:scale3d(0.9, 0.9, 0.9);transform:scale3d(0.9, 0.9, 0.9)}50%,55%{opacity:1;-webkit-transform:scale3d(1.1, 1.1, 1.1);transform:scale3d(1.1, 1.1, 1.1)}100%{opacity:0;-webkit-transform:scale3d(0.3, 0.3, 0.3);transform:scale3d(0.3, 0.3, 0.3)}}@keyframes bounceOut{20%{-webkit-transform:scale3d(0.9, 0.9, 0.9);transform:scale3d(0.9, 0.9, 0.9)}50%,55%{opacity:1;-webkit-transform:scale3d(1.1, 1.1, 1.1);transform:scale3d(1.1, 1.1, 1.1)}100%{opacity:0;-webkit-transform:scale3d(0.3, 0.3, 0.3);transform:scale3d(0.3, 0.3, 0.3)}}.bounceOut{-webkit-animation-name:bounceOut;animation-name:bounceOut;-webkit-animation-duration:0.75s;animation-duration:0.75s}@-webkit-keyframes bounceOutDown{20%{-webkit-transform:translate3d(0, 10px, 0);transform:translate3d(0, 10px, 0)}40%,45%{opacity:1;-webkit-transform:translate3d(0, -20px, 0);transform:translate3d(0, -20px, 0)}100%{opacity:0;-webkit-transform:translate3d(0, 2000px, 0);transform:translate3d(0, 2000px, 0)}}@keyframes bounceOutDown{20%{-webkit-transform:translate3d(0, 10px, 0);transform:translate3d(0, 10px, 0)}40%,45%{opacity:1;-webkit-transform:translate3d(0, -20px, 0);transform:translate3d(0, -20px, 0)}100%{opacity:0;-webkit-transform:translate3d(0, 2000px, 0);transform:translate3d(0, 2000px, 0)}}.bounceOutDown{-webkit-animation-name:bounceOutDown;animation-name:bounceOutDown}@-webkit-keyframes bounceOutLeft{20%{opacity:1;-webkit-transform:translate3d(20px, 0, 0);transform:translate3d(20px, 0, 0)}100%{opacity:0;-webkit-transform:translate3d(-2000px, 0, 0);transform:translate3d(-2000px, 0, 0)}}@keyframes bounceOutLeft{20%{opacity:1;-webkit-transform:translate3d(20px, 0, 0);transform:translate3d(20px, 0, 0)}100%{opacity:0;-webkit-transform:translate3d(-2000px, 0, 0);transform:translate3d(-2000px, 0, 0)}}.bounceOutLeft{-webkit-animation-name:bounceOutLeft;animation-name:bounceOutLeft}@-webkit-keyframes bounceOutRight{20%{opacity:1;-webkit-transform:translate3d(-20px, 0, 0);transform:translate3d(-20px, 0, 0)}100%{opacity:0;-webkit-transform:translate3d(2000px, 0, 0);transform:translate3d(2000px, 0, 0)}}@keyframes bounceOutRight{20%{opacity:1;-webkit-transform:translate3d(-20px, 0, 0);transform:translate3d(-20px, 0, 0)}100%{opacity:0;-webkit-transform:translate3d(2000px, 0, 0);transform:translate3d(2000px, 0, 0)}}.bounceOutRight{-webkit-animation-name:bounceOutRight;animation-name:bounceOutRight}@-webkit-keyframes bounceOutUp{20%{-webkit-transform:translate3d(0, -10px, 0);transform:translate3d(0, -10px, 0)}40%,45%{opacity:1;-webkit-transform:translate3d(0, 20px, 0);transform:translate3d(0, 20px, 0)}100%{opacity:0;-webkit-transform:translate3d(0, -2000px, 0);transform:translate3d(0, -2000px, 0)}}@keyframes bounceOutUp{20%{-webkit-transform:translate3d(0, -10px, 0);transform:translate3d(0, -10px, 0)}40%,45%{opacity:1;-webkit-transform:translate3d(0, 20px, 0);transform:translate3d(0, 20px, 0)}100%{opacity:0;-webkit-transform:translate3d(0, -2000px, 0);transform:translate3d(0, -2000px, 0)}}.bounceOutUp{-webkit-animation-name:bounceOutUp;animation-name:bounceOutUp}@-webkit-keyframes fadeIn{0%{opacity:0}100%{opacity:1}}@keyframes fadeIn{0%{opacity:0}100%{opacity:1}}.fadeIn{-webkit-animation-name:fadeIn;animation-name:fadeIn}@-webkit-keyframes fadeInDown{0%{opacity:0;-webkit-transform:translate3d(0, -100%, 0);transform:translate3d(0, -100%, 0)}100%{opacity:1;-webkit-transform:none;transform:none}}@keyframes fadeInDown{0%{opacity:0;-webkit-transform:translate3d(0, -100%, 0);transform:translate3d(0, -100%, 0)}100%{opacity:1;-webkit-transform:none;transform:none}}.fadeInDown{-webkit-animation-name:fadeInDown;animation-name:fadeInDown}@-webkit-keyframes fadeInDownBig{0%{opacity:0;-webkit-transform:translate3d(0, -2000px, 0);transform:translate3d(0, -2000px, 0)}100%{opacity:1;-webkit-transform:none;transform:none}}@keyframes fadeInDownBig{0%{opacity:0;-webkit-transform:translate3d(0, -2000px, 0);transform:translate3d(0, -2000px, 0)}100%{opacity:1;-webkit-transform:none;transform:none}}.fadeInDownBig{-webkit-animation-name:fadeInDownBig;animation-name:fadeInDownBig}@-webkit-keyframes fadeInLeft{0%{opacity:0;-webkit-transform:translate3d(-100%, 0, 0);transform:translate3d(-100%, 0, 0)}100%{opacity:1;-webkit-transform:none;transform:none}}@keyframes fadeInLeft{0%{opacity:0;-webkit-transform:translate3d(-100%, 0, 0);transform:translate3d(-100%, 0, 0)}100%{opacity:1;-webkit-transform:none;transform:none}}.fadeInLeft{-webkit-animation-name:fadeInLeft;animation-name:fadeInLeft}@-webkit-keyframes fadeInLeftBig{0%{opacity:0;-webkit-transform:translate3d(-2000px, 0, 0);transform:translate3d(-2000px, 0, 0)}100%{opacity:1;-webkit-transform:none;transform:none}}@keyframes fadeInLeftBig{0%{opacity:0;-webkit-transform:translate3d(-2000px, 0, 0);transform:translate3d(-2000px, 0, 0)}100%{opacity:1;-webkit-transform:none;transform:none}}.fadeInLeftBig{-webkit-animation-name:fadeInLeftBig;animation-name:fadeInLeftBig}@-webkit-keyframes fadeInRight{0%{opacity:0;-webkit-transform:translate3d(100%, 0, 0);transform:translate3d(100%, 0, 0)}100%{opacity:1;-webkit-transform:none;transform:none}}@keyframes fadeInRight{0%{opacity:0;-webkit-transform:translate3d(100%, 0, 0);transform:translate3d(100%, 0, 0)}100%{opacity:1;-webkit-transform:none;transform:none}}.fadeInRight{-webkit-animation-name:fadeInRight;animation-name:fadeInRight}@-webkit-keyframes fadeInRightBig{0%{opacity:0;-webkit-transform:translate3d(2000px, 0, 0);transform:translate3d(2000px, 0, 0)}100%{opacity:1;-webkit-transform:none;transform:none}}@keyframes fadeInRightBig{0%{opacity:0;-webkit-transform:translate3d(2000px, 0, 0);transform:translate3d(2000px, 0, 0)}100%{opacity:1;-webkit-transform:none;transform:none}}.fadeInRightBig{-webkit-animation-name:fadeInRightBig;animation-name:fadeInRightBig}@-webkit-keyframes fadeInUp{0%{opacity:0;-webkit-transform:translate3d(0, 100%, 0);transform:translate3d(0, 100%, 0)}100%{opacity:1;-webkit-transform:none;transform:none}}@keyframes fadeInUp{0%{opacity:0;-webkit-transform:translate3d(0, 100%, 0);transform:translate3d(0, 100%, 0)}100%{opacity:1;-webkit-transform:none;transform:none}}.fadeInUp{-webkit-animation-name:fadeInUp;animation-name:fadeInUp}@-webkit-keyframes fadeInUpBig{0%{opacity:0;-webkit-transform:translate3d(0, 2000px, 0);transform:translate3d(0, 2000px, 0)}100%{opacity:1;-webkit-transform:none;transform:none}}@keyframes fadeInUpBig{0%{opacity:0;-webkit-transform:translate3d(0, 2000px, 0);transform:translate3d(0, 2000px, 0)}100%{opacity:1;-webkit-transform:none;transform:none}}.fadeInUpBig{-webkit-animation-name:fadeInUpBig;animation-name:fadeInUpBig}@-webkit-keyframes fadeOut{0%{opacity:1}100%{opacity:0}}@keyframes fadeOut{0%{opacity:1}100%{opacity:0}}.fadeOut{-webkit-animation-name:fadeOut;animation-name:fadeOut}@-webkit-keyframes fadeOutDown{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(0, 100%, 0);transform:translate3d(0, 100%, 0)}}@keyframes fadeOutDown{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(0, 100%, 0);transform:translate3d(0, 100%, 0)}}.fadeOutDown{-webkit-animation-name:fadeOutDown;animation-name:fadeOutDown}@-webkit-keyframes fadeOutDownBig{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(0, 2000px, 0);transform:translate3d(0, 2000px, 0)}}@keyframes fadeOutDownBig{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(0, 2000px, 0);transform:translate3d(0, 2000px, 0)}}.fadeOutDownBig{-webkit-animation-name:fadeOutDownBig;animation-name:fadeOutDownBig}@-webkit-keyframes fadeOutLeft{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(-100%, 0, 0);transform:translate3d(-100%, 0, 0)}}@keyframes fadeOutLeft{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(-100%, 0, 0);transform:translate3d(-100%, 0, 0)}}.fadeOutLeft{-webkit-animation-name:fadeOutLeft;animation-name:fadeOutLeft}@-webkit-keyframes fadeOutLeftBig{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(-2000px, 0, 0);transform:translate3d(-2000px, 0, 0)}}@keyframes fadeOutLeftBig{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(-2000px, 0, 0);transform:translate3d(-2000px, 0, 0)}}.fadeOutLeftBig{-webkit-animation-name:fadeOutLeftBig;animation-name:fadeOutLeftBig}@-webkit-keyframes fadeOutRight{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(100%, 0, 0);transform:translate3d(100%, 0, 0)}}@keyframes fadeOutRight{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(100%, 0, 0);transform:translate3d(100%, 0, 0)}}.fadeOutRight{-webkit-animation-name:fadeOutRight;animation-name:fadeOutRight}@-webkit-keyframes fadeOutRightBig{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(2000px, 0, 0);transform:translate3d(2000px, 0, 0)}}@keyframes fadeOutRightBig{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(2000px, 0, 0);transform:translate3d(2000px, 0, 0)}}.fadeOutRightBig{-webkit-animation-name:fadeOutRightBig;animation-name:fadeOutRightBig}@-webkit-keyframes fadeOutUp{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(0, -100%, 0);transform:translate3d(0, -100%, 0)}}@keyframes fadeOutUp{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(0, -100%, 0);transform:translate3d(0, -100%, 0)}}.fadeOutUp{-webkit-animation-name:fadeOutUp;animation-name:fadeOutUp}@-webkit-keyframes fadeOutUpBig{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(0, -2000px, 0);transform:translate3d(0, -2000px, 0)}}@keyframes fadeOutUpBig{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(0, -2000px, 0);transform:translate3d(0, -2000px, 0)}}.fadeOutUpBig{-webkit-animation-name:fadeOutUpBig;animation-name:fadeOutUpBig}@-webkit-keyframes flip{0%{-webkit-transform:perspective(400px) rotate3d(0, 1, 0, -360deg);transform:perspective(400px) rotate3d(0, 1, 0, -360deg);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}40%{-webkit-transform:perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -190deg);transform:perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -190deg);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}50%{-webkit-transform:perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -170deg);transform:perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -170deg);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}80%{-webkit-transform:perspective(400px) scale3d(0.95, 0.95, 0.95);transform:perspective(400px) scale3d(0.95, 0.95, 0.95);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}100%{-webkit-transform:perspective(400px);transform:perspective(400px);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}}@keyframes flip{0%{-webkit-transform:perspective(400px) rotate3d(0, 1, 0, -360deg);transform:perspective(400px) rotate3d(0, 1, 0, -360deg);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}40%{-webkit-transform:perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -190deg);transform:perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -190deg);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}50%{-webkit-transform:perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -170deg);transform:perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -170deg);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}80%{-webkit-transform:perspective(400px) scale3d(0.95, 0.95, 0.95);transform:perspective(400px) scale3d(0.95, 0.95, 0.95);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}100%{-webkit-transform:perspective(400px);transform:perspective(400px);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}}.animated.flip{-webkit-backface-visibility:visible;backface-visibility:visible;-webkit-animation-name:flip;animation-name:flip}@-webkit-keyframes flipInX{0%{-webkit-transform:perspective(400px) rotate3d(1, 0, 0, 90deg);transform:perspective(400px) rotate3d(1, 0, 0, 90deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in;opacity:0}40%{-webkit-transform:perspective(400px) rotate3d(1, 0, 0, -20deg);transform:perspective(400px) rotate3d(1, 0, 0, -20deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in}60%{-webkit-transform:perspective(400px) rotate3d(1, 0, 0, 10deg);transform:perspective(400px) rotate3d(1, 0, 0, 10deg);opacity:1}80%{-webkit-transform:perspective(400px) rotate3d(1, 0, 0, -5deg);transform:perspective(400px) rotate3d(1, 0, 0, -5deg)}100%{-webkit-transform:perspective(400px);transform:perspective(400px)}}@keyframes flipInX{0%{-webkit-transform:perspective(400px) rotate3d(1, 0, 0, 90deg);transform:perspective(400px) rotate3d(1, 0, 0, 90deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in;opacity:0}40%{-webkit-transform:perspective(400px) rotate3d(1, 0, 0, -20deg);transform:perspective(400px) rotate3d(1, 0, 0, -20deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in}60%{-webkit-transform:perspective(400px) rotate3d(1, 0, 0, 10deg);transform:perspective(400px) rotate3d(1, 0, 0, 10deg);opacity:1}80%{-webkit-transform:perspective(400px) rotate3d(1, 0, 0, -5deg);transform:perspective(400px) rotate3d(1, 0, 0, -5deg)}100%{-webkit-transform:perspective(400px);transform:perspective(400px)}}.flipInX{-webkit-backface-visibility:visible !important;backface-visibility:visible !important;-webkit-animation-name:flipInX;animation-name:flipInX}@-webkit-keyframes flipInY{0%{-webkit-transform:perspective(400px) rotate3d(0, 1, 0, 90deg);transform:perspective(400px) rotate3d(0, 1, 0, 90deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in;opacity:0}40%{-webkit-transform:perspective(400px) rotate3d(0, 1, 0, -20deg);transform:perspective(400px) rotate3d(0, 1, 0, -20deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in}60%{-webkit-transform:perspective(400px) rotate3d(0, 1, 0, 10deg);transform:perspective(400px) rotate3d(0, 1, 0, 10deg);opacity:1}80%{-webkit-transform:perspective(400px) rotate3d(0, 1, 0, -5deg);transform:perspective(400px) rotate3d(0, 1, 0, -5deg)}100%{-webkit-transform:perspective(400px);transform:perspective(400px)}}@keyframes flipInY{0%{-webkit-transform:perspective(400px) rotate3d(0, 1, 0, 90deg);transform:perspective(400px) rotate3d(0, 1, 0, 90deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in;opacity:0}40%{-webkit-transform:perspective(400px) rotate3d(0, 1, 0, -20deg);transform:perspective(400px) rotate3d(0, 1, 0, -20deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in}60%{-webkit-transform:perspective(400px) rotate3d(0, 1, 0, 10deg);transform:perspective(400px) rotate3d(0, 1, 0, 10deg);opacity:1}80%{-webkit-transform:perspective(400px) rotate3d(0, 1, 0, -5deg);transform:perspective(400px) rotate3d(0, 1, 0, -5deg)}100%{-webkit-transform:perspective(400px);transform:perspective(400px)}}.flipInY{-webkit-backface-visibility:visible !important;backface-visibility:visible !important;-webkit-animation-name:flipInY;animation-name:flipInY}@-webkit-keyframes flipOutX{0%{-webkit-transform:perspective(400px);transform:perspective(400px)}30%{-webkit-transform:perspective(400px) rotate3d(1, 0, 0, -20deg);transform:perspective(400px) rotate3d(1, 0, 0, -20deg);opacity:1}100%{-webkit-transform:perspective(400px) rotate3d(1, 0, 0, 90deg);transform:perspective(400px) rotate3d(1, 0, 0, 90deg);opacity:0}}@keyframes flipOutX{0%{-webkit-transform:perspective(400px);transform:perspective(400px)}30%{-webkit-transform:perspective(400px) rotate3d(1, 0, 0, -20deg);transform:perspective(400px) rotate3d(1, 0, 0, -20deg);opacity:1}100%{-webkit-transform:perspective(400px) rotate3d(1, 0, 0, 90deg);transform:perspective(400px) rotate3d(1, 0, 0, 90deg);opacity:0}}.flipOutX{-webkit-animation-name:flipOutX;animation-name:flipOutX;-webkit-animation-duration:0.75s;animation-duration:0.75s;-webkit-backface-visibility:visible !important;backface-visibility:visible !important}@-webkit-keyframes flipOutY{0%{-webkit-transform:perspective(400px);transform:perspective(400px)}30%{-webkit-transform:perspective(400px) rotate3d(0, 1, 0, -15deg);transform:perspective(400px) rotate3d(0, 1, 0, -15deg);opacity:1}100%{-webkit-transform:perspective(400px) rotate3d(0, 1, 0, 90deg);transform:perspective(400px) rotate3d(0, 1, 0, 90deg);opacity:0}}@keyframes flipOutY{0%{-webkit-transform:perspective(400px);transform:perspective(400px)}30%{-webkit-transform:perspective(400px) rotate3d(0, 1, 0, -15deg);transform:perspective(400px) rotate3d(0, 1, 0, -15deg);opacity:1}100%{-webkit-transform:perspective(400px) rotate3d(0, 1, 0, 90deg);transform:perspective(400px) rotate3d(0, 1, 0, 90deg);opacity:0}}.flipOutY{-webkit-backface-visibility:visible !important;backface-visibility:visible !important;-webkit-animation-name:flipOutY;animation-name:flipOutY;-webkit-animation-duration:0.75s;animation-duration:0.75s}@-webkit-keyframes lightSpeedIn{0%{-webkit-transform:translate3d(100%, 0, 0) skewX(-30deg);transform:translate3d(100%, 0, 0) skewX(-30deg);opacity:0}60%{-webkit-transform:skewX(20deg);transform:skewX(20deg);opacity:1}80%{-webkit-transform:skewX(-5deg);transform:skewX(-5deg);opacity:1}100%{-webkit-transform:none;transform:none;opacity:1}}@keyframes lightSpeedIn{0%{-webkit-transform:translate3d(100%, 0, 0) skewX(-30deg);transform:translate3d(100%, 0, 0) skewX(-30deg);opacity:0}60%{-webkit-transform:skewX(20deg);transform:skewX(20deg);opacity:1}80%{-webkit-transform:skewX(-5deg);transform:skewX(-5deg);opacity:1}100%{-webkit-transform:none;transform:none;opacity:1}}.lightSpeedIn{-webkit-animation-name:lightSpeedIn;animation-name:lightSpeedIn;-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}@-webkit-keyframes lightSpeedOut{0%{opacity:1}100%{-webkit-transform:translate3d(100%, 0, 0) skewX(30deg);transform:translate3d(100%, 0, 0) skewX(30deg);opacity:0}}@keyframes lightSpeedOut{0%{opacity:1}100%{-webkit-transform:translate3d(100%, 0, 0) skewX(30deg);transform:translate3d(100%, 0, 0) skewX(30deg);opacity:0}}.lightSpeedOut{-webkit-animation-name:lightSpeedOut;animation-name:lightSpeedOut;-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}@-webkit-keyframes rotateIn{0%{-webkit-transform-origin:center;transform-origin:center;-webkit-transform:rotate3d(0, 0, 1, -200deg);transform:rotate3d(0, 0, 1, -200deg);opacity:0}100%{-webkit-transform-origin:center;transform-origin:center;-webkit-transform:none;transform:none;opacity:1}}@keyframes rotateIn{0%{-webkit-transform-origin:center;transform-origin:center;-webkit-transform:rotate3d(0, 0, 1, -200deg);transform:rotate3d(0, 0, 1, -200deg);opacity:0}100%{-webkit-transform-origin:center;transform-origin:center;-webkit-transform:none;transform:none;opacity:1}}.rotateIn{-webkit-animation-name:rotateIn;animation-name:rotateIn}@-webkit-keyframes rotateInDownLeft{0%{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:rotate3d(0, 0, 1, -45deg);transform:rotate3d(0, 0, 1, -45deg);opacity:0}100%{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:none;transform:none;opacity:1}}@keyframes rotateInDownLeft{0%{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:rotate3d(0, 0, 1, -45deg);transform:rotate3d(0, 0, 1, -45deg);opacity:0}100%{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:none;transform:none;opacity:1}}.rotateInDownLeft{-webkit-animation-name:rotateInDownLeft;animation-name:rotateInDownLeft}@-webkit-keyframes rotateInDownRight{0%{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:rotate3d(0, 0, 1, 45deg);transform:rotate3d(0, 0, 1, 45deg);opacity:0}100%{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:none;transform:none;opacity:1}}@keyframes rotateInDownRight{0%{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:rotate3d(0, 0, 1, 45deg);transform:rotate3d(0, 0, 1, 45deg);opacity:0}100%{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:none;transform:none;opacity:1}}.rotateInDownRight{-webkit-animation-name:rotateInDownRight;animation-name:rotateInDownRight}@-webkit-keyframes rotateInUpLeft{0%{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:rotate3d(0, 0, 1, 45deg);transform:rotate3d(0, 0, 1, 45deg);opacity:0}100%{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:none;transform:none;opacity:1}}@keyframes rotateInUpLeft{0%{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:rotate3d(0, 0, 1, 45deg);transform:rotate3d(0, 0, 1, 45deg);opacity:0}100%{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:none;transform:none;opacity:1}}.rotateInUpLeft{-webkit-animation-name:rotateInUpLeft;animation-name:rotateInUpLeft}@-webkit-keyframes rotateInUpRight{0%{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:rotate3d(0, 0, 1, -90deg);transform:rotate3d(0, 0, 1, -90deg);opacity:0}100%{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:none;transform:none;opacity:1}}@keyframes rotateInUpRight{0%{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:rotate3d(0, 0, 1, -90deg);transform:rotate3d(0, 0, 1, -90deg);opacity:0}100%{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:none;transform:none;opacity:1}}.rotateInUpRight{-webkit-animation-name:rotateInUpRight;animation-name:rotateInUpRight}@-webkit-keyframes rotateOut{0%{-webkit-transform-origin:center;transform-origin:center;opacity:1}100%{-webkit-transform-origin:center;transform-origin:center;-webkit-transform:rotate3d(0, 0, 1, 200deg);transform:rotate3d(0, 0, 1, 200deg);opacity:0}}@keyframes rotateOut{0%{-webkit-transform-origin:center;transform-origin:center;opacity:1}100%{-webkit-transform-origin:center;transform-origin:center;-webkit-transform:rotate3d(0, 0, 1, 200deg);transform:rotate3d(0, 0, 1, 200deg);opacity:0}}.rotateOut{-webkit-animation-name:rotateOut;animation-name:rotateOut}@-webkit-keyframes rotateOutDownLeft{0%{-webkit-transform-origin:left bottom;transform-origin:left bottom;opacity:1}100%{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:rotate3d(0, 0, 1, 45deg);transform:rotate3d(0, 0, 1, 45deg);opacity:0}}@keyframes rotateOutDownLeft{0%{-webkit-transform-origin:left bottom;transform-origin:left bottom;opacity:1}100%{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:rotate3d(0, 0, 1, 45deg);transform:rotate3d(0, 0, 1, 45deg);opacity:0}}.rotateOutDownLeft{-webkit-animation-name:rotateOutDownLeft;animation-name:rotateOutDownLeft}@-webkit-keyframes rotateOutDownRight{0%{-webkit-transform-origin:right bottom;transform-origin:right bottom;opacity:1}100%{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:rotate3d(0, 0, 1, -45deg);transform:rotate3d(0, 0, 1, -45deg);opacity:0}}@keyframes rotateOutDownRight{0%{-webkit-transform-origin:right bottom;transform-origin:right bottom;opacity:1}100%{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:rotate3d(0, 0, 1, -45deg);transform:rotate3d(0, 0, 1, -45deg);opacity:0}}.rotateOutDownRight{-webkit-animation-name:rotateOutDownRight;animation-name:rotateOutDownRight}@-webkit-keyframes rotateOutUpLeft{0%{-webkit-transform-origin:left bottom;transform-origin:left bottom;opacity:1}100%{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:rotate3d(0, 0, 1, -45deg);transform:rotate3d(0, 0, 1, -45deg);opacity:0}}@keyframes rotateOutUpLeft{0%{-webkit-transform-origin:left bottom;transform-origin:left bottom;opacity:1}100%{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:rotate3d(0, 0, 1, -45deg);transform:rotate3d(0, 0, 1, -45deg);opacity:0}}.rotateOutUpLeft{-webkit-animation-name:rotateOutUpLeft;animation-name:rotateOutUpLeft}@-webkit-keyframes rotateOutUpRight{0%{-webkit-transform-origin:right bottom;transform-origin:right bottom;opacity:1}100%{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:rotate3d(0, 0, 1, 90deg);transform:rotate3d(0, 0, 1, 90deg);opacity:0}}@keyframes rotateOutUpRight{0%{-webkit-transform-origin:right bottom;transform-origin:right bottom;opacity:1}100%{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:rotate3d(0, 0, 1, 90deg);transform:rotate3d(0, 0, 1, 90deg);opacity:0}}.rotateOutUpRight{-webkit-animation-name:rotateOutUpRight;animation-name:rotateOutUpRight}@-webkit-keyframes hinge{0%{-webkit-transform-origin:top left;transform-origin:top left;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}20%,60%{-webkit-transform:rotate3d(0, 0, 1, 80deg);transform:rotate3d(0, 0, 1, 80deg);-webkit-transform-origin:top left;transform-origin:top left;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}40%,80%{-webkit-transform:rotate3d(0, 0, 1, 60deg);transform:rotate3d(0, 0, 1, 60deg);-webkit-transform-origin:top left;transform-origin:top left;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out;opacity:1}100%{-webkit-transform:translate3d(0, 700px, 0);transform:translate3d(0, 700px, 0);opacity:0}}@keyframes hinge{0%{-webkit-transform-origin:top left;transform-origin:top left;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}20%,60%{-webkit-transform:rotate3d(0, 0, 1, 80deg);transform:rotate3d(0, 0, 1, 80deg);-webkit-transform-origin:top left;transform-origin:top left;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}40%,80%{-webkit-transform:rotate3d(0, 0, 1, 60deg);transform:rotate3d(0, 0, 1, 60deg);-webkit-transform-origin:top left;transform-origin:top left;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out;opacity:1}100%{-webkit-transform:translate3d(0, 700px, 0);transform:translate3d(0, 700px, 0);opacity:0}}.hinge{-webkit-animation-name:hinge;animation-name:hinge}@-webkit-keyframes rollIn{0%{opacity:0;-webkit-transform:translate3d(-100%, 0, 0) rotate3d(0, 0, 1, -120deg);transform:translate3d(-100%, 0, 0) rotate3d(0, 0, 1, -120deg)}100%{opacity:1;-webkit-transform:none;transform:none}}@keyframes rollIn{0%{opacity:0;-webkit-transform:translate3d(-100%, 0, 0) rotate3d(0, 0, 1, -120deg);transform:translate3d(-100%, 0, 0) rotate3d(0, 0, 1, -120deg)}100%{opacity:1;-webkit-transform:none;transform:none}}.rollIn{-webkit-animation-name:rollIn;animation-name:rollIn}@-webkit-keyframes rollOut{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(100%, 0, 0) rotate3d(0, 0, 1, 120deg);transform:translate3d(100%, 0, 0) rotate3d(0, 0, 1, 120deg)}}@keyframes rollOut{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(100%, 0, 0) rotate3d(0, 0, 1, 120deg);transform:translate3d(100%, 0, 0) rotate3d(0, 0, 1, 120deg)}}.rollOut{-webkit-animation-name:rollOut;animation-name:rollOut}@-webkit-keyframes zoomIn{0%{opacity:0;-webkit-transform:scale3d(0.3, 0.3, 0.3);transform:scale3d(0.3, 0.3, 0.3)}50%{opacity:1}}@keyframes zoomIn{0%{opacity:0;-webkit-transform:scale3d(0.3, 0.3, 0.3);transform:scale3d(0.3, 0.3, 0.3)}50%{opacity:1}}.zoomIn{-webkit-animation-name:zoomIn;animation-name:zoomIn}@-webkit-keyframes zoomInDown{0%{opacity:0;-webkit-transform:scale3d(0.1, 0.1, 0.1) translate3d(0, -1000px, 0);transform:scale3d(0.1, 0.1, 0.1) translate3d(0, -1000px, 0);-webkit-animation-timing-function:cubic-bezier(0.55, 0.055, 0.675, 0.19);animation-timing-function:cubic-bezier(0.55, 0.055, 0.675, 0.19)}60%{opacity:1;-webkit-transform:scale3d(0.475, 0.475, 0.475) translate3d(0, 60px, 0);transform:scale3d(0.475, 0.475, 0.475) translate3d(0, 60px, 0);-webkit-animation-timing-function:cubic-bezier(0.175, 0.885, 0.32, 1);animation-timing-function:cubic-bezier(0.175, 0.885, 0.32, 1)}}@keyframes zoomInDown{0%{opacity:0;-webkit-transform:scale3d(0.1, 0.1, 0.1) translate3d(0, -1000px, 0);transform:scale3d(0.1, 0.1, 0.1) translate3d(0, -1000px, 0);-webkit-animation-timing-function:cubic-bezier(0.55, 0.055, 0.675, 0.19);animation-timing-function:cubic-bezier(0.55, 0.055, 0.675, 0.19)}60%{opacity:1;-webkit-transform:scale3d(0.475, 0.475, 0.475) translate3d(0, 60px, 0);transform:scale3d(0.475, 0.475, 0.475) translate3d(0, 60px, 0);-webkit-animation-timing-function:cubic-bezier(0.175, 0.885, 0.32, 1);animation-timing-function:cubic-bezier(0.175, 0.885, 0.32, 1)}}.zoomInDown{-webkit-animation-name:zoomInDown;animation-name:zoomInDown}@-webkit-keyframes zoomInLeft{0%{opacity:0;-webkit-transform:scale3d(0.1, 0.1, 0.1) translate3d(-1000px, 0, 0);transform:scale3d(0.1, 0.1, 0.1) translate3d(-1000px, 0, 0);-webkit-animation-timing-function:cubic-bezier(0.55, 0.055, 0.675, 0.19);animation-timing-function:cubic-bezier(0.55, 0.055, 0.675, 0.19)}60%{opacity:1;-webkit-transform:scale3d(0.475, 0.475, 0.475) translate3d(10px, 0, 0);transform:scale3d(0.475, 0.475, 0.475) translate3d(10px, 0, 0);-webkit-animation-timing-function:cubic-bezier(0.175, 0.885, 0.32, 1);animation-timing-function:cubic-bezier(0.175, 0.885, 0.32, 1)}}@keyframes zoomInLeft{0%{opacity:0;-webkit-transform:scale3d(0.1, 0.1, 0.1) translate3d(-1000px, 0, 0);transform:scale3d(0.1, 0.1, 0.1) translate3d(-1000px, 0, 0);-webkit-animation-timing-function:cubic-bezier(0.55, 0.055, 0.675, 0.19);animation-timing-function:cubic-bezier(0.55, 0.055, 0.675, 0.19)}60%{opacity:1;-webkit-transform:scale3d(0.475, 0.475, 0.475) translate3d(10px, 0, 0);transform:scale3d(0.475, 0.475, 0.475) translate3d(10px, 0, 0);-webkit-animation-timing-function:cubic-bezier(0.175, 0.885, 0.32, 1);animation-timing-function:cubic-bezier(0.175, 0.885, 0.32, 1)}}.zoomInLeft{-webkit-animation-name:zoomInLeft;animation-name:zoomInLeft}@-webkit-keyframes zoomInRight{0%{opacity:0;-webkit-transform:scale3d(0.1, 0.1, 0.1) translate3d(1000px, 0, 0);transform:scale3d(0.1, 0.1, 0.1) translate3d(1000px, 0, 0);-webkit-animation-timing-function:cubic-bezier(0.55, 0.055, 0.675, 0.19);animation-timing-function:cubic-bezier(0.55, 0.055, 0.675, 0.19)}60%{opacity:1;-webkit-transform:scale3d(0.475, 0.475, 0.475) translate3d(-10px, 0, 0);transform:scale3d(0.475, 0.475, 0.475) translate3d(-10px, 0, 0);-webkit-animation-timing-function:cubic-bezier(0.175, 0.885, 0.32, 1);animation-timing-function:cubic-bezier(0.175, 0.885, 0.32, 1)}}@keyframes zoomInRight{0%{opacity:0;-webkit-transform:scale3d(0.1, 0.1, 0.1) translate3d(1000px, 0, 0);transform:scale3d(0.1, 0.1, 0.1) translate3d(1000px, 0, 0);-webkit-animation-timing-function:cubic-bezier(0.55, 0.055, 0.675, 0.19);animation-timing-function:cubic-bezier(0.55, 0.055, 0.675, 0.19)}60%{opacity:1;-webkit-transform:scale3d(0.475, 0.475, 0.475) translate3d(-10px, 0, 0);transform:scale3d(0.475, 0.475, 0.475) translate3d(-10px, 0, 0);-webkit-animation-timing-function:cubic-bezier(0.175, 0.885, 0.32, 1);animation-timing-function:cubic-bezier(0.175, 0.885, 0.32, 1)}}.zoomInRight{-webkit-animation-name:zoomInRight;animation-name:zoomInRight}@-webkit-keyframes zoomInUp{0%{opacity:0;-webkit-transform:scale3d(0.1, 0.1, 0.1) translate3d(0, 1000px, 0);transform:scale3d(0.1, 0.1, 0.1) translate3d(0, 1000px, 0);-webkit-animation-timing-function:cubic-bezier(0.55, 0.055, 0.675, 0.19);animation-timing-function:cubic-bezier(0.55, 0.055, 0.675, 0.19)}60%{opacity:1;-webkit-transform:scale3d(0.475, 0.475, 0.475) translate3d(0, -60px, 0);transform:scale3d(0.475, 0.475, 0.475) translate3d(0, -60px, 0);-webkit-animation-timing-function:cubic-bezier(0.175, 0.885, 0.32, 1);animation-timing-function:cubic-bezier(0.175, 0.885, 0.32, 1)}}@keyframes zoomInUp{0%{opacity:0;-webkit-transform:scale3d(0.1, 0.1, 0.1) translate3d(0, 1000px, 0);transform:scale3d(0.1, 0.1, 0.1) translate3d(0, 1000px, 0);-webkit-animation-timing-function:cubic-bezier(0.55, 0.055, 0.675, 0.19);animation-timing-function:cubic-bezier(0.55, 0.055, 0.675, 0.19)}60%{opacity:1;-webkit-transform:scale3d(0.475, 0.475, 0.475) translate3d(0, -60px, 0);transform:scale3d(0.475, 0.475, 0.475) translate3d(0, -60px, 0);-webkit-animation-timing-function:cubic-bezier(0.175, 0.885, 0.32, 1);animation-timing-function:cubic-bezier(0.175, 0.885, 0.32, 1)}}.zoomInUp{-webkit-animation-name:zoomInUp;animation-name:zoomInUp}@-webkit-keyframes zoomOut{0%{opacity:1}50%{opacity:0;-webkit-transform:scale3d(0.3, 0.3, 0.3);transform:scale3d(0.3, 0.3, 0.3)}100%{opacity:0}}@keyframes zoomOut{0%{opacity:1}50%{opacity:0;-webkit-transform:scale3d(0.3, 0.3, 0.3);transform:scale3d(0.3, 0.3, 0.3)}100%{opacity:0}}.zoomOut{-webkit-animation-name:zoomOut;animation-name:zoomOut}@-webkit-keyframes zoomOutDown{40%{opacity:1;-webkit-transform:scale3d(0.475, 0.475, 0.475) translate3d(0, -60px, 0);transform:scale3d(0.475, 0.475, 0.475) translate3d(0, -60px, 0);-webkit-animation-timing-function:cubic-bezier(0.55, 0.055, 0.675, 0.19);animation-timing-function:cubic-bezier(0.55, 0.055, 0.675, 0.19)}100%{opacity:0;-webkit-transform:scale3d(0.1, 0.1, 0.1) translate3d(0, 2000px, 0);transform:scale3d(0.1, 0.1, 0.1) translate3d(0, 2000px, 0);-webkit-transform-origin:center bottom;transform-origin:center bottom;-webkit-animation-timing-function:cubic-bezier(0.175, 0.885, 0.32, 1);animation-timing-function:cubic-bezier(0.175, 0.885, 0.32, 1)}}@keyframes zoomOutDown{40%{opacity:1;-webkit-transform:scale3d(0.475, 0.475, 0.475) translate3d(0, -60px, 0);transform:scale3d(0.475, 0.475, 0.475) translate3d(0, -60px, 0);-webkit-animation-timing-function:cubic-bezier(0.55, 0.055, 0.675, 0.19);animation-timing-function:cubic-bezier(0.55, 0.055, 0.675, 0.19)}100%{opacity:0;-webkit-transform:scale3d(0.1, 0.1, 0.1) translate3d(0, 2000px, 0);transform:scale3d(0.1, 0.1, 0.1) translate3d(0, 2000px, 0);-webkit-transform-origin:center bottom;transform-origin:center bottom;-webkit-animation-timing-function:cubic-bezier(0.175, 0.885, 0.32, 1);animation-timing-function:cubic-bezier(0.175, 0.885, 0.32, 1)}}.zoomOutDown{-webkit-animation-name:zoomOutDown;animation-name:zoomOutDown}@-webkit-keyframes zoomOutLeft{40%{opacity:1;-webkit-transform:scale3d(0.475, 0.475, 0.475) translate3d(42px, 0, 0);transform:scale3d(0.475, 0.475, 0.475) translate3d(42px, 0, 0)}100%{opacity:0;-webkit-transform:scale(0.1) translate3d(-2000px, 0, 0);transform:scale(0.1) translate3d(-2000px, 0, 0);-webkit-transform-origin:left center;transform-origin:left center}}@keyframes zoomOutLeft{40%{opacity:1;-webkit-transform:scale3d(0.475, 0.475, 0.475) translate3d(42px, 0, 0);transform:scale3d(0.475, 0.475, 0.475) translate3d(42px, 0, 0)}100%{opacity:0;-webkit-transform:scale(0.1) translate3d(-2000px, 0, 0);transform:scale(0.1) translate3d(-2000px, 0, 0);-webkit-transform-origin:left center;transform-origin:left center}}.zoomOutLeft{-webkit-animation-name:zoomOutLeft;animation-name:zoomOutLeft}@-webkit-keyframes zoomOutRight{40%{opacity:1;-webkit-transform:scale3d(0.475, 0.475, 0.475) translate3d(-42px, 0, 0);transform:scale3d(0.475, 0.475, 0.475) translate3d(-42px, 0, 0)}100%{opacity:0;-webkit-transform:scale(0.1) translate3d(2000px, 0, 0);transform:scale(0.1) translate3d(2000px, 0, 0);-webkit-transform-origin:right center;transform-origin:right center}}@keyframes zoomOutRight{40%{opacity:1;-webkit-transform:scale3d(0.475, 0.475, 0.475) translate3d(-42px, 0, 0);transform:scale3d(0.475, 0.475, 0.475) translate3d(-42px, 0, 0)}100%{opacity:0;-webkit-transform:scale(0.1) translate3d(2000px, 0, 0);transform:scale(0.1) translate3d(2000px, 0, 0);-webkit-transform-origin:right center;transform-origin:right center}}.zoomOutRight{-webkit-animation-name:zoomOutRight;animation-name:zoomOutRight}@-webkit-keyframes zoomOutUp{40%{opacity:1;-webkit-transform:scale3d(0.475, 0.475, 0.475) translate3d(0, 60px, 0);transform:scale3d(0.475, 0.475, 0.475) translate3d(0, 60px, 0);-webkit-animation-timing-function:cubic-bezier(0.55, 0.055, 0.675, 0.19);animation-timing-function:cubic-bezier(0.55, 0.055, 0.675, 0.19)}100%{opacity:0;-webkit-transform:scale3d(0.1, 0.1, 0.1) translate3d(0, -2000px, 0);transform:scale3d(0.1, 0.1, 0.1) translate3d(0, -2000px, 0);-webkit-transform-origin:center bottom;transform-origin:center bottom;-webkit-animation-timing-function:cubic-bezier(0.175, 0.885, 0.32, 1);animation-timing-function:cubic-bezier(0.175, 0.885, 0.32, 1)}}@keyframes zoomOutUp{40%{opacity:1;-webkit-transform:scale3d(0.475, 0.475, 0.475) translate3d(0, 60px, 0);transform:scale3d(0.475, 0.475, 0.475) translate3d(0, 60px, 0);-webkit-animation-timing-function:cubic-bezier(0.55, 0.055, 0.675, 0.19);animation-timing-function:cubic-bezier(0.55, 0.055, 0.675, 0.19)}100%{opacity:0;-webkit-transform:scale3d(0.1, 0.1, 0.1) translate3d(0, -2000px, 0);transform:scale3d(0.1, 0.1, 0.1) translate3d(0, -2000px, 0);-webkit-transform-origin:center bottom;transform-origin:center bottom;-webkit-animation-timing-function:cubic-bezier(0.175, 0.885, 0.32, 1);animation-timing-function:cubic-bezier(0.175, 0.885, 0.32, 1)}}.zoomOutUp{-webkit-animation-name:zoomOutUp;animation-name:zoomOutUp}@-webkit-keyframes slideInDown{0%{-webkit-transform:translateY(-100%);transform:translateY(-100%);visibility:visible}100%{-webkit-transform:translateY(0);transform:translateY(0)}}@keyframes slideInDown{0%{-webkit-transform:translateY(-100%);transform:translateY(-100%);visibility:visible}100%{-webkit-transform:translateY(0);transform:translateY(0)}}.slideInDown{-webkit-animation-name:slideInDown;animation-name:slideInDown}@-webkit-keyframes slideInLeft{0%{-webkit-transform:translateX(-100%);transform:translateX(-100%);visibility:visible}100%{-webkit-transform:translateX(0);transform:translateX(0)}}@keyframes slideInLeft{0%{-webkit-transform:translateX(-100%);transform:translateX(-100%);visibility:visible}100%{-webkit-transform:translateX(0);transform:translateX(0)}}.slideInLeft{-webkit-animation-name:slideInLeft;animation-name:slideInLeft}@-webkit-keyframes slideInRight{0%{-webkit-transform:translateX(100%);transform:translateX(100%);visibility:visible}100%{-webkit-transform:translateX(0);transform:translateX(0)}}@keyframes slideInRight{0%{-webkit-transform:translateX(100%);transform:translateX(100%);visibility:visible}100%{-webkit-transform:translateX(0);transform:translateX(0)}}.slideInRight{-webkit-animation-name:slideInRight;animation-name:slideInRight}@-webkit-keyframes slideInUp{0%{-webkit-transform:translateY(100%);transform:translateY(100%);visibility:visible}100%{-webkit-transform:translateY(0);transform:translateY(0)}}@keyframes slideInUp{0%{-webkit-transform:translateY(100%);transform:translateY(100%);visibility:visible}100%{-webkit-transform:translateY(0);transform:translateY(0)}}.slideInUp{-webkit-animation-name:slideInUp;animation-name:slideInUp}@-webkit-keyframes slideOutDown{0%{-webkit-transform:translateY(0);transform:translateY(0)}100%{visibility:hidden;-webkit-transform:translateY(100%);transform:translateY(100%)}}@keyframes slideOutDown{0%{-webkit-transform:translateY(0);transform:translateY(0)}100%{visibility:hidden;-webkit-transform:translateY(100%);transform:translateY(100%)}}.slideOutDown{-webkit-animation-name:slideOutDown;animation-name:slideOutDown}@-webkit-keyframes slideOutLeft{0%{-webkit-transform:translateX(0);transform:translateX(0)}100%{visibility:hidden;-webkit-transform:translateX(-100%);transform:translateX(-100%)}}@keyframes slideOutLeft{0%{-webkit-transform:translateX(0);transform:translateX(0)}100%{visibility:hidden;-webkit-transform:translateX(-100%);transform:translateX(-100%)}}.slideOutLeft{-webkit-animation-name:slideOutLeft;animation-name:slideOutLeft}@-webkit-keyframes slideOutRight{0%{-webkit-transform:translateX(0);transform:translateX(0)}100%{visibility:hidden;-webkit-transform:translateX(100%);transform:translateX(100%)}}@keyframes slideOutRight{0%{-webkit-transform:translateX(0);transform:translateX(0)}100%{visibility:hidden;-webkit-transform:translateX(100%);transform:translateX(100%)}}.slideOutRight{-webkit-animation-name:slideOutRight;animation-name:slideOutRight}@-webkit-keyframes slideOutUp{0%{-webkit-transform:translateY(0);transform:translateY(0)}100%{visibility:hidden;-webkit-transform:translateY(-100%);transform:translateY(-100%)}}@keyframes slideOutUp{0%{-webkit-transform:translateY(0);transform:translateY(0)}100%{visibility:hidden;-webkit-transform:translateY(-100%);transform:translateY(-100%)}}.slideOutUp{-webkit-animation-name:slideOutUp;animation-name:slideOutUp}.btn{border:1px solid #E0E3E9;display:inline-block;border-radius:2px;box-shadow:inset 0 1px 0 white,0 1px 1px rgba(0,0,0,0.1);background-color:#FAFAFA;background-image:-webkit-linear-gradient(#FAFAFA, #EFF1F3);background-image:linear-gradient(#FAFAFA, #EFF1F3);font-size:0.75em;font-weight:600;color:#828B9A;text-decoration:none;padding:0.5em 0.9375em}.btn:hover{background-color:#fbfbfb;background-image:-webkit-linear-gradient(#fbfbfb, #f2f4f5);background-image:linear-gradient(#fbfbfb, #f2f4f5)}.btn.disabled{cursor:default;opacity:0.5}.btn.disabled:active{box-shadow:inset 0 1px 0 white,0 1px 1px rgba(0,0,0,0.1)}.btn.danger{color:#E06488}.btn:focus{outline:0}.btn:active{box-shadow:inset 0 0 2px rgba(0,0,0,0.1)}form{margin:0}form.ng-submitted .ng-invalid{border-color:#E55A84 !important}.form-container{width:100%}.form-row{display:block;margin-bottom:10px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.form-row:after{content:"";display:table;clear:both}.form-col{float:left;display:block;margin-right:2.35765%;width:48.82117%}.form-col:last-child{margin-right:0}.form-col.padded:first-child{padding:0 20px 0 0}.form-col.padded:last-child{padding:0 0 0 20px}.form-group>label{font-size:0.75em;color:#AEB4BE;display:inline-block;line-height:1.875em}.form-group .form-error{font-size:0.75em;color:#E06488;float:right}.form-group .form-error img{vertical-align:bottom;margin-right:3px}.form-group.optional>label:after{content:" (optional)"}.form-group.error input.form-control,.form-group.error textarea.form-control{border-color:#E55A84;background:rgba(229,90,132,0.02)}.form-group input.form-control,.form-group textarea.form-control{border-radius:3px;border:1px solid #D9DDE3;font-size:1.125em;-webkit-transition:border-color 0.1s ease-in-out;-moz-transition:border-color 0.1s ease-in-out;transition:border-color 0.1s ease-in-out}.form-group input.form-control.ng-pristine,.form-group textarea.form-control.ng-pristine{background:#f8f9fa}.form-group input.form-control:focus,.form-group textarea.form-control:focus{border-color:#5AC4E5;box-shadow:0 0 3px rgba(90,196,229,0.5);outline:none;background:white}.form-group input.form-control.extend,.form-group textarea.form-control.extend{width:100%}.form-group input.form-control::-webkit-input-placeholder,.form-group textarea.form-control::-webkit-input-placeholder{color:rgba(174,180,190,0.7)}.form-group input.form-control::-moz-placeholder,.form-group textarea.form-control::-moz-placeholder{color:rgba(174,180,190,0.7)}.form-group input.form-control:-moz-placeholder,.form-group textarea.form-control:-moz-placeholder{color:rgba(174,180,190,0.7)}.form-group input.form-control:-ms-input-placeholder,.form-group textarea.form-control:-ms-input-placeholder{color:rgba(174,180,190,0.7)}.form-group .form-btn{padding:0.75em 0.9375em}.form-group input.form-control{vertical-align:middle;padding:0.3125em 0.625em}.form-group textarea.form-control{min-height:135px;font-size:1.125em;padding:0.5em 0.625em}.form-submit-message{display:inline-block;margin-left:0.3125em;font-size:0.75em}.form-submit-message.error{color:#E06488}.form-submit-message img{vertical-align:middle;margin-right:0.3125em}.box{background:white;border:1px solid #D9DDE3;border-radius:3px;margin:0 auto 20px auto;max-width:800px;padding:20px 25px}.box.box-x-scroll{overflow-x:scroll}.box.invisible{background:transparent;border:0;padding:0;margin-bottom:40px}.box.highlight{border-color:#5AC4E5;box-shadow:0 0 3px rgba(90,196,229,0.5)}.box:last-child{margin-bottom:40px}.box-title{font-size:24px;font-weight:bold;color:#3D4043;margin-bottom:20px}.box-description{font-size:14px;color:#828B9A;padding-bottom:20px;border-bottom:1px solid #D9DDE3;margin-top:-20px;margin-bottom:20px}.box-description a{color:#3D4043;text-decoration:none}.box-description a:hover{border:1px solid #D9DDE3}.box-section{padding-top:20px;display:block}.box-section:after{content:"";display:table;clear:both}.box-section .section-details{float:left;display:block;margin-right:2.35765%;width:23.23176%}.box-section .section-details:last-child{margin-right:0}.box-section .section-details .section-title{font-size:0.875em;color:#828B9A;margin-bottom:20px}.box-section .section-main{float:left;display:block;margin-right:2.35765%;width:74.41059%}.box-section .section-main:last-child{margin-right:0}.box-message{text-align:center;padding:40px;max-width:450px;margin:0 auto}.box-message .main-image{margin-bottom:20px}.box-message .title{font-weight:bold;font-size:1.5em;color:#3D4043;margin-bottom:0.625em}.box-message .content{font-size:0.875em;color:#828B9A;margin-bottom:20px}.box-message .mini-divider:after{content:"";display:inline-block;width:200px;height:1px;background:#D9DDE3;margin:20px auto}.box-side-sticky{padding:20px 25px;box-sizing:content-box;width:100%;margin-left:-25px}.box-bottom-sticky{padding:20px 25px;box-sizing:content-box;width:100%;margin-top:20px;border-bottom-left-radius:3px;border-bottom-right-radius:3px;border-top:1px solid #D9DDE3;margin-bottom:-20px;margin-left:-25px}.box-controls{text-align:right;box-shadow:inset 0 1px 0 white;background:#f8f9fa;margin-top:20px;padding:15px 25px}.ng-submitted .ng-invalid>.datepicker{border-color:#E55A84}.datepicker{width:100%;border:1px solid rgba(217,221,227,0.5);border-radius:3px;background:white;padding:0.625em;-webkit-transition:border-color 0.1s ease-in-out;-moz-transition:border-color 0.1s ease-in-out;transition:border-color 0.1s ease-in-out}.datepicker table{width:100%;font-size:1em}.datepicker tbody:before{content:'';display:block;height:0.625em}.datepicker .prev,.datepicker .next{opacity:0.5;color:#828B9A;cursor:pointer;border-radius:5px;position:relative}.datepicker .prev:hover,.datepicker .next:hover{opacity:1}.datepicker .prev:hover:after,.datepicker .next:hover:after{opacity:1;background:rgba(217,221,227,0.3)}.datepicker .prev:after,.datepicker .next:after{content:" ";cursor:pointer;opacity:0;position:absolute;width:1.75em;height:1.75em;margin-left:-0.875em;margin-top:-0.875em;left:50%;top:50%;border-radius:3px;-webkit-transition:background-color 0.1s ease-in-out;-moz-transition:background-color 0.1s ease-in-out;transition:background-color 0.1s ease-in-out}.datepicker .datepicker-switch{padding:10px;font-weight:600;font-size:1.125em;border-radius:3px;cursor:pointer;-webkit-transition:background-color 0.1s ease-in-out;-moz-transition:background-color 0.1s ease-in-out;transition:background-color 0.1s ease-in-out}.datepicker .datepicker-switch:hover{background:rgba(217,221,227,0.4)}.datepicker .dow{padding:10px;font-weight:normal;text-transform:uppercase;color:#E55A84;font-size:0.875em;border-bottom:2px solid rgba(217,221,227,0.3)}.datepicker .dow,.datepicker .day{padding:0.9375em}.datepicker .day{text-align:center;font-weight:600;position:relative;font-size:0.875em}.datepicker .day.today{color:#818176}.datepicker .day.today:after{opacity:1;background:rgba(255,255,0,0.1)}.datepicker .day:hover{cursor:pointer}.datepicker .day:hover:after{opacity:1;background:rgba(217,221,227,0.4)}.datepicker .day.new,.datepicker .day.old{font-weight:normal;color:#AEB4BE}.datepicker .day.active{background:white;color:#6EBC48}.datepicker .day.active:after{opacity:1;background:rgba(110,188,72,0.1)}.datepicker .day:active:after{opacity:0.8}.datepicker .day:after{content:" ";-webkit-transition:all 0.1s ease-in-out;-moz-transition:all 0.1s ease-in-out;transition:all 0.1s ease-in-out;cursor:pointer;opacity:0;position:absolute;width:2.1875em;height:2.1875em;margin-left:-1.09375em;margin-top:-1.09375em;left:50%;top:50%;border-radius:3px}.datepicker .month,.datepicker .year{width:33.3%;display:inline-block;text-align:center;font-size:0.875em;padding:1.25em;cursor:pointer;-webkit-transition:background-color 0.1s ease-in-out;-moz-transition:background-color 0.1s ease-in-out;transition:background-color 0.1s ease-in-out;border-radius:3px;text-transform:uppercase}.datepicker .month:hover,.datepicker .year:hover{background:rgba(217,221,227,0.3)}.daticon-list{margin:0;margin-left:-10px;list-style:none;padding:5px;text-align:left}.daticon-list .placeholder{line-height:1.125em;font-size:0.75em;color:#ccc}.daticon-list li{margin:5px;display:inline-block}.daticon{box-shadow:0 0 0 1px rgba(217,221,227,0.5);border-radius:3px;display:inline-block;padding:0.5em 1em;text-align:center;position:relative;cursor:default;background:white}.daticon .dow{font-size:0.375em;margin-top:-1.5em;background:white;color:#AEB4BE;margin-bottom:0.25em;font-weight:normal;text-transform:uppercase}.daticon .day{font-size:1.25em;font-weight:normal;color:#E55A84;line-height:1em}.daticon .month{font-weight:600;font-size:0.75em;text-transform:uppercase}.daticon .delete{text-align:center;border:0;width:1.125em;height:1.125em;position:absolute;top:-7.2px;right:-7.2px;border-radius:100%;display:inline-block;background:rgba(217,221,227,0.5) url(../images/close@2x.png) no-repeat center center;background-size:7px 8px;cursor:pointer;opacity:0}.daticon .delete:hover{background-color:rgba(217,221,227,0.8)}.daticon .count{text-align:center;border:0;width:18px;height:18px;position:absolute;top:-7.2px;right:-7.2px;border-radius:100%;font-weight:bold;display:inline-block;background:#bcc3cd;color:white;font-size:9px;line-height:18px;-webkit-transition:background-color 0.2s ease-in-out;-moz-transition:background-color 0.2s ease-in-out;transition:background-color 0.2s ease-in-out}.daticon .count.top{background:#FF5D5D}.daticon:hover .delete{opacity:1}.rl-modal{background:white;position:fixed;top:50%;left:50%;width:50%;max-width:400px;display:inline-block;min-width:200px;height:auto;z-index:2000;overflow:hidden;border-radius:5px;box-shadow:0 0 0 1px #D9DDE3,0 0 0 5px rgba(217,221,227,0.8),0 0 10px 5px rgba(0,0,0,0.2);-webkit-transform:translateX(-50%) translateY(-50%);-moz-transform:translateX(-50%) translateY(-50%);-ms-transform:translateX(-50%) translateY(-50%);-o-transform:translateX(-50%) translateY(-50%);transform:translateX(-50%) translateY(-50%)}.rl-modal .rl-modal-message{padding:0 20px 20px 20px;font-size:0.75em;color:#828B9A}.rl-modal .rl-modal-title{padding:20px 20px 0 20px;font-size:1.125em;font-weight:bold}.rl-modal .rl-modal-actions{border-top:1px solid #D9DDE3;box-shadow:inset 0 1px 0 white;background:#f8f9fa;text-align:right;padding:0.625em 1.25em}.rl-modal-overlay{position:fixed;z-index:1999;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,0.1)}.poll{min-width:100%;display:block}.poll-header{display:table;min-width:100%;border-bottom:1px solid #D9DDE3;box-shadow:0 3px 0 rgba(217,221,227,0.3)}.poll-header .header{display:table-cell;vertical-align:bottom;padding-bottom:20px}.poll-header .header.date-header{text-align:center;min-width:70px;width:70px}.poll-header .header.actions-header{min-width:160px}.poll-header .header.participants-header{font-weight:bold;min-width:235px;width:235px;padding-left:0.625em}.poll-body{min-width:100%}.poll-body .poll-entry.highlight{background:#f6f7f9}.poll-body .poll-entry{display:table;min-width:100%;border-bottom:1px solid rgba(217,221,227,0.5)}.poll-body .poll-entry .hover{visibility:hidden}.poll-body .poll-entry:hover .hover{visibility:visible}.poll-body .poll-entry .cell{padding:0.625em;display:table-cell}.poll-body .poll-entry .cell.name-cell{min-width:235px;width:235px;font-size:0.875em}.poll-body .poll-entry .cell.name-cell .avatar{display:inline-block;padding:5px;margin-right:5px;border-radius:2px;background:#D0D5DF}.poll-body .poll-entry .cell.name-cell .avatar.style-1{background:#8A75AE}.poll-body .poll-entry .cell.name-cell .avatar.style-2{background:#80A1DA}.poll-body .poll-entry .cell.name-cell .avatar.style-3{background:#B3DD8B}.poll-body .poll-entry .cell.name-cell .avatar.style-4{background:#7EE4E4}.poll-body .poll-entry .cell.name-cell .avatar.style-5{background:#FCD285}.poll-body .poll-entry .cell.name-cell .avatar.style-6{background:#F7967F}.poll-body .poll-entry .cell.name-cell .avatar.style-7{background:#E8669D}.poll-body .poll-entry .cell.name-cell .avatar.style-8{background:#F7B6E7}.poll-body .poll-entry .cell.name-cell .avatar.style-9{background:#F99D7B}.poll-body .poll-entry .cell.name-cell .avatar.style-10{background:#88D0CB}.poll-body .poll-entry .cell.name-cell .name{padding:5px 3px;margin-left:2px;border-radius:2px}.poll-body .poll-entry .cell.name-cell .name:hover{background:#F5F6F8;cursor:pointer}.poll-body .poll-entry .cell.name-cell .form-control{border:1px solid #D9DDE3;padding:0.3125em;border-radius:2px;color:#3D4043}.poll-body .poll-entry .cell.name-cell .form-control:focus{outline:0;border-color:#5AC4E5;box-shadow:0 0 3px rgba(90,196,229,0.5)}.poll-body .poll-entry .cell.name-cell .form-control::-webkit-input-placeholder{color:rgba(130,139,154,0.7)}.poll-body .poll-entry .cell.name-cell .form-control::-moz-placeholder{color:rgba(130,139,154,0.7)}.poll-body .poll-entry .cell.name-cell .form-control:-moz-placeholder{color:rgba(130,139,154,0.7)}.poll-body .poll-entry .cell.name-cell .form-control:-ms-input-placeholder{color:rgba(130,139,154,0.7)}.poll-body .poll-entry .cell.action-cell{min-width:160px}.poll-body .poll-entry .cell.vote-cell{min-width:70px;width:70px;text-align:center;position:relative}.poll-body .poll-entry .cell.vote-cell .overlay{position:absolute;top:0;left:0;width:100%;height:100%;z-index:10}.poll-body .poll-entry .cell.vote-cell .overlay:hover{background:rgba(217,221,227,0.2);cursor:pointer}.poll-body .poll-entry.ng-submitted .ng-invalid{border-color:#E55A84 !important}.page-placeholder{margin:0 auto;text-align:center;color:#B0B8C4;position:absolute;top:50%;left:50%;-webkit-transform:translateX(-50%) translateY(-50%);-moz-transform:translateX(-50%) translateY(-50%);-ms-transform:translateX(-50%) translateY(-50%);-o-transform:translateX(-50%) translateY(-50%);transform:translateX(-50%) translateY(-50%)}.page-placeholder .image{margin-bottom:20px}.page-placeholder .title{font-size:2.25em;font-weight:bold;margin-bottom:20px}.page-placeholder .content{font-size:0.875em;max-width:320px;font-weight:normal;margin-bottom:20px}.event-description{font-size:1em;white-space:pre-wrap;padding-top:20px;padding-bottom:20px;line-height:1.5em;color:#828B9A;background:#F5F6F8;border-top:1px solid #D9DDE3;margin-top:20px;margin-bottom:-20px}.event-location{font-size:1em}.event-location a{color:#3D4043;text-decoration:none}.event-location a:hover{text-decoration:underline}.event-location img{vertical-align:middle;margin-right:10px}.event-pair{margin-bottom:20px;border-bottom:1px solid #D9DDE3;padding-bottom:20px;float:left;width:100%}.event-pair .icon{display:inline-block;width:30px;float:left;position:relative;text-align:center;height:35px;border-radius:3px;margin-right:10px}.event-pair .icon img{position:absolute;top:50%;left:50%;-webkit-transform:translateX(-50%) translateY(-50%);-moz-transform:translateX(-50%) translateY(-50%);-ms-transform:translateX(-50%) translateY(-50%);-o-transform:translateX(-50%) translateY(-50%);transform:translateX(-50%) translateY(-50%)}.event-pair .content{float:left;display:inline-block}.event-pair .key{font-weight:bold;font-size:11px}.event-pair .value{color:#828B9A}.event-header{width:100%;margin-top:-30px}.event-header .avatar{display:inline-block;margin-right:20px;text-align:center;border-radius:1px;box-shadow:0 0 0 5px white,0 0 0 6px #D9DDE3,inset 0 0 0 1px #D9DDE3;padding:20px;background:#F5F6F8;vertical-align:bottom}.event-header .details{display:inline-block}.event-header .details .title{font-size:1.5em;font-weight:bold}.event-header .details .subtitle{color:#828B9A;font-size:0.875em}.event-header .details .subtitle a{color:#5AC4E5;text-decoration:none}.event-header .details .subtitle a:hover{text-decoration:underline}.event-header .actions{float:right;margin-top:30px}.event-header:hover .actions{visibility:visible} +*/.animated{-webkit-animation-duration:0.3s;animation-duration:0.3s;-webkit-animation-fill-mode:both;animation-fill-mode:both}.animated.infinite{-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite}.animated.hinge{-webkit-animation-duration:2s;animation-duration:2s}@-webkit-keyframes bounce{0%,20%,53%,80%,100%{-webkit-transition-timing-function:cubic-bezier(0.215, 0.61, 0.355, 1);transition-timing-function:cubic-bezier(0.215, 0.61, 0.355, 1);-webkit-transform:translate3d(0, 0, 0);transform:translate3d(0, 0, 0)}40%,43%{-webkit-transition-timing-function:cubic-bezier(0.755, 0.05, 0.855, 0.06);transition-timing-function:cubic-bezier(0.755, 0.05, 0.855, 0.06);-webkit-transform:translate3d(0, -30px, 0);transform:translate3d(0, -30px, 0)}70%{-webkit-transition-timing-function:cubic-bezier(0.755, 0.05, 0.855, 0.06);transition-timing-function:cubic-bezier(0.755, 0.05, 0.855, 0.06);-webkit-transform:translate3d(0, -15px, 0);transform:translate3d(0, -15px, 0)}90%{-webkit-transform:translate3d(0, -4px, 0);transform:translate3d(0, -4px, 0)}}@keyframes bounce{0%,20%,53%,80%,100%{-webkit-transition-timing-function:cubic-bezier(0.215, 0.61, 0.355, 1);transition-timing-function:cubic-bezier(0.215, 0.61, 0.355, 1);-webkit-transform:translate3d(0, 0, 0);transform:translate3d(0, 0, 0)}40%,43%{-webkit-transition-timing-function:cubic-bezier(0.755, 0.05, 0.855, 0.06);transition-timing-function:cubic-bezier(0.755, 0.05, 0.855, 0.06);-webkit-transform:translate3d(0, -30px, 0);transform:translate3d(0, -30px, 0)}70%{-webkit-transition-timing-function:cubic-bezier(0.755, 0.05, 0.855, 0.06);transition-timing-function:cubic-bezier(0.755, 0.05, 0.855, 0.06);-webkit-transform:translate3d(0, -15px, 0);transform:translate3d(0, -15px, 0)}90%{-webkit-transform:translate3d(0, -4px, 0);transform:translate3d(0, -4px, 0)}}.bounce{-webkit-animation-name:bounce;animation-name:bounce;-webkit-transform-origin:center bottom;-ms-transform-origin:center bottom;transform-origin:center bottom}@-webkit-keyframes flash{0%,50%,100%{opacity:1}25%,75%{opacity:0}}@keyframes flash{0%,50%,100%{opacity:1}25%,75%{opacity:0}}.flash{-webkit-animation-name:flash;animation-name:flash}@-webkit-keyframes pulse{0%{-webkit-transform:scale3d(1, 1, 1);transform:scale3d(1, 1, 1)}50%{-webkit-transform:scale3d(1.05, 1.05, 1.05);transform:scale3d(1.05, 1.05, 1.05)}100%{-webkit-transform:scale3d(1, 1, 1);transform:scale3d(1, 1, 1)}}@keyframes pulse{0%{-webkit-transform:scale3d(1, 1, 1);transform:scale3d(1, 1, 1)}50%{-webkit-transform:scale3d(1.05, 1.05, 1.05);transform:scale3d(1.05, 1.05, 1.05)}100%{-webkit-transform:scale3d(1, 1, 1);transform:scale3d(1, 1, 1)}}.pulse{-webkit-animation-name:pulse;animation-name:pulse}@-webkit-keyframes rubberBand{0%{-webkit-transform:scale3d(1, 1, 1);transform:scale3d(1, 1, 1)}30%{-webkit-transform:scale3d(1.25, 0.75, 1);transform:scale3d(1.25, 0.75, 1)}40%{-webkit-transform:scale3d(0.75, 1.25, 1);transform:scale3d(0.75, 1.25, 1)}50%{-webkit-transform:scale3d(1.15, 0.85, 1);transform:scale3d(1.15, 0.85, 1)}65%{-webkit-transform:scale3d(0.95, 1.05, 1);transform:scale3d(0.95, 1.05, 1)}75%{-webkit-transform:scale3d(1.05, 0.95, 1);transform:scale3d(1.05, 0.95, 1)}100%{-webkit-transform:scale3d(1, 1, 1);transform:scale3d(1, 1, 1)}}@keyframes rubberBand{0%{-webkit-transform:scale3d(1, 1, 1);transform:scale3d(1, 1, 1)}30%{-webkit-transform:scale3d(1.25, 0.75, 1);transform:scale3d(1.25, 0.75, 1)}40%{-webkit-transform:scale3d(0.75, 1.25, 1);transform:scale3d(0.75, 1.25, 1)}50%{-webkit-transform:scale3d(1.15, 0.85, 1);transform:scale3d(1.15, 0.85, 1)}65%{-webkit-transform:scale3d(0.95, 1.05, 1);transform:scale3d(0.95, 1.05, 1)}75%{-webkit-transform:scale3d(1.05, 0.95, 1);transform:scale3d(1.05, 0.95, 1)}100%{-webkit-transform:scale3d(1, 1, 1);transform:scale3d(1, 1, 1)}}.rubberBand{-webkit-animation-name:rubberBand;animation-name:rubberBand}@-webkit-keyframes shake{0%,100%{-webkit-transform:translate3d(0, 0, 0);transform:translate3d(0, 0, 0)}10%,30%,50%,70%,90%{-webkit-transform:translate3d(-10px, 0, 0);transform:translate3d(-10px, 0, 0)}20%,40%,60%,80%{-webkit-transform:translate3d(10px, 0, 0);transform:translate3d(10px, 0, 0)}}@keyframes shake{0%,100%{-webkit-transform:translate3d(0, 0, 0);transform:translate3d(0, 0, 0)}10%,30%,50%,70%,90%{-webkit-transform:translate3d(-10px, 0, 0);transform:translate3d(-10px, 0, 0)}20%,40%,60%,80%{-webkit-transform:translate3d(10px, 0, 0);transform:translate3d(10px, 0, 0)}}.shake{-webkit-animation-name:shake;animation-name:shake}@-webkit-keyframes swing{20%{-webkit-transform:rotate3d(0, 0, 1, 15deg);transform:rotate3d(0, 0, 1, 15deg)}40%{-webkit-transform:rotate3d(0, 0, 1, -10deg);transform:rotate3d(0, 0, 1, -10deg)}60%{-webkit-transform:rotate3d(0, 0, 1, 5deg);transform:rotate3d(0, 0, 1, 5deg)}80%{-webkit-transform:rotate3d(0, 0, 1, -5deg);transform:rotate3d(0, 0, 1, -5deg)}100%{-webkit-transform:rotate3d(0, 0, 1, 0deg);transform:rotate3d(0, 0, 1, 0deg)}}@keyframes swing{20%{-webkit-transform:rotate3d(0, 0, 1, 15deg);transform:rotate3d(0, 0, 1, 15deg)}40%{-webkit-transform:rotate3d(0, 0, 1, -10deg);transform:rotate3d(0, 0, 1, -10deg)}60%{-webkit-transform:rotate3d(0, 0, 1, 5deg);transform:rotate3d(0, 0, 1, 5deg)}80%{-webkit-transform:rotate3d(0, 0, 1, -5deg);transform:rotate3d(0, 0, 1, -5deg)}100%{-webkit-transform:rotate3d(0, 0, 1, 0deg);transform:rotate3d(0, 0, 1, 0deg)}}.swing{-webkit-transform-origin:top center;-ms-transform-origin:top center;transform-origin:top center;-webkit-animation-name:swing;animation-name:swing}@-webkit-keyframes tada{0%{-webkit-transform:scale3d(1, 1, 1);transform:scale3d(1, 1, 1)}10%,20%{-webkit-transform:scale3d(0.9, 0.9, 0.9) rotate3d(0, 0, 1, -3deg);transform:scale3d(0.9, 0.9, 0.9) rotate3d(0, 0, 1, -3deg)}30%,50%,70%,90%{-webkit-transform:scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg);transform:scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg)}40%,60%,80%{-webkit-transform:scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg);transform:scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg)}100%{-webkit-transform:scale3d(1, 1, 1);transform:scale3d(1, 1, 1)}}@keyframes tada{0%{-webkit-transform:scale3d(1, 1, 1);transform:scale3d(1, 1, 1)}10%,20%{-webkit-transform:scale3d(0.9, 0.9, 0.9) rotate3d(0, 0, 1, -3deg);transform:scale3d(0.9, 0.9, 0.9) rotate3d(0, 0, 1, -3deg)}30%,50%,70%,90%{-webkit-transform:scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg);transform:scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg)}40%,60%,80%{-webkit-transform:scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg);transform:scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg)}100%{-webkit-transform:scale3d(1, 1, 1);transform:scale3d(1, 1, 1)}}.tada{-webkit-animation-name:tada;animation-name:tada}@-webkit-keyframes wobble{0%{-webkit-transform:none;transform:none}15%{-webkit-transform:translate3d(-25%, 0, 0) rotate3d(0, 0, 1, -5deg);transform:translate3d(-25%, 0, 0) rotate3d(0, 0, 1, -5deg)}30%{-webkit-transform:translate3d(20%, 0, 0) rotate3d(0, 0, 1, 3deg);transform:translate3d(20%, 0, 0) rotate3d(0, 0, 1, 3deg)}45%{-webkit-transform:translate3d(-15%, 0, 0) rotate3d(0, 0, 1, -3deg);transform:translate3d(-15%, 0, 0) rotate3d(0, 0, 1, -3deg)}60%{-webkit-transform:translate3d(10%, 0, 0) rotate3d(0, 0, 1, 2deg);transform:translate3d(10%, 0, 0) rotate3d(0, 0, 1, 2deg)}75%{-webkit-transform:translate3d(-5%, 0, 0) rotate3d(0, 0, 1, -1deg);transform:translate3d(-5%, 0, 0) rotate3d(0, 0, 1, -1deg)}100%{-webkit-transform:none;transform:none}}@keyframes wobble{0%{-webkit-transform:none;transform:none}15%{-webkit-transform:translate3d(-25%, 0, 0) rotate3d(0, 0, 1, -5deg);transform:translate3d(-25%, 0, 0) rotate3d(0, 0, 1, -5deg)}30%{-webkit-transform:translate3d(20%, 0, 0) rotate3d(0, 0, 1, 3deg);transform:translate3d(20%, 0, 0) rotate3d(0, 0, 1, 3deg)}45%{-webkit-transform:translate3d(-15%, 0, 0) rotate3d(0, 0, 1, -3deg);transform:translate3d(-15%, 0, 0) rotate3d(0, 0, 1, -3deg)}60%{-webkit-transform:translate3d(10%, 0, 0) rotate3d(0, 0, 1, 2deg);transform:translate3d(10%, 0, 0) rotate3d(0, 0, 1, 2deg)}75%{-webkit-transform:translate3d(-5%, 0, 0) rotate3d(0, 0, 1, -1deg);transform:translate3d(-5%, 0, 0) rotate3d(0, 0, 1, -1deg)}100%{-webkit-transform:none;transform:none}}.wobble{-webkit-animation-name:wobble;animation-name:wobble}@-webkit-keyframes bounceIn{0%,20%,40%,60%,80%,100%{-webkit-transition-timing-function:cubic-bezier(0.215, 0.61, 0.355, 1);transition-timing-function:cubic-bezier(0.215, 0.61, 0.355, 1)}0%{opacity:0;-webkit-transform:scale3d(0.3, 0.3, 0.3);transform:scale3d(0.3, 0.3, 0.3)}20%{-webkit-transform:scale3d(1.1, 1.1, 1.1);transform:scale3d(1.1, 1.1, 1.1)}40%{-webkit-transform:scale3d(0.9, 0.9, 0.9);transform:scale3d(0.9, 0.9, 0.9)}60%{opacity:1;-webkit-transform:scale3d(1.03, 1.03, 1.03);transform:scale3d(1.03, 1.03, 1.03)}80%{-webkit-transform:scale3d(0.97, 0.97, 0.97);transform:scale3d(0.97, 0.97, 0.97)}100%{opacity:1;-webkit-transform:scale3d(1, 1, 1);transform:scale3d(1, 1, 1)}}@keyframes bounceIn{0%,20%,40%,60%,80%,100%{-webkit-transition-timing-function:cubic-bezier(0.215, 0.61, 0.355, 1);transition-timing-function:cubic-bezier(0.215, 0.61, 0.355, 1)}0%{opacity:0;-webkit-transform:scale3d(0.3, 0.3, 0.3);transform:scale3d(0.3, 0.3, 0.3)}20%{-webkit-transform:scale3d(1.1, 1.1, 1.1);transform:scale3d(1.1, 1.1, 1.1)}40%{-webkit-transform:scale3d(0.9, 0.9, 0.9);transform:scale3d(0.9, 0.9, 0.9)}60%{opacity:1;-webkit-transform:scale3d(1.03, 1.03, 1.03);transform:scale3d(1.03, 1.03, 1.03)}80%{-webkit-transform:scale3d(0.97, 0.97, 0.97);transform:scale3d(0.97, 0.97, 0.97)}100%{opacity:1;-webkit-transform:scale3d(1, 1, 1);transform:scale3d(1, 1, 1)}}.bounceIn{-webkit-animation-name:bounceIn;animation-name:bounceIn;-webkit-animation-duration:0.75s;animation-duration:0.75s}@-webkit-keyframes bounceInDown{0%,60%,75%,90%,100%{-webkit-transition-timing-function:cubic-bezier(0.215, 0.61, 0.355, 1);transition-timing-function:cubic-bezier(0.215, 0.61, 0.355, 1)}0%{opacity:0;-webkit-transform:translate3d(0, -3000px, 0);transform:translate3d(0, -3000px, 0)}60%{opacity:1;-webkit-transform:translate3d(0, 25px, 0);transform:translate3d(0, 25px, 0)}75%{-webkit-transform:translate3d(0, -10px, 0);transform:translate3d(0, -10px, 0)}90%{-webkit-transform:translate3d(0, 5px, 0);transform:translate3d(0, 5px, 0)}100%{-webkit-transform:none;transform:none}}@keyframes bounceInDown{0%,60%,75%,90%,100%{-webkit-transition-timing-function:cubic-bezier(0.215, 0.61, 0.355, 1);transition-timing-function:cubic-bezier(0.215, 0.61, 0.355, 1)}0%{opacity:0;-webkit-transform:translate3d(0, -3000px, 0);transform:translate3d(0, -3000px, 0)}60%{opacity:1;-webkit-transform:translate3d(0, 25px, 0);transform:translate3d(0, 25px, 0)}75%{-webkit-transform:translate3d(0, -10px, 0);transform:translate3d(0, -10px, 0)}90%{-webkit-transform:translate3d(0, 5px, 0);transform:translate3d(0, 5px, 0)}100%{-webkit-transform:none;transform:none}}.bounceInDown{-webkit-animation-name:bounceInDown;animation-name:bounceInDown}@-webkit-keyframes bounceInLeft{0%,60%,75%,90%,100%{-webkit-transition-timing-function:cubic-bezier(0.215, 0.61, 0.355, 1);transition-timing-function:cubic-bezier(0.215, 0.61, 0.355, 1)}0%{opacity:0;-webkit-transform:translate3d(-3000px, 0, 0);transform:translate3d(-3000px, 0, 0)}60%{opacity:1;-webkit-transform:translate3d(25px, 0, 0);transform:translate3d(25px, 0, 0)}75%{-webkit-transform:translate3d(-10px, 0, 0);transform:translate3d(-10px, 0, 0)}90%{-webkit-transform:translate3d(5px, 0, 0);transform:translate3d(5px, 0, 0)}100%{-webkit-transform:none;transform:none}}@keyframes bounceInLeft{0%,60%,75%,90%,100%{-webkit-transition-timing-function:cubic-bezier(0.215, 0.61, 0.355, 1);transition-timing-function:cubic-bezier(0.215, 0.61, 0.355, 1)}0%{opacity:0;-webkit-transform:translate3d(-3000px, 0, 0);transform:translate3d(-3000px, 0, 0)}60%{opacity:1;-webkit-transform:translate3d(25px, 0, 0);transform:translate3d(25px, 0, 0)}75%{-webkit-transform:translate3d(-10px, 0, 0);transform:translate3d(-10px, 0, 0)}90%{-webkit-transform:translate3d(5px, 0, 0);transform:translate3d(5px, 0, 0)}100%{-webkit-transform:none;transform:none}}.bounceInLeft{-webkit-animation-name:bounceInLeft;animation-name:bounceInLeft}@-webkit-keyframes bounceInRight{0%,60%,75%,90%,100%{-webkit-transition-timing-function:cubic-bezier(0.215, 0.61, 0.355, 1);transition-timing-function:cubic-bezier(0.215, 0.61, 0.355, 1)}0%{opacity:0;-webkit-transform:translate3d(3000px, 0, 0);transform:translate3d(3000px, 0, 0)}60%{opacity:1;-webkit-transform:translate3d(-25px, 0, 0);transform:translate3d(-25px, 0, 0)}75%{-webkit-transform:translate3d(10px, 0, 0);transform:translate3d(10px, 0, 0)}90%{-webkit-transform:translate3d(-5px, 0, 0);transform:translate3d(-5px, 0, 0)}100%{-webkit-transform:none;transform:none}}@keyframes bounceInRight{0%,60%,75%,90%,100%{-webkit-transition-timing-function:cubic-bezier(0.215, 0.61, 0.355, 1);transition-timing-function:cubic-bezier(0.215, 0.61, 0.355, 1)}0%{opacity:0;-webkit-transform:translate3d(3000px, 0, 0);transform:translate3d(3000px, 0, 0)}60%{opacity:1;-webkit-transform:translate3d(-25px, 0, 0);transform:translate3d(-25px, 0, 0)}75%{-webkit-transform:translate3d(10px, 0, 0);transform:translate3d(10px, 0, 0)}90%{-webkit-transform:translate3d(-5px, 0, 0);transform:translate3d(-5px, 0, 0)}100%{-webkit-transform:none;transform:none}}.bounceInRight{-webkit-animation-name:bounceInRight;animation-name:bounceInRight}@-webkit-keyframes bounceInUp{0%,60%,75%,90%,100%{-webkit-transition-timing-function:cubic-bezier(0.215, 0.61, 0.355, 1);transition-timing-function:cubic-bezier(0.215, 0.61, 0.355, 1)}0%{opacity:0;-webkit-transform:translate3d(0, 3000px, 0);transform:translate3d(0, 3000px, 0)}60%{opacity:1;-webkit-transform:translate3d(0, -20px, 0);transform:translate3d(0, -20px, 0)}75%{-webkit-transform:translate3d(0, 10px, 0);transform:translate3d(0, 10px, 0)}90%{-webkit-transform:translate3d(0, -5px, 0);transform:translate3d(0, -5px, 0)}100%{-webkit-transform:translate3d(0, 0, 0);transform:translate3d(0, 0, 0)}}@keyframes bounceInUp{0%,60%,75%,90%,100%{-webkit-transition-timing-function:cubic-bezier(0.215, 0.61, 0.355, 1);transition-timing-function:cubic-bezier(0.215, 0.61, 0.355, 1)}0%{opacity:0;-webkit-transform:translate3d(0, 3000px, 0);transform:translate3d(0, 3000px, 0)}60%{opacity:1;-webkit-transform:translate3d(0, -20px, 0);transform:translate3d(0, -20px, 0)}75%{-webkit-transform:translate3d(0, 10px, 0);transform:translate3d(0, 10px, 0)}90%{-webkit-transform:translate3d(0, -5px, 0);transform:translate3d(0, -5px, 0)}100%{-webkit-transform:translate3d(0, 0, 0);transform:translate3d(0, 0, 0)}}.bounceInUp{-webkit-animation-name:bounceInUp;animation-name:bounceInUp}@-webkit-keyframes bounceOut{20%{-webkit-transform:scale3d(0.9, 0.9, 0.9);transform:scale3d(0.9, 0.9, 0.9)}50%,55%{opacity:1;-webkit-transform:scale3d(1.1, 1.1, 1.1);transform:scale3d(1.1, 1.1, 1.1)}100%{opacity:0;-webkit-transform:scale3d(0.3, 0.3, 0.3);transform:scale3d(0.3, 0.3, 0.3)}}@keyframes bounceOut{20%{-webkit-transform:scale3d(0.9, 0.9, 0.9);transform:scale3d(0.9, 0.9, 0.9)}50%,55%{opacity:1;-webkit-transform:scale3d(1.1, 1.1, 1.1);transform:scale3d(1.1, 1.1, 1.1)}100%{opacity:0;-webkit-transform:scale3d(0.3, 0.3, 0.3);transform:scale3d(0.3, 0.3, 0.3)}}.bounceOut{-webkit-animation-name:bounceOut;animation-name:bounceOut;-webkit-animation-duration:0.75s;animation-duration:0.75s}@-webkit-keyframes bounceOutDown{20%{-webkit-transform:translate3d(0, 10px, 0);transform:translate3d(0, 10px, 0)}40%,45%{opacity:1;-webkit-transform:translate3d(0, -20px, 0);transform:translate3d(0, -20px, 0)}100%{opacity:0;-webkit-transform:translate3d(0, 2000px, 0);transform:translate3d(0, 2000px, 0)}}@keyframes bounceOutDown{20%{-webkit-transform:translate3d(0, 10px, 0);transform:translate3d(0, 10px, 0)}40%,45%{opacity:1;-webkit-transform:translate3d(0, -20px, 0);transform:translate3d(0, -20px, 0)}100%{opacity:0;-webkit-transform:translate3d(0, 2000px, 0);transform:translate3d(0, 2000px, 0)}}.bounceOutDown{-webkit-animation-name:bounceOutDown;animation-name:bounceOutDown}@-webkit-keyframes bounceOutLeft{20%{opacity:1;-webkit-transform:translate3d(20px, 0, 0);transform:translate3d(20px, 0, 0)}100%{opacity:0;-webkit-transform:translate3d(-2000px, 0, 0);transform:translate3d(-2000px, 0, 0)}}@keyframes bounceOutLeft{20%{opacity:1;-webkit-transform:translate3d(20px, 0, 0);transform:translate3d(20px, 0, 0)}100%{opacity:0;-webkit-transform:translate3d(-2000px, 0, 0);transform:translate3d(-2000px, 0, 0)}}.bounceOutLeft{-webkit-animation-name:bounceOutLeft;animation-name:bounceOutLeft}@-webkit-keyframes bounceOutRight{20%{opacity:1;-webkit-transform:translate3d(-20px, 0, 0);transform:translate3d(-20px, 0, 0)}100%{opacity:0;-webkit-transform:translate3d(2000px, 0, 0);transform:translate3d(2000px, 0, 0)}}@keyframes bounceOutRight{20%{opacity:1;-webkit-transform:translate3d(-20px, 0, 0);transform:translate3d(-20px, 0, 0)}100%{opacity:0;-webkit-transform:translate3d(2000px, 0, 0);transform:translate3d(2000px, 0, 0)}}.bounceOutRight{-webkit-animation-name:bounceOutRight;animation-name:bounceOutRight}@-webkit-keyframes bounceOutUp{20%{-webkit-transform:translate3d(0, -10px, 0);transform:translate3d(0, -10px, 0)}40%,45%{opacity:1;-webkit-transform:translate3d(0, 20px, 0);transform:translate3d(0, 20px, 0)}100%{opacity:0;-webkit-transform:translate3d(0, -2000px, 0);transform:translate3d(0, -2000px, 0)}}@keyframes bounceOutUp{20%{-webkit-transform:translate3d(0, -10px, 0);transform:translate3d(0, -10px, 0)}40%,45%{opacity:1;-webkit-transform:translate3d(0, 20px, 0);transform:translate3d(0, 20px, 0)}100%{opacity:0;-webkit-transform:translate3d(0, -2000px, 0);transform:translate3d(0, -2000px, 0)}}.bounceOutUp{-webkit-animation-name:bounceOutUp;animation-name:bounceOutUp}@-webkit-keyframes fadeIn{0%{opacity:0}100%{opacity:1}}@keyframes fadeIn{0%{opacity:0}100%{opacity:1}}.fadeIn{-webkit-animation-name:fadeIn;animation-name:fadeIn}@-webkit-keyframes fadeInDown{0%{opacity:0;-webkit-transform:translate3d(0, -100%, 0);transform:translate3d(0, -100%, 0)}100%{opacity:1;-webkit-transform:none;transform:none}}@keyframes fadeInDown{0%{opacity:0;-webkit-transform:translate3d(0, -100%, 0);transform:translate3d(0, -100%, 0)}100%{opacity:1;-webkit-transform:none;transform:none}}.fadeInDown{-webkit-animation-name:fadeInDown;animation-name:fadeInDown}@-webkit-keyframes fadeInDownBig{0%{opacity:0;-webkit-transform:translate3d(0, -2000px, 0);transform:translate3d(0, -2000px, 0)}100%{opacity:1;-webkit-transform:none;transform:none}}@keyframes fadeInDownBig{0%{opacity:0;-webkit-transform:translate3d(0, -2000px, 0);transform:translate3d(0, -2000px, 0)}100%{opacity:1;-webkit-transform:none;transform:none}}.fadeInDownBig{-webkit-animation-name:fadeInDownBig;animation-name:fadeInDownBig}@-webkit-keyframes fadeInLeft{0%{opacity:0;-webkit-transform:translate3d(-100%, 0, 0);transform:translate3d(-100%, 0, 0)}100%{opacity:1;-webkit-transform:none;transform:none}}@keyframes fadeInLeft{0%{opacity:0;-webkit-transform:translate3d(-100%, 0, 0);transform:translate3d(-100%, 0, 0)}100%{opacity:1;-webkit-transform:none;transform:none}}.fadeInLeft{-webkit-animation-name:fadeInLeft;animation-name:fadeInLeft}@-webkit-keyframes fadeInLeftBig{0%{opacity:0;-webkit-transform:translate3d(-2000px, 0, 0);transform:translate3d(-2000px, 0, 0)}100%{opacity:1;-webkit-transform:none;transform:none}}@keyframes fadeInLeftBig{0%{opacity:0;-webkit-transform:translate3d(-2000px, 0, 0);transform:translate3d(-2000px, 0, 0)}100%{opacity:1;-webkit-transform:none;transform:none}}.fadeInLeftBig{-webkit-animation-name:fadeInLeftBig;animation-name:fadeInLeftBig}@-webkit-keyframes fadeInRight{0%{opacity:0;-webkit-transform:translate3d(100%, 0, 0);transform:translate3d(100%, 0, 0)}100%{opacity:1;-webkit-transform:none;transform:none}}@keyframes fadeInRight{0%{opacity:0;-webkit-transform:translate3d(100%, 0, 0);transform:translate3d(100%, 0, 0)}100%{opacity:1;-webkit-transform:none;transform:none}}.fadeInRight{-webkit-animation-name:fadeInRight;animation-name:fadeInRight}@-webkit-keyframes fadeInRightBig{0%{opacity:0;-webkit-transform:translate3d(2000px, 0, 0);transform:translate3d(2000px, 0, 0)}100%{opacity:1;-webkit-transform:none;transform:none}}@keyframes fadeInRightBig{0%{opacity:0;-webkit-transform:translate3d(2000px, 0, 0);transform:translate3d(2000px, 0, 0)}100%{opacity:1;-webkit-transform:none;transform:none}}.fadeInRightBig{-webkit-animation-name:fadeInRightBig;animation-name:fadeInRightBig}@-webkit-keyframes fadeInUp{0%{opacity:0;-webkit-transform:translate3d(0, 100%, 0);transform:translate3d(0, 100%, 0)}100%{opacity:1;-webkit-transform:none;transform:none}}@keyframes fadeInUp{0%{opacity:0;-webkit-transform:translate3d(0, 100%, 0);transform:translate3d(0, 100%, 0)}100%{opacity:1;-webkit-transform:none;transform:none}}.fadeInUp{-webkit-animation-name:fadeInUp;animation-name:fadeInUp}@-webkit-keyframes fadeInUpBig{0%{opacity:0;-webkit-transform:translate3d(0, 2000px, 0);transform:translate3d(0, 2000px, 0)}100%{opacity:1;-webkit-transform:none;transform:none}}@keyframes fadeInUpBig{0%{opacity:0;-webkit-transform:translate3d(0, 2000px, 0);transform:translate3d(0, 2000px, 0)}100%{opacity:1;-webkit-transform:none;transform:none}}.fadeInUpBig{-webkit-animation-name:fadeInUpBig;animation-name:fadeInUpBig}@-webkit-keyframes fadeOut{0%{opacity:1}100%{opacity:0}}@keyframes fadeOut{0%{opacity:1}100%{opacity:0}}.fadeOut{-webkit-animation-name:fadeOut;animation-name:fadeOut}@-webkit-keyframes fadeOutDown{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(0, 100%, 0);transform:translate3d(0, 100%, 0)}}@keyframes fadeOutDown{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(0, 100%, 0);transform:translate3d(0, 100%, 0)}}.fadeOutDown{-webkit-animation-name:fadeOutDown;animation-name:fadeOutDown}@-webkit-keyframes fadeOutDownBig{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(0, 2000px, 0);transform:translate3d(0, 2000px, 0)}}@keyframes fadeOutDownBig{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(0, 2000px, 0);transform:translate3d(0, 2000px, 0)}}.fadeOutDownBig{-webkit-animation-name:fadeOutDownBig;animation-name:fadeOutDownBig}@-webkit-keyframes fadeOutLeft{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(-100%, 0, 0);transform:translate3d(-100%, 0, 0)}}@keyframes fadeOutLeft{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(-100%, 0, 0);transform:translate3d(-100%, 0, 0)}}.fadeOutLeft{-webkit-animation-name:fadeOutLeft;animation-name:fadeOutLeft}@-webkit-keyframes fadeOutLeftBig{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(-2000px, 0, 0);transform:translate3d(-2000px, 0, 0)}}@keyframes fadeOutLeftBig{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(-2000px, 0, 0);transform:translate3d(-2000px, 0, 0)}}.fadeOutLeftBig{-webkit-animation-name:fadeOutLeftBig;animation-name:fadeOutLeftBig}@-webkit-keyframes fadeOutRight{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(100%, 0, 0);transform:translate3d(100%, 0, 0)}}@keyframes fadeOutRight{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(100%, 0, 0);transform:translate3d(100%, 0, 0)}}.fadeOutRight{-webkit-animation-name:fadeOutRight;animation-name:fadeOutRight}@-webkit-keyframes fadeOutRightBig{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(2000px, 0, 0);transform:translate3d(2000px, 0, 0)}}@keyframes fadeOutRightBig{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(2000px, 0, 0);transform:translate3d(2000px, 0, 0)}}.fadeOutRightBig{-webkit-animation-name:fadeOutRightBig;animation-name:fadeOutRightBig}@-webkit-keyframes fadeOutUp{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(0, -100%, 0);transform:translate3d(0, -100%, 0)}}@keyframes fadeOutUp{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(0, -100%, 0);transform:translate3d(0, -100%, 0)}}.fadeOutUp{-webkit-animation-name:fadeOutUp;animation-name:fadeOutUp}@-webkit-keyframes fadeOutUpBig{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(0, -2000px, 0);transform:translate3d(0, -2000px, 0)}}@keyframes fadeOutUpBig{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(0, -2000px, 0);transform:translate3d(0, -2000px, 0)}}.fadeOutUpBig{-webkit-animation-name:fadeOutUpBig;animation-name:fadeOutUpBig}@-webkit-keyframes flip{0%{-webkit-transform:perspective(400px) rotate3d(0, 1, 0, -360deg);transform:perspective(400px) rotate3d(0, 1, 0, -360deg);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}40%{-webkit-transform:perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -190deg);transform:perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -190deg);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}50%{-webkit-transform:perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -170deg);transform:perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -170deg);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}80%{-webkit-transform:perspective(400px) scale3d(0.95, 0.95, 0.95);transform:perspective(400px) scale3d(0.95, 0.95, 0.95);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}100%{-webkit-transform:perspective(400px);transform:perspective(400px);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}}@keyframes flip{0%{-webkit-transform:perspective(400px) rotate3d(0, 1, 0, -360deg);transform:perspective(400px) rotate3d(0, 1, 0, -360deg);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}40%{-webkit-transform:perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -190deg);transform:perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -190deg);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}50%{-webkit-transform:perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -170deg);transform:perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -170deg);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}80%{-webkit-transform:perspective(400px) scale3d(0.95, 0.95, 0.95);transform:perspective(400px) scale3d(0.95, 0.95, 0.95);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}100%{-webkit-transform:perspective(400px);transform:perspective(400px);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}}.animated.flip{-webkit-backface-visibility:visible;backface-visibility:visible;-webkit-animation-name:flip;animation-name:flip}@-webkit-keyframes flipInX{0%{-webkit-transform:perspective(400px) rotate3d(1, 0, 0, 90deg);transform:perspective(400px) rotate3d(1, 0, 0, 90deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in;opacity:0}40%{-webkit-transform:perspective(400px) rotate3d(1, 0, 0, -20deg);transform:perspective(400px) rotate3d(1, 0, 0, -20deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in}60%{-webkit-transform:perspective(400px) rotate3d(1, 0, 0, 10deg);transform:perspective(400px) rotate3d(1, 0, 0, 10deg);opacity:1}80%{-webkit-transform:perspective(400px) rotate3d(1, 0, 0, -5deg);transform:perspective(400px) rotate3d(1, 0, 0, -5deg)}100%{-webkit-transform:perspective(400px);transform:perspective(400px)}}@keyframes flipInX{0%{-webkit-transform:perspective(400px) rotate3d(1, 0, 0, 90deg);transform:perspective(400px) rotate3d(1, 0, 0, 90deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in;opacity:0}40%{-webkit-transform:perspective(400px) rotate3d(1, 0, 0, -20deg);transform:perspective(400px) rotate3d(1, 0, 0, -20deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in}60%{-webkit-transform:perspective(400px) rotate3d(1, 0, 0, 10deg);transform:perspective(400px) rotate3d(1, 0, 0, 10deg);opacity:1}80%{-webkit-transform:perspective(400px) rotate3d(1, 0, 0, -5deg);transform:perspective(400px) rotate3d(1, 0, 0, -5deg)}100%{-webkit-transform:perspective(400px);transform:perspective(400px)}}.flipInX{-webkit-backface-visibility:visible !important;backface-visibility:visible !important;-webkit-animation-name:flipInX;animation-name:flipInX}@-webkit-keyframes flipInY{0%{-webkit-transform:perspective(400px) rotate3d(0, 1, 0, 90deg);transform:perspective(400px) rotate3d(0, 1, 0, 90deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in;opacity:0}40%{-webkit-transform:perspective(400px) rotate3d(0, 1, 0, -20deg);transform:perspective(400px) rotate3d(0, 1, 0, -20deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in}60%{-webkit-transform:perspective(400px) rotate3d(0, 1, 0, 10deg);transform:perspective(400px) rotate3d(0, 1, 0, 10deg);opacity:1}80%{-webkit-transform:perspective(400px) rotate3d(0, 1, 0, -5deg);transform:perspective(400px) rotate3d(0, 1, 0, -5deg)}100%{-webkit-transform:perspective(400px);transform:perspective(400px)}}@keyframes flipInY{0%{-webkit-transform:perspective(400px) rotate3d(0, 1, 0, 90deg);transform:perspective(400px) rotate3d(0, 1, 0, 90deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in;opacity:0}40%{-webkit-transform:perspective(400px) rotate3d(0, 1, 0, -20deg);transform:perspective(400px) rotate3d(0, 1, 0, -20deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in}60%{-webkit-transform:perspective(400px) rotate3d(0, 1, 0, 10deg);transform:perspective(400px) rotate3d(0, 1, 0, 10deg);opacity:1}80%{-webkit-transform:perspective(400px) rotate3d(0, 1, 0, -5deg);transform:perspective(400px) rotate3d(0, 1, 0, -5deg)}100%{-webkit-transform:perspective(400px);transform:perspective(400px)}}.flipInY{-webkit-backface-visibility:visible !important;backface-visibility:visible !important;-webkit-animation-name:flipInY;animation-name:flipInY}@-webkit-keyframes flipOutX{0%{-webkit-transform:perspective(400px);transform:perspective(400px)}30%{-webkit-transform:perspective(400px) rotate3d(1, 0, 0, -20deg);transform:perspective(400px) rotate3d(1, 0, 0, -20deg);opacity:1}100%{-webkit-transform:perspective(400px) rotate3d(1, 0, 0, 90deg);transform:perspective(400px) rotate3d(1, 0, 0, 90deg);opacity:0}}@keyframes flipOutX{0%{-webkit-transform:perspective(400px);transform:perspective(400px)}30%{-webkit-transform:perspective(400px) rotate3d(1, 0, 0, -20deg);transform:perspective(400px) rotate3d(1, 0, 0, -20deg);opacity:1}100%{-webkit-transform:perspective(400px) rotate3d(1, 0, 0, 90deg);transform:perspective(400px) rotate3d(1, 0, 0, 90deg);opacity:0}}.flipOutX{-webkit-animation-name:flipOutX;animation-name:flipOutX;-webkit-animation-duration:0.75s;animation-duration:0.75s;-webkit-backface-visibility:visible !important;backface-visibility:visible !important}@-webkit-keyframes flipOutY{0%{-webkit-transform:perspective(400px);transform:perspective(400px)}30%{-webkit-transform:perspective(400px) rotate3d(0, 1, 0, -15deg);transform:perspective(400px) rotate3d(0, 1, 0, -15deg);opacity:1}100%{-webkit-transform:perspective(400px) rotate3d(0, 1, 0, 90deg);transform:perspective(400px) rotate3d(0, 1, 0, 90deg);opacity:0}}@keyframes flipOutY{0%{-webkit-transform:perspective(400px);transform:perspective(400px)}30%{-webkit-transform:perspective(400px) rotate3d(0, 1, 0, -15deg);transform:perspective(400px) rotate3d(0, 1, 0, -15deg);opacity:1}100%{-webkit-transform:perspective(400px) rotate3d(0, 1, 0, 90deg);transform:perspective(400px) rotate3d(0, 1, 0, 90deg);opacity:0}}.flipOutY{-webkit-backface-visibility:visible !important;backface-visibility:visible !important;-webkit-animation-name:flipOutY;animation-name:flipOutY;-webkit-animation-duration:0.75s;animation-duration:0.75s}@-webkit-keyframes lightSpeedIn{0%{-webkit-transform:translate3d(100%, 0, 0) skewX(-30deg);transform:translate3d(100%, 0, 0) skewX(-30deg);opacity:0}60%{-webkit-transform:skewX(20deg);transform:skewX(20deg);opacity:1}80%{-webkit-transform:skewX(-5deg);transform:skewX(-5deg);opacity:1}100%{-webkit-transform:none;transform:none;opacity:1}}@keyframes lightSpeedIn{0%{-webkit-transform:translate3d(100%, 0, 0) skewX(-30deg);transform:translate3d(100%, 0, 0) skewX(-30deg);opacity:0}60%{-webkit-transform:skewX(20deg);transform:skewX(20deg);opacity:1}80%{-webkit-transform:skewX(-5deg);transform:skewX(-5deg);opacity:1}100%{-webkit-transform:none;transform:none;opacity:1}}.lightSpeedIn{-webkit-animation-name:lightSpeedIn;animation-name:lightSpeedIn;-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}@-webkit-keyframes lightSpeedOut{0%{opacity:1}100%{-webkit-transform:translate3d(100%, 0, 0) skewX(30deg);transform:translate3d(100%, 0, 0) skewX(30deg);opacity:0}}@keyframes lightSpeedOut{0%{opacity:1}100%{-webkit-transform:translate3d(100%, 0, 0) skewX(30deg);transform:translate3d(100%, 0, 0) skewX(30deg);opacity:0}}.lightSpeedOut{-webkit-animation-name:lightSpeedOut;animation-name:lightSpeedOut;-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}@-webkit-keyframes rotateIn{0%{-webkit-transform-origin:center;transform-origin:center;-webkit-transform:rotate3d(0, 0, 1, -200deg);transform:rotate3d(0, 0, 1, -200deg);opacity:0}100%{-webkit-transform-origin:center;transform-origin:center;-webkit-transform:none;transform:none;opacity:1}}@keyframes rotateIn{0%{-webkit-transform-origin:center;transform-origin:center;-webkit-transform:rotate3d(0, 0, 1, -200deg);transform:rotate3d(0, 0, 1, -200deg);opacity:0}100%{-webkit-transform-origin:center;transform-origin:center;-webkit-transform:none;transform:none;opacity:1}}.rotateIn{-webkit-animation-name:rotateIn;animation-name:rotateIn}@-webkit-keyframes rotateInDownLeft{0%{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:rotate3d(0, 0, 1, -45deg);transform:rotate3d(0, 0, 1, -45deg);opacity:0}100%{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:none;transform:none;opacity:1}}@keyframes rotateInDownLeft{0%{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:rotate3d(0, 0, 1, -45deg);transform:rotate3d(0, 0, 1, -45deg);opacity:0}100%{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:none;transform:none;opacity:1}}.rotateInDownLeft{-webkit-animation-name:rotateInDownLeft;animation-name:rotateInDownLeft}@-webkit-keyframes rotateInDownRight{0%{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:rotate3d(0, 0, 1, 45deg);transform:rotate3d(0, 0, 1, 45deg);opacity:0}100%{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:none;transform:none;opacity:1}}@keyframes rotateInDownRight{0%{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:rotate3d(0, 0, 1, 45deg);transform:rotate3d(0, 0, 1, 45deg);opacity:0}100%{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:none;transform:none;opacity:1}}.rotateInDownRight{-webkit-animation-name:rotateInDownRight;animation-name:rotateInDownRight}@-webkit-keyframes rotateInUpLeft{0%{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:rotate3d(0, 0, 1, 45deg);transform:rotate3d(0, 0, 1, 45deg);opacity:0}100%{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:none;transform:none;opacity:1}}@keyframes rotateInUpLeft{0%{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:rotate3d(0, 0, 1, 45deg);transform:rotate3d(0, 0, 1, 45deg);opacity:0}100%{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:none;transform:none;opacity:1}}.rotateInUpLeft{-webkit-animation-name:rotateInUpLeft;animation-name:rotateInUpLeft}@-webkit-keyframes rotateInUpRight{0%{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:rotate3d(0, 0, 1, -90deg);transform:rotate3d(0, 0, 1, -90deg);opacity:0}100%{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:none;transform:none;opacity:1}}@keyframes rotateInUpRight{0%{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:rotate3d(0, 0, 1, -90deg);transform:rotate3d(0, 0, 1, -90deg);opacity:0}100%{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:none;transform:none;opacity:1}}.rotateInUpRight{-webkit-animation-name:rotateInUpRight;animation-name:rotateInUpRight}@-webkit-keyframes rotateOut{0%{-webkit-transform-origin:center;transform-origin:center;opacity:1}100%{-webkit-transform-origin:center;transform-origin:center;-webkit-transform:rotate3d(0, 0, 1, 200deg);transform:rotate3d(0, 0, 1, 200deg);opacity:0}}@keyframes rotateOut{0%{-webkit-transform-origin:center;transform-origin:center;opacity:1}100%{-webkit-transform-origin:center;transform-origin:center;-webkit-transform:rotate3d(0, 0, 1, 200deg);transform:rotate3d(0, 0, 1, 200deg);opacity:0}}.rotateOut{-webkit-animation-name:rotateOut;animation-name:rotateOut}@-webkit-keyframes rotateOutDownLeft{0%{-webkit-transform-origin:left bottom;transform-origin:left bottom;opacity:1}100%{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:rotate3d(0, 0, 1, 45deg);transform:rotate3d(0, 0, 1, 45deg);opacity:0}}@keyframes rotateOutDownLeft{0%{-webkit-transform-origin:left bottom;transform-origin:left bottom;opacity:1}100%{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:rotate3d(0, 0, 1, 45deg);transform:rotate3d(0, 0, 1, 45deg);opacity:0}}.rotateOutDownLeft{-webkit-animation-name:rotateOutDownLeft;animation-name:rotateOutDownLeft}@-webkit-keyframes rotateOutDownRight{0%{-webkit-transform-origin:right bottom;transform-origin:right bottom;opacity:1}100%{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:rotate3d(0, 0, 1, -45deg);transform:rotate3d(0, 0, 1, -45deg);opacity:0}}@keyframes rotateOutDownRight{0%{-webkit-transform-origin:right bottom;transform-origin:right bottom;opacity:1}100%{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:rotate3d(0, 0, 1, -45deg);transform:rotate3d(0, 0, 1, -45deg);opacity:0}}.rotateOutDownRight{-webkit-animation-name:rotateOutDownRight;animation-name:rotateOutDownRight}@-webkit-keyframes rotateOutUpLeft{0%{-webkit-transform-origin:left bottom;transform-origin:left bottom;opacity:1}100%{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:rotate3d(0, 0, 1, -45deg);transform:rotate3d(0, 0, 1, -45deg);opacity:0}}@keyframes rotateOutUpLeft{0%{-webkit-transform-origin:left bottom;transform-origin:left bottom;opacity:1}100%{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:rotate3d(0, 0, 1, -45deg);transform:rotate3d(0, 0, 1, -45deg);opacity:0}}.rotateOutUpLeft{-webkit-animation-name:rotateOutUpLeft;animation-name:rotateOutUpLeft}@-webkit-keyframes rotateOutUpRight{0%{-webkit-transform-origin:right bottom;transform-origin:right bottom;opacity:1}100%{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:rotate3d(0, 0, 1, 90deg);transform:rotate3d(0, 0, 1, 90deg);opacity:0}}@keyframes rotateOutUpRight{0%{-webkit-transform-origin:right bottom;transform-origin:right bottom;opacity:1}100%{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:rotate3d(0, 0, 1, 90deg);transform:rotate3d(0, 0, 1, 90deg);opacity:0}}.rotateOutUpRight{-webkit-animation-name:rotateOutUpRight;animation-name:rotateOutUpRight}@-webkit-keyframes hinge{0%{-webkit-transform-origin:top left;transform-origin:top left;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}20%,60%{-webkit-transform:rotate3d(0, 0, 1, 80deg);transform:rotate3d(0, 0, 1, 80deg);-webkit-transform-origin:top left;transform-origin:top left;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}40%,80%{-webkit-transform:rotate3d(0, 0, 1, 60deg);transform:rotate3d(0, 0, 1, 60deg);-webkit-transform-origin:top left;transform-origin:top left;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out;opacity:1}100%{-webkit-transform:translate3d(0, 700px, 0);transform:translate3d(0, 700px, 0);opacity:0}}@keyframes hinge{0%{-webkit-transform-origin:top left;transform-origin:top left;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}20%,60%{-webkit-transform:rotate3d(0, 0, 1, 80deg);transform:rotate3d(0, 0, 1, 80deg);-webkit-transform-origin:top left;transform-origin:top left;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}40%,80%{-webkit-transform:rotate3d(0, 0, 1, 60deg);transform:rotate3d(0, 0, 1, 60deg);-webkit-transform-origin:top left;transform-origin:top left;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out;opacity:1}100%{-webkit-transform:translate3d(0, 700px, 0);transform:translate3d(0, 700px, 0);opacity:0}}.hinge{-webkit-animation-name:hinge;animation-name:hinge}@-webkit-keyframes rollIn{0%{opacity:0;-webkit-transform:translate3d(-100%, 0, 0) rotate3d(0, 0, 1, -120deg);transform:translate3d(-100%, 0, 0) rotate3d(0, 0, 1, -120deg)}100%{opacity:1;-webkit-transform:none;transform:none}}@keyframes rollIn{0%{opacity:0;-webkit-transform:translate3d(-100%, 0, 0) rotate3d(0, 0, 1, -120deg);transform:translate3d(-100%, 0, 0) rotate3d(0, 0, 1, -120deg)}100%{opacity:1;-webkit-transform:none;transform:none}}.rollIn{-webkit-animation-name:rollIn;animation-name:rollIn}@-webkit-keyframes rollOut{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(100%, 0, 0) rotate3d(0, 0, 1, 120deg);transform:translate3d(100%, 0, 0) rotate3d(0, 0, 1, 120deg)}}@keyframes rollOut{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(100%, 0, 0) rotate3d(0, 0, 1, 120deg);transform:translate3d(100%, 0, 0) rotate3d(0, 0, 1, 120deg)}}.rollOut{-webkit-animation-name:rollOut;animation-name:rollOut}@-webkit-keyframes zoomIn{0%{opacity:0;-webkit-transform:scale3d(0.3, 0.3, 0.3);transform:scale3d(0.3, 0.3, 0.3)}50%{opacity:1}}@keyframes zoomIn{0%{opacity:0;-webkit-transform:scale3d(0.3, 0.3, 0.3);transform:scale3d(0.3, 0.3, 0.3)}50%{opacity:1}}.zoomIn{-webkit-animation-name:zoomIn;animation-name:zoomIn}@-webkit-keyframes zoomInDown{0%{opacity:0;-webkit-transform:scale3d(0.1, 0.1, 0.1) translate3d(0, -1000px, 0);transform:scale3d(0.1, 0.1, 0.1) translate3d(0, -1000px, 0);-webkit-animation-timing-function:cubic-bezier(0.55, 0.055, 0.675, 0.19);animation-timing-function:cubic-bezier(0.55, 0.055, 0.675, 0.19)}60%{opacity:1;-webkit-transform:scale3d(0.475, 0.475, 0.475) translate3d(0, 60px, 0);transform:scale3d(0.475, 0.475, 0.475) translate3d(0, 60px, 0);-webkit-animation-timing-function:cubic-bezier(0.175, 0.885, 0.32, 1);animation-timing-function:cubic-bezier(0.175, 0.885, 0.32, 1)}}@keyframes zoomInDown{0%{opacity:0;-webkit-transform:scale3d(0.1, 0.1, 0.1) translate3d(0, -1000px, 0);transform:scale3d(0.1, 0.1, 0.1) translate3d(0, -1000px, 0);-webkit-animation-timing-function:cubic-bezier(0.55, 0.055, 0.675, 0.19);animation-timing-function:cubic-bezier(0.55, 0.055, 0.675, 0.19)}60%{opacity:1;-webkit-transform:scale3d(0.475, 0.475, 0.475) translate3d(0, 60px, 0);transform:scale3d(0.475, 0.475, 0.475) translate3d(0, 60px, 0);-webkit-animation-timing-function:cubic-bezier(0.175, 0.885, 0.32, 1);animation-timing-function:cubic-bezier(0.175, 0.885, 0.32, 1)}}.zoomInDown{-webkit-animation-name:zoomInDown;animation-name:zoomInDown}@-webkit-keyframes zoomInLeft{0%{opacity:0;-webkit-transform:scale3d(0.1, 0.1, 0.1) translate3d(-1000px, 0, 0);transform:scale3d(0.1, 0.1, 0.1) translate3d(-1000px, 0, 0);-webkit-animation-timing-function:cubic-bezier(0.55, 0.055, 0.675, 0.19);animation-timing-function:cubic-bezier(0.55, 0.055, 0.675, 0.19)}60%{opacity:1;-webkit-transform:scale3d(0.475, 0.475, 0.475) translate3d(10px, 0, 0);transform:scale3d(0.475, 0.475, 0.475) translate3d(10px, 0, 0);-webkit-animation-timing-function:cubic-bezier(0.175, 0.885, 0.32, 1);animation-timing-function:cubic-bezier(0.175, 0.885, 0.32, 1)}}@keyframes zoomInLeft{0%{opacity:0;-webkit-transform:scale3d(0.1, 0.1, 0.1) translate3d(-1000px, 0, 0);transform:scale3d(0.1, 0.1, 0.1) translate3d(-1000px, 0, 0);-webkit-animation-timing-function:cubic-bezier(0.55, 0.055, 0.675, 0.19);animation-timing-function:cubic-bezier(0.55, 0.055, 0.675, 0.19)}60%{opacity:1;-webkit-transform:scale3d(0.475, 0.475, 0.475) translate3d(10px, 0, 0);transform:scale3d(0.475, 0.475, 0.475) translate3d(10px, 0, 0);-webkit-animation-timing-function:cubic-bezier(0.175, 0.885, 0.32, 1);animation-timing-function:cubic-bezier(0.175, 0.885, 0.32, 1)}}.zoomInLeft{-webkit-animation-name:zoomInLeft;animation-name:zoomInLeft}@-webkit-keyframes zoomInRight{0%{opacity:0;-webkit-transform:scale3d(0.1, 0.1, 0.1) translate3d(1000px, 0, 0);transform:scale3d(0.1, 0.1, 0.1) translate3d(1000px, 0, 0);-webkit-animation-timing-function:cubic-bezier(0.55, 0.055, 0.675, 0.19);animation-timing-function:cubic-bezier(0.55, 0.055, 0.675, 0.19)}60%{opacity:1;-webkit-transform:scale3d(0.475, 0.475, 0.475) translate3d(-10px, 0, 0);transform:scale3d(0.475, 0.475, 0.475) translate3d(-10px, 0, 0);-webkit-animation-timing-function:cubic-bezier(0.175, 0.885, 0.32, 1);animation-timing-function:cubic-bezier(0.175, 0.885, 0.32, 1)}}@keyframes zoomInRight{0%{opacity:0;-webkit-transform:scale3d(0.1, 0.1, 0.1) translate3d(1000px, 0, 0);transform:scale3d(0.1, 0.1, 0.1) translate3d(1000px, 0, 0);-webkit-animation-timing-function:cubic-bezier(0.55, 0.055, 0.675, 0.19);animation-timing-function:cubic-bezier(0.55, 0.055, 0.675, 0.19)}60%{opacity:1;-webkit-transform:scale3d(0.475, 0.475, 0.475) translate3d(-10px, 0, 0);transform:scale3d(0.475, 0.475, 0.475) translate3d(-10px, 0, 0);-webkit-animation-timing-function:cubic-bezier(0.175, 0.885, 0.32, 1);animation-timing-function:cubic-bezier(0.175, 0.885, 0.32, 1)}}.zoomInRight{-webkit-animation-name:zoomInRight;animation-name:zoomInRight}@-webkit-keyframes zoomInUp{0%{opacity:0;-webkit-transform:scale3d(0.1, 0.1, 0.1) translate3d(0, 1000px, 0);transform:scale3d(0.1, 0.1, 0.1) translate3d(0, 1000px, 0);-webkit-animation-timing-function:cubic-bezier(0.55, 0.055, 0.675, 0.19);animation-timing-function:cubic-bezier(0.55, 0.055, 0.675, 0.19)}60%{opacity:1;-webkit-transform:scale3d(0.475, 0.475, 0.475) translate3d(0, -60px, 0);transform:scale3d(0.475, 0.475, 0.475) translate3d(0, -60px, 0);-webkit-animation-timing-function:cubic-bezier(0.175, 0.885, 0.32, 1);animation-timing-function:cubic-bezier(0.175, 0.885, 0.32, 1)}}@keyframes zoomInUp{0%{opacity:0;-webkit-transform:scale3d(0.1, 0.1, 0.1) translate3d(0, 1000px, 0);transform:scale3d(0.1, 0.1, 0.1) translate3d(0, 1000px, 0);-webkit-animation-timing-function:cubic-bezier(0.55, 0.055, 0.675, 0.19);animation-timing-function:cubic-bezier(0.55, 0.055, 0.675, 0.19)}60%{opacity:1;-webkit-transform:scale3d(0.475, 0.475, 0.475) translate3d(0, -60px, 0);transform:scale3d(0.475, 0.475, 0.475) translate3d(0, -60px, 0);-webkit-animation-timing-function:cubic-bezier(0.175, 0.885, 0.32, 1);animation-timing-function:cubic-bezier(0.175, 0.885, 0.32, 1)}}.zoomInUp{-webkit-animation-name:zoomInUp;animation-name:zoomInUp}@-webkit-keyframes zoomOut{0%{opacity:1}50%{opacity:0;-webkit-transform:scale3d(0.3, 0.3, 0.3);transform:scale3d(0.3, 0.3, 0.3)}100%{opacity:0}}@keyframes zoomOut{0%{opacity:1}50%{opacity:0;-webkit-transform:scale3d(0.3, 0.3, 0.3);transform:scale3d(0.3, 0.3, 0.3)}100%{opacity:0}}.zoomOut{-webkit-animation-name:zoomOut;animation-name:zoomOut}@-webkit-keyframes zoomOutDown{40%{opacity:1;-webkit-transform:scale3d(0.475, 0.475, 0.475) translate3d(0, -60px, 0);transform:scale3d(0.475, 0.475, 0.475) translate3d(0, -60px, 0);-webkit-animation-timing-function:cubic-bezier(0.55, 0.055, 0.675, 0.19);animation-timing-function:cubic-bezier(0.55, 0.055, 0.675, 0.19)}100%{opacity:0;-webkit-transform:scale3d(0.1, 0.1, 0.1) translate3d(0, 2000px, 0);transform:scale3d(0.1, 0.1, 0.1) translate3d(0, 2000px, 0);-webkit-transform-origin:center bottom;transform-origin:center bottom;-webkit-animation-timing-function:cubic-bezier(0.175, 0.885, 0.32, 1);animation-timing-function:cubic-bezier(0.175, 0.885, 0.32, 1)}}@keyframes zoomOutDown{40%{opacity:1;-webkit-transform:scale3d(0.475, 0.475, 0.475) translate3d(0, -60px, 0);transform:scale3d(0.475, 0.475, 0.475) translate3d(0, -60px, 0);-webkit-animation-timing-function:cubic-bezier(0.55, 0.055, 0.675, 0.19);animation-timing-function:cubic-bezier(0.55, 0.055, 0.675, 0.19)}100%{opacity:0;-webkit-transform:scale3d(0.1, 0.1, 0.1) translate3d(0, 2000px, 0);transform:scale3d(0.1, 0.1, 0.1) translate3d(0, 2000px, 0);-webkit-transform-origin:center bottom;transform-origin:center bottom;-webkit-animation-timing-function:cubic-bezier(0.175, 0.885, 0.32, 1);animation-timing-function:cubic-bezier(0.175, 0.885, 0.32, 1)}}.zoomOutDown{-webkit-animation-name:zoomOutDown;animation-name:zoomOutDown}@-webkit-keyframes zoomOutLeft{40%{opacity:1;-webkit-transform:scale3d(0.475, 0.475, 0.475) translate3d(42px, 0, 0);transform:scale3d(0.475, 0.475, 0.475) translate3d(42px, 0, 0)}100%{opacity:0;-webkit-transform:scale(0.1) translate3d(-2000px, 0, 0);transform:scale(0.1) translate3d(-2000px, 0, 0);-webkit-transform-origin:left center;transform-origin:left center}}@keyframes zoomOutLeft{40%{opacity:1;-webkit-transform:scale3d(0.475, 0.475, 0.475) translate3d(42px, 0, 0);transform:scale3d(0.475, 0.475, 0.475) translate3d(42px, 0, 0)}100%{opacity:0;-webkit-transform:scale(0.1) translate3d(-2000px, 0, 0);transform:scale(0.1) translate3d(-2000px, 0, 0);-webkit-transform-origin:left center;transform-origin:left center}}.zoomOutLeft{-webkit-animation-name:zoomOutLeft;animation-name:zoomOutLeft}@-webkit-keyframes zoomOutRight{40%{opacity:1;-webkit-transform:scale3d(0.475, 0.475, 0.475) translate3d(-42px, 0, 0);transform:scale3d(0.475, 0.475, 0.475) translate3d(-42px, 0, 0)}100%{opacity:0;-webkit-transform:scale(0.1) translate3d(2000px, 0, 0);transform:scale(0.1) translate3d(2000px, 0, 0);-webkit-transform-origin:right center;transform-origin:right center}}@keyframes zoomOutRight{40%{opacity:1;-webkit-transform:scale3d(0.475, 0.475, 0.475) translate3d(-42px, 0, 0);transform:scale3d(0.475, 0.475, 0.475) translate3d(-42px, 0, 0)}100%{opacity:0;-webkit-transform:scale(0.1) translate3d(2000px, 0, 0);transform:scale(0.1) translate3d(2000px, 0, 0);-webkit-transform-origin:right center;transform-origin:right center}}.zoomOutRight{-webkit-animation-name:zoomOutRight;animation-name:zoomOutRight}@-webkit-keyframes zoomOutUp{40%{opacity:1;-webkit-transform:scale3d(0.475, 0.475, 0.475) translate3d(0, 60px, 0);transform:scale3d(0.475, 0.475, 0.475) translate3d(0, 60px, 0);-webkit-animation-timing-function:cubic-bezier(0.55, 0.055, 0.675, 0.19);animation-timing-function:cubic-bezier(0.55, 0.055, 0.675, 0.19)}100%{opacity:0;-webkit-transform:scale3d(0.1, 0.1, 0.1) translate3d(0, -2000px, 0);transform:scale3d(0.1, 0.1, 0.1) translate3d(0, -2000px, 0);-webkit-transform-origin:center bottom;transform-origin:center bottom;-webkit-animation-timing-function:cubic-bezier(0.175, 0.885, 0.32, 1);animation-timing-function:cubic-bezier(0.175, 0.885, 0.32, 1)}}@keyframes zoomOutUp{40%{opacity:1;-webkit-transform:scale3d(0.475, 0.475, 0.475) translate3d(0, 60px, 0);transform:scale3d(0.475, 0.475, 0.475) translate3d(0, 60px, 0);-webkit-animation-timing-function:cubic-bezier(0.55, 0.055, 0.675, 0.19);animation-timing-function:cubic-bezier(0.55, 0.055, 0.675, 0.19)}100%{opacity:0;-webkit-transform:scale3d(0.1, 0.1, 0.1) translate3d(0, -2000px, 0);transform:scale3d(0.1, 0.1, 0.1) translate3d(0, -2000px, 0);-webkit-transform-origin:center bottom;transform-origin:center bottom;-webkit-animation-timing-function:cubic-bezier(0.175, 0.885, 0.32, 1);animation-timing-function:cubic-bezier(0.175, 0.885, 0.32, 1)}}.zoomOutUp{-webkit-animation-name:zoomOutUp;animation-name:zoomOutUp}@-webkit-keyframes slideInDown{0%{-webkit-transform:translateY(-100%);transform:translateY(-100%);visibility:visible}100%{-webkit-transform:translateY(0);transform:translateY(0)}}@keyframes slideInDown{0%{-webkit-transform:translateY(-100%);transform:translateY(-100%);visibility:visible}100%{-webkit-transform:translateY(0);transform:translateY(0)}}.slideInDown{-webkit-animation-name:slideInDown;animation-name:slideInDown}@-webkit-keyframes slideInLeft{0%{-webkit-transform:translateX(-100%);transform:translateX(-100%);visibility:visible}100%{-webkit-transform:translateX(0);transform:translateX(0)}}@keyframes slideInLeft{0%{-webkit-transform:translateX(-100%);transform:translateX(-100%);visibility:visible}100%{-webkit-transform:translateX(0);transform:translateX(0)}}.slideInLeft{-webkit-animation-name:slideInLeft;animation-name:slideInLeft}@-webkit-keyframes slideInRight{0%{-webkit-transform:translateX(100%);transform:translateX(100%);visibility:visible}100%{-webkit-transform:translateX(0);transform:translateX(0)}}@keyframes slideInRight{0%{-webkit-transform:translateX(100%);transform:translateX(100%);visibility:visible}100%{-webkit-transform:translateX(0);transform:translateX(0)}}.slideInRight{-webkit-animation-name:slideInRight;animation-name:slideInRight}@-webkit-keyframes slideInUp{0%{-webkit-transform:translateY(100%);transform:translateY(100%);visibility:visible}100%{-webkit-transform:translateY(0);transform:translateY(0)}}@keyframes slideInUp{0%{-webkit-transform:translateY(100%);transform:translateY(100%);visibility:visible}100%{-webkit-transform:translateY(0);transform:translateY(0)}}.slideInUp{-webkit-animation-name:slideInUp;animation-name:slideInUp}@-webkit-keyframes slideOutDown{0%{-webkit-transform:translateY(0);transform:translateY(0)}100%{visibility:hidden;-webkit-transform:translateY(100%);transform:translateY(100%)}}@keyframes slideOutDown{0%{-webkit-transform:translateY(0);transform:translateY(0)}100%{visibility:hidden;-webkit-transform:translateY(100%);transform:translateY(100%)}}.slideOutDown{-webkit-animation-name:slideOutDown;animation-name:slideOutDown}@-webkit-keyframes slideOutLeft{0%{-webkit-transform:translateX(0);transform:translateX(0)}100%{visibility:hidden;-webkit-transform:translateX(-100%);transform:translateX(-100%)}}@keyframes slideOutLeft{0%{-webkit-transform:translateX(0);transform:translateX(0)}100%{visibility:hidden;-webkit-transform:translateX(-100%);transform:translateX(-100%)}}.slideOutLeft{-webkit-animation-name:slideOutLeft;animation-name:slideOutLeft}@-webkit-keyframes slideOutRight{0%{-webkit-transform:translateX(0);transform:translateX(0)}100%{visibility:hidden;-webkit-transform:translateX(100%);transform:translateX(100%)}}@keyframes slideOutRight{0%{-webkit-transform:translateX(0);transform:translateX(0)}100%{visibility:hidden;-webkit-transform:translateX(100%);transform:translateX(100%)}}.slideOutRight{-webkit-animation-name:slideOutRight;animation-name:slideOutRight}@-webkit-keyframes slideOutUp{0%{-webkit-transform:translateY(0);transform:translateY(0)}100%{visibility:hidden;-webkit-transform:translateY(-100%);transform:translateY(-100%)}}@keyframes slideOutUp{0%{-webkit-transform:translateY(0);transform:translateY(0)}100%{visibility:hidden;-webkit-transform:translateY(-100%);transform:translateY(-100%)}}.slideOutUp{-webkit-animation-name:slideOutUp;animation-name:slideOutUp}.btn{border:1px solid #E0E3E9;display:inline-block;border-radius:2px;box-shadow:inset 0 1px 0 white,0 1px 0 rgba(217,221,227,0.5);background-color:#FAFAFA;background-image:-webkit-linear-gradient(#FAFAFA, #EFF1F3);background-image:linear-gradient(#FAFAFA, #EFF1F3);font-size:0.75em;font-weight:600;color:#828B9A;text-decoration:none;padding:0.5em 0.9375em}.btn:hover{background-color:#fbfbfb;background-image:-webkit-linear-gradient(#fbfbfb, #f2f4f5);background-image:linear-gradient(#fbfbfb, #f2f4f5)}.btn.disabled{cursor:default;opacity:0.5}.btn.disabled:active{box-shadow:inset 0 1px 0 white,0 1px 1px rgba(0,0,0,0.1)}.btn.danger{color:#E06488}.btn:focus{outline:0}.btn:active{box-shadow:inset 0 0 2px rgba(0,0,0,0.1)}form{margin:0}form.ng-submitted .ng-invalid{border-color:#E55A84 !important}.form-container{width:100%}.form-row{display:block;margin-bottom:10px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.form-row:after{content:"";display:table;clear:both}.form-col{float:left;display:block;margin-right:2.35765%;width:48.82117%}.form-col:last-child{margin-right:0}.form-col.padded:first-child{padding:0 20px 0 0}.form-col.padded:last-child{padding:0 0 0 20px}.form-group>label{font-size:0.75em;color:#AEB4BE;display:inline-block;line-height:1.875em}.form-group .form-error{font-size:0.75em;color:#E06488;float:right}.form-group .form-error img{vertical-align:bottom;margin-right:3px}.form-group.optional>label:after{content:" (optional)"}.form-group.error input.form-control,.form-group.error textarea.form-control{border-color:#E55A84;background:rgba(229,90,132,0.02)}.form-group input.form-control,.form-group textarea.form-control{border-radius:3px;border:1px solid #D9DDE3;font-size:1.125em;-webkit-transition:border-color 0.1s ease-in-out;-moz-transition:border-color 0.1s ease-in-out;transition:border-color 0.1s ease-in-out}.form-group input.form-control:focus,.form-group textarea.form-control:focus{border-color:#5AC4E5;box-shadow:0 0 3px rgba(90,196,229,0.5);outline:none;background:white}.form-group input.form-control.extend,.form-group textarea.form-control.extend{width:100%}.form-group input.form-control::-webkit-input-placeholder,.form-group textarea.form-control::-webkit-input-placeholder{color:rgba(174,180,190,0.7)}.form-group input.form-control::-moz-placeholder,.form-group textarea.form-control::-moz-placeholder{color:rgba(174,180,190,0.7)}.form-group input.form-control:-moz-placeholder,.form-group textarea.form-control:-moz-placeholder{color:rgba(174,180,190,0.7)}.form-group input.form-control:-ms-input-placeholder,.form-group textarea.form-control:-ms-input-placeholder{color:rgba(174,180,190,0.7)}.form-group .form-btn{padding:0.75em 0.9375em}.form-group input.form-control{vertical-align:middle;padding:0.3125em 0.625em}.form-group textarea.form-control{min-height:135px;font-size:1.125em;padding:0.5em 0.625em}.form-submit-message{display:inline-block;margin-left:0.3125em;font-size:0.75em}.form-submit-message.error{color:#E06488}.form-submit-message img{vertical-align:middle;margin-right:0.3125em}.box{background:white;border:1px solid #D9DDE3;border-radius:3px;margin:0 auto 20px auto;max-width:800px;padding:20px 25px;box-shadow:0 0 1px #D9DDE3}.box.box-x-scroll{overflow-x:scroll}.box.invisible{background:transparent;border:0;padding:0;margin-bottom:40px}.box.highlight{border-color:#5AC4E5;box-shadow:0 0 3px rgba(90,196,229,0.5)}.box:last-child{margin-bottom:40px}.box-title{font-size:24px;font-weight:bold;color:#3D4043;margin-bottom:20px}.box-description{font-size:14px;color:#828B9A;padding-bottom:20px;border-bottom:1px solid #D9DDE3;margin-top:-20px;margin-bottom:20px}.box-description a{color:#3D4043;text-decoration:none}.box-description a:hover{border:1px solid #D9DDE3}.box-section{padding-top:20px;display:block}.box-section:after{content:"";display:table;clear:both}.box-section .section-details{float:left;display:block;margin-right:2.35765%;width:23.23176%}.box-section .section-details:last-child{margin-right:0}.box-section .section-details .section-title{font-size:0.875em;color:#828B9A;margin-bottom:20px}.box-section .section-main{float:left;display:block;margin-right:2.35765%;width:74.41059%}.box-section .section-main:last-child{margin-right:0}.box-message{text-align:center;padding:40px;max-width:450px;margin:0 auto}.box-message .main-image{margin-bottom:20px}.box-message .title{font-weight:bold;font-size:1.5em;color:#3D4043;margin-bottom:0.625em}.box-message .content{font-size:0.875em;color:#828B9A;margin-bottom:20px}.box-message .mini-divider:after{content:"";display:inline-block;width:200px;height:1px;background:#D9DDE3;margin:20px auto}.box-side-sticky{padding:20px 25px;box-sizing:content-box;width:100%;margin-left:-25px}.box-bottom-sticky{padding:20px 25px;box-sizing:content-box;width:100%;margin-top:20px;border-bottom-left-radius:3px;border-bottom-right-radius:3px;border-top:1px solid #D9DDE3;margin-bottom:-20px;margin-left:-25px}.box-controls{text-align:right;box-shadow:inset 0 1px 0 white;background:#f8f9fa;margin-top:20px;padding:15px 25px}.ng-submitted .ng-invalid>.datepicker{border-color:#E55A84}.datepicker{width:100%;border:1px solid rgba(217,221,227,0.5);border-radius:3px;background:white;padding:0.625em;-webkit-transition:border-color 0.1s ease-in-out;-moz-transition:border-color 0.1s ease-in-out;transition:border-color 0.1s ease-in-out}.datepicker table{width:100%;font-size:1em}.datepicker tbody:before{content:'';display:block;height:0.625em}.datepicker .prev,.datepicker .next{opacity:0.5;color:#828B9A;cursor:pointer;border-radius:5px;position:relative}.datepicker .prev:hover,.datepicker .next:hover{opacity:1}.datepicker .prev:hover:after,.datepicker .next:hover:after{opacity:1;background:rgba(217,221,227,0.3)}.datepicker .prev:after,.datepicker .next:after{content:" ";cursor:pointer;opacity:0;position:absolute;width:1.75em;height:1.75em;margin-left:-0.875em;margin-top:-0.875em;left:50%;top:50%;border-radius:3px;-webkit-transition:background-color 0.1s ease-in-out;-moz-transition:background-color 0.1s ease-in-out;transition:background-color 0.1s ease-in-out}.datepicker .datepicker-switch{padding:10px;font-weight:600;font-size:1.125em;border-radius:3px;cursor:pointer;-webkit-transition:background-color 0.1s ease-in-out;-moz-transition:background-color 0.1s ease-in-out;transition:background-color 0.1s ease-in-out}.datepicker .datepicker-switch:hover{background:rgba(217,221,227,0.4)}.datepicker .dow{padding:10px;font-weight:normal;text-transform:uppercase;color:#E55A84;font-size:0.875em;border-bottom:2px solid rgba(217,221,227,0.3)}.datepicker .dow,.datepicker .day{padding:0.9375em}.datepicker .day{text-align:center;font-weight:600;position:relative;font-size:0.875em}.datepicker .day.today{color:#818176}.datepicker .day.today:after{opacity:1;background:rgba(255,255,0,0.1)}.datepicker .day:hover{cursor:pointer}.datepicker .day:hover:after{opacity:1;background:rgba(217,221,227,0.4)}.datepicker .day.new,.datepicker .day.old{font-weight:normal;color:#AEB4BE}.datepicker .day.active{background:white;color:#6EBC48}.datepicker .day.active:after{opacity:1;background:rgba(110,188,72,0.1)}.datepicker .day:active:after{opacity:0.8}.datepicker .day:after{content:" ";-webkit-transition:all 0.1s ease-in-out;-moz-transition:all 0.1s ease-in-out;transition:all 0.1s ease-in-out;cursor:pointer;opacity:0;position:absolute;width:2.5em;height:2.5em;margin-left:-1.25em;margin-top:-1.25em;left:50%;top:50%;border-radius:3px}.datepicker .month,.datepicker .year{width:33.3%;display:inline-block;text-align:center;font-size:0.875em;padding:1.25em;cursor:pointer;-webkit-transition:background-color 0.1s ease-in-out;-moz-transition:background-color 0.1s ease-in-out;transition:background-color 0.1s ease-in-out;border-radius:3px;text-transform:uppercase}.datepicker .month:hover,.datepicker .year:hover{background:rgba(217,221,227,0.3)}.daticon-list{margin:0;margin-left:-10px;list-style:none;padding:5px;text-align:left}.daticon-list .placeholder{line-height:1.125em;font-size:0.75em;color:#ccc}.daticon-list li{margin:5px;display:inline-block}.daticon{box-shadow:0 0 0 1px rgba(217,221,227,0.5);border-radius:3px;display:inline-block;padding:0.5em 1em;text-align:center;position:relative;cursor:default;background:white}.daticon .dow{font-size:0.375em;margin-top:-1.5em;background:white;color:#AEB4BE;margin-bottom:0.25em;font-weight:normal;text-transform:uppercase}.daticon .day{font-size:1.25em;font-weight:normal;color:#E55A84;line-height:1em}.daticon .month{font-weight:600;font-size:0.75em;text-transform:uppercase}.daticon .delete{text-align:center;border:0;width:1.125em;height:1.125em;position:absolute;top:-7.2px;right:-7.2px;border-radius:100%;display:inline-block;background:rgba(217,221,227,0.5) url(../images/close@2x.png) no-repeat center center;background-size:7px 8px;cursor:pointer;opacity:0}.daticon .delete:hover{background-color:rgba(217,221,227,0.8)}.daticon .count{text-align:center;border:0;width:18px;height:18px;position:absolute;top:-7.2px;right:-7.2px;border-radius:100%;font-weight:bold;display:inline-block;background:#bcc3cd;color:white;font-size:9px;line-height:18px;-webkit-transition:background-color 0.2s ease-in-out;-moz-transition:background-color 0.2s ease-in-out;transition:background-color 0.2s ease-in-out}.daticon .count.top{background:#FF5D5D}.daticon:hover .delete{opacity:1}.rl-modal{background:white;position:fixed;top:50%;left:50%;width:50%;max-width:400px;display:inline-block;min-width:200px;height:auto;z-index:2000;overflow:hidden;border-radius:5px;box-shadow:0 0 0 1px #D9DDE3,0 0 0 5px rgba(217,221,227,0.5);-webkit-transform:translateX(-50%) translateY(-50%);-moz-transform:translateX(-50%) translateY(-50%);-ms-transform:translateX(-50%) translateY(-50%);-o-transform:translateX(-50%) translateY(-50%);transform:translateX(-50%) translateY(-50%)}.rl-modal .rl-modal-message{padding:0 20px 20px 20px;font-size:0.75em;color:#828B9A}.rl-modal .rl-modal-title{padding:20px 20px 0 20px;font-size:1.125em;font-weight:bold}.rl-modal .rl-modal-actions{border-top:1px solid #D9DDE3;box-shadow:inset 0 1px 0 white;background:#f8f9fa;text-align:right;padding:0.625em 1.25em}.rl-modal-overlay{position:fixed;z-index:1999;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,0.1)}.poll{min-width:100%;display:block;margin-bottom:20px}.poll-header{display:table;min-width:100%;border-bottom:1px solid #D9DDE3;box-shadow:0 3px 0 rgba(217,221,227,0.3)}.poll-header .header{display:table-cell;vertical-align:bottom;padding-bottom:20px}.poll-header .header.date-header{text-align:center;min-width:70px;width:70px}.poll-header .header.actions-header{min-width:160px}.poll-header .header.participants-header{font-weight:bold;min-width:235px;width:235px;padding-left:0.625em}.poll-body{min-width:100%}.poll-body .poll-entry.highlight{background:#f6f7f9}.poll-body .poll-entry{display:table;min-width:100%;border-bottom:1px solid rgba(217,221,227,0.5)}.poll-body .poll-entry .hover{visibility:hidden}.poll-body .poll-entry:hover .hover{visibility:visible}.poll-body .poll-entry .cell{padding:0.625em;display:table-cell;height:50px;vertical-align:middle}.poll-body .poll-entry .cell.name-cell{min-width:235px;width:235px;font-size:0.875em}.poll-body .poll-entry .cell.name-cell .avatar{display:inline-block;padding:5px;margin-right:5px;border-radius:2px;background:#D0D5DF}.poll-body .poll-entry .cell.name-cell .avatar.style-1{background:#8A75AE}.poll-body .poll-entry .cell.name-cell .avatar.style-2{background:#80A1DA}.poll-body .poll-entry .cell.name-cell .avatar.style-3{background:#B3DD8B}.poll-body .poll-entry .cell.name-cell .avatar.style-4{background:#7EE4E4}.poll-body .poll-entry .cell.name-cell .avatar.style-5{background:#FCD285}.poll-body .poll-entry .cell.name-cell .avatar.style-6{background:#F7967F}.poll-body .poll-entry .cell.name-cell .avatar.style-7{background:#E8669D}.poll-body .poll-entry .cell.name-cell .avatar.style-8{background:#F7B6E7}.poll-body .poll-entry .cell.name-cell .avatar.style-9{background:#F99D7B}.poll-body .poll-entry .cell.name-cell .avatar.style-10{background:#88D0CB}.poll-body .poll-entry .cell.name-cell .name{padding:5px 3px;margin-left:2px;border-radius:2px}.poll-body .poll-entry .cell.name-cell .name:hover{background:#F5F6F8;cursor:pointer}.poll-body .poll-entry .cell.name-cell .form-control{border:1px solid #D9DDE3;padding:0.3125em;border-radius:2px;color:#3D4043}.poll-body .poll-entry .cell.name-cell .form-control:focus{outline:0;border-color:#5AC4E5;box-shadow:0 0 3px rgba(90,196,229,0.5)}.poll-body .poll-entry .cell.name-cell .form-control::-webkit-input-placeholder{color:rgba(130,139,154,0.7)}.poll-body .poll-entry .cell.name-cell .form-control::-moz-placeholder{color:rgba(130,139,154,0.7)}.poll-body .poll-entry .cell.name-cell .form-control:-moz-placeholder{color:rgba(130,139,154,0.7)}.poll-body .poll-entry .cell.name-cell .form-control:-ms-input-placeholder{color:rgba(130,139,154,0.7)}.poll-body .poll-entry .cell.action-cell{min-width:160px}.poll-body .poll-entry .cell.vote-cell{min-width:70px;width:70px;text-align:center;position:relative}.poll-body .poll-entry .cell.vote-cell .overlay{position:absolute;top:0;left:0;width:100%;height:100%;z-index:10}.poll-body .poll-entry .cell.vote-cell .overlay:hover{background:rgba(217,221,227,0.2);cursor:pointer}.poll-body .poll-entry.ng-submitted .ng-invalid{border-color:#E55A84 !important}tags-input{display:block}tags-input *,tags-input *:before,tags-input *:after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}tags-input .host{position:relative;margin-top:5px;margin-bottom:5px}tags-input .host:focus{outline:0}tags-input .host:active{outline:none}tags-input .tags{padding:4px;overflow:hidden;word-wrap:break-word;cursor:text;border-radius:3px;background-color:white;border:1px solid #D9DDE3;-webkit-transition:border-color 0.1s ease-in-out;-moz-transition:border-color 0.1s ease-in-out;transition:border-color 0.1s ease-in-out}tags-input .tags.focused{outline:none}tags-input .tags .tag-list{margin:0;padding:0;list-style-type:none}tags-input .tags .tag-item{margin:2px;padding:0 8px;display:inline-block;float:left;font-size:0.875em;height:26px;line-height:25px;border-radius:1px;background:#E5EBF2;color:#7587A1;box-shadow:0 0 0 1px #CBD4E2}tags-input .tags .tag-item.selected{background:#E06488;color:white;box-shadow:none}tags-input .tags .tag-item .remove-button{margin:0 0 0 5px;padding:0;border:none;background:none;color:inherit;cursor:pointer;vertical-align:middle;font:bold 1em Arial,sans-serif}tags-input .tags .input{border:0;outline:none;margin:2px;padding:0;padding-left:8px;float:left;height:26px;font-size:0.875em}tags-input .tags .input::-webkit-input-placeholder{color:#AEB4BE}tags-input .tags .input::-moz-placeholder{color:#AEB4BE}tags-input .tags .input:-moz-placeholder{color:#AEB4BE}tags-input .tags .input:-ms-input-placeholder{color:#AEB4BE}tags-input .tags .input.invalid-tag{color:#E06488}tags-input .tags .input::-ms-clear{display:none}.dropdown{position:relative;cursor:pointer}.dropdown .dropdown-menu{position:absolute;display:none;z-index:1000;float:left;min-width:160px;max-width:180px;padding:5px;text-align:left;left:0}.dropdown.open .dropdown-menu{display:block}.dropdown .dropdown-toggle:after{content:"";width:6px;height:4px;margin-left:10px;display:inline-block;background-image:url("../images/dropdown_arrow.png");background-size:6px 4px;background-repeat:no-repeat}.comments-info{font-weight:bold;padding-bottom:10px;border-bottom:2px solid #D9DDE3}.comment-form{display:block;margin-bottom:20px;margin-top:20px;padding:0 10px}.comment-form:after{content:"";display:table;clear:both}.comment-form .avatar-section{float:left;display:block;margin-right:2.35765%;width:6.17215%}.comment-form .avatar-section:last-child{margin-right:0}.comment-form .avatar-section img{border-radius:3px;max-width:100%}.comment-form .input-section{float:left;display:block;margin-right:2.35765%;width:91.4702%}.comment-form .input-section:last-child{margin-right:0}.comment-form .content-section{margin-bottom:10px}.comment-form .name-section{position:relative;margin-bottom:10px}.comment-form .form-control{font-size:0.875em !important;border-width:2px !important}.comment-form textarea.form-control{min-height:0;min-width:100%}.comments-placeholder{color:#AEB4BE;text-align:center}.comment-thread{list-style:none;margin:0;padding:0;margin-bottom:20px;max-height:500px;overflow-y:scroll}.comment-thread .comment{display:block;padding:10px}.comment-thread .comment:after{content:"";display:table;clear:both}.comment-thread .comment .avatar-section{float:left;display:block;margin-right:2.35765%;width:6.17215%}.comment-thread .comment .avatar-section:last-child{margin-right:0}.comment-thread .comment .avatar-section img{max-width:100%;border-radius:3px}.comment-thread .comment .comment-section{float:left;display:block;margin-right:2.35765%;width:91.4702%;position:relative}.comment-thread .comment .comment-section:last-child{margin-right:0}.comment-thread .comment .comment-section .comment-delete{opacity:0;text-decoration:none;color:white;background-color:#D9DDE3;color:#AEB4BE;border-radius:2px;display:inline-block;position:absolute;right:0;top:0;font-size:0.875em;width:1em;height:1em;line-height:1em;text-align:center}.comment-thread .comment .comment-section .comment-delete:hover{background:#E06488;color:white}.comment-thread .comment .comment-section .comment-delete:active{background:#dc4f78}.comment-thread .comment .comment-section .meta{font-size:0.8125em;color:#828B9A;margin-bottom:5px}.comment-thread .comment .comment-section .name{color:#828B9A;font-weight:600}.comment-thread .comment .comment-section .time:before{content:" ";display:inline-block;height:4px;width:4px;background:#AEB4BE;margin:0 5px 2px 5px;border-radius:100%}.comment-thread .comment .comment-section .content{font-size:0.875em;margin-bottom:5px;white-space:pre-wrap;margin-right:100px}.comment-thread .comment .comment-section .actions{opacity:0.8}.comment-thread .comment .comment-section .actions a{color:#828B9A;font-size:0.75em;text-decoration:none}.comment-thread .comment .comment-section .actions a:hover{color:#5AC4E5}.comment-thread .comment:hover{background:#F5F6F8;cursor:default;border-radius:3px}.comment-thread .comment:hover .name{color:#5AC4E5}.comment-thread .comment:hover .comment-delete{opacity:1}.switch-row{display:table;width:100%;margin-bottom:20px;padding-bottom:20px;border-bottom:1px solid #D9DDE3}.switch-row:last-child{border:0}.switch-row .switch-details{display:table-cell}.switch-row .switch-details .title{font-size:0.875em;font-weight:bold}.switch-row .switch-details .description{font-size:0.75em;color:#828B9A}.switch-row .switch{display:table-cell;text-align:right;min-width:150px;vertical-align:middle}.switch-row .switch .switch-value{font-size:0.75em;color:#828B9A;display:inline-block;vertical-align:middle}.switch-toggle{display:inline-block;margin-left:5px;height:20px;width:40px;border-radius:20px;vertical-align:middle;position:relative;cursor:pointer;background:#E06488;box-shadow:inset 0 0 0 1px rgba(0,0,0,0.1);-webkit-transition:all 0.1s ease-in-out;-moz-transition:all 0.1s ease-in-out;transition:all 0.1s ease-in-out}.switch-toggle:after{content:" ";-webkit-transition:all 0.1s ease-in-out;-moz-transition:all 0.1s ease-in-out;transition:all 0.1s ease-in-out;display:inline-block;height:16px;width:16px;position:absolute;box-shadow:inset 0 1px 0 white,0 1px 1px rgba(0,0,0,0.1);background-color:#FAFAFA;background-image:-webkit-linear-gradient(#FAFAFA, #EFF1F3);background-image:linear-gradient(#FAFAFA, #EFF1F3);top:50%;margin-top:-8px;left:2px;border-radius:100px}.switch-toggle:hover{box-shadow:inset 0 0 0 1px rgba(0,0,0,0.1),inset 0 0 0 8px rgba(0,0,0,0.05)}.switch-toggle.active{background:#6EBC48}.switch-toggle.active:after{left:100%;margin-left:-18px}.notification{position:fixed;top:0;left:0;width:100%;z-index:3000;padding:12px 40px;background:#828B9A;color:white;-webkit-transition:all 0.3s ease-in-out;-moz-transition:all 0.3s ease-in-out;transition:all 0.3s ease-in-out}.notification.success{background:#6EBC48}.notification.error{background:#E06488}.notification.ng-enter{top:-100px;opacity:0}.notification.ng-enter-active{top:0;opacity:1}.notification.ng-leave-active{top:-100px;opacity:1}.notification .title{font-size:0.875em;margin-bottom:2px}.notification .message{font-size:0.75em;color:rgba(255,255,255,0.8)}.notification .close{position:absolute;top:5px;right:10px;color:white;text-decoration:none}.page-placeholder{margin:0 auto;text-align:center;color:#B0B8C4;position:absolute;top:50%;left:50%;-webkit-transform:translateX(-50%) translateY(-50%);-moz-transform:translateX(-50%) translateY(-50%);-ms-transform:translateX(-50%) translateY(-50%);-o-transform:translateX(-50%) translateY(-50%);transform:translateX(-50%) translateY(-50%)}.page-placeholder .image{margin-bottom:20px}.page-placeholder .title{font-size:2.25em;font-weight:bold;margin-bottom:20px}.page-placeholder .content{font-size:0.875em;max-width:320px;font-weight:normal;margin-bottom:20px}.event-description{font-size:0.875em;white-space:pre-wrap;padding-top:20px;padding-bottom:20px;line-height:1.5em;color:#828B9A;background:#F5F6F8;border-top:1px solid #D9DDE3;margin-top:20px;margin-bottom:-20px}.event-location{font-size:0.875em}.event-location a{color:#3D4043;text-decoration:none}.event-location a:hover{text-decoration:underline}.event-location img{vertical-align:middle;margin-right:10px}.event-pair{margin-bottom:20px;border-bottom:1px solid #D9DDE3;padding-bottom:20px;float:left;width:100%}.event-pair .icon{display:inline-block;width:30px;float:left;position:relative;text-align:center;height:35px;border-radius:3px;margin-right:10px}.event-pair .icon img{position:absolute;top:50%;left:50%;-webkit-transform:translateX(-50%) translateY(-50%);-moz-transform:translateX(-50%) translateY(-50%);-ms-transform:translateX(-50%) translateY(-50%);-o-transform:translateX(-50%) translateY(-50%);transform:translateX(-50%) translateY(-50%)}.event-pair .content{float:left;display:inline-block}.event-pair .key{font-weight:bold;font-size:11px}.event-pair .value{color:#828B9A}.event-header{width:100%;margin-top:-30px}.event-header .avatar{display:inline-block;margin-right:20px;text-align:center;border-radius:1px;box-shadow:0 0 0 5px white,0 0 0 6px #D9DDE3,inset 0 0 0 1px #D9DDE3;padding:20px;background:#F5F6F8;vertical-align:bottom}.event-header .details{display:inline-block}.event-header .details .title{font-size:1.5em;font-weight:bold}.event-header .details .title .title-label{font-size:11px;font-weight:normal;margin-left:5px;position:relative;top:-3px;background:#828B9A;color:white;padding:3px 10px;border-radius:20px}.event-header .details .title .title-label.success{background:#6EBC48}.event-header .details .title .title-label.danger{background:#FF5D5D}.event-header .details .subtitle{color:#828B9A;font-size:0.875em}.event-header .details .subtitle a{color:#5AC4E5;text-decoration:none}.event-header .details .subtitle a:hover{text-decoration:underline}.event-header .actions{visibility:hidden;float:right;margin-top:30px}.event-header:hover .actions{visibility:visible} /*# sourceMappingURL=style.css.map */ \ No newline at end of file diff --git a/public/css/style.css.map b/public/css/style.css.map index 31f502d14..08c2c9ab1 100644 --- a/public/css/style.css.map +++ b/public/css/style.css.map @@ -1 +1 @@ -{"version":3,"sources":["style.scss","partials/_normalize.scss","neat/grid/_box-sizing.scss","bourbon/addons/_prefixer.scss","partials/_applayout.scss","modules/_vars.scss","partials/_navigation.scss","bourbon/css3/_transition.scss","bourbon/css3/_linear-gradient.scss","partials/_topbar.scss","partials/ui/_animations.scss","partials/ui/_buttons.scss","partials/ui/_form.scss","neat/grid/_row.scss","bourbon/addons/_clearfix.scss","neat/grid/_span-columns.scss","bourbon/css3/_placeholder.scss","partials/ui/_box.scss","partials/ui/_datepicker.scss","partials/ui/_modal.scss","partials/ui/_poll.scss","partials/pages/_home.scss","partials/pages/_event.scss"],"names":[],"mappings":"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","file":"style.css","sourcesContent":["@import url(http://fonts.googleapis.com/css?family=Roboto:400,600,700);\n@import \"modules/vars\";\n@import \"modules/mixins\";\n@import \"partials/normalize\";\n@import \"bourbon/bourbon\";\n@import \"neat/neat\";\n\nbody {\n font-family: \"Roboto\", \"Helvetica Neue\", Arial, sans-serif;\n}\n\n@import \"partials/applayout\";\n@import \"partials/navigation\";\n@import \"partials/topbar\";\n@import \"partials/ui/animations\";\n@import \"partials/ui/buttons\";\n@import \"partials/ui/form\";\n@import \"partials/ui/box\";\n@import \"partials/ui/datepicker\";\n@import \"partials/ui/modal\";\n@import \"partials/ui/poll\";\n\n@import \"partials/pages/home\";\n@import \"partials/pages/event\";\n","/*! normalize.css v3.0.2 | MIT License | git.io/normalize */\n\n/**\n * 1. Set default font family to sans-serif.\n * 2. Prevent iOS text size adjust after orientation change, without disabling\n * user zoom.\n */\n\nhtml {\n font-family: sans-serif; /* 1 */\n -ms-text-size-adjust: 100%; /* 2 */\n -webkit-text-size-adjust: 100%; /* 2 */\n}\n\n/**\n * Remove default margin.\n */\n\nbody {\n margin: 0;\n}\n\n/* HTML5 display definitions\n ========================================================================== */\n\n/**\n * Correct `block` display not defined for any HTML5 element in IE 8/9.\n * Correct `block` display not defined for `details` or `summary` in IE 10/11\n * and Firefox.\n * Correct `block` display not defined for `main` in IE 11.\n */\n\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmain,\nmenu,\nnav,\nsection,\nsummary {\n display: block;\n}\n\n/**\n * 1. Correct `inline-block` display not defined in IE 8/9.\n * 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera.\n */\n\naudio,\ncanvas,\nprogress,\nvideo {\n display: inline-block; /* 1 */\n vertical-align: baseline; /* 2 */\n}\n\n/**\n * Prevent modern browsers from displaying `audio` without controls.\n * Remove excess height in iOS 5 devices.\n */\n\naudio:not([controls]) {\n display: none;\n height: 0;\n}\n\n/**\n * Address `[hidden]` styling not present in IE 8/9/10.\n * Hide the `template` element in IE 8/9/11, Safari, and Firefox < 22.\n */\n\n[hidden],\ntemplate {\n display: none;\n}\n\n/* Links\n ========================================================================== */\n\n/**\n * Remove the gray background color from active links in IE 10.\n */\n\na {\n background-color: transparent;\n}\n\n/**\n * Improve readability when focused and also mouse hovered in all browsers.\n */\n\na:active,\na:hover {\n outline: 0;\n}\n\n/* Text-level semantics\n ========================================================================== */\n\n/**\n * Address styling not present in IE 8/9/10/11, Safari, and Chrome.\n */\n\nabbr[title] {\n border-bottom: 1px dotted;\n}\n\n/**\n * Address style set to `bolder` in Firefox 4+, Safari, and Chrome.\n */\n\nb,\nstrong {\n font-weight: bold;\n}\n\n/**\n * Address styling not present in Safari and Chrome.\n */\n\ndfn {\n font-style: italic;\n}\n\n/**\n * Address variable `h1` font-size and margin within `section` and `article`\n * contexts in Firefox 4+, Safari, and Chrome.\n */\n\nh1 {\n font-size: 2em;\n margin: 0.67em 0;\n}\n\n/**\n * Address styling not present in IE 8/9.\n */\n\nmark {\n background: #ff0;\n color: #000;\n}\n\n/**\n * Address inconsistent and variable font size in all browsers.\n */\n\nsmall {\n font-size: 80%;\n}\n\n/**\n * Prevent `sub` and `sup` affecting `line-height` in all browsers.\n */\n\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n}\n\nsup {\n top: -0.5em;\n}\n\nsub {\n bottom: -0.25em;\n}\n\n/* Embedded content\n ========================================================================== */\n\n/**\n * Remove border when inside `a` element in IE 8/9/10.\n */\n\nimg {\n border: 0;\n}\n\n/**\n * Correct overflow not hidden in IE 9/10/11.\n */\n\nsvg:not(:root) {\n overflow: hidden;\n}\n\n/* Grouping content\n ========================================================================== */\n\n/**\n * Address margin not present in IE 8/9 and Safari.\n */\n\nfigure {\n margin: 1em 40px;\n}\n\n/**\n * Address differences between Firefox and other browsers.\n */\n\nhr {\n -moz-box-sizing: content-box;\n box-sizing: content-box;\n height: 0;\n}\n\n/**\n * Contain overflow in all browsers.\n */\n\npre {\n overflow: auto;\n}\n\n/**\n * Address odd `em`-unit font size rendering in all browsers.\n */\n\ncode,\nkbd,\npre,\nsamp {\n font-family: monospace, monospace;\n font-size: 1em;\n}\n\n/* Forms\n ========================================================================== */\n\n/**\n * Known limitation: by default, Chrome and Safari on OS X allow very limited\n * styling of `select`, unless a `border` property is set.\n */\n\n/**\n * 1. Correct color not being inherited.\n * Known issue: affects color of disabled elements.\n * 2. Correct font properties not being inherited.\n * 3. Address margins set differently in Firefox 4+, Safari, and Chrome.\n */\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n color: inherit; /* 1 */\n font: inherit; /* 2 */\n margin: 0; /* 3 */\n}\n\n/**\n * Address `overflow` set to `hidden` in IE 8/9/10/11.\n */\n\nbutton {\n overflow: visible;\n}\n\n/**\n * Address inconsistent `text-transform` inheritance for `button` and `select`.\n * All other form control elements do not inherit `text-transform` values.\n * Correct `button` style inheritance in Firefox, IE 8/9/10/11, and Opera.\n * Correct `select` style inheritance in Firefox.\n */\n\nbutton,\nselect {\n text-transform: none;\n}\n\n/**\n * 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio`\n * and `video` controls.\n * 2. Correct inability to style clickable `input` types in iOS.\n * 3. Improve usability and consistency of cursor style between image-type\n * `input` and others.\n */\n\nbutton,\nhtml input[type=\"button\"], /* 1 */\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n -webkit-appearance: button; /* 2 */\n cursor: pointer; /* 3 */\n}\n\n/**\n * Re-set default cursor for disabled elements.\n */\n\nbutton[disabled],\nhtml input[disabled] {\n cursor: default;\n}\n\n/**\n * Remove inner padding and border in Firefox 4+.\n */\n\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n border: 0;\n padding: 0;\n}\n\n/**\n * Address Firefox 4+ setting `line-height` on `input` using `!important` in\n * the UA stylesheet.\n */\n\ninput {\n line-height: normal;\n}\n\n/**\n * It's recommended that you don't attempt to style these elements.\n * Firefox's implementation doesn't respect box-sizing, padding, or width.\n *\n * 1. Address box sizing set to `content-box` in IE 8/9/10.\n * 2. Remove excess padding in IE 8/9/10.\n */\n\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n box-sizing: border-box; /* 1 */\n padding: 0; /* 2 */\n}\n\n/**\n * Fix the cursor style for Chrome's increment/decrement buttons. For certain\n * `font-size` values of the `input`, it causes the cursor style of the\n * decrement button to change from `default` to `text`.\n */\n\ninput[type=\"number\"]::-webkit-inner-spin-button,\ninput[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n/**\n * 1. Address `appearance` set to `searchfield` in Safari and Chrome.\n * 2. Address `box-sizing` set to `border-box` in Safari and Chrome\n * (include `-moz` to future-proof).\n */\n\ninput[type=\"search\"] {\n -webkit-appearance: textfield; /* 1 */\n -moz-box-sizing: content-box;\n -webkit-box-sizing: content-box; /* 2 */\n box-sizing: content-box;\n}\n\n/**\n * Remove inner padding and search cancel button in Safari and Chrome on OS X.\n * Safari (but not Chrome) clips the cancel button when the search input has\n * padding (and `textfield` appearance).\n */\n\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n/**\n * Define consistent border, margin, and padding.\n */\n\nfieldset {\n border: 1px solid #c0c0c0;\n margin: 0 2px;\n padding: 0.35em 0.625em 0.75em;\n}\n\n/**\n * 1. Correct `color` not being inherited in IE 8/9/10/11.\n * 2. Remove padding so people aren't caught out if they zero out fieldsets.\n */\n\nlegend {\n border: 0; /* 1 */\n padding: 0; /* 2 */\n}\n\n/**\n * Remove default vertical scrollbar in IE 8/9/10/11.\n */\n\ntextarea {\n overflow: auto;\n}\n\n/**\n * Don't inherit the `font-weight` (applied by a rule above).\n * NOTE: the default cannot safely be changed in Chrome and Safari on OS X.\n */\n\noptgroup {\n font-weight: bold;\n}\n\n/* Tables\n ========================================================================== */\n\n/**\n * Remove most spacing between table cells.\n */\n\ntable {\n border-collapse: collapse;\n border-spacing: 0;\n}\n\ntd,\nth {\n padding: 0;\n}\n","@if $border-box-sizing == true {\n html { // http://bit.ly/1qk2tVR\n @include box-sizing(border-box);\n }\n\n * {\n &, &:before, &:after {\n @include box-sizing(inherit);\n }\n }\n}\n","//************************************************************************//\n// Example: @include prefixer(border-radius, $radii, webkit ms spec);\n//************************************************************************//\n// Variables located in /settings/_prefixer.scss\n\n@mixin prefixer ($property, $value, $prefixes) {\n @each $prefix in $prefixes {\n @if $prefix == webkit {\n @if $prefix-for-webkit {\n -webkit-#{$property}: $value;\n }\n }\n @else if $prefix == moz {\n @if $prefix-for-mozilla {\n -moz-#{$property}: $value;\n }\n }\n @else if $prefix == ms {\n @if $prefix-for-microsoft {\n -ms-#{$property}: $value;\n }\n }\n @else if $prefix == o {\n @if $prefix-for-opera {\n -o-#{$property}: $value;\n }\n }\n @else if $prefix == spec {\n @if $prefix-for-spec {\n #{$property}: $value;\n }\n }\n @else {\n @warn \"Unrecognized prefix: #{$prefix}\";\n }\n }\n}\n\n@mixin disable-prefix-for-all() {\n $prefix-for-webkit: false !global;\n $prefix-for-mozilla: false !global;\n $prefix-for-microsoft: false !global;\n $prefix-for-opera: false !global;\n $prefix-for-spec: false !global;\n}\n","$navigation-width: 100%;\n$top-bar-height: 50px;\n$min-width: 820px;\n\n.outer-container {\n width:100%;\n height:100%;\n}\nbody {\n background: $background-clr;\n color: $text-clr;\n min-width: $min-width;\n}\n.main-navigation {\n width: $navigation-width;\n min-width:$min-width;\n color: white;\n .wrapper {\n width: $navigation-width;\n padding: 0 40px;\n }\n}\n\n.main-content {\n background: $background-clr;\n min-height:100%;\n .main-view {\n height: 100%;\n position:relative;\n padding: 160px 40px 40px 40px;\n width:100%;\n min-height: 600px;\n }\n}\n\n.top-bar {\n width:100%;\n box-shadow: 0 1px 2px rgba(black, 0.1);\n height: $top-bar-height;\n line-height: $top-bar-height;\n}\n","$dark-blue-clr: #2E3A54;\n$green-clr: #6EBC48;\n$pink-clr: #E55A84;\n$red-clr: #E06488;\n$blue-clr: #5AC4E5;\n$light-blue-clr: #F5F6F8;\n\n\n$text-clr: #3D4043;\n$text-2-clr: #828B9A;\n$text-3-clr: #AEB4BE;\n$border-clr: #D9DDE3;\n$navigation-bg-clr: $dark-blue-clr;\n$background-clr: $light-blue-clr;\n\n$color-collection: (#8A75AE, #80A1DA, #B3DD8B, #7EE4E4, #FCD285, #F7967F, #E8669D, #F7B6E7, #F99D7B, #88D0CB);\n","$top-space: 15px;\n\n.main-navigation {\n position:fixed;\n width:100%;\n z-index: 1000;\n .wrapper {\n min-width:600px;\n background: $navigation-bg-clr;\n height: em(60px);\n }\n .logo {\n display:inline-block;\n vertical-align:middle;\n margin-top:$top-space;\n\n }\n .navigation {\n display:inline-block;\n vertical-align:middle;\n margin-left: 60px;\n margin-top:$top-space;\n .links {\n padding:0 ;\n margin:0;\n list-style: none;\n display:inline-block;\n li {\n display:inline-block;\n margin-right:em(20px);\n }\n a {\n text-decoration: none;\n color: #616F8D;\n font-weight: bold;\n line-height: em(24px);\n font-size: em(15px);\n opacity: 0.7;\n &:hover {\n opacity: 1;\n color:white;\n .icon {\n background-position: center bottom;\n }\n }\n &.active {\n opacity:1;\n color: white;\n cursor: default;\n .icon {\n background-position: center bottom;\n }\n }\n .text {\n vertical-align:middle;\n }\n .icon {\n display:inline-block;\n vertical-align:middle;\n margin-right: 5px;\n width:16px;\n height:16px;\n background-size: 16px 32px;\n }\n\n }\n }\n }\n .create-new {\n display:inline-block;\n float:right;\n padding: 13px;\n // border-bottom:1px solid lighten($navigation-bg-clr, 5%);\n a {\n display:block;\n @include transition(background-color 0.1s ease-in-out);\n color:tint($green-clr,90%);\n text-align:center;\n border-radius: 2px;\n @include linear-gradient(lighten($green-clr,8%), lighten($green-clr,2%));\n text-decoration:none;\n font-size:12px;\n font-weight: bold;\n // text-shadow: 0 1px 1px darken($green-clr, 10%);\n padding: 8px 15px 10px 12px;\n &:hover {\n\n }\n &:active {\n box-shadow: inset 0 2px 5px rgba(black,0.1), 0 0 0 1px darken($navigation-bg-clr, 8%);\n }\n img {\n vertical-align:middle;\n margin-right: 5px;\n margin-top: -2px;\n }\n span {\n }\n }\n }\n}\n","// Shorthand mixin. Supports multiple parentheses-deliminated values for each variable.\n// Example: @include transition (all 2s ease-in-out);\n// @include transition (opacity 1s ease-in 2s, width 2s ease-out);\n// @include transition-property (transform, opacity);\n\n@mixin transition ($properties...) {\n // Fix for vendor-prefix transform property\n $needs-prefixes: false;\n $webkit: ();\n $moz: ();\n $spec: ();\n\n // Create lists for vendor-prefixed transform\n @each $list in $properties {\n @if nth($list, 1) == \"transform\" {\n $needs-prefixes: true;\n $list1: -webkit-transform;\n $list2: -moz-transform;\n $list3: ();\n\n @each $var in $list {\n $list3: join($list3, $var);\n\n @if $var != \"transform\" {\n $list1: join($list1, $var);\n $list2: join($list2, $var);\n }\n }\n\n $webkit: append($webkit, $list1);\n $moz: append($moz, $list2);\n $spec: append($spec, $list3);\n }\n\n // Create lists for non-prefixed transition properties\n @else {\n $webkit: append($webkit, $list, comma);\n $moz: append($moz, $list, comma);\n $spec: append($spec, $list, comma);\n }\n }\n\n @if $needs-prefixes {\n -webkit-transition: $webkit;\n -moz-transition: $moz;\n transition: $spec;\n }\n @else {\n @if length($properties) >= 1 {\n @include prefixer(transition, $properties, webkit moz spec);\n }\n\n @else {\n $properties: all 0.15s ease-out 0s;\n @include prefixer(transition, $properties, webkit moz spec);\n }\n }\n}\n\n@mixin transition-property ($properties...) {\n -webkit-transition-property: transition-property-names($properties, 'webkit');\n -moz-transition-property: transition-property-names($properties, 'moz');\n transition-property: transition-property-names($properties, false);\n}\n\n@mixin transition-duration ($times...) {\n @include prefixer(transition-duration, $times, webkit moz spec);\n}\n\n@mixin transition-timing-function ($motions...) {\n// ease | linear | ease-in | ease-out | ease-in-out | cubic-bezier()\n @include prefixer(transition-timing-function, $motions, webkit moz spec);\n}\n\n@mixin transition-delay ($times...) {\n @include prefixer(transition-delay, $times, webkit moz spec);\n}\n","@mixin linear-gradient($pos, $G1, $G2: null,\n $G3: null, $G4: null,\n $G5: null, $G6: null,\n $G7: null, $G8: null,\n $G9: null, $G10: null,\n $fallback: null) {\n // Detect what type of value exists in $pos\n $pos-type: type-of(nth($pos, 1));\n $pos-spec: null;\n $pos-degree: null;\n\n // If $pos is missing from mixin, reassign vars and add default position\n @if ($pos-type == color) or (nth($pos, 1) == \"transparent\") {\n $G10: $G9; $G9: $G8; $G8: $G7; $G7: $G6; $G6: $G5;\n $G5: $G4; $G4: $G3; $G3: $G2; $G2: $G1; $G1: $pos;\n $pos: null;\n }\n\n @if $pos {\n $positions: _linear-positions-parser($pos);\n $pos-degree: nth($positions, 1);\n $pos-spec: nth($positions, 2);\n }\n\n $full: $G1, $G2, $G3, $G4, $G5, $G6, $G7, $G8, $G9, $G10;\n\n // Set $G1 as the default fallback color\n $fallback-color: nth($G1, 1);\n\n // If $fallback is a color use that color as the fallback color\n @if (type-of($fallback) == color) or ($fallback == \"transparent\") {\n $fallback-color: $fallback;\n }\n\n background-color: $fallback-color;\n background-image: -webkit-linear-gradient($pos-degree $full); // Safari 5.1+, Chrome\n background-image: unquote(\"linear-gradient(#{$pos-spec}#{$full})\");\n}\n",".top-bar {\n float: left;\n width: 100%;\n background:rgba(white,0.9);\n .primary {\n list-style:none;\n margin:0;\n padding-left:40px;\n margin-top:-4px;\n .item {\n img {\n display:inline-block;\n vertical-align:middle;\n }\n .hoverable {\n padding: 8px 12px;\n height: 100%;\n text-decoration:none;\n color: $text-clr;\n font-size: em(12px);\n border: 1px solid transparent;\n border-radius: 3px;\n vertical-align:bottom;\n border-color: $border-clr;\n span {\n vertical-align:middle;\n }\n &:hover {\n border-color: darken($border-clr,10%);\n }\n }\n .dropdown:after {\n content: \"\";\n width: 6px;\n height: 4px;\n margin-left: 10px;\n display:inline-block;\n background-image: url(\"../images/dropdown_arrow.png\");\n background-size: 6px 4px;\n background-repeat:no-repeat;\n }\n }\n\n }\n}\n","@charset \"UTF-8\";\n/*!\nAnimate.css - http://daneden.me/animate\nLicensed under the MIT license - http://opensource.org/licenses/MIT\n\nCopyright (c) 2014 Daniel Eden\n*/\n\n.animated {\n -webkit-animation-duration: 0.3s;\n animation-duration: 0.3s;\n -webkit-animation-fill-mode: both;\n animation-fill-mode: both;\n}\n\n.animated.infinite {\n -webkit-animation-iteration-count: infinite;\n animation-iteration-count: infinite;\n}\n\n.animated.hinge {\n -webkit-animation-duration: 2s;\n animation-duration: 2s;\n}\n\n@-webkit-keyframes bounce {\n 0%, 20%, 53%, 80%, 100% {\n -webkit-transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);\n transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);\n -webkit-transform: translate3d(0,0,0);\n transform: translate3d(0,0,0);\n }\n\n 40%, 43% {\n -webkit-transition-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060);\n transition-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060);\n -webkit-transform: translate3d(0, -30px, 0);\n transform: translate3d(0, -30px, 0);\n }\n\n 70% {\n -webkit-transition-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060);\n transition-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060);\n -webkit-transform: translate3d(0, -15px, 0);\n transform: translate3d(0, -15px, 0);\n }\n\n 90% {\n -webkit-transform: translate3d(0,-4px,0);\n transform: translate3d(0,-4px,0);\n }\n}\n\n@keyframes bounce {\n 0%, 20%, 53%, 80%, 100% {\n -webkit-transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);\n transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);\n -webkit-transform: translate3d(0,0,0);\n transform: translate3d(0,0,0);\n }\n\n 40%, 43% {\n -webkit-transition-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060);\n transition-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060);\n -webkit-transform: translate3d(0, -30px, 0);\n transform: translate3d(0, -30px, 0);\n }\n\n 70% {\n -webkit-transition-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060);\n transition-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060);\n -webkit-transform: translate3d(0, -15px, 0);\n transform: translate3d(0, -15px, 0);\n }\n\n 90% {\n -webkit-transform: translate3d(0,-4px,0);\n transform: translate3d(0,-4px,0);\n }\n}\n\n.bounce {\n -webkit-animation-name: bounce;\n animation-name: bounce;\n -webkit-transform-origin: center bottom;\n -ms-transform-origin: center bottom;\n transform-origin: center bottom;\n}\n\n@-webkit-keyframes flash {\n 0%, 50%, 100% {\n opacity: 1;\n }\n\n 25%, 75% {\n opacity: 0;\n }\n}\n\n@keyframes flash {\n 0%, 50%, 100% {\n opacity: 1;\n }\n\n 25%, 75% {\n opacity: 0;\n }\n}\n\n.flash {\n -webkit-animation-name: flash;\n animation-name: flash;\n}\n\n/* originally authored by Nick Pettit - https://github.com/nickpettit/glide */\n\n@-webkit-keyframes pulse {\n 0% {\n -webkit-transform: scale3d(1, 1, 1);\n transform: scale3d(1, 1, 1);\n }\n\n 50% {\n -webkit-transform: scale3d(1.05, 1.05, 1.05);\n transform: scale3d(1.05, 1.05, 1.05);\n }\n\n 100% {\n -webkit-transform: scale3d(1, 1, 1);\n transform: scale3d(1, 1, 1);\n }\n}\n\n@keyframes pulse {\n 0% {\n -webkit-transform: scale3d(1, 1, 1);\n transform: scale3d(1, 1, 1);\n }\n\n 50% {\n -webkit-transform: scale3d(1.05, 1.05, 1.05);\n transform: scale3d(1.05, 1.05, 1.05);\n }\n\n 100% {\n -webkit-transform: scale3d(1, 1, 1);\n transform: scale3d(1, 1, 1);\n }\n}\n\n.pulse {\n -webkit-animation-name: pulse;\n animation-name: pulse;\n}\n\n@-webkit-keyframes rubberBand {\n 0% {\n -webkit-transform: scale3d(1, 1, 1);\n transform: scale3d(1, 1, 1);\n }\n\n 30% {\n -webkit-transform: scale3d(1.25, 0.75, 1);\n transform: scale3d(1.25, 0.75, 1);\n }\n\n 40% {\n -webkit-transform: scale3d(0.75, 1.25, 1);\n transform: scale3d(0.75, 1.25, 1);\n }\n\n 50% {\n -webkit-transform: scale3d(1.15, 0.85, 1);\n transform: scale3d(1.15, 0.85, 1);\n }\n\n 65% {\n -webkit-transform: scale3d(.95, 1.05, 1);\n transform: scale3d(.95, 1.05, 1);\n }\n\n 75% {\n -webkit-transform: scale3d(1.05, .95, 1);\n transform: scale3d(1.05, .95, 1);\n }\n\n 100% {\n -webkit-transform: scale3d(1, 1, 1);\n transform: scale3d(1, 1, 1);\n }\n}\n\n@keyframes rubberBand {\n 0% {\n -webkit-transform: scale3d(1, 1, 1);\n transform: scale3d(1, 1, 1);\n }\n\n 30% {\n -webkit-transform: scale3d(1.25, 0.75, 1);\n transform: scale3d(1.25, 0.75, 1);\n }\n\n 40% {\n -webkit-transform: scale3d(0.75, 1.25, 1);\n transform: scale3d(0.75, 1.25, 1);\n }\n\n 50% {\n -webkit-transform: scale3d(1.15, 0.85, 1);\n transform: scale3d(1.15, 0.85, 1);\n }\n\n 65% {\n -webkit-transform: scale3d(.95, 1.05, 1);\n transform: scale3d(.95, 1.05, 1);\n }\n\n 75% {\n -webkit-transform: scale3d(1.05, .95, 1);\n transform: scale3d(1.05, .95, 1);\n }\n\n 100% {\n -webkit-transform: scale3d(1, 1, 1);\n transform: scale3d(1, 1, 1);\n }\n}\n\n.rubberBand {\n -webkit-animation-name: rubberBand;\n animation-name: rubberBand;\n}\n\n@-webkit-keyframes shake {\n 0%, 100% {\n -webkit-transform: translate3d(0, 0, 0);\n transform: translate3d(0, 0, 0);\n }\n\n 10%, 30%, 50%, 70%, 90% {\n -webkit-transform: translate3d(-10px, 0, 0);\n transform: translate3d(-10px, 0, 0);\n }\n\n 20%, 40%, 60%, 80% {\n -webkit-transform: translate3d(10px, 0, 0);\n transform: translate3d(10px, 0, 0);\n }\n}\n\n@keyframes shake {\n 0%, 100% {\n -webkit-transform: translate3d(0, 0, 0);\n transform: translate3d(0, 0, 0);\n }\n\n 10%, 30%, 50%, 70%, 90% {\n -webkit-transform: translate3d(-10px, 0, 0);\n transform: translate3d(-10px, 0, 0);\n }\n\n 20%, 40%, 60%, 80% {\n -webkit-transform: translate3d(10px, 0, 0);\n transform: translate3d(10px, 0, 0);\n }\n}\n\n.shake {\n -webkit-animation-name: shake;\n animation-name: shake;\n}\n\n@-webkit-keyframes swing {\n 20% {\n -webkit-transform: rotate3d(0, 0, 1, 15deg);\n transform: rotate3d(0, 0, 1, 15deg);\n }\n\n 40% {\n -webkit-transform: rotate3d(0, 0, 1, -10deg);\n transform: rotate3d(0, 0, 1, -10deg);\n }\n\n 60% {\n -webkit-transform: rotate3d(0, 0, 1, 5deg);\n transform: rotate3d(0, 0, 1, 5deg);\n }\n\n 80% {\n -webkit-transform: rotate3d(0, 0, 1, -5deg);\n transform: rotate3d(0, 0, 1, -5deg);\n }\n\n 100% {\n -webkit-transform: rotate3d(0, 0, 1, 0deg);\n transform: rotate3d(0, 0, 1, 0deg);\n }\n}\n\n@keyframes swing {\n 20% {\n -webkit-transform: rotate3d(0, 0, 1, 15deg);\n transform: rotate3d(0, 0, 1, 15deg);\n }\n\n 40% {\n -webkit-transform: rotate3d(0, 0, 1, -10deg);\n transform: rotate3d(0, 0, 1, -10deg);\n }\n\n 60% {\n -webkit-transform: rotate3d(0, 0, 1, 5deg);\n transform: rotate3d(0, 0, 1, 5deg);\n }\n\n 80% {\n -webkit-transform: rotate3d(0, 0, 1, -5deg);\n transform: rotate3d(0, 0, 1, -5deg);\n }\n\n 100% {\n -webkit-transform: rotate3d(0, 0, 1, 0deg);\n transform: rotate3d(0, 0, 1, 0deg);\n }\n}\n\n.swing {\n -webkit-transform-origin: top center;\n -ms-transform-origin: top center;\n transform-origin: top center;\n -webkit-animation-name: swing;\n animation-name: swing;\n}\n\n@-webkit-keyframes tada {\n 0% {\n -webkit-transform: scale3d(1, 1, 1);\n transform: scale3d(1, 1, 1);\n }\n\n 10%, 20% {\n -webkit-transform: scale3d(.9, .9, .9) rotate3d(0, 0, 1, -3deg);\n transform: scale3d(.9, .9, .9) rotate3d(0, 0, 1, -3deg);\n }\n\n 30%, 50%, 70%, 90% {\n -webkit-transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg);\n transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg);\n }\n\n 40%, 60%, 80% {\n -webkit-transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg);\n transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg);\n }\n\n 100% {\n -webkit-transform: scale3d(1, 1, 1);\n transform: scale3d(1, 1, 1);\n }\n}\n\n@keyframes tada {\n 0% {\n -webkit-transform: scale3d(1, 1, 1);\n transform: scale3d(1, 1, 1);\n }\n\n 10%, 20% {\n -webkit-transform: scale3d(.9, .9, .9) rotate3d(0, 0, 1, -3deg);\n transform: scale3d(.9, .9, .9) rotate3d(0, 0, 1, -3deg);\n }\n\n 30%, 50%, 70%, 90% {\n -webkit-transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg);\n transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg);\n }\n\n 40%, 60%, 80% {\n -webkit-transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg);\n transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg);\n }\n\n 100% {\n -webkit-transform: scale3d(1, 1, 1);\n transform: scale3d(1, 1, 1);\n }\n}\n\n.tada {\n -webkit-animation-name: tada;\n animation-name: tada;\n}\n\n/* originally authored by Nick Pettit - https://github.com/nickpettit/glide */\n\n@-webkit-keyframes wobble {\n 0% {\n -webkit-transform: none;\n transform: none;\n }\n\n 15% {\n -webkit-transform: translate3d(-25%, 0, 0) rotate3d(0, 0, 1, -5deg);\n transform: translate3d(-25%, 0, 0) rotate3d(0, 0, 1, -5deg);\n }\n\n 30% {\n -webkit-transform: translate3d(20%, 0, 0) rotate3d(0, 0, 1, 3deg);\n transform: translate3d(20%, 0, 0) rotate3d(0, 0, 1, 3deg);\n }\n\n 45% {\n -webkit-transform: translate3d(-15%, 0, 0) rotate3d(0, 0, 1, -3deg);\n transform: translate3d(-15%, 0, 0) rotate3d(0, 0, 1, -3deg);\n }\n\n 60% {\n -webkit-transform: translate3d(10%, 0, 0) rotate3d(0, 0, 1, 2deg);\n transform: translate3d(10%, 0, 0) rotate3d(0, 0, 1, 2deg);\n }\n\n 75% {\n -webkit-transform: translate3d(-5%, 0, 0) rotate3d(0, 0, 1, -1deg);\n transform: translate3d(-5%, 0, 0) rotate3d(0, 0, 1, -1deg);\n }\n\n 100% {\n -webkit-transform: none;\n transform: none;\n }\n}\n\n@keyframes wobble {\n 0% {\n -webkit-transform: none;\n transform: none;\n }\n\n 15% {\n -webkit-transform: translate3d(-25%, 0, 0) rotate3d(0, 0, 1, -5deg);\n transform: translate3d(-25%, 0, 0) rotate3d(0, 0, 1, -5deg);\n }\n\n 30% {\n -webkit-transform: translate3d(20%, 0, 0) rotate3d(0, 0, 1, 3deg);\n transform: translate3d(20%, 0, 0) rotate3d(0, 0, 1, 3deg);\n }\n\n 45% {\n -webkit-transform: translate3d(-15%, 0, 0) rotate3d(0, 0, 1, -3deg);\n transform: translate3d(-15%, 0, 0) rotate3d(0, 0, 1, -3deg);\n }\n\n 60% {\n -webkit-transform: translate3d(10%, 0, 0) rotate3d(0, 0, 1, 2deg);\n transform: translate3d(10%, 0, 0) rotate3d(0, 0, 1, 2deg);\n }\n\n 75% {\n -webkit-transform: translate3d(-5%, 0, 0) rotate3d(0, 0, 1, -1deg);\n transform: translate3d(-5%, 0, 0) rotate3d(0, 0, 1, -1deg);\n }\n\n 100% {\n -webkit-transform: none;\n transform: none;\n }\n}\n\n.wobble {\n -webkit-animation-name: wobble;\n animation-name: wobble;\n}\n\n@-webkit-keyframes bounceIn {\n 0%, 20%, 40%, 60%, 80%, 100% {\n -webkit-transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);\n transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);\n }\n\n 0% {\n opacity: 0;\n -webkit-transform: scale3d(.3, .3, .3);\n transform: scale3d(.3, .3, .3);\n }\n\n 20% {\n -webkit-transform: scale3d(1.1, 1.1, 1.1);\n transform: scale3d(1.1, 1.1, 1.1);\n }\n\n 40% {\n -webkit-transform: scale3d(.9, .9, .9);\n transform: scale3d(.9, .9, .9);\n }\n\n 60% {\n opacity: 1;\n -webkit-transform: scale3d(1.03, 1.03, 1.03);\n transform: scale3d(1.03, 1.03, 1.03);\n }\n\n 80% {\n -webkit-transform: scale3d(.97, .97, .97);\n transform: scale3d(.97, .97, .97);\n }\n\n 100% {\n opacity: 1;\n -webkit-transform: scale3d(1, 1, 1);\n transform: scale3d(1, 1, 1);\n }\n}\n\n@keyframes bounceIn {\n 0%, 20%, 40%, 60%, 80%, 100% {\n -webkit-transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);\n transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);\n }\n\n 0% {\n opacity: 0;\n -webkit-transform: scale3d(.3, .3, .3);\n transform: scale3d(.3, .3, .3);\n }\n\n 20% {\n -webkit-transform: scale3d(1.1, 1.1, 1.1);\n transform: scale3d(1.1, 1.1, 1.1);\n }\n\n 40% {\n -webkit-transform: scale3d(.9, .9, .9);\n transform: scale3d(.9, .9, .9);\n }\n\n 60% {\n opacity: 1;\n -webkit-transform: scale3d(1.03, 1.03, 1.03);\n transform: scale3d(1.03, 1.03, 1.03);\n }\n\n 80% {\n -webkit-transform: scale3d(.97, .97, .97);\n transform: scale3d(.97, .97, .97);\n }\n\n 100% {\n opacity: 1;\n -webkit-transform: scale3d(1, 1, 1);\n transform: scale3d(1, 1, 1);\n }\n}\n\n.bounceIn {\n -webkit-animation-name: bounceIn;\n animation-name: bounceIn;\n -webkit-animation-duration: .75s;\n animation-duration: .75s;\n}\n\n@-webkit-keyframes bounceInDown {\n 0%, 60%, 75%, 90%, 100% {\n -webkit-transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);\n transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);\n }\n\n 0% {\n opacity: 0;\n -webkit-transform: translate3d(0, -3000px, 0);\n transform: translate3d(0, -3000px, 0);\n }\n\n 60% {\n opacity: 1;\n -webkit-transform: translate3d(0, 25px, 0);\n transform: translate3d(0, 25px, 0);\n }\n\n 75% {\n -webkit-transform: translate3d(0, -10px, 0);\n transform: translate3d(0, -10px, 0);\n }\n\n 90% {\n -webkit-transform: translate3d(0, 5px, 0);\n transform: translate3d(0, 5px, 0);\n }\n\n 100% {\n -webkit-transform: none;\n transform: none;\n }\n}\n\n@keyframes bounceInDown {\n 0%, 60%, 75%, 90%, 100% {\n -webkit-transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);\n transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);\n }\n\n 0% {\n opacity: 0;\n -webkit-transform: translate3d(0, -3000px, 0);\n transform: translate3d(0, -3000px, 0);\n }\n\n 60% {\n opacity: 1;\n -webkit-transform: translate3d(0, 25px, 0);\n transform: translate3d(0, 25px, 0);\n }\n\n 75% {\n -webkit-transform: translate3d(0, -10px, 0);\n transform: translate3d(0, -10px, 0);\n }\n\n 90% {\n -webkit-transform: translate3d(0, 5px, 0);\n transform: translate3d(0, 5px, 0);\n }\n\n 100% {\n -webkit-transform: none;\n transform: none;\n }\n}\n\n.bounceInDown {\n -webkit-animation-name: bounceInDown;\n animation-name: bounceInDown;\n}\n\n@-webkit-keyframes bounceInLeft {\n 0%, 60%, 75%, 90%, 100% {\n -webkit-transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);\n transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);\n }\n\n 0% {\n opacity: 0;\n -webkit-transform: translate3d(-3000px, 0, 0);\n transform: translate3d(-3000px, 0, 0);\n }\n\n 60% {\n opacity: 1;\n -webkit-transform: translate3d(25px, 0, 0);\n transform: translate3d(25px, 0, 0);\n }\n\n 75% {\n -webkit-transform: translate3d(-10px, 0, 0);\n transform: translate3d(-10px, 0, 0);\n }\n\n 90% {\n -webkit-transform: translate3d(5px, 0, 0);\n transform: translate3d(5px, 0, 0);\n }\n\n 100% {\n -webkit-transform: none;\n transform: none;\n }\n}\n\n@keyframes bounceInLeft {\n 0%, 60%, 75%, 90%, 100% {\n -webkit-transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);\n transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);\n }\n\n 0% {\n opacity: 0;\n -webkit-transform: translate3d(-3000px, 0, 0);\n transform: translate3d(-3000px, 0, 0);\n }\n\n 60% {\n opacity: 1;\n -webkit-transform: translate3d(25px, 0, 0);\n transform: translate3d(25px, 0, 0);\n }\n\n 75% {\n -webkit-transform: translate3d(-10px, 0, 0);\n transform: translate3d(-10px, 0, 0);\n }\n\n 90% {\n -webkit-transform: translate3d(5px, 0, 0);\n transform: translate3d(5px, 0, 0);\n }\n\n 100% {\n -webkit-transform: none;\n transform: none;\n }\n}\n\n.bounceInLeft {\n -webkit-animation-name: bounceInLeft;\n animation-name: bounceInLeft;\n}\n\n@-webkit-keyframes bounceInRight {\n 0%, 60%, 75%, 90%, 100% {\n -webkit-transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);\n transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);\n }\n\n 0% {\n opacity: 0;\n -webkit-transform: translate3d(3000px, 0, 0);\n transform: translate3d(3000px, 0, 0);\n }\n\n 60% {\n opacity: 1;\n -webkit-transform: translate3d(-25px, 0, 0);\n transform: translate3d(-25px, 0, 0);\n }\n\n 75% {\n -webkit-transform: translate3d(10px, 0, 0);\n transform: translate3d(10px, 0, 0);\n }\n\n 90% {\n -webkit-transform: translate3d(-5px, 0, 0);\n transform: translate3d(-5px, 0, 0);\n }\n\n 100% {\n -webkit-transform: none;\n transform: none;\n }\n}\n\n@keyframes bounceInRight {\n 0%, 60%, 75%, 90%, 100% {\n -webkit-transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);\n transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);\n }\n\n 0% {\n opacity: 0;\n -webkit-transform: translate3d(3000px, 0, 0);\n transform: translate3d(3000px, 0, 0);\n }\n\n 60% {\n opacity: 1;\n -webkit-transform: translate3d(-25px, 0, 0);\n transform: translate3d(-25px, 0, 0);\n }\n\n 75% {\n -webkit-transform: translate3d(10px, 0, 0);\n transform: translate3d(10px, 0, 0);\n }\n\n 90% {\n -webkit-transform: translate3d(-5px, 0, 0);\n transform: translate3d(-5px, 0, 0);\n }\n\n 100% {\n -webkit-transform: none;\n transform: none;\n }\n}\n\n.bounceInRight {\n -webkit-animation-name: bounceInRight;\n animation-name: bounceInRight;\n}\n\n@-webkit-keyframes bounceInUp {\n 0%, 60%, 75%, 90%, 100% {\n -webkit-transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);\n transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);\n }\n\n 0% {\n opacity: 0;\n -webkit-transform: translate3d(0, 3000px, 0);\n transform: translate3d(0, 3000px, 0);\n }\n\n 60% {\n opacity: 1;\n -webkit-transform: translate3d(0, -20px, 0);\n transform: translate3d(0, -20px, 0);\n }\n\n 75% {\n -webkit-transform: translate3d(0, 10px, 0);\n transform: translate3d(0, 10px, 0);\n }\n\n 90% {\n -webkit-transform: translate3d(0, -5px, 0);\n transform: translate3d(0, -5px, 0);\n }\n\n 100% {\n -webkit-transform: translate3d(0, 0, 0);\n transform: translate3d(0, 0, 0);\n }\n}\n\n@keyframes bounceInUp {\n 0%, 60%, 75%, 90%, 100% {\n -webkit-transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);\n transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);\n }\n\n 0% {\n opacity: 0;\n -webkit-transform: translate3d(0, 3000px, 0);\n transform: translate3d(0, 3000px, 0);\n }\n\n 60% {\n opacity: 1;\n -webkit-transform: translate3d(0, -20px, 0);\n transform: translate3d(0, -20px, 0);\n }\n\n 75% {\n -webkit-transform: translate3d(0, 10px, 0);\n transform: translate3d(0, 10px, 0);\n }\n\n 90% {\n -webkit-transform: translate3d(0, -5px, 0);\n transform: translate3d(0, -5px, 0);\n }\n\n 100% {\n -webkit-transform: translate3d(0, 0, 0);\n transform: translate3d(0, 0, 0);\n }\n}\n\n.bounceInUp {\n -webkit-animation-name: bounceInUp;\n animation-name: bounceInUp;\n}\n\n@-webkit-keyframes bounceOut {\n 20% {\n -webkit-transform: scale3d(.9, .9, .9);\n transform: scale3d(.9, .9, .9);\n }\n\n 50%, 55% {\n opacity: 1;\n -webkit-transform: scale3d(1.1, 1.1, 1.1);\n transform: scale3d(1.1, 1.1, 1.1);\n }\n\n 100% {\n opacity: 0;\n -webkit-transform: scale3d(.3, .3, .3);\n transform: scale3d(.3, .3, .3);\n }\n}\n\n@keyframes bounceOut {\n 20% {\n -webkit-transform: scale3d(.9, .9, .9);\n transform: scale3d(.9, .9, .9);\n }\n\n 50%, 55% {\n opacity: 1;\n -webkit-transform: scale3d(1.1, 1.1, 1.1);\n transform: scale3d(1.1, 1.1, 1.1);\n }\n\n 100% {\n opacity: 0;\n -webkit-transform: scale3d(.3, .3, .3);\n transform: scale3d(.3, .3, .3);\n }\n}\n\n.bounceOut {\n -webkit-animation-name: bounceOut;\n animation-name: bounceOut;\n -webkit-animation-duration: .75s;\n animation-duration: .75s;\n}\n\n@-webkit-keyframes bounceOutDown {\n 20% {\n -webkit-transform: translate3d(0, 10px, 0);\n transform: translate3d(0, 10px, 0);\n }\n\n 40%, 45% {\n opacity: 1;\n -webkit-transform: translate3d(0, -20px, 0);\n transform: translate3d(0, -20px, 0);\n }\n\n 100% {\n opacity: 0;\n -webkit-transform: translate3d(0, 2000px, 0);\n transform: translate3d(0, 2000px, 0);\n }\n}\n\n@keyframes bounceOutDown {\n 20% {\n -webkit-transform: translate3d(0, 10px, 0);\n transform: translate3d(0, 10px, 0);\n }\n\n 40%, 45% {\n opacity: 1;\n -webkit-transform: translate3d(0, -20px, 0);\n transform: translate3d(0, -20px, 0);\n }\n\n 100% {\n opacity: 0;\n -webkit-transform: translate3d(0, 2000px, 0);\n transform: translate3d(0, 2000px, 0);\n }\n}\n\n.bounceOutDown {\n -webkit-animation-name: bounceOutDown;\n animation-name: bounceOutDown;\n}\n\n@-webkit-keyframes bounceOutLeft {\n 20% {\n opacity: 1;\n -webkit-transform: translate3d(20px, 0, 0);\n transform: translate3d(20px, 0, 0);\n }\n\n 100% {\n opacity: 0;\n -webkit-transform: translate3d(-2000px, 0, 0);\n transform: translate3d(-2000px, 0, 0);\n }\n}\n\n@keyframes bounceOutLeft {\n 20% {\n opacity: 1;\n -webkit-transform: translate3d(20px, 0, 0);\n transform: translate3d(20px, 0, 0);\n }\n\n 100% {\n opacity: 0;\n -webkit-transform: translate3d(-2000px, 0, 0);\n transform: translate3d(-2000px, 0, 0);\n }\n}\n\n.bounceOutLeft {\n -webkit-animation-name: bounceOutLeft;\n animation-name: bounceOutLeft;\n}\n\n@-webkit-keyframes bounceOutRight {\n 20% {\n opacity: 1;\n -webkit-transform: translate3d(-20px, 0, 0);\n transform: translate3d(-20px, 0, 0);\n }\n\n 100% {\n opacity: 0;\n -webkit-transform: translate3d(2000px, 0, 0);\n transform: translate3d(2000px, 0, 0);\n }\n}\n\n@keyframes bounceOutRight {\n 20% {\n opacity: 1;\n -webkit-transform: translate3d(-20px, 0, 0);\n transform: translate3d(-20px, 0, 0);\n }\n\n 100% {\n opacity: 0;\n -webkit-transform: translate3d(2000px, 0, 0);\n transform: translate3d(2000px, 0, 0);\n }\n}\n\n.bounceOutRight {\n -webkit-animation-name: bounceOutRight;\n animation-name: bounceOutRight;\n}\n\n@-webkit-keyframes bounceOutUp {\n 20% {\n -webkit-transform: translate3d(0, -10px, 0);\n transform: translate3d(0, -10px, 0);\n }\n\n 40%, 45% {\n opacity: 1;\n -webkit-transform: translate3d(0, 20px, 0);\n transform: translate3d(0, 20px, 0);\n }\n\n 100% {\n opacity: 0;\n -webkit-transform: translate3d(0, -2000px, 0);\n transform: translate3d(0, -2000px, 0);\n }\n}\n\n@keyframes bounceOutUp {\n 20% {\n -webkit-transform: translate3d(0, -10px, 0);\n transform: translate3d(0, -10px, 0);\n }\n\n 40%, 45% {\n opacity: 1;\n -webkit-transform: translate3d(0, 20px, 0);\n transform: translate3d(0, 20px, 0);\n }\n\n 100% {\n opacity: 0;\n -webkit-transform: translate3d(0, -2000px, 0);\n transform: translate3d(0, -2000px, 0);\n }\n}\n\n.bounceOutUp {\n -webkit-animation-name: bounceOutUp;\n animation-name: bounceOutUp;\n}\n\n@-webkit-keyframes fadeIn {\n 0% {opacity: 0;}\n 100% {opacity: 1;}\n}\n\n@keyframes fadeIn {\n 0% {opacity: 0;}\n 100% {opacity: 1;}\n}\n\n.fadeIn {\n -webkit-animation-name: fadeIn;\n animation-name: fadeIn;\n}\n\n@-webkit-keyframes fadeInDown {\n 0% {\n opacity: 0;\n -webkit-transform: translate3d(0, -100%, 0);\n transform: translate3d(0, -100%, 0);\n }\n\n 100% {\n opacity: 1;\n -webkit-transform: none;\n transform: none;\n }\n}\n\n@keyframes fadeInDown {\n 0% {\n opacity: 0;\n -webkit-transform: translate3d(0, -100%, 0);\n transform: translate3d(0, -100%, 0);\n }\n\n 100% {\n opacity: 1;\n -webkit-transform: none;\n transform: none;\n }\n}\n\n.fadeInDown {\n -webkit-animation-name: fadeInDown;\n animation-name: fadeInDown;\n}\n\n@-webkit-keyframes fadeInDownBig {\n 0% {\n opacity: 0;\n -webkit-transform: translate3d(0, -2000px, 0);\n transform: translate3d(0, -2000px, 0);\n }\n\n 100% {\n opacity: 1;\n -webkit-transform: none;\n transform: none;\n }\n}\n\n@keyframes fadeInDownBig {\n 0% {\n opacity: 0;\n -webkit-transform: translate3d(0, -2000px, 0);\n transform: translate3d(0, -2000px, 0);\n }\n\n 100% {\n opacity: 1;\n -webkit-transform: none;\n transform: none;\n }\n}\n\n.fadeInDownBig {\n -webkit-animation-name: fadeInDownBig;\n animation-name: fadeInDownBig;\n}\n\n@-webkit-keyframes fadeInLeft {\n 0% {\n opacity: 0;\n -webkit-transform: translate3d(-100%, 0, 0);\n transform: translate3d(-100%, 0, 0);\n }\n\n 100% {\n opacity: 1;\n -webkit-transform: none;\n transform: none;\n }\n}\n\n@keyframes fadeInLeft {\n 0% {\n opacity: 0;\n -webkit-transform: translate3d(-100%, 0, 0);\n transform: translate3d(-100%, 0, 0);\n }\n\n 100% {\n opacity: 1;\n -webkit-transform: none;\n transform: none;\n }\n}\n\n.fadeInLeft {\n -webkit-animation-name: fadeInLeft;\n animation-name: fadeInLeft;\n}\n\n@-webkit-keyframes fadeInLeftBig {\n 0% {\n opacity: 0;\n -webkit-transform: translate3d(-2000px, 0, 0);\n transform: translate3d(-2000px, 0, 0);\n }\n\n 100% {\n opacity: 1;\n -webkit-transform: none;\n transform: none;\n }\n}\n\n@keyframes fadeInLeftBig {\n 0% {\n opacity: 0;\n -webkit-transform: translate3d(-2000px, 0, 0);\n transform: translate3d(-2000px, 0, 0);\n }\n\n 100% {\n opacity: 1;\n -webkit-transform: none;\n transform: none;\n }\n}\n\n.fadeInLeftBig {\n -webkit-animation-name: fadeInLeftBig;\n animation-name: fadeInLeftBig;\n}\n\n@-webkit-keyframes fadeInRight {\n 0% {\n opacity: 0;\n -webkit-transform: translate3d(100%, 0, 0);\n transform: translate3d(100%, 0, 0);\n }\n\n 100% {\n opacity: 1;\n -webkit-transform: none;\n transform: none;\n }\n}\n\n@keyframes fadeInRight {\n 0% {\n opacity: 0;\n -webkit-transform: translate3d(100%, 0, 0);\n transform: translate3d(100%, 0, 0);\n }\n\n 100% {\n opacity: 1;\n -webkit-transform: none;\n transform: none;\n }\n}\n\n.fadeInRight {\n -webkit-animation-name: fadeInRight;\n animation-name: fadeInRight;\n}\n\n@-webkit-keyframes fadeInRightBig {\n 0% {\n opacity: 0;\n -webkit-transform: translate3d(2000px, 0, 0);\n transform: translate3d(2000px, 0, 0);\n }\n\n 100% {\n opacity: 1;\n -webkit-transform: none;\n transform: none;\n }\n}\n\n@keyframes fadeInRightBig {\n 0% {\n opacity: 0;\n -webkit-transform: translate3d(2000px, 0, 0);\n transform: translate3d(2000px, 0, 0);\n }\n\n 100% {\n opacity: 1;\n -webkit-transform: none;\n transform: none;\n }\n}\n\n.fadeInRightBig {\n -webkit-animation-name: fadeInRightBig;\n animation-name: fadeInRightBig;\n}\n\n@-webkit-keyframes fadeInUp {\n 0% {\n opacity: 0;\n -webkit-transform: translate3d(0, 100%, 0);\n transform: translate3d(0, 100%, 0);\n }\n\n 100% {\n opacity: 1;\n -webkit-transform: none;\n transform: none;\n }\n}\n\n@keyframes fadeInUp {\n 0% {\n opacity: 0;\n -webkit-transform: translate3d(0, 100%, 0);\n transform: translate3d(0, 100%, 0);\n }\n\n 100% {\n opacity: 1;\n -webkit-transform: none;\n transform: none;\n }\n}\n\n.fadeInUp {\n -webkit-animation-name: fadeInUp;\n animation-name: fadeInUp;\n}\n\n@-webkit-keyframes fadeInUpBig {\n 0% {\n opacity: 0;\n -webkit-transform: translate3d(0, 2000px, 0);\n transform: translate3d(0, 2000px, 0);\n }\n\n 100% {\n opacity: 1;\n -webkit-transform: none;\n transform: none;\n }\n}\n\n@keyframes fadeInUpBig {\n 0% {\n opacity: 0;\n -webkit-transform: translate3d(0, 2000px, 0);\n transform: translate3d(0, 2000px, 0);\n }\n\n 100% {\n opacity: 1;\n -webkit-transform: none;\n transform: none;\n }\n}\n\n.fadeInUpBig {\n -webkit-animation-name: fadeInUpBig;\n animation-name: fadeInUpBig;\n}\n\n@-webkit-keyframes fadeOut {\n 0% {opacity: 1;}\n 100% {opacity: 0;}\n}\n\n@keyframes fadeOut {\n 0% {opacity: 1;}\n 100% {opacity: 0;}\n}\n\n.fadeOut {\n -webkit-animation-name: fadeOut;\n animation-name: fadeOut;\n}\n\n@-webkit-keyframes fadeOutDown {\n 0% {\n opacity: 1;\n }\n\n 100% {\n opacity: 0;\n -webkit-transform: translate3d(0, 100%, 0);\n transform: translate3d(0, 100%, 0);\n }\n}\n\n@keyframes fadeOutDown {\n 0% {\n opacity: 1;\n }\n\n 100% {\n opacity: 0;\n -webkit-transform: translate3d(0, 100%, 0);\n transform: translate3d(0, 100%, 0);\n }\n}\n\n.fadeOutDown {\n -webkit-animation-name: fadeOutDown;\n animation-name: fadeOutDown;\n}\n\n@-webkit-keyframes fadeOutDownBig {\n 0% {\n opacity: 1;\n }\n\n 100% {\n opacity: 0;\n -webkit-transform: translate3d(0, 2000px, 0);\n transform: translate3d(0, 2000px, 0);\n }\n}\n\n@keyframes fadeOutDownBig {\n 0% {\n opacity: 1;\n }\n\n 100% {\n opacity: 0;\n -webkit-transform: translate3d(0, 2000px, 0);\n transform: translate3d(0, 2000px, 0);\n }\n}\n\n.fadeOutDownBig {\n -webkit-animation-name: fadeOutDownBig;\n animation-name: fadeOutDownBig;\n}\n\n@-webkit-keyframes fadeOutLeft {\n 0% {\n opacity: 1;\n }\n\n 100% {\n opacity: 0;\n -webkit-transform: translate3d(-100%, 0, 0);\n transform: translate3d(-100%, 0, 0);\n }\n}\n\n@keyframes fadeOutLeft {\n 0% {\n opacity: 1;\n }\n\n 100% {\n opacity: 0;\n -webkit-transform: translate3d(-100%, 0, 0);\n transform: translate3d(-100%, 0, 0);\n }\n}\n\n.fadeOutLeft {\n -webkit-animation-name: fadeOutLeft;\n animation-name: fadeOutLeft;\n}\n\n@-webkit-keyframes fadeOutLeftBig {\n 0% {\n opacity: 1;\n }\n\n 100% {\n opacity: 0;\n -webkit-transform: translate3d(-2000px, 0, 0);\n transform: translate3d(-2000px, 0, 0);\n }\n}\n\n@keyframes fadeOutLeftBig {\n 0% {\n opacity: 1;\n }\n\n 100% {\n opacity: 0;\n -webkit-transform: translate3d(-2000px, 0, 0);\n transform: translate3d(-2000px, 0, 0);\n }\n}\n\n.fadeOutLeftBig {\n -webkit-animation-name: fadeOutLeftBig;\n animation-name: fadeOutLeftBig;\n}\n\n@-webkit-keyframes fadeOutRight {\n 0% {\n opacity: 1;\n }\n\n 100% {\n opacity: 0;\n -webkit-transform: translate3d(100%, 0, 0);\n transform: translate3d(100%, 0, 0);\n }\n}\n\n@keyframes fadeOutRight {\n 0% {\n opacity: 1;\n }\n\n 100% {\n opacity: 0;\n -webkit-transform: translate3d(100%, 0, 0);\n transform: translate3d(100%, 0, 0);\n }\n}\n\n.fadeOutRight {\n -webkit-animation-name: fadeOutRight;\n animation-name: fadeOutRight;\n}\n\n@-webkit-keyframes fadeOutRightBig {\n 0% {\n opacity: 1;\n }\n\n 100% {\n opacity: 0;\n -webkit-transform: translate3d(2000px, 0, 0);\n transform: translate3d(2000px, 0, 0);\n }\n}\n\n@keyframes fadeOutRightBig {\n 0% {\n opacity: 1;\n }\n\n 100% {\n opacity: 0;\n -webkit-transform: translate3d(2000px, 0, 0);\n transform: translate3d(2000px, 0, 0);\n }\n}\n\n.fadeOutRightBig {\n -webkit-animation-name: fadeOutRightBig;\n animation-name: fadeOutRightBig;\n}\n\n@-webkit-keyframes fadeOutUp {\n 0% {\n opacity: 1;\n }\n\n 100% {\n opacity: 0;\n -webkit-transform: translate3d(0, -100%, 0);\n transform: translate3d(0, -100%, 0);\n }\n}\n\n@keyframes fadeOutUp {\n 0% {\n opacity: 1;\n }\n\n 100% {\n opacity: 0;\n -webkit-transform: translate3d(0, -100%, 0);\n transform: translate3d(0, -100%, 0);\n }\n}\n\n.fadeOutUp {\n -webkit-animation-name: fadeOutUp;\n animation-name: fadeOutUp;\n}\n\n@-webkit-keyframes fadeOutUpBig {\n 0% {\n opacity: 1;\n }\n\n 100% {\n opacity: 0;\n -webkit-transform: translate3d(0, -2000px, 0);\n transform: translate3d(0, -2000px, 0);\n }\n}\n\n@keyframes fadeOutUpBig {\n 0% {\n opacity: 1;\n }\n\n 100% {\n opacity: 0;\n -webkit-transform: translate3d(0, -2000px, 0);\n transform: translate3d(0, -2000px, 0);\n }\n}\n\n.fadeOutUpBig {\n -webkit-animation-name: fadeOutUpBig;\n animation-name: fadeOutUpBig;\n}\n\n@-webkit-keyframes flip {\n 0% {\n -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -360deg);\n transform: perspective(400px) rotate3d(0, 1, 0, -360deg);\n -webkit-animation-timing-function: ease-out;\n animation-timing-function: ease-out;\n }\n\n 40% {\n -webkit-transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -190deg);\n transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -190deg);\n -webkit-animation-timing-function: ease-out;\n animation-timing-function: ease-out;\n }\n\n 50% {\n -webkit-transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -170deg);\n transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -170deg);\n -webkit-animation-timing-function: ease-in;\n animation-timing-function: ease-in;\n }\n\n 80% {\n -webkit-transform: perspective(400px) scale3d(.95, .95, .95);\n transform: perspective(400px) scale3d(.95, .95, .95);\n -webkit-animation-timing-function: ease-in;\n animation-timing-function: ease-in;\n }\n\n 100% {\n -webkit-transform: perspective(400px);\n transform: perspective(400px);\n -webkit-animation-timing-function: ease-in;\n animation-timing-function: ease-in;\n }\n}\n\n@keyframes flip {\n 0% {\n -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -360deg);\n transform: perspective(400px) rotate3d(0, 1, 0, -360deg);\n -webkit-animation-timing-function: ease-out;\n animation-timing-function: ease-out;\n }\n\n 40% {\n -webkit-transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -190deg);\n transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -190deg);\n -webkit-animation-timing-function: ease-out;\n animation-timing-function: ease-out;\n }\n\n 50% {\n -webkit-transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -170deg);\n transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -170deg);\n -webkit-animation-timing-function: ease-in;\n animation-timing-function: ease-in;\n }\n\n 80% {\n -webkit-transform: perspective(400px) scale3d(.95, .95, .95);\n transform: perspective(400px) scale3d(.95, .95, .95);\n -webkit-animation-timing-function: ease-in;\n animation-timing-function: ease-in;\n }\n\n 100% {\n -webkit-transform: perspective(400px);\n transform: perspective(400px);\n -webkit-animation-timing-function: ease-in;\n animation-timing-function: ease-in;\n }\n}\n\n.animated.flip {\n -webkit-backface-visibility: visible;\n backface-visibility: visible;\n -webkit-animation-name: flip;\n animation-name: flip;\n}\n\n@-webkit-keyframes flipInX {\n 0% {\n -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 90deg);\n transform: perspective(400px) rotate3d(1, 0, 0, 90deg);\n -webkit-transition-timing-function: ease-in;\n transition-timing-function: ease-in;\n opacity: 0;\n }\n\n 40% {\n -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -20deg);\n transform: perspective(400px) rotate3d(1, 0, 0, -20deg);\n -webkit-transition-timing-function: ease-in;\n transition-timing-function: ease-in;\n }\n\n 60% {\n -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 10deg);\n transform: perspective(400px) rotate3d(1, 0, 0, 10deg);\n opacity: 1;\n }\n\n 80% {\n -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -5deg);\n transform: perspective(400px) rotate3d(1, 0, 0, -5deg);\n }\n\n 100% {\n -webkit-transform: perspective(400px);\n transform: perspective(400px);\n }\n}\n\n@keyframes flipInX {\n 0% {\n -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 90deg);\n transform: perspective(400px) rotate3d(1, 0, 0, 90deg);\n -webkit-transition-timing-function: ease-in;\n transition-timing-function: ease-in;\n opacity: 0;\n }\n\n 40% {\n -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -20deg);\n transform: perspective(400px) rotate3d(1, 0, 0, -20deg);\n -webkit-transition-timing-function: ease-in;\n transition-timing-function: ease-in;\n }\n\n 60% {\n -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 10deg);\n transform: perspective(400px) rotate3d(1, 0, 0, 10deg);\n opacity: 1;\n }\n\n 80% {\n -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -5deg);\n transform: perspective(400px) rotate3d(1, 0, 0, -5deg);\n }\n\n 100% {\n -webkit-transform: perspective(400px);\n transform: perspective(400px);\n }\n}\n\n.flipInX {\n -webkit-backface-visibility: visible !important;\n backface-visibility: visible !important;\n -webkit-animation-name: flipInX;\n animation-name: flipInX;\n}\n\n@-webkit-keyframes flipInY {\n 0% {\n -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 90deg);\n transform: perspective(400px) rotate3d(0, 1, 0, 90deg);\n -webkit-transition-timing-function: ease-in;\n transition-timing-function: ease-in;\n opacity: 0;\n }\n\n 40% {\n -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -20deg);\n transform: perspective(400px) rotate3d(0, 1, 0, -20deg);\n -webkit-transition-timing-function: ease-in;\n transition-timing-function: ease-in;\n }\n\n 60% {\n -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 10deg);\n transform: perspective(400px) rotate3d(0, 1, 0, 10deg);\n opacity: 1;\n }\n\n 80% {\n -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -5deg);\n transform: perspective(400px) rotate3d(0, 1, 0, -5deg);\n }\n\n 100% {\n -webkit-transform: perspective(400px);\n transform: perspective(400px);\n }\n}\n\n@keyframes flipInY {\n 0% {\n -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 90deg);\n transform: perspective(400px) rotate3d(0, 1, 0, 90deg);\n -webkit-transition-timing-function: ease-in;\n transition-timing-function: ease-in;\n opacity: 0;\n }\n\n 40% {\n -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -20deg);\n transform: perspective(400px) rotate3d(0, 1, 0, -20deg);\n -webkit-transition-timing-function: ease-in;\n transition-timing-function: ease-in;\n }\n\n 60% {\n -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 10deg);\n transform: perspective(400px) rotate3d(0, 1, 0, 10deg);\n opacity: 1;\n }\n\n 80% {\n -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -5deg);\n transform: perspective(400px) rotate3d(0, 1, 0, -5deg);\n }\n\n 100% {\n -webkit-transform: perspective(400px);\n transform: perspective(400px);\n }\n}\n\n.flipInY {\n -webkit-backface-visibility: visible !important;\n backface-visibility: visible !important;\n -webkit-animation-name: flipInY;\n animation-name: flipInY;\n}\n\n@-webkit-keyframes flipOutX {\n 0% {\n -webkit-transform: perspective(400px);\n transform: perspective(400px);\n }\n\n 30% {\n -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -20deg);\n transform: perspective(400px) rotate3d(1, 0, 0, -20deg);\n opacity: 1;\n }\n\n 100% {\n -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 90deg);\n transform: perspective(400px) rotate3d(1, 0, 0, 90deg);\n opacity: 0;\n }\n}\n\n@keyframes flipOutX {\n 0% {\n -webkit-transform: perspective(400px);\n transform: perspective(400px);\n }\n\n 30% {\n -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -20deg);\n transform: perspective(400px) rotate3d(1, 0, 0, -20deg);\n opacity: 1;\n }\n\n 100% {\n -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 90deg);\n transform: perspective(400px) rotate3d(1, 0, 0, 90deg);\n opacity: 0;\n }\n}\n\n.flipOutX {\n -webkit-animation-name: flipOutX;\n animation-name: flipOutX;\n -webkit-animation-duration: .75s;\n animation-duration: .75s;\n -webkit-backface-visibility: visible !important;\n backface-visibility: visible !important;\n}\n\n@-webkit-keyframes flipOutY {\n 0% {\n -webkit-transform: perspective(400px);\n transform: perspective(400px);\n }\n\n 30% {\n -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -15deg);\n transform: perspective(400px) rotate3d(0, 1, 0, -15deg);\n opacity: 1;\n }\n\n 100% {\n -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 90deg);\n transform: perspective(400px) rotate3d(0, 1, 0, 90deg);\n opacity: 0;\n }\n}\n\n@keyframes flipOutY {\n 0% {\n -webkit-transform: perspective(400px);\n transform: perspective(400px);\n }\n\n 30% {\n -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -15deg);\n transform: perspective(400px) rotate3d(0, 1, 0, -15deg);\n opacity: 1;\n }\n\n 100% {\n -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 90deg);\n transform: perspective(400px) rotate3d(0, 1, 0, 90deg);\n opacity: 0;\n }\n}\n\n.flipOutY {\n -webkit-backface-visibility: visible !important;\n backface-visibility: visible !important;\n -webkit-animation-name: flipOutY;\n animation-name: flipOutY;\n -webkit-animation-duration: .75s;\n animation-duration: .75s;\n}\n\n@-webkit-keyframes lightSpeedIn {\n 0% {\n -webkit-transform: translate3d(100%, 0, 0) skewX(-30deg);\n transform: translate3d(100%, 0, 0) skewX(-30deg);\n opacity: 0;\n }\n\n 60% {\n -webkit-transform: skewX(20deg);\n transform: skewX(20deg);\n opacity: 1;\n }\n\n 80% {\n -webkit-transform: skewX(-5deg);\n transform: skewX(-5deg);\n opacity: 1;\n }\n\n 100% {\n -webkit-transform: none;\n transform: none;\n opacity: 1;\n }\n}\n\n@keyframes lightSpeedIn {\n 0% {\n -webkit-transform: translate3d(100%, 0, 0) skewX(-30deg);\n transform: translate3d(100%, 0, 0) skewX(-30deg);\n opacity: 0;\n }\n\n 60% {\n -webkit-transform: skewX(20deg);\n transform: skewX(20deg);\n opacity: 1;\n }\n\n 80% {\n -webkit-transform: skewX(-5deg);\n transform: skewX(-5deg);\n opacity: 1;\n }\n\n 100% {\n -webkit-transform: none;\n transform: none;\n opacity: 1;\n }\n}\n\n.lightSpeedIn {\n -webkit-animation-name: lightSpeedIn;\n animation-name: lightSpeedIn;\n -webkit-animation-timing-function: ease-out;\n animation-timing-function: ease-out;\n}\n\n@-webkit-keyframes lightSpeedOut {\n 0% {\n opacity: 1;\n }\n\n 100% {\n -webkit-transform: translate3d(100%, 0, 0) skewX(30deg);\n transform: translate3d(100%, 0, 0) skewX(30deg);\n opacity: 0;\n }\n}\n\n@keyframes lightSpeedOut {\n 0% {\n opacity: 1;\n }\n\n 100% {\n -webkit-transform: translate3d(100%, 0, 0) skewX(30deg);\n transform: translate3d(100%, 0, 0) skewX(30deg);\n opacity: 0;\n }\n}\n\n.lightSpeedOut {\n -webkit-animation-name: lightSpeedOut;\n animation-name: lightSpeedOut;\n -webkit-animation-timing-function: ease-in;\n animation-timing-function: ease-in;\n}\n\n@-webkit-keyframes rotateIn {\n 0% {\n -webkit-transform-origin: center;\n transform-origin: center;\n -webkit-transform: rotate3d(0, 0, 1, -200deg);\n transform: rotate3d(0, 0, 1, -200deg);\n opacity: 0;\n }\n\n 100% {\n -webkit-transform-origin: center;\n transform-origin: center;\n -webkit-transform: none;\n transform: none;\n opacity: 1;\n }\n}\n\n@keyframes rotateIn {\n 0% {\n -webkit-transform-origin: center;\n transform-origin: center;\n -webkit-transform: rotate3d(0, 0, 1, -200deg);\n transform: rotate3d(0, 0, 1, -200deg);\n opacity: 0;\n }\n\n 100% {\n -webkit-transform-origin: center;\n transform-origin: center;\n -webkit-transform: none;\n transform: none;\n opacity: 1;\n }\n}\n\n.rotateIn {\n -webkit-animation-name: rotateIn;\n animation-name: rotateIn;\n}\n\n@-webkit-keyframes rotateInDownLeft {\n 0% {\n -webkit-transform-origin: left bottom;\n transform-origin: left bottom;\n -webkit-transform: rotate3d(0, 0, 1, -45deg);\n transform: rotate3d(0, 0, 1, -45deg);\n opacity: 0;\n }\n\n 100% {\n -webkit-transform-origin: left bottom;\n transform-origin: left bottom;\n -webkit-transform: none;\n transform: none;\n opacity: 1;\n }\n}\n\n@keyframes rotateInDownLeft {\n 0% {\n -webkit-transform-origin: left bottom;\n transform-origin: left bottom;\n -webkit-transform: rotate3d(0, 0, 1, -45deg);\n transform: rotate3d(0, 0, 1, -45deg);\n opacity: 0;\n }\n\n 100% {\n -webkit-transform-origin: left bottom;\n transform-origin: left bottom;\n -webkit-transform: none;\n transform: none;\n opacity: 1;\n }\n}\n\n.rotateInDownLeft {\n -webkit-animation-name: rotateInDownLeft;\n animation-name: rotateInDownLeft;\n}\n\n@-webkit-keyframes rotateInDownRight {\n 0% {\n -webkit-transform-origin: right bottom;\n transform-origin: right bottom;\n -webkit-transform: rotate3d(0, 0, 1, 45deg);\n transform: rotate3d(0, 0, 1, 45deg);\n opacity: 0;\n }\n\n 100% {\n -webkit-transform-origin: right bottom;\n transform-origin: right bottom;\n -webkit-transform: none;\n transform: none;\n opacity: 1;\n }\n}\n\n@keyframes rotateInDownRight {\n 0% {\n -webkit-transform-origin: right bottom;\n transform-origin: right bottom;\n -webkit-transform: rotate3d(0, 0, 1, 45deg);\n transform: rotate3d(0, 0, 1, 45deg);\n opacity: 0;\n }\n\n 100% {\n -webkit-transform-origin: right bottom;\n transform-origin: right bottom;\n -webkit-transform: none;\n transform: none;\n opacity: 1;\n }\n}\n\n.rotateInDownRight {\n -webkit-animation-name: rotateInDownRight;\n animation-name: rotateInDownRight;\n}\n\n@-webkit-keyframes rotateInUpLeft {\n 0% {\n -webkit-transform-origin: left bottom;\n transform-origin: left bottom;\n -webkit-transform: rotate3d(0, 0, 1, 45deg);\n transform: rotate3d(0, 0, 1, 45deg);\n opacity: 0;\n }\n\n 100% {\n -webkit-transform-origin: left bottom;\n transform-origin: left bottom;\n -webkit-transform: none;\n transform: none;\n opacity: 1;\n }\n}\n\n@keyframes rotateInUpLeft {\n 0% {\n -webkit-transform-origin: left bottom;\n transform-origin: left bottom;\n -webkit-transform: rotate3d(0, 0, 1, 45deg);\n transform: rotate3d(0, 0, 1, 45deg);\n opacity: 0;\n }\n\n 100% {\n -webkit-transform-origin: left bottom;\n transform-origin: left bottom;\n -webkit-transform: none;\n transform: none;\n opacity: 1;\n }\n}\n\n.rotateInUpLeft {\n -webkit-animation-name: rotateInUpLeft;\n animation-name: rotateInUpLeft;\n}\n\n@-webkit-keyframes rotateInUpRight {\n 0% {\n -webkit-transform-origin: right bottom;\n transform-origin: right bottom;\n -webkit-transform: rotate3d(0, 0, 1, -90deg);\n transform: rotate3d(0, 0, 1, -90deg);\n opacity: 0;\n }\n\n 100% {\n -webkit-transform-origin: right bottom;\n transform-origin: right bottom;\n -webkit-transform: none;\n transform: none;\n opacity: 1;\n }\n}\n\n@keyframes rotateInUpRight {\n 0% {\n -webkit-transform-origin: right bottom;\n transform-origin: right bottom;\n -webkit-transform: rotate3d(0, 0, 1, -90deg);\n transform: rotate3d(0, 0, 1, -90deg);\n opacity: 0;\n }\n\n 100% {\n -webkit-transform-origin: right bottom;\n transform-origin: right bottom;\n -webkit-transform: none;\n transform: none;\n opacity: 1;\n }\n}\n\n.rotateInUpRight {\n -webkit-animation-name: rotateInUpRight;\n animation-name: rotateInUpRight;\n}\n\n@-webkit-keyframes rotateOut {\n 0% {\n -webkit-transform-origin: center;\n transform-origin: center;\n opacity: 1;\n }\n\n 100% {\n -webkit-transform-origin: center;\n transform-origin: center;\n -webkit-transform: rotate3d(0, 0, 1, 200deg);\n transform: rotate3d(0, 0, 1, 200deg);\n opacity: 0;\n }\n}\n\n@keyframes rotateOut {\n 0% {\n -webkit-transform-origin: center;\n transform-origin: center;\n opacity: 1;\n }\n\n 100% {\n -webkit-transform-origin: center;\n transform-origin: center;\n -webkit-transform: rotate3d(0, 0, 1, 200deg);\n transform: rotate3d(0, 0, 1, 200deg);\n opacity: 0;\n }\n}\n\n.rotateOut {\n -webkit-animation-name: rotateOut;\n animation-name: rotateOut;\n}\n\n@-webkit-keyframes rotateOutDownLeft {\n 0% {\n -webkit-transform-origin: left bottom;\n transform-origin: left bottom;\n opacity: 1;\n }\n\n 100% {\n -webkit-transform-origin: left bottom;\n transform-origin: left bottom;\n -webkit-transform: rotate3d(0, 0, 1, 45deg);\n transform: rotate3d(0, 0, 1, 45deg);\n opacity: 0;\n }\n}\n\n@keyframes rotateOutDownLeft {\n 0% {\n -webkit-transform-origin: left bottom;\n transform-origin: left bottom;\n opacity: 1;\n }\n\n 100% {\n -webkit-transform-origin: left bottom;\n transform-origin: left bottom;\n -webkit-transform: rotate3d(0, 0, 1, 45deg);\n transform: rotate3d(0, 0, 1, 45deg);\n opacity: 0;\n }\n}\n\n.rotateOutDownLeft {\n -webkit-animation-name: rotateOutDownLeft;\n animation-name: rotateOutDownLeft;\n}\n\n@-webkit-keyframes rotateOutDownRight {\n 0% {\n -webkit-transform-origin: right bottom;\n transform-origin: right bottom;\n opacity: 1;\n }\n\n 100% {\n -webkit-transform-origin: right bottom;\n transform-origin: right bottom;\n -webkit-transform: rotate3d(0, 0, 1, -45deg);\n transform: rotate3d(0, 0, 1, -45deg);\n opacity: 0;\n }\n}\n\n@keyframes rotateOutDownRight {\n 0% {\n -webkit-transform-origin: right bottom;\n transform-origin: right bottom;\n opacity: 1;\n }\n\n 100% {\n -webkit-transform-origin: right bottom;\n transform-origin: right bottom;\n -webkit-transform: rotate3d(0, 0, 1, -45deg);\n transform: rotate3d(0, 0, 1, -45deg);\n opacity: 0;\n }\n}\n\n.rotateOutDownRight {\n -webkit-animation-name: rotateOutDownRight;\n animation-name: rotateOutDownRight;\n}\n\n@-webkit-keyframes rotateOutUpLeft {\n 0% {\n -webkit-transform-origin: left bottom;\n transform-origin: left bottom;\n opacity: 1;\n }\n\n 100% {\n -webkit-transform-origin: left bottom;\n transform-origin: left bottom;\n -webkit-transform: rotate3d(0, 0, 1, -45deg);\n transform: rotate3d(0, 0, 1, -45deg);\n opacity: 0;\n }\n}\n\n@keyframes rotateOutUpLeft {\n 0% {\n -webkit-transform-origin: left bottom;\n transform-origin: left bottom;\n opacity: 1;\n }\n\n 100% {\n -webkit-transform-origin: left bottom;\n transform-origin: left bottom;\n -webkit-transform: rotate3d(0, 0, 1, -45deg);\n transform: rotate3d(0, 0, 1, -45deg);\n opacity: 0;\n }\n}\n\n.rotateOutUpLeft {\n -webkit-animation-name: rotateOutUpLeft;\n animation-name: rotateOutUpLeft;\n}\n\n@-webkit-keyframes rotateOutUpRight {\n 0% {\n -webkit-transform-origin: right bottom;\n transform-origin: right bottom;\n opacity: 1;\n }\n\n 100% {\n -webkit-transform-origin: right bottom;\n transform-origin: right bottom;\n -webkit-transform: rotate3d(0, 0, 1, 90deg);\n transform: rotate3d(0, 0, 1, 90deg);\n opacity: 0;\n }\n}\n\n@keyframes rotateOutUpRight {\n 0% {\n -webkit-transform-origin: right bottom;\n transform-origin: right bottom;\n opacity: 1;\n }\n\n 100% {\n -webkit-transform-origin: right bottom;\n transform-origin: right bottom;\n -webkit-transform: rotate3d(0, 0, 1, 90deg);\n transform: rotate3d(0, 0, 1, 90deg);\n opacity: 0;\n }\n}\n\n.rotateOutUpRight {\n -webkit-animation-name: rotateOutUpRight;\n animation-name: rotateOutUpRight;\n}\n\n@-webkit-keyframes hinge {\n 0% {\n -webkit-transform-origin: top left;\n transform-origin: top left;\n -webkit-animation-timing-function: ease-in-out;\n animation-timing-function: ease-in-out;\n }\n\n 20%, 60% {\n -webkit-transform: rotate3d(0, 0, 1, 80deg);\n transform: rotate3d(0, 0, 1, 80deg);\n -webkit-transform-origin: top left;\n transform-origin: top left;\n -webkit-animation-timing-function: ease-in-out;\n animation-timing-function: ease-in-out;\n }\n\n 40%, 80% {\n -webkit-transform: rotate3d(0, 0, 1, 60deg);\n transform: rotate3d(0, 0, 1, 60deg);\n -webkit-transform-origin: top left;\n transform-origin: top left;\n -webkit-animation-timing-function: ease-in-out;\n animation-timing-function: ease-in-out;\n opacity: 1;\n }\n\n 100% {\n -webkit-transform: translate3d(0, 700px, 0);\n transform: translate3d(0, 700px, 0);\n opacity: 0;\n }\n}\n\n@keyframes hinge {\n 0% {\n -webkit-transform-origin: top left;\n transform-origin: top left;\n -webkit-animation-timing-function: ease-in-out;\n animation-timing-function: ease-in-out;\n }\n\n 20%, 60% {\n -webkit-transform: rotate3d(0, 0, 1, 80deg);\n transform: rotate3d(0, 0, 1, 80deg);\n -webkit-transform-origin: top left;\n transform-origin: top left;\n -webkit-animation-timing-function: ease-in-out;\n animation-timing-function: ease-in-out;\n }\n\n 40%, 80% {\n -webkit-transform: rotate3d(0, 0, 1, 60deg);\n transform: rotate3d(0, 0, 1, 60deg);\n -webkit-transform-origin: top left;\n transform-origin: top left;\n -webkit-animation-timing-function: ease-in-out;\n animation-timing-function: ease-in-out;\n opacity: 1;\n }\n\n 100% {\n -webkit-transform: translate3d(0, 700px, 0);\n transform: translate3d(0, 700px, 0);\n opacity: 0;\n }\n}\n\n.hinge {\n -webkit-animation-name: hinge;\n animation-name: hinge;\n}\n\n/* originally authored by Nick Pettit - https://github.com/nickpettit/glide */\n\n@-webkit-keyframes rollIn {\n 0% {\n opacity: 0;\n -webkit-transform: translate3d(-100%, 0, 0) rotate3d(0, 0, 1, -120deg);\n transform: translate3d(-100%, 0, 0) rotate3d(0, 0, 1, -120deg);\n }\n\n 100% {\n opacity: 1;\n -webkit-transform: none;\n transform: none;\n }\n}\n\n@keyframes rollIn {\n 0% {\n opacity: 0;\n -webkit-transform: translate3d(-100%, 0, 0) rotate3d(0, 0, 1, -120deg);\n transform: translate3d(-100%, 0, 0) rotate3d(0, 0, 1, -120deg);\n }\n\n 100% {\n opacity: 1;\n -webkit-transform: none;\n transform: none;\n }\n}\n\n.rollIn {\n -webkit-animation-name: rollIn;\n animation-name: rollIn;\n}\n\n/* originally authored by Nick Pettit - https://github.com/nickpettit/glide */\n\n@-webkit-keyframes rollOut {\n 0% {\n opacity: 1;\n }\n\n 100% {\n opacity: 0;\n -webkit-transform: translate3d(100%, 0, 0) rotate3d(0, 0, 1, 120deg);\n transform: translate3d(100%, 0, 0) rotate3d(0, 0, 1, 120deg);\n }\n}\n\n@keyframes rollOut {\n 0% {\n opacity: 1;\n }\n\n 100% {\n opacity: 0;\n -webkit-transform: translate3d(100%, 0, 0) rotate3d(0, 0, 1, 120deg);\n transform: translate3d(100%, 0, 0) rotate3d(0, 0, 1, 120deg);\n }\n}\n\n.rollOut {\n -webkit-animation-name: rollOut;\n animation-name: rollOut;\n}\n\n@-webkit-keyframes zoomIn {\n 0% {\n opacity: 0;\n -webkit-transform: scale3d(.3, .3, .3);\n transform: scale3d(.3, .3, .3);\n }\n\n 50% {\n opacity: 1;\n }\n}\n\n@keyframes zoomIn {\n 0% {\n opacity: 0;\n -webkit-transform: scale3d(.3, .3, .3);\n transform: scale3d(.3, .3, .3);\n }\n\n 50% {\n opacity: 1;\n }\n}\n\n.zoomIn {\n -webkit-animation-name: zoomIn;\n animation-name: zoomIn;\n}\n\n@-webkit-keyframes zoomInDown {\n 0% {\n opacity: 0;\n -webkit-transform: scale3d(.1, .1, .1) translate3d(0, -1000px, 0);\n transform: scale3d(.1, .1, .1) translate3d(0, -1000px, 0);\n -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);\n animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);\n }\n\n 60% {\n opacity: 1;\n -webkit-transform: scale3d(.475, .475, .475) translate3d(0, 60px, 0);\n transform: scale3d(.475, .475, .475) translate3d(0, 60px, 0);\n -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);\n animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);\n }\n}\n\n@keyframes zoomInDown {\n 0% {\n opacity: 0;\n -webkit-transform: scale3d(.1, .1, .1) translate3d(0, -1000px, 0);\n transform: scale3d(.1, .1, .1) translate3d(0, -1000px, 0);\n -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);\n animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);\n }\n\n 60% {\n opacity: 1;\n -webkit-transform: scale3d(.475, .475, .475) translate3d(0, 60px, 0);\n transform: scale3d(.475, .475, .475) translate3d(0, 60px, 0);\n -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);\n animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);\n }\n}\n\n.zoomInDown {\n -webkit-animation-name: zoomInDown;\n animation-name: zoomInDown;\n}\n\n@-webkit-keyframes zoomInLeft {\n 0% {\n opacity: 0;\n -webkit-transform: scale3d(.1, .1, .1) translate3d(-1000px, 0, 0);\n transform: scale3d(.1, .1, .1) translate3d(-1000px, 0, 0);\n -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);\n animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);\n }\n\n 60% {\n opacity: 1;\n -webkit-transform: scale3d(.475, .475, .475) translate3d(10px, 0, 0);\n transform: scale3d(.475, .475, .475) translate3d(10px, 0, 0);\n -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);\n animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);\n }\n}\n\n@keyframes zoomInLeft {\n 0% {\n opacity: 0;\n -webkit-transform: scale3d(.1, .1, .1) translate3d(-1000px, 0, 0);\n transform: scale3d(.1, .1, .1) translate3d(-1000px, 0, 0);\n -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);\n animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);\n }\n\n 60% {\n opacity: 1;\n -webkit-transform: scale3d(.475, .475, .475) translate3d(10px, 0, 0);\n transform: scale3d(.475, .475, .475) translate3d(10px, 0, 0);\n -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);\n animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);\n }\n}\n\n.zoomInLeft {\n -webkit-animation-name: zoomInLeft;\n animation-name: zoomInLeft;\n}\n\n@-webkit-keyframes zoomInRight {\n 0% {\n opacity: 0;\n -webkit-transform: scale3d(.1, .1, .1) translate3d(1000px, 0, 0);\n transform: scale3d(.1, .1, .1) translate3d(1000px, 0, 0);\n -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);\n animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);\n }\n\n 60% {\n opacity: 1;\n -webkit-transform: scale3d(.475, .475, .475) translate3d(-10px, 0, 0);\n transform: scale3d(.475, .475, .475) translate3d(-10px, 0, 0);\n -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);\n animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);\n }\n}\n\n@keyframes zoomInRight {\n 0% {\n opacity: 0;\n -webkit-transform: scale3d(.1, .1, .1) translate3d(1000px, 0, 0);\n transform: scale3d(.1, .1, .1) translate3d(1000px, 0, 0);\n -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);\n animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);\n }\n\n 60% {\n opacity: 1;\n -webkit-transform: scale3d(.475, .475, .475) translate3d(-10px, 0, 0);\n transform: scale3d(.475, .475, .475) translate3d(-10px, 0, 0);\n -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);\n animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);\n }\n}\n\n.zoomInRight {\n -webkit-animation-name: zoomInRight;\n animation-name: zoomInRight;\n}\n\n@-webkit-keyframes zoomInUp {\n 0% {\n opacity: 0;\n -webkit-transform: scale3d(.1, .1, .1) translate3d(0, 1000px, 0);\n transform: scale3d(.1, .1, .1) translate3d(0, 1000px, 0);\n -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);\n animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);\n }\n\n 60% {\n opacity: 1;\n -webkit-transform: scale3d(.475, .475, .475) translate3d(0, -60px, 0);\n transform: scale3d(.475, .475, .475) translate3d(0, -60px, 0);\n -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);\n animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);\n }\n}\n\n@keyframes zoomInUp {\n 0% {\n opacity: 0;\n -webkit-transform: scale3d(.1, .1, .1) translate3d(0, 1000px, 0);\n transform: scale3d(.1, .1, .1) translate3d(0, 1000px, 0);\n -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);\n animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);\n }\n\n 60% {\n opacity: 1;\n -webkit-transform: scale3d(.475, .475, .475) translate3d(0, -60px, 0);\n transform: scale3d(.475, .475, .475) translate3d(0, -60px, 0);\n -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);\n animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);\n }\n}\n\n.zoomInUp {\n -webkit-animation-name: zoomInUp;\n animation-name: zoomInUp;\n}\n\n@-webkit-keyframes zoomOut {\n 0% {\n opacity: 1;\n }\n\n 50% {\n opacity: 0;\n -webkit-transform: scale3d(.3, .3, .3);\n transform: scale3d(.3, .3, .3);\n }\n\n 100% {\n opacity: 0;\n }\n}\n\n@keyframes zoomOut {\n 0% {\n opacity: 1;\n }\n\n 50% {\n opacity: 0;\n -webkit-transform: scale3d(.3, .3, .3);\n transform: scale3d(.3, .3, .3);\n }\n\n 100% {\n opacity: 0;\n }\n}\n\n.zoomOut {\n -webkit-animation-name: zoomOut;\n animation-name: zoomOut;\n}\n\n@-webkit-keyframes zoomOutDown {\n 40% {\n opacity: 1;\n -webkit-transform: scale3d(.475, .475, .475) translate3d(0, -60px, 0);\n transform: scale3d(.475, .475, .475) translate3d(0, -60px, 0);\n -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);\n animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);\n }\n\n 100% {\n opacity: 0;\n -webkit-transform: scale3d(.1, .1, .1) translate3d(0, 2000px, 0);\n transform: scale3d(.1, .1, .1) translate3d(0, 2000px, 0);\n -webkit-transform-origin: center bottom;\n transform-origin: center bottom;\n -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);\n animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);\n }\n}\n\n@keyframes zoomOutDown {\n 40% {\n opacity: 1;\n -webkit-transform: scale3d(.475, .475, .475) translate3d(0, -60px, 0);\n transform: scale3d(.475, .475, .475) translate3d(0, -60px, 0);\n -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);\n animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);\n }\n\n 100% {\n opacity: 0;\n -webkit-transform: scale3d(.1, .1, .1) translate3d(0, 2000px, 0);\n transform: scale3d(.1, .1, .1) translate3d(0, 2000px, 0);\n -webkit-transform-origin: center bottom;\n transform-origin: center bottom;\n -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);\n animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);\n }\n}\n\n.zoomOutDown {\n -webkit-animation-name: zoomOutDown;\n animation-name: zoomOutDown;\n}\n\n@-webkit-keyframes zoomOutLeft {\n 40% {\n opacity: 1;\n -webkit-transform: scale3d(.475, .475, .475) translate3d(42px, 0, 0);\n transform: scale3d(.475, .475, .475) translate3d(42px, 0, 0);\n }\n\n 100% {\n opacity: 0;\n -webkit-transform: scale(.1) translate3d(-2000px, 0, 0);\n transform: scale(.1) translate3d(-2000px, 0, 0);\n -webkit-transform-origin: left center;\n transform-origin: left center;\n }\n}\n\n@keyframes zoomOutLeft {\n 40% {\n opacity: 1;\n -webkit-transform: scale3d(.475, .475, .475) translate3d(42px, 0, 0);\n transform: scale3d(.475, .475, .475) translate3d(42px, 0, 0);\n }\n\n 100% {\n opacity: 0;\n -webkit-transform: scale(.1) translate3d(-2000px, 0, 0);\n transform: scale(.1) translate3d(-2000px, 0, 0);\n -webkit-transform-origin: left center;\n transform-origin: left center;\n }\n}\n\n.zoomOutLeft {\n -webkit-animation-name: zoomOutLeft;\n animation-name: zoomOutLeft;\n}\n\n@-webkit-keyframes zoomOutRight {\n 40% {\n opacity: 1;\n -webkit-transform: scale3d(.475, .475, .475) translate3d(-42px, 0, 0);\n transform: scale3d(.475, .475, .475) translate3d(-42px, 0, 0);\n }\n\n 100% {\n opacity: 0;\n -webkit-transform: scale(.1) translate3d(2000px, 0, 0);\n transform: scale(.1) translate3d(2000px, 0, 0);\n -webkit-transform-origin: right center;\n transform-origin: right center;\n }\n}\n\n@keyframes zoomOutRight {\n 40% {\n opacity: 1;\n -webkit-transform: scale3d(.475, .475, .475) translate3d(-42px, 0, 0);\n transform: scale3d(.475, .475, .475) translate3d(-42px, 0, 0);\n }\n\n 100% {\n opacity: 0;\n -webkit-transform: scale(.1) translate3d(2000px, 0, 0);\n transform: scale(.1) translate3d(2000px, 0, 0);\n -webkit-transform-origin: right center;\n transform-origin: right center;\n }\n}\n\n.zoomOutRight {\n -webkit-animation-name: zoomOutRight;\n animation-name: zoomOutRight;\n}\n\n@-webkit-keyframes zoomOutUp {\n 40% {\n opacity: 1;\n -webkit-transform: scale3d(.475, .475, .475) translate3d(0, 60px, 0);\n transform: scale3d(.475, .475, .475) translate3d(0, 60px, 0);\n -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);\n animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);\n }\n\n 100% {\n opacity: 0;\n -webkit-transform: scale3d(.1, .1, .1) translate3d(0, -2000px, 0);\n transform: scale3d(.1, .1, .1) translate3d(0, -2000px, 0);\n -webkit-transform-origin: center bottom;\n transform-origin: center bottom;\n -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);\n animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);\n }\n}\n\n@keyframes zoomOutUp {\n 40% {\n opacity: 1;\n -webkit-transform: scale3d(.475, .475, .475) translate3d(0, 60px, 0);\n transform: scale3d(.475, .475, .475) translate3d(0, 60px, 0);\n -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);\n animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);\n }\n\n 100% {\n opacity: 0;\n -webkit-transform: scale3d(.1, .1, .1) translate3d(0, -2000px, 0);\n transform: scale3d(.1, .1, .1) translate3d(0, -2000px, 0);\n -webkit-transform-origin: center bottom;\n transform-origin: center bottom;\n -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);\n animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);\n }\n}\n\n.zoomOutUp {\n -webkit-animation-name: zoomOutUp;\n animation-name: zoomOutUp;\n}\n\n@-webkit-keyframes slideInDown {\n 0% {\n -webkit-transform: translateY(-100%);\n transform: translateY(-100%);\n visibility: visible;\n }\n\n 100% {\n -webkit-transform: translateY(0);\n transform: translateY(0);\n }\n}\n\n@keyframes slideInDown {\n 0% {\n -webkit-transform: translateY(-100%);\n transform: translateY(-100%);\n visibility: visible;\n }\n\n 100% {\n -webkit-transform: translateY(0);\n transform: translateY(0);\n }\n}\n\n.slideInDown {\n -webkit-animation-name: slideInDown;\n animation-name: slideInDown;\n}\n\n@-webkit-keyframes slideInLeft {\n 0% {\n -webkit-transform: translateX(-100%);\n transform: translateX(-100%);\n visibility: visible;\n }\n\n 100% {\n -webkit-transform: translateX(0);\n transform: translateX(0);\n }\n}\n\n@keyframes slideInLeft {\n 0% {\n -webkit-transform: translateX(-100%);\n transform: translateX(-100%);\n visibility: visible;\n }\n\n 100% {\n -webkit-transform: translateX(0);\n transform: translateX(0);\n }\n}\n\n.slideInLeft {\n -webkit-animation-name: slideInLeft;\n animation-name: slideInLeft;\n}\n\n@-webkit-keyframes slideInRight {\n 0% {\n -webkit-transform: translateX(100%);\n transform: translateX(100%);\n visibility: visible;\n }\n\n 100% {\n -webkit-transform: translateX(0);\n transform: translateX(0);\n }\n}\n\n@keyframes slideInRight {\n 0% {\n -webkit-transform: translateX(100%);\n transform: translateX(100%);\n visibility: visible;\n }\n\n 100% {\n -webkit-transform: translateX(0);\n transform: translateX(0);\n }\n}\n\n.slideInRight {\n -webkit-animation-name: slideInRight;\n animation-name: slideInRight;\n}\n\n@-webkit-keyframes slideInUp {\n 0% {\n -webkit-transform: translateY(100%);\n transform: translateY(100%);\n visibility: visible;\n }\n\n 100% {\n -webkit-transform: translateY(0);\n transform: translateY(0);\n }\n}\n\n@keyframes slideInUp {\n 0% {\n -webkit-transform: translateY(100%);\n transform: translateY(100%);\n visibility: visible;\n }\n\n 100% {\n -webkit-transform: translateY(0);\n transform: translateY(0);\n }\n}\n\n.slideInUp {\n -webkit-animation-name: slideInUp;\n animation-name: slideInUp;\n}\n\n@-webkit-keyframes slideOutDown {\n 0% {\n -webkit-transform: translateY(0);\n transform: translateY(0);\n }\n\n 100% {\n visibility: hidden;\n -webkit-transform: translateY(100%);\n transform: translateY(100%);\n }\n}\n\n@keyframes slideOutDown {\n 0% {\n -webkit-transform: translateY(0);\n transform: translateY(0);\n }\n\n 100% {\n visibility: hidden;\n -webkit-transform: translateY(100%);\n transform: translateY(100%);\n }\n}\n\n.slideOutDown {\n -webkit-animation-name: slideOutDown;\n animation-name: slideOutDown;\n}\n\n@-webkit-keyframes slideOutLeft {\n 0% {\n -webkit-transform: translateX(0);\n transform: translateX(0);\n }\n\n 100% {\n visibility: hidden;\n -webkit-transform: translateX(-100%);\n transform: translateX(-100%);\n }\n}\n\n@keyframes slideOutLeft {\n 0% {\n -webkit-transform: translateX(0);\n transform: translateX(0);\n }\n\n 100% {\n visibility: hidden;\n -webkit-transform: translateX(-100%);\n transform: translateX(-100%);\n }\n}\n\n.slideOutLeft {\n -webkit-animation-name: slideOutLeft;\n animation-name: slideOutLeft;\n}\n\n@-webkit-keyframes slideOutRight {\n 0% {\n -webkit-transform: translateX(0);\n transform: translateX(0);\n }\n\n 100% {\n visibility: hidden;\n -webkit-transform: translateX(100%);\n transform: translateX(100%);\n }\n}\n\n@keyframes slideOutRight {\n 0% {\n -webkit-transform: translateX(0);\n transform: translateX(0);\n }\n\n 100% {\n visibility: hidden;\n -webkit-transform: translateX(100%);\n transform: translateX(100%);\n }\n}\n\n.slideOutRight {\n -webkit-animation-name: slideOutRight;\n animation-name: slideOutRight;\n}\n\n@-webkit-keyframes slideOutUp {\n 0% {\n -webkit-transform: translateY(0);\n transform: translateY(0);\n }\n\n 100% {\n visibility: hidden;\n -webkit-transform: translateY(-100%);\n transform: translateY(-100%);\n }\n}\n\n@keyframes slideOutUp {\n 0% {\n -webkit-transform: translateY(0);\n transform: translateY(0);\n }\n\n 100% {\n visibility: hidden;\n -webkit-transform: translateY(-100%);\n transform: translateY(-100%);\n }\n}\n\n.slideOutUp {\n -webkit-animation-name: slideOutUp;\n animation-name: slideOutUp;\n}\n",".btn {\n $btn-top-clr: #FAFAFA;\n $btn-bottom-clr: #EFF1F3;\n border:1px solid #E0E3E9;\n display:inline-block;\n border-radius: 2px;\n box-shadow: inset 0 1px 0 white, 0 1px 1px rgba(black, 0.1);\n @include linear-gradient($btn-top-clr, $btn-bottom-clr);\n font-size: em(12px);\n font-weight:600;\n color: $text-2-clr;\n text-decoration:none;\n padding: em(8px) em(15px);\n &:hover {\n @include linear-gradient(lighten($btn-top-clr,0.5%), lighten($btn-bottom-clr,1%));\n }\n &.disabled {\n cursor:default;\n opacity: 0.5;\n &:active {\n box-shadow: inset 0 1px 0 white, 0 1px 1px rgba(black, 0.1);\n }\n }\n &.danger {\n color: $red-clr;\n }\n &:focus {\n outline:0;\n }\n &:active {\n box-shadow: inset 0 0 2px rgba(black, 0.1);\n }\n}\n","form {\n margin:0;\n &.ng-submitted {\n .ng-invalid {\n border-color: $pink-clr !important;\n }\n }\n}\n\n.form-container {\n width:100%;\n}\n\n.form-row {\n @include row();\n margin-bottom:10px;\n @include user-select(none);\n}\n\n.form-col {\n @include span-columns(6);\n &.padded {\n &:first-child {\n padding: 0 20px 0 0;\n }\n &:last-child {\n padding: 0 0 0 20px;\n }\n }\n}\n\n.form-group {\n & > label {\n font-size:em(12px);\n color: $text-3-clr;\n display:inline-block;\n line-height:em(30px);\n\n }\n .form-error {\n font-size: em(12px);\n color: $red-clr;\n float: right;\n img {\n vertical-align:bottom;\n margin-right: 3px;\n }\n }\n &.optional > label:after {\n content: \" (optional)\";\n }\n &.error {\n input.form-control, textarea.form-control {\n\n border-color: $pink-clr;\n background: rgba($pink-clr,0.02);\n }\n }\n input.form-control, textarea.form-control {\n border-radius: 3px;\n border: 1px solid $border-clr;\n font-size:em(18px);\n &.ng-pristine {\n background: lighten($background-clr,1%);\n }\n @include transition(border-color 0.1s ease-in-out);\n &:focus {\n border-color: $blue-clr;\n box-shadow: 0 0 3px rgba($blue-clr, 0.5);\n outline:none;\n background: white;\n }\n &.extend {\n width:100%;\n }\n @include placeholder {\n color: rgba($text-3-clr,0.7);\n }\n }\n .form-btn {\n padding: em(12px) em(15px);\n }\n input.form-control {\n vertical-align:middle;\n padding: em(5px) em(10px);\n }\n\n textarea.form-control {\n min-height: 135px;\n font-size: em(18px);\n padding: em(8px) em(10px);\n }\n\n}\n\n\n.form-submit-message {\n display:inline-block;\n margin-left: em(5px);\n font-size: em(12px);\n &.error {\n color: $red-clr;\n }\n img {\n vertical-align:middle;\n margin-right: em(5px);\n }\n}\n","/// Designates the element as a row of columns in the grid layout. It clears the floats on the element and sets its display property. Rows can't be nested, but there can be more than one row element—with different display properties—per layout.\n///\n/// @param {String} $display (default)\n/// Sets the display property of the element and the display context that will be used by its children. Can be `block` or `table`.\n///\n/// @param {String} $direction ($default-layout-direction)\n/// Sets the layout direction. Can be `LTR` (left-to-right) or `RTL` (right-to-left).\n///\n/// @example scss - Usage\n/// .element {\n/// @include row();\n/// }\n///\n/// @example css - CSS Output\n/// .element {\n/// *zoom: 1;\n/// display: block;\n/// }\n///\n/// .element:before, .element:after {\n/// content: \" \";\n/// display: table;\n/// }\n///\n/// .element:after {\n/// clear: both;\n/// }\n\n@mixin row($display: default, $direction: $default-layout-direction) {\n @if $direction != $default-layout-direction {\n @include -neat-warn(\"The $direction argument will be deprecated in future versions in favor of the direction(){...} mixin.\");\n }\n\n $layout-direction: $direction !global;\n\n @if $display != default {\n @include -neat-warn(\"The $display argument will be deprecated in future versions in favor of the display(){...} mixin.\");\n }\n\n @if $display == table {\n display: table;\n @include fill-parent;\n table-layout: fixed;\n $container-display-table: true !global;\n }\n\n @else {\n @include clearfix;\n display: block;\n $container-display-table: false !global;\n }\n}\n\n","// Modern micro clearfix provides an easy way to contain floats without adding additional markup.\n//\n// Example usage:\n//\n// // Contain all floats within .wrapper\n// .wrapper {\n// @include clearfix;\n// .content,\n// .sidebar {\n// float : left;\n// }\n// }\n\n@mixin clearfix {\n &:after {\n content:\"\";\n display:table;\n clear:both;\n }\n}\n\n// Acknowledgements\n// Beat *that* clearfix: [Thierry Koblentz](http://www.css-101.org/articles/clearfix/latest-new-clearfix-so-far.php)\n","/// Specifies the number of columns an element should span. If the selector is nested the number of columns of its parent element should be passed as an argument as well.\n///\n/// @param {List} $span\n/// A list containing `$columns`, the unitless number of columns the element spans (required), and `$container-columns`, the number of columns the parent element spans (optional).\n///\n/// If only one value is passed, it is assumed that it's `$columns` and that that `$container-columns` is equal to `$grid-columns`, the total number of columns in the grid.\n///\n/// The values can be separated with any string such as `of`, `/`, etc.\n///\n/// @param {String} $display (block)\n/// Sets the display property of the element. By default it sets the display propert of the element to `block`.\n///\n/// If passed `block-collapse`, it also removes the margin gutter by adding it to the element width.\n///\n/// If passed `table`, it sets the display property to `table-cell` and calculates the width of the element without taking gutters into consideration. The result does not align with the block-based grid.\n///\n/// @example scss - Usage\n/// .element {\n/// @include span-columns(6);\n///\n/// .nested-element {\n/// @include span-columns(2 of 6);\n/// }\n/// }\n///\n/// @example css - CSS Output\n/// .element {\n/// display: block;\n/// float: left;\n/// margin-right: 2.35765%;\n/// width: 48.82117%;\n/// }\n///\n/// .element:last-child {\n/// margin-right: 0;\n/// }\n///\n/// .element .nested-element {\n/// display: block;\n/// float: left;\n/// margin-right: 4.82916%;\n/// width: 30.11389%;\n/// }\n///\n/// .element .nested-element:last-child {\n/// margin-right: 0;\n/// }\n\n@mixin span-columns($span: $columns of $container-columns, $display: block) {\n $columns: nth($span, 1);\n $container-columns: container-span($span);\n\n $parent-columns: get-parent-columns($container-columns) !global;\n\n $direction: get-direction($layout-direction, $default-layout-direction);\n $opposite-direction: get-opposite-direction($direction);\n\n $display-table: is-display-table($container-display-table, $display);\n\n @if $display-table {\n display: table-cell;\n width: percentage($columns / $container-columns);\n } @else {\n float: #{$opposite-direction};\n\n @if $display != no-display {\n display: block;\n }\n\n @if $display == collapse {\n @include -neat-warn(\"The 'collapse' argument will be deprecated. Use 'block-collapse' instead.\");\n }\n\n @if $display == collapse or $display == block-collapse {\n width: flex-grid($columns, $container-columns) + flex-gutter($container-columns);\n\n &:last-child {\n width: flex-grid($columns, $container-columns);\n }\n\n } @else {\n margin-#{$direction}: flex-gutter($container-columns);\n width: flex-grid($columns, $container-columns);\n\n &:last-child {\n margin-#{$direction}: 0;\n }\n }\n }\n}\n","@mixin placeholder {\n $placeholders: \":-webkit-input\" \":-moz\" \"-moz\" \"-ms-input\";\n @each $placeholder in $placeholders {\n &:#{$placeholder}-placeholder {\n @content;\n }\n }\n}\n","$box-v-pad: 20px;\n$box-h-pad: 25px;\n\n.box {\n background: white;\n border: 1px solid $border-clr;\n border-radius: 3px;\n margin: 0 auto 20px auto;\n max-width: 800px;\n padding: $box-v-pad $box-h-pad;\n &.box-x-scroll {\n overflow-x: scroll;\n }\n &.invisible {\n background: transparent;\n border:0;\n padding: 0;\n margin-bottom:40px;\n }\n &.highlight {\n border-color: $blue-clr;\n box-shadow: 0 0 3px rgba($blue-clr, 0.5);\n }\n &:last-child {\n margin-bottom: 40px;\n }\n}\n\n.box-title {\n font-size: 24px;\n font-weight: bold;\n color: $text-clr;\n margin-bottom:20px;\n}\n\n.box-description {\n font-size: 14px;\n color: $text-2-clr;\n padding-bottom: 20px;\n border-bottom: 1px solid $border-clr;\n margin-top: -20px;\n margin-bottom: 20px;\n a {\n color: $text-clr;\n text-decoration:none;\n &:hover {\n border: 1px solid $border-clr;\n }\n }\n}\n.box-section {\n padding-top: 20px;\n @include row;\n .section-details {\n @include span-columns(3);\n .section-title {\n font-size: em(14px);\n color: $text-2-clr;\n margin-bottom:20px;\n }\n }\n .section-main {\n @include span-columns(9);\n }\n}\n\n.box-message {\n text-align:center;\n padding:40px;\n max-width:450px;\n margin:0 auto;\n .main-image {\n margin-bottom: 20px;\n }\n .title {\n font-weight: bold;\n font-size: em(24px);\n color: $text-clr;\n margin-bottom: em(10px);\n }\n .content {\n font-size: em(14px);\n color: $text-2-clr;\n margin-bottom: 20px;\n }\n .mini-divider:after {\n content: \"\";\n display:inline-block;\n width:200px;\n height:1px;\n background: $border-clr;\n margin:20px auto;\n\n }\n}\n\n.box-side-sticky {\n padding: $box-v-pad $box-h-pad;\n box-sizing: content-box;\n width: 100%;\n margin-left: $box-h-pad * -1;\n\n}\n\n.box-bottom-sticky {\n padding: $box-v-pad $box-h-pad;\n box-sizing: content-box;\n width: 100%;\n margin-top:20px;\n border-bottom-left-radius: 3px;\n border-bottom-right-radius: 3px;\n border-top: 1px solid $border-clr;\n margin-bottom: $box-v-pad * -1;\n margin-left: $box-h-pad * -1;\n}\n\n.box-controls {\n text-align: right;\n box-shadow: inset 0 1px 0 white;\n background: lighten($background-clr, 1%);\n margin-top: $box-v-pad;\n padding: 15px $box-h-pad;\n}\n",".ng-submitted .ng-invalid > .datepicker {\n border-color: $pink-clr;\n}\n.datepicker {\n width:100%;\n border:1px solid rgba($border-clr, 0.5);\n border-radius: 3px;\n background:white;\n padding: em(10px);\n @include transition(border-color 0.1s ease-in-out);\n table {\n width:100%;\n font-size: em($em-base);\n }\n thead {\n\n }\n tbody {\n &:before {\n content: '';\n display:block;\n height: em(10px);\n }\n }\n .prev, .next {\n opacity: 0.5;\n color: $text-2-clr;\n cursor: pointer;\n border-radius:5px;\n position:relative;\n &:hover {\n opacity: 1;\n &:after {\n opacity: 1;\n background: rgba($border-clr, 0.3);\n }\n }\n &:after {\n content: \" \";\n cursor:pointer;\n opacity: 0;\n position:absolute;\n $size: em(28px);\n width:$size;\n height:$size;\n margin-left:$size * -0.5;\n margin-top:$size * -0.5;\n left:50%;\n top:50%;\n border-radius:3px;\n @include transition(background-color 0.1s ease-in-out);\n }\n }\n .datepicker-switch {\n padding: 10px;\n font-weight:600;\n font-size:em(18px);\n border-radius: 3px;\n cursor: pointer;\n @include transition(background-color 0.1s ease-in-out);\n &:hover {\n background: rgba($border-clr, 0.4);\n }\n }\n .dow {\n padding:10px;\n font-weight:normal;\n text-transform: uppercase;\n color: $pink-clr;\n font-size: em(14px);\n border-bottom: 2px solid rgba($border-clr, 0.3);\n }\n .dow, .day {\n padding:em(15px);\n }\n .day {\n text-align:center;\n font-weight:600;\n position:relative;\n font-size:em(14px);\n &.today {\n color:#818176;\n &:after {\n opacity:1;\n background: rgba(yellow, 0.1);\n }\n }\n &:hover {\n &:after {\n opacity:1;\n background: rgba($border-clr,0.4);\n }\n cursor: pointer;\n }\n &.new, &.old {\n font-weight:normal;\n color: $text-3-clr;\n }\n &.active {\n background:white;\n color: $green-clr;\n &:after {\n opacity:1;\n background: rgba($green-clr,0.1);\n }\n }\n &:active {\n &:after {\n opacity: 0.8;\n }\n }\n &:after {\n content: \" \";\n @include transition(all 0.1s ease-in-out);\n cursor:pointer;\n opacity: 0;\n position:absolute;\n $size: em(35px);\n width:$size;\n height:$size;\n margin-left:$size * -0.5;\n margin-top:$size * -0.5;\n left:50%;\n top:50%;\n border-radius: 3px;\n }\n }\n .month, .year {\n width: 33.3%;\n display:inline-block;\n text-align:center;\n font-size: em(14px);\n padding:em(20px);\n cursor:pointer;\n @include transition(background-color 0.1s ease-in-out);\n border-radius: 3px;\n text-transform: uppercase;\n &:hover {\n background: rgba($border-clr, 0.3);\n }\n }\n}\n\n.daticon-list {\n margin:0;\n margin-left:-10px;\n list-style:none;\n padding:5px;\n text-align:left;\n .placeholder {\n line-height: em(18px);\n font-size: em(12px);\n color: #ccc;\n }\n li {\n margin: 5px;\n display:inline-block;\n }\n}\n\n.daticon {\n box-shadow: 0 0 0 1px rgba($border-clr,0.5);\n border-radius: 3px;\n display:inline-block;\n padding:em(8px) em(16px);\n text-align:center;\n position:relative;\n cursor:default;\n background:white;\n .dow {\n font-size: em(6px);\n margin-top:em(-24px);\n background:white;\n color: $text-3-clr;\n margin-bottom: em(4px);\n font-weight:normal;\n text-transform: uppercase;\n }\n .day {\n font-size: em(20px);\n font-weight:normal;\n color: $pink-clr;\n line-height: em(16px);\n }\n .month {\n font-weight: 600;\n font-size: em(12px);\n text-transform: uppercase;\n }\n .delete {\n text-align:center;\n border:0;\n $size: 18px;\n width: em($size);\n height: em($size);\n position:absolute;\n top: $size * -0.4;\n right: $size * -0.4;\n border-radius:100%;\n display:inline-block;\n background: rgba($border-clr, 0.5) url(../images/close@2x.png) no-repeat center center;\n background-size: 7px 8px;\n cursor:pointer;\n opacity:0;\n &:hover {\n background-color: rgba($border-clr, 0.8)\n }\n }\n .count {\n text-align:center;\n border:0;\n $size: 18px;\n width: $size;\n height: $size;\n position:absolute;\n top: $size * -0.4;\n right: $size * -0.4;\n border-radius:100%;\n font-weight:bold;\n display:inline-block;\n background: darken($border-clr, 10%);\n color:white;\n font-size: 9px;\n line-height: $size;\n @include transition(background-color 0.2s ease-in-out);\n &.top {\n background: #FF5D5D;\n }\n\n }\n &:hover {\n .delete {\n opacity: 1;\n }\n }\n}\n",".rl-modal {\n background:white;\n position: fixed;\n top: 50%;\n left: 50%;\n width: 50%;\n max-width: 400px;\n display:inline-block;\n min-width: 200px;\n height: auto;\n z-index: 2000;\n overflow:hidden;\n border-radius: 5px;\n box-shadow: 0 0 0 1px $border-clr, 0 0 0 5px rgba($border-clr,0.8), 0 0 10px 5px rgba(black, 0.2);\n @include transform(translateX(-50%) translateY(-50%));\n .rl-modal-message {\n padding: 0 20px 20px 20px;\n font-size: em(12px);\n color: $text-2-clr;\n }\n .rl-modal-title {\n padding:20px 20px 0 20px;\n font-size: em(18px);\n font-weight: bold;\n }\n .rl-modal-actions {\n border-top:1px solid $border-clr;\n box-shadow: inset 0 1px 0 white;\n background: lighten($background-clr,1%);\n text-align:right;\n padding: em(10px) em(20px);\n }\n}\n\n.rl-modal-overlay {\n position:fixed;\n z-index: 1999;\n top:0;\n left:0;\n width:100%;\n height:100%;\n background:rgba(black,0.1);\n\n}\n","$actions-col-width : 160px;\n$date-col-width: 70px;\n$name-col-width: 235px;\n\n.poll {\n min-width: 100%;\n display:block;\n}\n\n.poll-header {\n display:table;\n min-width: 100%;\n border-bottom:1px solid $border-clr;\n box-shadow: 0 3px 0 rgba($border-clr, 0.3);\n .header {\n display:table-cell;\n vertical-align:bottom;\n padding-bottom:20px;\n &.date-header {\n text-align:center;\n min-width: $date-col-width;\n width: $date-col-width;\n }\n &.actions-header {\n min-width: $actions-col-width;\n }\n &.participants-header {\n font-weight: bold;\n min-width: $name-col-width;\n width: $name-col-width;\n padding-left: em(10px);\n }\n }\n}\n\n.poll-body {\n min-width:100%;\n\n .poll-entry.highlight {\n background: lighten($border-clr,10%);\n }\n .poll-entry {\n display:table;\n min-width: 100%;\n border-bottom: 1px solid rgba($border-clr,0.5);\n .hover {\n visibility:hidden;\n }\n &:hover {\n .hover {\n visibility: visible;\n }\n }\n .cell {\n padding: em(10px);\n display:table-cell;\n &.name-cell {\n min-width: $name-col-width;\n width: $name-col-width;\n font-size: em(14px);\n .avatar {\n display:inline-block;\n padding: 5px;\n margin-right: 5px;\n border-radius: 2px;\n background: #D0D5DF;\n @for $i from 0 to length($color-collection) {\n &.style-#{$i + 1} {\n background: nth($color-collection, $i+1);\n }\n }\n }\n .name {\n padding: 5px 3px;\n margin-left: 2px;\n border-radius: 2px;\n &:hover {\n background: $background-clr;\n cursor: pointer;\n }\n }\n .form-control {\n border:1px solid $border-clr;\n padding: em(5px);\n border-radius: 2px;\n color: $text-clr;\n &:focus {\n outline:0;\n border-color: $blue-clr;\n box-shadow: 0 0 3px rgba($blue-clr, 0.5);\n }\n @include placeholder {\n color: rgba($text-2-clr,0.7);\n }\n }\n }\n &.action-cell {\n min-width: $actions-col-width;\n }\n &.vote-cell {\n min-width: $date-col-width;\n width: $date-col-width;\n text-align:center;\n position: relative;\n .overlay {\n position: absolute;\n top:0;\n left: 0;\n width: 100%;\n height: 100%;\n z-index: 10;\n &:hover {\n background: rgba($border-clr, 0.2);\n cursor: pointer;\n }\n }\n }\n }\n &.ng-submitted {\n .ng-invalid {\n border-color: $pink-clr !important;\n }\n }\n }\n}\n",".page-placeholder {\n margin:0 auto;\n text-align:center;\n color:#B0B8C4;\n position:absolute;\n top:50%;\n left: 50%;\n @include transform(translateX(-50%) translateY(-50%));\n .image {\n margin-bottom:20px;\n }\n .title {\n font-size: em(36px);\n font-weight: bold;\n margin-bottom: 20px;\n }\n .content {\n font-size: em(14px);\n max-width: 320px;\n font-weight: normal;\n margin-bottom: 20px;\n }\n}\n",".event-description {\n font-size: em(16px);\n white-space: pre-wrap;\n padding-top:20px;\n padding-bottom: 20px;\n line-height:em(24px);\n color: $text-2-clr;\n background: $background-clr;\n border-top: 1px solid $border-clr;\n margin-top: 20px;\n margin-bottom:-20px;\n}\n\n.event-location {\n font-size: em(16px);\n a {\n color: $text-clr;\n text-decoration:none;\n &:hover {\n text-decoration:underline;\n }\n }\n img {\n vertical-align:middle;\n margin-right: 10px;\n }\n}\n\n\n.event-pair {\n margin-bottom: 20px;\n border-bottom: 1px solid $border-clr;\n padding-bottom: 20px;\n float: left;\n width: 100%;\n .icon {\n display:inline-block;\n width: 30px;\n float:left;\n position: relative;\n text-align:center;\n height: 35px;\n border-radius: 3px;\n margin-right: 10px;\n img {\n position: absolute;\n top:50%;\n left: 50%;\n @include transform(translateX(-50%) translateY(-50%));\n }\n }\n .content {\n float:left;\n display:inline-block;\n }\n .key {\n font-weight:bold;\n font-size: 11px;\n }\n .value {\n color: $text-2-clr;\n }\n}\n\n.event-header {\n width: 100%;\n margin-top: -30px;\n .avatar {\n display:inline-block;\n margin-right: 20px;\n text-align: center;\n border-radius: 1px;\n box-shadow: 0 0 0 5px white, 0 0 0 6px $border-clr, inset 0 0 0 1px $border-clr;\n padding: 20px;\n background:$background-clr;\n vertical-align: bottom;\n }\n .details {\n display:inline-block;\n .title {\n font-size: em(24px);\n font-weight: bold;\n }\n .subtitle {\n color: $text-2-clr;\n font-size: em(14px);\n a {\n color: $blue-clr;\n text-decoration: none;\n &:hover {\n text-decoration: underline;\n }\n }\n }\n }\n .actions {\n // visibility:hidden;\n float: right;\n margin-top: 30px;\n }\n &:hover {\n .actions {\n visibility:visible;\n }\n }\n}\n"],"sourceRoot":"/source/"} \ No newline at end of file +{"version":3,"sources":["style.scss","partials/_normalize.scss","neat/grid/_box-sizing.scss","bourbon/addons/_prefixer.scss","modules/_vars.scss","partials/_applayout.scss","partials/_navigation.scss","bourbon/css3/_transition.scss","bourbon/css3/_linear-gradient.scss","partials/_topbar.scss","partials/ui/_animations.scss","partials/ui/_buttons.scss","partials/ui/_form.scss","neat/grid/_row.scss","bourbon/addons/_clearfix.scss","neat/grid/_span-columns.scss","bourbon/css3/_placeholder.scss","partials/ui/_box.scss","partials/ui/_datepicker.scss","partials/ui/_modal.scss","partials/ui/_poll.scss","partials/ui/_tags.scss","partials/ui/_dropdown.scss","partials/ui/_comments.scss","partials/ui/_switch.scss","partials/ui/_notification.scss","partials/pages/_home.scss","partials/pages/_event.scss"],"names":[],"mappings":"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","file":"style.css","sourcesContent":["@import url(http://fonts.googleapis.com/css?family=Roboto:400,600,700);\n@import \"modules/vars\";\n@import \"modules/mixins\";\n@import \"partials/normalize\";\n@import \"bourbon/bourbon\";\n@import \"neat/neat\";\n\nbody {\n font-family: \"Roboto\", \"Helvetica Neue\", Arial, sans-serif;\n}\n\na {\n color: $blue-clr;\n}\n\n@import \"partials/applayout\";\n@import \"partials/navigation\";\n@import \"partials/topbar\";\n@import \"partials/ui/animations\";\n@import \"partials/ui/buttons\";\n@import \"partials/ui/form\";\n@import \"partials/ui/box\";\n@import \"partials/ui/datepicker\";\n@import \"partials/ui/modal\";\n@import \"partials/ui/poll\";\n@import \"partials/ui/tags\";\n@import \"partials/ui/dropdown\";\n@import \"partials/ui/comments\";\n@import \"partials/ui/switch\";\n@import \"partials/ui/notification\";\n\n@import \"partials/pages/home\";\n@import \"partials/pages/event\";\n","/*! normalize.css v3.0.2 | MIT License | git.io/normalize */\n\n/**\n * 1. Set default font family to sans-serif.\n * 2. Prevent iOS text size adjust after orientation change, without disabling\n * user zoom.\n */\n\nhtml {\n font-family: sans-serif; /* 1 */\n -ms-text-size-adjust: 100%; /* 2 */\n -webkit-text-size-adjust: 100%; /* 2 */\n}\n\n/**\n * Remove default margin.\n */\n\nbody {\n margin: 0;\n}\n\n/* HTML5 display definitions\n ========================================================================== */\n\n/**\n * Correct `block` display not defined for any HTML5 element in IE 8/9.\n * Correct `block` display not defined for `details` or `summary` in IE 10/11\n * and Firefox.\n * Correct `block` display not defined for `main` in IE 11.\n */\n\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmain,\nmenu,\nnav,\nsection,\nsummary {\n display: block;\n}\n\n/**\n * 1. Correct `inline-block` display not defined in IE 8/9.\n * 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera.\n */\n\naudio,\ncanvas,\nprogress,\nvideo {\n display: inline-block; /* 1 */\n vertical-align: baseline; /* 2 */\n}\n\n/**\n * Prevent modern browsers from displaying `audio` without controls.\n * Remove excess height in iOS 5 devices.\n */\n\naudio:not([controls]) {\n display: none;\n height: 0;\n}\n\n/**\n * Address `[hidden]` styling not present in IE 8/9/10.\n * Hide the `template` element in IE 8/9/11, Safari, and Firefox < 22.\n */\n\n[hidden],\ntemplate {\n display: none;\n}\n\n/* Links\n ========================================================================== */\n\n/**\n * Remove the gray background color from active links in IE 10.\n */\n\na {\n background-color: transparent;\n}\n\n/**\n * Improve readability when focused and also mouse hovered in all browsers.\n */\n\na:active,\na:hover {\n outline: 0;\n}\n\n/* Text-level semantics\n ========================================================================== */\n\n/**\n * Address styling not present in IE 8/9/10/11, Safari, and Chrome.\n */\n\nabbr[title] {\n border-bottom: 1px dotted;\n}\n\n/**\n * Address style set to `bolder` in Firefox 4+, Safari, and Chrome.\n */\n\nb,\nstrong {\n font-weight: bold;\n}\n\n/**\n * Address styling not present in Safari and Chrome.\n */\n\ndfn {\n font-style: italic;\n}\n\n/**\n * Address variable `h1` font-size and margin within `section` and `article`\n * contexts in Firefox 4+, Safari, and Chrome.\n */\n\nh1 {\n font-size: 2em;\n margin: 0.67em 0;\n}\n\n/**\n * Address styling not present in IE 8/9.\n */\n\nmark {\n background: #ff0;\n color: #000;\n}\n\n/**\n * Address inconsistent and variable font size in all browsers.\n */\n\nsmall {\n font-size: 80%;\n}\n\n/**\n * Prevent `sub` and `sup` affecting `line-height` in all browsers.\n */\n\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n}\n\nsup {\n top: -0.5em;\n}\n\nsub {\n bottom: -0.25em;\n}\n\n/* Embedded content\n ========================================================================== */\n\n/**\n * Remove border when inside `a` element in IE 8/9/10.\n */\n\nimg {\n border: 0;\n}\n\n/**\n * Correct overflow not hidden in IE 9/10/11.\n */\n\nsvg:not(:root) {\n overflow: hidden;\n}\n\n/* Grouping content\n ========================================================================== */\n\n/**\n * Address margin not present in IE 8/9 and Safari.\n */\n\nfigure {\n margin: 1em 40px;\n}\n\n/**\n * Address differences between Firefox and other browsers.\n */\n\nhr {\n -moz-box-sizing: content-box;\n box-sizing: content-box;\n height: 0;\n}\n\n/**\n * Contain overflow in all browsers.\n */\n\npre {\n overflow: auto;\n}\n\n/**\n * Address odd `em`-unit font size rendering in all browsers.\n */\n\ncode,\nkbd,\npre,\nsamp {\n font-family: monospace, monospace;\n font-size: 1em;\n}\n\n/* Forms\n ========================================================================== */\n\n/**\n * Known limitation: by default, Chrome and Safari on OS X allow very limited\n * styling of `select`, unless a `border` property is set.\n */\n\n/**\n * 1. Correct color not being inherited.\n * Known issue: affects color of disabled elements.\n * 2. Correct font properties not being inherited.\n * 3. Address margins set differently in Firefox 4+, Safari, and Chrome.\n */\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n color: inherit; /* 1 */\n font: inherit; /* 2 */\n margin: 0; /* 3 */\n}\n\n/**\n * Address `overflow` set to `hidden` in IE 8/9/10/11.\n */\n\nbutton {\n overflow: visible;\n}\n\n/**\n * Address inconsistent `text-transform` inheritance for `button` and `select`.\n * All other form control elements do not inherit `text-transform` values.\n * Correct `button` style inheritance in Firefox, IE 8/9/10/11, and Opera.\n * Correct `select` style inheritance in Firefox.\n */\n\nbutton,\nselect {\n text-transform: none;\n}\n\n/**\n * 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio`\n * and `video` controls.\n * 2. Correct inability to style clickable `input` types in iOS.\n * 3. Improve usability and consistency of cursor style between image-type\n * `input` and others.\n */\n\nbutton,\nhtml input[type=\"button\"], /* 1 */\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n -webkit-appearance: button; /* 2 */\n cursor: pointer; /* 3 */\n}\n\n/**\n * Re-set default cursor for disabled elements.\n */\n\nbutton[disabled],\nhtml input[disabled] {\n cursor: default;\n}\n\n/**\n * Remove inner padding and border in Firefox 4+.\n */\n\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n border: 0;\n padding: 0;\n}\n\n/**\n * Address Firefox 4+ setting `line-height` on `input` using `!important` in\n * the UA stylesheet.\n */\n\ninput {\n line-height: normal;\n}\n\n/**\n * It's recommended that you don't attempt to style these elements.\n * Firefox's implementation doesn't respect box-sizing, padding, or width.\n *\n * 1. Address box sizing set to `content-box` in IE 8/9/10.\n * 2. Remove excess padding in IE 8/9/10.\n */\n\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n box-sizing: border-box; /* 1 */\n padding: 0; /* 2 */\n}\n\n/**\n * Fix the cursor style for Chrome's increment/decrement buttons. For certain\n * `font-size` values of the `input`, it causes the cursor style of the\n * decrement button to change from `default` to `text`.\n */\n\ninput[type=\"number\"]::-webkit-inner-spin-button,\ninput[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n/**\n * 1. Address `appearance` set to `searchfield` in Safari and Chrome.\n * 2. Address `box-sizing` set to `border-box` in Safari and Chrome\n * (include `-moz` to future-proof).\n */\n\ninput[type=\"search\"] {\n -webkit-appearance: textfield; /* 1 */\n -moz-box-sizing: content-box;\n -webkit-box-sizing: content-box; /* 2 */\n box-sizing: content-box;\n}\n\n/**\n * Remove inner padding and search cancel button in Safari and Chrome on OS X.\n * Safari (but not Chrome) clips the cancel button when the search input has\n * padding (and `textfield` appearance).\n */\n\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n/**\n * Define consistent border, margin, and padding.\n */\n\nfieldset {\n border: 1px solid #c0c0c0;\n margin: 0 2px;\n padding: 0.35em 0.625em 0.75em;\n}\n\n/**\n * 1. Correct `color` not being inherited in IE 8/9/10/11.\n * 2. Remove padding so people aren't caught out if they zero out fieldsets.\n */\n\nlegend {\n border: 0; /* 1 */\n padding: 0; /* 2 */\n}\n\n/**\n * Remove default vertical scrollbar in IE 8/9/10/11.\n */\n\ntextarea {\n overflow: auto;\n}\n\n/**\n * Don't inherit the `font-weight` (applied by a rule above).\n * NOTE: the default cannot safely be changed in Chrome and Safari on OS X.\n */\n\noptgroup {\n font-weight: bold;\n}\n\n/* Tables\n ========================================================================== */\n\n/**\n * Remove most spacing between table cells.\n */\n\ntable {\n border-collapse: collapse;\n border-spacing: 0;\n}\n\ntd,\nth {\n padding: 0;\n}\n","@if $border-box-sizing == true {\n html { // http://bit.ly/1qk2tVR\n @include box-sizing(border-box);\n }\n\n * {\n &, &:before, &:after {\n @include box-sizing(inherit);\n }\n }\n}\n","//************************************************************************//\n// Example: @include prefixer(border-radius, $radii, webkit ms spec);\n//************************************************************************//\n// Variables located in /settings/_prefixer.scss\n\n@mixin prefixer ($property, $value, $prefixes) {\n @each $prefix in $prefixes {\n @if $prefix == webkit {\n @if $prefix-for-webkit {\n -webkit-#{$property}: $value;\n }\n }\n @else if $prefix == moz {\n @if $prefix-for-mozilla {\n -moz-#{$property}: $value;\n }\n }\n @else if $prefix == ms {\n @if $prefix-for-microsoft {\n -ms-#{$property}: $value;\n }\n }\n @else if $prefix == o {\n @if $prefix-for-opera {\n -o-#{$property}: $value;\n }\n }\n @else if $prefix == spec {\n @if $prefix-for-spec {\n #{$property}: $value;\n }\n }\n @else {\n @warn \"Unrecognized prefix: #{$prefix}\";\n }\n }\n}\n\n@mixin disable-prefix-for-all() {\n $prefix-for-webkit: false !global;\n $prefix-for-mozilla: false !global;\n $prefix-for-microsoft: false !global;\n $prefix-for-opera: false !global;\n $prefix-for-spec: false !global;\n}\n","$dark-blue-clr: #2E3A54;\n$green-clr: #6EBC48;\n$pink-clr: #E55A84;\n$red-clr: #E06488;\n$blue-clr: #5AC4E5;\n$light-blue-clr: #F5F6F8;\n$orangered-clr: #FF5D5D;\n\n$text-clr: #3D4043;\n$text-2-clr: #828B9A;\n$text-3-clr: #AEB4BE;\n$border-clr: #D9DDE3;\n$navigation-bg-clr: $dark-blue-clr;\n$background-clr: $light-blue-clr;\n\n$color-collection: (#8A75AE, #80A1DA, #B3DD8B, #7EE4E4, #FCD285, #F7967F, #E8669D, #F7B6E7, #F99D7B, #88D0CB);\n","$navigation-width: 100%;\n$top-bar-height: 50px;\n$min-width: 820px;\n\n.outer-container {\n width:100%;\n height:100%;\n}\nbody {\n background: $background-clr;\n color: $text-clr;\n min-width: $min-width;\n}\n.main-navigation {\n width: $navigation-width;\n min-width:$min-width;\n color: white;\n .wrapper {\n width: $navigation-width;\n padding: 0 40px;\n }\n}\n\n.main-content {\n background: $background-clr;\n min-height:100%;\n .main-view {\n position:relative;\n padding: 160px 40px 40px 40px;\n width:100%;\n min-height: 600px;\n }\n}\n\n.top-bar {\n width:100%;\n box-shadow: 0 1px 2px rgba(black, 0.1);\n height: $top-bar-height;\n line-height: $top-bar-height;\n}\n","$top-space: 15px;\n\n.main-navigation {\n position:fixed;\n width:100%;\n z-index: 1000;\n .wrapper {\n min-width:600px;\n background: $navigation-bg-clr;\n height: em(60px);\n }\n .logo {\n display:inline-block;\n vertical-align:middle;\n margin-top:$top-space;\n\n }\n .navigation {\n display:inline-block;\n vertical-align:middle;\n margin-left: 60px;\n margin-top:$top-space;\n .links {\n padding:0 ;\n margin:0;\n list-style: none;\n display:inline-block;\n li {\n display:inline-block;\n margin-right:em(20px);\n }\n a {\n text-decoration: none;\n color: #616F8D;\n font-weight: bold;\n line-height: em(24px);\n font-size: em(15px);\n opacity: 0.7;\n &:hover {\n opacity: 1;\n color:white;\n .icon {\n background-position: center bottom;\n }\n }\n &.active {\n opacity:1;\n color: white;\n cursor: default;\n .icon {\n background-position: center bottom;\n }\n }\n .text {\n vertical-align:middle;\n }\n .icon {\n display:inline-block;\n vertical-align:middle;\n margin-right: 5px;\n width:16px;\n height:16px;\n background-size: 16px 32px;\n }\n\n }\n }\n }\n .create-new {\n display:inline-block;\n float:right;\n padding: 13px;\n // border-bottom:1px solid lighten($navigation-bg-clr, 5%);\n a {\n display:block;\n @include transition(background-color 0.1s ease-in-out);\n color:tint($green-clr,90%);\n text-align:center;\n border-radius: 2px;\n @include linear-gradient(lighten($green-clr,8%), lighten($green-clr,2%));\n text-decoration:none;\n font-size:12px;\n font-weight: bold;\n // text-shadow: 0 1px 1px darken($green-clr, 10%);\n padding: 8px 15px 10px 12px;\n &:hover {\n\n }\n &:active {\n box-shadow: inset 0 2px 5px rgba(black,0.1), 0 0 0 1px darken($navigation-bg-clr, 8%);\n }\n img {\n vertical-align:middle;\n margin-right: 5px;\n margin-top: -2px;\n }\n span {\n }\n }\n }\n}\n","// Shorthand mixin. Supports multiple parentheses-deliminated values for each variable.\n// Example: @include transition (all 2s ease-in-out);\n// @include transition (opacity 1s ease-in 2s, width 2s ease-out);\n// @include transition-property (transform, opacity);\n\n@mixin transition ($properties...) {\n // Fix for vendor-prefix transform property\n $needs-prefixes: false;\n $webkit: ();\n $moz: ();\n $spec: ();\n\n // Create lists for vendor-prefixed transform\n @each $list in $properties {\n @if nth($list, 1) == \"transform\" {\n $needs-prefixes: true;\n $list1: -webkit-transform;\n $list2: -moz-transform;\n $list3: ();\n\n @each $var in $list {\n $list3: join($list3, $var);\n\n @if $var != \"transform\" {\n $list1: join($list1, $var);\n $list2: join($list2, $var);\n }\n }\n\n $webkit: append($webkit, $list1);\n $moz: append($moz, $list2);\n $spec: append($spec, $list3);\n }\n\n // Create lists for non-prefixed transition properties\n @else {\n $webkit: append($webkit, $list, comma);\n $moz: append($moz, $list, comma);\n $spec: append($spec, $list, comma);\n }\n }\n\n @if $needs-prefixes {\n -webkit-transition: $webkit;\n -moz-transition: $moz;\n transition: $spec;\n }\n @else {\n @if length($properties) >= 1 {\n @include prefixer(transition, $properties, webkit moz spec);\n }\n\n @else {\n $properties: all 0.15s ease-out 0s;\n @include prefixer(transition, $properties, webkit moz spec);\n }\n }\n}\n\n@mixin transition-property ($properties...) {\n -webkit-transition-property: transition-property-names($properties, 'webkit');\n -moz-transition-property: transition-property-names($properties, 'moz');\n transition-property: transition-property-names($properties, false);\n}\n\n@mixin transition-duration ($times...) {\n @include prefixer(transition-duration, $times, webkit moz spec);\n}\n\n@mixin transition-timing-function ($motions...) {\n// ease | linear | ease-in | ease-out | ease-in-out | cubic-bezier()\n @include prefixer(transition-timing-function, $motions, webkit moz spec);\n}\n\n@mixin transition-delay ($times...) {\n @include prefixer(transition-delay, $times, webkit moz spec);\n}\n","@mixin linear-gradient($pos, $G1, $G2: null,\n $G3: null, $G4: null,\n $G5: null, $G6: null,\n $G7: null, $G8: null,\n $G9: null, $G10: null,\n $fallback: null) {\n // Detect what type of value exists in $pos\n $pos-type: type-of(nth($pos, 1));\n $pos-spec: null;\n $pos-degree: null;\n\n // If $pos is missing from mixin, reassign vars and add default position\n @if ($pos-type == color) or (nth($pos, 1) == \"transparent\") {\n $G10: $G9; $G9: $G8; $G8: $G7; $G7: $G6; $G6: $G5;\n $G5: $G4; $G4: $G3; $G3: $G2; $G2: $G1; $G1: $pos;\n $pos: null;\n }\n\n @if $pos {\n $positions: _linear-positions-parser($pos);\n $pos-degree: nth($positions, 1);\n $pos-spec: nth($positions, 2);\n }\n\n $full: $G1, $G2, $G3, $G4, $G5, $G6, $G7, $G8, $G9, $G10;\n\n // Set $G1 as the default fallback color\n $fallback-color: nth($G1, 1);\n\n // If $fallback is a color use that color as the fallback color\n @if (type-of($fallback) == color) or ($fallback == \"transparent\") {\n $fallback-color: $fallback;\n }\n\n background-color: $fallback-color;\n background-image: -webkit-linear-gradient($pos-degree $full); // Safari 5.1+, Chrome\n background-image: unquote(\"linear-gradient(#{$pos-spec}#{$full})\");\n}\n",".top-bar {\n float: left;\n width: 100%;\n background:rgba(white,0.9);\n .primary {\n list-style:none;\n margin:0;\n padding-left:40px;\n margin-top:-4px;\n .item {\n img {\n display:inline-block;\n vertical-align:middle;\n }\n .hoverable {\n padding: 8px 12px;\n height: 100%;\n text-decoration:none;\n color: $text-clr;\n font-size: em(12px);\n border: 1px solid transparent;\n border-radius: 3px;\n vertical-align:bottom;\n border-color: $border-clr;\n span {\n vertical-align:middle;\n }\n &:hover {\n border-color: darken($border-clr,10%);\n }\n }\n &.dropdown.open .dropdown-toggle {\n border-bottom-left-radius: 0;\n border-bottom-right-radius: 0;\n border-color: $border-clr;\n border-bottom-color: white;\n position: relative;\n z-index:1001;\n }\n .dropdown-menu {\n background: white;\n color: $text-clr;\n font-size: em(16px);\n line-height: 1.5em;\n border: 1px solid $border-clr;\n border-radius: 3px;\n padding: 20px;\n margin-top:-9px;\n border-top-left-radius:0;\n box-shadow: 0 2px 3px $border-clr;\n .dropdown-title {\n font-weight:bold;\n font-size: em(15px);\n }\n .dropdown-content {\n font-size: em(14px);\n line-height: 1.5em;\n color: $text-2-clr;\n }\n }\n }\n\n }\n}\n","@charset \"UTF-8\";\n/*!\nAnimate.css - http://daneden.me/animate\nLicensed under the MIT license - http://opensource.org/licenses/MIT\n\nCopyright (c) 2014 Daniel Eden\n*/\n\n.animated {\n -webkit-animation-duration: 0.3s;\n animation-duration: 0.3s;\n -webkit-animation-fill-mode: both;\n animation-fill-mode: both;\n}\n\n.animated.infinite {\n -webkit-animation-iteration-count: infinite;\n animation-iteration-count: infinite;\n}\n\n.animated.hinge {\n -webkit-animation-duration: 2s;\n animation-duration: 2s;\n}\n\n@-webkit-keyframes bounce {\n 0%, 20%, 53%, 80%, 100% {\n -webkit-transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);\n transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);\n -webkit-transform: translate3d(0,0,0);\n transform: translate3d(0,0,0);\n }\n\n 40%, 43% {\n -webkit-transition-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060);\n transition-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060);\n -webkit-transform: translate3d(0, -30px, 0);\n transform: translate3d(0, -30px, 0);\n }\n\n 70% {\n -webkit-transition-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060);\n transition-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060);\n -webkit-transform: translate3d(0, -15px, 0);\n transform: translate3d(0, -15px, 0);\n }\n\n 90% {\n -webkit-transform: translate3d(0,-4px,0);\n transform: translate3d(0,-4px,0);\n }\n}\n\n@keyframes bounce {\n 0%, 20%, 53%, 80%, 100% {\n -webkit-transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);\n transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);\n -webkit-transform: translate3d(0,0,0);\n transform: translate3d(0,0,0);\n }\n\n 40%, 43% {\n -webkit-transition-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060);\n transition-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060);\n -webkit-transform: translate3d(0, -30px, 0);\n transform: translate3d(0, -30px, 0);\n }\n\n 70% {\n -webkit-transition-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060);\n transition-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060);\n -webkit-transform: translate3d(0, -15px, 0);\n transform: translate3d(0, -15px, 0);\n }\n\n 90% {\n -webkit-transform: translate3d(0,-4px,0);\n transform: translate3d(0,-4px,0);\n }\n}\n\n.bounce {\n -webkit-animation-name: bounce;\n animation-name: bounce;\n -webkit-transform-origin: center bottom;\n -ms-transform-origin: center bottom;\n transform-origin: center bottom;\n}\n\n@-webkit-keyframes flash {\n 0%, 50%, 100% {\n opacity: 1;\n }\n\n 25%, 75% {\n opacity: 0;\n }\n}\n\n@keyframes flash {\n 0%, 50%, 100% {\n opacity: 1;\n }\n\n 25%, 75% {\n opacity: 0;\n }\n}\n\n.flash {\n -webkit-animation-name: flash;\n animation-name: flash;\n}\n\n/* originally authored by Nick Pettit - https://github.com/nickpettit/glide */\n\n@-webkit-keyframes pulse {\n 0% {\n -webkit-transform: scale3d(1, 1, 1);\n transform: scale3d(1, 1, 1);\n }\n\n 50% {\n -webkit-transform: scale3d(1.05, 1.05, 1.05);\n transform: scale3d(1.05, 1.05, 1.05);\n }\n\n 100% {\n -webkit-transform: scale3d(1, 1, 1);\n transform: scale3d(1, 1, 1);\n }\n}\n\n@keyframes pulse {\n 0% {\n -webkit-transform: scale3d(1, 1, 1);\n transform: scale3d(1, 1, 1);\n }\n\n 50% {\n -webkit-transform: scale3d(1.05, 1.05, 1.05);\n transform: scale3d(1.05, 1.05, 1.05);\n }\n\n 100% {\n -webkit-transform: scale3d(1, 1, 1);\n transform: scale3d(1, 1, 1);\n }\n}\n\n.pulse {\n -webkit-animation-name: pulse;\n animation-name: pulse;\n}\n\n@-webkit-keyframes rubberBand {\n 0% {\n -webkit-transform: scale3d(1, 1, 1);\n transform: scale3d(1, 1, 1);\n }\n\n 30% {\n -webkit-transform: scale3d(1.25, 0.75, 1);\n transform: scale3d(1.25, 0.75, 1);\n }\n\n 40% {\n -webkit-transform: scale3d(0.75, 1.25, 1);\n transform: scale3d(0.75, 1.25, 1);\n }\n\n 50% {\n -webkit-transform: scale3d(1.15, 0.85, 1);\n transform: scale3d(1.15, 0.85, 1);\n }\n\n 65% {\n -webkit-transform: scale3d(.95, 1.05, 1);\n transform: scale3d(.95, 1.05, 1);\n }\n\n 75% {\n -webkit-transform: scale3d(1.05, .95, 1);\n transform: scale3d(1.05, .95, 1);\n }\n\n 100% {\n -webkit-transform: scale3d(1, 1, 1);\n transform: scale3d(1, 1, 1);\n }\n}\n\n@keyframes rubberBand {\n 0% {\n -webkit-transform: scale3d(1, 1, 1);\n transform: scale3d(1, 1, 1);\n }\n\n 30% {\n -webkit-transform: scale3d(1.25, 0.75, 1);\n transform: scale3d(1.25, 0.75, 1);\n }\n\n 40% {\n -webkit-transform: scale3d(0.75, 1.25, 1);\n transform: scale3d(0.75, 1.25, 1);\n }\n\n 50% {\n -webkit-transform: scale3d(1.15, 0.85, 1);\n transform: scale3d(1.15, 0.85, 1);\n }\n\n 65% {\n -webkit-transform: scale3d(.95, 1.05, 1);\n transform: scale3d(.95, 1.05, 1);\n }\n\n 75% {\n -webkit-transform: scale3d(1.05, .95, 1);\n transform: scale3d(1.05, .95, 1);\n }\n\n 100% {\n -webkit-transform: scale3d(1, 1, 1);\n transform: scale3d(1, 1, 1);\n }\n}\n\n.rubberBand {\n -webkit-animation-name: rubberBand;\n animation-name: rubberBand;\n}\n\n@-webkit-keyframes shake {\n 0%, 100% {\n -webkit-transform: translate3d(0, 0, 0);\n transform: translate3d(0, 0, 0);\n }\n\n 10%, 30%, 50%, 70%, 90% {\n -webkit-transform: translate3d(-10px, 0, 0);\n transform: translate3d(-10px, 0, 0);\n }\n\n 20%, 40%, 60%, 80% {\n -webkit-transform: translate3d(10px, 0, 0);\n transform: translate3d(10px, 0, 0);\n }\n}\n\n@keyframes shake {\n 0%, 100% {\n -webkit-transform: translate3d(0, 0, 0);\n transform: translate3d(0, 0, 0);\n }\n\n 10%, 30%, 50%, 70%, 90% {\n -webkit-transform: translate3d(-10px, 0, 0);\n transform: translate3d(-10px, 0, 0);\n }\n\n 20%, 40%, 60%, 80% {\n -webkit-transform: translate3d(10px, 0, 0);\n transform: translate3d(10px, 0, 0);\n }\n}\n\n.shake {\n -webkit-animation-name: shake;\n animation-name: shake;\n}\n\n@-webkit-keyframes swing {\n 20% {\n -webkit-transform: rotate3d(0, 0, 1, 15deg);\n transform: rotate3d(0, 0, 1, 15deg);\n }\n\n 40% {\n -webkit-transform: rotate3d(0, 0, 1, -10deg);\n transform: rotate3d(0, 0, 1, -10deg);\n }\n\n 60% {\n -webkit-transform: rotate3d(0, 0, 1, 5deg);\n transform: rotate3d(0, 0, 1, 5deg);\n }\n\n 80% {\n -webkit-transform: rotate3d(0, 0, 1, -5deg);\n transform: rotate3d(0, 0, 1, -5deg);\n }\n\n 100% {\n -webkit-transform: rotate3d(0, 0, 1, 0deg);\n transform: rotate3d(0, 0, 1, 0deg);\n }\n}\n\n@keyframes swing {\n 20% {\n -webkit-transform: rotate3d(0, 0, 1, 15deg);\n transform: rotate3d(0, 0, 1, 15deg);\n }\n\n 40% {\n -webkit-transform: rotate3d(0, 0, 1, -10deg);\n transform: rotate3d(0, 0, 1, -10deg);\n }\n\n 60% {\n -webkit-transform: rotate3d(0, 0, 1, 5deg);\n transform: rotate3d(0, 0, 1, 5deg);\n }\n\n 80% {\n -webkit-transform: rotate3d(0, 0, 1, -5deg);\n transform: rotate3d(0, 0, 1, -5deg);\n }\n\n 100% {\n -webkit-transform: rotate3d(0, 0, 1, 0deg);\n transform: rotate3d(0, 0, 1, 0deg);\n }\n}\n\n.swing {\n -webkit-transform-origin: top center;\n -ms-transform-origin: top center;\n transform-origin: top center;\n -webkit-animation-name: swing;\n animation-name: swing;\n}\n\n@-webkit-keyframes tada {\n 0% {\n -webkit-transform: scale3d(1, 1, 1);\n transform: scale3d(1, 1, 1);\n }\n\n 10%, 20% {\n -webkit-transform: scale3d(.9, .9, .9) rotate3d(0, 0, 1, -3deg);\n transform: scale3d(.9, .9, .9) rotate3d(0, 0, 1, -3deg);\n }\n\n 30%, 50%, 70%, 90% {\n -webkit-transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg);\n transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg);\n }\n\n 40%, 60%, 80% {\n -webkit-transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg);\n transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg);\n }\n\n 100% {\n -webkit-transform: scale3d(1, 1, 1);\n transform: scale3d(1, 1, 1);\n }\n}\n\n@keyframes tada {\n 0% {\n -webkit-transform: scale3d(1, 1, 1);\n transform: scale3d(1, 1, 1);\n }\n\n 10%, 20% {\n -webkit-transform: scale3d(.9, .9, .9) rotate3d(0, 0, 1, -3deg);\n transform: scale3d(.9, .9, .9) rotate3d(0, 0, 1, -3deg);\n }\n\n 30%, 50%, 70%, 90% {\n -webkit-transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg);\n transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg);\n }\n\n 40%, 60%, 80% {\n -webkit-transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg);\n transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg);\n }\n\n 100% {\n -webkit-transform: scale3d(1, 1, 1);\n transform: scale3d(1, 1, 1);\n }\n}\n\n.tada {\n -webkit-animation-name: tada;\n animation-name: tada;\n}\n\n/* originally authored by Nick Pettit - https://github.com/nickpettit/glide */\n\n@-webkit-keyframes wobble {\n 0% {\n -webkit-transform: none;\n transform: none;\n }\n\n 15% {\n -webkit-transform: translate3d(-25%, 0, 0) rotate3d(0, 0, 1, -5deg);\n transform: translate3d(-25%, 0, 0) rotate3d(0, 0, 1, -5deg);\n }\n\n 30% {\n -webkit-transform: translate3d(20%, 0, 0) rotate3d(0, 0, 1, 3deg);\n transform: translate3d(20%, 0, 0) rotate3d(0, 0, 1, 3deg);\n }\n\n 45% {\n -webkit-transform: translate3d(-15%, 0, 0) rotate3d(0, 0, 1, -3deg);\n transform: translate3d(-15%, 0, 0) rotate3d(0, 0, 1, -3deg);\n }\n\n 60% {\n -webkit-transform: translate3d(10%, 0, 0) rotate3d(0, 0, 1, 2deg);\n transform: translate3d(10%, 0, 0) rotate3d(0, 0, 1, 2deg);\n }\n\n 75% {\n -webkit-transform: translate3d(-5%, 0, 0) rotate3d(0, 0, 1, -1deg);\n transform: translate3d(-5%, 0, 0) rotate3d(0, 0, 1, -1deg);\n }\n\n 100% {\n -webkit-transform: none;\n transform: none;\n }\n}\n\n@keyframes wobble {\n 0% {\n -webkit-transform: none;\n transform: none;\n }\n\n 15% {\n -webkit-transform: translate3d(-25%, 0, 0) rotate3d(0, 0, 1, -5deg);\n transform: translate3d(-25%, 0, 0) rotate3d(0, 0, 1, -5deg);\n }\n\n 30% {\n -webkit-transform: translate3d(20%, 0, 0) rotate3d(0, 0, 1, 3deg);\n transform: translate3d(20%, 0, 0) rotate3d(0, 0, 1, 3deg);\n }\n\n 45% {\n -webkit-transform: translate3d(-15%, 0, 0) rotate3d(0, 0, 1, -3deg);\n transform: translate3d(-15%, 0, 0) rotate3d(0, 0, 1, -3deg);\n }\n\n 60% {\n -webkit-transform: translate3d(10%, 0, 0) rotate3d(0, 0, 1, 2deg);\n transform: translate3d(10%, 0, 0) rotate3d(0, 0, 1, 2deg);\n }\n\n 75% {\n -webkit-transform: translate3d(-5%, 0, 0) rotate3d(0, 0, 1, -1deg);\n transform: translate3d(-5%, 0, 0) rotate3d(0, 0, 1, -1deg);\n }\n\n 100% {\n -webkit-transform: none;\n transform: none;\n }\n}\n\n.wobble {\n -webkit-animation-name: wobble;\n animation-name: wobble;\n}\n\n@-webkit-keyframes bounceIn {\n 0%, 20%, 40%, 60%, 80%, 100% {\n -webkit-transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);\n transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);\n }\n\n 0% {\n opacity: 0;\n -webkit-transform: scale3d(.3, .3, .3);\n transform: scale3d(.3, .3, .3);\n }\n\n 20% {\n -webkit-transform: scale3d(1.1, 1.1, 1.1);\n transform: scale3d(1.1, 1.1, 1.1);\n }\n\n 40% {\n -webkit-transform: scale3d(.9, .9, .9);\n transform: scale3d(.9, .9, .9);\n }\n\n 60% {\n opacity: 1;\n -webkit-transform: scale3d(1.03, 1.03, 1.03);\n transform: scale3d(1.03, 1.03, 1.03);\n }\n\n 80% {\n -webkit-transform: scale3d(.97, .97, .97);\n transform: scale3d(.97, .97, .97);\n }\n\n 100% {\n opacity: 1;\n -webkit-transform: scale3d(1, 1, 1);\n transform: scale3d(1, 1, 1);\n }\n}\n\n@keyframes bounceIn {\n 0%, 20%, 40%, 60%, 80%, 100% {\n -webkit-transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);\n transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);\n }\n\n 0% {\n opacity: 0;\n -webkit-transform: scale3d(.3, .3, .3);\n transform: scale3d(.3, .3, .3);\n }\n\n 20% {\n -webkit-transform: scale3d(1.1, 1.1, 1.1);\n transform: scale3d(1.1, 1.1, 1.1);\n }\n\n 40% {\n -webkit-transform: scale3d(.9, .9, .9);\n transform: scale3d(.9, .9, .9);\n }\n\n 60% {\n opacity: 1;\n -webkit-transform: scale3d(1.03, 1.03, 1.03);\n transform: scale3d(1.03, 1.03, 1.03);\n }\n\n 80% {\n -webkit-transform: scale3d(.97, .97, .97);\n transform: scale3d(.97, .97, .97);\n }\n\n 100% {\n opacity: 1;\n -webkit-transform: scale3d(1, 1, 1);\n transform: scale3d(1, 1, 1);\n }\n}\n\n.bounceIn {\n -webkit-animation-name: bounceIn;\n animation-name: bounceIn;\n -webkit-animation-duration: .75s;\n animation-duration: .75s;\n}\n\n@-webkit-keyframes bounceInDown {\n 0%, 60%, 75%, 90%, 100% {\n -webkit-transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);\n transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);\n }\n\n 0% {\n opacity: 0;\n -webkit-transform: translate3d(0, -3000px, 0);\n transform: translate3d(0, -3000px, 0);\n }\n\n 60% {\n opacity: 1;\n -webkit-transform: translate3d(0, 25px, 0);\n transform: translate3d(0, 25px, 0);\n }\n\n 75% {\n -webkit-transform: translate3d(0, -10px, 0);\n transform: translate3d(0, -10px, 0);\n }\n\n 90% {\n -webkit-transform: translate3d(0, 5px, 0);\n transform: translate3d(0, 5px, 0);\n }\n\n 100% {\n -webkit-transform: none;\n transform: none;\n }\n}\n\n@keyframes bounceInDown {\n 0%, 60%, 75%, 90%, 100% {\n -webkit-transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);\n transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);\n }\n\n 0% {\n opacity: 0;\n -webkit-transform: translate3d(0, -3000px, 0);\n transform: translate3d(0, -3000px, 0);\n }\n\n 60% {\n opacity: 1;\n -webkit-transform: translate3d(0, 25px, 0);\n transform: translate3d(0, 25px, 0);\n }\n\n 75% {\n -webkit-transform: translate3d(0, -10px, 0);\n transform: translate3d(0, -10px, 0);\n }\n\n 90% {\n -webkit-transform: translate3d(0, 5px, 0);\n transform: translate3d(0, 5px, 0);\n }\n\n 100% {\n -webkit-transform: none;\n transform: none;\n }\n}\n\n.bounceInDown {\n -webkit-animation-name: bounceInDown;\n animation-name: bounceInDown;\n}\n\n@-webkit-keyframes bounceInLeft {\n 0%, 60%, 75%, 90%, 100% {\n -webkit-transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);\n transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);\n }\n\n 0% {\n opacity: 0;\n -webkit-transform: translate3d(-3000px, 0, 0);\n transform: translate3d(-3000px, 0, 0);\n }\n\n 60% {\n opacity: 1;\n -webkit-transform: translate3d(25px, 0, 0);\n transform: translate3d(25px, 0, 0);\n }\n\n 75% {\n -webkit-transform: translate3d(-10px, 0, 0);\n transform: translate3d(-10px, 0, 0);\n }\n\n 90% {\n -webkit-transform: translate3d(5px, 0, 0);\n transform: translate3d(5px, 0, 0);\n }\n\n 100% {\n -webkit-transform: none;\n transform: none;\n }\n}\n\n@keyframes bounceInLeft {\n 0%, 60%, 75%, 90%, 100% {\n -webkit-transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);\n transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);\n }\n\n 0% {\n opacity: 0;\n -webkit-transform: translate3d(-3000px, 0, 0);\n transform: translate3d(-3000px, 0, 0);\n }\n\n 60% {\n opacity: 1;\n -webkit-transform: translate3d(25px, 0, 0);\n transform: translate3d(25px, 0, 0);\n }\n\n 75% {\n -webkit-transform: translate3d(-10px, 0, 0);\n transform: translate3d(-10px, 0, 0);\n }\n\n 90% {\n -webkit-transform: translate3d(5px, 0, 0);\n transform: translate3d(5px, 0, 0);\n }\n\n 100% {\n -webkit-transform: none;\n transform: none;\n }\n}\n\n.bounceInLeft {\n -webkit-animation-name: bounceInLeft;\n animation-name: bounceInLeft;\n}\n\n@-webkit-keyframes bounceInRight {\n 0%, 60%, 75%, 90%, 100% {\n -webkit-transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);\n transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);\n }\n\n 0% {\n opacity: 0;\n -webkit-transform: translate3d(3000px, 0, 0);\n transform: translate3d(3000px, 0, 0);\n }\n\n 60% {\n opacity: 1;\n -webkit-transform: translate3d(-25px, 0, 0);\n transform: translate3d(-25px, 0, 0);\n }\n\n 75% {\n -webkit-transform: translate3d(10px, 0, 0);\n transform: translate3d(10px, 0, 0);\n }\n\n 90% {\n -webkit-transform: translate3d(-5px, 0, 0);\n transform: translate3d(-5px, 0, 0);\n }\n\n 100% {\n -webkit-transform: none;\n transform: none;\n }\n}\n\n@keyframes bounceInRight {\n 0%, 60%, 75%, 90%, 100% {\n -webkit-transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);\n transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);\n }\n\n 0% {\n opacity: 0;\n -webkit-transform: translate3d(3000px, 0, 0);\n transform: translate3d(3000px, 0, 0);\n }\n\n 60% {\n opacity: 1;\n -webkit-transform: translate3d(-25px, 0, 0);\n transform: translate3d(-25px, 0, 0);\n }\n\n 75% {\n -webkit-transform: translate3d(10px, 0, 0);\n transform: translate3d(10px, 0, 0);\n }\n\n 90% {\n -webkit-transform: translate3d(-5px, 0, 0);\n transform: translate3d(-5px, 0, 0);\n }\n\n 100% {\n -webkit-transform: none;\n transform: none;\n }\n}\n\n.bounceInRight {\n -webkit-animation-name: bounceInRight;\n animation-name: bounceInRight;\n}\n\n@-webkit-keyframes bounceInUp {\n 0%, 60%, 75%, 90%, 100% {\n -webkit-transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);\n transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);\n }\n\n 0% {\n opacity: 0;\n -webkit-transform: translate3d(0, 3000px, 0);\n transform: translate3d(0, 3000px, 0);\n }\n\n 60% {\n opacity: 1;\n -webkit-transform: translate3d(0, -20px, 0);\n transform: translate3d(0, -20px, 0);\n }\n\n 75% {\n -webkit-transform: translate3d(0, 10px, 0);\n transform: translate3d(0, 10px, 0);\n }\n\n 90% {\n -webkit-transform: translate3d(0, -5px, 0);\n transform: translate3d(0, -5px, 0);\n }\n\n 100% {\n -webkit-transform: translate3d(0, 0, 0);\n transform: translate3d(0, 0, 0);\n }\n}\n\n@keyframes bounceInUp {\n 0%, 60%, 75%, 90%, 100% {\n -webkit-transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);\n transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);\n }\n\n 0% {\n opacity: 0;\n -webkit-transform: translate3d(0, 3000px, 0);\n transform: translate3d(0, 3000px, 0);\n }\n\n 60% {\n opacity: 1;\n -webkit-transform: translate3d(0, -20px, 0);\n transform: translate3d(0, -20px, 0);\n }\n\n 75% {\n -webkit-transform: translate3d(0, 10px, 0);\n transform: translate3d(0, 10px, 0);\n }\n\n 90% {\n -webkit-transform: translate3d(0, -5px, 0);\n transform: translate3d(0, -5px, 0);\n }\n\n 100% {\n -webkit-transform: translate3d(0, 0, 0);\n transform: translate3d(0, 0, 0);\n }\n}\n\n.bounceInUp {\n -webkit-animation-name: bounceInUp;\n animation-name: bounceInUp;\n}\n\n@-webkit-keyframes bounceOut {\n 20% {\n -webkit-transform: scale3d(.9, .9, .9);\n transform: scale3d(.9, .9, .9);\n }\n\n 50%, 55% {\n opacity: 1;\n -webkit-transform: scale3d(1.1, 1.1, 1.1);\n transform: scale3d(1.1, 1.1, 1.1);\n }\n\n 100% {\n opacity: 0;\n -webkit-transform: scale3d(.3, .3, .3);\n transform: scale3d(.3, .3, .3);\n }\n}\n\n@keyframes bounceOut {\n 20% {\n -webkit-transform: scale3d(.9, .9, .9);\n transform: scale3d(.9, .9, .9);\n }\n\n 50%, 55% {\n opacity: 1;\n -webkit-transform: scale3d(1.1, 1.1, 1.1);\n transform: scale3d(1.1, 1.1, 1.1);\n }\n\n 100% {\n opacity: 0;\n -webkit-transform: scale3d(.3, .3, .3);\n transform: scale3d(.3, .3, .3);\n }\n}\n\n.bounceOut {\n -webkit-animation-name: bounceOut;\n animation-name: bounceOut;\n -webkit-animation-duration: .75s;\n animation-duration: .75s;\n}\n\n@-webkit-keyframes bounceOutDown {\n 20% {\n -webkit-transform: translate3d(0, 10px, 0);\n transform: translate3d(0, 10px, 0);\n }\n\n 40%, 45% {\n opacity: 1;\n -webkit-transform: translate3d(0, -20px, 0);\n transform: translate3d(0, -20px, 0);\n }\n\n 100% {\n opacity: 0;\n -webkit-transform: translate3d(0, 2000px, 0);\n transform: translate3d(0, 2000px, 0);\n }\n}\n\n@keyframes bounceOutDown {\n 20% {\n -webkit-transform: translate3d(0, 10px, 0);\n transform: translate3d(0, 10px, 0);\n }\n\n 40%, 45% {\n opacity: 1;\n -webkit-transform: translate3d(0, -20px, 0);\n transform: translate3d(0, -20px, 0);\n }\n\n 100% {\n opacity: 0;\n -webkit-transform: translate3d(0, 2000px, 0);\n transform: translate3d(0, 2000px, 0);\n }\n}\n\n.bounceOutDown {\n -webkit-animation-name: bounceOutDown;\n animation-name: bounceOutDown;\n}\n\n@-webkit-keyframes bounceOutLeft {\n 20% {\n opacity: 1;\n -webkit-transform: translate3d(20px, 0, 0);\n transform: translate3d(20px, 0, 0);\n }\n\n 100% {\n opacity: 0;\n -webkit-transform: translate3d(-2000px, 0, 0);\n transform: translate3d(-2000px, 0, 0);\n }\n}\n\n@keyframes bounceOutLeft {\n 20% {\n opacity: 1;\n -webkit-transform: translate3d(20px, 0, 0);\n transform: translate3d(20px, 0, 0);\n }\n\n 100% {\n opacity: 0;\n -webkit-transform: translate3d(-2000px, 0, 0);\n transform: translate3d(-2000px, 0, 0);\n }\n}\n\n.bounceOutLeft {\n -webkit-animation-name: bounceOutLeft;\n animation-name: bounceOutLeft;\n}\n\n@-webkit-keyframes bounceOutRight {\n 20% {\n opacity: 1;\n -webkit-transform: translate3d(-20px, 0, 0);\n transform: translate3d(-20px, 0, 0);\n }\n\n 100% {\n opacity: 0;\n -webkit-transform: translate3d(2000px, 0, 0);\n transform: translate3d(2000px, 0, 0);\n }\n}\n\n@keyframes bounceOutRight {\n 20% {\n opacity: 1;\n -webkit-transform: translate3d(-20px, 0, 0);\n transform: translate3d(-20px, 0, 0);\n }\n\n 100% {\n opacity: 0;\n -webkit-transform: translate3d(2000px, 0, 0);\n transform: translate3d(2000px, 0, 0);\n }\n}\n\n.bounceOutRight {\n -webkit-animation-name: bounceOutRight;\n animation-name: bounceOutRight;\n}\n\n@-webkit-keyframes bounceOutUp {\n 20% {\n -webkit-transform: translate3d(0, -10px, 0);\n transform: translate3d(0, -10px, 0);\n }\n\n 40%, 45% {\n opacity: 1;\n -webkit-transform: translate3d(0, 20px, 0);\n transform: translate3d(0, 20px, 0);\n }\n\n 100% {\n opacity: 0;\n -webkit-transform: translate3d(0, -2000px, 0);\n transform: translate3d(0, -2000px, 0);\n }\n}\n\n@keyframes bounceOutUp {\n 20% {\n -webkit-transform: translate3d(0, -10px, 0);\n transform: translate3d(0, -10px, 0);\n }\n\n 40%, 45% {\n opacity: 1;\n -webkit-transform: translate3d(0, 20px, 0);\n transform: translate3d(0, 20px, 0);\n }\n\n 100% {\n opacity: 0;\n -webkit-transform: translate3d(0, -2000px, 0);\n transform: translate3d(0, -2000px, 0);\n }\n}\n\n.bounceOutUp {\n -webkit-animation-name: bounceOutUp;\n animation-name: bounceOutUp;\n}\n\n@-webkit-keyframes fadeIn {\n 0% {opacity: 0;}\n 100% {opacity: 1;}\n}\n\n@keyframes fadeIn {\n 0% {opacity: 0;}\n 100% {opacity: 1;}\n}\n\n.fadeIn {\n -webkit-animation-name: fadeIn;\n animation-name: fadeIn;\n}\n\n@-webkit-keyframes fadeInDown {\n 0% {\n opacity: 0;\n -webkit-transform: translate3d(0, -100%, 0);\n transform: translate3d(0, -100%, 0);\n }\n\n 100% {\n opacity: 1;\n -webkit-transform: none;\n transform: none;\n }\n}\n\n@keyframes fadeInDown {\n 0% {\n opacity: 0;\n -webkit-transform: translate3d(0, -100%, 0);\n transform: translate3d(0, -100%, 0);\n }\n\n 100% {\n opacity: 1;\n -webkit-transform: none;\n transform: none;\n }\n}\n\n.fadeInDown {\n -webkit-animation-name: fadeInDown;\n animation-name: fadeInDown;\n}\n\n@-webkit-keyframes fadeInDownBig {\n 0% {\n opacity: 0;\n -webkit-transform: translate3d(0, -2000px, 0);\n transform: translate3d(0, -2000px, 0);\n }\n\n 100% {\n opacity: 1;\n -webkit-transform: none;\n transform: none;\n }\n}\n\n@keyframes fadeInDownBig {\n 0% {\n opacity: 0;\n -webkit-transform: translate3d(0, -2000px, 0);\n transform: translate3d(0, -2000px, 0);\n }\n\n 100% {\n opacity: 1;\n -webkit-transform: none;\n transform: none;\n }\n}\n\n.fadeInDownBig {\n -webkit-animation-name: fadeInDownBig;\n animation-name: fadeInDownBig;\n}\n\n@-webkit-keyframes fadeInLeft {\n 0% {\n opacity: 0;\n -webkit-transform: translate3d(-100%, 0, 0);\n transform: translate3d(-100%, 0, 0);\n }\n\n 100% {\n opacity: 1;\n -webkit-transform: none;\n transform: none;\n }\n}\n\n@keyframes fadeInLeft {\n 0% {\n opacity: 0;\n -webkit-transform: translate3d(-100%, 0, 0);\n transform: translate3d(-100%, 0, 0);\n }\n\n 100% {\n opacity: 1;\n -webkit-transform: none;\n transform: none;\n }\n}\n\n.fadeInLeft {\n -webkit-animation-name: fadeInLeft;\n animation-name: fadeInLeft;\n}\n\n@-webkit-keyframes fadeInLeftBig {\n 0% {\n opacity: 0;\n -webkit-transform: translate3d(-2000px, 0, 0);\n transform: translate3d(-2000px, 0, 0);\n }\n\n 100% {\n opacity: 1;\n -webkit-transform: none;\n transform: none;\n }\n}\n\n@keyframes fadeInLeftBig {\n 0% {\n opacity: 0;\n -webkit-transform: translate3d(-2000px, 0, 0);\n transform: translate3d(-2000px, 0, 0);\n }\n\n 100% {\n opacity: 1;\n -webkit-transform: none;\n transform: none;\n }\n}\n\n.fadeInLeftBig {\n -webkit-animation-name: fadeInLeftBig;\n animation-name: fadeInLeftBig;\n}\n\n@-webkit-keyframes fadeInRight {\n 0% {\n opacity: 0;\n -webkit-transform: translate3d(100%, 0, 0);\n transform: translate3d(100%, 0, 0);\n }\n\n 100% {\n opacity: 1;\n -webkit-transform: none;\n transform: none;\n }\n}\n\n@keyframes fadeInRight {\n 0% {\n opacity: 0;\n -webkit-transform: translate3d(100%, 0, 0);\n transform: translate3d(100%, 0, 0);\n }\n\n 100% {\n opacity: 1;\n -webkit-transform: none;\n transform: none;\n }\n}\n\n.fadeInRight {\n -webkit-animation-name: fadeInRight;\n animation-name: fadeInRight;\n}\n\n@-webkit-keyframes fadeInRightBig {\n 0% {\n opacity: 0;\n -webkit-transform: translate3d(2000px, 0, 0);\n transform: translate3d(2000px, 0, 0);\n }\n\n 100% {\n opacity: 1;\n -webkit-transform: none;\n transform: none;\n }\n}\n\n@keyframes fadeInRightBig {\n 0% {\n opacity: 0;\n -webkit-transform: translate3d(2000px, 0, 0);\n transform: translate3d(2000px, 0, 0);\n }\n\n 100% {\n opacity: 1;\n -webkit-transform: none;\n transform: none;\n }\n}\n\n.fadeInRightBig {\n -webkit-animation-name: fadeInRightBig;\n animation-name: fadeInRightBig;\n}\n\n@-webkit-keyframes fadeInUp {\n 0% {\n opacity: 0;\n -webkit-transform: translate3d(0, 100%, 0);\n transform: translate3d(0, 100%, 0);\n }\n\n 100% {\n opacity: 1;\n -webkit-transform: none;\n transform: none;\n }\n}\n\n@keyframes fadeInUp {\n 0% {\n opacity: 0;\n -webkit-transform: translate3d(0, 100%, 0);\n transform: translate3d(0, 100%, 0);\n }\n\n 100% {\n opacity: 1;\n -webkit-transform: none;\n transform: none;\n }\n}\n\n.fadeInUp {\n -webkit-animation-name: fadeInUp;\n animation-name: fadeInUp;\n}\n\n@-webkit-keyframes fadeInUpBig {\n 0% {\n opacity: 0;\n -webkit-transform: translate3d(0, 2000px, 0);\n transform: translate3d(0, 2000px, 0);\n }\n\n 100% {\n opacity: 1;\n -webkit-transform: none;\n transform: none;\n }\n}\n\n@keyframes fadeInUpBig {\n 0% {\n opacity: 0;\n -webkit-transform: translate3d(0, 2000px, 0);\n transform: translate3d(0, 2000px, 0);\n }\n\n 100% {\n opacity: 1;\n -webkit-transform: none;\n transform: none;\n }\n}\n\n.fadeInUpBig {\n -webkit-animation-name: fadeInUpBig;\n animation-name: fadeInUpBig;\n}\n\n@-webkit-keyframes fadeOut {\n 0% {opacity: 1;}\n 100% {opacity: 0;}\n}\n\n@keyframes fadeOut {\n 0% {opacity: 1;}\n 100% {opacity: 0;}\n}\n\n.fadeOut {\n -webkit-animation-name: fadeOut;\n animation-name: fadeOut;\n}\n\n@-webkit-keyframes fadeOutDown {\n 0% {\n opacity: 1;\n }\n\n 100% {\n opacity: 0;\n -webkit-transform: translate3d(0, 100%, 0);\n transform: translate3d(0, 100%, 0);\n }\n}\n\n@keyframes fadeOutDown {\n 0% {\n opacity: 1;\n }\n\n 100% {\n opacity: 0;\n -webkit-transform: translate3d(0, 100%, 0);\n transform: translate3d(0, 100%, 0);\n }\n}\n\n.fadeOutDown {\n -webkit-animation-name: fadeOutDown;\n animation-name: fadeOutDown;\n}\n\n@-webkit-keyframes fadeOutDownBig {\n 0% {\n opacity: 1;\n }\n\n 100% {\n opacity: 0;\n -webkit-transform: translate3d(0, 2000px, 0);\n transform: translate3d(0, 2000px, 0);\n }\n}\n\n@keyframes fadeOutDownBig {\n 0% {\n opacity: 1;\n }\n\n 100% {\n opacity: 0;\n -webkit-transform: translate3d(0, 2000px, 0);\n transform: translate3d(0, 2000px, 0);\n }\n}\n\n.fadeOutDownBig {\n -webkit-animation-name: fadeOutDownBig;\n animation-name: fadeOutDownBig;\n}\n\n@-webkit-keyframes fadeOutLeft {\n 0% {\n opacity: 1;\n }\n\n 100% {\n opacity: 0;\n -webkit-transform: translate3d(-100%, 0, 0);\n transform: translate3d(-100%, 0, 0);\n }\n}\n\n@keyframes fadeOutLeft {\n 0% {\n opacity: 1;\n }\n\n 100% {\n opacity: 0;\n -webkit-transform: translate3d(-100%, 0, 0);\n transform: translate3d(-100%, 0, 0);\n }\n}\n\n.fadeOutLeft {\n -webkit-animation-name: fadeOutLeft;\n animation-name: fadeOutLeft;\n}\n\n@-webkit-keyframes fadeOutLeftBig {\n 0% {\n opacity: 1;\n }\n\n 100% {\n opacity: 0;\n -webkit-transform: translate3d(-2000px, 0, 0);\n transform: translate3d(-2000px, 0, 0);\n }\n}\n\n@keyframes fadeOutLeftBig {\n 0% {\n opacity: 1;\n }\n\n 100% {\n opacity: 0;\n -webkit-transform: translate3d(-2000px, 0, 0);\n transform: translate3d(-2000px, 0, 0);\n }\n}\n\n.fadeOutLeftBig {\n -webkit-animation-name: fadeOutLeftBig;\n animation-name: fadeOutLeftBig;\n}\n\n@-webkit-keyframes fadeOutRight {\n 0% {\n opacity: 1;\n }\n\n 100% {\n opacity: 0;\n -webkit-transform: translate3d(100%, 0, 0);\n transform: translate3d(100%, 0, 0);\n }\n}\n\n@keyframes fadeOutRight {\n 0% {\n opacity: 1;\n }\n\n 100% {\n opacity: 0;\n -webkit-transform: translate3d(100%, 0, 0);\n transform: translate3d(100%, 0, 0);\n }\n}\n\n.fadeOutRight {\n -webkit-animation-name: fadeOutRight;\n animation-name: fadeOutRight;\n}\n\n@-webkit-keyframes fadeOutRightBig {\n 0% {\n opacity: 1;\n }\n\n 100% {\n opacity: 0;\n -webkit-transform: translate3d(2000px, 0, 0);\n transform: translate3d(2000px, 0, 0);\n }\n}\n\n@keyframes fadeOutRightBig {\n 0% {\n opacity: 1;\n }\n\n 100% {\n opacity: 0;\n -webkit-transform: translate3d(2000px, 0, 0);\n transform: translate3d(2000px, 0, 0);\n }\n}\n\n.fadeOutRightBig {\n -webkit-animation-name: fadeOutRightBig;\n animation-name: fadeOutRightBig;\n}\n\n@-webkit-keyframes fadeOutUp {\n 0% {\n opacity: 1;\n }\n\n 100% {\n opacity: 0;\n -webkit-transform: translate3d(0, -100%, 0);\n transform: translate3d(0, -100%, 0);\n }\n}\n\n@keyframes fadeOutUp {\n 0% {\n opacity: 1;\n }\n\n 100% {\n opacity: 0;\n -webkit-transform: translate3d(0, -100%, 0);\n transform: translate3d(0, -100%, 0);\n }\n}\n\n.fadeOutUp {\n -webkit-animation-name: fadeOutUp;\n animation-name: fadeOutUp;\n}\n\n@-webkit-keyframes fadeOutUpBig {\n 0% {\n opacity: 1;\n }\n\n 100% {\n opacity: 0;\n -webkit-transform: translate3d(0, -2000px, 0);\n transform: translate3d(0, -2000px, 0);\n }\n}\n\n@keyframes fadeOutUpBig {\n 0% {\n opacity: 1;\n }\n\n 100% {\n opacity: 0;\n -webkit-transform: translate3d(0, -2000px, 0);\n transform: translate3d(0, -2000px, 0);\n }\n}\n\n.fadeOutUpBig {\n -webkit-animation-name: fadeOutUpBig;\n animation-name: fadeOutUpBig;\n}\n\n@-webkit-keyframes flip {\n 0% {\n -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -360deg);\n transform: perspective(400px) rotate3d(0, 1, 0, -360deg);\n -webkit-animation-timing-function: ease-out;\n animation-timing-function: ease-out;\n }\n\n 40% {\n -webkit-transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -190deg);\n transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -190deg);\n -webkit-animation-timing-function: ease-out;\n animation-timing-function: ease-out;\n }\n\n 50% {\n -webkit-transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -170deg);\n transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -170deg);\n -webkit-animation-timing-function: ease-in;\n animation-timing-function: ease-in;\n }\n\n 80% {\n -webkit-transform: perspective(400px) scale3d(.95, .95, .95);\n transform: perspective(400px) scale3d(.95, .95, .95);\n -webkit-animation-timing-function: ease-in;\n animation-timing-function: ease-in;\n }\n\n 100% {\n -webkit-transform: perspective(400px);\n transform: perspective(400px);\n -webkit-animation-timing-function: ease-in;\n animation-timing-function: ease-in;\n }\n}\n\n@keyframes flip {\n 0% {\n -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -360deg);\n transform: perspective(400px) rotate3d(0, 1, 0, -360deg);\n -webkit-animation-timing-function: ease-out;\n animation-timing-function: ease-out;\n }\n\n 40% {\n -webkit-transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -190deg);\n transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -190deg);\n -webkit-animation-timing-function: ease-out;\n animation-timing-function: ease-out;\n }\n\n 50% {\n -webkit-transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -170deg);\n transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -170deg);\n -webkit-animation-timing-function: ease-in;\n animation-timing-function: ease-in;\n }\n\n 80% {\n -webkit-transform: perspective(400px) scale3d(.95, .95, .95);\n transform: perspective(400px) scale3d(.95, .95, .95);\n -webkit-animation-timing-function: ease-in;\n animation-timing-function: ease-in;\n }\n\n 100% {\n -webkit-transform: perspective(400px);\n transform: perspective(400px);\n -webkit-animation-timing-function: ease-in;\n animation-timing-function: ease-in;\n }\n}\n\n.animated.flip {\n -webkit-backface-visibility: visible;\n backface-visibility: visible;\n -webkit-animation-name: flip;\n animation-name: flip;\n}\n\n@-webkit-keyframes flipInX {\n 0% {\n -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 90deg);\n transform: perspective(400px) rotate3d(1, 0, 0, 90deg);\n -webkit-transition-timing-function: ease-in;\n transition-timing-function: ease-in;\n opacity: 0;\n }\n\n 40% {\n -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -20deg);\n transform: perspective(400px) rotate3d(1, 0, 0, -20deg);\n -webkit-transition-timing-function: ease-in;\n transition-timing-function: ease-in;\n }\n\n 60% {\n -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 10deg);\n transform: perspective(400px) rotate3d(1, 0, 0, 10deg);\n opacity: 1;\n }\n\n 80% {\n -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -5deg);\n transform: perspective(400px) rotate3d(1, 0, 0, -5deg);\n }\n\n 100% {\n -webkit-transform: perspective(400px);\n transform: perspective(400px);\n }\n}\n\n@keyframes flipInX {\n 0% {\n -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 90deg);\n transform: perspective(400px) rotate3d(1, 0, 0, 90deg);\n -webkit-transition-timing-function: ease-in;\n transition-timing-function: ease-in;\n opacity: 0;\n }\n\n 40% {\n -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -20deg);\n transform: perspective(400px) rotate3d(1, 0, 0, -20deg);\n -webkit-transition-timing-function: ease-in;\n transition-timing-function: ease-in;\n }\n\n 60% {\n -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 10deg);\n transform: perspective(400px) rotate3d(1, 0, 0, 10deg);\n opacity: 1;\n }\n\n 80% {\n -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -5deg);\n transform: perspective(400px) rotate3d(1, 0, 0, -5deg);\n }\n\n 100% {\n -webkit-transform: perspective(400px);\n transform: perspective(400px);\n }\n}\n\n.flipInX {\n -webkit-backface-visibility: visible !important;\n backface-visibility: visible !important;\n -webkit-animation-name: flipInX;\n animation-name: flipInX;\n}\n\n@-webkit-keyframes flipInY {\n 0% {\n -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 90deg);\n transform: perspective(400px) rotate3d(0, 1, 0, 90deg);\n -webkit-transition-timing-function: ease-in;\n transition-timing-function: ease-in;\n opacity: 0;\n }\n\n 40% {\n -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -20deg);\n transform: perspective(400px) rotate3d(0, 1, 0, -20deg);\n -webkit-transition-timing-function: ease-in;\n transition-timing-function: ease-in;\n }\n\n 60% {\n -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 10deg);\n transform: perspective(400px) rotate3d(0, 1, 0, 10deg);\n opacity: 1;\n }\n\n 80% {\n -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -5deg);\n transform: perspective(400px) rotate3d(0, 1, 0, -5deg);\n }\n\n 100% {\n -webkit-transform: perspective(400px);\n transform: perspective(400px);\n }\n}\n\n@keyframes flipInY {\n 0% {\n -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 90deg);\n transform: perspective(400px) rotate3d(0, 1, 0, 90deg);\n -webkit-transition-timing-function: ease-in;\n transition-timing-function: ease-in;\n opacity: 0;\n }\n\n 40% {\n -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -20deg);\n transform: perspective(400px) rotate3d(0, 1, 0, -20deg);\n -webkit-transition-timing-function: ease-in;\n transition-timing-function: ease-in;\n }\n\n 60% {\n -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 10deg);\n transform: perspective(400px) rotate3d(0, 1, 0, 10deg);\n opacity: 1;\n }\n\n 80% {\n -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -5deg);\n transform: perspective(400px) rotate3d(0, 1, 0, -5deg);\n }\n\n 100% {\n -webkit-transform: perspective(400px);\n transform: perspective(400px);\n }\n}\n\n.flipInY {\n -webkit-backface-visibility: visible !important;\n backface-visibility: visible !important;\n -webkit-animation-name: flipInY;\n animation-name: flipInY;\n}\n\n@-webkit-keyframes flipOutX {\n 0% {\n -webkit-transform: perspective(400px);\n transform: perspective(400px);\n }\n\n 30% {\n -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -20deg);\n transform: perspective(400px) rotate3d(1, 0, 0, -20deg);\n opacity: 1;\n }\n\n 100% {\n -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 90deg);\n transform: perspective(400px) rotate3d(1, 0, 0, 90deg);\n opacity: 0;\n }\n}\n\n@keyframes flipOutX {\n 0% {\n -webkit-transform: perspective(400px);\n transform: perspective(400px);\n }\n\n 30% {\n -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -20deg);\n transform: perspective(400px) rotate3d(1, 0, 0, -20deg);\n opacity: 1;\n }\n\n 100% {\n -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 90deg);\n transform: perspective(400px) rotate3d(1, 0, 0, 90deg);\n opacity: 0;\n }\n}\n\n.flipOutX {\n -webkit-animation-name: flipOutX;\n animation-name: flipOutX;\n -webkit-animation-duration: .75s;\n animation-duration: .75s;\n -webkit-backface-visibility: visible !important;\n backface-visibility: visible !important;\n}\n\n@-webkit-keyframes flipOutY {\n 0% {\n -webkit-transform: perspective(400px);\n transform: perspective(400px);\n }\n\n 30% {\n -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -15deg);\n transform: perspective(400px) rotate3d(0, 1, 0, -15deg);\n opacity: 1;\n }\n\n 100% {\n -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 90deg);\n transform: perspective(400px) rotate3d(0, 1, 0, 90deg);\n opacity: 0;\n }\n}\n\n@keyframes flipOutY {\n 0% {\n -webkit-transform: perspective(400px);\n transform: perspective(400px);\n }\n\n 30% {\n -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -15deg);\n transform: perspective(400px) rotate3d(0, 1, 0, -15deg);\n opacity: 1;\n }\n\n 100% {\n -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 90deg);\n transform: perspective(400px) rotate3d(0, 1, 0, 90deg);\n opacity: 0;\n }\n}\n\n.flipOutY {\n -webkit-backface-visibility: visible !important;\n backface-visibility: visible !important;\n -webkit-animation-name: flipOutY;\n animation-name: flipOutY;\n -webkit-animation-duration: .75s;\n animation-duration: .75s;\n}\n\n@-webkit-keyframes lightSpeedIn {\n 0% {\n -webkit-transform: translate3d(100%, 0, 0) skewX(-30deg);\n transform: translate3d(100%, 0, 0) skewX(-30deg);\n opacity: 0;\n }\n\n 60% {\n -webkit-transform: skewX(20deg);\n transform: skewX(20deg);\n opacity: 1;\n }\n\n 80% {\n -webkit-transform: skewX(-5deg);\n transform: skewX(-5deg);\n opacity: 1;\n }\n\n 100% {\n -webkit-transform: none;\n transform: none;\n opacity: 1;\n }\n}\n\n@keyframes lightSpeedIn {\n 0% {\n -webkit-transform: translate3d(100%, 0, 0) skewX(-30deg);\n transform: translate3d(100%, 0, 0) skewX(-30deg);\n opacity: 0;\n }\n\n 60% {\n -webkit-transform: skewX(20deg);\n transform: skewX(20deg);\n opacity: 1;\n }\n\n 80% {\n -webkit-transform: skewX(-5deg);\n transform: skewX(-5deg);\n opacity: 1;\n }\n\n 100% {\n -webkit-transform: none;\n transform: none;\n opacity: 1;\n }\n}\n\n.lightSpeedIn {\n -webkit-animation-name: lightSpeedIn;\n animation-name: lightSpeedIn;\n -webkit-animation-timing-function: ease-out;\n animation-timing-function: ease-out;\n}\n\n@-webkit-keyframes lightSpeedOut {\n 0% {\n opacity: 1;\n }\n\n 100% {\n -webkit-transform: translate3d(100%, 0, 0) skewX(30deg);\n transform: translate3d(100%, 0, 0) skewX(30deg);\n opacity: 0;\n }\n}\n\n@keyframes lightSpeedOut {\n 0% {\n opacity: 1;\n }\n\n 100% {\n -webkit-transform: translate3d(100%, 0, 0) skewX(30deg);\n transform: translate3d(100%, 0, 0) skewX(30deg);\n opacity: 0;\n }\n}\n\n.lightSpeedOut {\n -webkit-animation-name: lightSpeedOut;\n animation-name: lightSpeedOut;\n -webkit-animation-timing-function: ease-in;\n animation-timing-function: ease-in;\n}\n\n@-webkit-keyframes rotateIn {\n 0% {\n -webkit-transform-origin: center;\n transform-origin: center;\n -webkit-transform: rotate3d(0, 0, 1, -200deg);\n transform: rotate3d(0, 0, 1, -200deg);\n opacity: 0;\n }\n\n 100% {\n -webkit-transform-origin: center;\n transform-origin: center;\n -webkit-transform: none;\n transform: none;\n opacity: 1;\n }\n}\n\n@keyframes rotateIn {\n 0% {\n -webkit-transform-origin: center;\n transform-origin: center;\n -webkit-transform: rotate3d(0, 0, 1, -200deg);\n transform: rotate3d(0, 0, 1, -200deg);\n opacity: 0;\n }\n\n 100% {\n -webkit-transform-origin: center;\n transform-origin: center;\n -webkit-transform: none;\n transform: none;\n opacity: 1;\n }\n}\n\n.rotateIn {\n -webkit-animation-name: rotateIn;\n animation-name: rotateIn;\n}\n\n@-webkit-keyframes rotateInDownLeft {\n 0% {\n -webkit-transform-origin: left bottom;\n transform-origin: left bottom;\n -webkit-transform: rotate3d(0, 0, 1, -45deg);\n transform: rotate3d(0, 0, 1, -45deg);\n opacity: 0;\n }\n\n 100% {\n -webkit-transform-origin: left bottom;\n transform-origin: left bottom;\n -webkit-transform: none;\n transform: none;\n opacity: 1;\n }\n}\n\n@keyframes rotateInDownLeft {\n 0% {\n -webkit-transform-origin: left bottom;\n transform-origin: left bottom;\n -webkit-transform: rotate3d(0, 0, 1, -45deg);\n transform: rotate3d(0, 0, 1, -45deg);\n opacity: 0;\n }\n\n 100% {\n -webkit-transform-origin: left bottom;\n transform-origin: left bottom;\n -webkit-transform: none;\n transform: none;\n opacity: 1;\n }\n}\n\n.rotateInDownLeft {\n -webkit-animation-name: rotateInDownLeft;\n animation-name: rotateInDownLeft;\n}\n\n@-webkit-keyframes rotateInDownRight {\n 0% {\n -webkit-transform-origin: right bottom;\n transform-origin: right bottom;\n -webkit-transform: rotate3d(0, 0, 1, 45deg);\n transform: rotate3d(0, 0, 1, 45deg);\n opacity: 0;\n }\n\n 100% {\n -webkit-transform-origin: right bottom;\n transform-origin: right bottom;\n -webkit-transform: none;\n transform: none;\n opacity: 1;\n }\n}\n\n@keyframes rotateInDownRight {\n 0% {\n -webkit-transform-origin: right bottom;\n transform-origin: right bottom;\n -webkit-transform: rotate3d(0, 0, 1, 45deg);\n transform: rotate3d(0, 0, 1, 45deg);\n opacity: 0;\n }\n\n 100% {\n -webkit-transform-origin: right bottom;\n transform-origin: right bottom;\n -webkit-transform: none;\n transform: none;\n opacity: 1;\n }\n}\n\n.rotateInDownRight {\n -webkit-animation-name: rotateInDownRight;\n animation-name: rotateInDownRight;\n}\n\n@-webkit-keyframes rotateInUpLeft {\n 0% {\n -webkit-transform-origin: left bottom;\n transform-origin: left bottom;\n -webkit-transform: rotate3d(0, 0, 1, 45deg);\n transform: rotate3d(0, 0, 1, 45deg);\n opacity: 0;\n }\n\n 100% {\n -webkit-transform-origin: left bottom;\n transform-origin: left bottom;\n -webkit-transform: none;\n transform: none;\n opacity: 1;\n }\n}\n\n@keyframes rotateInUpLeft {\n 0% {\n -webkit-transform-origin: left bottom;\n transform-origin: left bottom;\n -webkit-transform: rotate3d(0, 0, 1, 45deg);\n transform: rotate3d(0, 0, 1, 45deg);\n opacity: 0;\n }\n\n 100% {\n -webkit-transform-origin: left bottom;\n transform-origin: left bottom;\n -webkit-transform: none;\n transform: none;\n opacity: 1;\n }\n}\n\n.rotateInUpLeft {\n -webkit-animation-name: rotateInUpLeft;\n animation-name: rotateInUpLeft;\n}\n\n@-webkit-keyframes rotateInUpRight {\n 0% {\n -webkit-transform-origin: right bottom;\n transform-origin: right bottom;\n -webkit-transform: rotate3d(0, 0, 1, -90deg);\n transform: rotate3d(0, 0, 1, -90deg);\n opacity: 0;\n }\n\n 100% {\n -webkit-transform-origin: right bottom;\n transform-origin: right bottom;\n -webkit-transform: none;\n transform: none;\n opacity: 1;\n }\n}\n\n@keyframes rotateInUpRight {\n 0% {\n -webkit-transform-origin: right bottom;\n transform-origin: right bottom;\n -webkit-transform: rotate3d(0, 0, 1, -90deg);\n transform: rotate3d(0, 0, 1, -90deg);\n opacity: 0;\n }\n\n 100% {\n -webkit-transform-origin: right bottom;\n transform-origin: right bottom;\n -webkit-transform: none;\n transform: none;\n opacity: 1;\n }\n}\n\n.rotateInUpRight {\n -webkit-animation-name: rotateInUpRight;\n animation-name: rotateInUpRight;\n}\n\n@-webkit-keyframes rotateOut {\n 0% {\n -webkit-transform-origin: center;\n transform-origin: center;\n opacity: 1;\n }\n\n 100% {\n -webkit-transform-origin: center;\n transform-origin: center;\n -webkit-transform: rotate3d(0, 0, 1, 200deg);\n transform: rotate3d(0, 0, 1, 200deg);\n opacity: 0;\n }\n}\n\n@keyframes rotateOut {\n 0% {\n -webkit-transform-origin: center;\n transform-origin: center;\n opacity: 1;\n }\n\n 100% {\n -webkit-transform-origin: center;\n transform-origin: center;\n -webkit-transform: rotate3d(0, 0, 1, 200deg);\n transform: rotate3d(0, 0, 1, 200deg);\n opacity: 0;\n }\n}\n\n.rotateOut {\n -webkit-animation-name: rotateOut;\n animation-name: rotateOut;\n}\n\n@-webkit-keyframes rotateOutDownLeft {\n 0% {\n -webkit-transform-origin: left bottom;\n transform-origin: left bottom;\n opacity: 1;\n }\n\n 100% {\n -webkit-transform-origin: left bottom;\n transform-origin: left bottom;\n -webkit-transform: rotate3d(0, 0, 1, 45deg);\n transform: rotate3d(0, 0, 1, 45deg);\n opacity: 0;\n }\n}\n\n@keyframes rotateOutDownLeft {\n 0% {\n -webkit-transform-origin: left bottom;\n transform-origin: left bottom;\n opacity: 1;\n }\n\n 100% {\n -webkit-transform-origin: left bottom;\n transform-origin: left bottom;\n -webkit-transform: rotate3d(0, 0, 1, 45deg);\n transform: rotate3d(0, 0, 1, 45deg);\n opacity: 0;\n }\n}\n\n.rotateOutDownLeft {\n -webkit-animation-name: rotateOutDownLeft;\n animation-name: rotateOutDownLeft;\n}\n\n@-webkit-keyframes rotateOutDownRight {\n 0% {\n -webkit-transform-origin: right bottom;\n transform-origin: right bottom;\n opacity: 1;\n }\n\n 100% {\n -webkit-transform-origin: right bottom;\n transform-origin: right bottom;\n -webkit-transform: rotate3d(0, 0, 1, -45deg);\n transform: rotate3d(0, 0, 1, -45deg);\n opacity: 0;\n }\n}\n\n@keyframes rotateOutDownRight {\n 0% {\n -webkit-transform-origin: right bottom;\n transform-origin: right bottom;\n opacity: 1;\n }\n\n 100% {\n -webkit-transform-origin: right bottom;\n transform-origin: right bottom;\n -webkit-transform: rotate3d(0, 0, 1, -45deg);\n transform: rotate3d(0, 0, 1, -45deg);\n opacity: 0;\n }\n}\n\n.rotateOutDownRight {\n -webkit-animation-name: rotateOutDownRight;\n animation-name: rotateOutDownRight;\n}\n\n@-webkit-keyframes rotateOutUpLeft {\n 0% {\n -webkit-transform-origin: left bottom;\n transform-origin: left bottom;\n opacity: 1;\n }\n\n 100% {\n -webkit-transform-origin: left bottom;\n transform-origin: left bottom;\n -webkit-transform: rotate3d(0, 0, 1, -45deg);\n transform: rotate3d(0, 0, 1, -45deg);\n opacity: 0;\n }\n}\n\n@keyframes rotateOutUpLeft {\n 0% {\n -webkit-transform-origin: left bottom;\n transform-origin: left bottom;\n opacity: 1;\n }\n\n 100% {\n -webkit-transform-origin: left bottom;\n transform-origin: left bottom;\n -webkit-transform: rotate3d(0, 0, 1, -45deg);\n transform: rotate3d(0, 0, 1, -45deg);\n opacity: 0;\n }\n}\n\n.rotateOutUpLeft {\n -webkit-animation-name: rotateOutUpLeft;\n animation-name: rotateOutUpLeft;\n}\n\n@-webkit-keyframes rotateOutUpRight {\n 0% {\n -webkit-transform-origin: right bottom;\n transform-origin: right bottom;\n opacity: 1;\n }\n\n 100% {\n -webkit-transform-origin: right bottom;\n transform-origin: right bottom;\n -webkit-transform: rotate3d(0, 0, 1, 90deg);\n transform: rotate3d(0, 0, 1, 90deg);\n opacity: 0;\n }\n}\n\n@keyframes rotateOutUpRight {\n 0% {\n -webkit-transform-origin: right bottom;\n transform-origin: right bottom;\n opacity: 1;\n }\n\n 100% {\n -webkit-transform-origin: right bottom;\n transform-origin: right bottom;\n -webkit-transform: rotate3d(0, 0, 1, 90deg);\n transform: rotate3d(0, 0, 1, 90deg);\n opacity: 0;\n }\n}\n\n.rotateOutUpRight {\n -webkit-animation-name: rotateOutUpRight;\n animation-name: rotateOutUpRight;\n}\n\n@-webkit-keyframes hinge {\n 0% {\n -webkit-transform-origin: top left;\n transform-origin: top left;\n -webkit-animation-timing-function: ease-in-out;\n animation-timing-function: ease-in-out;\n }\n\n 20%, 60% {\n -webkit-transform: rotate3d(0, 0, 1, 80deg);\n transform: rotate3d(0, 0, 1, 80deg);\n -webkit-transform-origin: top left;\n transform-origin: top left;\n -webkit-animation-timing-function: ease-in-out;\n animation-timing-function: ease-in-out;\n }\n\n 40%, 80% {\n -webkit-transform: rotate3d(0, 0, 1, 60deg);\n transform: rotate3d(0, 0, 1, 60deg);\n -webkit-transform-origin: top left;\n transform-origin: top left;\n -webkit-animation-timing-function: ease-in-out;\n animation-timing-function: ease-in-out;\n opacity: 1;\n }\n\n 100% {\n -webkit-transform: translate3d(0, 700px, 0);\n transform: translate3d(0, 700px, 0);\n opacity: 0;\n }\n}\n\n@keyframes hinge {\n 0% {\n -webkit-transform-origin: top left;\n transform-origin: top left;\n -webkit-animation-timing-function: ease-in-out;\n animation-timing-function: ease-in-out;\n }\n\n 20%, 60% {\n -webkit-transform: rotate3d(0, 0, 1, 80deg);\n transform: rotate3d(0, 0, 1, 80deg);\n -webkit-transform-origin: top left;\n transform-origin: top left;\n -webkit-animation-timing-function: ease-in-out;\n animation-timing-function: ease-in-out;\n }\n\n 40%, 80% {\n -webkit-transform: rotate3d(0, 0, 1, 60deg);\n transform: rotate3d(0, 0, 1, 60deg);\n -webkit-transform-origin: top left;\n transform-origin: top left;\n -webkit-animation-timing-function: ease-in-out;\n animation-timing-function: ease-in-out;\n opacity: 1;\n }\n\n 100% {\n -webkit-transform: translate3d(0, 700px, 0);\n transform: translate3d(0, 700px, 0);\n opacity: 0;\n }\n}\n\n.hinge {\n -webkit-animation-name: hinge;\n animation-name: hinge;\n}\n\n/* originally authored by Nick Pettit - https://github.com/nickpettit/glide */\n\n@-webkit-keyframes rollIn {\n 0% {\n opacity: 0;\n -webkit-transform: translate3d(-100%, 0, 0) rotate3d(0, 0, 1, -120deg);\n transform: translate3d(-100%, 0, 0) rotate3d(0, 0, 1, -120deg);\n }\n\n 100% {\n opacity: 1;\n -webkit-transform: none;\n transform: none;\n }\n}\n\n@keyframes rollIn {\n 0% {\n opacity: 0;\n -webkit-transform: translate3d(-100%, 0, 0) rotate3d(0, 0, 1, -120deg);\n transform: translate3d(-100%, 0, 0) rotate3d(0, 0, 1, -120deg);\n }\n\n 100% {\n opacity: 1;\n -webkit-transform: none;\n transform: none;\n }\n}\n\n.rollIn {\n -webkit-animation-name: rollIn;\n animation-name: rollIn;\n}\n\n/* originally authored by Nick Pettit - https://github.com/nickpettit/glide */\n\n@-webkit-keyframes rollOut {\n 0% {\n opacity: 1;\n }\n\n 100% {\n opacity: 0;\n -webkit-transform: translate3d(100%, 0, 0) rotate3d(0, 0, 1, 120deg);\n transform: translate3d(100%, 0, 0) rotate3d(0, 0, 1, 120deg);\n }\n}\n\n@keyframes rollOut {\n 0% {\n opacity: 1;\n }\n\n 100% {\n opacity: 0;\n -webkit-transform: translate3d(100%, 0, 0) rotate3d(0, 0, 1, 120deg);\n transform: translate3d(100%, 0, 0) rotate3d(0, 0, 1, 120deg);\n }\n}\n\n.rollOut {\n -webkit-animation-name: rollOut;\n animation-name: rollOut;\n}\n\n@-webkit-keyframes zoomIn {\n 0% {\n opacity: 0;\n -webkit-transform: scale3d(.3, .3, .3);\n transform: scale3d(.3, .3, .3);\n }\n\n 50% {\n opacity: 1;\n }\n}\n\n@keyframes zoomIn {\n 0% {\n opacity: 0;\n -webkit-transform: scale3d(.3, .3, .3);\n transform: scale3d(.3, .3, .3);\n }\n\n 50% {\n opacity: 1;\n }\n}\n\n.zoomIn {\n -webkit-animation-name: zoomIn;\n animation-name: zoomIn;\n}\n\n@-webkit-keyframes zoomInDown {\n 0% {\n opacity: 0;\n -webkit-transform: scale3d(.1, .1, .1) translate3d(0, -1000px, 0);\n transform: scale3d(.1, .1, .1) translate3d(0, -1000px, 0);\n -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);\n animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);\n }\n\n 60% {\n opacity: 1;\n -webkit-transform: scale3d(.475, .475, .475) translate3d(0, 60px, 0);\n transform: scale3d(.475, .475, .475) translate3d(0, 60px, 0);\n -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);\n animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);\n }\n}\n\n@keyframes zoomInDown {\n 0% {\n opacity: 0;\n -webkit-transform: scale3d(.1, .1, .1) translate3d(0, -1000px, 0);\n transform: scale3d(.1, .1, .1) translate3d(0, -1000px, 0);\n -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);\n animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);\n }\n\n 60% {\n opacity: 1;\n -webkit-transform: scale3d(.475, .475, .475) translate3d(0, 60px, 0);\n transform: scale3d(.475, .475, .475) translate3d(0, 60px, 0);\n -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);\n animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);\n }\n}\n\n.zoomInDown {\n -webkit-animation-name: zoomInDown;\n animation-name: zoomInDown;\n}\n\n@-webkit-keyframes zoomInLeft {\n 0% {\n opacity: 0;\n -webkit-transform: scale3d(.1, .1, .1) translate3d(-1000px, 0, 0);\n transform: scale3d(.1, .1, .1) translate3d(-1000px, 0, 0);\n -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);\n animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);\n }\n\n 60% {\n opacity: 1;\n -webkit-transform: scale3d(.475, .475, .475) translate3d(10px, 0, 0);\n transform: scale3d(.475, .475, .475) translate3d(10px, 0, 0);\n -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);\n animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);\n }\n}\n\n@keyframes zoomInLeft {\n 0% {\n opacity: 0;\n -webkit-transform: scale3d(.1, .1, .1) translate3d(-1000px, 0, 0);\n transform: scale3d(.1, .1, .1) translate3d(-1000px, 0, 0);\n -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);\n animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);\n }\n\n 60% {\n opacity: 1;\n -webkit-transform: scale3d(.475, .475, .475) translate3d(10px, 0, 0);\n transform: scale3d(.475, .475, .475) translate3d(10px, 0, 0);\n -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);\n animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);\n }\n}\n\n.zoomInLeft {\n -webkit-animation-name: zoomInLeft;\n animation-name: zoomInLeft;\n}\n\n@-webkit-keyframes zoomInRight {\n 0% {\n opacity: 0;\n -webkit-transform: scale3d(.1, .1, .1) translate3d(1000px, 0, 0);\n transform: scale3d(.1, .1, .1) translate3d(1000px, 0, 0);\n -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);\n animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);\n }\n\n 60% {\n opacity: 1;\n -webkit-transform: scale3d(.475, .475, .475) translate3d(-10px, 0, 0);\n transform: scale3d(.475, .475, .475) translate3d(-10px, 0, 0);\n -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);\n animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);\n }\n}\n\n@keyframes zoomInRight {\n 0% {\n opacity: 0;\n -webkit-transform: scale3d(.1, .1, .1) translate3d(1000px, 0, 0);\n transform: scale3d(.1, .1, .1) translate3d(1000px, 0, 0);\n -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);\n animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);\n }\n\n 60% {\n opacity: 1;\n -webkit-transform: scale3d(.475, .475, .475) translate3d(-10px, 0, 0);\n transform: scale3d(.475, .475, .475) translate3d(-10px, 0, 0);\n -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);\n animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);\n }\n}\n\n.zoomInRight {\n -webkit-animation-name: zoomInRight;\n animation-name: zoomInRight;\n}\n\n@-webkit-keyframes zoomInUp {\n 0% {\n opacity: 0;\n -webkit-transform: scale3d(.1, .1, .1) translate3d(0, 1000px, 0);\n transform: scale3d(.1, .1, .1) translate3d(0, 1000px, 0);\n -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);\n animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);\n }\n\n 60% {\n opacity: 1;\n -webkit-transform: scale3d(.475, .475, .475) translate3d(0, -60px, 0);\n transform: scale3d(.475, .475, .475) translate3d(0, -60px, 0);\n -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);\n animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);\n }\n}\n\n@keyframes zoomInUp {\n 0% {\n opacity: 0;\n -webkit-transform: scale3d(.1, .1, .1) translate3d(0, 1000px, 0);\n transform: scale3d(.1, .1, .1) translate3d(0, 1000px, 0);\n -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);\n animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);\n }\n\n 60% {\n opacity: 1;\n -webkit-transform: scale3d(.475, .475, .475) translate3d(0, -60px, 0);\n transform: scale3d(.475, .475, .475) translate3d(0, -60px, 0);\n -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);\n animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);\n }\n}\n\n.zoomInUp {\n -webkit-animation-name: zoomInUp;\n animation-name: zoomInUp;\n}\n\n@-webkit-keyframes zoomOut {\n 0% {\n opacity: 1;\n }\n\n 50% {\n opacity: 0;\n -webkit-transform: scale3d(.3, .3, .3);\n transform: scale3d(.3, .3, .3);\n }\n\n 100% {\n opacity: 0;\n }\n}\n\n@keyframes zoomOut {\n 0% {\n opacity: 1;\n }\n\n 50% {\n opacity: 0;\n -webkit-transform: scale3d(.3, .3, .3);\n transform: scale3d(.3, .3, .3);\n }\n\n 100% {\n opacity: 0;\n }\n}\n\n.zoomOut {\n -webkit-animation-name: zoomOut;\n animation-name: zoomOut;\n}\n\n@-webkit-keyframes zoomOutDown {\n 40% {\n opacity: 1;\n -webkit-transform: scale3d(.475, .475, .475) translate3d(0, -60px, 0);\n transform: scale3d(.475, .475, .475) translate3d(0, -60px, 0);\n -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);\n animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);\n }\n\n 100% {\n opacity: 0;\n -webkit-transform: scale3d(.1, .1, .1) translate3d(0, 2000px, 0);\n transform: scale3d(.1, .1, .1) translate3d(0, 2000px, 0);\n -webkit-transform-origin: center bottom;\n transform-origin: center bottom;\n -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);\n animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);\n }\n}\n\n@keyframes zoomOutDown {\n 40% {\n opacity: 1;\n -webkit-transform: scale3d(.475, .475, .475) translate3d(0, -60px, 0);\n transform: scale3d(.475, .475, .475) translate3d(0, -60px, 0);\n -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);\n animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);\n }\n\n 100% {\n opacity: 0;\n -webkit-transform: scale3d(.1, .1, .1) translate3d(0, 2000px, 0);\n transform: scale3d(.1, .1, .1) translate3d(0, 2000px, 0);\n -webkit-transform-origin: center bottom;\n transform-origin: center bottom;\n -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);\n animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);\n }\n}\n\n.zoomOutDown {\n -webkit-animation-name: zoomOutDown;\n animation-name: zoomOutDown;\n}\n\n@-webkit-keyframes zoomOutLeft {\n 40% {\n opacity: 1;\n -webkit-transform: scale3d(.475, .475, .475) translate3d(42px, 0, 0);\n transform: scale3d(.475, .475, .475) translate3d(42px, 0, 0);\n }\n\n 100% {\n opacity: 0;\n -webkit-transform: scale(.1) translate3d(-2000px, 0, 0);\n transform: scale(.1) translate3d(-2000px, 0, 0);\n -webkit-transform-origin: left center;\n transform-origin: left center;\n }\n}\n\n@keyframes zoomOutLeft {\n 40% {\n opacity: 1;\n -webkit-transform: scale3d(.475, .475, .475) translate3d(42px, 0, 0);\n transform: scale3d(.475, .475, .475) translate3d(42px, 0, 0);\n }\n\n 100% {\n opacity: 0;\n -webkit-transform: scale(.1) translate3d(-2000px, 0, 0);\n transform: scale(.1) translate3d(-2000px, 0, 0);\n -webkit-transform-origin: left center;\n transform-origin: left center;\n }\n}\n\n.zoomOutLeft {\n -webkit-animation-name: zoomOutLeft;\n animation-name: zoomOutLeft;\n}\n\n@-webkit-keyframes zoomOutRight {\n 40% {\n opacity: 1;\n -webkit-transform: scale3d(.475, .475, .475) translate3d(-42px, 0, 0);\n transform: scale3d(.475, .475, .475) translate3d(-42px, 0, 0);\n }\n\n 100% {\n opacity: 0;\n -webkit-transform: scale(.1) translate3d(2000px, 0, 0);\n transform: scale(.1) translate3d(2000px, 0, 0);\n -webkit-transform-origin: right center;\n transform-origin: right center;\n }\n}\n\n@keyframes zoomOutRight {\n 40% {\n opacity: 1;\n -webkit-transform: scale3d(.475, .475, .475) translate3d(-42px, 0, 0);\n transform: scale3d(.475, .475, .475) translate3d(-42px, 0, 0);\n }\n\n 100% {\n opacity: 0;\n -webkit-transform: scale(.1) translate3d(2000px, 0, 0);\n transform: scale(.1) translate3d(2000px, 0, 0);\n -webkit-transform-origin: right center;\n transform-origin: right center;\n }\n}\n\n.zoomOutRight {\n -webkit-animation-name: zoomOutRight;\n animation-name: zoomOutRight;\n}\n\n@-webkit-keyframes zoomOutUp {\n 40% {\n opacity: 1;\n -webkit-transform: scale3d(.475, .475, .475) translate3d(0, 60px, 0);\n transform: scale3d(.475, .475, .475) translate3d(0, 60px, 0);\n -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);\n animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);\n }\n\n 100% {\n opacity: 0;\n -webkit-transform: scale3d(.1, .1, .1) translate3d(0, -2000px, 0);\n transform: scale3d(.1, .1, .1) translate3d(0, -2000px, 0);\n -webkit-transform-origin: center bottom;\n transform-origin: center bottom;\n -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);\n animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);\n }\n}\n\n@keyframes zoomOutUp {\n 40% {\n opacity: 1;\n -webkit-transform: scale3d(.475, .475, .475) translate3d(0, 60px, 0);\n transform: scale3d(.475, .475, .475) translate3d(0, 60px, 0);\n -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);\n animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);\n }\n\n 100% {\n opacity: 0;\n -webkit-transform: scale3d(.1, .1, .1) translate3d(0, -2000px, 0);\n transform: scale3d(.1, .1, .1) translate3d(0, -2000px, 0);\n -webkit-transform-origin: center bottom;\n transform-origin: center bottom;\n -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);\n animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);\n }\n}\n\n.zoomOutUp {\n -webkit-animation-name: zoomOutUp;\n animation-name: zoomOutUp;\n}\n\n@-webkit-keyframes slideInDown {\n 0% {\n -webkit-transform: translateY(-100%);\n transform: translateY(-100%);\n visibility: visible;\n }\n\n 100% {\n -webkit-transform: translateY(0);\n transform: translateY(0);\n }\n}\n\n@keyframes slideInDown {\n 0% {\n -webkit-transform: translateY(-100%);\n transform: translateY(-100%);\n visibility: visible;\n }\n\n 100% {\n -webkit-transform: translateY(0);\n transform: translateY(0);\n }\n}\n\n.slideInDown {\n -webkit-animation-name: slideInDown;\n animation-name: slideInDown;\n}\n\n@-webkit-keyframes slideInLeft {\n 0% {\n -webkit-transform: translateX(-100%);\n transform: translateX(-100%);\n visibility: visible;\n }\n\n 100% {\n -webkit-transform: translateX(0);\n transform: translateX(0);\n }\n}\n\n@keyframes slideInLeft {\n 0% {\n -webkit-transform: translateX(-100%);\n transform: translateX(-100%);\n visibility: visible;\n }\n\n 100% {\n -webkit-transform: translateX(0);\n transform: translateX(0);\n }\n}\n\n.slideInLeft {\n -webkit-animation-name: slideInLeft;\n animation-name: slideInLeft;\n}\n\n@-webkit-keyframes slideInRight {\n 0% {\n -webkit-transform: translateX(100%);\n transform: translateX(100%);\n visibility: visible;\n }\n\n 100% {\n -webkit-transform: translateX(0);\n transform: translateX(0);\n }\n}\n\n@keyframes slideInRight {\n 0% {\n -webkit-transform: translateX(100%);\n transform: translateX(100%);\n visibility: visible;\n }\n\n 100% {\n -webkit-transform: translateX(0);\n transform: translateX(0);\n }\n}\n\n.slideInRight {\n -webkit-animation-name: slideInRight;\n animation-name: slideInRight;\n}\n\n@-webkit-keyframes slideInUp {\n 0% {\n -webkit-transform: translateY(100%);\n transform: translateY(100%);\n visibility: visible;\n }\n\n 100% {\n -webkit-transform: translateY(0);\n transform: translateY(0);\n }\n}\n\n@keyframes slideInUp {\n 0% {\n -webkit-transform: translateY(100%);\n transform: translateY(100%);\n visibility: visible;\n }\n\n 100% {\n -webkit-transform: translateY(0);\n transform: translateY(0);\n }\n}\n\n.slideInUp {\n -webkit-animation-name: slideInUp;\n animation-name: slideInUp;\n}\n\n@-webkit-keyframes slideOutDown {\n 0% {\n -webkit-transform: translateY(0);\n transform: translateY(0);\n }\n\n 100% {\n visibility: hidden;\n -webkit-transform: translateY(100%);\n transform: translateY(100%);\n }\n}\n\n@keyframes slideOutDown {\n 0% {\n -webkit-transform: translateY(0);\n transform: translateY(0);\n }\n\n 100% {\n visibility: hidden;\n -webkit-transform: translateY(100%);\n transform: translateY(100%);\n }\n}\n\n.slideOutDown {\n -webkit-animation-name: slideOutDown;\n animation-name: slideOutDown;\n}\n\n@-webkit-keyframes slideOutLeft {\n 0% {\n -webkit-transform: translateX(0);\n transform: translateX(0);\n }\n\n 100% {\n visibility: hidden;\n -webkit-transform: translateX(-100%);\n transform: translateX(-100%);\n }\n}\n\n@keyframes slideOutLeft {\n 0% {\n -webkit-transform: translateX(0);\n transform: translateX(0);\n }\n\n 100% {\n visibility: hidden;\n -webkit-transform: translateX(-100%);\n transform: translateX(-100%);\n }\n}\n\n.slideOutLeft {\n -webkit-animation-name: slideOutLeft;\n animation-name: slideOutLeft;\n}\n\n@-webkit-keyframes slideOutRight {\n 0% {\n -webkit-transform: translateX(0);\n transform: translateX(0);\n }\n\n 100% {\n visibility: hidden;\n -webkit-transform: translateX(100%);\n transform: translateX(100%);\n }\n}\n\n@keyframes slideOutRight {\n 0% {\n -webkit-transform: translateX(0);\n transform: translateX(0);\n }\n\n 100% {\n visibility: hidden;\n -webkit-transform: translateX(100%);\n transform: translateX(100%);\n }\n}\n\n.slideOutRight {\n -webkit-animation-name: slideOutRight;\n animation-name: slideOutRight;\n}\n\n@-webkit-keyframes slideOutUp {\n 0% {\n -webkit-transform: translateY(0);\n transform: translateY(0);\n }\n\n 100% {\n visibility: hidden;\n -webkit-transform: translateY(-100%);\n transform: translateY(-100%);\n }\n}\n\n@keyframes slideOutUp {\n 0% {\n -webkit-transform: translateY(0);\n transform: translateY(0);\n }\n\n 100% {\n visibility: hidden;\n -webkit-transform: translateY(-100%);\n transform: translateY(-100%);\n }\n}\n\n.slideOutUp {\n -webkit-animation-name: slideOutUp;\n animation-name: slideOutUp;\n}\n",".btn {\n $btn-top-clr: #FAFAFA;\n $btn-bottom-clr: #EFF1F3;\n border:1px solid #E0E3E9;\n display:inline-block;\n border-radius: 2px;\n box-shadow: inset 0 1px 0 white, 0 1px 0 rgba($border-clr,0.5);\n @include linear-gradient($btn-top-clr, $btn-bottom-clr);\n font-size: em(12px);\n font-weight:600;\n color: $text-2-clr;\n text-decoration:none;\n padding: em(8px) em(15px);\n &:hover {\n @include linear-gradient(lighten($btn-top-clr,0.5%), lighten($btn-bottom-clr,1%));\n }\n &.disabled {\n cursor:default;\n opacity: 0.5;\n &:active {\n box-shadow: inset 0 1px 0 white, 0 1px 1px rgba(black, 0.1);\n }\n }\n &.danger {\n color: $red-clr;\n }\n &:focus {\n outline:0;\n }\n &:active {\n box-shadow: inset 0 0 2px rgba(black, 0.1);\n }\n}\n","form {\n margin:0;\n &.ng-submitted {\n .ng-invalid {\n border-color: $pink-clr !important;\n }\n }\n}\n\n.form-container {\n width:100%;\n}\n\n.form-row {\n @include row();\n margin-bottom:10px;\n @include user-select(none);\n}\n\n.form-col {\n @include span-columns(6);\n &.padded {\n &:first-child {\n padding: 0 20px 0 0;\n }\n &:last-child {\n padding: 0 0 0 20px;\n }\n }\n}\n\n.form-group {\n & > label {\n font-size:em(12px);\n color: $text-3-clr;\n display:inline-block;\n line-height:em(30px);\n\n }\n .form-error {\n font-size: em(12px);\n color: $red-clr;\n float: right;\n img {\n vertical-align:bottom;\n margin-right: 3px;\n }\n }\n &.optional > label:after {\n content: \" (optional)\";\n }\n &.error {\n input.form-control, textarea.form-control {\n\n border-color: $pink-clr;\n background: rgba($pink-clr,0.02);\n }\n }\n input.form-control, textarea.form-control {\n border-radius: 3px;\n border: 1px solid $border-clr;\n font-size:em(18px);\n @include transition(border-color 0.1s ease-in-out);\n &:focus {\n border-color: $blue-clr;\n box-shadow: 0 0 3px rgba($blue-clr, 0.5);\n outline:none;\n background: white;\n }\n &.extend {\n width:100%;\n }\n @include placeholder {\n color: rgba($text-3-clr,0.7);\n }\n }\n .form-btn {\n padding: em(12px) em(15px);\n }\n input.form-control {\n vertical-align:middle;\n padding: em(5px) em(10px);\n }\n\n textarea.form-control {\n min-height: 135px;\n font-size: em(18px);\n padding: em(8px) em(10px);\n }\n\n}\n\n\n.form-submit-message {\n display:inline-block;\n margin-left: em(5px);\n font-size: em(12px);\n &.error {\n color: $red-clr;\n }\n img {\n vertical-align:middle;\n margin-right: em(5px);\n }\n}\n","/// Designates the element as a row of columns in the grid layout. It clears the floats on the element and sets its display property. Rows can't be nested, but there can be more than one row element—with different display properties—per layout.\n///\n/// @param {String} $display (default)\n/// Sets the display property of the element and the display context that will be used by its children. Can be `block` or `table`.\n///\n/// @param {String} $direction ($default-layout-direction)\n/// Sets the layout direction. Can be `LTR` (left-to-right) or `RTL` (right-to-left).\n///\n/// @example scss - Usage\n/// .element {\n/// @include row();\n/// }\n///\n/// @example css - CSS Output\n/// .element {\n/// *zoom: 1;\n/// display: block;\n/// }\n///\n/// .element:before, .element:after {\n/// content: \" \";\n/// display: table;\n/// }\n///\n/// .element:after {\n/// clear: both;\n/// }\n\n@mixin row($display: default, $direction: $default-layout-direction) {\n @if $direction != $default-layout-direction {\n @include -neat-warn(\"The $direction argument will be deprecated in future versions in favor of the direction(){...} mixin.\");\n }\n\n $layout-direction: $direction !global;\n\n @if $display != default {\n @include -neat-warn(\"The $display argument will be deprecated in future versions in favor of the display(){...} mixin.\");\n }\n\n @if $display == table {\n display: table;\n @include fill-parent;\n table-layout: fixed;\n $container-display-table: true !global;\n }\n\n @else {\n @include clearfix;\n display: block;\n $container-display-table: false !global;\n }\n}\n\n","// Modern micro clearfix provides an easy way to contain floats without adding additional markup.\n//\n// Example usage:\n//\n// // Contain all floats within .wrapper\n// .wrapper {\n// @include clearfix;\n// .content,\n// .sidebar {\n// float : left;\n// }\n// }\n\n@mixin clearfix {\n &:after {\n content:\"\";\n display:table;\n clear:both;\n }\n}\n\n// Acknowledgements\n// Beat *that* clearfix: [Thierry Koblentz](http://www.css-101.org/articles/clearfix/latest-new-clearfix-so-far.php)\n","/// Specifies the number of columns an element should span. If the selector is nested the number of columns of its parent element should be passed as an argument as well.\n///\n/// @param {List} $span\n/// A list containing `$columns`, the unitless number of columns the element spans (required), and `$container-columns`, the number of columns the parent element spans (optional).\n///\n/// If only one value is passed, it is assumed that it's `$columns` and that that `$container-columns` is equal to `$grid-columns`, the total number of columns in the grid.\n///\n/// The values can be separated with any string such as `of`, `/`, etc.\n///\n/// @param {String} $display (block)\n/// Sets the display property of the element. By default it sets the display propert of the element to `block`.\n///\n/// If passed `block-collapse`, it also removes the margin gutter by adding it to the element width.\n///\n/// If passed `table`, it sets the display property to `table-cell` and calculates the width of the element without taking gutters into consideration. The result does not align with the block-based grid.\n///\n/// @example scss - Usage\n/// .element {\n/// @include span-columns(6);\n///\n/// .nested-element {\n/// @include span-columns(2 of 6);\n/// }\n/// }\n///\n/// @example css - CSS Output\n/// .element {\n/// display: block;\n/// float: left;\n/// margin-right: 2.35765%;\n/// width: 48.82117%;\n/// }\n///\n/// .element:last-child {\n/// margin-right: 0;\n/// }\n///\n/// .element .nested-element {\n/// display: block;\n/// float: left;\n/// margin-right: 4.82916%;\n/// width: 30.11389%;\n/// }\n///\n/// .element .nested-element:last-child {\n/// margin-right: 0;\n/// }\n\n@mixin span-columns($span: $columns of $container-columns, $display: block) {\n $columns: nth($span, 1);\n $container-columns: container-span($span);\n\n $parent-columns: get-parent-columns($container-columns) !global;\n\n $direction: get-direction($layout-direction, $default-layout-direction);\n $opposite-direction: get-opposite-direction($direction);\n\n $display-table: is-display-table($container-display-table, $display);\n\n @if $display-table {\n display: table-cell;\n width: percentage($columns / $container-columns);\n } @else {\n float: #{$opposite-direction};\n\n @if $display != no-display {\n display: block;\n }\n\n @if $display == collapse {\n @include -neat-warn(\"The 'collapse' argument will be deprecated. Use 'block-collapse' instead.\");\n }\n\n @if $display == collapse or $display == block-collapse {\n width: flex-grid($columns, $container-columns) + flex-gutter($container-columns);\n\n &:last-child {\n width: flex-grid($columns, $container-columns);\n }\n\n } @else {\n margin-#{$direction}: flex-gutter($container-columns);\n width: flex-grid($columns, $container-columns);\n\n &:last-child {\n margin-#{$direction}: 0;\n }\n }\n }\n}\n","@mixin placeholder {\n $placeholders: \":-webkit-input\" \":-moz\" \"-moz\" \"-ms-input\";\n @each $placeholder in $placeholders {\n &:#{$placeholder}-placeholder {\n @content;\n }\n }\n}\n","$box-v-pad: 20px;\n$box-h-pad: 25px;\n\n.box {\n background: white;\n border: 1px solid $border-clr;\n border-radius: 3px;\n margin: 0 auto 20px auto;\n max-width: 800px;\n padding: $box-v-pad $box-h-pad;\n box-shadow: 0 0 1px $border-clr;\n &.box-x-scroll {\n overflow-x: scroll;\n }\n &.invisible {\n background: transparent;\n border:0;\n padding: 0;\n margin-bottom:40px;\n }\n &.highlight {\n border-color: $blue-clr;\n box-shadow: 0 0 3px rgba($blue-clr, 0.5);\n }\n &:last-child {\n margin-bottom: 40px;\n }\n}\n\n.box-title {\n font-size: 24px;\n font-weight: bold;\n color: $text-clr;\n margin-bottom:20px;\n}\n\n.box-description {\n font-size: 14px;\n color: $text-2-clr;\n padding-bottom: 20px;\n border-bottom: 1px solid $border-clr;\n margin-top: -20px;\n margin-bottom: 20px;\n a {\n color: $text-clr;\n text-decoration:none;\n &:hover {\n border: 1px solid $border-clr;\n }\n }\n}\n.box-section {\n padding-top: 20px;\n @include row;\n .section-details {\n @include span-columns(3);\n .section-title {\n font-size: em(14px);\n color: $text-2-clr;\n margin-bottom:20px;\n }\n }\n .section-main {\n @include span-columns(9);\n }\n}\n\n.box-message {\n text-align:center;\n padding:40px;\n max-width:450px;\n margin:0 auto;\n .main-image {\n margin-bottom: 20px;\n }\n .title {\n font-weight: bold;\n font-size: em(24px);\n color: $text-clr;\n margin-bottom: em(10px);\n }\n .content {\n font-size: em(14px);\n color: $text-2-clr;\n margin-bottom: 20px;\n }\n .mini-divider:after {\n content: \"\";\n display:inline-block;\n width:200px;\n height:1px;\n background: $border-clr;\n margin:20px auto;\n\n }\n}\n\n.box-side-sticky {\n padding: $box-v-pad $box-h-pad;\n box-sizing: content-box;\n width: 100%;\n margin-left: $box-h-pad * -1;\n\n}\n\n.box-bottom-sticky {\n padding: $box-v-pad $box-h-pad;\n box-sizing: content-box;\n width: 100%;\n margin-top:20px;\n border-bottom-left-radius: 3px;\n border-bottom-right-radius: 3px;\n border-top: 1px solid $border-clr;\n margin-bottom: $box-v-pad * -1;\n margin-left: $box-h-pad * -1;\n}\n\n.box-controls {\n text-align: right;\n box-shadow: inset 0 1px 0 white;\n background: lighten($background-clr, 1%);\n margin-top: $box-v-pad;\n padding: 15px $box-h-pad;\n}\n",".ng-submitted .ng-invalid > .datepicker {\n border-color: $pink-clr;\n}\n.datepicker {\n width:100%;\n border:1px solid rgba($border-clr, 0.5);\n border-radius: 3px;\n background:white;\n padding: em(10px);\n @include transition(border-color 0.1s ease-in-out);\n table {\n width:100%;\n font-size: em($em-base);\n }\n thead {\n\n }\n tbody {\n &:before {\n content: '';\n display:block;\n height: em(10px);\n }\n }\n .prev, .next {\n opacity: 0.5;\n color: $text-2-clr;\n cursor: pointer;\n border-radius:5px;\n position:relative;\n &:hover {\n opacity: 1;\n &:after {\n opacity: 1;\n background: rgba($border-clr, 0.3);\n }\n }\n &:after {\n content: \" \";\n cursor:pointer;\n opacity: 0;\n position:absolute;\n $size: em(28px);\n width:$size;\n height:$size;\n margin-left:$size * -0.5;\n margin-top:$size * -0.5;\n left:50%;\n top:50%;\n border-radius:3px;\n @include transition(background-color 0.1s ease-in-out);\n }\n }\n .datepicker-switch {\n padding: 10px;\n font-weight:600;\n font-size:em(18px);\n border-radius: 3px;\n cursor: pointer;\n @include transition(background-color 0.1s ease-in-out);\n &:hover {\n background: rgba($border-clr, 0.4);\n }\n }\n .dow {\n padding:10px;\n font-weight:normal;\n text-transform: uppercase;\n color: $pink-clr;\n font-size: em(14px);\n border-bottom: 2px solid rgba($border-clr, 0.3);\n }\n .dow, .day {\n padding:em(15px);\n }\n .day {\n text-align:center;\n font-weight:600;\n position:relative;\n font-size:em(14px);\n &.today {\n color:#818176;\n &:after {\n opacity:1;\n background: rgba(yellow, 0.1);\n }\n }\n &:hover {\n &:after {\n opacity:1;\n background: rgba($border-clr,0.4);\n }\n cursor: pointer;\n }\n &.new, &.old {\n font-weight:normal;\n color: $text-3-clr;\n }\n &.active {\n background:white;\n color: $green-clr;\n &:after {\n opacity:1;\n background: rgba($green-clr,0.1);\n }\n }\n &:active {\n &:after {\n opacity: 0.8;\n }\n }\n &:after {\n content: \" \";\n @include transition(all 0.1s ease-in-out);\n cursor:pointer;\n opacity: 0;\n position:absolute;\n $size: em(40px);\n width:$size;\n height:$size;\n margin-left:$size * -0.5;\n margin-top:$size * -0.5;\n left:50%;\n top:50%;\n border-radius: 3px;\n }\n }\n .month, .year {\n width: 33.3%;\n display:inline-block;\n text-align:center;\n font-size: em(14px);\n padding:em(20px);\n cursor:pointer;\n @include transition(background-color 0.1s ease-in-out);\n border-radius: 3px;\n text-transform: uppercase;\n &:hover {\n background: rgba($border-clr, 0.3);\n }\n }\n}\n\n.daticon-list {\n margin:0;\n margin-left:-10px;\n list-style:none;\n padding:5px;\n text-align:left;\n .placeholder {\n line-height: em(18px);\n font-size: em(12px);\n color: #ccc;\n }\n li {\n margin: 5px;\n display:inline-block;\n }\n}\n\n.daticon {\n box-shadow: 0 0 0 1px rgba($border-clr,0.5);\n border-radius: 3px;\n display:inline-block;\n padding:em(8px) em(16px);\n text-align:center;\n position:relative;\n cursor:default;\n background:white;\n .dow {\n font-size: em(6px);\n margin-top:em(-24px);\n background:white;\n color: $text-3-clr;\n margin-bottom: em(4px);\n font-weight:normal;\n text-transform: uppercase;\n }\n .day {\n font-size: em(20px);\n font-weight:normal;\n color: $pink-clr;\n line-height: em(16px);\n }\n .month {\n font-weight: 600;\n font-size: em(12px);\n text-transform: uppercase;\n }\n .delete {\n text-align:center;\n border:0;\n $size: 18px;\n width: em($size);\n height: em($size);\n position:absolute;\n top: $size * -0.4;\n right: $size * -0.4;\n border-radius:100%;\n display:inline-block;\n background: rgba($border-clr, 0.5) url(../images/close@2x.png) no-repeat center center;\n background-size: 7px 8px;\n cursor:pointer;\n opacity:0;\n &:hover {\n background-color: rgba($border-clr, 0.8)\n }\n }\n .count {\n text-align:center;\n border:0;\n $size: 18px;\n width: $size;\n height: $size;\n position:absolute;\n top: $size * -0.4;\n right: $size * -0.4;\n border-radius:100%;\n font-weight:bold;\n display:inline-block;\n background: darken($border-clr, 10%);\n color:white;\n font-size: 9px;\n line-height: $size;\n @include transition(background-color 0.2s ease-in-out);\n &.top {\n background: $orangered-clr;\n }\n\n }\n &:hover {\n .delete {\n opacity: 1;\n }\n }\n}\n",".rl-modal {\n background:white;\n position: fixed;\n top: 50%;\n left: 50%;\n width: 50%;\n max-width: 400px;\n display:inline-block;\n min-width: 200px;\n height: auto;\n z-index: 2000;\n overflow:hidden;\n border-radius: 5px;\n box-shadow: 0 0 0 1px $border-clr, 0 0 0 5px rgba($border-clr,0.5);\n @include transform(translateX(-50%) translateY(-50%));\n .rl-modal-message {\n padding: 0 20px 20px 20px;\n font-size: em(12px);\n color: $text-2-clr;\n }\n .rl-modal-title {\n padding:20px 20px 0 20px;\n font-size: em(18px);\n font-weight: bold;\n }\n .rl-modal-actions {\n border-top:1px solid $border-clr;\n box-shadow: inset 0 1px 0 white;\n background: lighten($background-clr,1%);\n text-align:right;\n padding: em(10px) em(20px);\n }\n}\n\n.rl-modal-overlay {\n position:fixed;\n z-index: 1999;\n top:0;\n left:0;\n width:100%;\n height:100%;\n background:rgba(black,0.1);\n\n}\n","$actions-col-width : 160px;\n$date-col-width: 70px;\n$name-col-width: 235px;\n\n.poll {\n min-width: 100%;\n display:block;\n margin-bottom:20px;\n}\n\n.poll-header {\n display:table;\n min-width: 100%;\n border-bottom:1px solid $border-clr;\n box-shadow: 0 3px 0 rgba($border-clr, 0.3);\n .header {\n display:table-cell;\n vertical-align:bottom;\n padding-bottom:20px;\n &.date-header {\n text-align:center;\n min-width: $date-col-width;\n width: $date-col-width;\n }\n &.actions-header {\n min-width: $actions-col-width;\n }\n &.participants-header {\n font-weight: bold;\n min-width: $name-col-width;\n width: $name-col-width;\n padding-left: em(10px);\n }\n }\n}\n\n.poll-body {\n min-width:100%;\n\n .poll-entry.highlight {\n background: lighten($border-clr,10%);\n }\n .poll-entry {\n display:table;\n min-width: 100%;\n border-bottom: 1px solid rgba($border-clr,0.5);\n .hover {\n visibility:hidden;\n }\n &:hover {\n .hover {\n visibility: visible;\n }\n }\n .cell {\n padding: em(10px);\n display:table-cell;\n height: 50px;\n vertical-align:middle;\n &.name-cell {\n min-width: $name-col-width;\n width: $name-col-width;\n font-size: em(14px);\n .avatar {\n display:inline-block;\n padding: 5px;\n margin-right: 5px;\n border-radius: 2px;\n background: #D0D5DF;\n @for $i from 0 to length($color-collection) {\n &.style-#{$i + 1} {\n background: nth($color-collection, $i+1);\n }\n }\n }\n .name {\n padding: 5px 3px;\n margin-left: 2px;\n border-radius: 2px;\n &:hover {\n background: $background-clr;\n cursor: pointer;\n }\n }\n .form-control {\n border:1px solid $border-clr;\n padding: em(5px);\n border-radius: 2px;\n color: $text-clr;\n &:focus {\n outline:0;\n border-color: $blue-clr;\n box-shadow: 0 0 3px rgba($blue-clr, 0.5);\n }\n @include placeholder {\n color: rgba($text-2-clr,0.7);\n }\n }\n }\n &.action-cell {\n min-width: $actions-col-width;\n }\n &.vote-cell {\n min-width: $date-col-width;\n width: $date-col-width;\n text-align:center;\n position: relative;\n .overlay {\n position: absolute;\n top:0;\n left: 0;\n width: 100%;\n height: 100%;\n z-index: 10;\n &:hover {\n background: rgba($border-clr, 0.2);\n cursor: pointer;\n }\n }\n }\n }\n &.ng-submitted {\n .ng-invalid {\n border-color: $pink-clr !important;\n }\n }\n }\n}\n","$tag-font-size: 14px;\n\ntags-input {\n display: block;\n}\ntags-input *, tags-input *:before, tags-input *:after {\n -moz-box-sizing: border-box;\n -webkit-box-sizing: border-box;\n box-sizing: border-box;\n}\ntags-input .host {\n position: relative;\n margin-top: 5px;\n margin-bottom: 5px;\n &:focus {\n outline:0;\n }\n}\ntags-input .host:active {\n outline: none;\n}\n\ntags-input .tags {\n padding: 4px;\n overflow: hidden;\n word-wrap: break-word;\n cursor: text;\n border-radius: 3px;\n background-color: white;\n border: 1px solid $border-clr;\n @include transition(border-color 0.1s ease-in-out);\n}\ntags-input .tags.focused {\n outline: none;\n}\n\ntags-input .tags .tag-list {\n margin: 0;\n padding: 0;\n list-style-type: none;\n}\ntags-input .tags .tag-item {\n margin: 2px;\n padding: 0 8px;\n display: inline-block;\n float: left;\n font-size: em($tag-font-size);\n height: 26px;\n line-height: 25px;\n border-radius: 1px;\n background:#E5EBF2;\n color: #7587A1;\n box-shadow:0 0 0 1px #CBD4E2;\n}\ntags-input .tags .tag-item.selected {\n background: $red-clr;\n color: white;\n box-shadow: none;\n}\ntags-input .tags .tag-item .remove-button {\n margin: 0 0 0 5px;\n padding: 0;\n border: none;\n background: none;\n color: inherit;\n cursor: pointer;\n vertical-align: middle;\n font: bold em(16px) Arial, sans-serif;\n}\n\ntags-input .tags .input {\n border: 0;\n outline: none;\n margin: 2px;\n padding: 0;\n padding-left: 8px;\n float: left;\n height: 26px;\n font-size: em($tag-font-size);\n @include placeholder {\n color: $text-3-clr;\n }\n}\n\ntags-input .tags .input.invalid-tag {\n color: $red-clr;\n}\n\ntags-input .tags .input::-ms-clear {\n display: none;\n}\n\ntags-input.ng-invalid .tags {\n // highlight tags when model is invalid\n}\n",".dropdown {\n position:relative;\n cursor: pointer;\n .dropdown-menu {\n position: absolute;\n display:none;\n z-index: 1000;\n float:left;\n min-width:160px;\n max-width: 180px;\n padding: 5px;\n text-align:left;\n left:0;\n }\n &.open .dropdown-menu {\n display: block;\n }\n .dropdown-toggle {\n &:after {\n content: \"\";\n width: 6px;\n height: 4px;\n margin-left: 10px;\n display:inline-block;\n background-image: url(\"../images/dropdown_arrow.png\");\n background-size: 6px 4px;\n background-repeat:no-repeat;\n }\n }\n}\n",".comments-info {\n font-weight: bold;\n padding-bottom: 10px;\n border-bottom: 2px solid $border-clr;\n}\n\n.comment-form {\n @include row;\n margin-bottom: 20px;\n margin-top:20px;\n padding: 0 10px;\n .avatar-section {\n @include span-columns(1);\n img {\n border-radius: 3px;\n max-width: 100%;\n }\n }\n .input-section {\n @include span-columns(11);\n }\n .content-section {\n margin-bottom:10px;\n }\n .name-section {\n position:relative;\n margin-bottom: 10px;\n }\n .form-control {\n font-size: em(14px) !important;\n border-width: 2px !important;\n }\n textarea.form-control {\n min-height: 0;\n min-width: 100%;\n }\n}\n\n.comments-placeholder {\n color: $text-3-clr;\n text-align:center;\n}\n\n.comment-thread {\n list-style:none;\n margin:0;\n padding:0;\n margin-bottom: 20px;\n max-height: 500px;\n overflow-y: scroll;\n .comment {\n @include row;\n padding: 10px;\n .avatar-section {\n @include span-columns(1);\n img {\n max-width: 100%;\n border-radius: 3px;\n }\n }\n .comment-section {\n @include span-columns(11);\n position:relative;\n .comment-delete {\n opacity:0;\n text-decoration:none;\n color:white;\n background-color: $border-clr;\n color: $text-3-clr;\n border-radius: 2px;\n display:inline-block;\n position:absolute;\n right:0;\n top:0;\n font-size: em(14px);\n $cd-size: em(16px);\n width: $cd-size;\n height: $cd-size;\n line-height: $cd-size;\n text-align: center;\n &:hover {\n background: $red-clr;\n color: white;\n }\n &:active {\n background: darken($red-clr, 5%);\n }\n }\n .meta {\n font-size: em(13px);\n color: $text-2-clr;\n margin-bottom: 5px;\n }\n .name {\n color: $text-2-clr;\n font-weight: 600;\n }\n .time:before {\n content: \" \";\n display: inline-block;\n height: 4px;\n width: 4px;\n background: $text-3-clr;\n margin: 0 5px 2px 5px;\n border-radius: 100%;\n }\n .content {\n font-size: em(14px);\n margin-bottom: 5px;\n white-space: pre-wrap;\n margin-right: 100px;\n }\n .actions {\n opacity:0.8;\n a {\n color: $text-2-clr;\n font-size: em(12px);\n text-decoration: none;\n &:hover {\n color: $blue-clr;\n }\n }\n }\n }\n &:hover {\n background: $background-clr;\n cursor:default;\n border-radius: 3px;\n .name {\n color: $blue-clr;\n }\n .comment-delete {\n opacity: 1;\n }\n }\n }\n}\n",".switch-row {\n display:table;\n width: 100%;\n margin-bottom: 20px;\n padding-bottom: 20px;\n border-bottom: 1px solid $border-clr;\n &:last-child {\n border:0;\n }\n .switch-details {\n display:table-cell;\n .title {\n font-size: em(14px);\n font-weight: bold;\n }\n .description {\n font-size: em(12px);\n color: $text-2-clr;\n }\n }\n .switch {\n display:table-cell;\n text-align:right;\n min-width: 150px;\n vertical-align:middle;\n .switch-value {\n font-size: em(12px);\n color: $text-2-clr;\n display:inline-block;\n vertical-align:middle;\n\n }\n }\n}\n\n.switch-toggle {\n display:inline-block;\n margin-left: 5px;\n height: 20px;\n width: 40px;\n border-radius: 20px;\n vertical-align:middle;\n position:relative;\n cursor:pointer;\n background: $red-clr;\n box-shadow: inset 0 0 0 1px rgba(black,0.1);\n @include transition(all 0.1s ease-in-out);\n $tog-size: 16px;\n &:after {\n content: \" \";\n @include transition(all 0.1s ease-in-out);\n display:inline-block;\n height: $tog-size;\n width: $tog-size;\n position: absolute;\n $btn-top-clr: #FAFAFA;\n $btn-bottom-clr: #EFF1F3;\n box-shadow: inset 0 1px 0 white, 0 1px 1px rgba(black, 0.1);\n @include linear-gradient($btn-top-clr, $btn-bottom-clr);\n top: 50%;\n margin-top: ($tog-size / 2) * -1;\n left: 2px;\n border-radius: 100px;\n }\n &:hover {\n box-shadow:inset 0 0 0 1px rgba(black,0.1), inset 0 0 0 8px rgba(black,0.05); \n }\n &.active {\n background: $green-clr;\n &:after {\n left: 100%;\n margin-left: ($tog-size * -1) - 2;\n }\n }\n}\n",".notification {\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n z-index: 3000;\n padding: 12px 40px;\n background: $text-2-clr;\n color: white;\n @include transition(all 0.3s ease-in-out);\n &.success {\n background: $green-clr;\n }\n &.error {\n background: $red-clr;\n }\n &.ng-enter {\n top: -100px;\n opacity:0;\n }\n &.ng-enter-active {\n top:0;\n opacity:1;\n }\n &.ng-leave-active {\n top:-100px;\n opacity:1;\n }\n .title {\n font-size: em(14px);\n margin-bottom: 2px;\n }\n .message {\n font-size: em(12px);\n color: rgba(white, 0.8);\n }\n .close {\n position: absolute;\n top: 5px;\n right:10px;\n color: white;\n text-decoration:none;\n\n }\n}\n",".page-placeholder {\n margin:0 auto;\n text-align:center;\n color:#B0B8C4;\n position:absolute;\n top:50%;\n left: 50%;\n @include transform(translateX(-50%) translateY(-50%));\n .image {\n margin-bottom:20px;\n }\n .title {\n font-size: em(36px);\n font-weight: bold;\n margin-bottom: 20px;\n }\n .content {\n font-size: em(14px);\n max-width: 320px;\n font-weight: normal;\n margin-bottom: 20px;\n }\n}\n",".event-description {\n font-size: em(14px);\n white-space: pre-wrap;\n padding-top:20px;\n padding-bottom: 20px;\n line-height:em(24px);\n color: $text-2-clr;\n background: $background-clr;\n border-top: 1px solid $border-clr;\n margin-top: 20px;\n margin-bottom:-20px;\n}\n\n.event-location {\n font-size: em(14px);\n a {\n color: $text-clr;\n text-decoration:none;\n &:hover {\n text-decoration:underline;\n }\n }\n img {\n vertical-align:middle;\n margin-right: 10px;\n }\n}\n\n\n.event-pair {\n margin-bottom: 20px;\n border-bottom: 1px solid $border-clr;\n padding-bottom: 20px;\n float: left;\n width: 100%;\n .icon {\n display:inline-block;\n width: 30px;\n float:left;\n position: relative;\n text-align:center;\n height: 35px;\n border-radius: 3px;\n margin-right: 10px;\n img {\n position: absolute;\n top:50%;\n left: 50%;\n @include transform(translateX(-50%) translateY(-50%));\n }\n }\n .content {\n float:left;\n display:inline-block;\n }\n .key {\n font-weight:bold;\n font-size: 11px;\n }\n .value {\n color: $text-2-clr;\n }\n}\n\n.event-header {\n width: 100%;\n margin-top: -30px;\n .avatar {\n display:inline-block;\n margin-right: 20px;\n text-align: center;\n border-radius: 1px;\n box-shadow: 0 0 0 5px white, 0 0 0 6px $border-clr, inset 0 0 0 1px $border-clr;\n padding: 20px;\n background:$background-clr;\n vertical-align: bottom;\n }\n .details {\n display:inline-block;\n .title {\n font-size: em(24px);\n font-weight: bold;\n .title-label {\n font-size: 11px;\n font-weight: normal;\n margin-left: 5px;\n position: relative;\n top: -3px;\n background: $text-2-clr;\n color:white;\n padding: 3px 10px;\n border-radius: 20px;\n &.success {\n background: $green-clr;\n }\n &.danger {\n background: $orangered-clr;\n }\n }\n }\n .subtitle {\n color: $text-2-clr;\n font-size: em(14px);\n a {\n color: $blue-clr;\n text-decoration: none;\n &:hover {\n text-decoration: underline;\n }\n }\n }\n }\n .actions {\n visibility:hidden;\n float: right;\n margin-top: 30px;\n }\n &:hover {\n .actions {\n visibility:visible;\n }\n }\n}\n"],"sourceRoot":"/source/"} \ No newline at end of file diff --git a/public/images/avatar.png b/public/images/avatar.png new file mode 100644 index 0000000000000000000000000000000000000000..a20fd8a807d3223c7f51ade8f9968afecc55227a GIT binary patch literal 1450 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 a5%@oP-mc1f5H@E30000 count) return false; - } - return true; - } - scope.selectedDate = function(index){ - datesCount[index] = 0; - for (var i = 0; i < scope.event.participants.length; i++){ - if (scope.event.participants[i].dates[index]) datesCount[index]++; - } - return datesCount[index]; - } - scope.update = function(participant){ - Participant.update({ - id : scope.event._id, - pid : participant._id - }, participant); - } - scope.edit = function(participant){ - scope.defaults[scope.event.participants.indexOf(participant)] = angular.copy(participant); - } - scope.cancel = function(index){ - scope.event.participants[index] = scope.defaults[index]; - } - scope.save = function(participant){ - if (scope.formnew.$valid){ - var participant = new Participant(participant); - participant.$save({id:scope.event._id}, function(event){ - scope.event = event; - scope.participant = {}; - }); - scope.formnew.$setPristine(); - } - } - } - } }); diff --git a/public/js/controllers/newevent.controller.js b/public/js/controllers/newevent.controller.js index e056e383c..5d5eb1b10 100644 --- a/public/js/controllers/newevent.controller.js +++ b/public/js/controllers/newevent.controller.js @@ -1,17 +1,9 @@ angular.module('rallly') -.controller('NewEventCtrl', function($scope, $http, $state, Event, ConfirmModal){ +.controller('NewEventCtrl', function($scope, $http, $state, Event, ConfirmModal, Notification){ $scope.title = "Schedule a New Event"; $scope.description = "Fill in the form below to create your event and share it with your friends and colleagues."; - var showModal = function(title, message){ - var modal = new ConfirmModal({ - title : title || 'Not so fast!', - message : message || 'Make sure you fill in all the required fields and try again.', - cancelText : 'OK' - }); - } - $scope.submit = function(){ if ($scope.form.$valid){ $http.post('/api/event', $scope.event) @@ -24,10 +16,18 @@ angular.module('rallly') }); }) .error(function(){ - showModal('Uh oh!', 'There was an error creating your event. Please try again later.'); + var modal = new ConfirmModal({ + title : 'Uh oh!', + message : 'There was an error creating your event. Please try again later.', + cancelText : 'OK' + }); }); } else { - showModal(); + var notification = new Notification({ + title : 'Not so fast', + message : 'Make sure you fill in all the required fields and try again.', + type : 'error' + }); } } diff --git a/public/js/controllers/verification.controller.js b/public/js/controllers/verification.controller.js new file mode 100644 index 000000000..c2f99ac03 --- /dev/null +++ b/public/js/controllers/verification.controller.js @@ -0,0 +1,19 @@ +angular.module('rallly') +.controller('VerificationCtrl', function(Event, Notification, $state){ + Event.verify({id : $state.params.id, code :$state.params.code}, function(){ + var notification = new Notification({ + title : 'Email Verified', + message : 'Your email has been verified. You will now be able to receive email notifications for this event', + type : 'success', + timeout : 5000 + }); + }, function(e){ + var notification = new Notification({ + title : 'Verification Failed', + message : 'Your verification code has expired.', + type : 'error' + }); + }); + $state.go('event', { id : $state.params.id }); + +}); diff --git a/public/js/directives/discussion.directive.js b/public/js/directives/discussion.directive.js new file mode 100644 index 000000000..4578986d0 --- /dev/null +++ b/public/js/directives/discussion.directive.js @@ -0,0 +1,41 @@ +angular.module('rallly') +.directive('discussion', function($timeout, Comment, ConfirmModal){ + return { + restrict : 'A', + templateUrl : 'templates/directives/discussion.html', + scope : { + 'event' : '=' + }, + link : function(scope, el, attrs){ + scope.comment = {}; + var thread = angular.element('.comment-thread'); + $timeout(function(){ + thread.scrollTop(thread.prop('scrollHeight')); + }); + scope.deleteComment = function(comment){ + var modal = new ConfirmModal({ + title : 'Are you sure?', + message : 'Are you sure you want to remove this comment?', + confirmText : 'Yes - delete', + cancelText : 'No - nevermind', + isDestructive : true, + confirm : function(){ + Comment.remove({ id : scope.event._id , cid : comment._id }, function(event){ + scope.event = event; + }); + } + }); + } + scope.postComment = function(){ + if (scope.commentForm.$valid){ + var comment = new Comment(scope.comment); + comment.$save({id:scope.event._id}, function(event){ + scope.event = event; + scope.comment = {}; + }); + scope.commentForm.$setPristine(); + } + } + } + } +}); diff --git a/public/js/directives/dropdown.directive.js b/public/js/directives/dropdown.directive.js new file mode 100644 index 000000000..25e8bec0b --- /dev/null +++ b/public/js/directives/dropdown.directive.js @@ -0,0 +1,27 @@ +angular.module('rallly') +.directive('dropdown', function($document){ + return { + restrict : 'A', + link : function(scope, el, attrs){ + el.addClass('dropdown'); + scope.open = false; + + var clickHandler = function(event){ + var isClickedElementChildOfPopup = el.find(event.target).length > 0; + if (isClickedElementChildOfPopup) return; + scope.toggle(); + } + + scope.toggle = function(){ + scope.open = !scope.open; + if (scope.open){ + el.addClass('open'); + $document.bind('click', clickHandler); + } else { + el.removeClass('open'); + $document.unbind('click', clickHandler); + } + } + } + } +}); diff --git a/public/js/directives/form.directive.js b/public/js/directives/form.directive.js index cd5b00df4..2978d49c3 100644 --- a/public/js/directives/form.directive.js +++ b/public/js/directives/form.directive.js @@ -1,5 +1,7 @@ angular.module('rallly') .service('FormHelper', function(){ + this.emailRegexString = '^([\\w-\\.]+@([\\w-]+\\.)+[\\w-]{2,4})?$'; + this.emailRegex = new RegExp(this.emailRegexString); this.prettyError = function(errors, field){ if (errors.required) return field + " is required"; if (errors.pattern) return field + " is invalid" ; @@ -17,7 +19,7 @@ angular.module('rallly') link : function(scope, el, attrs) { scope.errors = {}; - scope.emailRegex = /^([\w-\.]+@([\w-]+\.)+[\w-]{2,4})?$/; + scope.emailRegex = FormHelper.emailRegex; scope.$watchCollection('form.name.$error',function(errors){ scope.errors.name = FormHelper.prettyError(errors, "Name"); @@ -59,12 +61,54 @@ angular.module('rallly') templateUrl : 'templates/directives/eventForm/dateForm.html' } }) -.directive('participantsForm', function(){ +.directive('participantsForm', function(FormHelper){ return { scope : { event : '=', form : '=' }, - templateUrl : 'templates/directives/eventForm/participantsForm.html' + templateUrl : 'templates/directives/eventForm/participantsForm.html', + link : function(scope, el, attrs){ + scope.emailRegex = FormHelper.emailRegexString; + } + } +}) +.directive('settingsForm', function(Event){ + return { + scope : { + event : '=', + form : '=' + }, + templateUrl : 'templates/directives/eventForm/settingsForm.html', + link : function(scope, el, attrs){ + scope.deleteEvent = function(){ + Event.delete({'id' : scope.event._id}, function(){ + console.log('delete'); + }); + } + } + } +}) +.directive('switchToggle', function(){ + return { + scope : { + model : '=ngModel' + }, + require : 'ngModel', + link : function(scope, el, attrs, ngModel) { + el.addClass('switch-toggle'); + var setClass = function(){ + if (scope.model ^ typeof(attrs.invert) !== 'undefined'){ + el.addClass('active'); + } else { + el.removeClass('active'); + } + } + scope.$watch('model', setClass); + el.bind('click', function(e){ + scope.model = !scope.model; + ngModel.$setViewValue(scope.model, e); + }); + } } }); diff --git a/public/js/directives/poll.directive.js b/public/js/directives/poll.directive.js new file mode 100644 index 000000000..ae10d89d5 --- /dev/null +++ b/public/js/directives/poll.directive.js @@ -0,0 +1,65 @@ +angular.module('rallly') +.directive('poll', function(Participant, ConfirmModal){ + return { + restrict : 'A', + templateUrl : 'templates/directives/poll.html', + scope : { + 'event' : '=' + }, + link : function(scope, el, attrs){ + scope.defaults = []; + scope.participant = {}; + var datesCount = []; + scope.delete = function(participant){ + var modal = new ConfirmModal({ + title : 'Delete ' + participant.name + '?', + message : 'Are you sure you want to remove '+participant.name+' from the poll?', + confirmText : 'Yes - delete', + cancelText : 'No - nevermind', + isDestructive : true, + confirm : function(){ + Participant.remove({ id : scope.event._id , pid : participant._id }, function(event){ + scope.event = event; + }); + } + }); + } + scope.isTopDate = function(index){ + var count = datesCount[index]; + for (var i = 0; i < datesCount.length; i++){ + if (datesCount[i] > count) return false; + } + return true; + } + scope.selectedDate = function(index){ + datesCount[index] = 0; + for (var i = 0; i < scope.event.participants.length; i++){ + if (scope.event.participants[i].dates[index]) datesCount[index]++; + } + return datesCount[index]; + } + scope.update = function(participant){ + Participant.update({ + id : scope.event._id, + pid : participant._id + }, participant); + } + scope.edit = function(participant){ + scope.defaults[scope.event.participants.indexOf(participant)] = angular.copy(participant); + } + scope.cancel = function(index){ + scope.event.participants[index] = scope.defaults[index]; + } + scope.save = function(){ + if (scope.formnew.$valid){ + var participant = new Participant(scope.participant); + participant.$save({id:scope.event._id}, function(event){ + scope.event = event; + scope.participant = {}; + }); + scope.formnew.$setPristine(); + } + } + } + } +}); diff --git a/public/js/main.js b/public/js/main.js index 41609b4a5..83174d6fa 100644 --- a/public/js/main.js +++ b/public/js/main.js @@ -1,4 +1,4 @@ -angular.module('rallly', ['ui.router','ngResource','ngFx','btford.modal']) +angular.module('rallly', ['ui.router','ngResource','ngFx','btford.modal','ngTagsInput','ngAnimate']) .config(function($stateProvider, $urlRouterProvider, $locationProvider){ $locationProvider.html5Mode(true); $urlRouterProvider.otherwise("/notfound") @@ -32,17 +32,32 @@ angular.module('rallly', ['ui.router','ngResource','ngFx','btford.modal']) templateUrl : 'templates/editevent.html', controller : 'EditEventCtrl' }) + .state('verifyevent', { + url : '/verify/:id/code/:code', + controller : 'VerificationCtrl' + }) + .state('deleteevent', { + url : '/delete/:id/code/:code', + controller : 'DeletionCtrl' + }) }) .factory('Event', function($resource){ return $resource('/api/event/:id', { id : '@_id' }, { - 'update' : { method : 'PUT' } + 'update' : { method : 'PUT' }, + 'verify' : { method : 'GET', url : '/api/event/:id/code/:code' }, + 'destroy': { method : 'DELETE', url: '/api/event/:id/code/:code' } }); }) .factory('Participant', function($resource){ - return $resource('/api/event/:id/participant/:pid', { id: '@_id', pid : '@pid'}, { + return $resource('/api/event/:id/participant/:pid', { id: '@_id'}, { 'update' : { method : 'PUT' } }); }) + .factory('Comment', function($resource){ + return $resource('/api/event/:id/comment/:cid', { id : '@_id' }, { + 'update' : { method : 'PUT' } + }) + }) .factory('Title', function(){ return { set : function(title){ diff --git a/public/js/services/notification.service.js b/public/js/services/notification.service.js new file mode 100644 index 000000000..33a5fc8bd --- /dev/null +++ b/public/js/services/notification.service.js @@ -0,0 +1,23 @@ +angular.module('rallly') +.factory('Notification', function($timeout, btfModal){ + return function(config){ + var modal; + modal = btfModal({ + templateUrl : 'templates/notification.html', + controllerAs : 'notification', + controller : function(){ + this.title = config.title + this.message = config.message; + this.close = modal.deactivate; + this.type = config.type; + var timeout = config.timeout || 5000; + $timeout(modal.deactivate, timeout); + } + }); + modal.activate(); + + this.destroy = function(){ + modal.deactivate(); + } + } +}); diff --git a/public/js/templates.js b/public/js/templates.js index ffadbe78b..1763e51b7 100644 --- a/public/js/templates.js +++ b/public/js/templates.js @@ -1,12 +1,15 @@ angular.module("rallly").run(["$templateCache", function($templateCache) {$templateCache.put("templates/about.html","
\n

What is Rallly?

\n
Rallly is a collaborative scheduling service that makes deciding on a date fast and easy.
\n

Hi, I\'m Luke!

\n

\n I created Rallly as side project to help me learn some new technologies. I decided to publish it because I thought other people might find it useful. Rallly is a completely free service. In fact it is even open source. You can look at the latest source code on Github.\n

\n
\n"); -$templateCache.put("templates/confirmmodal.html","
\n\n
\n
{{modal.title}}
\n
\n {{modal.message}}\n
\n
\n \n \n
\n
\n"); -$templateCache.put("templates/editevent.html","
\n
\n\n
Edit Event
\n
\n You can makes changes to your existing event by changing the fields in the form below.\n
\n\n
\n\n
\n\n
\n\n
\n\n
\n
\n\n
\n
\n \n \n Done\n
\n\n
\n\n
\n\n
\n"); -$templateCache.put("templates/event.html","
\n
\n
\n
\n \n
\n
\n
\n {{event.title}}\n
\n
\n Created by {{event.creator.name}} • {{event.created | elapsed}}\n
\n
\n
\n \n
\n
\n
{{event.description}}
\n \n\n
\n
\n
\n
\n
\n
\n"); +$templateCache.put("templates/confirmmodal.html","
\n\n
\n
{{modal.title}}
\n
\n {{modal.message}}\n
\n
\n \n \n
\n
\n"); +$templateCache.put("templates/editevent.html","
\n
\n\n
Edit Event
\n
\n You can makes changes to your existing event by changing the fields in the form below.\n
\n\n
\n\n
\n\n
\n\n
\n\n
\n
\n\n
\n\n
\n\n
\n\n
\n \n \n Done\n
\n\n
\n\n
\n\n
\n"); +$templateCache.put("templates/event.html","
\n
\n
\n
\n \n
\n
\n
\n {{event.title}}\n Poll Closed\n Poll Open\n
\n
\n Created by {{event.creator.name}} • {{event.created | elapsed}}\n
\n
\n
\n \n
\n
\n
{{event.description}}
\n \n\n
\n
\n
\n
\n
\n\n
\n
\n Discussion\n
\n
\n You can discuss the event with your friends by leaving a comment below.\n
\n
\n\n
\n
\n
\n"); $templateCache.put("templates/home.html","
\n
\n \n
\n
\n Schedule an Event\n
\n
\n Want to host an event but can’t decide on a date? Click on the button below to start!\n
\n \n
\n"); -$templateCache.put("templates/newevent.html","
\n
\n\n
Schedule a New Event
\n
\n Fill in the form below to create your event and share it with your friends and colleagues.\n
\n\n
\n
\n\n
\n\n
\n\n
\n\n
\n\n
\n\n
\n\n
\n\n
\n \n
\n\n
\n
\n
\n
\n
\n
\n \n
\n
Event Created
\n
\n Your event has been created successfully! Make sure you visit the page yourself and fill in the poll.\n
\n
\n
\n
\n \n GO\n
\n
\n
\n"); +$templateCache.put("templates/newevent.html","
\n
\n\n
Schedule a New Event
\n
\n Fill in the form below to create your event and share it with your friends and colleagues.\n
\n\n
\n
\n\n
\n\n
\n\n
\n\n
\n\n
\n\n
\n\n
\n\n
\n \n
\n\n
\n
\n
\n
\n
\n
\n \n
\n
Event Created
\n
\n Your event has been created successfully! You should receive an email shortly with instructions to verify your email address.\n
\n
\n
\n
\n \n GO\n
\n
\n
\n"); $templateCache.put("templates/notfound.html","

Error 404

\n

Not Found

\n"); -$templateCache.put("templates/directives/poll.html","
\n
\n {{event.participants.length}} participants\n
\n
\n
\n
\n {{date | date: \'EEE\'}}\n
\n
\n {{date | date: \'d\'}}\n
\n
\n {{date | date : \'MMM\'}}\n
\n {{selectedDate($index)}}\n
\n
\n
\n\n
\n
\n
\n
\n
\n
\n \n \n \n \n {{participant.name}}\n
\n
\n \n \n \n
\n
\n
\n Edit\n Delete\n \n Cancel\n
\n
\n
\n
\n
\n
\n \n \n \n \n
\n
\n \n
\n
\n
\n \n
\n
\n
\n
\n"); +$templateCache.put("templates/notification.html","
\n
\n {{notification.title}}\n
\n
\n {{notification.message}}\n
\n
\n"); +$templateCache.put("templates/directives/discussion.html","
    \n
  • \n
    \n \n
    \n
    \n ×\n
    \n {{comment.author.name}}\n {{comment.created | elapsed}}\n
    \n
    {{comment.content}}
    \n
    \n
  • \n
\n
\n
\n \n
\n
\n
\n \n
\n
\n
\n \n \n \n Make sure you fill in all the fields.\n \n
\n
\n
\n
\n"); +$templateCache.put("templates/directives/poll.html","
\n
\n {{event.participants.length}} participants\n
\n
\n
\n
\n {{date | date: \'EEE\'}}\n
\n
\n {{date | date: \'d\'}}\n
\n
\n {{date | date : \'MMM\'}}\n
\n {{selectedDate($index)}}\n
\n
\n
\n\n
\n
\n
\n
\n
\n
\n \n \n \n \n {{participant.name}}\n
\n
\n \n \n \n
\n
\n
\n \n \n \n \n
\n
\n
\n
\n
\n
\n \n \n \n \n
\n
\n \n
\n
\n
\n \n
\n
\n
\n
\n"); $templateCache.put("templates/directives/eventForm/dateForm.html","
\n
Choose Dates
\n
    \n
  • \n
    \n
    \n {{date | date: \'EEE\'}}\n
    \n
    \n {{date | date: \'d\'}}\n
    \n
    \n {{date | date : \'MMM\'}}\n
    \n \n
    \n
  • \n
\n
\n
\n
\n
\n \n \n You need to select a few dates\n \n
\n\n
\n
\n
\n
\n"); $templateCache.put("templates/directives/eventForm/eventForm.html","
\n
Event Details
\n
\n
\n
\n
\n
\n \n \n {{errors.title}}\n \n \n
\n
\n
\n
\n \n \n {{errors.location}}\n \n \n
\n
\n
\n
\n
\n \n \n
\n
\n
\n"); -$templateCache.put("templates/directives/eventForm/participantsForm.html","
\n
Invite Participants
\n
\n
\n
\n
\n \n \n
\n
\n
\n\n"); +$templateCache.put("templates/directives/eventForm/participantsForm.html","
\n
Invite Participants
\n
\n
\n
\n
\n \n \n
\n
\n
\n\n"); +$templateCache.put("templates/directives/eventForm/settingsForm.html","
\n
Settings
\n
\n
\n
\n
\n
\n Poll Status\n
\n
\n Let people vote on the poll.\n
\n
\n
\n
\n {{event.isClosed ? \'Closed\' : \'Open\' }}\n
\n
\n
\n
\n
\n
\n
\n
\n Notifications\n
\n
\n Send email notifications to the creator of this event.\n
\n
\n
\n
\n {{event.creator.allowNotifications ? \'Enabled\' : \'Disabled\' }}\n
\n
\n
\n
\n
\n
\n
\n
\n Delete Event\n
\n
\n Once you delete an event it will no longer be accessible.\n
\n
\n
\n \n
\n
\n
\n\n"); $templateCache.put("templates/directives/eventForm/userForm.html","
\n
Your Details
\n
\n
\n
\n
\n
\n \n \n {{errors.name}}\n \n \n
\n
\n
\n
\n \n \n {{errors.email}}\n \n \n
\n
\n
\n
\n");}]); \ No newline at end of file diff --git a/public/scss/modules/_vars.scss b/public/scss/modules/_vars.scss index bfbe0f1e6..0a99c2323 100644 --- a/public/scss/modules/_vars.scss +++ b/public/scss/modules/_vars.scss @@ -4,7 +4,7 @@ $pink-clr: #E55A84; $red-clr: #E06488; $blue-clr: #5AC4E5; $light-blue-clr: #F5F6F8; - +$orangered-clr: #FF5D5D; $text-clr: #3D4043; $text-2-clr: #828B9A; diff --git a/public/scss/partials/_applayout.scss b/public/scss/partials/_applayout.scss index 9038bf751..3772fbedb 100644 --- a/public/scss/partials/_applayout.scss +++ b/public/scss/partials/_applayout.scss @@ -25,7 +25,6 @@ body { background: $background-clr; min-height:100%; .main-view { - height: 100%; position:relative; padding: 160px 40px 40px 40px; width:100%; diff --git a/public/scss/partials/_topbar.scss b/public/scss/partials/_topbar.scss index bdf49218e..23abdf9a1 100644 --- a/public/scss/partials/_topbar.scss +++ b/public/scss/partials/_topbar.scss @@ -29,15 +29,34 @@ border-color: darken($border-clr,10%); } } - .dropdown:after { - content: ""; - width: 6px; - height: 4px; - margin-left: 10px; - display:inline-block; - background-image: url("../images/dropdown_arrow.png"); - background-size: 6px 4px; - background-repeat:no-repeat; + &.dropdown.open .dropdown-toggle { + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; + border-color: $border-clr; + border-bottom-color: white; + position: relative; + z-index:1001; + } + .dropdown-menu { + background: white; + color: $text-clr; + font-size: em(16px); + line-height: 1.5em; + border: 1px solid $border-clr; + border-radius: 3px; + padding: 20px; + margin-top:-9px; + border-top-left-radius:0; + box-shadow: 0 2px 3px $border-clr; + .dropdown-title { + font-weight:bold; + font-size: em(15px); + } + .dropdown-content { + font-size: em(14px); + line-height: 1.5em; + color: $text-2-clr; + } } } diff --git a/public/scss/partials/old/_buttons.scss b/public/scss/partials/old/_buttons.scss deleted file mode 100644 index a17516c7c..000000000 --- a/public/scss/partials/old/_buttons.scss +++ /dev/null @@ -1,35 +0,0 @@ -.btn-flat { - color:white; - background: $primary-clr; - text-decoration:none; - @include pad(em(10px) em(20px)); - border-radius: 3px; -} - -.btn-primary { - border:1px solid #E0E3E9; - border-radius: 2px; - box-shadow: inset 0 1px 0 white, 0 1px 1px rgba(black, 0.1); - @include background-image(linear-gradient(#FAFAFA, #EFF1F3)); - font-size: em(12px); - font-weight:600; - color: $dark-gray-clr; - text-decoration:none; - padding: em(8px) em(15px); - &.disabled { - cursor:default; - opacity: 0.5; - &:active { - box-shadow: inset 0 1px 0 white, 0 1px 1px rgba(black, 0.1); - } - } - &.danger { - color: $danger-clr; - } - &:focus { - outline:0; - } - &:active { - box-shadow: inset 0 0 5px rgba(black, 0.1); - } -} diff --git a/public/scss/partials/old/_datepicker.scss b/public/scss/partials/old/_datepicker.scss deleted file mode 100644 index e5360e5e9..000000000 --- a/public/scss/partials/old/_datepicker.scss +++ /dev/null @@ -1,209 +0,0 @@ -.error > .datepicker { - border-color: $red-clr; -} -.datepicker { - width:100%; - border:1px solid #eee; - border-radius: 3px; - background:white; - padding: em(10px); - @include transition(border-color 0.1s ease-in-out); - table { - width:100%; - font-size: em($em-base); - } - thead { - - } - tbody { - &:before { - content: ''; - display:block; - height: em(10px); - } - } - .prev, .next { - opacity: 0.5; - cursor: pointer; - border-radius:5px; - position:relative; - &:hover { - opacity: 1; - &:after { - opacity: 1; - background: rgba($text-clr, 0.1); - } - } - &:after { - content: " "; - cursor:pointer; - opacity: 0; - position:absolute; - $size: em(28px); - width:$size; - height:$size; - margin-left:$size * -0.5; - margin-top:$size * -0.5; - left:50%; - top:50%; - border-radius:100%; - } - } - .datepicker-switch { - padding: 10px; - font-weight:600; - font-size:em(18px); - border-radius: 3px; - cursor: pointer; - &:hover { - background: rgba($text-clr, 0.1); - } - } - .dow { - padding:10px; - font-weight:normal; - text-transform: uppercase; - color: $red-clr; - font-size: em(14px); - border-bottom: 2px solid #eee; - } - .dow, .day { - padding:em(15px); - } - .day { - text-align:center; - font-weight:600; - position:relative; - font-size:em(14px); - &.today { - color:#818176; - &:after { - opacity:1; - background: rgba(yellow, 0.1); - } - } - &:hover { - &:after { - opacity:1; - background: rgba($text-clr,0.1); - } - cursor: pointer; - } - &.new, &.old { - font-weight:normal; - color: rgba($text-clr,0.3); - } - &.active { - background:white; - color: $primary-clr; - &:after { - opacity:1; - background: rgba($primary-clr,0.1); - } - } - &:active { - &:after { - opacity: 0.8; - } - } - &:after { - content: " "; - cursor:pointer; - opacity: 0; - position:absolute; - $size: em(35px); - width:$size; - height:$size; - margin-left:$size * -0.5; - margin-top:$size * -0.5; - left:50%; - top:50%; - border-radius:100%; - } - } - .month, .year { - width: 33.3%; - display:inline-block; - text-align:center; - font-size: em(14px); - padding:em(20px); - cursor:pointer; - border-radius: 3px; - text-transform: uppercase; - &:hover { - background: rgba($text-clr, 0.1); - } - } -} - -.daticon-list { - margin:0; - margin-left:-10px; - list-style:none; - padding:5px; - text-align:left; - .placeholder { - line-height: em(18px); - font-size: em(12px); - color: #ccc; - } - li { - margin: 5px; - display:inline-block; - } -} - -.daticon { - box-shadow: 0 0 0 1px rgba($text-clr,0.1); - border-radius: 3px; - display:inline-block; - padding:em(8px) em(16px); - text-align:center; - position:relative; - cursor:default; - background:white; - .dow { - font-size: em(6px); - margin-top:em(-24px); - background:white; - color: #aaa; - margin-bottom: em(4px); - font-weight:normal; - text-transform: uppercase; - } - .day { - font-size: em(20px); - font-weight:normal; - color: $red-clr; - line-height: em(16px); - } - .month { - font-weight: 600; - font-size: em(12px); - text-transform: uppercase; - } - .delete { - text-align:center; - $size: 18px; - width: em($size); - height: em($size); - position:absolute; - top: $size * -0.4; - right: $size * -0.4; - background: rgba($text-clr,0.1); - border-radius:100%; - display:inline-block; - background: rgba($text-clr, 0.1) url(../images/close@2x.png) no-repeat center center; - background-size: 7px 8px; - cursor:pointer; - opacity:0; - &:hover { - background-color: rgba($text-clr, 0.2) - } - } - &:hover { - .delete { - opacity: 1; - } - } -} diff --git a/public/scss/partials/old/_event.scss b/public/scss/partials/old/_event.scss deleted file mode 100644 index bd7c90dac..000000000 --- a/public/scss/partials/old/_event.scss +++ /dev/null @@ -1,117 +0,0 @@ -.event-description { - font-size: em(18px); - line-height: em(21px); - color: $body-clr; - white-space: pre-wrap; -} - -.event-poll { - width:100%; - margin-top:em(-10px); - margin-bottom: em(10px); - th { - text-align:center; - border-bottom:1px solid #ddd; - padding-bottom:em(10px); - box-shadow: 0 3px 0 rgba(black, 0.05); - } - tr:nth-child(even){ - td { - background: #F9FAFA; - } - } - tr:hover { - .hover { - visibility:visible; - } - } - .hover { - visibility: hidden; - } - td { - &.center { - text-align:center; - } - padding: em(10px); - border-bottom:1px solid #ddd; - } - .event-poll-name { - padding: em(6px) em(11px); - display:inline-block; - } - .event-poll-user { - text-align:left; - font-size: em(14px); - padding: em(12px) em(20px); - img { - margin-right: 5px; - } - input { - border:1px solid #ddd; - padding: em(5px) em(10px); - border-radius: 3px; - color: $text-clr; - &:focus { - outline:0; - border-color: $blue-clr; - } - } - } - .event-poll-input { - padding:0; - } - .event-poll-participants { - text-align:left; - padding:0 em(10px); - } - - .event-entry-button { - font-size: em(12px); - text-decoration:none; - color: #aaa; - border-radius: 3px; - margin-left: em(5px); - &:hover { - color: $primary-clr; - &.danger { - color: $red-clr; - } - } - } -} - - -.event-poll-buttons { - text-align:right; - padding: 0 em(10px); -} - -.event-detail-list { - list-style:none; - margin-top:em(-20px); - margin-bottom:em(20px); - padding:0; - color: $body-clr; - font-size: em(12px); - li { - display:inline-block; - margin-right: em(40px); - } - a { - color: $text-clr; - text-decoration:none; - &:hover { - color: $primary-clr; - } - } -} - -.event-details { - margin-bottom: em(40px); -} -.event-button-tip { - font-size: em(11px); - color: #C4CAD2; - display:inline-block; - margin-right: em(10px); -} diff --git a/public/scss/partials/old/_eventsuccess.scss b/public/scss/partials/old/_eventsuccess.scss deleted file mode 100644 index 5f188c676..000000000 --- a/public/scss/partials/old/_eventsuccess.scss +++ /dev/null @@ -1,12 +0,0 @@ -.form-success { - text-align:center; -} - -.form-success-url { - font-size: em(24px); - text-align:center; - padding: 10px; - border-radius: 3px; - border: 1px solid #eee; - color: $text-clr; -} diff --git a/public/scss/partials/old/_form.scss b/public/scss/partials/old/_form.scss deleted file mode 100644 index cfc805910..000000000 --- a/public/scss/partials/old/_form.scss +++ /dev/null @@ -1,96 +0,0 @@ -.form-container { - width:100%; -} - -.form-row { - @include row(); - margin-bottom:10px; - @include user-select(none); -} - -.form-col { - @include span-columns(6); - &.padded { - &:first-child { - padding: 0 20px 0 0; - } - &:last-child { - padding: 0 0 0 20px; - } - } -} - -.form-big-col { - @include span-columns(12); -} - -.form-small-col { - @include span-columns(2); -} - -.form-error-msg { - color: $red-clr; - font-size: em(12px); - padding: em(5px); -} - -.form-group { - & > label { - font-size:em(12px); - color: $dark-gray-clr; - display:block; - line-height:em(30px); - &:after { - content: "*"; - color: $red-clr; - margin-left:5px; - } - &.optional:after { - content: ""; - } - } - input.form-control, textarea.form-control { - border-radius: 3px; - border: 1px solid #ddd; - font-size:em(18px); - @include transition(border-color 0.1s ease-in-out); - &:focus { - border-color: $blue-clr; - outline:none; - } - &.extend { - width:100%; - } - @include placeholder { - color: rgba($dark-gray-clr,0.7); - } - } - &.error { - input.form-control, textarea.form-control { - - border-color: $red-clr; - background: rgba($red-clr,0.02); - } - } - input.form-control { - padding: em(5px) em(10px); - } - textarea.form-control { - min-height: 100px; - font-size: em(18px); - padding: em(8px) em(10px); - } -} - -.form-submit-message { - display:inline-block; - margin-left: em(5px); - font-size: em(12px); - &.error { - color: $red-clr; - } - img { - vertical-align:middle; - margin-right: em(5px); - } -} diff --git a/public/scss/partials/old/_header.scss b/public/scss/partials/old/_header.scss deleted file mode 100644 index c09f79e65..000000000 --- a/public/scss/partials/old/_header.scss +++ /dev/null @@ -1,28 +0,0 @@ -.header { - @include span-columns(3); - .fixed { - position: fixed; - } - .primary-section { - margin: em(35px) 0; - } - .secondary-section { - - } - .nav-links { - font-size: em(16px); - font-weight: normal; - line-height: em(24px); - .nav-link { - display:block; - text-decoration:none; - color: $dark-gray-clr; - &:hover { - color: $text-clr; - } - &.active { - color: $blue-clr; - } - } - } -} diff --git a/public/scss/partials/old/_mixins.scss b/public/scss/partials/old/_mixins.scss deleted file mode 100644 index 97f8712f6..000000000 --- a/public/scss/partials/old/_mixins.scss +++ /dev/null @@ -1,3 +0,0 @@ -@mixin font($font : $primary-font){ - font-family: $font, $helvetica; -} diff --git a/public/scss/partials/old/_modal.scss b/public/scss/partials/old/_modal.scss deleted file mode 100644 index bd53d5816..000000000 --- a/public/scss/partials/old/_modal.scss +++ /dev/null @@ -1,44 +0,0 @@ -.rl-modal { - background:white; - position: fixed; - top: 50%; - box-shadow: 0 0 5px rgba(black, 0.1); - left: 50%; - width: 50%; - max-width: 400px; - display:inline-block; - min-width: 200px; - height: auto; - z-index: 2000; - overflow:hidden; - border-radius: 5px; - border: 1px solid #ddd; - @include transform(translateX(-50%) translateY(-50%)); - .rl-modal-message { - padding: 0 20px 20px 20px; - font-size: em(12px); - color: $body-clr; - } - .rl-modal-title { - padding:20px 20px 5px 20px; - font-size: em(18px); - font-weight: bold; - } - .rl-modal-actions { - border-top:1px solid #ddd; - background: #F9FAFA; - text-align:right; - padding: em(10px) em(20px); - } -} - -.rl-modal-overlay { - position:fixed; - z-index: 1000; - top:0; - left:0; - width:100%; - height:100%; - background:rgba(black,0.1); - -} diff --git a/public/scss/partials/old/_newevent.scss b/public/scss/partials/old/_newevent.scss deleted file mode 100644 index 8b1378917..000000000 --- a/public/scss/partials/old/_newevent.scss +++ /dev/null @@ -1 +0,0 @@ - diff --git a/public/scss/partials/old/_type.scss b/public/scss/partials/old/_type.scss deleted file mode 100644 index eb4e89b69..000000000 --- a/public/scss/partials/old/_type.scss +++ /dev/null @@ -1,38 +0,0 @@ -h1 { - font-weight:bold; - font-size: em(36px); - color: $text-clr; - small { - font-size: em(12px); - } -} - -h2 { - font-weight:600; - font-size:em(14px); - color: $text-clr; - padding-bottom:5px; - small { - margin-left: em(10px); - display:inline-block; - } - small, small a { - font-size: em(12px); - color: $dark-gray-clr; - font-weight:normal; - } - small a { - text-decoration:none; - &:hover { - color: $red-clr; - border-bottom: 1px solid #ddd; - } - } -} - -p { - color: $body-clr; - a { - color: $primary-clr; - } -} diff --git a/public/scss/partials/old/_vars.scss b/public/scss/partials/old/_vars.scss deleted file mode 100644 index 82c7f4597..000000000 --- a/public/scss/partials/old/_vars.scss +++ /dev/null @@ -1,16 +0,0 @@ -/****** BASIC *******/ -$em-base: 16px; -$primary-font: "Roboto"; -/****** BASIC *******/ - -/****** COLORS *******/ -$primary-clr: #60DF9D; -$dark-gray-clr: #969FA9; -$light-gray-clr: #f9f9f9; -$text-clr: #3D4752; -$danger-clr: #E55A5A; -$red-clr: #E55A84; -$blue-clr: #5AC4E5; -$medium-gray-clr: #798490; -$body-clr: $medium-gray-clr; -/****** COLORS *******/ diff --git a/public/scss/partials/pages/_event.scss b/public/scss/partials/pages/_event.scss index 2978c9036..b0924edea 100644 --- a/public/scss/partials/pages/_event.scss +++ b/public/scss/partials/pages/_event.scss @@ -1,5 +1,5 @@ .event-description { - font-size: em(16px); + font-size: em(14px); white-space: pre-wrap; padding-top:20px; padding-bottom: 20px; @@ -12,7 +12,7 @@ } .event-location { - font-size: em(16px); + font-size: em(14px); a { color: $text-clr; text-decoration:none; @@ -80,6 +80,23 @@ .title { font-size: em(24px); font-weight: bold; + .title-label { + font-size: 11px; + font-weight: normal; + margin-left: 5px; + position: relative; + top: -3px; + background: $text-2-clr; + color:white; + padding: 3px 10px; + border-radius: 20px; + &.success { + background: $green-clr; + } + &.danger { + background: $orangered-clr; + } + } } .subtitle { color: $text-2-clr; @@ -94,7 +111,7 @@ } } .actions { - // visibility:hidden; + visibility:hidden; float: right; margin-top: 30px; } diff --git a/public/scss/partials/ui/_box.scss b/public/scss/partials/ui/_box.scss index 4b72e81ed..92bf35757 100644 --- a/public/scss/partials/ui/_box.scss +++ b/public/scss/partials/ui/_box.scss @@ -8,6 +8,7 @@ $box-h-pad: 25px; margin: 0 auto 20px auto; max-width: 800px; padding: $box-v-pad $box-h-pad; + box-shadow: 0 0 1px $border-clr; &.box-x-scroll { overflow-x: scroll; } diff --git a/public/scss/partials/ui/_buttons.scss b/public/scss/partials/ui/_buttons.scss index 3836aa942..2a2b9dfb0 100644 --- a/public/scss/partials/ui/_buttons.scss +++ b/public/scss/partials/ui/_buttons.scss @@ -4,7 +4,7 @@ border:1px solid #E0E3E9; display:inline-block; border-radius: 2px; - box-shadow: inset 0 1px 0 white, 0 1px 1px rgba(black, 0.1); + box-shadow: inset 0 1px 0 white, 0 1px 0 rgba($border-clr,0.5); @include linear-gradient($btn-top-clr, $btn-bottom-clr); font-size: em(12px); font-weight:600; diff --git a/public/scss/partials/ui/_comments.scss b/public/scss/partials/ui/_comments.scss new file mode 100644 index 000000000..8f972114f --- /dev/null +++ b/public/scss/partials/ui/_comments.scss @@ -0,0 +1,137 @@ +.comments-info { + font-weight: bold; + padding-bottom: 10px; + border-bottom: 2px solid $border-clr; +} + +.comment-form { + @include row; + margin-bottom: 20px; + margin-top:20px; + padding: 0 10px; + .avatar-section { + @include span-columns(1); + img { + border-radius: 3px; + max-width: 100%; + } + } + .input-section { + @include span-columns(11); + } + .content-section { + margin-bottom:10px; + } + .name-section { + position:relative; + margin-bottom: 10px; + } + .form-control { + font-size: em(14px) !important; + border-width: 2px !important; + } + textarea.form-control { + min-height: 0; + min-width: 100%; + } +} + +.comments-placeholder { + color: $text-3-clr; + text-align:center; +} + +.comment-thread { + list-style:none; + margin:0; + padding:0; + margin-bottom: 20px; + max-height: 500px; + overflow-y: scroll; + .comment { + @include row; + padding: 10px; + .avatar-section { + @include span-columns(1); + img { + max-width: 100%; + border-radius: 3px; + } + } + .comment-section { + @include span-columns(11); + position:relative; + .comment-delete { + opacity:0; + text-decoration:none; + color:white; + background-color: $border-clr; + color: $text-3-clr; + border-radius: 2px; + display:inline-block; + position:absolute; + right:0; + top:0; + font-size: em(14px); + $cd-size: em(16px); + width: $cd-size; + height: $cd-size; + line-height: $cd-size; + text-align: center; + &:hover { + background: $red-clr; + color: white; + } + &:active { + background: darken($red-clr, 5%); + } + } + .meta { + font-size: em(13px); + color: $text-2-clr; + margin-bottom: 5px; + } + .name { + color: $text-2-clr; + font-weight: 600; + } + .time:before { + content: " "; + display: inline-block; + height: 4px; + width: 4px; + background: $text-3-clr; + margin: 0 5px 2px 5px; + border-radius: 100%; + } + .content { + font-size: em(14px); + margin-bottom: 5px; + white-space: pre-wrap; + margin-right: 100px; + } + .actions { + opacity:0.8; + a { + color: $text-2-clr; + font-size: em(12px); + text-decoration: none; + &:hover { + color: $blue-clr; + } + } + } + } + &:hover { + background: $background-clr; + cursor:default; + border-radius: 3px; + .name { + color: $blue-clr; + } + .comment-delete { + opacity: 1; + } + } + } +} diff --git a/public/scss/partials/ui/_datepicker.scss b/public/scss/partials/ui/_datepicker.scss index 4e98e1ace..0eb3c8642 100644 --- a/public/scss/partials/ui/_datepicker.scss +++ b/public/scss/partials/ui/_datepicker.scss @@ -115,7 +115,7 @@ cursor:pointer; opacity: 0; position:absolute; - $size: em(35px); + $size: em(40px); width:$size; height:$size; margin-left:$size * -0.5; @@ -224,7 +224,7 @@ line-height: $size; @include transition(background-color 0.2s ease-in-out); &.top { - background: #FF5D5D; + background: $orangered-clr; } } diff --git a/public/scss/partials/ui/_dropdown.scss b/public/scss/partials/ui/_dropdown.scss new file mode 100644 index 000000000..b893a8973 --- /dev/null +++ b/public/scss/partials/ui/_dropdown.scss @@ -0,0 +1,30 @@ +.dropdown { + position:relative; + cursor: pointer; + .dropdown-menu { + position: absolute; + display:none; + z-index: 1000; + float:left; + min-width:160px; + max-width: 180px; + padding: 5px; + text-align:left; + left:0; + } + &.open .dropdown-menu { + display: block; + } + .dropdown-toggle { + &:after { + content: ""; + width: 6px; + height: 4px; + margin-left: 10px; + display:inline-block; + background-image: url("../images/dropdown_arrow.png"); + background-size: 6px 4px; + background-repeat:no-repeat; + } + } +} diff --git a/public/scss/partials/ui/_form.scss b/public/scss/partials/ui/_form.scss index dd334eb9d..bfd586991 100644 --- a/public/scss/partials/ui/_form.scss +++ b/public/scss/partials/ui/_form.scss @@ -60,9 +60,6 @@ form { border-radius: 3px; border: 1px solid $border-clr; font-size:em(18px); - &.ng-pristine { - background: lighten($background-clr,1%); - } @include transition(border-color 0.1s ease-in-out); &:focus { border-color: $blue-clr; diff --git a/public/scss/partials/ui/_modal.scss b/public/scss/partials/ui/_modal.scss index 168c0be43..fdab63184 100644 --- a/public/scss/partials/ui/_modal.scss +++ b/public/scss/partials/ui/_modal.scss @@ -11,7 +11,7 @@ z-index: 2000; overflow:hidden; border-radius: 5px; - box-shadow: 0 0 0 1px $border-clr, 0 0 0 5px rgba($border-clr,0.8), 0 0 10px 5px rgba(black, 0.2); + box-shadow: 0 0 0 1px $border-clr, 0 0 0 5px rgba($border-clr,0.5); @include transform(translateX(-50%) translateY(-50%)); .rl-modal-message { padding: 0 20px 20px 20px; diff --git a/public/scss/partials/ui/_notification.scss b/public/scss/partials/ui/_notification.scss new file mode 100644 index 000000000..284552cf4 --- /dev/null +++ b/public/scss/partials/ui/_notification.scss @@ -0,0 +1,45 @@ +.notification { + position: fixed; + top: 0; + left: 0; + width: 100%; + z-index: 3000; + padding: 12px 40px; + background: $text-2-clr; + color: white; + @include transition(all 0.3s ease-in-out); + &.success { + background: $green-clr; + } + &.error { + background: $red-clr; + } + &.ng-enter { + top: -100px; + opacity:0; + } + &.ng-enter-active { + top:0; + opacity:1; + } + &.ng-leave-active { + top:-100px; + opacity:1; + } + .title { + font-size: em(14px); + margin-bottom: 2px; + } + .message { + font-size: em(12px); + color: rgba(white, 0.8); + } + .close { + position: absolute; + top: 5px; + right:10px; + color: white; + text-decoration:none; + + } +} diff --git a/public/scss/partials/ui/_poll.scss b/public/scss/partials/ui/_poll.scss index 82a890207..e574752e3 100644 --- a/public/scss/partials/ui/_poll.scss +++ b/public/scss/partials/ui/_poll.scss @@ -5,6 +5,7 @@ $name-col-width: 235px; .poll { min-width: 100%; display:block; + margin-bottom:20px; } .poll-header { @@ -54,6 +55,8 @@ $name-col-width: 235px; .cell { padding: em(10px); display:table-cell; + height: 50px; + vertical-align:middle; &.name-cell { min-width: $name-col-width; width: $name-col-width; diff --git a/public/scss/partials/ui/_switch.scss b/public/scss/partials/ui/_switch.scss new file mode 100644 index 000000000..90e3310f0 --- /dev/null +++ b/public/scss/partials/ui/_switch.scss @@ -0,0 +1,75 @@ +.switch-row { + display:table; + width: 100%; + margin-bottom: 20px; + padding-bottom: 20px; + border-bottom: 1px solid $border-clr; + &:last-child { + border:0; + } + .switch-details { + display:table-cell; + .title { + font-size: em(14px); + font-weight: bold; + } + .description { + font-size: em(12px); + color: $text-2-clr; + } + } + .switch { + display:table-cell; + text-align:right; + min-width: 150px; + vertical-align:middle; + .switch-value { + font-size: em(12px); + color: $text-2-clr; + display:inline-block; + vertical-align:middle; + + } + } +} + +.switch-toggle { + display:inline-block; + margin-left: 5px; + height: 20px; + width: 40px; + border-radius: 20px; + vertical-align:middle; + position:relative; + cursor:pointer; + background: $red-clr; + box-shadow: inset 0 0 0 1px rgba(black,0.1); + @include transition(all 0.1s ease-in-out); + $tog-size: 16px; + &:after { + content: " "; + @include transition(all 0.1s ease-in-out); + display:inline-block; + height: $tog-size; + width: $tog-size; + position: absolute; + $btn-top-clr: #FAFAFA; + $btn-bottom-clr: #EFF1F3; + box-shadow: inset 0 1px 0 white, 0 1px 1px rgba(black, 0.1); + @include linear-gradient($btn-top-clr, $btn-bottom-clr); + top: 50%; + margin-top: ($tog-size / 2) * -1; + left: 2px; + border-radius: 100px; + } + &:hover { + box-shadow:inset 0 0 0 1px rgba(black,0.1), inset 0 0 0 8px rgba(black,0.05); + } + &.active { + background: $green-clr; + &:after { + left: 100%; + margin-left: ($tog-size * -1) - 2; + } + } +} diff --git a/public/scss/partials/ui/_tags.scss b/public/scss/partials/ui/_tags.scss new file mode 100644 index 000000000..c57a6611a --- /dev/null +++ b/public/scss/partials/ui/_tags.scss @@ -0,0 +1,95 @@ +$tag-font-size: 14px; + +tags-input { + display: block; +} +tags-input *, tags-input *:before, tags-input *:after { + -moz-box-sizing: border-box; + -webkit-box-sizing: border-box; + box-sizing: border-box; +} +tags-input .host { + position: relative; + margin-top: 5px; + margin-bottom: 5px; + &:focus { + outline:0; + } +} +tags-input .host:active { + outline: none; +} + +tags-input .tags { + padding: 4px; + overflow: hidden; + word-wrap: break-word; + cursor: text; + border-radius: 3px; + background-color: white; + border: 1px solid $border-clr; + @include transition(border-color 0.1s ease-in-out); +} +tags-input .tags.focused { + outline: none; +} + +tags-input .tags .tag-list { + margin: 0; + padding: 0; + list-style-type: none; +} +tags-input .tags .tag-item { + margin: 2px; + padding: 0 8px; + display: inline-block; + float: left; + font-size: em($tag-font-size); + height: 26px; + line-height: 25px; + border-radius: 1px; + background:#E5EBF2; + color: #7587A1; + box-shadow:0 0 0 1px #CBD4E2; +} +tags-input .tags .tag-item.selected { + background: $red-clr; + color: white; + box-shadow: none; +} +tags-input .tags .tag-item .remove-button { + margin: 0 0 0 5px; + padding: 0; + border: none; + background: none; + color: inherit; + cursor: pointer; + vertical-align: middle; + font: bold em(16px) Arial, sans-serif; +} + +tags-input .tags .input { + border: 0; + outline: none; + margin: 2px; + padding: 0; + padding-left: 8px; + float: left; + height: 26px; + font-size: em($tag-font-size); + @include placeholder { + color: $text-3-clr; + } +} + +tags-input .tags .input.invalid-tag { + color: $red-clr; +} + +tags-input .tags .input::-ms-clear { + display: none; +} + +tags-input.ng-invalid .tags { + // highlight tags when model is invalid +} diff --git a/public/scss/style.scss b/public/scss/style.scss index afbec6fac..07dd5df3f 100644 --- a/public/scss/style.scss +++ b/public/scss/style.scss @@ -9,6 +9,10 @@ body { font-family: "Roboto", "Helvetica Neue", Arial, sans-serif; } +a { + color: $blue-clr; +} + @import "partials/applayout"; @import "partials/navigation"; @import "partials/topbar"; @@ -19,6 +23,11 @@ body { @import "partials/ui/datepicker"; @import "partials/ui/modal"; @import "partials/ui/poll"; +@import "partials/ui/tags"; +@import "partials/ui/dropdown"; +@import "partials/ui/comments"; +@import "partials/ui/switch"; +@import "partials/ui/notification"; @import "partials/pages/home"; @import "partials/pages/event"; diff --git a/public/templates/confirmmodal.html b/public/templates/confirmmodal.html index b0b54108d..10da2639a 100644 --- a/public/templates/confirmmodal.html +++ b/public/templates/confirmmodal.html @@ -6,7 +6,7 @@ {{modal.message}}
- - + +
diff --git a/public/templates/directives/discussion.html b/public/templates/directives/discussion.html new file mode 100644 index 000000000..0545b72df --- /dev/null +++ b/public/templates/directives/discussion.html @@ -0,0 +1,34 @@ +
    +
  • +
    + +
    +
    + × +
    + {{comment.author.name}} + {{comment.created | elapsed}} +
    +
    {{comment.content}}
    +
    +
  • +
+
+
+ +
+
+
+ +
+
+
+ + + + Make sure you fill in all the fields. + +
+
+
+
diff --git a/public/templates/directives/eventForm/participantsForm.html b/public/templates/directives/eventForm/participantsForm.html index b99d3ccc2..c557ba89c 100644 --- a/public/templates/directives/eventForm/participantsForm.html +++ b/public/templates/directives/eventForm/participantsForm.html @@ -4,8 +4,8 @@
- - + +
diff --git a/public/templates/directives/eventForm/settingsForm.html b/public/templates/directives/eventForm/settingsForm.html new file mode 100644 index 000000000..ad15d907f --- /dev/null +++ b/public/templates/directives/eventForm/settingsForm.html @@ -0,0 +1,53 @@ +
+
Settings
+
+
+
+
+
+ Poll Status +
+
+ Let people vote on the poll. +
+
+
+
+ {{event.isClosed ? 'Closed' : 'Open' }} +
+
+
+
+
+
+
+
+ Notifications +
+
+ Send email notifications to the creator of this event. +
+
+
+
+ {{event.creator.allowNotifications ? 'Enabled' : 'Disabled' }} +
+
+
+
+
+
+
+
+ Delete Event +
+
+ Once you delete an event it will no longer be accessible. +
+
+
+ +
+
+
+ diff --git a/public/templates/directives/poll.html b/public/templates/directives/poll.html index cc7ef7914..62dbd5f76 100644 --- a/public/templates/directives/poll.html +++ b/public/templates/directives/poll.html @@ -28,7 +28,7 @@ - {{participant.name}} + {{participant.name}}
@@ -36,16 +36,16 @@
-
- Edit - Delete - - Cancel +
+ + + +
-
-
+
+
diff --git a/public/templates/editevent.html b/public/templates/editevent.html index 75fc9219e..1f3ed042a 100644 --- a/public/templates/editevent.html +++ b/public/templates/editevent.html @@ -18,11 +18,16 @@
+ +
+ +
+
- + Done
diff --git a/public/templates/event.html b/public/templates/event.html index 70873b7ef..d1fbacbbb 100644 --- a/public/templates/event.html +++ b/public/templates/event.html @@ -1,12 +1,14 @@ -
+
- +
{{event.title}} + Poll Closed + Poll Open
Created by {{event.creator.name}} • {{event.created | elapsed}} @@ -23,7 +25,19 @@
-
+
+
+
+ +
+
+ Discussion +
+
+ You can discuss the event with your friends by leaving a comment below. +
+
+
diff --git a/public/templates/newevent.html b/public/templates/newevent.html index 8d7ffffbd..94f481a1e 100644 --- a/public/templates/newevent.html +++ b/public/templates/newevent.html @@ -6,7 +6,7 @@ Fill in the form below to create your event and share it with your friends and colleagues.
- +
@@ -37,7 +37,7 @@
Event Created
- Your event has been created successfully! Make sure you visit the page yourself and fill in the poll. + Your event has been created successfully! You should receive an email shortly with instructions to verify your email address.
diff --git a/public/templates/notification.html b/public/templates/notification.html new file mode 100644 index 000000000..8cdef6860 --- /dev/null +++ b/public/templates/notification.html @@ -0,0 +1,8 @@ +
+
+ {{notification.title}} +
+
+ {{notification.message}} +
+
diff --git a/public/vendor/angular-animate/.bower.json b/public/vendor/angular-animate/.bower.json new file mode 100644 index 000000000..e17a731d0 --- /dev/null +++ b/public/vendor/angular-animate/.bower.json @@ -0,0 +1,20 @@ +{ + "name": "angular-animate", + "version": "1.3.10", + "main": "./angular-animate.js", + "ignore": [], + "dependencies": { + "angular": "1.3.10" + }, + "homepage": "https://github.com/angular/bower-angular-animate", + "_release": "1.3.10", + "_resolution": { + "type": "version", + "tag": "v1.3.10", + "commit": "ae99c60870b78d1bcd01135d4412feaddd8b0959" + }, + "_source": "git://github.com/angular/bower-angular-animate.git", + "_target": "~1.3.10", + "_originalSource": "angular-animate", + "_direct": true +} \ No newline at end of file diff --git a/public/vendor/angular-animate/README.md b/public/vendor/angular-animate/README.md new file mode 100644 index 000000000..930b5dcc5 --- /dev/null +++ b/public/vendor/angular-animate/README.md @@ -0,0 +1,77 @@ +# packaged angular-animate + +This repo is for distribution on `npm` and `bower`. The source for this module is in the +[main AngularJS repo](https://github.com/angular/angular.js/tree/master/src/ngAnimate). +Please file issues and pull requests against that repo. + +## Install + +You can install this package either with `npm` or with `bower`. + +### npm + +```shell +npm install angular-animate +``` + +Add a ` +``` + +Then add `ngAnimate` as a dependency for your app: + +```javascript +angular.module('myApp', ['ngAnimate']); +``` + +Note that this package is not in CommonJS format, so doing `require('angular-animate')` will +return `undefined`. + +### bower + +```shell +bower install angular-animate +``` + +Then add a ` +``` + +Then add `ngAnimate` as a dependency for your app: + +```javascript +angular.module('myApp', ['ngAnimate']); +``` + +## Documentation + +Documentation is available on the +[AngularJS docs site](http://docs.angularjs.org/api/ngAnimate). + +## License + +The MIT License + +Copyright (c) 2010-2012 Google, Inc. http://angularjs.org + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/public/vendor/angular-animate/angular-animate.js b/public/vendor/angular-animate/angular-animate.js new file mode 100644 index 000000000..2014baec7 --- /dev/null +++ b/public/vendor/angular-animate/angular-animate.js @@ -0,0 +1,2138 @@ +/** + * @license AngularJS v1.3.10 + * (c) 2010-2014 Google, Inc. http://angularjs.org + * License: MIT + */ +(function(window, angular, undefined) {'use strict'; + +/* jshint maxlen: false */ + +/** + * @ngdoc module + * @name ngAnimate + * @description + * + * The `ngAnimate` module provides support for JavaScript, CSS3 transition and CSS3 keyframe animation hooks within existing core and custom directives. + * + *
+ * + * # Usage + * + * To see animations in action, all that is required is to define the appropriate CSS classes + * or to register a JavaScript animation via the `myModule.animation()` function. The directives that support animation automatically are: + * `ngRepeat`, `ngInclude`, `ngIf`, `ngSwitch`, `ngShow`, `ngHide`, `ngView` and `ngClass`. Custom directives can take advantage of animation + * by using the `$animate` service. + * + * Below is a more detailed breakdown of the supported animation events provided by pre-existing ng directives: + * + * | Directive | Supported Animations | + * |----------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------| + * | {@link ng.directive:ngRepeat#animations ngRepeat} | enter, leave and move | + * | {@link ngRoute.directive:ngView#animations ngView} | enter and leave | + * | {@link ng.directive:ngInclude#animations ngInclude} | enter and leave | + * | {@link ng.directive:ngSwitch#animations ngSwitch} | enter and leave | + * | {@link ng.directive:ngIf#animations ngIf} | enter and leave | + * | {@link ng.directive:ngClass#animations ngClass} | add and remove (the CSS class(es) present) | + * | {@link ng.directive:ngShow#animations ngShow} & {@link ng.directive:ngHide#animations ngHide} | add and remove (the ng-hide class value) | + * | {@link ng.directive:form#animation-hooks form} & {@link ng.directive:ngModel#animation-hooks ngModel} | add and remove (dirty, pristine, valid, invalid & all other validations) | + * | {@link module:ngMessages#animations ngMessages} | add and remove (ng-active & ng-inactive) | + * | {@link module:ngMessages#animations ngMessage} | enter and leave | + * + * You can find out more information about animations upon visiting each directive page. + * + * Below is an example of how to apply animations to a directive that supports animation hooks: + * + * ```html + * + * + * + * + * ``` + * + * Keep in mind that, by default, if an animation is running, any child elements cannot be animated + * until the parent element's animation has completed. This blocking feature can be overridden by + * placing the `ng-animate-children` attribute on a parent container tag. + * + * ```html + *
+ *
+ *
+ * ... + *
+ *
+ *
+ * ``` + * + * When the `on` expression value changes and an animation is triggered then each of the elements within + * will all animate without the block being applied to child elements. + * + * ## Are animations run when the application starts? + * No they are not. When an application is bootstrapped Angular will disable animations from running to avoid + * a frenzy of animations from being triggered as soon as the browser has rendered the screen. For this to work, + * Angular will wait for two digest cycles until enabling animations. From there on, any animation-triggering + * layout changes in the application will trigger animations as normal. + * + * In addition, upon bootstrap, if the routing system or any directives or load remote data (via $http) then Angular + * will automatically extend the wait time to enable animations once **all** of the outbound HTTP requests + * are complete. + * + * ## CSS-defined Animations + * The animate service will automatically apply two CSS classes to the animated element and these two CSS classes + * are designed to contain the start and end CSS styling. Both CSS transitions and keyframe animations are supported + * and can be used to play along with this naming structure. + * + * The following code below demonstrates how to perform animations using **CSS transitions** with Angular: + * + * ```html + * + * + *
+ *
+ *
+ * ``` + * + * The following code below demonstrates how to perform animations using **CSS animations** with Angular: + * + * ```html + * + * + *
+ *
+ *
+ * ``` + * + * Both CSS3 animations and transitions can be used together and the animate service will figure out the correct duration and delay timing. + * + * Upon DOM mutation, the event class is added first (something like `ng-enter`), then the browser prepares itself to add + * the active class (in this case `ng-enter-active`) which then triggers the animation. The animation module will automatically + * detect the CSS code to determine when the animation ends. Once the animation is over then both CSS classes will be + * removed from the DOM. If a browser does not support CSS transitions or CSS animations then the animation will start and end + * immediately resulting in a DOM element that is at its final state. This final state is when the DOM element + * has no CSS transition/animation classes applied to it. + * + * ### Structural transition animations + * + * Structural transitions (such as enter, leave and move) will always apply a `0s none` transition + * value to force the browser into rendering the styles defined in the setup (`.ng-enter`, `.ng-leave` + * or `.ng-move`) class. This means that any active transition animations operating on the element + * will be cut off to make way for the enter, leave or move animation. + * + * ### Class-based transition animations + * + * Class-based transitions refer to transition animations that are triggered when a CSS class is + * added to or removed from the element (via `$animate.addClass`, `$animate.removeClass`, + * `$animate.setClass`, or by directives such as `ngClass`, `ngModel` and `form`). + * They are different when compared to structural animations since they **do not cancel existing + * animations** nor do they **block successive transitions** from rendering on the same element. + * This distinction allows for **multiple class-based transitions** to be performed on the same element. + * + * In addition to ngAnimate supporting the default (natural) functionality of class-based transition + * animations, ngAnimate also decorates the element with starting and ending CSS classes to aid the + * developer in further styling the element throughout the transition animation. Earlier versions + * of ngAnimate may have caused natural CSS transitions to break and not render properly due to + * $animate temporarily blocking transitions using `0s none` in order to allow the setup CSS class + * (the `-add` or `-remove` class) to be applied without triggering an animation. However, as of + * **version 1.3**, this workaround has been removed with ngAnimate and all non-ngAnimate CSS + * class transitions are compatible with ngAnimate. + * + * There is, however, one special case when dealing with class-based transitions in ngAnimate. + * When rendering class-based transitions that make use of the setup and active CSS classes + * (e.g. `.fade-add` and `.fade-add-active` for when `.fade` is added) be sure to define + * the transition value **on the active CSS class** and not the setup class. + * + * ```css + * .fade-add { + * /* remember to place a 0s transition here + * to ensure that the styles are applied instantly + * even if the element already has a transition style */ + * transition:0s linear all; + * + * /* starting CSS styles */ + * opacity:1; + * } + * .fade-add.fade-add-active { + * /* this will be the length of the animation */ + * transition:1s linear all; + * opacity:0; + * } + * ``` + * + * The setup CSS class (in this case `.fade-add`) also has a transition style property, however, it + * has a duration of zero. This may not be required, however, incase the browser is unable to render + * the styling present in this CSS class instantly then it could be that the browser is attempting + * to perform an unnecessary transition. + * + * This workaround, however, does not apply to standard class-based transitions that are rendered + * when a CSS class containing a transition is applied to an element: + * + * ```css + * /* this works as expected */ + * .fade { + * transition:1s linear all; + * opacity:0; + * } + * ``` + * + * Please keep this in mind when coding the CSS markup that will be used within class-based transitions. + * Also, try not to mix the two class-based animation flavors together since the CSS code may become + * overly complex. + * + * + * ### Preventing Collisions With Third Party Libraries + * + * Some third-party frameworks place animation duration defaults across many element or className + * selectors in order to make their code small and reuseable. This can lead to issues with ngAnimate, which + * is expecting actual animations on these elements and has to wait for their completion. + * + * You can prevent this unwanted behavior by using a prefix on all your animation classes: + * + * ```css + * /* prefixed with animate- */ + * .animate-fade-add.animate-fade-add-active { + * transition:1s linear all; + * opacity:0; + * } + * ``` + * + * You then configure `$animate` to enforce this prefix: + * + * ```js + * $animateProvider.classNameFilter(/animate-/); + * ``` + *
+ * + * ### CSS Staggering Animations + * A Staggering animation is a collection of animations that are issued with a slight delay in between each successive operation resulting in a + * curtain-like effect. The ngAnimate module (versions >=1.2) supports staggering animations and the stagger effect can be + * performed by creating a **ng-EVENT-stagger** CSS class and attaching that class to the base CSS class used for + * the animation. The style property expected within the stagger class can either be a **transition-delay** or an + * **animation-delay** property (or both if your animation contains both transitions and keyframe animations). + * + * ```css + * .my-animation.ng-enter { + * /* standard transition code */ + * -webkit-transition: 1s linear all; + * transition: 1s linear all; + * opacity:0; + * } + * .my-animation.ng-enter-stagger { + * /* this will have a 100ms delay between each successive leave animation */ + * -webkit-transition-delay: 0.1s; + * transition-delay: 0.1s; + * + * /* in case the stagger doesn't work then these two values + * must be set to 0 to avoid an accidental CSS inheritance */ + * -webkit-transition-duration: 0s; + * transition-duration: 0s; + * } + * .my-animation.ng-enter.ng-enter-active { + * /* standard transition styles */ + * opacity:1; + * } + * ``` + * + * Staggering animations work by default in ngRepeat (so long as the CSS class is defined). Outside of ngRepeat, to use staggering animations + * on your own, they can be triggered by firing multiple calls to the same event on $animate. However, the restrictions surrounding this + * are that each of the elements must have the same CSS className value as well as the same parent element. A stagger operation + * will also be reset if more than 10ms has passed after the last animation has been fired. + * + * The following code will issue the **ng-leave-stagger** event on the element provided: + * + * ```js + * var kids = parent.children(); + * + * $animate.leave(kids[0]); //stagger index=0 + * $animate.leave(kids[1]); //stagger index=1 + * $animate.leave(kids[2]); //stagger index=2 + * $animate.leave(kids[3]); //stagger index=3 + * $animate.leave(kids[4]); //stagger index=4 + * + * $timeout(function() { + * //stagger has reset itself + * $animate.leave(kids[5]); //stagger index=0 + * $animate.leave(kids[6]); //stagger index=1 + * }, 100, false); + * ``` + * + * Stagger animations are currently only supported within CSS-defined animations. + * + * ## JavaScript-defined Animations + * In the event that you do not want to use CSS3 transitions or CSS3 animations or if you wish to offer animations on browsers that do not + * yet support CSS transitions/animations, then you can make use of JavaScript animations defined inside of your AngularJS module. + * + * ```js + * //!annotate="YourApp" Your AngularJS Module|Replace this or ngModule with the module that you used to define your application. + * var ngModule = angular.module('YourApp', ['ngAnimate']); + * ngModule.animation('.my-crazy-animation', function() { + * return { + * enter: function(element, done) { + * //run the animation here and call done when the animation is complete + * return function(cancelled) { + * //this (optional) function will be called when the animation + * //completes or when the animation is cancelled (the cancelled + * //flag will be set to true if cancelled). + * }; + * }, + * leave: function(element, done) { }, + * move: function(element, done) { }, + * + * //animation that can be triggered before the class is added + * beforeAddClass: function(element, className, done) { }, + * + * //animation that can be triggered after the class is added + * addClass: function(element, className, done) { }, + * + * //animation that can be triggered before the class is removed + * beforeRemoveClass: function(element, className, done) { }, + * + * //animation that can be triggered after the class is removed + * removeClass: function(element, className, done) { } + * }; + * }); + * ``` + * + * JavaScript-defined animations are created with a CSS-like class selector and a collection of events which are set to run + * a javascript callback function. When an animation is triggered, $animate will look for a matching animation which fits + * the element's CSS class attribute value and then run the matching animation event function (if found). + * In other words, if the CSS classes present on the animated element match any of the JavaScript animations then the callback function will + * be executed. It should be also noted that only simple, single class selectors are allowed (compound class selectors are not supported). + * + * Within a JavaScript animation, an object containing various event callback animation functions is expected to be returned. + * As explained above, these callbacks are triggered based on the animation event. Therefore if an enter animation is run, + * and the JavaScript animation is found, then the enter callback will handle that animation (in addition to the CSS keyframe animation + * or transition code that is defined via a stylesheet). + * + * + * ### Applying Directive-specific Styles to an Animation + * In some cases a directive or service may want to provide `$animate` with extra details that the animation will + * include into its animation. Let's say for example we wanted to render an animation that animates an element + * towards the mouse coordinates as to where the user clicked last. By collecting the X/Y coordinates of the click + * (via the event parameter) we can set the `top` and `left` styles into an object and pass that into our function + * call to `$animate.addClass`. + * + * ```js + * canvas.on('click', function(e) { + * $animate.addClass(element, 'on', { + * to: { + * left : e.client.x + 'px', + * top : e.client.y + 'px' + * } + * }): + * }); + * ``` + * + * Now when the animation runs, and a transition or keyframe animation is picked up, then the animation itself will + * also include and transition the styling of the `left` and `top` properties into its running animation. If we want + * to provide some starting animation values then we can do so by placing the starting animations styles into an object + * called `from` in the same object as the `to` animations. + * + * ```js + * canvas.on('click', function(e) { + * $animate.addClass(element, 'on', { + * from: { + * position: 'absolute', + * left: '0px', + * top: '0px' + * }, + * to: { + * left : e.client.x + 'px', + * top : e.client.y + 'px' + * } + * }): + * }); + * ``` + * + * Once the animation is complete or cancelled then the union of both the before and after styles are applied to the + * element. If `ngAnimate` is not present then the styles will be applied immediately. + * + */ + +angular.module('ngAnimate', ['ng']) + + /** + * @ngdoc provider + * @name $animateProvider + * @description + * + * The `$animateProvider` allows developers to register JavaScript animation event handlers directly inside of a module. + * When an animation is triggered, the $animate service will query the $animate service to find any animations that match + * the provided name value. + * + * Requires the {@link ngAnimate `ngAnimate`} module to be installed. + * + * Please visit the {@link ngAnimate `ngAnimate`} module overview page learn more about how to use animations in your application. + * + */ + .directive('ngAnimateChildren', function() { + var NG_ANIMATE_CHILDREN = '$$ngAnimateChildren'; + return function(scope, element, attrs) { + var val = attrs.ngAnimateChildren; + if (angular.isString(val) && val.length === 0) { //empty attribute + element.data(NG_ANIMATE_CHILDREN, true); + } else { + scope.$watch(val, function(value) { + element.data(NG_ANIMATE_CHILDREN, !!value); + }); + } + }; + }) + + //this private service is only used within CSS-enabled animations + //IE8 + IE9 do not support rAF natively, but that is fine since they + //also don't support transitions and keyframes which means that the code + //below will never be used by the two browsers. + .factory('$$animateReflow', ['$$rAF', '$document', function($$rAF, $document) { + var bod = $document[0].body; + return function(fn) { + //the returned function acts as the cancellation function + return $$rAF(function() { + //the line below will force the browser to perform a repaint + //so that all the animated elements within the animation frame + //will be properly updated and drawn on screen. This is + //required to perform multi-class CSS based animations with + //Firefox. DO NOT REMOVE THIS LINE. + var a = bod.offsetWidth + 1; + fn(); + }); + }; + }]) + + .config(['$provide', '$animateProvider', function($provide, $animateProvider) { + var noop = angular.noop; + var forEach = angular.forEach; + var selectors = $animateProvider.$$selectors; + var isArray = angular.isArray; + var isString = angular.isString; + var isObject = angular.isObject; + + var ELEMENT_NODE = 1; + var NG_ANIMATE_STATE = '$$ngAnimateState'; + var NG_ANIMATE_CHILDREN = '$$ngAnimateChildren'; + var NG_ANIMATE_CLASS_NAME = 'ng-animate'; + var rootAnimateState = {running: true}; + + function extractElementNode(element) { + for (var i = 0; i < element.length; i++) { + var elm = element[i]; + if (elm.nodeType == ELEMENT_NODE) { + return elm; + } + } + } + + function prepareElement(element) { + return element && angular.element(element); + } + + function stripCommentsFromElement(element) { + return angular.element(extractElementNode(element)); + } + + function isMatchingElement(elm1, elm2) { + return extractElementNode(elm1) == extractElementNode(elm2); + } + var $$jqLite; + $provide.decorator('$animate', + ['$delegate', '$$q', '$injector', '$sniffer', '$rootElement', '$$asyncCallback', '$rootScope', '$document', '$templateRequest', '$$jqLite', + function($delegate, $$q, $injector, $sniffer, $rootElement, $$asyncCallback, $rootScope, $document, $templateRequest, $$$jqLite) { + + $$jqLite = $$$jqLite; + $rootElement.data(NG_ANIMATE_STATE, rootAnimateState); + + // Wait until all directive and route-related templates are downloaded and + // compiled. The $templateRequest.totalPendingRequests variable keeps track of + // all of the remote templates being currently downloaded. If there are no + // templates currently downloading then the watcher will still fire anyway. + var deregisterWatch = $rootScope.$watch( + function() { return $templateRequest.totalPendingRequests; }, + function(val, oldVal) { + if (val !== 0) return; + deregisterWatch(); + + // Now that all templates have been downloaded, $animate will wait until + // the post digest queue is empty before enabling animations. By having two + // calls to $postDigest calls we can ensure that the flag is enabled at the + // very end of the post digest queue. Since all of the animations in $animate + // use $postDigest, it's important that the code below executes at the end. + // This basically means that the page is fully downloaded and compiled before + // any animations are triggered. + $rootScope.$$postDigest(function() { + $rootScope.$$postDigest(function() { + rootAnimateState.running = false; + }); + }); + } + ); + + var globalAnimationCounter = 0; + var classNameFilter = $animateProvider.classNameFilter(); + var isAnimatableClassName = !classNameFilter + ? function() { return true; } + : function(className) { + return classNameFilter.test(className); + }; + + function classBasedAnimationsBlocked(element, setter) { + var data = element.data(NG_ANIMATE_STATE) || {}; + if (setter) { + data.running = true; + data.structural = true; + element.data(NG_ANIMATE_STATE, data); + } + return data.disabled || (data.running && data.structural); + } + + function runAnimationPostDigest(fn) { + var cancelFn, defer = $$q.defer(); + defer.promise.$$cancelFn = function() { + cancelFn && cancelFn(); + }; + $rootScope.$$postDigest(function() { + cancelFn = fn(function() { + defer.resolve(); + }); + }); + return defer.promise; + } + + function parseAnimateOptions(options) { + // some plugin code may still be passing in the callback + // function as the last param for the $animate methods so + // it's best to only allow string or array values for now + if (isObject(options)) { + if (options.tempClasses && isString(options.tempClasses)) { + options.tempClasses = options.tempClasses.split(/\s+/); + } + return options; + } + } + + function resolveElementClasses(element, cache, runningAnimations) { + runningAnimations = runningAnimations || {}; + + var lookup = {}; + forEach(runningAnimations, function(data, selector) { + forEach(selector.split(' '), function(s) { + lookup[s]=data; + }); + }); + + var hasClasses = Object.create(null); + forEach((element.attr('class') || '').split(/\s+/), function(className) { + hasClasses[className] = true; + }); + + var toAdd = [], toRemove = []; + forEach((cache && cache.classes) || [], function(status, className) { + var hasClass = hasClasses[className]; + var matchingAnimation = lookup[className] || {}; + + // When addClass and removeClass is called then $animate will check to + // see if addClass and removeClass cancel each other out. When there are + // more calls to removeClass than addClass then the count falls below 0 + // and then the removeClass animation will be allowed. Otherwise if the + // count is above 0 then that means an addClass animation will commence. + // Once an animation is allowed then the code will also check to see if + // there exists any on-going animation that is already adding or remvoing + // the matching CSS class. + if (status === false) { + //does it have the class or will it have the class + if (hasClass || matchingAnimation.event == 'addClass') { + toRemove.push(className); + } + } else if (status === true) { + //is the class missing or will it be removed? + if (!hasClass || matchingAnimation.event == 'removeClass') { + toAdd.push(className); + } + } + }); + + return (toAdd.length + toRemove.length) > 0 && [toAdd.join(' '), toRemove.join(' ')]; + } + + function lookup(name) { + if (name) { + var matches = [], + flagMap = {}, + classes = name.substr(1).split('.'); + + //the empty string value is the default animation + //operation which performs CSS transition and keyframe + //animations sniffing. This is always included for each + //element animation procedure if the browser supports + //transitions and/or keyframe animations. The default + //animation is added to the top of the list to prevent + //any previous animations from affecting the element styling + //prior to the element being animated. + if ($sniffer.transitions || $sniffer.animations) { + matches.push($injector.get(selectors[''])); + } + + for (var i=0; i < classes.length; i++) { + var klass = classes[i], + selectorFactoryName = selectors[klass]; + if (selectorFactoryName && !flagMap[klass]) { + matches.push($injector.get(selectorFactoryName)); + flagMap[klass] = true; + } + } + return matches; + } + } + + function animationRunner(element, animationEvent, className, options) { + //transcluded directives may sometimes fire an animation using only comment nodes + //best to catch this early on to prevent any animation operations from occurring + var node = element[0]; + if (!node) { + return; + } + + if (options) { + options.to = options.to || {}; + options.from = options.from || {}; + } + + var classNameAdd; + var classNameRemove; + if (isArray(className)) { + classNameAdd = className[0]; + classNameRemove = className[1]; + if (!classNameAdd) { + className = classNameRemove; + animationEvent = 'removeClass'; + } else if (!classNameRemove) { + className = classNameAdd; + animationEvent = 'addClass'; + } else { + className = classNameAdd + ' ' + classNameRemove; + } + } + + var isSetClassOperation = animationEvent == 'setClass'; + var isClassBased = isSetClassOperation + || animationEvent == 'addClass' + || animationEvent == 'removeClass' + || animationEvent == 'animate'; + + var currentClassName = element.attr('class'); + var classes = currentClassName + ' ' + className; + if (!isAnimatableClassName(classes)) { + return; + } + + var beforeComplete = noop, + beforeCancel = [], + before = [], + afterComplete = noop, + afterCancel = [], + after = []; + + var animationLookup = (' ' + classes).replace(/\s+/g,'.'); + forEach(lookup(animationLookup), function(animationFactory) { + var created = registerAnimation(animationFactory, animationEvent); + if (!created && isSetClassOperation) { + registerAnimation(animationFactory, 'addClass'); + registerAnimation(animationFactory, 'removeClass'); + } + }); + + function registerAnimation(animationFactory, event) { + var afterFn = animationFactory[event]; + var beforeFn = animationFactory['before' + event.charAt(0).toUpperCase() + event.substr(1)]; + if (afterFn || beforeFn) { + if (event == 'leave') { + beforeFn = afterFn; + //when set as null then animation knows to skip this phase + afterFn = null; + } + after.push({ + event: event, fn: afterFn + }); + before.push({ + event: event, fn: beforeFn + }); + return true; + } + } + + function run(fns, cancellations, allCompleteFn) { + var animations = []; + forEach(fns, function(animation) { + animation.fn && animations.push(animation); + }); + + var count = 0; + function afterAnimationComplete(index) { + if (cancellations) { + (cancellations[index] || noop)(); + if (++count < animations.length) return; + cancellations = null; + } + allCompleteFn(); + } + + //The code below adds directly to the array in order to work with + //both sync and async animations. Sync animations are when the done() + //operation is called right away. DO NOT REFACTOR! + forEach(animations, function(animation, index) { + var progress = function() { + afterAnimationComplete(index); + }; + switch (animation.event) { + case 'setClass': + cancellations.push(animation.fn(element, classNameAdd, classNameRemove, progress, options)); + break; + case 'animate': + cancellations.push(animation.fn(element, className, options.from, options.to, progress)); + break; + case 'addClass': + cancellations.push(animation.fn(element, classNameAdd || className, progress, options)); + break; + case 'removeClass': + cancellations.push(animation.fn(element, classNameRemove || className, progress, options)); + break; + default: + cancellations.push(animation.fn(element, progress, options)); + break; + } + }); + + if (cancellations && cancellations.length === 0) { + allCompleteFn(); + } + } + + return { + node: node, + event: animationEvent, + className: className, + isClassBased: isClassBased, + isSetClassOperation: isSetClassOperation, + applyStyles: function() { + if (options) { + element.css(angular.extend(options.from || {}, options.to || {})); + } + }, + before: function(allCompleteFn) { + beforeComplete = allCompleteFn; + run(before, beforeCancel, function() { + beforeComplete = noop; + allCompleteFn(); + }); + }, + after: function(allCompleteFn) { + afterComplete = allCompleteFn; + run(after, afterCancel, function() { + afterComplete = noop; + allCompleteFn(); + }); + }, + cancel: function() { + if (beforeCancel) { + forEach(beforeCancel, function(cancelFn) { + (cancelFn || noop)(true); + }); + beforeComplete(true); + } + if (afterCancel) { + forEach(afterCancel, function(cancelFn) { + (cancelFn || noop)(true); + }); + afterComplete(true); + } + } + }; + } + + /** + * @ngdoc service + * @name $animate + * @kind object + * + * @description + * The `$animate` service provides animation detection support while performing DOM operations (enter, leave and move) as well as during addClass and removeClass operations. + * When any of these operations are run, the $animate service + * will examine any JavaScript-defined animations (which are defined by using the $animateProvider provider object) + * as well as any CSS-defined animations against the CSS classes present on the element once the DOM operation is run. + * + * The `$animate` service is used behind the scenes with pre-existing directives and animation with these directives + * will work out of the box without any extra configuration. + * + * Requires the {@link ngAnimate `ngAnimate`} module to be installed. + * + * Please visit the {@link ngAnimate `ngAnimate`} module overview page learn more about how to use animations in your application. + * ## Callback Promises + * With AngularJS 1.3, each of the animation methods, on the `$animate` service, return a promise when called. The + * promise itself is then resolved once the animation has completed itself, has been cancelled or has been + * skipped due to animations being disabled. (Note that even if the animation is cancelled it will still + * call the resolve function of the animation.) + * + * ```js + * $animate.enter(element, container).then(function() { + * //...this is called once the animation is complete... + * }); + * ``` + * + * Also note that, due to the nature of the callback promise, if any Angular-specific code (like changing the scope, + * location of the page, etc...) is executed within the callback promise then be sure to wrap the code using + * `$scope.$apply(...)`; + * + * ```js + * $animate.leave(element).then(function() { + * $scope.$apply(function() { + * $location.path('/new-page'); + * }); + * }); + * ``` + * + * An animation can also be cancelled by calling the `$animate.cancel(promise)` method with the provided + * promise that was returned when the animation was started. + * + * ```js + * var promise = $animate.addClass(element, 'super-long-animation'); + * promise.then(function() { + * //this will still be called even if cancelled + * }); + * + * element.on('click', function() { + * //tooo lazy to wait for the animation to end + * $animate.cancel(promise); + * }); + * ``` + * + * (Keep in mind that the promise cancellation is unique to `$animate` since promises in + * general cannot be cancelled.) + * + */ + return { + /** + * @ngdoc method + * @name $animate#animate + * @kind function + * + * @description + * Performs an inline animation on the element which applies the provided `to` and `from` CSS styles to the element. + * If any detected CSS transition, keyframe or JavaScript matches the provided `className` value then the animation + * will take on the provided styles. For example, if a transition animation is set for the given className then the + * provided `from` and `to` styles will be applied alongside the given transition. If a JavaScript animation is + * detected then the provided styles will be given in as function paramters. + * + * ```js + * ngModule.animation('.my-inline-animation', function() { + * return { + * animate : function(element, className, from, to, done) { + * //styles + * } + * } + * }); + * ``` + * + * Below is a breakdown of each step that occurs during the `animate` animation: + * + * | Animation Step | What the element class attribute looks like | + * |-----------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------| + * | 1. `$animate.animate(...)` is called | `class="my-animation"` | + * | 2. `$animate` waits for the next digest to start the animation | `class="my-animation ng-animate"` | + * | 3. `$animate` runs the JavaScript-defined animations detected on the element | `class="my-animation ng-animate"` | + * | 4. the `className` class value is added to the element | `class="my-animation ng-animate className"` | + * | 5. `$animate` scans the element styles to get the CSS transition/animation duration and delay | `class="my-animation ng-animate className"` | + * | 6. `$animate` blocks all CSS transitions on the element to ensure the `.className` class styling is applied right away| `class="my-animation ng-animate className"` | + * | 7. `$animate` applies the provided collection of `from` CSS styles to the element | `class="my-animation ng-animate className"` | + * | 8. `$animate` waits for a single animation frame (this performs a reflow) | `class="my-animation ng-animate className"` | + * | 9. `$animate` removes the CSS transition block placed on the element | `class="my-animation ng-animate className"` | + * | 10. the `className-active` class is added (this triggers the CSS transition/animation) | `class="my-animation ng-animate className className-active"` | + * | 11. `$animate` applies the collection of `to` CSS styles to the element which are then handled by the transition | `class="my-animation ng-animate className className-active"` | + * | 12. `$animate` waits for the animation to complete (via events and timeout) | `class="my-animation ng-animate className className-active"` | + * | 13. The animation ends and all generated CSS classes are removed from the element | `class="my-animation"` | + * | 14. The returned promise is resolved. | `class="my-animation"` | + * + * @param {DOMElement} element the element that will be the focus of the enter animation + * @param {object} from a collection of CSS styles that will be applied to the element at the start of the animation + * @param {object} to a collection of CSS styles that the element will animate towards + * @param {string=} className an optional CSS class that will be added to the element for the duration of the animation (the default class is `ng-inline-animate`) + * @param {object=} options an optional collection of options that will be picked up by the CSS transition/animation + * @return {Promise} the animation callback promise + */ + animate: function(element, from, to, className, options) { + className = className || 'ng-inline-animate'; + options = parseAnimateOptions(options) || {}; + options.from = to ? from : null; + options.to = to ? to : from; + + return runAnimationPostDigest(function(done) { + return performAnimation('animate', className, stripCommentsFromElement(element), null, null, noop, options, done); + }); + }, + + /** + * @ngdoc method + * @name $animate#enter + * @kind function + * + * @description + * Appends the element to the parentElement element that resides in the document and then runs the enter animation. Once + * the animation is started, the following CSS classes will be present on the element for the duration of the animation: + * + * Below is a breakdown of each step that occurs during enter animation: + * + * | Animation Step | What the element class attribute looks like | + * |-----------------------------------------------------------------------------------------------------------------------|------------------------------------------------------------| + * | 1. `$animate.enter(...)` is called | `class="my-animation"` | + * | 2. element is inserted into the `parentElement` element or beside the `afterElement` element | `class="my-animation"` | + * | 3. `$animate` waits for the next digest to start the animation | `class="my-animation ng-animate"` | + * | 4. `$animate` runs the JavaScript-defined animations detected on the element | `class="my-animation ng-animate"` | + * | 5. the `.ng-enter` class is added to the element | `class="my-animation ng-animate ng-enter"` | + * | 6. `$animate` scans the element styles to get the CSS transition/animation duration and delay | `class="my-animation ng-animate ng-enter"` | + * | 7. `$animate` blocks all CSS transitions on the element to ensure the `.ng-enter` class styling is applied right away | `class="my-animation ng-animate ng-enter"` | + * | 8. `$animate` waits for a single animation frame (this performs a reflow) | `class="my-animation ng-animate ng-enter"` | + * | 9. `$animate` removes the CSS transition block placed on the element | `class="my-animation ng-animate ng-enter"` | + * | 10. the `.ng-enter-active` class is added (this triggers the CSS transition/animation) | `class="my-animation ng-animate ng-enter ng-enter-active"` | + * | 11. `$animate` waits for the animation to complete (via events and timeout) | `class="my-animation ng-animate ng-enter ng-enter-active"` | + * | 12. The animation ends and all generated CSS classes are removed from the element | `class="my-animation"` | + * | 13. The returned promise is resolved. | `class="my-animation"` | + * + * @param {DOMElement} element the element that will be the focus of the enter animation + * @param {DOMElement} parentElement the parent element of the element that will be the focus of the enter animation + * @param {DOMElement} afterElement the sibling element (which is the previous element) of the element that will be the focus of the enter animation + * @param {object=} options an optional collection of options that will be picked up by the CSS transition/animation + * @return {Promise} the animation callback promise + */ + enter: function(element, parentElement, afterElement, options) { + options = parseAnimateOptions(options); + element = angular.element(element); + parentElement = prepareElement(parentElement); + afterElement = prepareElement(afterElement); + + classBasedAnimationsBlocked(element, true); + $delegate.enter(element, parentElement, afterElement); + return runAnimationPostDigest(function(done) { + return performAnimation('enter', 'ng-enter', stripCommentsFromElement(element), parentElement, afterElement, noop, options, done); + }); + }, + + /** + * @ngdoc method + * @name $animate#leave + * @kind function + * + * @description + * Runs the leave animation operation and, upon completion, removes the element from the DOM. Once + * the animation is started, the following CSS classes will be added for the duration of the animation: + * + * Below is a breakdown of each step that occurs during leave animation: + * + * | Animation Step | What the element class attribute looks like | + * |-----------------------------------------------------------------------------------------------------------------------|------------------------------------------------------------| + * | 1. `$animate.leave(...)` is called | `class="my-animation"` | + * | 2. `$animate` runs the JavaScript-defined animations detected on the element | `class="my-animation ng-animate"` | + * | 3. `$animate` waits for the next digest to start the animation | `class="my-animation ng-animate"` | + * | 4. the `.ng-leave` class is added to the element | `class="my-animation ng-animate ng-leave"` | + * | 5. `$animate` scans the element styles to get the CSS transition/animation duration and delay | `class="my-animation ng-animate ng-leave"` | + * | 6. `$animate` blocks all CSS transitions on the element to ensure the `.ng-leave` class styling is applied right away | `class="my-animation ng-animate ng-leave"` | + * | 7. `$animate` waits for a single animation frame (this performs a reflow) | `class="my-animation ng-animate ng-leave"` | + * | 8. `$animate` removes the CSS transition block placed on the element | `class="my-animation ng-animate ng-leave"` | + * | 9. the `.ng-leave-active` class is added (this triggers the CSS transition/animation) | `class="my-animation ng-animate ng-leave ng-leave-active"` | + * | 10. `$animate` waits for the animation to complete (via events and timeout) | `class="my-animation ng-animate ng-leave ng-leave-active"` | + * | 11. The animation ends and all generated CSS classes are removed from the element | `class="my-animation"` | + * | 12. The element is removed from the DOM | ... | + * | 13. The returned promise is resolved. | ... | + * + * @param {DOMElement} element the element that will be the focus of the leave animation + * @param {object=} options an optional collection of styles that will be picked up by the CSS transition/animation + * @return {Promise} the animation callback promise + */ + leave: function(element, options) { + options = parseAnimateOptions(options); + element = angular.element(element); + + cancelChildAnimations(element); + classBasedAnimationsBlocked(element, true); + return runAnimationPostDigest(function(done) { + return performAnimation('leave', 'ng-leave', stripCommentsFromElement(element), null, null, function() { + $delegate.leave(element); + }, options, done); + }); + }, + + /** + * @ngdoc method + * @name $animate#move + * @kind function + * + * @description + * Fires the move DOM operation. Just before the animation starts, the animate service will either append it into the parentElement container or + * add the element directly after the afterElement element if present. Then the move animation will be run. Once + * the animation is started, the following CSS classes will be added for the duration of the animation: + * + * Below is a breakdown of each step that occurs during move animation: + * + * | Animation Step | What the element class attribute looks like | + * |----------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------| + * | 1. `$animate.move(...)` is called | `class="my-animation"` | + * | 2. element is moved into the parentElement element or beside the afterElement element | `class="my-animation"` | + * | 3. `$animate` waits for the next digest to start the animation | `class="my-animation ng-animate"` | + * | 4. `$animate` runs the JavaScript-defined animations detected on the element | `class="my-animation ng-animate"` | + * | 5. the `.ng-move` class is added to the element | `class="my-animation ng-animate ng-move"` | + * | 6. `$animate` scans the element styles to get the CSS transition/animation duration and delay | `class="my-animation ng-animate ng-move"` | + * | 7. `$animate` blocks all CSS transitions on the element to ensure the `.ng-move` class styling is applied right away | `class="my-animation ng-animate ng-move"` | + * | 8. `$animate` waits for a single animation frame (this performs a reflow) | `class="my-animation ng-animate ng-move"` | + * | 9. `$animate` removes the CSS transition block placed on the element | `class="my-animation ng-animate ng-move"` | + * | 10. the `.ng-move-active` class is added (this triggers the CSS transition/animation) | `class="my-animation ng-animate ng-move ng-move-active"` | + * | 11. `$animate` waits for the animation to complete (via events and timeout) | `class="my-animation ng-animate ng-move ng-move-active"` | + * | 12. The animation ends and all generated CSS classes are removed from the element | `class="my-animation"` | + * | 13. The returned promise is resolved. | `class="my-animation"` | + * + * @param {DOMElement} element the element that will be the focus of the move animation + * @param {DOMElement} parentElement the parentElement element of the element that will be the focus of the move animation + * @param {DOMElement} afterElement the sibling element (which is the previous element) of the element that will be the focus of the move animation + * @param {object=} options an optional collection of styles that will be picked up by the CSS transition/animation + * @return {Promise} the animation callback promise + */ + move: function(element, parentElement, afterElement, options) { + options = parseAnimateOptions(options); + element = angular.element(element); + parentElement = prepareElement(parentElement); + afterElement = prepareElement(afterElement); + + cancelChildAnimations(element); + classBasedAnimationsBlocked(element, true); + $delegate.move(element, parentElement, afterElement); + return runAnimationPostDigest(function(done) { + return performAnimation('move', 'ng-move', stripCommentsFromElement(element), parentElement, afterElement, noop, options, done); + }); + }, + + /** + * @ngdoc method + * @name $animate#addClass + * + * @description + * Triggers a custom animation event based off the className variable and then attaches the className value to the element as a CSS class. + * Unlike the other animation methods, the animate service will suffix the className value with {@type -add} in order to provide + * the animate service the setup and active CSS classes in order to trigger the animation (this will be skipped if no CSS transitions + * or keyframes are defined on the -add-active or base CSS class). + * + * Below is a breakdown of each step that occurs during addClass animation: + * + * | Animation Step | What the element class attribute looks like | + * |--------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------| + * | 1. `$animate.addClass(element, 'super')` is called | `class="my-animation"` | + * | 2. `$animate` runs the JavaScript-defined animations detected on the element | `class="my-animation ng-animate"` | + * | 3. the `.super-add` class is added to the element | `class="my-animation ng-animate super-add"` | + * | 4. `$animate` waits for a single animation frame (this performs a reflow) | `class="my-animation ng-animate super-add"` | + * | 5. the `.super` and `.super-add-active` classes are added (this triggers the CSS transition/animation) | `class="my-animation ng-animate super super-add super-add-active"` | + * | 6. `$animate` scans the element styles to get the CSS transition/animation duration and delay | `class="my-animation ng-animate super super-add super-add-active"` | + * | 7. `$animate` waits for the animation to complete (via events and timeout) | `class="my-animation ng-animate super super-add super-add-active"` | + * | 8. The animation ends and all generated CSS classes are removed from the element | `class="my-animation super"` | + * | 9. The super class is kept on the element | `class="my-animation super"` | + * | 10. The returned promise is resolved. | `class="my-animation super"` | + * + * @param {DOMElement} element the element that will be animated + * @param {string} className the CSS class that will be added to the element and then animated + * @param {object=} options an optional collection of styles that will be picked up by the CSS transition/animation + * @return {Promise} the animation callback promise + */ + addClass: function(element, className, options) { + return this.setClass(element, className, [], options); + }, + + /** + * @ngdoc method + * @name $animate#removeClass + * + * @description + * Triggers a custom animation event based off the className variable and then removes the CSS class provided by the className value + * from the element. Unlike the other animation methods, the animate service will suffix the className value with {@type -remove} in + * order to provide the animate service the setup and active CSS classes in order to trigger the animation (this will be skipped if + * no CSS transitions or keyframes are defined on the -remove or base CSS classes). + * + * Below is a breakdown of each step that occurs during removeClass animation: + * + * | Animation Step | What the element class attribute looks like | + * |----------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------| + * | 1. `$animate.removeClass(element, 'super')` is called | `class="my-animation super"` | + * | 2. `$animate` runs the JavaScript-defined animations detected on the element | `class="my-animation super ng-animate"` | + * | 3. the `.super-remove` class is added to the element | `class="my-animation super ng-animate super-remove"` | + * | 4. `$animate` waits for a single animation frame (this performs a reflow) | `class="my-animation super ng-animate super-remove"` | + * | 5. the `.super-remove-active` classes are added and `.super` is removed (this triggers the CSS transition/animation) | `class="my-animation ng-animate super-remove super-remove-active"` | + * | 6. `$animate` scans the element styles to get the CSS transition/animation duration and delay | `class="my-animation ng-animate super-remove super-remove-active"` | + * | 7. `$animate` waits for the animation to complete (via events and timeout) | `class="my-animation ng-animate super-remove super-remove-active"` | + * | 8. The animation ends and all generated CSS classes are removed from the element | `class="my-animation"` | + * | 9. The returned promise is resolved. | `class="my-animation"` | + * + * + * @param {DOMElement} element the element that will be animated + * @param {string} className the CSS class that will be animated and then removed from the element + * @param {object=} options an optional collection of styles that will be picked up by the CSS transition/animation + * @return {Promise} the animation callback promise + */ + removeClass: function(element, className, options) { + return this.setClass(element, [], className, options); + }, + + /** + * + * @ngdoc method + * @name $animate#setClass + * + * @description Adds and/or removes the given CSS classes to and from the element. + * Once complete, the `done()` callback will be fired (if provided). + * + * | Animation Step | What the element class attribute looks like | + * |----------------------------------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------| + * | 1. `$animate.setClass(element, 'on', 'off')` is called | `class="my-animation off"` | + * | 2. `$animate` runs the JavaScript-defined animations detected on the element | `class="my-animation ng-animate off"` | + * | 3. the `.on-add` and `.off-remove` classes are added to the element | `class="my-animation ng-animate on-add off-remove off"` | + * | 4. `$animate` waits for a single animation frame (this performs a reflow) | `class="my-animation ng-animate on-add off-remove off"` | + * | 5. the `.on`, `.on-add-active` and `.off-remove-active` classes are added and `.off` is removed (this triggers the CSS transition/animation) | `class="my-animation ng-animate on on-add on-add-active off-remove off-remove-active"` | + * | 6. `$animate` scans the element styles to get the CSS transition/animation duration and delay | `class="my-animation ng-animate on on-add on-add-active off-remove off-remove-active"` | + * | 7. `$animate` waits for the animation to complete (via events and timeout) | `class="my-animation ng-animate on on-add on-add-active off-remove off-remove-active"` | + * | 8. The animation ends and all generated CSS classes are removed from the element | `class="my-animation on"` | + * | 9. The returned promise is resolved. | `class="my-animation on"` | + * + * @param {DOMElement} element the element which will have its CSS classes changed + * removed from it + * @param {string} add the CSS classes which will be added to the element + * @param {string} remove the CSS class which will be removed from the element + * CSS classes have been set on the element + * @param {object=} options an optional collection of styles that will be picked up by the CSS transition/animation + * @return {Promise} the animation callback promise + */ + setClass: function(element, add, remove, options) { + options = parseAnimateOptions(options); + + var STORAGE_KEY = '$$animateClasses'; + element = angular.element(element); + element = stripCommentsFromElement(element); + + if (classBasedAnimationsBlocked(element)) { + return $delegate.$$setClassImmediately(element, add, remove, options); + } + + // we're using a combined array for both the add and remove + // operations since the ORDER OF addClass and removeClass matters + var classes, cache = element.data(STORAGE_KEY); + var hasCache = !!cache; + if (!cache) { + cache = {}; + cache.classes = {}; + } + classes = cache.classes; + + add = isArray(add) ? add : add.split(' '); + forEach(add, function(c) { + if (c && c.length) { + classes[c] = true; + } + }); + + remove = isArray(remove) ? remove : remove.split(' '); + forEach(remove, function(c) { + if (c && c.length) { + classes[c] = false; + } + }); + + if (hasCache) { + if (options && cache.options) { + cache.options = angular.extend(cache.options || {}, options); + } + + //the digest cycle will combine all the animations into one function + return cache.promise; + } else { + element.data(STORAGE_KEY, cache = { + classes: classes, + options: options + }); + } + + return cache.promise = runAnimationPostDigest(function(done) { + var parentElement = element.parent(); + var elementNode = extractElementNode(element); + var parentNode = elementNode.parentNode; + // TODO(matsko): move this code into the animationsDisabled() function once #8092 is fixed + if (!parentNode || parentNode['$$NG_REMOVED'] || elementNode['$$NG_REMOVED']) { + done(); + return; + } + + var cache = element.data(STORAGE_KEY); + element.removeData(STORAGE_KEY); + + var state = element.data(NG_ANIMATE_STATE) || {}; + var classes = resolveElementClasses(element, cache, state.active); + return !classes + ? done() + : performAnimation('setClass', classes, element, parentElement, null, function() { + if (classes[0]) $delegate.$$addClassImmediately(element, classes[0]); + if (classes[1]) $delegate.$$removeClassImmediately(element, classes[1]); + }, cache.options, done); + }); + }, + + /** + * @ngdoc method + * @name $animate#cancel + * @kind function + * + * @param {Promise} animationPromise The animation promise that is returned when an animation is started. + * + * @description + * Cancels the provided animation. + */ + cancel: function(promise) { + promise.$$cancelFn(); + }, + + /** + * @ngdoc method + * @name $animate#enabled + * @kind function + * + * @param {boolean=} value If provided then set the animation on or off. + * @param {DOMElement=} element If provided then the element will be used to represent the enable/disable operation + * @return {boolean} Current animation state. + * + * @description + * Globally enables/disables animations. + * + */ + enabled: function(value, element) { + switch (arguments.length) { + case 2: + if (value) { + cleanup(element); + } else { + var data = element.data(NG_ANIMATE_STATE) || {}; + data.disabled = true; + element.data(NG_ANIMATE_STATE, data); + } + break; + + case 1: + rootAnimateState.disabled = !value; + break; + + default: + value = !rootAnimateState.disabled; + break; + } + return !!value; + } + }; + + /* + all animations call this shared animation triggering function internally. + The animationEvent variable refers to the JavaScript animation event that will be triggered + and the className value is the name of the animation that will be applied within the + CSS code. Element, `parentElement` and `afterElement` are provided DOM elements for the animation + and the onComplete callback will be fired once the animation is fully complete. + */ + function performAnimation(animationEvent, className, element, parentElement, afterElement, domOperation, options, doneCallback) { + var noopCancel = noop; + var runner = animationRunner(element, animationEvent, className, options); + if (!runner) { + fireDOMOperation(); + fireBeforeCallbackAsync(); + fireAfterCallbackAsync(); + closeAnimation(); + return noopCancel; + } + + animationEvent = runner.event; + className = runner.className; + var elementEvents = angular.element._data(runner.node); + elementEvents = elementEvents && elementEvents.events; + + if (!parentElement) { + parentElement = afterElement ? afterElement.parent() : element.parent(); + } + + //skip the animation if animations are disabled, a parent is already being animated, + //the element is not currently attached to the document body or then completely close + //the animation if any matching animations are not found at all. + //NOTE: IE8 + IE9 should close properly (run closeAnimation()) in case an animation was found. + if (animationsDisabled(element, parentElement)) { + fireDOMOperation(); + fireBeforeCallbackAsync(); + fireAfterCallbackAsync(); + closeAnimation(); + return noopCancel; + } + + var ngAnimateState = element.data(NG_ANIMATE_STATE) || {}; + var runningAnimations = ngAnimateState.active || {}; + var totalActiveAnimations = ngAnimateState.totalActive || 0; + var lastAnimation = ngAnimateState.last; + var skipAnimation = false; + + if (totalActiveAnimations > 0) { + var animationsToCancel = []; + if (!runner.isClassBased) { + if (animationEvent == 'leave' && runningAnimations['ng-leave']) { + skipAnimation = true; + } else { + //cancel all animations when a structural animation takes place + for (var klass in runningAnimations) { + animationsToCancel.push(runningAnimations[klass]); + } + ngAnimateState = {}; + cleanup(element, true); + } + } else if (lastAnimation.event == 'setClass') { + animationsToCancel.push(lastAnimation); + cleanup(element, className); + } + else if (runningAnimations[className]) { + var current = runningAnimations[className]; + if (current.event == animationEvent) { + skipAnimation = true; + } else { + animationsToCancel.push(current); + cleanup(element, className); + } + } + + if (animationsToCancel.length > 0) { + forEach(animationsToCancel, function(operation) { + operation.cancel(); + }); + } + } + + if (runner.isClassBased + && !runner.isSetClassOperation + && animationEvent != 'animate' + && !skipAnimation) { + skipAnimation = (animationEvent == 'addClass') == element.hasClass(className); //opposite of XOR + } + + if (skipAnimation) { + fireDOMOperation(); + fireBeforeCallbackAsync(); + fireAfterCallbackAsync(); + fireDoneCallbackAsync(); + return noopCancel; + } + + runningAnimations = ngAnimateState.active || {}; + totalActiveAnimations = ngAnimateState.totalActive || 0; + + if (animationEvent == 'leave') { + //there's no need to ever remove the listener since the element + //will be removed (destroyed) after the leave animation ends or + //is cancelled midway + element.one('$destroy', function(e) { + var element = angular.element(this); + var state = element.data(NG_ANIMATE_STATE); + if (state) { + var activeLeaveAnimation = state.active['ng-leave']; + if (activeLeaveAnimation) { + activeLeaveAnimation.cancel(); + cleanup(element, 'ng-leave'); + } + } + }); + } + + //the ng-animate class does nothing, but it's here to allow for + //parent animations to find and cancel child animations when needed + $$jqLite.addClass(element, NG_ANIMATE_CLASS_NAME); + if (options && options.tempClasses) { + forEach(options.tempClasses, function(className) { + $$jqLite.addClass(element, className); + }); + } + + var localAnimationCount = globalAnimationCounter++; + totalActiveAnimations++; + runningAnimations[className] = runner; + + element.data(NG_ANIMATE_STATE, { + last: runner, + active: runningAnimations, + index: localAnimationCount, + totalActive: totalActiveAnimations + }); + + //first we run the before animations and when all of those are complete + //then we perform the DOM operation and run the next set of animations + fireBeforeCallbackAsync(); + runner.before(function(cancelled) { + var data = element.data(NG_ANIMATE_STATE); + cancelled = cancelled || + !data || !data.active[className] || + (runner.isClassBased && data.active[className].event != animationEvent); + + fireDOMOperation(); + if (cancelled === true) { + closeAnimation(); + } else { + fireAfterCallbackAsync(); + runner.after(closeAnimation); + } + }); + + return runner.cancel; + + function fireDOMCallback(animationPhase) { + var eventName = '$animate:' + animationPhase; + if (elementEvents && elementEvents[eventName] && elementEvents[eventName].length > 0) { + $$asyncCallback(function() { + element.triggerHandler(eventName, { + event: animationEvent, + className: className + }); + }); + } + } + + function fireBeforeCallbackAsync() { + fireDOMCallback('before'); + } + + function fireAfterCallbackAsync() { + fireDOMCallback('after'); + } + + function fireDoneCallbackAsync() { + fireDOMCallback('close'); + doneCallback(); + } + + //it is less complicated to use a flag than managing and canceling + //timeouts containing multiple callbacks. + function fireDOMOperation() { + if (!fireDOMOperation.hasBeenRun) { + fireDOMOperation.hasBeenRun = true; + domOperation(); + } + } + + function closeAnimation() { + if (!closeAnimation.hasBeenRun) { + if (runner) { //the runner doesn't exist if it fails to instantiate + runner.applyStyles(); + } + + closeAnimation.hasBeenRun = true; + if (options && options.tempClasses) { + forEach(options.tempClasses, function(className) { + $$jqLite.removeClass(element, className); + }); + } + + var data = element.data(NG_ANIMATE_STATE); + if (data) { + + /* only structural animations wait for reflow before removing an + animation, but class-based animations don't. An example of this + failing would be when a parent HTML tag has a ng-class attribute + causing ALL directives below to skip animations during the digest */ + if (runner && runner.isClassBased) { + cleanup(element, className); + } else { + $$asyncCallback(function() { + var data = element.data(NG_ANIMATE_STATE) || {}; + if (localAnimationCount == data.index) { + cleanup(element, className, animationEvent); + } + }); + element.data(NG_ANIMATE_STATE, data); + } + } + fireDoneCallbackAsync(); + } + } + } + + function cancelChildAnimations(element) { + var node = extractElementNode(element); + if (node) { + var nodes = angular.isFunction(node.getElementsByClassName) ? + node.getElementsByClassName(NG_ANIMATE_CLASS_NAME) : + node.querySelectorAll('.' + NG_ANIMATE_CLASS_NAME); + forEach(nodes, function(element) { + element = angular.element(element); + var data = element.data(NG_ANIMATE_STATE); + if (data && data.active) { + forEach(data.active, function(runner) { + runner.cancel(); + }); + } + }); + } + } + + function cleanup(element, className) { + if (isMatchingElement(element, $rootElement)) { + if (!rootAnimateState.disabled) { + rootAnimateState.running = false; + rootAnimateState.structural = false; + } + } else if (className) { + var data = element.data(NG_ANIMATE_STATE) || {}; + + var removeAnimations = className === true; + if (!removeAnimations && data.active && data.active[className]) { + data.totalActive--; + delete data.active[className]; + } + + if (removeAnimations || !data.totalActive) { + $$jqLite.removeClass(element, NG_ANIMATE_CLASS_NAME); + element.removeData(NG_ANIMATE_STATE); + } + } + } + + function animationsDisabled(element, parentElement) { + if (rootAnimateState.disabled) { + return true; + } + + if (isMatchingElement(element, $rootElement)) { + return rootAnimateState.running; + } + + var allowChildAnimations, parentRunningAnimation, hasParent; + do { + //the element did not reach the root element which means that it + //is not apart of the DOM. Therefore there is no reason to do + //any animations on it + if (parentElement.length === 0) break; + + var isRoot = isMatchingElement(parentElement, $rootElement); + var state = isRoot ? rootAnimateState : (parentElement.data(NG_ANIMATE_STATE) || {}); + if (state.disabled) { + return true; + } + + //no matter what, for an animation to work it must reach the root element + //this implies that the element is attached to the DOM when the animation is run + if (isRoot) { + hasParent = true; + } + + //once a flag is found that is strictly false then everything before + //it will be discarded and all child animations will be restricted + if (allowChildAnimations !== false) { + var animateChildrenFlag = parentElement.data(NG_ANIMATE_CHILDREN); + if (angular.isDefined(animateChildrenFlag)) { + allowChildAnimations = animateChildrenFlag; + } + } + + parentRunningAnimation = parentRunningAnimation || + state.running || + (state.last && !state.last.isClassBased); + } + while (parentElement = parentElement.parent()); + + return !hasParent || (!allowChildAnimations && parentRunningAnimation); + } + }]); + + $animateProvider.register('', ['$window', '$sniffer', '$timeout', '$$animateReflow', + function($window, $sniffer, $timeout, $$animateReflow) { + // Detect proper transitionend/animationend event names. + var CSS_PREFIX = '', TRANSITION_PROP, TRANSITIONEND_EVENT, ANIMATION_PROP, ANIMATIONEND_EVENT; + + // If unprefixed events are not supported but webkit-prefixed are, use the latter. + // Otherwise, just use W3C names, browsers not supporting them at all will just ignore them. + // Note: Chrome implements `window.onwebkitanimationend` and doesn't implement `window.onanimationend` + // but at the same time dispatches the `animationend` event and not `webkitAnimationEnd`. + // Register both events in case `window.onanimationend` is not supported because of that, + // do the same for `transitionend` as Safari is likely to exhibit similar behavior. + // Also, the only modern browser that uses vendor prefixes for transitions/keyframes is webkit + // therefore there is no reason to test anymore for other vendor prefixes: http://caniuse.com/#search=transition + if (window.ontransitionend === undefined && window.onwebkittransitionend !== undefined) { + CSS_PREFIX = '-webkit-'; + TRANSITION_PROP = 'WebkitTransition'; + TRANSITIONEND_EVENT = 'webkitTransitionEnd transitionend'; + } else { + TRANSITION_PROP = 'transition'; + TRANSITIONEND_EVENT = 'transitionend'; + } + + if (window.onanimationend === undefined && window.onwebkitanimationend !== undefined) { + CSS_PREFIX = '-webkit-'; + ANIMATION_PROP = 'WebkitAnimation'; + ANIMATIONEND_EVENT = 'webkitAnimationEnd animationend'; + } else { + ANIMATION_PROP = 'animation'; + ANIMATIONEND_EVENT = 'animationend'; + } + + var DURATION_KEY = 'Duration'; + var PROPERTY_KEY = 'Property'; + var DELAY_KEY = 'Delay'; + var ANIMATION_ITERATION_COUNT_KEY = 'IterationCount'; + var ANIMATION_PLAYSTATE_KEY = 'PlayState'; + var NG_ANIMATE_PARENT_KEY = '$$ngAnimateKey'; + var NG_ANIMATE_CSS_DATA_KEY = '$$ngAnimateCSS3Data'; + var ELAPSED_TIME_MAX_DECIMAL_PLACES = 3; + var CLOSING_TIME_BUFFER = 1.5; + var ONE_SECOND = 1000; + + var lookupCache = {}; + var parentCounter = 0; + var animationReflowQueue = []; + var cancelAnimationReflow; + function clearCacheAfterReflow() { + if (!cancelAnimationReflow) { + cancelAnimationReflow = $$animateReflow(function() { + animationReflowQueue = []; + cancelAnimationReflow = null; + lookupCache = {}; + }); + } + } + + function afterReflow(element, callback) { + if (cancelAnimationReflow) { + cancelAnimationReflow(); + } + animationReflowQueue.push(callback); + cancelAnimationReflow = $$animateReflow(function() { + forEach(animationReflowQueue, function(fn) { + fn(); + }); + + animationReflowQueue = []; + cancelAnimationReflow = null; + lookupCache = {}; + }); + } + + var closingTimer = null; + var closingTimestamp = 0; + var animationElementQueue = []; + function animationCloseHandler(element, totalTime) { + var node = extractElementNode(element); + element = angular.element(node); + + //this item will be garbage collected by the closing + //animation timeout + animationElementQueue.push(element); + + //but it may not need to cancel out the existing timeout + //if the timestamp is less than the previous one + var futureTimestamp = Date.now() + totalTime; + if (futureTimestamp <= closingTimestamp) { + return; + } + + $timeout.cancel(closingTimer); + + closingTimestamp = futureTimestamp; + closingTimer = $timeout(function() { + closeAllAnimations(animationElementQueue); + animationElementQueue = []; + }, totalTime, false); + } + + function closeAllAnimations(elements) { + forEach(elements, function(element) { + var elementData = element.data(NG_ANIMATE_CSS_DATA_KEY); + if (elementData) { + forEach(elementData.closeAnimationFns, function(fn) { + fn(); + }); + } + }); + } + + function getElementAnimationDetails(element, cacheKey) { + var data = cacheKey ? lookupCache[cacheKey] : null; + if (!data) { + var transitionDuration = 0; + var transitionDelay = 0; + var animationDuration = 0; + var animationDelay = 0; + + //we want all the styles defined before and after + forEach(element, function(element) { + if (element.nodeType == ELEMENT_NODE) { + var elementStyles = $window.getComputedStyle(element) || {}; + + var transitionDurationStyle = elementStyles[TRANSITION_PROP + DURATION_KEY]; + transitionDuration = Math.max(parseMaxTime(transitionDurationStyle), transitionDuration); + + var transitionDelayStyle = elementStyles[TRANSITION_PROP + DELAY_KEY]; + transitionDelay = Math.max(parseMaxTime(transitionDelayStyle), transitionDelay); + + var animationDelayStyle = elementStyles[ANIMATION_PROP + DELAY_KEY]; + animationDelay = Math.max(parseMaxTime(elementStyles[ANIMATION_PROP + DELAY_KEY]), animationDelay); + + var aDuration = parseMaxTime(elementStyles[ANIMATION_PROP + DURATION_KEY]); + + if (aDuration > 0) { + aDuration *= parseInt(elementStyles[ANIMATION_PROP + ANIMATION_ITERATION_COUNT_KEY], 10) || 1; + } + animationDuration = Math.max(aDuration, animationDuration); + } + }); + data = { + total: 0, + transitionDelay: transitionDelay, + transitionDuration: transitionDuration, + animationDelay: animationDelay, + animationDuration: animationDuration + }; + if (cacheKey) { + lookupCache[cacheKey] = data; + } + } + return data; + } + + function parseMaxTime(str) { + var maxValue = 0; + var values = isString(str) ? + str.split(/\s*,\s*/) : + []; + forEach(values, function(value) { + maxValue = Math.max(parseFloat(value) || 0, maxValue); + }); + return maxValue; + } + + function getCacheKey(element) { + var parentElement = element.parent(); + var parentID = parentElement.data(NG_ANIMATE_PARENT_KEY); + if (!parentID) { + parentElement.data(NG_ANIMATE_PARENT_KEY, ++parentCounter); + parentID = parentCounter; + } + return parentID + '-' + extractElementNode(element).getAttribute('class'); + } + + function animateSetup(animationEvent, element, className, styles) { + var structural = ['ng-enter','ng-leave','ng-move'].indexOf(className) >= 0; + + var cacheKey = getCacheKey(element); + var eventCacheKey = cacheKey + ' ' + className; + var itemIndex = lookupCache[eventCacheKey] ? ++lookupCache[eventCacheKey].total : 0; + + var stagger = {}; + if (itemIndex > 0) { + var staggerClassName = className + '-stagger'; + var staggerCacheKey = cacheKey + ' ' + staggerClassName; + var applyClasses = !lookupCache[staggerCacheKey]; + + applyClasses && $$jqLite.addClass(element, staggerClassName); + + stagger = getElementAnimationDetails(element, staggerCacheKey); + + applyClasses && $$jqLite.removeClass(element, staggerClassName); + } + + $$jqLite.addClass(element, className); + + var formerData = element.data(NG_ANIMATE_CSS_DATA_KEY) || {}; + var timings = getElementAnimationDetails(element, eventCacheKey); + var transitionDuration = timings.transitionDuration; + var animationDuration = timings.animationDuration; + + if (structural && transitionDuration === 0 && animationDuration === 0) { + $$jqLite.removeClass(element, className); + return false; + } + + var blockTransition = styles || (structural && transitionDuration > 0); + var blockAnimation = animationDuration > 0 && + stagger.animationDelay > 0 && + stagger.animationDuration === 0; + + var closeAnimationFns = formerData.closeAnimationFns || []; + element.data(NG_ANIMATE_CSS_DATA_KEY, { + stagger: stagger, + cacheKey: eventCacheKey, + running: formerData.running || 0, + itemIndex: itemIndex, + blockTransition: blockTransition, + closeAnimationFns: closeAnimationFns + }); + + var node = extractElementNode(element); + + if (blockTransition) { + blockTransitions(node, true); + if (styles) { + element.css(styles); + } + } + + if (blockAnimation) { + blockAnimations(node, true); + } + + return true; + } + + function animateRun(animationEvent, element, className, activeAnimationComplete, styles) { + var node = extractElementNode(element); + var elementData = element.data(NG_ANIMATE_CSS_DATA_KEY); + if (node.getAttribute('class').indexOf(className) == -1 || !elementData) { + activeAnimationComplete(); + return; + } + + var activeClassName = ''; + var pendingClassName = ''; + forEach(className.split(' '), function(klass, i) { + var prefix = (i > 0 ? ' ' : '') + klass; + activeClassName += prefix + '-active'; + pendingClassName += prefix + '-pending'; + }); + + var style = ''; + var appliedStyles = []; + var itemIndex = elementData.itemIndex; + var stagger = elementData.stagger; + var staggerTime = 0; + if (itemIndex > 0) { + var transitionStaggerDelay = 0; + if (stagger.transitionDelay > 0 && stagger.transitionDuration === 0) { + transitionStaggerDelay = stagger.transitionDelay * itemIndex; + } + + var animationStaggerDelay = 0; + if (stagger.animationDelay > 0 && stagger.animationDuration === 0) { + animationStaggerDelay = stagger.animationDelay * itemIndex; + appliedStyles.push(CSS_PREFIX + 'animation-play-state'); + } + + staggerTime = Math.round(Math.max(transitionStaggerDelay, animationStaggerDelay) * 100) / 100; + } + + if (!staggerTime) { + $$jqLite.addClass(element, activeClassName); + if (elementData.blockTransition) { + blockTransitions(node, false); + } + } + + var eventCacheKey = elementData.cacheKey + ' ' + activeClassName; + var timings = getElementAnimationDetails(element, eventCacheKey); + var maxDuration = Math.max(timings.transitionDuration, timings.animationDuration); + if (maxDuration === 0) { + $$jqLite.removeClass(element, activeClassName); + animateClose(element, className); + activeAnimationComplete(); + return; + } + + if (!staggerTime && styles && Object.keys(styles).length > 0) { + if (!timings.transitionDuration) { + element.css('transition', timings.animationDuration + 's linear all'); + appliedStyles.push('transition'); + } + element.css(styles); + } + + var maxDelay = Math.max(timings.transitionDelay, timings.animationDelay); + var maxDelayTime = maxDelay * ONE_SECOND; + + if (appliedStyles.length > 0) { + //the element being animated may sometimes contain comment nodes in + //the jqLite object, so we're safe to use a single variable to house + //the styles since there is always only one element being animated + var oldStyle = node.getAttribute('style') || ''; + if (oldStyle.charAt(oldStyle.length - 1) !== ';') { + oldStyle += ';'; + } + node.setAttribute('style', oldStyle + ' ' + style); + } + + var startTime = Date.now(); + var css3AnimationEvents = ANIMATIONEND_EVENT + ' ' + TRANSITIONEND_EVENT; + var animationTime = (maxDelay + maxDuration) * CLOSING_TIME_BUFFER; + var totalTime = (staggerTime + animationTime) * ONE_SECOND; + + var staggerTimeout; + if (staggerTime > 0) { + $$jqLite.addClass(element, pendingClassName); + staggerTimeout = $timeout(function() { + staggerTimeout = null; + + if (timings.transitionDuration > 0) { + blockTransitions(node, false); + } + if (timings.animationDuration > 0) { + blockAnimations(node, false); + } + + $$jqLite.addClass(element, activeClassName); + $$jqLite.removeClass(element, pendingClassName); + + if (styles) { + if (timings.transitionDuration === 0) { + element.css('transition', timings.animationDuration + 's linear all'); + } + element.css(styles); + appliedStyles.push('transition'); + } + }, staggerTime * ONE_SECOND, false); + } + + element.on(css3AnimationEvents, onAnimationProgress); + elementData.closeAnimationFns.push(function() { + onEnd(); + activeAnimationComplete(); + }); + + elementData.running++; + animationCloseHandler(element, totalTime); + return onEnd; + + // This will automatically be called by $animate so + // there is no need to attach this internally to the + // timeout done method. + function onEnd() { + element.off(css3AnimationEvents, onAnimationProgress); + $$jqLite.removeClass(element, activeClassName); + $$jqLite.removeClass(element, pendingClassName); + if (staggerTimeout) { + $timeout.cancel(staggerTimeout); + } + animateClose(element, className); + var node = extractElementNode(element); + for (var i in appliedStyles) { + node.style.removeProperty(appliedStyles[i]); + } + } + + function onAnimationProgress(event) { + event.stopPropagation(); + var ev = event.originalEvent || event; + var timeStamp = ev.$manualTimeStamp || ev.timeStamp || Date.now(); + + /* Firefox (or possibly just Gecko) likes to not round values up + * when a ms measurement is used for the animation */ + var elapsedTime = parseFloat(ev.elapsedTime.toFixed(ELAPSED_TIME_MAX_DECIMAL_PLACES)); + + /* $manualTimeStamp is a mocked timeStamp value which is set + * within browserTrigger(). This is only here so that tests can + * mock animations properly. Real events fallback to event.timeStamp, + * or, if they don't, then a timeStamp is automatically created for them. + * We're checking to see if the timeStamp surpasses the expected delay, + * but we're using elapsedTime instead of the timeStamp on the 2nd + * pre-condition since animations sometimes close off early */ + if (Math.max(timeStamp - startTime, 0) >= maxDelayTime && elapsedTime >= maxDuration) { + activeAnimationComplete(); + } + } + } + + function blockTransitions(node, bool) { + node.style[TRANSITION_PROP + PROPERTY_KEY] = bool ? 'none' : ''; + } + + function blockAnimations(node, bool) { + node.style[ANIMATION_PROP + ANIMATION_PLAYSTATE_KEY] = bool ? 'paused' : ''; + } + + function animateBefore(animationEvent, element, className, styles) { + if (animateSetup(animationEvent, element, className, styles)) { + return function(cancelled) { + cancelled && animateClose(element, className); + }; + } + } + + function animateAfter(animationEvent, element, className, afterAnimationComplete, styles) { + if (element.data(NG_ANIMATE_CSS_DATA_KEY)) { + return animateRun(animationEvent, element, className, afterAnimationComplete, styles); + } else { + animateClose(element, className); + afterAnimationComplete(); + } + } + + function animate(animationEvent, element, className, animationComplete, options) { + //If the animateSetup function doesn't bother returning a + //cancellation function then it means that there is no animation + //to perform at all + var preReflowCancellation = animateBefore(animationEvent, element, className, options.from); + if (!preReflowCancellation) { + clearCacheAfterReflow(); + animationComplete(); + return; + } + + //There are two cancellation functions: one is before the first + //reflow animation and the second is during the active state + //animation. The first function will take care of removing the + //data from the element which will not make the 2nd animation + //happen in the first place + var cancel = preReflowCancellation; + afterReflow(element, function() { + //once the reflow is complete then we point cancel to + //the new cancellation function which will remove all of the + //animation properties from the active animation + cancel = animateAfter(animationEvent, element, className, animationComplete, options.to); + }); + + return function(cancelled) { + (cancel || noop)(cancelled); + }; + } + + function animateClose(element, className) { + $$jqLite.removeClass(element, className); + var data = element.data(NG_ANIMATE_CSS_DATA_KEY); + if (data) { + if (data.running) { + data.running--; + } + if (!data.running || data.running === 0) { + element.removeData(NG_ANIMATE_CSS_DATA_KEY); + } + } + } + + return { + animate: function(element, className, from, to, animationCompleted, options) { + options = options || {}; + options.from = from; + options.to = to; + return animate('animate', element, className, animationCompleted, options); + }, + + enter: function(element, animationCompleted, options) { + options = options || {}; + return animate('enter', element, 'ng-enter', animationCompleted, options); + }, + + leave: function(element, animationCompleted, options) { + options = options || {}; + return animate('leave', element, 'ng-leave', animationCompleted, options); + }, + + move: function(element, animationCompleted, options) { + options = options || {}; + return animate('move', element, 'ng-move', animationCompleted, options); + }, + + beforeSetClass: function(element, add, remove, animationCompleted, options) { + options = options || {}; + var className = suffixClasses(remove, '-remove') + ' ' + + suffixClasses(add, '-add'); + var cancellationMethod = animateBefore('setClass', element, className, options.from); + if (cancellationMethod) { + afterReflow(element, animationCompleted); + return cancellationMethod; + } + clearCacheAfterReflow(); + animationCompleted(); + }, + + beforeAddClass: function(element, className, animationCompleted, options) { + options = options || {}; + var cancellationMethod = animateBefore('addClass', element, suffixClasses(className, '-add'), options.from); + if (cancellationMethod) { + afterReflow(element, animationCompleted); + return cancellationMethod; + } + clearCacheAfterReflow(); + animationCompleted(); + }, + + beforeRemoveClass: function(element, className, animationCompleted, options) { + options = options || {}; + var cancellationMethod = animateBefore('removeClass', element, suffixClasses(className, '-remove'), options.from); + if (cancellationMethod) { + afterReflow(element, animationCompleted); + return cancellationMethod; + } + clearCacheAfterReflow(); + animationCompleted(); + }, + + setClass: function(element, add, remove, animationCompleted, options) { + options = options || {}; + remove = suffixClasses(remove, '-remove'); + add = suffixClasses(add, '-add'); + var className = remove + ' ' + add; + return animateAfter('setClass', element, className, animationCompleted, options.to); + }, + + addClass: function(element, className, animationCompleted, options) { + options = options || {}; + return animateAfter('addClass', element, suffixClasses(className, '-add'), animationCompleted, options.to); + }, + + removeClass: function(element, className, animationCompleted, options) { + options = options || {}; + return animateAfter('removeClass', element, suffixClasses(className, '-remove'), animationCompleted, options.to); + } + }; + + function suffixClasses(classes, suffix) { + var className = ''; + classes = isArray(classes) ? classes : classes.split(/\s+/); + forEach(classes, function(klass, i) { + if (klass && klass.length > 0) { + className += (i > 0 ? ' ' : '') + klass + suffix; + } + }); + return className; + } + }]); + }]); + + +})(window, window.angular); diff --git a/public/vendor/angular-animate/angular-animate.min.js b/public/vendor/angular-animate/angular-animate.min.js new file mode 100644 index 000000000..b406578de --- /dev/null +++ b/public/vendor/angular-animate/angular-animate.min.js @@ -0,0 +1,33 @@ +/* + AngularJS v1.3.10 + (c) 2010-2014 Google, Inc. http://angularjs.org + License: MIT +*/ +(function(N,f,W){'use strict';f.module("ngAnimate",["ng"]).directive("ngAnimateChildren",function(){return function(X,C,g){g=g.ngAnimateChildren;f.isString(g)&&0===g.length?C.data("$$ngAnimateChildren",!0):X.$watch(g,function(f){C.data("$$ngAnimateChildren",!!f)})}}).factory("$$animateReflow",["$$rAF","$document",function(f,C){return function(g){return f(function(){g()})}}]).config(["$provide","$animateProvider",function(X,C){function g(f){for(var n=0;n=C&&b>=x&&c()}var m=g(e);a=e.data("$$ngAnimateCSS3Data");if(-1!=m.getAttribute("class").indexOf(b)&&a){var k="",t="";n(b.split(" "),function(a, +b){var e=(0", + "license": "MIT", + "bugs": { + "url": "https://github.com/angular/angular.js/issues" + }, + "homepage": "http://angularjs.org" +} diff --git a/public/vendor/angular/.bower.json b/public/vendor/angular/.bower.json index 68c1c9321..b96af4ea8 100644 --- a/public/vendor/angular/.bower.json +++ b/public/vendor/angular/.bower.json @@ -1,17 +1,17 @@ { "name": "angular", - "version": "1.3.7", + "version": "1.3.10", "main": "./angular.js", "ignore": [], "dependencies": {}, "homepage": "https://github.com/angular/bower-angular", - "_release": "1.3.7", + "_release": "1.3.10", "_resolution": { "type": "version", - "tag": "v1.3.7", - "commit": "6bede464de3d762812b1a64a931b5b828e833b9d" + "tag": "v1.3.10", + "commit": "ecf0435da949836c63ebf048ea8b7710542e33ce" }, "_source": "git://github.com/angular/bower-angular.git", - "_target": "1.3.7", + "_target": "1.3.10", "_originalSource": "angular" } \ No newline at end of file diff --git a/public/vendor/angular/angular.js b/public/vendor/angular/angular.js index f12180f36..109199265 100644 --- a/public/vendor/angular/angular.js +++ b/public/vendor/angular/angular.js @@ -1,5 +1,5 @@ /** - * @license AngularJS v1.3.7 + * @license AngularJS v1.3.10 * (c) 2010-2014 Google, Inc. http://angularjs.org * License: MIT */ @@ -54,7 +54,7 @@ function minErr(module, ErrorConstructor) { return match; }); - message = message + '\nhttp://errors.angularjs.org/1.3.7/' + + message = message + '\nhttp://errors.angularjs.org/1.3.10/' + (module ? module + '/' : '') + code; for (i = 2; i < arguments.length; i++) { message = message + (i == 2 ? '?' : '&') + 'p' + (i - 2) + '=' + @@ -465,6 +465,8 @@ noop.$inject = []; return (transformationFn || angular.identity)(value); }; ``` + * @param {*} value to be returned. + * @returns {*} the value passed in. */ function identity($) {return $;} identity.$inject = []; @@ -719,7 +721,7 @@ function arrayRemove(array, value) { * Creates a deep copy of `source`, which should be an object or an array. * * * If no destination is supplied, a copy of the object or array is created. - * * If a destination is provided, all of its elements (for array) or properties (for objects) + * * If a destination is provided, all of its elements (for arrays) or properties (for objects) * are deleted and then all elements/properties from the source are copied to it. * * If `source` is not an object or array (inc. `null` and `undefined`), `source` is returned. * * If `source` is identical to 'destination' an exception will be thrown. @@ -1057,7 +1059,7 @@ function toJson(obj, pretty) { * Deserializes a JSON string. * * @param {string} json JSON string to deserialize. - * @returns {Object|Array|string|number} Deserialized thingy. + * @returns {Object|Array|string|number} Deserialized JSON string. */ function fromJson(json) { return isString(json) @@ -1230,7 +1232,7 @@ function getNgAttribute(element, ngAttr) { * {@link angular.bootstrap} instead. AngularJS applications cannot be nested within each other. * * You can specify an **AngularJS module** to be used as the root module for the application. This - * module will be loaded into the {@link auto.$injector} when the application is bootstrapped and + * module will be loaded into the {@link auto.$injector} when the application is bootstrapped. It * should contain the application code needed or have dependencies on other modules that will * contain the code. See {@link angular.module} for more information. * @@ -1238,7 +1240,7 @@ function getNgAttribute(element, ngAttr) { * document would not be compiled, the `AppController` would not be instantiated and the `{{ a+b }}` * would not be resolved to `3`. * - * `ngApp` is the easiest, and most common, way to bootstrap an application. + * `ngApp` is the easiest, and most common way to bootstrap an application. * @@ -1400,7 +1402,7 @@ function angularInit(element, bootstrap) { * @param {DOMElement} element DOM element which is the root of angular application. * @param {Array=} modules an array of modules to load into the application. * Each item in the array should be the name of a predefined module or a (DI annotated) - * function that will be invoked by the injector as a run block. + * function that will be invoked by the injector as a `config` block. * See: {@link angular.module modules} * @param {Object=} config an object for defining configuration options for the application. The * following keys are supported: @@ -2116,11 +2118,11 @@ function toDebugString(obj) { * - `codeName` – `{string}` – Code name of the release, such as "jiggling-armfat". */ var version = { - full: '1.3.7', // all of these placeholder strings will be replaced by grunt's + full: '1.3.10', // all of these placeholder strings will be replaced by grunt's major: 1, // package task minor: 3, - dot: 7, - codeName: 'leaky-obstruction' + dot: 10, + codeName: 'heliotropic-sundial' }; @@ -4184,7 +4186,7 @@ function createInjector(modulesToLoad, strictDi) { // Check if Type is annotated and use just the given function at n-1 as parameter // e.g. someModule.factory('greeter', ['$window', function(renamed$window) {}]); // Object creation: http://jsperf.com/create-constructor/2 - var instance = Object.create((isArray(Type) ? Type[Type.length - 1] : Type).prototype); + var instance = Object.create((isArray(Type) ? Type[Type.length - 1] : Type).prototype || null); var returnedValue = invoke(Type, instance, locals, serviceName); return isObject(returnedValue) || isFunction(returnedValue) ? returnedValue : instance; @@ -7163,6 +7165,10 @@ function $CompileProvider($provide, $$sanitizeUriProvider) { // use class as directive className = node.className; + if (isObject(className)) { + // Maybe SVGAnimatedString + className = className.animVal; + } if (isString(className) && className !== '') { while (match = CLASS_DIRECTIVE_REGEXP.exec(className)) { nName = directiveNormalize(match[2]); @@ -8429,7 +8435,7 @@ function $ControllerProvider() { // Object creation: http://jsperf.com/create-constructor/2 var controllerPrototype = (isArray(expression) ? expression[expression.length - 1] : expression).prototype; - instance = Object.create(controllerPrototype); + instance = Object.create(controllerPrototype || null); if (identifier) { addIdentifier(locals, identifier, instance, constructor || expression.name); @@ -8925,7 +8931,7 @@ function $HttpProvider() { * * Both requests and responses can be transformed using transformation functions: `transformRequest` * and `transformResponse`. These properties can be a single function that returns - * the transformed value (`{function(data, headersGetter, status)`) or an array of such transformation functions, + * the transformed value (`function(data, headersGetter, status)`) or an array of such transformation functions, * which allows you to `push` or `unshift` a new transformation function into the transformation chain. * * ### Default Transformations @@ -12266,7 +12272,7 @@ Parser.prototype = { }, { assign: function(scope, value, locals) { var o = object(scope, locals); - if (!o) object.assign(scope, o = {}); + if (!o) object.assign(scope, o = {}, locals); return getter.assign(o, value); } }); @@ -12292,7 +12298,7 @@ Parser.prototype = { var key = ensureSafeMemberName(indexFn(self, locals), expression); // prevent overwriting of Function.constructor which would break ensureSafeObject check var o = ensureSafeObject(obj(self, locals), expression); - if (!o) obj.assign(self, o = {}); + if (!o) obj.assign(self, o = {}, locals); return o[key] = value; } }); @@ -12402,18 +12408,19 @@ Parser.prototype = { // Parser helper functions ////////////////////////////////////////////////// -function setter(obj, path, setValue, fullExp) { +function setter(obj, locals, path, setValue, fullExp) { ensureSafeObject(obj, fullExp); + ensureSafeObject(locals, fullExp); var element = path.split('.'), key; for (var i = 0; element.length > 1; i++) { key = ensureSafeMemberName(element.shift(), fullExp); - var propertyObj = ensureSafeObject(obj[key], fullExp); + var propertyObj = (i === 0 && locals && locals[key]) || obj[key]; if (!propertyObj) { propertyObj = {}; obj[key] = propertyObj; } - obj = propertyObj; + obj = ensureSafeObject(propertyObj, fullExp); } key = ensureSafeMemberName(element.shift(), fullExp); ensureSafeObject(obj[key], fullExp); @@ -12540,8 +12547,8 @@ function getterFn(path, options, fullExp) { } fn.sharedGetter = true; - fn.assign = function(self, value) { - return setter(self, path, value, path); + fn.assign = function(self, value, locals) { + return setter(self, locals, path, value, path); }; getterFnCache[path] = fn; return fn; @@ -14497,7 +14504,7 @@ function $RootScopeProvider() { * @kind function * * @description - * Schedule the invokation of $apply to occur at a later time. The actual time difference + * Schedule the invocation of $apply to occur at a later time. The actual time difference * varies across browsers, but is typically around ~10 milliseconds. * * This can be used to queue up multiple expressions which need to be evaluated in the same @@ -15994,7 +16001,7 @@ var $compileMinErr = minErr('$compile'); * @description * The `$templateRequest` service downloads the provided template using `$http` and, upon success, * stores the contents inside of `$templateCache`. If the HTTP request fails or the response data - * of the HTTP request is empty then a `$compile` error will be thrown (the exception can be thwarted + * of the HTTP request is empty, a `$compile` error will be thrown (the exception can be thwarted * by setting the 2nd parameter of the function to true). * * @param {string} tpl The HTTP request template URL @@ -16007,8 +16014,7 @@ var $compileMinErr = minErr('$compile'); function $TemplateRequestProvider() { this.$get = ['$templateCache', '$http', '$q', function($templateCache, $http, $q) { function handleRequestFn(tpl, ignoreRequestError) { - var self = handleRequestFn; - self.totalPendingRequests++; + handleRequestFn.totalPendingRequests++; var transformResponse = $http.defaults && $http.defaults.transformResponse; @@ -16026,13 +16032,14 @@ function $TemplateRequestProvider() { }; return $http.get(tpl, httpOptions) + .finally(function() { + handleRequestFn.totalPendingRequests--; + }) .then(function(response) { - self.totalPendingRequests--; return response.data; }, handleError); function handleError(resp) { - self.totalPendingRequests--; if (!ignoreRequestError) { throw $compileMinErr('tpload', 'Failed to load template: {0}', tpl); } @@ -16554,19 +16561,26 @@ function $FilterProvider($provide) { * * Can be one of: * - * - `string`: The string is evaluated as an expression and the resulting value is used for substring match against - * the contents of the `array`. All strings or objects with string properties in `array` that contain this string - * will be returned. The predicate can be negated by prefixing the string with `!`. + * - `string`: The string is used for matching against the contents of the `array`. All strings or + * objects with string properties in `array` that match this string will be returned. This also + * applies to nested object properties. + * The predicate can be negated by prefixing the string with `!`. * * - `Object`: A pattern object can be used to filter specific properties on objects contained * by `array`. For example `{name:"M", phone:"1"}` predicate will return an array of items * which have property `name` containing "M" and property `phone` containing "1". A special * property name `$` can be used (as in `{$:"text"}`) to accept a match against any - * property of the object. That's equivalent to the simple substring match with a `string` - * as described above. The predicate can be negated by prefixing the string with `!`. - * For Example `{name: "!M"}` predicate will return an array of items which have property `name` + * property of the object or its nested object properties. That's equivalent to the simple + * substring match with a `string` as described above. The predicate can be negated by prefixing + * the string with `!`. + * For example `{name: "!M"}` predicate will return an array of items which have property `name` * not containing "M". * + * Note that a named property will match properties on the same level only, while the special + * `$` property will match properties on the same level or deeper. E.g. an array item like + * `{name: {first: 'John', last: 'Doe'}}` will **not** be matched by `{name: 'John'}`, but + * **will** be matched by `{$: 'John'}`. + * * - `function(value, index)`: A predicate function can be used to write arbitrary filters. The * function is called for each element of `array`. The final result is an array of those * elements that the predicate returned true for. @@ -16579,10 +16593,10 @@ function $FilterProvider($provide) { * * - `function(actual, expected)`: * The function will be given the object value and the predicate value to compare and - * should return true if the item should be included in filtered result. + * should return true if both values should be considered equal. * - * - `true`: A shorthand for `function(actual, expected) { return angular.equals(expected, actual)}`. - * this is essentially strict comparison of expected and actual. + * - `true`: A shorthand for `function(actual, expected) { return angular.equals(actual, expected)}`. + * This is essentially strict comparison of expected and actual. * * - `false|undefined`: A short hand for a function which will look for a substring match in case * insensitive way. @@ -16685,6 +16699,7 @@ function filterFilter() { // Helper functions for `filterFilter` function createPredicateFn(expression, comparator, matchAgainstAnyProp) { + var shouldMatchPrimitives = isObject(expression) && ('$' in expression); var predicateFn; if (comparator === true) { @@ -16703,19 +16718,22 @@ function createPredicateFn(expression, comparator, matchAgainstAnyProp) { } predicateFn = function(item) { + if (shouldMatchPrimitives && !isObject(item)) { + return deepCompare(item, expression.$, comparator, false); + } return deepCompare(item, expression, comparator, matchAgainstAnyProp); }; return predicateFn; } -function deepCompare(actual, expected, comparator, matchAgainstAnyProp) { +function deepCompare(actual, expected, comparator, matchAgainstAnyProp, dontMatchWholeObject) { var actualType = typeof actual; var expectedType = typeof expected; if ((expectedType === 'string') && (expected.charAt(0) === '!')) { return !deepCompare(actual, expected.substring(1), comparator, matchAgainstAnyProp); - } else if (actualType === 'array') { + } else if (isArray(actual)) { // In case `actual` is an array, consider it a match // if ANY of it's items matches `expected` return actual.some(function(item) { @@ -16728,11 +16746,11 @@ function deepCompare(actual, expected, comparator, matchAgainstAnyProp) { var key; if (matchAgainstAnyProp) { for (key in actual) { - if ((key.charAt(0) !== '$') && deepCompare(actual[key], expected, comparator)) { + if ((key.charAt(0) !== '$') && deepCompare(actual[key], expected, comparator, true)) { return true; } } - return false; + return dontMatchWholeObject ? false : deepCompare(actual, expected, comparator, false); } else if (expectedType === 'object') { for (key in expected) { var expectedVal = expected[key]; @@ -16740,9 +16758,9 @@ function deepCompare(actual, expected, comparator, matchAgainstAnyProp) { continue; } - var keyIsDollar = key === '$'; - var actualVal = keyIsDollar ? actual : actual[key]; - if (!deepCompare(actualVal, expectedVal, comparator, keyIsDollar)) { + var matchAnyProperty = key === '$'; + var actualVal = matchAnyProperty ? actual : actual[key]; + if (!deepCompare(actualVal, expectedVal, comparator, matchAnyProperty, matchAnyProperty)) { return false; } } @@ -17111,7 +17129,7 @@ var DATE_FORMATS_SPLIT = /((?:[^yMdHhmsaZEw']+)|(?:'(?:[^']|'')*')|(?:E+|y+|M+|d * * `'m'`: Minute in hour (0-59) * * `'ss'`: Second in minute, padded (00-59) * * `'s'`: Second in minute (0-59) - * * `'.sss' or ',sss'`: Millisecond in second, padded (000-999) + * * `'sss'`: Millisecond in second, padded (000-999) * * `'a'`: AM/PM marker * * `'Z'`: 4 digit (+sign) representation of the timezone offset (-1200-+1200) * * `'ww'`: Week of year, padded (00-53). Week 01 is the week with the first Thursday of the year @@ -17406,37 +17424,12 @@ function limitToFilter() { limit = int(limit); } - if (isString(input)) { - //NaN check on limit - if (limit) { - return limit >= 0 ? input.slice(0, limit) : input.slice(limit, input.length); - } else { - return ""; - } - } - - var out = [], - i, n; - - // if abs(limit) exceeds maximum length, trim it - if (limit > input.length) - limit = input.length; - else if (limit < -input.length) - limit = -input.length; - - if (limit > 0) { - i = 0; - n = limit; + //NaN check on limit + if (limit) { + return limit > 0 ? input.slice(0, limit) : input.slice(limit); } else { - i = input.length + limit; - n = input.length; + return isString(input) ? "" : []; } - - for (; i < n; i++) { - out.push(input[i]); - } - - return out; }; } @@ -17570,9 +17563,7 @@ function orderByFilter($parse) { } if (predicate === '') { // Effectively no predicate was passed so we compare identity - return reverseComparator(function(a, b) { - return compare(a, b); - }, descending); + return reverseComparator(compare, descending); } get = $parse(predicate); if (get.constant) { @@ -17614,14 +17605,14 @@ function orderByFilter($parse) { function objectToString(value) { if (value === null) return 'null'; - if (typeof value.toString === 'function') { - value = value.toString(); - if (isPrimitive(value)) return value; - } if (typeof value.valueOf === 'function') { value = value.valueOf(); if (isPrimitive(value)) return value; } + if (typeof value.toString === 'function') { + value = value.toString(); + if (isPrimitive(value)) return value; + } return ''; } @@ -18274,6 +18265,9 @@ function FormController(element, attrs, $scope, $animate, $interpolate) { forEach(form.$error, function(value, name) { form.$setValidity(name, null, control); }); + forEach(form.$$success, function(value, name) { + form.$setValidity(name, null, control); + }); arrayRemove(controls, control); }; @@ -18291,23 +18285,23 @@ function FormController(element, attrs, $scope, $animate, $interpolate) { addSetValidityMethod({ ctrl: this, $element: element, - set: function(object, property, control) { + set: function(object, property, controller) { var list = object[property]; if (!list) { - object[property] = [control]; + object[property] = [controller]; } else { - var index = list.indexOf(control); + var index = list.indexOf(controller); if (index === -1) { - list.push(control); + list.push(controller); } } }, - unset: function(object, property, control) { + unset: function(object, property, controller) { var list = object[property]; if (!list) { return; } - arrayRemove(list, control); + arrayRemove(list, controller); if (list.length === 0) { delete object[property]; } @@ -18600,19 +18594,19 @@ var formDirectiveFactory = function(isNgForm) { alias = controller.$name; if (alias) { - setter(scope, alias, controller, alias); + setter(scope, null, alias, controller, alias); attr.$observe(attr.name ? 'name' : 'ngForm', function(newValue) { if (alias === newValue) return; - setter(scope, alias, undefined, alias); + setter(scope, null, alias, undefined, alias); alias = newValue; - setter(scope, alias, controller, alias); + setter(scope, null, alias, controller, alias); parentFormCtrl.$$renameControl(controller, alias); }); } formElement.on('$destroy', function() { parentFormCtrl.$removeControl(controller); if (alias) { - setter(scope, alias, undefined, alias); + setter(scope, null, alias, undefined, alias); } extend(controller, nullFormCtrl); //stop propagating child destruction handlers upwards }); @@ -18628,12 +18622,13 @@ var formDirectiveFactory = function(isNgForm) { var formDirective = formDirectiveFactory(); var ngFormDirective = formDirectiveFactory(true); -/* global VALID_CLASS: true, - INVALID_CLASS: true, - PRISTINE_CLASS: true, - DIRTY_CLASS: true, - UNTOUCHED_CLASS: true, - TOUCHED_CLASS: true, +/* global VALID_CLASS: false, + INVALID_CLASS: false, + PRISTINE_CLASS: false, + DIRTY_CLASS: false, + UNTOUCHED_CLASS: false, + TOUCHED_CLASS: false, + $ngModelMinErr: false, */ // Regex code is obtained from SO: https://stackoverflow.com/questions/3143070/javascript-regex-iso-datetime#answer-3143231 @@ -18646,9 +18641,6 @@ var DATETIMELOCAL_REGEXP = /^(\d{4})-(\d\d)-(\d\d)T(\d\d):(\d\d)(?::(\d\d)(\.\d{ var WEEK_REGEXP = /^(\d{4})-W(\d\d)$/; var MONTH_REGEXP = /^(\d{4})-(\d\d)$/; var TIME_REGEXP = /^(\d\d):(\d\d)(?::(\d\d)(\.\d{1,3})?)?$/; -var DEFAULT_REGEXP = /(\s+|^)default(\s+|$)/; - -var $ngModelMinErr = new minErr('ngModel'); var inputType = { @@ -20150,1344 +20142,6 @@ var inputDirective = ['$browser', '$sniffer', '$filter', '$parse', }; }]; -var VALID_CLASS = 'ng-valid', - INVALID_CLASS = 'ng-invalid', - PRISTINE_CLASS = 'ng-pristine', - DIRTY_CLASS = 'ng-dirty', - UNTOUCHED_CLASS = 'ng-untouched', - TOUCHED_CLASS = 'ng-touched', - PENDING_CLASS = 'ng-pending'; - -/** - * @ngdoc type - * @name ngModel.NgModelController - * - * @property {string} $viewValue Actual string value in the view. - * @property {*} $modelValue The value in the model that the control is bound to. - * @property {Array.} $parsers Array of functions to execute, as a pipeline, whenever - the control reads value from the DOM. The functions are called in array order, each passing - its return value through to the next. The last return value is forwarded to the - {@link ngModel.NgModelController#$validators `$validators`} collection. - -Parsers are used to sanitize / convert the {@link ngModel.NgModelController#$viewValue -`$viewValue`}. - -Returning `undefined` from a parser means a parse error occurred. In that case, -no {@link ngModel.NgModelController#$validators `$validators`} will run and the `ngModel` -will be set to `undefined` unless {@link ngModelOptions `ngModelOptions.allowInvalid`} -is set to `true`. The parse error is stored in `ngModel.$error.parse`. - - * - * @property {Array.} $formatters Array of functions to execute, as a pipeline, whenever - the model value changes. The functions are called in reverse array order, each passing the value through to the - next. The last return value is used as the actual DOM value. - Used to format / convert values for display in the control. - * ```js - * function formatter(value) { - * if (value) { - * return value.toUpperCase(); - * } - * } - * ngModel.$formatters.push(formatter); - * ``` - * - * @property {Object.} $validators A collection of validators that are applied - * whenever the model value changes. The key value within the object refers to the name of the - * validator while the function refers to the validation operation. The validation operation is - * provided with the model value as an argument and must return a true or false value depending - * on the response of that validation. - * - * ```js - * ngModel.$validators.validCharacters = function(modelValue, viewValue) { - * var value = modelValue || viewValue; - * return /[0-9]+/.test(value) && - * /[a-z]+/.test(value) && - * /[A-Z]+/.test(value) && - * /\W+/.test(value); - * }; - * ``` - * - * @property {Object.} $asyncValidators A collection of validations that are expected to - * perform an asynchronous validation (e.g. a HTTP request). The validation function that is provided - * is expected to return a promise when it is run during the model validation process. Once the promise - * is delivered then the validation status will be set to true when fulfilled and false when rejected. - * When the asynchronous validators are triggered, each of the validators will run in parallel and the model - * value will only be updated once all validators have been fulfilled. As long as an asynchronous validator - * is unfulfilled, its key will be added to the controllers `$pending` property. Also, all asynchronous validators - * will only run once all synchronous validators have passed. - * - * Please note that if $http is used then it is important that the server returns a success HTTP response code - * in order to fulfill the validation and a status level of `4xx` in order to reject the validation. - * - * ```js - * ngModel.$asyncValidators.uniqueUsername = function(modelValue, viewValue) { - * var value = modelValue || viewValue; - * - * // Lookup user by username - * return $http.get('/api/users/' + value). - * then(function resolved() { - * //username exists, this means validation fails - * return $q.reject('exists'); - * }, function rejected() { - * //username does not exist, therefore this validation passes - * return true; - * }); - * }; - * ``` - * - * @property {Array.} $viewChangeListeners Array of functions to execute whenever the - * view value has changed. It is called with no arguments, and its return value is ignored. - * This can be used in place of additional $watches against the model value. - * - * @property {Object} $error An object hash with all failing validator ids as keys. - * @property {Object} $pending An object hash with all pending validator ids as keys. - * - * @property {boolean} $untouched True if control has not lost focus yet. - * @property {boolean} $touched True if control has lost focus. - * @property {boolean} $pristine True if user has not interacted with the control yet. - * @property {boolean} $dirty True if user has already interacted with the control. - * @property {boolean} $valid True if there is no error. - * @property {boolean} $invalid True if at least one error on the control. - * @property {string} $name The name attribute of the control. - * - * @description - * - * `NgModelController` provides API for the {@link ngModel `ngModel`} directive. - * The controller contains services for data-binding, validation, CSS updates, and value formatting - * and parsing. It purposefully does not contain any logic which deals with DOM rendering or - * listening to DOM events. - * Such DOM related logic should be provided by other directives which make use of - * `NgModelController` for data-binding to control elements. - * Angular provides this DOM logic for most {@link input `input`} elements. - * At the end of this page you can find a {@link ngModel.NgModelController#custom-control-example - * custom control example} that uses `ngModelController` to bind to `contenteditable` elements. - * - * @example - * ### Custom Control Example - * This example shows how to use `NgModelController` with a custom control to achieve - * data-binding. Notice how different directives (`contenteditable`, `ng-model`, and `required`) - * collaborate together to achieve the desired result. - * - * Note that `contenteditable` is an HTML5 attribute, which tells the browser to let the element - * contents be edited in place by the user. This will not work on older browsers. - * - * We are using the {@link ng.service:$sce $sce} service here and include the {@link ngSanitize $sanitize} - * module to automatically remove "bad" content like inline event listener (e.g. ``). - * However, as we are using `$sce` the model can still decide to provide unsafe content if it marks - * that content using the `$sce` service. - * - * - - [contenteditable] { - border: 1px solid black; - background-color: white; - min-height: 20px; - } - - .ng-invalid { - border: 1px solid red; - } - - - - angular.module('customControl', ['ngSanitize']). - directive('contenteditable', ['$sce', function($sce) { - return { - restrict: 'A', // only activate on element attribute - require: '?ngModel', // get a hold of NgModelController - link: function(scope, element, attrs, ngModel) { - if (!ngModel) return; // do nothing if no ng-model - - // Specify how UI should be updated - ngModel.$render = function() { - element.html($sce.getTrustedHtml(ngModel.$viewValue || '')); - }; - - // Listen for change events to enable binding - element.on('blur keyup change', function() { - scope.$evalAsync(read); - }); - read(); // initialize - - // Write data to the model - function read() { - var html = element.html(); - // When we clear the content editable the browser leaves a
behind - // If strip-br attribute is provided then we strip this out - if ( attrs.stripBr && html == '
' ) { - html = ''; - } - ngModel.$setViewValue(html); - } - } - }; - }]); -
- - -
Change me!
- Required! -
- - -
- - it('should data-bind and become invalid', function() { - if (browser.params.browser == 'safari' || browser.params.browser == 'firefox') { - // SafariDriver can't handle contenteditable - // and Firefox driver can't clear contenteditables very well - return; - } - var contentEditable = element(by.css('[contenteditable]')); - var content = 'Change me!'; - - expect(contentEditable.getText()).toEqual(content); - - contentEditable.clear(); - contentEditable.sendKeys(protractor.Key.BACK_SPACE); - expect(contentEditable.getText()).toEqual(''); - expect(contentEditable.getAttribute('class')).toMatch(/ng-invalid-required/); - }); - - *
- * - * - */ -var NgModelController = ['$scope', '$exceptionHandler', '$attrs', '$element', '$parse', '$animate', '$timeout', '$rootScope', '$q', '$interpolate', - function($scope, $exceptionHandler, $attr, $element, $parse, $animate, $timeout, $rootScope, $q, $interpolate) { - this.$viewValue = Number.NaN; - this.$modelValue = Number.NaN; - this.$$rawModelValue = undefined; // stores the parsed modelValue / model set from scope regardless of validity. - this.$validators = {}; - this.$asyncValidators = {}; - this.$parsers = []; - this.$formatters = []; - this.$viewChangeListeners = []; - this.$untouched = true; - this.$touched = false; - this.$pristine = true; - this.$dirty = false; - this.$valid = true; - this.$invalid = false; - this.$error = {}; // keep invalid keys here - this.$$success = {}; // keep valid keys here - this.$pending = undefined; // keep pending keys here - this.$name = $interpolate($attr.name || '', false)($scope); - - - var parsedNgModel = $parse($attr.ngModel), - parsedNgModelAssign = parsedNgModel.assign, - ngModelGet = parsedNgModel, - ngModelSet = parsedNgModelAssign, - pendingDebounce = null, - ctrl = this; - - this.$$setOptions = function(options) { - ctrl.$options = options; - if (options && options.getterSetter) { - var invokeModelGetter = $parse($attr.ngModel + '()'), - invokeModelSetter = $parse($attr.ngModel + '($$$p)'); - - ngModelGet = function($scope) { - var modelValue = parsedNgModel($scope); - if (isFunction(modelValue)) { - modelValue = invokeModelGetter($scope); - } - return modelValue; - }; - ngModelSet = function($scope, newValue) { - if (isFunction(parsedNgModel($scope))) { - invokeModelSetter($scope, {$$$p: ctrl.$modelValue}); - } else { - parsedNgModelAssign($scope, ctrl.$modelValue); - } - }; - } else if (!parsedNgModel.assign) { - throw $ngModelMinErr('nonassign', "Expression '{0}' is non-assignable. Element: {1}", - $attr.ngModel, startingTag($element)); - } - }; - - /** - * @ngdoc method - * @name ngModel.NgModelController#$render - * - * @description - * Called when the view needs to be updated. It is expected that the user of the ng-model - * directive will implement this method. - * - * The `$render()` method is invoked in the following situations: - * - * * `$rollbackViewValue()` is called. If we are rolling back the view value to the last - * committed value then `$render()` is called to update the input control. - * * The value referenced by `ng-model` is changed programmatically and both the `$modelValue` and - * the `$viewValue` are different to last time. - * - * Since `ng-model` does not do a deep watch, `$render()` is only invoked if the values of - * `$modelValue` and `$viewValue` are actually different to their previous value. If `$modelValue` - * or `$viewValue` are objects (rather than a string or number) then `$render()` will not be - * invoked if you only change a property on the objects. - */ - this.$render = noop; - - /** - * @ngdoc method - * @name ngModel.NgModelController#$isEmpty - * - * @description - * This is called when we need to determine if the value of an input is empty. - * - * For instance, the required directive does this to work out if the input has data or not. - * - * The default `$isEmpty` function checks whether the value is `undefined`, `''`, `null` or `NaN`. - * - * You can override this for input directives whose concept of being empty is different to the - * default. The `checkboxInputType` directive does this because in its case a value of `false` - * implies empty. - * - * @param {*} value The value of the input to check for emptiness. - * @returns {boolean} True if `value` is "empty". - */ - this.$isEmpty = function(value) { - return isUndefined(value) || value === '' || value === null || value !== value; - }; - - var parentForm = $element.inheritedData('$formController') || nullFormCtrl, - currentValidationRunId = 0; - - /** - * @ngdoc method - * @name ngModel.NgModelController#$setValidity - * - * @description - * Change the validity state, and notify the form. - * - * This method can be called within $parsers/$formatters or a custom validation implementation. - * However, in most cases it should be sufficient to use the `ngModel.$validators` and - * `ngModel.$asyncValidators` collections which will call `$setValidity` automatically. - * - * @param {string} validationErrorKey Name of the validator. The `validationErrorKey` will be assigned - * to either `$error[validationErrorKey]` or `$pending[validationErrorKey]` - * (for unfulfilled `$asyncValidators`), so that it is available for data-binding. - * The `validationErrorKey` should be in camelCase and will get converted into dash-case - * for class name. Example: `myError` will result in `ng-valid-my-error` and `ng-invalid-my-error` - * class and can be bound to as `{{someForm.someControl.$error.myError}}` . - * @param {boolean} isValid Whether the current state is valid (true), invalid (false), pending (undefined), - * or skipped (null). Pending is used for unfulfilled `$asyncValidators`. - * Skipped is used by Angular when validators do not run because of parse errors and - * when `$asyncValidators` do not run because any of the `$validators` failed. - */ - addSetValidityMethod({ - ctrl: this, - $element: $element, - set: function(object, property) { - object[property] = true; - }, - unset: function(object, property) { - delete object[property]; - }, - parentForm: parentForm, - $animate: $animate - }); - - /** - * @ngdoc method - * @name ngModel.NgModelController#$setPristine - * - * @description - * Sets the control to its pristine state. - * - * This method can be called to remove the `ng-dirty` class and set the control to its pristine - * state (`ng-pristine` class). A model is considered to be pristine when the control - * has not been changed from when first compiled. - */ - this.$setPristine = function() { - ctrl.$dirty = false; - ctrl.$pristine = true; - $animate.removeClass($element, DIRTY_CLASS); - $animate.addClass($element, PRISTINE_CLASS); - }; - - /** - * @ngdoc method - * @name ngModel.NgModelController#$setDirty - * - * @description - * Sets the control to its dirty state. - * - * This method can be called to remove the `ng-pristine` class and set the control to its dirty - * state (`ng-dirty` class). A model is considered to be dirty when the control has been changed - * from when first compiled. - */ - this.$setDirty = function() { - ctrl.$dirty = true; - ctrl.$pristine = false; - $animate.removeClass($element, PRISTINE_CLASS); - $animate.addClass($element, DIRTY_CLASS); - parentForm.$setDirty(); - }; - - /** - * @ngdoc method - * @name ngModel.NgModelController#$setUntouched - * - * @description - * Sets the control to its untouched state. - * - * This method can be called to remove the `ng-touched` class and set the control to its - * untouched state (`ng-untouched` class). Upon compilation, a model is set as untouched - * by default, however this function can be used to restore that state if the model has - * already been touched by the user. - */ - this.$setUntouched = function() { - ctrl.$touched = false; - ctrl.$untouched = true; - $animate.setClass($element, UNTOUCHED_CLASS, TOUCHED_CLASS); - }; - - /** - * @ngdoc method - * @name ngModel.NgModelController#$setTouched - * - * @description - * Sets the control to its touched state. - * - * This method can be called to remove the `ng-untouched` class and set the control to its - * touched state (`ng-touched` class). A model is considered to be touched when the user has - * first focused the control element and then shifted focus away from the control (blur event). - */ - this.$setTouched = function() { - ctrl.$touched = true; - ctrl.$untouched = false; - $animate.setClass($element, TOUCHED_CLASS, UNTOUCHED_CLASS); - }; - - /** - * @ngdoc method - * @name ngModel.NgModelController#$rollbackViewValue - * - * @description - * Cancel an update and reset the input element's value to prevent an update to the `$modelValue`, - * which may be caused by a pending debounced event or because the input is waiting for a some - * future event. - * - * If you have an input that uses `ng-model-options` to set up debounced events or events such - * as blur you can have a situation where there is a period when the `$viewValue` - * is out of synch with the ngModel's `$modelValue`. - * - * In this case, you can run into difficulties if you try to update the ngModel's `$modelValue` - * programmatically before these debounced/future events have resolved/occurred, because Angular's - * dirty checking mechanism is not able to tell whether the model has actually changed or not. - * - * The `$rollbackViewValue()` method should be called before programmatically changing the model of an - * input which may have such events pending. This is important in order to make sure that the - * input field will be updated with the new model value and any pending operations are cancelled. - * - * - * - * angular.module('cancel-update-example', []) - * - * .controller('CancelUpdateController', ['$scope', function($scope) { - * $scope.resetWithCancel = function(e) { - * if (e.keyCode == 27) { - * $scope.myForm.myInput1.$rollbackViewValue(); - * $scope.myValue = ''; - * } - * }; - * $scope.resetWithoutCancel = function(e) { - * if (e.keyCode == 27) { - * $scope.myValue = ''; - * } - * }; - * }]); - * - * - *
- *

Try typing something in each input. See that the model only updates when you - * blur off the input. - *

- *

Now see what happens if you start typing then press the Escape key

- * - *
- *

With $rollbackViewValue()

- *
- * myValue: "{{ myValue }}" - * - *

Without $rollbackViewValue()

- *
- * myValue: "{{ myValue }}" - *
- *
- *
- *
- */ - this.$rollbackViewValue = function() { - $timeout.cancel(pendingDebounce); - ctrl.$viewValue = ctrl.$$lastCommittedViewValue; - ctrl.$render(); - }; - - /** - * @ngdoc method - * @name ngModel.NgModelController#$validate - * - * @description - * Runs each of the registered validators (first synchronous validators and then - * asynchronous validators). - * If the validity changes to invalid, the model will be set to `undefined`, - * unless {@link ngModelOptions `ngModelOptions.allowInvalid`} is `true`. - * If the validity changes to valid, it will set the model to the last available valid - * modelValue, i.e. either the last parsed value or the last value set from the scope. - */ - this.$validate = function() { - // ignore $validate before model is initialized - if (isNumber(ctrl.$modelValue) && isNaN(ctrl.$modelValue)) { - return; - } - - var viewValue = ctrl.$$lastCommittedViewValue; - // Note: we use the $$rawModelValue as $modelValue might have been - // set to undefined during a view -> model update that found validation - // errors. We can't parse the view here, since that could change - // the model although neither viewValue nor the model on the scope changed - var modelValue = ctrl.$$rawModelValue; - - // Check if the there's a parse error, so we don't unset it accidentially - var parserName = ctrl.$$parserName || 'parse'; - var parserValid = ctrl.$error[parserName] ? false : undefined; - - var prevValid = ctrl.$valid; - var prevModelValue = ctrl.$modelValue; - - var allowInvalid = ctrl.$options && ctrl.$options.allowInvalid; - - ctrl.$$runValidators(parserValid, modelValue, viewValue, function(allValid) { - // If there was no change in validity, don't update the model - // This prevents changing an invalid modelValue to undefined - if (!allowInvalid && prevValid !== allValid) { - // Note: Don't check ctrl.$valid here, as we could have - // external validators (e.g. calculated on the server), - // that just call $setValidity and need the model value - // to calculate their validity. - ctrl.$modelValue = allValid ? modelValue : undefined; - - if (ctrl.$modelValue !== prevModelValue) { - ctrl.$$writeModelToScope(); - } - } - }); - - }; - - this.$$runValidators = function(parseValid, modelValue, viewValue, doneCallback) { - currentValidationRunId++; - var localValidationRunId = currentValidationRunId; - - // check parser error - if (!processParseErrors(parseValid)) { - validationDone(false); - return; - } - if (!processSyncValidators()) { - validationDone(false); - return; - } - processAsyncValidators(); - - function processParseErrors(parseValid) { - var errorKey = ctrl.$$parserName || 'parse'; - if (parseValid === undefined) { - setValidity(errorKey, null); - } else { - setValidity(errorKey, parseValid); - if (!parseValid) { - forEach(ctrl.$validators, function(v, name) { - setValidity(name, null); - }); - forEach(ctrl.$asyncValidators, function(v, name) { - setValidity(name, null); - }); - return false; - } - } - return true; - } - - function processSyncValidators() { - var syncValidatorsValid = true; - forEach(ctrl.$validators, function(validator, name) { - var result = validator(modelValue, viewValue); - syncValidatorsValid = syncValidatorsValid && result; - setValidity(name, result); - }); - if (!syncValidatorsValid) { - forEach(ctrl.$asyncValidators, function(v, name) { - setValidity(name, null); - }); - return false; - } - return true; - } - - function processAsyncValidators() { - var validatorPromises = []; - var allValid = true; - forEach(ctrl.$asyncValidators, function(validator, name) { - var promise = validator(modelValue, viewValue); - if (!isPromiseLike(promise)) { - throw $ngModelMinErr("$asyncValidators", - "Expected asynchronous validator to return a promise but got '{0}' instead.", promise); - } - setValidity(name, undefined); - validatorPromises.push(promise.then(function() { - setValidity(name, true); - }, function(error) { - allValid = false; - setValidity(name, false); - })); - }); - if (!validatorPromises.length) { - validationDone(true); - } else { - $q.all(validatorPromises).then(function() { - validationDone(allValid); - }, noop); - } - } - - function setValidity(name, isValid) { - if (localValidationRunId === currentValidationRunId) { - ctrl.$setValidity(name, isValid); - } - } - - function validationDone(allValid) { - if (localValidationRunId === currentValidationRunId) { - - doneCallback(allValid); - } - } - }; - - /** - * @ngdoc method - * @name ngModel.NgModelController#$commitViewValue - * - * @description - * Commit a pending update to the `$modelValue`. - * - * Updates may be pending by a debounced event or because the input is waiting for a some future - * event defined in `ng-model-options`. this method is rarely needed as `NgModelController` - * usually handles calling this in response to input events. - */ - this.$commitViewValue = function() { - var viewValue = ctrl.$viewValue; - - $timeout.cancel(pendingDebounce); - - // If the view value has not changed then we should just exit, except in the case where there is - // a native validator on the element. In this case the validation state may have changed even though - // the viewValue has stayed empty. - if (ctrl.$$lastCommittedViewValue === viewValue && (viewValue !== '' || !ctrl.$$hasNativeValidators)) { - return; - } - ctrl.$$lastCommittedViewValue = viewValue; - - // change to dirty - if (ctrl.$pristine) { - this.$setDirty(); - } - this.$$parseAndValidate(); - }; - - this.$$parseAndValidate = function() { - var viewValue = ctrl.$$lastCommittedViewValue; - var modelValue = viewValue; - var parserValid = isUndefined(modelValue) ? undefined : true; - - if (parserValid) { - for (var i = 0; i < ctrl.$parsers.length; i++) { - modelValue = ctrl.$parsers[i](modelValue); - if (isUndefined(modelValue)) { - parserValid = false; - break; - } - } - } - if (isNumber(ctrl.$modelValue) && isNaN(ctrl.$modelValue)) { - // ctrl.$modelValue has not been touched yet... - ctrl.$modelValue = ngModelGet($scope); - } - var prevModelValue = ctrl.$modelValue; - var allowInvalid = ctrl.$options && ctrl.$options.allowInvalid; - ctrl.$$rawModelValue = modelValue; - - if (allowInvalid) { - ctrl.$modelValue = modelValue; - writeToModelIfNeeded(); - } - - // Pass the $$lastCommittedViewValue here, because the cached viewValue might be out of date. - // This can happen if e.g. $setViewValue is called from inside a parser - ctrl.$$runValidators(parserValid, modelValue, ctrl.$$lastCommittedViewValue, function(allValid) { - if (!allowInvalid) { - // Note: Don't check ctrl.$valid here, as we could have - // external validators (e.g. calculated on the server), - // that just call $setValidity and need the model value - // to calculate their validity. - ctrl.$modelValue = allValid ? modelValue : undefined; - writeToModelIfNeeded(); - } - }); - - function writeToModelIfNeeded() { - if (ctrl.$modelValue !== prevModelValue) { - ctrl.$$writeModelToScope(); - } - } - }; - - this.$$writeModelToScope = function() { - ngModelSet($scope, ctrl.$modelValue); - forEach(ctrl.$viewChangeListeners, function(listener) { - try { - listener(); - } catch (e) { - $exceptionHandler(e); - } - }); - }; - - /** - * @ngdoc method - * @name ngModel.NgModelController#$setViewValue - * - * @description - * Update the view value. - * - * This method should be called when an input directive want to change the view value; typically, - * this is done from within a DOM event handler. - * - * For example {@link ng.directive:input input} calls it when the value of the input changes and - * {@link ng.directive:select select} calls it when an option is selected. - * - * If the new `value` is an object (rather than a string or a number), we should make a copy of the - * object before passing it to `$setViewValue`. This is because `ngModel` does not perform a deep - * watch of objects, it only looks for a change of identity. If you only change the property of - * the object then ngModel will not realise that the object has changed and will not invoke the - * `$parsers` and `$validators` pipelines. - * - * For this reason, you should not change properties of the copy once it has been passed to - * `$setViewValue`. Otherwise you may cause the model value on the scope to change incorrectly. - * - * When this method is called, the new `value` will be staged for committing through the `$parsers` - * and `$validators` pipelines. If there are no special {@link ngModelOptions} specified then the staged - * value sent directly for processing, finally to be applied to `$modelValue` and then the - * **expression** specified in the `ng-model` attribute. - * - * Lastly, all the registered change listeners, in the `$viewChangeListeners` list, are called. - * - * In case the {@link ng.directive:ngModelOptions ngModelOptions} directive is used with `updateOn` - * and the `default` trigger is not listed, all those actions will remain pending until one of the - * `updateOn` events is triggered on the DOM element. - * All these actions will be debounced if the {@link ng.directive:ngModelOptions ngModelOptions} - * directive is used with a custom debounce for this particular event. - * - * Note that calling this function does not trigger a `$digest`. - * - * @param {string} value Value from the view. - * @param {string} trigger Event that triggered the update. - */ - this.$setViewValue = function(value, trigger) { - ctrl.$viewValue = value; - if (!ctrl.$options || ctrl.$options.updateOnDefault) { - ctrl.$$debounceViewValueCommit(trigger); - } - }; - - this.$$debounceViewValueCommit = function(trigger) { - var debounceDelay = 0, - options = ctrl.$options, - debounce; - - if (options && isDefined(options.debounce)) { - debounce = options.debounce; - if (isNumber(debounce)) { - debounceDelay = debounce; - } else if (isNumber(debounce[trigger])) { - debounceDelay = debounce[trigger]; - } else if (isNumber(debounce['default'])) { - debounceDelay = debounce['default']; - } - } - - $timeout.cancel(pendingDebounce); - if (debounceDelay) { - pendingDebounce = $timeout(function() { - ctrl.$commitViewValue(); - }, debounceDelay); - } else if ($rootScope.$$phase) { - ctrl.$commitViewValue(); - } else { - $scope.$apply(function() { - ctrl.$commitViewValue(); - }); - } - }; - - // model -> value - // Note: we cannot use a normal scope.$watch as we want to detect the following: - // 1. scope value is 'a' - // 2. user enters 'b' - // 3. ng-change kicks in and reverts scope value to 'a' - // -> scope value did not change since the last digest as - // ng-change executes in apply phase - // 4. view should be changed back to 'a' - $scope.$watch(function ngModelWatch() { - var modelValue = ngModelGet($scope); - - // if scope model value and ngModel value are out of sync - // TODO(perf): why not move this to the action fn? - if (modelValue !== ctrl.$modelValue) { - ctrl.$modelValue = ctrl.$$rawModelValue = modelValue; - - var formatters = ctrl.$formatters, - idx = formatters.length; - - var viewValue = modelValue; - while (idx--) { - viewValue = formatters[idx](viewValue); - } - if (ctrl.$viewValue !== viewValue) { - ctrl.$viewValue = ctrl.$$lastCommittedViewValue = viewValue; - ctrl.$render(); - - ctrl.$$runValidators(undefined, modelValue, viewValue, noop); - } - } - - return modelValue; - }); -}]; - - -/** - * @ngdoc directive - * @name ngModel - * - * @element input - * @priority 1 - * - * @description - * The `ngModel` directive binds an `input`,`select`, `textarea` (or custom form control) to a - * property on the scope using {@link ngModel.NgModelController NgModelController}, - * which is created and exposed by this directive. - * - * `ngModel` is responsible for: - * - * - Binding the view into the model, which other directives such as `input`, `textarea` or `select` - * require. - * - Providing validation behavior (i.e. required, number, email, url). - * - Keeping the state of the control (valid/invalid, dirty/pristine, touched/untouched, validation errors). - * - Setting related css classes on the element (`ng-valid`, `ng-invalid`, `ng-dirty`, `ng-pristine`, `ng-touched`, `ng-untouched`) including animations. - * - Registering the control with its parent {@link ng.directive:form form}. - * - * Note: `ngModel` will try to bind to the property given by evaluating the expression on the - * current scope. If the property doesn't already exist on this scope, it will be created - * implicitly and added to the scope. - * - * For best practices on using `ngModel`, see: - * - * - [Understanding Scopes](https://github.com/angular/angular.js/wiki/Understanding-Scopes) - * - * For basic examples, how to use `ngModel`, see: - * - * - {@link ng.directive:input input} - * - {@link input[text] text} - * - {@link input[checkbox] checkbox} - * - {@link input[radio] radio} - * - {@link input[number] number} - * - {@link input[email] email} - * - {@link input[url] url} - * - {@link input[date] date} - * - {@link input[datetime-local] datetime-local} - * - {@link input[time] time} - * - {@link input[month] month} - * - {@link input[week] week} - * - {@link ng.directive:select select} - * - {@link ng.directive:textarea textarea} - * - * # CSS classes - * The following CSS classes are added and removed on the associated input/select/textarea element - * depending on the validity of the model. - * - * - `ng-valid`: the model is valid - * - `ng-invalid`: the model is invalid - * - `ng-valid-[key]`: for each valid key added by `$setValidity` - * - `ng-invalid-[key]`: for each invalid key added by `$setValidity` - * - `ng-pristine`: the control hasn't been interacted with yet - * - `ng-dirty`: the control has been interacted with - * - `ng-touched`: the control has been blurred - * - `ng-untouched`: the control hasn't been blurred - * - `ng-pending`: any `$asyncValidators` are unfulfilled - * - * Keep in mind that ngAnimate can detect each of these classes when added and removed. - * - * ## Animation Hooks - * - * Animations within models are triggered when any of the associated CSS classes are added and removed - * on the input element which is attached to the model. These classes are: `.ng-pristine`, `.ng-dirty`, - * `.ng-invalid` and `.ng-valid` as well as any other validations that are performed on the model itself. - * The animations that are triggered within ngModel are similar to how they work in ngClass and - * animations can be hooked into using CSS transitions, keyframes as well as JS animations. - * - * The following example shows a simple way to utilize CSS transitions to style an input element - * that has been rendered as invalid after it has been validated: - * - *
- * //be sure to include ngAnimate as a module to hook into more
- * //advanced animations
- * .my-input {
- *   transition:0.5s linear all;
- *   background: white;
- * }
- * .my-input.ng-invalid {
- *   background: red;
- *   color:white;
- * }
- * 
- * - * @example - * - - - - Update input to see transitions when valid/invalid. - Integer is a valid value. -
- -
-
- *
- * - * ## Binding to a getter/setter - * - * Sometimes it's helpful to bind `ngModel` to a getter/setter function. A getter/setter is a - * function that returns a representation of the model when called with zero arguments, and sets - * the internal state of a model when called with an argument. It's sometimes useful to use this - * for models that have an internal representation that's different than what the model exposes - * to the view. - * - *
- * **Best Practice:** It's best to keep getters fast because Angular is likely to call them more - * frequently than other parts of your code. - *
- * - * You use this behavior by adding `ng-model-options="{ getterSetter: true }"` to an element that - * has `ng-model` attached to it. You can also add `ng-model-options="{ getterSetter: true }"` to - * a `
`, which will enable this behavior for all ``s within it. See - * {@link ng.directive:ngModelOptions `ngModelOptions`} for more. - * - * The following example shows how to use `ngModel` with a getter/setter: - * - * @example - * - -
- - Name: - - -
user.name = 
-
-
- - angular.module('getterSetterExample', []) - .controller('ExampleController', ['$scope', function($scope) { - var _name = 'Brian'; - $scope.user = { - name: function(newName) { - if (angular.isDefined(newName)) { - _name = newName; - } - return _name; - } - }; - }]); - - *
- */ -var ngModelDirective = ['$rootScope', function($rootScope) { - return { - restrict: 'A', - require: ['ngModel', '^?form', '^?ngModelOptions'], - controller: NgModelController, - // Prelink needs to run before any input directive - // so that we can set the NgModelOptions in NgModelController - // before anyone else uses it. - priority: 1, - compile: function ngModelCompile(element) { - // Setup initial state of the control - element.addClass(PRISTINE_CLASS).addClass(UNTOUCHED_CLASS).addClass(VALID_CLASS); - - return { - pre: function ngModelPreLink(scope, element, attr, ctrls) { - var modelCtrl = ctrls[0], - formCtrl = ctrls[1] || nullFormCtrl; - - modelCtrl.$$setOptions(ctrls[2] && ctrls[2].$options); - - // notify others, especially parent forms - formCtrl.$addControl(modelCtrl); - - attr.$observe('name', function(newValue) { - if (modelCtrl.$name !== newValue) { - formCtrl.$$renameControl(modelCtrl, newValue); - } - }); - - scope.$on('$destroy', function() { - formCtrl.$removeControl(modelCtrl); - }); - }, - post: function ngModelPostLink(scope, element, attr, ctrls) { - var modelCtrl = ctrls[0]; - if (modelCtrl.$options && modelCtrl.$options.updateOn) { - element.on(modelCtrl.$options.updateOn, function(ev) { - modelCtrl.$$debounceViewValueCommit(ev && ev.type); - }); - } - - element.on('blur', function(ev) { - if (modelCtrl.$touched) return; - - if ($rootScope.$$phase) { - scope.$evalAsync(modelCtrl.$setTouched); - } else { - scope.$apply(modelCtrl.$setTouched); - } - }); - } - }; - } - }; -}]; - - -/** - * @ngdoc directive - * @name ngChange - * - * @description - * Evaluate the given expression when the user changes the input. - * The expression is evaluated immediately, unlike the JavaScript onchange event - * which only triggers at the end of a change (usually, when the user leaves the - * form element or presses the return key). - * - * The `ngChange` expression is only evaluated when a change in the input value causes - * a new value to be committed to the model. - * - * It will not be evaluated: - * * if the value returned from the `$parsers` transformation pipeline has not changed - * * if the input has continued to be invalid since the model will stay `null` - * * if the model is changed programmatically and not by a change to the input value - * - * - * Note, this directive requires `ngModel` to be present. - * - * @element input - * @param {expression} ngChange {@link guide/expression Expression} to evaluate upon change - * in input value. - * - * @example - * - * - * - *
- * - * - *
- * debug = {{confirmed}}
- * counter = {{counter}}
- *
- *
- * - * var counter = element(by.binding('counter')); - * var debug = element(by.binding('confirmed')); - * - * it('should evaluate the expression if changing from view', function() { - * expect(counter.getText()).toContain('0'); - * - * element(by.id('ng-change-example1')).click(); - * - * expect(counter.getText()).toContain('1'); - * expect(debug.getText()).toContain('true'); - * }); - * - * it('should not evaluate the expression if changing from model', function() { - * element(by.id('ng-change-example2')).click(); - - * expect(counter.getText()).toContain('0'); - * expect(debug.getText()).toContain('true'); - * }); - * - *
- */ -var ngChangeDirective = valueFn({ - restrict: 'A', - require: 'ngModel', - link: function(scope, element, attr, ctrl) { - ctrl.$viewChangeListeners.push(function() { - scope.$eval(attr.ngChange); - }); - } -}); - - -var requiredDirective = function() { - return { - restrict: 'A', - require: '?ngModel', - link: function(scope, elm, attr, ctrl) { - if (!ctrl) return; - attr.required = true; // force truthy in case we are on non input element - - ctrl.$validators.required = function(modelValue, viewValue) { - return !attr.required || !ctrl.$isEmpty(viewValue); - }; - - attr.$observe('required', function() { - ctrl.$validate(); - }); - } - }; -}; - - -var patternDirective = function() { - return { - restrict: 'A', - require: '?ngModel', - link: function(scope, elm, attr, ctrl) { - if (!ctrl) return; - - var regexp, patternExp = attr.ngPattern || attr.pattern; - attr.$observe('pattern', function(regex) { - if (isString(regex) && regex.length > 0) { - regex = new RegExp('^' + regex + '$'); - } - - if (regex && !regex.test) { - throw minErr('ngPattern')('noregexp', - 'Expected {0} to be a RegExp but was {1}. Element: {2}', patternExp, - regex, startingTag(elm)); - } - - regexp = regex || undefined; - ctrl.$validate(); - }); - - ctrl.$validators.pattern = function(value) { - return ctrl.$isEmpty(value) || isUndefined(regexp) || regexp.test(value); - }; - } - }; -}; - - -var maxlengthDirective = function() { - return { - restrict: 'A', - require: '?ngModel', - link: function(scope, elm, attr, ctrl) { - if (!ctrl) return; - - var maxlength = -1; - attr.$observe('maxlength', function(value) { - var intVal = int(value); - maxlength = isNaN(intVal) ? -1 : intVal; - ctrl.$validate(); - }); - ctrl.$validators.maxlength = function(modelValue, viewValue) { - return (maxlength < 0) || ctrl.$isEmpty(modelValue) || (viewValue.length <= maxlength); - }; - } - }; -}; - -var minlengthDirective = function() { - return { - restrict: 'A', - require: '?ngModel', - link: function(scope, elm, attr, ctrl) { - if (!ctrl) return; - - var minlength = 0; - attr.$observe('minlength', function(value) { - minlength = int(value) || 0; - ctrl.$validate(); - }); - ctrl.$validators.minlength = function(modelValue, viewValue) { - return ctrl.$isEmpty(viewValue) || viewValue.length >= minlength; - }; - } - }; -}; - - -/** - * @ngdoc directive - * @name ngList - * - * @description - * Text input that converts between a delimited string and an array of strings. The default - * delimiter is a comma followed by a space - equivalent to `ng-list=", "`. You can specify a custom - * delimiter as the value of the `ngList` attribute - for example, `ng-list=" | "`. - * - * The behaviour of the directive is affected by the use of the `ngTrim` attribute. - * * If `ngTrim` is set to `"false"` then whitespace around both the separator and each - * list item is respected. This implies that the user of the directive is responsible for - * dealing with whitespace but also allows you to use whitespace as a delimiter, such as a - * tab or newline character. - * * Otherwise whitespace around the delimiter is ignored when splitting (although it is respected - * when joining the list items back together) and whitespace around each list item is stripped - * before it is added to the model. - * - * ### Example with Validation - * - * - * - * angular.module('listExample', []) - * .controller('ExampleController', ['$scope', function($scope) { - * $scope.names = ['morpheus', 'neo', 'trinity']; - * }]); - * - * - *
- * List: - * - * Required! - *
- * names = {{names}}
- * myForm.namesInput.$valid = {{myForm.namesInput.$valid}}
- * myForm.namesInput.$error = {{myForm.namesInput.$error}}
- * myForm.$valid = {{myForm.$valid}}
- * myForm.$error.required = {{!!myForm.$error.required}}
- *
- *
- * - * var listInput = element(by.model('names')); - * var names = element(by.exactBinding('names')); - * var valid = element(by.binding('myForm.namesInput.$valid')); - * var error = element(by.css('span.error')); - * - * it('should initialize to model', function() { - * expect(names.getText()).toContain('["morpheus","neo","trinity"]'); - * expect(valid.getText()).toContain('true'); - * expect(error.getCssValue('display')).toBe('none'); - * }); - * - * it('should be invalid if empty', function() { - * listInput.clear(); - * listInput.sendKeys(''); - * - * expect(names.getText()).toContain(''); - * expect(valid.getText()).toContain('false'); - * expect(error.getCssValue('display')).not.toBe('none'); - * }); - * - *
- * - * ### Example - splitting on whitespace - * - * - * - *
{{ list | json }}
- *
- * - * it("should split the text by newlines", function() { - * var listInput = element(by.model('list')); - * var output = element(by.binding('list | json')); - * listInput.sendKeys('abc\ndef\nghi'); - * expect(output.getText()).toContain('[\n "abc",\n "def",\n "ghi"\n]'); - * }); - * - *
- * - * @element input - * @param {string=} ngList optional delimiter that should be used to split the value. - */ -var ngListDirective = function() { - return { - restrict: 'A', - priority: 100, - require: 'ngModel', - link: function(scope, element, attr, ctrl) { - // We want to control whitespace trimming so we use this convoluted approach - // to access the ngList attribute, which doesn't pre-trim the attribute - var ngList = element.attr(attr.$attr.ngList) || ', '; - var trimValues = attr.ngTrim !== 'false'; - var separator = trimValues ? trim(ngList) : ngList; - - var parse = function(viewValue) { - // If the viewValue is invalid (say required but empty) it will be `undefined` - if (isUndefined(viewValue)) return; - - var list = []; - - if (viewValue) { - forEach(viewValue.split(separator), function(value) { - if (value) list.push(trimValues ? trim(value) : value); - }); - } - - return list; - }; - - ctrl.$parsers.push(parse); - ctrl.$formatters.push(function(value) { - if (isArray(value)) { - return value.join(ngList); - } - - return undefined; - }); - - // Override the standard $isEmpty because an empty array means the input is empty. - ctrl.$isEmpty = function(value) { - return !value || !value.length; - }; - } - }; -}; var CONSTANT_VALUE_REGEXP = /^(true|false|\d+)$/; @@ -21568,281 +20222,6 @@ var ngValueDirective = function() { }; }; -/** - * @ngdoc directive - * @name ngModelOptions - * - * @description - * Allows tuning how model updates are done. Using `ngModelOptions` you can specify a custom list of - * events that will trigger a model update and/or a debouncing delay so that the actual update only - * takes place when a timer expires; this timer will be reset after another change takes place. - * - * Given the nature of `ngModelOptions`, the value displayed inside input fields in the view might - * be different than the value in the actual model. This means that if you update the model you - * should also invoke {@link ngModel.NgModelController `$rollbackViewValue`} on the relevant input field in - * order to make sure it is synchronized with the model and that any debounced action is canceled. - * - * The easiest way to reference the control's {@link ngModel.NgModelController `$rollbackViewValue`} - * method is by making sure the input is placed inside a form that has a `name` attribute. This is - * important because `form` controllers are published to the related scope under the name in their - * `name` attribute. - * - * Any pending changes will take place immediately when an enclosing form is submitted via the - * `submit` event. Note that `ngClick` events will occur before the model is updated. Use `ngSubmit` - * to have access to the updated model. - * - * `ngModelOptions` has an effect on the element it's declared on and its descendants. - * - * @param {Object} ngModelOptions options to apply to the current model. Valid keys are: - * - `updateOn`: string specifying which event should the input be bound to. You can set several - * events using an space delimited list. There is a special event called `default` that - * matches the default events belonging of the control. - * - `debounce`: integer value which contains the debounce model update value in milliseconds. A - * value of 0 triggers an immediate update. If an object is supplied instead, you can specify a - * custom value for each event. For example: - * `ng-model-options="{ updateOn: 'default blur', debounce: {'default': 500, 'blur': 0} }"` - * - `allowInvalid`: boolean value which indicates that the model can be set with values that did - * not validate correctly instead of the default behavior of setting the model to undefined. - * - `getterSetter`: boolean value which determines whether or not to treat functions bound to - `ngModel` as getters/setters. - * - `timezone`: Defines the timezone to be used to read/write the `Date` instance in the model for - * ``, ``, ... . Right now, the only supported value is `'UTC'`, - * otherwise the default timezone of the browser will be used. - * - * @example - - The following example shows how to override immediate updates. Changes on the inputs within the - form will update the model only when the control loses focus (blur event). If `escape` key is - pressed while the input field is focused, the value is reset to the value in the current model. - - - -
-
- Name: -
- - Other data: -
-
-
user.name = 
-
-
- - angular.module('optionsExample', []) - .controller('ExampleController', ['$scope', function($scope) { - $scope.user = { name: 'say', data: '' }; - - $scope.cancel = function(e) { - if (e.keyCode == 27) { - $scope.userForm.userName.$rollbackViewValue(); - } - }; - }]); - - - var model = element(by.binding('user.name')); - var input = element(by.model('user.name')); - var other = element(by.model('user.data')); - - it('should allow custom events', function() { - input.sendKeys(' hello'); - input.click(); - expect(model.getText()).toEqual('say'); - other.click(); - expect(model.getText()).toEqual('say hello'); - }); - - it('should $rollbackViewValue when model changes', function() { - input.sendKeys(' hello'); - expect(input.getAttribute('value')).toEqual('say hello'); - input.sendKeys(protractor.Key.ESCAPE); - expect(input.getAttribute('value')).toEqual('say'); - other.click(); - expect(model.getText()).toEqual('say'); - }); - -
- - This one shows how to debounce model changes. Model will be updated only 1 sec after last change. - If the `Clear` button is pressed, any debounced action is canceled and the value becomes empty. - - - -
-
- Name: - -
-
-
user.name = 
-
-
- - angular.module('optionsExample', []) - .controller('ExampleController', ['$scope', function($scope) { - $scope.user = { name: 'say' }; - }]); - -
- - This one shows how to bind to getter/setters: - - - -
-
- Name: - -
-
user.name = 
-
-
- - angular.module('getterSetterExample', []) - .controller('ExampleController', ['$scope', function($scope) { - var _name = 'Brian'; - $scope.user = { - name: function(newName) { - return angular.isDefined(newName) ? (_name = newName) : _name; - } - }; - }]); - -
- */ -var ngModelOptionsDirective = function() { - return { - restrict: 'A', - controller: ['$scope', '$attrs', function($scope, $attrs) { - var that = this; - this.$options = $scope.$eval($attrs.ngModelOptions); - // Allow adding/overriding bound events - if (this.$options.updateOn !== undefined) { - this.$options.updateOnDefault = false; - // extract "default" pseudo-event from list of events that can trigger a model update - this.$options.updateOn = trim(this.$options.updateOn.replace(DEFAULT_REGEXP, function() { - that.$options.updateOnDefault = true; - return ' '; - })); - } else { - this.$options.updateOnDefault = true; - } - }] - }; -}; - -// helper methods -function addSetValidityMethod(context) { - var ctrl = context.ctrl, - $element = context.$element, - classCache = {}, - set = context.set, - unset = context.unset, - parentForm = context.parentForm, - $animate = context.$animate; - - classCache[INVALID_CLASS] = !(classCache[VALID_CLASS] = $element.hasClass(VALID_CLASS)); - - ctrl.$setValidity = setValidity; - - function setValidity(validationErrorKey, state, options) { - if (state === undefined) { - createAndSet('$pending', validationErrorKey, options); - } else { - unsetAndCleanup('$pending', validationErrorKey, options); - } - if (!isBoolean(state)) { - unset(ctrl.$error, validationErrorKey, options); - unset(ctrl.$$success, validationErrorKey, options); - } else { - if (state) { - unset(ctrl.$error, validationErrorKey, options); - set(ctrl.$$success, validationErrorKey, options); - } else { - set(ctrl.$error, validationErrorKey, options); - unset(ctrl.$$success, validationErrorKey, options); - } - } - if (ctrl.$pending) { - cachedToggleClass(PENDING_CLASS, true); - ctrl.$valid = ctrl.$invalid = undefined; - toggleValidationCss('', null); - } else { - cachedToggleClass(PENDING_CLASS, false); - ctrl.$valid = isObjectEmpty(ctrl.$error); - ctrl.$invalid = !ctrl.$valid; - toggleValidationCss('', ctrl.$valid); - } - - // re-read the state as the set/unset methods could have - // combined state in ctrl.$error[validationError] (used for forms), - // where setting/unsetting only increments/decrements the value, - // and does not replace it. - var combinedState; - if (ctrl.$pending && ctrl.$pending[validationErrorKey]) { - combinedState = undefined; - } else if (ctrl.$error[validationErrorKey]) { - combinedState = false; - } else if (ctrl.$$success[validationErrorKey]) { - combinedState = true; - } else { - combinedState = null; - } - toggleValidationCss(validationErrorKey, combinedState); - parentForm.$setValidity(validationErrorKey, combinedState, ctrl); - } - - function createAndSet(name, value, options) { - if (!ctrl[name]) { - ctrl[name] = {}; - } - set(ctrl[name], value, options); - } - - function unsetAndCleanup(name, value, options) { - if (ctrl[name]) { - unset(ctrl[name], value, options); - } - if (isObjectEmpty(ctrl[name])) { - ctrl[name] = undefined; - } - } - - function cachedToggleClass(className, switchValue) { - if (switchValue && !classCache[className]) { - $animate.addClass($element, className); - classCache[className] = true; - } else if (!switchValue && classCache[className]) { - $animate.removeClass($element, className); - classCache[className] = false; - } - } - - function toggleValidationCss(validationErrorKey, isValid) { - validationErrorKey = validationErrorKey ? '-' + snake_case(validationErrorKey, '-') : ''; - - cachedToggleClass(VALID_CLASS + validationErrorKey, isValid === true); - cachedToggleClass(INVALID_CLASS + validationErrorKey, isValid === false); - } -} - -function isObjectEmpty(obj) { - if (obj) { - for (var prop in obj) { - return false; - } - } - return true; -} - /** * @ngdoc directive * @name ngBind @@ -22049,6 +20428,83 @@ var ngBindHtmlDirective = ['$sce', '$parse', '$compile', function($sce, $parse, }; }]; +/** + * @ngdoc directive + * @name ngChange + * + * @description + * Evaluate the given expression when the user changes the input. + * The expression is evaluated immediately, unlike the JavaScript onchange event + * which only triggers at the end of a change (usually, when the user leaves the + * form element or presses the return key). + * + * The `ngChange` expression is only evaluated when a change in the input value causes + * a new value to be committed to the model. + * + * It will not be evaluated: + * * if the value returned from the `$parsers` transformation pipeline has not changed + * * if the input has continued to be invalid since the model will stay `null` + * * if the model is changed programmatically and not by a change to the input value + * + * + * Note, this directive requires `ngModel` to be present. + * + * @element input + * @param {expression} ngChange {@link guide/expression Expression} to evaluate upon change + * in input value. + * + * @example + * + * + * + *
+ * + * + *
+ * debug = {{confirmed}}
+ * counter = {{counter}}
+ *
+ *
+ * + * var counter = element(by.binding('counter')); + * var debug = element(by.binding('confirmed')); + * + * it('should evaluate the expression if changing from view', function() { + * expect(counter.getText()).toContain('0'); + * + * element(by.id('ng-change-example1')).click(); + * + * expect(counter.getText()).toContain('1'); + * expect(debug.getText()).toContain('true'); + * }); + * + * it('should not evaluate the expression if changing from model', function() { + * element(by.id('ng-change-example2')).click(); + + * expect(counter.getText()).toContain('0'); + * expect(debug.getText()).toContain('true'); + * }); + * + *
+ */ +var ngChangeDirective = valueFn({ + restrict: 'A', + require: 'ngModel', + link: function(scope, element, attr, ctrl) { + ctrl.$viewChangeListeners.push(function() { + scope.$eval(attr.ngChange); + }); + } +}); + function classDirective(name, selector) { name = 'ngClass' + name; return ['$animate', function($animate) { @@ -22190,8 +20646,9 @@ function classDirective(name, selector) { * new classes are added. * * @animations - * add - happens just before the class is applied to the element - * remove - happens just before the class is removed from the element + * **add** - happens just before the class is applied to the elements + * + * **remove** - happens just before the class is removed from the element * * @element ANY * @param {expression} ngClass {@link guide/expression Expression} to eval. The result @@ -23533,7 +21990,7 @@ var ngIfDirective = ['$animate', function($animate) { - url of the template: {{template.url}} + url of the template: {{template.url}}
@@ -23657,7 +22114,7 @@ var ngIfDirective = ['$animate', function($animate) { * @name ngInclude#$includeContentError * @eventType emit on the scope ngInclude was declared in * @description - * Emitted when a template HTTP request yields an erronous response (status < 200 || status > 299) + * Emitted when a template HTTP request yields an erroneous response (status < 200 || status > 299) * * @param {Object} angularEvent Synthetic event object. * @param {String} src URL of content to load. @@ -23845,6 +22302,1466 @@ var ngInitDirective = ngDirective({ } }); +/** + * @ngdoc directive + * @name ngList + * + * @description + * Text input that converts between a delimited string and an array of strings. The default + * delimiter is a comma followed by a space - equivalent to `ng-list=", "`. You can specify a custom + * delimiter as the value of the `ngList` attribute - for example, `ng-list=" | "`. + * + * The behaviour of the directive is affected by the use of the `ngTrim` attribute. + * * If `ngTrim` is set to `"false"` then whitespace around both the separator and each + * list item is respected. This implies that the user of the directive is responsible for + * dealing with whitespace but also allows you to use whitespace as a delimiter, such as a + * tab or newline character. + * * Otherwise whitespace around the delimiter is ignored when splitting (although it is respected + * when joining the list items back together) and whitespace around each list item is stripped + * before it is added to the model. + * + * ### Example with Validation + * + * + * + * angular.module('listExample', []) + * .controller('ExampleController', ['$scope', function($scope) { + * $scope.names = ['morpheus', 'neo', 'trinity']; + * }]); + * + * + *
+ * List: + * + * Required! + *
+ * names = {{names}}
+ * myForm.namesInput.$valid = {{myForm.namesInput.$valid}}
+ * myForm.namesInput.$error = {{myForm.namesInput.$error}}
+ * myForm.$valid = {{myForm.$valid}}
+ * myForm.$error.required = {{!!myForm.$error.required}}
+ *
+ *
+ * + * var listInput = element(by.model('names')); + * var names = element(by.exactBinding('names')); + * var valid = element(by.binding('myForm.namesInput.$valid')); + * var error = element(by.css('span.error')); + * + * it('should initialize to model', function() { + * expect(names.getText()).toContain('["morpheus","neo","trinity"]'); + * expect(valid.getText()).toContain('true'); + * expect(error.getCssValue('display')).toBe('none'); + * }); + * + * it('should be invalid if empty', function() { + * listInput.clear(); + * listInput.sendKeys(''); + * + * expect(names.getText()).toContain(''); + * expect(valid.getText()).toContain('false'); + * expect(error.getCssValue('display')).not.toBe('none'); + * }); + * + *
+ * + * ### Example - splitting on whitespace + * + * + * + *
{{ list | json }}
+ *
+ * + * it("should split the text by newlines", function() { + * var listInput = element(by.model('list')); + * var output = element(by.binding('list | json')); + * listInput.sendKeys('abc\ndef\nghi'); + * expect(output.getText()).toContain('[\n "abc",\n "def",\n "ghi"\n]'); + * }); + * + *
+ * + * @element input + * @param {string=} ngList optional delimiter that should be used to split the value. + */ +var ngListDirective = function() { + return { + restrict: 'A', + priority: 100, + require: 'ngModel', + link: function(scope, element, attr, ctrl) { + // We want to control whitespace trimming so we use this convoluted approach + // to access the ngList attribute, which doesn't pre-trim the attribute + var ngList = element.attr(attr.$attr.ngList) || ', '; + var trimValues = attr.ngTrim !== 'false'; + var separator = trimValues ? trim(ngList) : ngList; + + var parse = function(viewValue) { + // If the viewValue is invalid (say required but empty) it will be `undefined` + if (isUndefined(viewValue)) return; + + var list = []; + + if (viewValue) { + forEach(viewValue.split(separator), function(value) { + if (value) list.push(trimValues ? trim(value) : value); + }); + } + + return list; + }; + + ctrl.$parsers.push(parse); + ctrl.$formatters.push(function(value) { + if (isArray(value)) { + return value.join(ngList); + } + + return undefined; + }); + + // Override the standard $isEmpty because an empty array means the input is empty. + ctrl.$isEmpty = function(value) { + return !value || !value.length; + }; + } + }; +}; + +/* global VALID_CLASS: true, + INVALID_CLASS: true, + PRISTINE_CLASS: true, + DIRTY_CLASS: true, + UNTOUCHED_CLASS: true, + TOUCHED_CLASS: true, +*/ + +var VALID_CLASS = 'ng-valid', + INVALID_CLASS = 'ng-invalid', + PRISTINE_CLASS = 'ng-pristine', + DIRTY_CLASS = 'ng-dirty', + UNTOUCHED_CLASS = 'ng-untouched', + TOUCHED_CLASS = 'ng-touched', + PENDING_CLASS = 'ng-pending'; + + +var $ngModelMinErr = new minErr('ngModel'); + +/** + * @ngdoc type + * @name ngModel.NgModelController + * + * @property {string} $viewValue Actual string value in the view. + * @property {*} $modelValue The value in the model that the control is bound to. + * @property {Array.} $parsers Array of functions to execute, as a pipeline, whenever + the control reads value from the DOM. The functions are called in array order, each passing + its return value through to the next. The last return value is forwarded to the + {@link ngModel.NgModelController#$validators `$validators`} collection. + +Parsers are used to sanitize / convert the {@link ngModel.NgModelController#$viewValue +`$viewValue`}. + +Returning `undefined` from a parser means a parse error occurred. In that case, +no {@link ngModel.NgModelController#$validators `$validators`} will run and the `ngModel` +will be set to `undefined` unless {@link ngModelOptions `ngModelOptions.allowInvalid`} +is set to `true`. The parse error is stored in `ngModel.$error.parse`. + + * + * @property {Array.} $formatters Array of functions to execute, as a pipeline, whenever + the model value changes. The functions are called in reverse array order, each passing the value through to the + next. The last return value is used as the actual DOM value. + Used to format / convert values for display in the control. + * ```js + * function formatter(value) { + * if (value) { + * return value.toUpperCase(); + * } + * } + * ngModel.$formatters.push(formatter); + * ``` + * + * @property {Object.} $validators A collection of validators that are applied + * whenever the model value changes. The key value within the object refers to the name of the + * validator while the function refers to the validation operation. The validation operation is + * provided with the model value as an argument and must return a true or false value depending + * on the response of that validation. + * + * ```js + * ngModel.$validators.validCharacters = function(modelValue, viewValue) { + * var value = modelValue || viewValue; + * return /[0-9]+/.test(value) && + * /[a-z]+/.test(value) && + * /[A-Z]+/.test(value) && + * /\W+/.test(value); + * }; + * ``` + * + * @property {Object.} $asyncValidators A collection of validations that are expected to + * perform an asynchronous validation (e.g. a HTTP request). The validation function that is provided + * is expected to return a promise when it is run during the model validation process. Once the promise + * is delivered then the validation status will be set to true when fulfilled and false when rejected. + * When the asynchronous validators are triggered, each of the validators will run in parallel and the model + * value will only be updated once all validators have been fulfilled. As long as an asynchronous validator + * is unfulfilled, its key will be added to the controllers `$pending` property. Also, all asynchronous validators + * will only run once all synchronous validators have passed. + * + * Please note that if $http is used then it is important that the server returns a success HTTP response code + * in order to fulfill the validation and a status level of `4xx` in order to reject the validation. + * + * ```js + * ngModel.$asyncValidators.uniqueUsername = function(modelValue, viewValue) { + * var value = modelValue || viewValue; + * + * // Lookup user by username + * return $http.get('/api/users/' + value). + * then(function resolved() { + * //username exists, this means validation fails + * return $q.reject('exists'); + * }, function rejected() { + * //username does not exist, therefore this validation passes + * return true; + * }); + * }; + * ``` + * + * @property {Array.} $viewChangeListeners Array of functions to execute whenever the + * view value has changed. It is called with no arguments, and its return value is ignored. + * This can be used in place of additional $watches against the model value. + * + * @property {Object} $error An object hash with all failing validator ids as keys. + * @property {Object} $pending An object hash with all pending validator ids as keys. + * + * @property {boolean} $untouched True if control has not lost focus yet. + * @property {boolean} $touched True if control has lost focus. + * @property {boolean} $pristine True if user has not interacted with the control yet. + * @property {boolean} $dirty True if user has already interacted with the control. + * @property {boolean} $valid True if there is no error. + * @property {boolean} $invalid True if at least one error on the control. + * @property {string} $name The name attribute of the control. + * + * @description + * + * `NgModelController` provides API for the {@link ngModel `ngModel`} directive. + * The controller contains services for data-binding, validation, CSS updates, and value formatting + * and parsing. It purposefully does not contain any logic which deals with DOM rendering or + * listening to DOM events. + * Such DOM related logic should be provided by other directives which make use of + * `NgModelController` for data-binding to control elements. + * Angular provides this DOM logic for most {@link input `input`} elements. + * At the end of this page you can find a {@link ngModel.NgModelController#custom-control-example + * custom control example} that uses `ngModelController` to bind to `contenteditable` elements. + * + * @example + * ### Custom Control Example + * This example shows how to use `NgModelController` with a custom control to achieve + * data-binding. Notice how different directives (`contenteditable`, `ng-model`, and `required`) + * collaborate together to achieve the desired result. + * + * Note that `contenteditable` is an HTML5 attribute, which tells the browser to let the element + * contents be edited in place by the user. This will not work on older browsers. + * + * We are using the {@link ng.service:$sce $sce} service here and include the {@link ngSanitize $sanitize} + * module to automatically remove "bad" content like inline event listener (e.g. ``). + * However, as we are using `$sce` the model can still decide to provide unsafe content if it marks + * that content using the `$sce` service. + * + * + + [contenteditable] { + border: 1px solid black; + background-color: white; + min-height: 20px; + } + + .ng-invalid { + border: 1px solid red; + } + + + + angular.module('customControl', ['ngSanitize']). + directive('contenteditable', ['$sce', function($sce) { + return { + restrict: 'A', // only activate on element attribute + require: '?ngModel', // get a hold of NgModelController + link: function(scope, element, attrs, ngModel) { + if (!ngModel) return; // do nothing if no ng-model + + // Specify how UI should be updated + ngModel.$render = function() { + element.html($sce.getTrustedHtml(ngModel.$viewValue || '')); + }; + + // Listen for change events to enable binding + element.on('blur keyup change', function() { + scope.$evalAsync(read); + }); + read(); // initialize + + // Write data to the model + function read() { + var html = element.html(); + // When we clear the content editable the browser leaves a
behind + // If strip-br attribute is provided then we strip this out + if ( attrs.stripBr && html == '
' ) { + html = ''; + } + ngModel.$setViewValue(html); + } + } + }; + }]); +
+ +
+
Change me!
+ Required! +
+ +
+
+ + it('should data-bind and become invalid', function() { + if (browser.params.browser == 'safari' || browser.params.browser == 'firefox') { + // SafariDriver can't handle contenteditable + // and Firefox driver can't clear contenteditables very well + return; + } + var contentEditable = element(by.css('[contenteditable]')); + var content = 'Change me!'; + + expect(contentEditable.getText()).toEqual(content); + + contentEditable.clear(); + contentEditable.sendKeys(protractor.Key.BACK_SPACE); + expect(contentEditable.getText()).toEqual(''); + expect(contentEditable.getAttribute('class')).toMatch(/ng-invalid-required/); + }); + + *
+ * + * + */ +var NgModelController = ['$scope', '$exceptionHandler', '$attrs', '$element', '$parse', '$animate', '$timeout', '$rootScope', '$q', '$interpolate', + function($scope, $exceptionHandler, $attr, $element, $parse, $animate, $timeout, $rootScope, $q, $interpolate) { + this.$viewValue = Number.NaN; + this.$modelValue = Number.NaN; + this.$$rawModelValue = undefined; // stores the parsed modelValue / model set from scope regardless of validity. + this.$validators = {}; + this.$asyncValidators = {}; + this.$parsers = []; + this.$formatters = []; + this.$viewChangeListeners = []; + this.$untouched = true; + this.$touched = false; + this.$pristine = true; + this.$dirty = false; + this.$valid = true; + this.$invalid = false; + this.$error = {}; // keep invalid keys here + this.$$success = {}; // keep valid keys here + this.$pending = undefined; // keep pending keys here + this.$name = $interpolate($attr.name || '', false)($scope); + + + var parsedNgModel = $parse($attr.ngModel), + parsedNgModelAssign = parsedNgModel.assign, + ngModelGet = parsedNgModel, + ngModelSet = parsedNgModelAssign, + pendingDebounce = null, + ctrl = this; + + this.$$setOptions = function(options) { + ctrl.$options = options; + if (options && options.getterSetter) { + var invokeModelGetter = $parse($attr.ngModel + '()'), + invokeModelSetter = $parse($attr.ngModel + '($$$p)'); + + ngModelGet = function($scope) { + var modelValue = parsedNgModel($scope); + if (isFunction(modelValue)) { + modelValue = invokeModelGetter($scope); + } + return modelValue; + }; + ngModelSet = function($scope, newValue) { + if (isFunction(parsedNgModel($scope))) { + invokeModelSetter($scope, {$$$p: ctrl.$modelValue}); + } else { + parsedNgModelAssign($scope, ctrl.$modelValue); + } + }; + } else if (!parsedNgModel.assign) { + throw $ngModelMinErr('nonassign', "Expression '{0}' is non-assignable. Element: {1}", + $attr.ngModel, startingTag($element)); + } + }; + + /** + * @ngdoc method + * @name ngModel.NgModelController#$render + * + * @description + * Called when the view needs to be updated. It is expected that the user of the ng-model + * directive will implement this method. + * + * The `$render()` method is invoked in the following situations: + * + * * `$rollbackViewValue()` is called. If we are rolling back the view value to the last + * committed value then `$render()` is called to update the input control. + * * The value referenced by `ng-model` is changed programmatically and both the `$modelValue` and + * the `$viewValue` are different to last time. + * + * Since `ng-model` does not do a deep watch, `$render()` is only invoked if the values of + * `$modelValue` and `$viewValue` are actually different to their previous value. If `$modelValue` + * or `$viewValue` are objects (rather than a string or number) then `$render()` will not be + * invoked if you only change a property on the objects. + */ + this.$render = noop; + + /** + * @ngdoc method + * @name ngModel.NgModelController#$isEmpty + * + * @description + * This is called when we need to determine if the value of an input is empty. + * + * For instance, the required directive does this to work out if the input has data or not. + * + * The default `$isEmpty` function checks whether the value is `undefined`, `''`, `null` or `NaN`. + * + * You can override this for input directives whose concept of being empty is different to the + * default. The `checkboxInputType` directive does this because in its case a value of `false` + * implies empty. + * + * @param {*} value The value of the input to check for emptiness. + * @returns {boolean} True if `value` is "empty". + */ + this.$isEmpty = function(value) { + return isUndefined(value) || value === '' || value === null || value !== value; + }; + + var parentForm = $element.inheritedData('$formController') || nullFormCtrl, + currentValidationRunId = 0; + + /** + * @ngdoc method + * @name ngModel.NgModelController#$setValidity + * + * @description + * Change the validity state, and notify the form. + * + * This method can be called within $parsers/$formatters or a custom validation implementation. + * However, in most cases it should be sufficient to use the `ngModel.$validators` and + * `ngModel.$asyncValidators` collections which will call `$setValidity` automatically. + * + * @param {string} validationErrorKey Name of the validator. The `validationErrorKey` will be assigned + * to either `$error[validationErrorKey]` or `$pending[validationErrorKey]` + * (for unfulfilled `$asyncValidators`), so that it is available for data-binding. + * The `validationErrorKey` should be in camelCase and will get converted into dash-case + * for class name. Example: `myError` will result in `ng-valid-my-error` and `ng-invalid-my-error` + * class and can be bound to as `{{someForm.someControl.$error.myError}}` . + * @param {boolean} isValid Whether the current state is valid (true), invalid (false), pending (undefined), + * or skipped (null). Pending is used for unfulfilled `$asyncValidators`. + * Skipped is used by Angular when validators do not run because of parse errors and + * when `$asyncValidators` do not run because any of the `$validators` failed. + */ + addSetValidityMethod({ + ctrl: this, + $element: $element, + set: function(object, property) { + object[property] = true; + }, + unset: function(object, property) { + delete object[property]; + }, + parentForm: parentForm, + $animate: $animate + }); + + /** + * @ngdoc method + * @name ngModel.NgModelController#$setPristine + * + * @description + * Sets the control to its pristine state. + * + * This method can be called to remove the `ng-dirty` class and set the control to its pristine + * state (`ng-pristine` class). A model is considered to be pristine when the control + * has not been changed from when first compiled. + */ + this.$setPristine = function() { + ctrl.$dirty = false; + ctrl.$pristine = true; + $animate.removeClass($element, DIRTY_CLASS); + $animate.addClass($element, PRISTINE_CLASS); + }; + + /** + * @ngdoc method + * @name ngModel.NgModelController#$setDirty + * + * @description + * Sets the control to its dirty state. + * + * This method can be called to remove the `ng-pristine` class and set the control to its dirty + * state (`ng-dirty` class). A model is considered to be dirty when the control has been changed + * from when first compiled. + */ + this.$setDirty = function() { + ctrl.$dirty = true; + ctrl.$pristine = false; + $animate.removeClass($element, PRISTINE_CLASS); + $animate.addClass($element, DIRTY_CLASS); + parentForm.$setDirty(); + }; + + /** + * @ngdoc method + * @name ngModel.NgModelController#$setUntouched + * + * @description + * Sets the control to its untouched state. + * + * This method can be called to remove the `ng-touched` class and set the control to its + * untouched state (`ng-untouched` class). Upon compilation, a model is set as untouched + * by default, however this function can be used to restore that state if the model has + * already been touched by the user. + */ + this.$setUntouched = function() { + ctrl.$touched = false; + ctrl.$untouched = true; + $animate.setClass($element, UNTOUCHED_CLASS, TOUCHED_CLASS); + }; + + /** + * @ngdoc method + * @name ngModel.NgModelController#$setTouched + * + * @description + * Sets the control to its touched state. + * + * This method can be called to remove the `ng-untouched` class and set the control to its + * touched state (`ng-touched` class). A model is considered to be touched when the user has + * first focused the control element and then shifted focus away from the control (blur event). + */ + this.$setTouched = function() { + ctrl.$touched = true; + ctrl.$untouched = false; + $animate.setClass($element, TOUCHED_CLASS, UNTOUCHED_CLASS); + }; + + /** + * @ngdoc method + * @name ngModel.NgModelController#$rollbackViewValue + * + * @description + * Cancel an update and reset the input element's value to prevent an update to the `$modelValue`, + * which may be caused by a pending debounced event or because the input is waiting for a some + * future event. + * + * If you have an input that uses `ng-model-options` to set up debounced events or events such + * as blur you can have a situation where there is a period when the `$viewValue` + * is out of synch with the ngModel's `$modelValue`. + * + * In this case, you can run into difficulties if you try to update the ngModel's `$modelValue` + * programmatically before these debounced/future events have resolved/occurred, because Angular's + * dirty checking mechanism is not able to tell whether the model has actually changed or not. + * + * The `$rollbackViewValue()` method should be called before programmatically changing the model of an + * input which may have such events pending. This is important in order to make sure that the + * input field will be updated with the new model value and any pending operations are cancelled. + * + * + * + * angular.module('cancel-update-example', []) + * + * .controller('CancelUpdateController', ['$scope', function($scope) { + * $scope.resetWithCancel = function(e) { + * if (e.keyCode == 27) { + * $scope.myForm.myInput1.$rollbackViewValue(); + * $scope.myValue = ''; + * } + * }; + * $scope.resetWithoutCancel = function(e) { + * if (e.keyCode == 27) { + * $scope.myValue = ''; + * } + * }; + * }]); + * + * + *
+ *

Try typing something in each input. See that the model only updates when you + * blur off the input. + *

+ *

Now see what happens if you start typing then press the Escape key

+ * + *
+ *

With $rollbackViewValue()

+ *
+ * myValue: "{{ myValue }}" + * + *

Without $rollbackViewValue()

+ *
+ * myValue: "{{ myValue }}" + *
+ *
+ *
+ *
+ */ + this.$rollbackViewValue = function() { + $timeout.cancel(pendingDebounce); + ctrl.$viewValue = ctrl.$$lastCommittedViewValue; + ctrl.$render(); + }; + + /** + * @ngdoc method + * @name ngModel.NgModelController#$validate + * + * @description + * Runs each of the registered validators (first synchronous validators and then + * asynchronous validators). + * If the validity changes to invalid, the model will be set to `undefined`, + * unless {@link ngModelOptions `ngModelOptions.allowInvalid`} is `true`. + * If the validity changes to valid, it will set the model to the last available valid + * modelValue, i.e. either the last parsed value or the last value set from the scope. + */ + this.$validate = function() { + // ignore $validate before model is initialized + if (isNumber(ctrl.$modelValue) && isNaN(ctrl.$modelValue)) { + return; + } + + var viewValue = ctrl.$$lastCommittedViewValue; + // Note: we use the $$rawModelValue as $modelValue might have been + // set to undefined during a view -> model update that found validation + // errors. We can't parse the view here, since that could change + // the model although neither viewValue nor the model on the scope changed + var modelValue = ctrl.$$rawModelValue; + + // Check if the there's a parse error, so we don't unset it accidentially + var parserName = ctrl.$$parserName || 'parse'; + var parserValid = ctrl.$error[parserName] ? false : undefined; + + var prevValid = ctrl.$valid; + var prevModelValue = ctrl.$modelValue; + + var allowInvalid = ctrl.$options && ctrl.$options.allowInvalid; + + ctrl.$$runValidators(parserValid, modelValue, viewValue, function(allValid) { + // If there was no change in validity, don't update the model + // This prevents changing an invalid modelValue to undefined + if (!allowInvalid && prevValid !== allValid) { + // Note: Don't check ctrl.$valid here, as we could have + // external validators (e.g. calculated on the server), + // that just call $setValidity and need the model value + // to calculate their validity. + ctrl.$modelValue = allValid ? modelValue : undefined; + + if (ctrl.$modelValue !== prevModelValue) { + ctrl.$$writeModelToScope(); + } + } + }); + + }; + + this.$$runValidators = function(parseValid, modelValue, viewValue, doneCallback) { + currentValidationRunId++; + var localValidationRunId = currentValidationRunId; + + // check parser error + if (!processParseErrors(parseValid)) { + validationDone(false); + return; + } + if (!processSyncValidators()) { + validationDone(false); + return; + } + processAsyncValidators(); + + function processParseErrors(parseValid) { + var errorKey = ctrl.$$parserName || 'parse'; + if (parseValid === undefined) { + setValidity(errorKey, null); + } else { + setValidity(errorKey, parseValid); + if (!parseValid) { + forEach(ctrl.$validators, function(v, name) { + setValidity(name, null); + }); + forEach(ctrl.$asyncValidators, function(v, name) { + setValidity(name, null); + }); + return false; + } + } + return true; + } + + function processSyncValidators() { + var syncValidatorsValid = true; + forEach(ctrl.$validators, function(validator, name) { + var result = validator(modelValue, viewValue); + syncValidatorsValid = syncValidatorsValid && result; + setValidity(name, result); + }); + if (!syncValidatorsValid) { + forEach(ctrl.$asyncValidators, function(v, name) { + setValidity(name, null); + }); + return false; + } + return true; + } + + function processAsyncValidators() { + var validatorPromises = []; + var allValid = true; + forEach(ctrl.$asyncValidators, function(validator, name) { + var promise = validator(modelValue, viewValue); + if (!isPromiseLike(promise)) { + throw $ngModelMinErr("$asyncValidators", + "Expected asynchronous validator to return a promise but got '{0}' instead.", promise); + } + setValidity(name, undefined); + validatorPromises.push(promise.then(function() { + setValidity(name, true); + }, function(error) { + allValid = false; + setValidity(name, false); + })); + }); + if (!validatorPromises.length) { + validationDone(true); + } else { + $q.all(validatorPromises).then(function() { + validationDone(allValid); + }, noop); + } + } + + function setValidity(name, isValid) { + if (localValidationRunId === currentValidationRunId) { + ctrl.$setValidity(name, isValid); + } + } + + function validationDone(allValid) { + if (localValidationRunId === currentValidationRunId) { + + doneCallback(allValid); + } + } + }; + + /** + * @ngdoc method + * @name ngModel.NgModelController#$commitViewValue + * + * @description + * Commit a pending update to the `$modelValue`. + * + * Updates may be pending by a debounced event or because the input is waiting for a some future + * event defined in `ng-model-options`. this method is rarely needed as `NgModelController` + * usually handles calling this in response to input events. + */ + this.$commitViewValue = function() { + var viewValue = ctrl.$viewValue; + + $timeout.cancel(pendingDebounce); + + // If the view value has not changed then we should just exit, except in the case where there is + // a native validator on the element. In this case the validation state may have changed even though + // the viewValue has stayed empty. + if (ctrl.$$lastCommittedViewValue === viewValue && (viewValue !== '' || !ctrl.$$hasNativeValidators)) { + return; + } + ctrl.$$lastCommittedViewValue = viewValue; + + // change to dirty + if (ctrl.$pristine) { + this.$setDirty(); + } + this.$$parseAndValidate(); + }; + + this.$$parseAndValidate = function() { + var viewValue = ctrl.$$lastCommittedViewValue; + var modelValue = viewValue; + var parserValid = isUndefined(modelValue) ? undefined : true; + + if (parserValid) { + for (var i = 0; i < ctrl.$parsers.length; i++) { + modelValue = ctrl.$parsers[i](modelValue); + if (isUndefined(modelValue)) { + parserValid = false; + break; + } + } + } + if (isNumber(ctrl.$modelValue) && isNaN(ctrl.$modelValue)) { + // ctrl.$modelValue has not been touched yet... + ctrl.$modelValue = ngModelGet($scope); + } + var prevModelValue = ctrl.$modelValue; + var allowInvalid = ctrl.$options && ctrl.$options.allowInvalid; + ctrl.$$rawModelValue = modelValue; + + if (allowInvalid) { + ctrl.$modelValue = modelValue; + writeToModelIfNeeded(); + } + + // Pass the $$lastCommittedViewValue here, because the cached viewValue might be out of date. + // This can happen if e.g. $setViewValue is called from inside a parser + ctrl.$$runValidators(parserValid, modelValue, ctrl.$$lastCommittedViewValue, function(allValid) { + if (!allowInvalid) { + // Note: Don't check ctrl.$valid here, as we could have + // external validators (e.g. calculated on the server), + // that just call $setValidity and need the model value + // to calculate their validity. + ctrl.$modelValue = allValid ? modelValue : undefined; + writeToModelIfNeeded(); + } + }); + + function writeToModelIfNeeded() { + if (ctrl.$modelValue !== prevModelValue) { + ctrl.$$writeModelToScope(); + } + } + }; + + this.$$writeModelToScope = function() { + ngModelSet($scope, ctrl.$modelValue); + forEach(ctrl.$viewChangeListeners, function(listener) { + try { + listener(); + } catch (e) { + $exceptionHandler(e); + } + }); + }; + + /** + * @ngdoc method + * @name ngModel.NgModelController#$setViewValue + * + * @description + * Update the view value. + * + * This method should be called when an input directive want to change the view value; typically, + * this is done from within a DOM event handler. + * + * For example {@link ng.directive:input input} calls it when the value of the input changes and + * {@link ng.directive:select select} calls it when an option is selected. + * + * If the new `value` is an object (rather than a string or a number), we should make a copy of the + * object before passing it to `$setViewValue`. This is because `ngModel` does not perform a deep + * watch of objects, it only looks for a change of identity. If you only change the property of + * the object then ngModel will not realise that the object has changed and will not invoke the + * `$parsers` and `$validators` pipelines. + * + * For this reason, you should not change properties of the copy once it has been passed to + * `$setViewValue`. Otherwise you may cause the model value on the scope to change incorrectly. + * + * When this method is called, the new `value` will be staged for committing through the `$parsers` + * and `$validators` pipelines. If there are no special {@link ngModelOptions} specified then the staged + * value sent directly for processing, finally to be applied to `$modelValue` and then the + * **expression** specified in the `ng-model` attribute. + * + * Lastly, all the registered change listeners, in the `$viewChangeListeners` list, are called. + * + * In case the {@link ng.directive:ngModelOptions ngModelOptions} directive is used with `updateOn` + * and the `default` trigger is not listed, all those actions will remain pending until one of the + * `updateOn` events is triggered on the DOM element. + * All these actions will be debounced if the {@link ng.directive:ngModelOptions ngModelOptions} + * directive is used with a custom debounce for this particular event. + * + * Note that calling this function does not trigger a `$digest`. + * + * @param {string} value Value from the view. + * @param {string} trigger Event that triggered the update. + */ + this.$setViewValue = function(value, trigger) { + ctrl.$viewValue = value; + if (!ctrl.$options || ctrl.$options.updateOnDefault) { + ctrl.$$debounceViewValueCommit(trigger); + } + }; + + this.$$debounceViewValueCommit = function(trigger) { + var debounceDelay = 0, + options = ctrl.$options, + debounce; + + if (options && isDefined(options.debounce)) { + debounce = options.debounce; + if (isNumber(debounce)) { + debounceDelay = debounce; + } else if (isNumber(debounce[trigger])) { + debounceDelay = debounce[trigger]; + } else if (isNumber(debounce['default'])) { + debounceDelay = debounce['default']; + } + } + + $timeout.cancel(pendingDebounce); + if (debounceDelay) { + pendingDebounce = $timeout(function() { + ctrl.$commitViewValue(); + }, debounceDelay); + } else if ($rootScope.$$phase) { + ctrl.$commitViewValue(); + } else { + $scope.$apply(function() { + ctrl.$commitViewValue(); + }); + } + }; + + // model -> value + // Note: we cannot use a normal scope.$watch as we want to detect the following: + // 1. scope value is 'a' + // 2. user enters 'b' + // 3. ng-change kicks in and reverts scope value to 'a' + // -> scope value did not change since the last digest as + // ng-change executes in apply phase + // 4. view should be changed back to 'a' + $scope.$watch(function ngModelWatch() { + var modelValue = ngModelGet($scope); + + // if scope model value and ngModel value are out of sync + // TODO(perf): why not move this to the action fn? + if (modelValue !== ctrl.$modelValue) { + ctrl.$modelValue = ctrl.$$rawModelValue = modelValue; + + var formatters = ctrl.$formatters, + idx = formatters.length; + + var viewValue = modelValue; + while (idx--) { + viewValue = formatters[idx](viewValue); + } + if (ctrl.$viewValue !== viewValue) { + ctrl.$viewValue = ctrl.$$lastCommittedViewValue = viewValue; + ctrl.$render(); + + ctrl.$$runValidators(undefined, modelValue, viewValue, noop); + } + } + + return modelValue; + }); +}]; + + +/** + * @ngdoc directive + * @name ngModel + * + * @element input + * @priority 1 + * + * @description + * The `ngModel` directive binds an `input`,`select`, `textarea` (or custom form control) to a + * property on the scope using {@link ngModel.NgModelController NgModelController}, + * which is created and exposed by this directive. + * + * `ngModel` is responsible for: + * + * - Binding the view into the model, which other directives such as `input`, `textarea` or `select` + * require. + * - Providing validation behavior (i.e. required, number, email, url). + * - Keeping the state of the control (valid/invalid, dirty/pristine, touched/untouched, validation errors). + * - Setting related css classes on the element (`ng-valid`, `ng-invalid`, `ng-dirty`, `ng-pristine`, `ng-touched`, `ng-untouched`) including animations. + * - Registering the control with its parent {@link ng.directive:form form}. + * + * Note: `ngModel` will try to bind to the property given by evaluating the expression on the + * current scope. If the property doesn't already exist on this scope, it will be created + * implicitly and added to the scope. + * + * For best practices on using `ngModel`, see: + * + * - [Understanding Scopes](https://github.com/angular/angular.js/wiki/Understanding-Scopes) + * + * For basic examples, how to use `ngModel`, see: + * + * - {@link ng.directive:input input} + * - {@link input[text] text} + * - {@link input[checkbox] checkbox} + * - {@link input[radio] radio} + * - {@link input[number] number} + * - {@link input[email] email} + * - {@link input[url] url} + * - {@link input[date] date} + * - {@link input[datetime-local] datetime-local} + * - {@link input[time] time} + * - {@link input[month] month} + * - {@link input[week] week} + * - {@link ng.directive:select select} + * - {@link ng.directive:textarea textarea} + * + * # CSS classes + * The following CSS classes are added and removed on the associated input/select/textarea element + * depending on the validity of the model. + * + * - `ng-valid`: the model is valid + * - `ng-invalid`: the model is invalid + * - `ng-valid-[key]`: for each valid key added by `$setValidity` + * - `ng-invalid-[key]`: for each invalid key added by `$setValidity` + * - `ng-pristine`: the control hasn't been interacted with yet + * - `ng-dirty`: the control has been interacted with + * - `ng-touched`: the control has been blurred + * - `ng-untouched`: the control hasn't been blurred + * - `ng-pending`: any `$asyncValidators` are unfulfilled + * + * Keep in mind that ngAnimate can detect each of these classes when added and removed. + * + * ## Animation Hooks + * + * Animations within models are triggered when any of the associated CSS classes are added and removed + * on the input element which is attached to the model. These classes are: `.ng-pristine`, `.ng-dirty`, + * `.ng-invalid` and `.ng-valid` as well as any other validations that are performed on the model itself. + * The animations that are triggered within ngModel are similar to how they work in ngClass and + * animations can be hooked into using CSS transitions, keyframes as well as JS animations. + * + * The following example shows a simple way to utilize CSS transitions to style an input element + * that has been rendered as invalid after it has been validated: + * + *
+ * //be sure to include ngAnimate as a module to hook into more
+ * //advanced animations
+ * .my-input {
+ *   transition:0.5s linear all;
+ *   background: white;
+ * }
+ * .my-input.ng-invalid {
+ *   background: red;
+ *   color:white;
+ * }
+ * 
+ * + * @example + * + + + + Update input to see transitions when valid/invalid. + Integer is a valid value. +
+ +
+
+ *
+ * + * ## Binding to a getter/setter + * + * Sometimes it's helpful to bind `ngModel` to a getter/setter function. A getter/setter is a + * function that returns a representation of the model when called with zero arguments, and sets + * the internal state of a model when called with an argument. It's sometimes useful to use this + * for models that have an internal representation that's different than what the model exposes + * to the view. + * + *
+ * **Best Practice:** It's best to keep getters fast because Angular is likely to call them more + * frequently than other parts of your code. + *
+ * + * You use this behavior by adding `ng-model-options="{ getterSetter: true }"` to an element that + * has `ng-model` attached to it. You can also add `ng-model-options="{ getterSetter: true }"` to + * a `
`, which will enable this behavior for all ``s within it. See + * {@link ng.directive:ngModelOptions `ngModelOptions`} for more. + * + * The following example shows how to use `ngModel` with a getter/setter: + * + * @example + * + +
+ + Name: + + +
user.name = 
+
+
+ + angular.module('getterSetterExample', []) + .controller('ExampleController', ['$scope', function($scope) { + var _name = 'Brian'; + $scope.user = { + name: function(newName) { + if (angular.isDefined(newName)) { + _name = newName; + } + return _name; + } + }; + }]); + + *
+ */ +var ngModelDirective = ['$rootScope', function($rootScope) { + return { + restrict: 'A', + require: ['ngModel', '^?form', '^?ngModelOptions'], + controller: NgModelController, + // Prelink needs to run before any input directive + // so that we can set the NgModelOptions in NgModelController + // before anyone else uses it. + priority: 1, + compile: function ngModelCompile(element) { + // Setup initial state of the control + element.addClass(PRISTINE_CLASS).addClass(UNTOUCHED_CLASS).addClass(VALID_CLASS); + + return { + pre: function ngModelPreLink(scope, element, attr, ctrls) { + var modelCtrl = ctrls[0], + formCtrl = ctrls[1] || nullFormCtrl; + + modelCtrl.$$setOptions(ctrls[2] && ctrls[2].$options); + + // notify others, especially parent forms + formCtrl.$addControl(modelCtrl); + + attr.$observe('name', function(newValue) { + if (modelCtrl.$name !== newValue) { + formCtrl.$$renameControl(modelCtrl, newValue); + } + }); + + scope.$on('$destroy', function() { + formCtrl.$removeControl(modelCtrl); + }); + }, + post: function ngModelPostLink(scope, element, attr, ctrls) { + var modelCtrl = ctrls[0]; + if (modelCtrl.$options && modelCtrl.$options.updateOn) { + element.on(modelCtrl.$options.updateOn, function(ev) { + modelCtrl.$$debounceViewValueCommit(ev && ev.type); + }); + } + + element.on('blur', function(ev) { + if (modelCtrl.$touched) return; + + if ($rootScope.$$phase) { + scope.$evalAsync(modelCtrl.$setTouched); + } else { + scope.$apply(modelCtrl.$setTouched); + } + }); + } + }; + } + }; +}]; + +var DEFAULT_REGEXP = /(\s+|^)default(\s+|$)/; + +/** + * @ngdoc directive + * @name ngModelOptions + * + * @description + * Allows tuning how model updates are done. Using `ngModelOptions` you can specify a custom list of + * events that will trigger a model update and/or a debouncing delay so that the actual update only + * takes place when a timer expires; this timer will be reset after another change takes place. + * + * Given the nature of `ngModelOptions`, the value displayed inside input fields in the view might + * be different than the value in the actual model. This means that if you update the model you + * should also invoke {@link ngModel.NgModelController `$rollbackViewValue`} on the relevant input field in + * order to make sure it is synchronized with the model and that any debounced action is canceled. + * + * The easiest way to reference the control's {@link ngModel.NgModelController `$rollbackViewValue`} + * method is by making sure the input is placed inside a form that has a `name` attribute. This is + * important because `form` controllers are published to the related scope under the name in their + * `name` attribute. + * + * Any pending changes will take place immediately when an enclosing form is submitted via the + * `submit` event. Note that `ngClick` events will occur before the model is updated. Use `ngSubmit` + * to have access to the updated model. + * + * `ngModelOptions` has an effect on the element it's declared on and its descendants. + * + * @param {Object} ngModelOptions options to apply to the current model. Valid keys are: + * - `updateOn`: string specifying which event should the input be bound to. You can set several + * events using an space delimited list. There is a special event called `default` that + * matches the default events belonging of the control. + * - `debounce`: integer value which contains the debounce model update value in milliseconds. A + * value of 0 triggers an immediate update. If an object is supplied instead, you can specify a + * custom value for each event. For example: + * `ng-model-options="{ updateOn: 'default blur', debounce: {'default': 500, 'blur': 0} }"` + * - `allowInvalid`: boolean value which indicates that the model can be set with values that did + * not validate correctly instead of the default behavior of setting the model to undefined. + * - `getterSetter`: boolean value which determines whether or not to treat functions bound to + `ngModel` as getters/setters. + * - `timezone`: Defines the timezone to be used to read/write the `Date` instance in the model for + * ``, ``, ... . Right now, the only supported value is `'UTC'`, + * otherwise the default timezone of the browser will be used. + * + * @example + + The following example shows how to override immediate updates. Changes on the inputs within the + form will update the model only when the control loses focus (blur event). If `escape` key is + pressed while the input field is focused, the value is reset to the value in the current model. + + + +
+
+ Name: +
+ + Other data: +
+
+
user.name = 
+
+
+ + angular.module('optionsExample', []) + .controller('ExampleController', ['$scope', function($scope) { + $scope.user = { name: 'say', data: '' }; + + $scope.cancel = function(e) { + if (e.keyCode == 27) { + $scope.userForm.userName.$rollbackViewValue(); + } + }; + }]); + + + var model = element(by.binding('user.name')); + var input = element(by.model('user.name')); + var other = element(by.model('user.data')); + + it('should allow custom events', function() { + input.sendKeys(' hello'); + input.click(); + expect(model.getText()).toEqual('say'); + other.click(); + expect(model.getText()).toEqual('say hello'); + }); + + it('should $rollbackViewValue when model changes', function() { + input.sendKeys(' hello'); + expect(input.getAttribute('value')).toEqual('say hello'); + input.sendKeys(protractor.Key.ESCAPE); + expect(input.getAttribute('value')).toEqual('say'); + other.click(); + expect(model.getText()).toEqual('say'); + }); + +
+ + This one shows how to debounce model changes. Model will be updated only 1 sec after last change. + If the `Clear` button is pressed, any debounced action is canceled and the value becomes empty. + + + +
+
+ Name: + +
+
+
user.name = 
+
+
+ + angular.module('optionsExample', []) + .controller('ExampleController', ['$scope', function($scope) { + $scope.user = { name: 'say' }; + }]); + +
+ + This one shows how to bind to getter/setters: + + + +
+
+ Name: + +
+
user.name = 
+
+
+ + angular.module('getterSetterExample', []) + .controller('ExampleController', ['$scope', function($scope) { + var _name = 'Brian'; + $scope.user = { + name: function(newName) { + return angular.isDefined(newName) ? (_name = newName) : _name; + } + }; + }]); + +
+ */ +var ngModelOptionsDirective = function() { + return { + restrict: 'A', + controller: ['$scope', '$attrs', function($scope, $attrs) { + var that = this; + this.$options = $scope.$eval($attrs.ngModelOptions); + // Allow adding/overriding bound events + if (this.$options.updateOn !== undefined) { + this.$options.updateOnDefault = false; + // extract "default" pseudo-event from list of events that can trigger a model update + this.$options.updateOn = trim(this.$options.updateOn.replace(DEFAULT_REGEXP, function() { + that.$options.updateOnDefault = true; + return ' '; + })); + } else { + this.$options.updateOnDefault = true; + } + }] + }; +}; + + + +// helper methods +function addSetValidityMethod(context) { + var ctrl = context.ctrl, + $element = context.$element, + classCache = {}, + set = context.set, + unset = context.unset, + parentForm = context.parentForm, + $animate = context.$animate; + + classCache[INVALID_CLASS] = !(classCache[VALID_CLASS] = $element.hasClass(VALID_CLASS)); + + ctrl.$setValidity = setValidity; + + function setValidity(validationErrorKey, state, controller) { + if (state === undefined) { + createAndSet('$pending', validationErrorKey, controller); + } else { + unsetAndCleanup('$pending', validationErrorKey, controller); + } + if (!isBoolean(state)) { + unset(ctrl.$error, validationErrorKey, controller); + unset(ctrl.$$success, validationErrorKey, controller); + } else { + if (state) { + unset(ctrl.$error, validationErrorKey, controller); + set(ctrl.$$success, validationErrorKey, controller); + } else { + set(ctrl.$error, validationErrorKey, controller); + unset(ctrl.$$success, validationErrorKey, controller); + } + } + if (ctrl.$pending) { + cachedToggleClass(PENDING_CLASS, true); + ctrl.$valid = ctrl.$invalid = undefined; + toggleValidationCss('', null); + } else { + cachedToggleClass(PENDING_CLASS, false); + ctrl.$valid = isObjectEmpty(ctrl.$error); + ctrl.$invalid = !ctrl.$valid; + toggleValidationCss('', ctrl.$valid); + } + + // re-read the state as the set/unset methods could have + // combined state in ctrl.$error[validationError] (used for forms), + // where setting/unsetting only increments/decrements the value, + // and does not replace it. + var combinedState; + if (ctrl.$pending && ctrl.$pending[validationErrorKey]) { + combinedState = undefined; + } else if (ctrl.$error[validationErrorKey]) { + combinedState = false; + } else if (ctrl.$$success[validationErrorKey]) { + combinedState = true; + } else { + combinedState = null; + } + + toggleValidationCss(validationErrorKey, combinedState); + parentForm.$setValidity(validationErrorKey, combinedState, ctrl); + } + + function createAndSet(name, value, controller) { + if (!ctrl[name]) { + ctrl[name] = {}; + } + set(ctrl[name], value, controller); + } + + function unsetAndCleanup(name, value, controller) { + if (ctrl[name]) { + unset(ctrl[name], value, controller); + } + if (isObjectEmpty(ctrl[name])) { + ctrl[name] = undefined; + } + } + + function cachedToggleClass(className, switchValue) { + if (switchValue && !classCache[className]) { + $animate.addClass($element, className); + classCache[className] = true; + } else if (!switchValue && classCache[className]) { + $animate.removeClass($element, className); + classCache[className] = false; + } + } + + function toggleValidationCss(validationErrorKey, isValid) { + validationErrorKey = validationErrorKey ? '-' + snake_case(validationErrorKey, '-') : ''; + + cachedToggleClass(VALID_CLASS + validationErrorKey, isValid === true); + cachedToggleClass(INVALID_CLASS + validationErrorKey, isValid === false); + } +} + +function isObjectEmpty(obj) { + if (obj) { + for (var prop in obj) { + return false; + } + } + return true; +} + /** * @ngdoc directive * @name ngNonBindable @@ -24130,6 +24047,29 @@ var ngPluralizeDirective = ['$locale', '$interpolate', function($locale, $interp * Creating aliases for these properties is possible with {@link ng.directive:ngInit `ngInit`}. * This may be useful when, for instance, nesting ngRepeats. * + * # Iterating over object properties + * + * It is possible to get `ngRepeat` to iterate over the properties of an object using the following + * syntax: + * + * ```js + *
...
+ * ``` + * + * You need to be aware that the JavaScript specification does not define what order + * it will return the keys for an object. In order to have a guaranteed deterministic order + * for the keys, Angular versions up to and including 1.3 **sort the keys alphabetically**. + * + * If this is not desired, the recommended workaround is to convert your object into an array + * that is sorted into the order that you prefer before providing it to `ngRepeat`. You could + * do this with a filter such as [toArrayFilter](http://ngmodules.org/modules/angular-toArrayFilter) + * or implement a `$watch` on the object yourself. + * + * In version 1.4 we will remove the sorting, since it seems that browsers generally follow the + * strategy of providing keys in the order in which they were defined, although there are exceptions + * when keys are deleted and reinstated. + * + * * # Special repeat start and end points * To repeat a series of elements instead of just one parent element, ngRepeat (as well as other ng directives) supports extending * the range of the repeater by defining explicit start and end points by using **ng-repeat-start** and **ng-repeat-end** respectively. @@ -24374,7 +24314,7 @@ var ngRepeatDirective = ['$parse', '$animate', function($parse, $animate) { var keyIdentifier = match[2]; if (aliasAs && (!/^[$a-zA-Z_][$a-zA-Z0-9_]*$/.test(aliasAs) || - /^(null|undefined|this|\$index|\$first|\$middle|\$last|\$even|\$odd|\$parent)$/.test(aliasAs))) { + /^(null|undefined|this|\$index|\$first|\$middle|\$last|\$even|\$odd|\$parent|\$root|\$id)$/.test(aliasAs))) { throw ngRepeatMinErr('badident', "alias '{0}' is invalid --- must be a valid JS identifier which is not a reserved name.", aliasAs); } @@ -24927,12 +24867,12 @@ var ngHideDirective = ['$animate', function($animate) { */ var ngStyleDirective = ngDirective(function(scope, element, attr) { - scope.$watch(attr.ngStyle, function ngStyleWatchAction(newStyles, oldStyles) { + scope.$watchCollection(attr.ngStyle, function ngStyleWatchAction(newStyles, oldStyles) { if (oldStyles && (newStyles !== oldStyles)) { forEach(oldStyles, function(val, style) { element.css(style, '');}); } if (newStyles) element.css(newStyles); - }, true); + }); }); /** @@ -25273,14 +25213,15 @@ var ngOptionsMinErr = minErr('ngOptions'); * * The `ngOptions` attribute can be used to dynamically generate a list of `
* - * ## `select as` + * ## `select` **`as`** * - * Using `select as` will bind the result of the `select as` expression to the model, but + * Using `select` **`as`** will bind the result of the `select` expression to the model, but * the value of the ` + * ``` + * + * ```js + * $scope.values = [{ + * id: 1, + * label: 'aLabel', + * subItem: { name: 'aSubItem' } + * }, { + * id: 2, + * label: 'bLabel', + * subItem: { name: 'bSubItem' } + * }]; + * + * $scope.selected = { name: 'aSubItem' }; + * ``` + * + * With the purpose of preserving the selection, the **`track by`** expression is always applied to the element + * of the data source (to `item` in this example). To calculate whether an element is selected, we do the + * following: + * + * 1. Apply **`track by`** to the elements in the array. In the example: `[1, 2]` + * 2. Apply **`track by`** to the already selected value in `ngModel`. + * In the example: this is not possible as **`track by`** refers to `item.id`, but the selected + * value from `ngModel` is `{name: 'aSubItem'}`, so the **`track by`** expression is applied to + * a wrong object, the selected element can't be found, `', -""],thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};ia.optgroup=ia.option;ia.tbody=ia.tfoot=ia.colgroup=ia.caption=ia.thead;ia.th=ia.td;var Ka=R.prototype={ready:function(b){function a(){c||(c=!0,b())}var c=!1;"complete"===Y.readyState?setTimeout(a):(this.on("DOMContentLoaded",a),R(M).on("load",a))},toString:function(){var b=[];s(this,function(a){b.push(""+ -a)});return"["+b.join(", ")+"]"},eq:function(b){return 0<=b?B(this[b]):B(this[this.length+b])},length:0,push:Pf,sort:[].sort,splice:[].splice},Eb={};s("multiple selected checked disabled readOnly required open".split(" "),function(b){Eb[Q(b)]=b});var Mc={};s("input select option textarea button form details".split(" "),function(b){Mc[b]=!0});var Nc={ngMinlength:"minlength",ngMaxlength:"maxlength",ngMin:"min",ngMax:"max",ngPattern:"pattern"};s({data:Ub,removeData:xb},function(b,a){R[a]=b});s({data:Ub, -inheritedData:Db,scope:function(b){return B.data(b,"$scope")||Db(b.parentNode||b,["$isolateScope","$scope"])},isolateScope:function(b){return B.data(b,"$isolateScope")||B.data(b,"$isolateScopeNoTemplate")},controller:Ic,injector:function(b){return Db(b,"$injector")},removeAttr:function(b,a){b.removeAttribute(a)},hasClass:Ab,css:function(b,a,c){a=bb(a);if(y(c))b.style[a]=c;else return b.style[a]},attr:function(b,a,c){var d=Q(a);if(Eb[d])if(y(c))c?(b[a]=!0,b.setAttribute(a,d)):(b[a]=!1,b.removeAttribute(d)); -else return b[a]||(b.attributes.getNamedItem(a)||C).specified?d:t;else if(y(c))b.setAttribute(a,c);else if(b.getAttribute)return b=b.getAttribute(a,2),null===b?t:b},prop:function(b,a,c){if(y(c))b[a]=c;else return b[a]},text:function(){function b(a,b){if(D(b)){var d=a.nodeType;return d===na||d===pb?a.textContent:""}a.textContent=b}b.$dv="";return b}(),val:function(b,a){if(D(a)){if(b.multiple&&"select"===ua(b)){var c=[];s(b.options,function(a){a.selected&&c.push(a.value||a.text)});return 0===c.length? -null:c}return b.value}b.value=a},html:function(b,a){if(D(a))return b.innerHTML;wb(b,!0);b.innerHTML=a},empty:Jc},function(b,a){R.prototype[a]=function(a,d){var e,f,g=this.length;if(b!==Jc&&(2==b.length&&b!==Ab&&b!==Ic?a:d)===t){if(P(a)){for(e=0;eh?ed(g[0], +g[1],g[2],g[3],g[4],c,d):function(a,b){var e=0,f;do f=ed(g[e++],g[e++],g[e++],g[e++],g[e++],c,d)(a,b),b=t,a=f;while(e=this.promise.$$state.status&&d&&d.length&&b(function(){for(var b,e,f=0,g=d.length;fa)for(b in k++,f)e.hasOwnProperty(b)||(u--,delete f[b])}else f!==e&&(f=e,k++);return k}}c.$stateful=!0;var d=this,e,f,h,l=1s&&(y=4-s,W[y]||(W[y]=[]),W[y].push({msg:G(e.exp)?"fn: "+(e.exp.name||e.exp.toString()):e.exp,newVal:g,oldVal:l}));else if(e===c){v=!1;break a}}catch(A){f(A)}if(!(m=t.$$childHead||t!==this&&t.$$nextSibling))for(;t!==this&&!(m=t.$$nextSibling);)t=t.$parent}while(t=m);if((v||O.length)&&!s--)throw r.$$phase=null,a("infdig",b,W);}while(v||O.length);for(r.$$phase=null;p.length;)try{p.shift()()}catch(ca){f(ca)}},$destroy:function(){if(!this.$$destroyed){var a= +this.$parent;this.$broadcast("$destroy");this.$$destroyed=!0;if(this!==r){for(var b in this.$$listenerCount)m(this,this.$$listenerCount[b],b);a.$$childHead==this&&(a.$$childHead=this.$$nextSibling);a.$$childTail==this&&(a.$$childTail=this.$$prevSibling);this.$$prevSibling&&(this.$$prevSibling.$$nextSibling=this.$$nextSibling);this.$$nextSibling&&(this.$$nextSibling.$$prevSibling=this.$$prevSibling);this.$destroy=this.$digest=this.$apply=this.$evalAsync=this.$applyAsync=H;this.$on=this.$watch=this.$watchGroup= +function(){return H};this.$$listeners={};this.$parent=this.$$nextSibling=this.$$prevSibling=this.$$childHead=this.$$childTail=this.$root=this.$$watchers=null}}},$eval:function(a,b){return g(a)(this,b)},$evalAsync:function(a,b){r.$$phase||O.length||h.defer(function(){O.length&&r.$digest()});O.push({scope:this,expression:a,locals:b})},$$postDigest:function(a){p.push(a)},$apply:function(a){try{return k("$apply"),this.$eval(a)}catch(b){f(b)}finally{r.$$phase=null;try{r.$digest()}catch(c){throw f(c),c; +}}},$applyAsync:function(a){function b(){c.$eval(a)}var c=this;a&&v.push(b);u()},$on:function(a,b){var c=this.$$listeners[a];c||(this.$$listeners[a]=c=[]);c.push(b);var d=this;do d.$$listenerCount[a]||(d.$$listenerCount[a]=0),d.$$listenerCount[a]++;while(d=d.$parent);var e=this;return function(){var d=c.indexOf(b);-1!==d&&(c[d]=null,m(e,1,a))}},$emit:function(a,b){var c=[],d,e=this,g=!1,h={name:a,targetScope:e,stopPropagation:function(){g=!0},preventDefault:function(){h.defaultPrevented=!0},defaultPrevented:!1}, +l=Ya([h],arguments,1),k,m;do{d=e.$$listeners[a]||c;h.currentScope=e;k=0;for(m=d.length;kRa)throw Ca("iequirks");var d=ra(na);d.isEnabled=function(){return b};d.trustAs=c.trustAs;d.getTrusted=c.getTrusted;d.valueOf=c.valueOf;b||(d.trustAs=d.getTrusted=function(a,b){return b},d.valueOf=pa);d.parseAs=function(b,c){var e=a(c);return e.literal&&e.constant?e:a(c,function(a){return d.getTrusted(b,a)})};var e=d.parseAs,f=d.getTrusted,g=d.trustAs;s(na,function(a,b){var c=Q(b);d[cb("parse_as_"+c)]=function(b){return e(a,b)};d[cb("get_trusted_"+c)]=function(b){return f(a,b)};d[cb("trust_as_"+ +c)]=function(b){return g(a,b)}});return d}]}function Ue(){this.$get=["$window","$document",function(b,a){var c={},d=ba((/android (\d+)/.exec(Q((b.navigator||{}).userAgent))||[])[1]),e=/Boxee/i.test((b.navigator||{}).userAgent),f=a[0]||{},g,h=/^(Moz|webkit|ms)(?=[A-Z])/,l=f.body&&f.body.style,k=!1,m=!1;if(l){for(var n in l)if(k=h.exec(n)){g=k[0];g=g.substr(0,1).toUpperCase()+g.substr(1);break}g||(g="WebkitOpacity"in l&&"webkit");k=!!("transition"in l||g+"Transition"in l);m=!!("animation"in l||g+"Animation"in +l);!d||k&&m||(k=F(f.body.style.webkitTransition),m=F(f.body.style.webkitAnimation))}return{history:!(!b.history||!b.history.pushState||4>d||e),hasEvent:function(a){if("input"===a&&11>=Ra)return!1;if(A(c[a])){var b=f.createElement("div");c[a]="on"+a in b}return c[a]},csp:ab(),vendorPrefix:g,transitions:k,animations:m,android:d}}]}function We(){this.$get=["$templateCache","$http","$q",function(b,a,c){function d(e,f){d.totalPendingRequests++;var g=a.defaults&&a.defaults.transformResponse;D(g)?g=g.filter(function(a){return a!== +Yb}):g===Yb&&(g=null);return a.get(e,{cache:b,transformResponse:g}).finally(function(){d.totalPendingRequests--}).then(function(a){return a.data},function(a){if(!f)throw ja("tpload",e);return c.reject(a)})}d.totalPendingRequests=0;return d}]}function Xe(){this.$get=["$rootScope","$browser","$location",function(b,a,c){return{findBindings:function(a,b,c){a=a.getElementsByClassName("ng-binding");var g=[];s(a,function(a){var d=ga.element(a).data("$binding");d&&s(d,function(d){c?(new RegExp("(^|\\s)"+ +gd(b)+"(\\s|\\||$)")).test(d)&&g.push(a):-1!=d.indexOf(b)&&g.push(a)})});return g},findModels:function(a,b,c){for(var g=["ng-","data-ng-","ng\\:"],h=0;hb;b=Math.abs(b);var g=b+"",h="",l=[],k=!1;if(-1!==g.indexOf("e")){var m=g.match(/([\d\.]+)e(-?)(\d+)/);m&& +"-"==m[2]&&m[3]>e+1?b=0:(h=g,k=!0)}if(k)0b&&(h=b.toFixed(e),b=parseFloat(h));else{g=(g.split(od)[1]||"").length;A(e)&&(e=Math.min(Math.max(a.minFrac,g),a.maxFrac));b=+(Math.round(+(b.toString()+"e"+e)).toString()+"e"+-e);var g=(""+b).split(od),k=g[0],g=g[1]||"",n=0,q=a.lgSize,u=a.gSize;if(k.length>=q+u)for(n=k.length-q,m=0;mb&&(d="-",b=-b);for(b=""+b;b.length-c)e+=c;0===e&&-12==c&&(e=12);return Hb(e,a,d)}}function Ib(b,a){return function(c,d){var e=c["get"+b](),f=ub(a?"SHORT"+b:b);return d[f][e]}}function pd(b){var a=(new Date(b,0,1)).getDay();return new Date(b,0,(4>=a?5:12)-a)}function qd(b){return function(a){var c= +pd(a.getFullYear());a=+new Date(a.getFullYear(),a.getMonth(),a.getDate()+(4-a.getDay()))-+c;a=1+Math.round(a/6048E5);return Hb(a,b)}}function kd(b){function a(a){var b;if(b=a.match(c)){a=new Date(0);var f=0,g=0,h=b[8]?a.setUTCFullYear:a.setFullYear,l=b[8]?a.setUTCHours:a.setHours;b[9]&&(f=ba(b[9]+b[10]),g=ba(b[9]+b[11]));h.call(a,ba(b[1]),ba(b[2])-1,ba(b[3]));f=ba(b[4]||0)-f;g=ba(b[5]||0)-g;h=ba(b[6]||0);b=Math.round(1E3*parseFloat("0."+(b[7]||0)));l.call(a,f,g,h,b)}return a}var c=/^(\d{4})-?(\d\d)-?(\d\d)(?:T(\d\d)(?::?(\d\d)(?::?(\d\d)(?:\.(\d+))?)?)?(Z|([+-])(\d\d):?(\d\d))?)?$/; +return function(c,e,f){var g="",h=[],l,k;e=e||"mediumDate";e=b.DATETIME_FORMATS[e]||e;F(c)&&(c=Kf.test(c)?ba(c):a(c));V(c)&&(c=new Date(c));if(!qa(c))return c;for(;e;)(k=Lf.exec(e))?(h=Ya(h,k,1),e=h.pop()):(h.push(e),e=null);f&&"UTC"===f&&(c=new Date(c.getTime()),c.setMinutes(c.getMinutes()+c.getTimezoneOffset()));s(h,function(a){l=Mf[a];g+=l?l(c,b.DATETIME_FORMATS):a.replace(/(^'|'$)/g,"").replace(/''/g,"'")});return g}}function Ff(){return function(b,a){A(a)&&(a=2);return $a(b,a)}}function Gf(){return function(b, +a){V(b)&&(b=b.toString());return D(b)||F(b)?(a=Infinity===Math.abs(Number(a))?Number(a):ba(a))?0b||37<=b&&40>=b||m(a,this,this.value)});if(e.hasEvent("paste"))a.on("paste cut",m)}a.on("change",l);d.$render=function(){a.val(d.$isEmpty(d.$viewValue)?"":d.$viewValue)}}function Lb(b,a){return function(c,d){var e,f;if(qa(c))return c;if(F(c)){'"'==c.charAt(0)&&'"'==c.charAt(c.length-1)&&(c=c.substring(1,c.length-1));if(Nf.test(c))return new Date(c);b.lastIndex= +0;if(e=b.exec(c))return e.shift(),f=d?{yyyy:d.getFullYear(),MM:d.getMonth()+1,dd:d.getDate(),HH:d.getHours(),mm:d.getMinutes(),ss:d.getSeconds(),sss:d.getMilliseconds()/1E3}:{yyyy:1970,MM:1,dd:1,HH:0,mm:0,ss:0,sss:0},s(e,function(b,c){c=s}; +g.$observe("min",function(a){s=q(a);h.$validate()})}if(y(g.max)||g.ngMax){var p;h.$validators.max=function(a){return!n(a)||A(p)||c(a)<=p};g.$observe("max",function(a){p=q(a);h.$validate()})}}}function td(b,a,c,d){(d.$$hasNativeValidators=I(a[0].validity))&&d.$parsers.push(function(b){var c=a.prop("validity")||{};return c.badInput&&!c.typeMismatch?t:b})}function ud(b,a,c,d,e){if(y(d)){b=b(d);if(!b.constant)throw T("ngModel")("constexpr",c,d);return b(a)}return e}function ic(b,a){b="ngClass"+b;return["$animate", +function(c){function d(a,b){var c=[],d=0;a:for(;d(?:<\/\1>|)$/,Rb=/<|&#?\w+;/,ef=/<([\w:]+)/,ff=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,ia={option:[1,'"],thead:[1,"","
"],col:[2,"", +"
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};ia.optgroup=ia.option;ia.tbody=ia.tfoot=ia.colgroup=ia.caption=ia.thead;ia.th=ia.td;var La=R.prototype={ready:function(b){function a(){c||(c=!0,b())}var c=!1;"complete"===Y.readyState?setTimeout(a):(this.on("DOMContentLoaded",a),R(M).on("load",a))},toString:function(){var b=[];s(this,function(a){b.push(""+a)});return"["+b.join(", ")+"]"},eq:function(b){return 0<= +b?B(this[b]):B(this[this.length+b])},length:0,push:Pf,sort:[].sort,splice:[].splice},Eb={};s("multiple selected checked disabled readOnly required open".split(" "),function(b){Eb[Q(b)]=b});var Mc={};s("input select option textarea button form details".split(" "),function(b){Mc[b]=!0});var Nc={ngMinlength:"minlength",ngMaxlength:"maxlength",ngMin:"min",ngMax:"max",ngPattern:"pattern"};s({data:Ub,removeData:xb},function(b,a){R[a]=b});s({data:Ub,inheritedData:Db,scope:function(b){return B.data(b,"$scope")|| +Db(b.parentNode||b,["$isolateScope","$scope"])},isolateScope:function(b){return B.data(b,"$isolateScope")||B.data(b,"$isolateScopeNoTemplate")},controller:Ic,injector:function(b){return Db(b,"$injector")},removeAttr:function(b,a){b.removeAttribute(a)},hasClass:Ab,css:function(b,a,c){a=cb(a);if(y(c))b.style[a]=c;else return b.style[a]},attr:function(b,a,c){var d=Q(a);if(Eb[d])if(y(c))c?(b[a]=!0,b.setAttribute(a,d)):(b[a]=!1,b.removeAttribute(d));else return b[a]||(b.attributes.getNamedItem(a)||H).specified? +d:t;else if(y(c))b.setAttribute(a,c);else if(b.getAttribute)return b=b.getAttribute(a,2),null===b?t:b},prop:function(b,a,c){if(y(c))b[a]=c;else return b[a]},text:function(){function b(a,b){if(A(b)){var d=a.nodeType;return d===oa||d===pb?a.textContent:""}a.textContent=b}b.$dv="";return b}(),val:function(b,a){if(A(a)){if(b.multiple&&"select"===ua(b)){var c=[];s(b.options,function(a){a.selected&&c.push(a.value||a.text)});return 0===c.length?null:c}return b.value}b.value=a},html:function(b,a){if(A(a))return b.innerHTML; +wb(b,!0);b.innerHTML=a},empty:Jc},function(b,a){R.prototype[a]=function(a,d){var e,f,g=this.length;if(b!==Jc&&(2==b.length&&b!==Ab&&b!==Ic?a:d)===t){if(I(a)){for(e=0;e":function(a,c,d,e){return d(a,c)>e(a,c)},"<=":function(a, c,d,e){return d(a,c)<=e(a,c)},">=":function(a,c,d,e){return d(a,c)>=e(a,c)},"&&":function(a,c,d,e){return d(a,c)&&e(a,c)},"||":function(a,c,d,e){return d(a,c)||e(a,c)},"!":function(a,c,d){return!d(a,c)},"=":!0,"|":!0}),Xf={n:"\n",f:"\f",r:"\r",t:"\t",v:"\v","'":"'",'"':'"'},gc=function(a){this.options=a};gc.prototype={constructor:gc,lex:function(a){this.text=a;this.index=0;for(this.tokens=[];this.index=a&&"string"===typeof a},isWhitespace:function(a){return" "===a||"\r"===a||"\t"===a||"\n"===a||"\v"===a||"\u00a0"===a},isIdent:function(a){return"a"<=a&&"z">=a||"A"<=a&&"Z">=a||"_"===a||"$"===a},isExpOperator:function(a){return"-"===a||"+"===a||this.isNumber(a)},throwError:function(a,c,d){d=d||this.index;c=y(c)?"s "+c+"-"+this.index+" ["+this.text.substring(c, d)+"]":" "+d;throw la("lexerr",a,c,this.text);},readNumber:function(){for(var a="",c=this.index;this.indexa){a=this.tokens[a];var g=a.text;if(g===c||g===d||g===e||g===f||!(c||d||e||f))return a}return!1},expect:function(a,c,d,e){return(a=this.peek(a,c,d,e))?(this.tokens.shift(),a):!1},consume:function(a){if(0===this.tokens.length)throw la("ueoe",this.text);var c=this.expect(a);c||this.throwError("is unexpected, expecting ["+a+"]",this.peek());return c},unaryFn:function(a,c){var d=mb[a];return z(function(a,f){return d(a,f,c)},{constant:c.constant,inputs:[c]})},binaryFn:function(a, @@ -193,58 +193,58 @@ c,d,e){var f=mb[c];return z(function(c,e){return f(c,e,a,d)},{constant:a.constan ";","]")&&a.push(this.filterChain()),!this.expect(";"))return 1===a.length?a[0]:function(c,d){for(var e,f=0,g=a.length;f","<=",">=");)a=this.binaryFn(a,c.text,this.additive());return a},additive:function(){for(var a=this.multiplicative(),c;c=this.expect("+","-");)a=this.binaryFn(a,c.text,this.multiplicative());return a},multiplicative:function(){for(var a=this.unary(),c;c=this.expect("*","/","%");)a=this.binaryFn(a,c.text,this.unary());return a},unary:function(){var a;return this.expect("+")?this.primary():(a=this.expect("-"))?this.binaryFn(gb.ZERO, -a.text,this.unary()):(a=this.expect("!"))?this.unaryFn(a.text,this.unary()):this.primary()},fieldAccess:function(a){var c=this.identifier();return z(function(d,e,f){d=f||a(d,e);return null==d?t:c(d)},{assign:function(d,e,f){(f=a(d,f))||a.assign(d,f={});return c.assign(f,e)}})},objectIndex:function(a){var c=this.text,d=this.expression();this.consume("]");return z(function(e,f){var g=a(e,f),h=d(e,f);sa(h,c);return g?ta(g[h],c):t},{assign:function(e,f,g){var h=sa(d(e,g),c);(g=ta(a(e,g),c))||a.assign(e, -g={});return g[h]=f}})},functionCall:function(a,c){var d=[];if(")"!==this.peekToken().text){do d.push(this.expression());while(this.expect(","))}this.consume(")");var e=this.text,f=d.length?[]:null;return function(g,h){var l=c?c(g,h):y(c)?t:g,k=a(g,h,l)||C;if(f)for(var m=d.length;m--;)f[m]=ta(d[m](g,h),e);ta(l,e);if(k){if(k.constructor===k)throw la("isecfn",e);if(k===Uf||k===Vf||k===Wf)throw la("isecff",e);}l=k.apply?k.apply(l,f):k(f[0],f[1],f[2],f[3],f[4]);return ta(l,e)}},arrayDeclaration:function(){var a= +return a},relational:function(){for(var a=this.additive(),c;c=this.expect("<",">","<=",">=");)a=this.binaryFn(a,c.text,this.additive());return a},additive:function(){for(var a=this.multiplicative(),c;c=this.expect("+","-");)a=this.binaryFn(a,c.text,this.multiplicative());return a},multiplicative:function(){for(var a=this.unary(),c;c=this.expect("*","/","%");)a=this.binaryFn(a,c.text,this.unary());return a},unary:function(){var a;return this.expect("+")?this.primary():(a=this.expect("-"))?this.binaryFn(hb.ZERO, +a.text,this.unary()):(a=this.expect("!"))?this.unaryFn(a.text,this.unary()):this.primary()},fieldAccess:function(a){var c=this.identifier();return z(function(d,e,f){d=f||a(d,e);return null==d?t:c(d)},{assign:function(d,e,f){var g=a(d,f);g||a.assign(d,g={},f);return c.assign(g,e)}})},objectIndex:function(a){var c=this.text,d=this.expression();this.consume("]");return z(function(e,f){var g=a(e,f),h=d(e,f);ta(h,c);return g?ma(g[h],c):t},{assign:function(e,f,g){var h=ta(d(e,g),c),l=ma(a(e,g),c);l||a.assign(e, +l={},g);return l[h]=f}})},functionCall:function(a,c){var d=[];if(")"!==this.peekToken().text){do d.push(this.expression());while(this.expect(","))}this.consume(")");var e=this.text,f=d.length?[]:null;return function(g,h){var l=c?c(g,h):y(c)?t:g,k=a(g,h,l)||H;if(f)for(var m=d.length;m--;)f[m]=ma(d[m](g,h),e);ma(l,e);if(k){if(k.constructor===k)throw la("isecfn",e);if(k===Uf||k===Vf||k===Wf)throw la("isecff",e);}l=k.apply?k.apply(l,f):k(f[0],f[1],f[2],f[3],f[4]);return ma(l,e)}},arrayDeclaration:function(){var a= [];if("]"!==this.peekToken().text){do{if(this.peek("]"))break;a.push(this.expression())}while(this.expect(","))}this.consume("]");return z(function(c,d){for(var e=[],f=0,g=a.length;fa.getHours()?c.AMPMS[0]:c.AMPMS[1]},Z:function(a){a=-1*a.getTimezoneOffset();return a=(0<=a?"+":"")+(Hb(Math[0=h};d.$observe("min",function(a){y(a)&&!V(a)&&(a=parseFloat(a,10));h=V(a)&&!isNaN(a)?a:t;e.$validate()})}if(d.max||d.ngMax){var l;e.$validators.max=function(a){return e.$isEmpty(a)|| -D(l)||a<=l};d.$observe("max",function(a){y(a)&&!V(a)&&(a=parseFloat(a,10));l=V(a)&&!isNaN(a)?a:t;e.$validate()})}},url:function(a,c,d,e,f,g){ib(a,c,d,e,f,g);hc(e);e.$$parserName="url";e.$validators.url=function(a,c){var d=a||c;return e.$isEmpty(d)||Yf.test(d)}},email:function(a,c,d,e,f,g){ib(a,c,d,e,f,g);hc(e);e.$$parserName="email";e.$validators.email=function(a,c){var d=a||c;return e.$isEmpty(d)||Zf.test(d)}},radio:function(a,c,d,e){D(d.name)&&c.attr("name",++nb);c.on("click",function(a){c[0].checked&& -e.$setViewValue(d.value,a&&a.type)});e.$render=function(){c[0].checked=d.value==e.$viewValue};d.$observe("value",e.$render)},checkbox:function(a,c,d,e,f,g,h,l){var k=ud(l,a,"ngTrueValue",d.ngTrueValue,!0),m=ud(l,a,"ngFalseValue",d.ngFalseValue,!1);c.on("click",function(a){e.$setViewValue(c[0].checked,a&&a.type)});e.$render=function(){c[0].checked=e.$viewValue};e.$isEmpty=function(a){return!1===a};e.$formatters.push(function(a){return fa(a,k)});e.$parsers.push(function(a){return a?k:m})},hidden:C, -button:C,submit:C,reset:C,file:C},xc=["$browser","$sniffer","$filter","$parse",function(a,c,d,e){return{restrict:"E",require:["?ngModel"],link:{pre:function(f,g,h,l){l[0]&&(Dd[Q(h.type)]||Dd.text)(f,g,h,l[0],c,a,d,e)}}}}],kb="ng-valid",vd="ng-invalid",Ra="ng-pristine",Kb="ng-dirty",xd="ng-pending",bg=["$scope","$exceptionHandler","$attrs","$element","$parse","$animate","$timeout","$rootScope","$q","$interpolate",function(a,c,d,e,f,g,h,l,k,m){this.$modelValue=this.$viewValue=Number.NaN;this.$$rawModelValue= -t;this.$validators={};this.$asyncValidators={};this.$parsers=[];this.$formatters=[];this.$viewChangeListeners=[];this.$untouched=!0;this.$touched=!1;this.$pristine=!0;this.$dirty=!1;this.$valid=!0;this.$invalid=!1;this.$error={};this.$$success={};this.$pending=t;this.$name=m(d.name||"",!1)(a);var n=f(d.ngModel),q=n.assign,u=n,r=q,O=null,p=this;this.$$setOptions=function(a){if((p.$options=a)&&a.getterSetter){var c=f(d.ngModel+"()"),g=f(d.ngModel+"($$$p)");u=function(a){var d=n(a);G(d)&&(d=c(a));return d}; -r=function(a,c){G(n(a))?g(a,{$$$p:p.$modelValue}):q(a,p.$modelValue)}}else if(!n.assign)throw Mb("nonassign",d.ngModel,va(e));};this.$render=C;this.$isEmpty=function(a){return D(a)||""===a||null===a||a!==a};var v=e.inheritedData("$formController")||Jb,w=0;sd({ctrl:this,$element:e,set:function(a,c){a[c]=!0},unset:function(a,c){delete a[c]},parentForm:v,$animate:g});this.$setPristine=function(){p.$dirty=!1;p.$pristine=!0;g.removeClass(e,Kb);g.addClass(e,Ra)};this.$setDirty=function(){p.$dirty=!0;p.$pristine= -!1;g.removeClass(e,Ra);g.addClass(e,Kb);v.$setDirty()};this.$setUntouched=function(){p.$touched=!1;p.$untouched=!0;g.setClass(e,"ng-untouched","ng-touched")};this.$setTouched=function(){p.$touched=!0;p.$untouched=!1;g.setClass(e,"ng-touched","ng-untouched")};this.$rollbackViewValue=function(){h.cancel(O);p.$viewValue=p.$$lastCommittedViewValue;p.$render()};this.$validate=function(){if(!V(p.$modelValue)||!isNaN(p.$modelValue)){var a=p.$$rawModelValue,c=p.$valid,d=p.$modelValue,e=p.$options&&p.$options.allowInvalid; -p.$$runValidators(p.$error[p.$$parserName||"parse"]?!1:t,a,p.$$lastCommittedViewValue,function(f){e||c===f||(p.$modelValue=f?a:t,p.$modelValue!==d&&p.$$writeModelToScope())})}};this.$$runValidators=function(a,c,d,e){function f(){var a=!0;s(p.$validators,function(e,f){var g=e(c,d);a=a&&g;h(f,g)});return a?!0:(s(p.$asyncValidators,function(a,c){h(c,null)}),!1)}function g(){var a=[],e=!0;s(p.$asyncValidators,function(f,g){var k=f(c,d);if(!k||!G(k.then))throw Mb("$asyncValidators",k);h(g,t);a.push(k.then(function(){h(g, -!0)},function(a){e=!1;h(g,!1)}))});a.length?k.all(a).then(function(){l(e)},C):l(!0)}function h(a,c){m===w&&p.$setValidity(a,c)}function l(a){m===w&&e(a)}w++;var m=w;(function(a){var c=p.$$parserName||"parse";if(a===t)h(c,null);else if(h(c,a),!a)return s(p.$validators,function(a,c){h(c,null)}),s(p.$asyncValidators,function(a,c){h(c,null)}),!1;return!0})(a)?f()?g():l(!1):l(!1)};this.$commitViewValue=function(){var a=p.$viewValue;h.cancel(O);if(p.$$lastCommittedViewValue!==a||""===a&&p.$$hasNativeValidators)p.$$lastCommittedViewValue= -a,p.$pristine&&this.$setDirty(),this.$$parseAndValidate()};this.$$parseAndValidate=function(){var c=p.$$lastCommittedViewValue,d=D(c)?t:!0;if(d)for(var e=0;ef||e.$isEmpty(a)||c.length<=f}}}}},Ac=function(){return{restrict:"A",require:"?ngModel",link:function(a,c,d,e){if(e){var f=0;d.$observe("minlength", -function(a){f=ba(a)||0;e.$validate()});e.$validators.minlength=function(a,c){return e.$isEmpty(c)||c.length>=f}}}}},we=function(){return{restrict:"A",priority:100,require:"ngModel",link:function(a,c,d,e){var f=c.attr(d.$attr.ngList)||", ",g="false"!==d.ngTrim,h=g?U(f):f;e.$parsers.push(function(a){if(!D(a)){var c=[];a&&s(a.split(h),function(a){a&&c.push(g?U(a):a)});return c}});e.$formatters.push(function(a){return x(a)?a.join(f):t});e.$isEmpty=function(a){return!a||!a.length}}}},cg=/^(true|false|\d+)$/, -ye=function(){return{restrict:"A",priority:100,compile:function(a,c){return cg.test(c.ngValue)?function(a,c,f){f.$set("value",a.$eval(f.ngValue))}:function(a,c,f){a.$watch(f.ngValue,function(a){f.$set("value",a)})}}}},ze=function(){return{restrict:"A",controller:["$scope","$attrs",function(a,c){var d=this;this.$options=a.$eval(c.ngModelOptions);this.$options.updateOn!==t?(this.$options.updateOnDefault=!1,this.$options.updateOn=U(this.$options.updateOn.replace(ag,function(){d.$options.updateOnDefault= -!0;return" "}))):this.$options.updateOnDefault=!0}]}},Zd=["$compile",function(a){return{restrict:"AC",compile:function(c){a.$$addBindingClass(c);return function(c,e,f){a.$$addBindingInfo(e,f.ngBind);e=e[0];c.$watch(f.ngBind,function(a){e.textContent=a===t?"":a})}}}}],ae=["$interpolate","$compile",function(a,c){return{compile:function(d){c.$$addBindingClass(d);return function(d,f,g){d=a(f.attr(g.$attr.ngBindTemplate));c.$$addBindingInfo(f,d.expressions);f=f[0];g.$observe("ngBindTemplate",function(a){f.textContent= -a===t?"":a})}}}}],$d=["$sce","$parse","$compile",function(a,c,d){return{restrict:"A",compile:function(e,f){var g=c(f.ngBindHtml),h=c(f.ngBindHtml,function(a){return(a||"").toString()});d.$$addBindingClass(e);return function(c,e,f){d.$$addBindingInfo(e,f.ngBindHtml);c.$watch(h,function(){e.html(a.getTrustedHtml(g(c))||"")})}}}}],be=ic("",!0),de=ic("Odd",0),ce=ic("Even",1),ee=Ia({compile:function(a,c){c.$set("ngCloak",t);a.removeClass("ng-cloak")}}),fe=[function(){return{restrict:"A",scope:!0,controller:"@", -priority:500}}],Cc={},dg={blur:!0,focus:!0};s("click dblclick mousedown mouseup mouseover mouseout mousemove mouseenter mouseleave keydown keyup keypress submit focus blur copy cut paste".split(" "),function(a){var c=ya("ng-"+a);Cc[c]=["$parse","$rootScope",function(d,e){return{restrict:"A",compile:function(f,g){var h=d(g[c],null,!0);return function(c,d){d.on(a,function(d){var f=function(){h(c,{$event:d})};dg[a]&&e.$$phase?c.$evalAsync(f):c.$apply(f)})}}}}]});var ie=["$animate",function(a){return{multiElement:!0, -transclude:"element",priority:600,terminal:!0,restrict:"A",$$tlb:!0,link:function(c,d,e,f,g){var h,l,k;c.$watch(e.ngIf,function(c){c?l||g(function(c,f){l=f;c[c.length++]=Y.createComment(" end ngIf: "+e.ngIf+" ");h={clone:c};a.enter(c,d.parent(),d)}):(k&&(k.remove(),k=null),l&&(l.$destroy(),l=null),h&&(k=tb(h.clone),a.leave(k).then(function(){k=null}),h=null))})}}}],je=["$templateRequest","$anchorScroll","$animate","$sce",function(a,c,d,e){return{restrict:"ECA",priority:400,terminal:!0,transclude:"element", -controller:ga.noop,compile:function(f,g){var h=g.ngInclude||g.src,l=g.onload||"",k=g.autoscroll;return function(f,g,q,s,r){var t=0,p,v,w,L=function(){v&&(v.remove(),v=null);p&&(p.$destroy(),p=null);w&&(d.leave(w).then(function(){v=null}),v=w,w=null)};f.$watch(e.parseAsResourceUrl(h),function(e){var h=function(){!y(k)||k&&!f.$eval(k)||c()},q=++t;e?(a(e,!0).then(function(a){if(q===t){var c=f.$new();s.template=a;a=r(c,function(a){L();d.enter(a,null,g).then(h)});p=c;w=a;p.$emit("$includeContentLoaded", -e);f.$eval(l)}},function(){q===t&&(L(),f.$emit("$includeContentError",e))}),f.$emit("$includeContentRequested",e)):(L(),s.template=null)})}}}}],Ae=["$compile",function(a){return{restrict:"ECA",priority:-400,require:"ngInclude",link:function(c,d,e,f){/SVG/.test(d[0].toString())?(d.empty(),a(Fc(f.template,Y).childNodes)(c,function(a){d.append(a)},{futureParentElement:d})):(d.html(f.template),a(d.contents())(c))}}}],ke=Ia({priority:450,compile:function(){return{pre:function(a,c,d){a.$eval(d.ngInit)}}}}), -le=Ia({terminal:!0,priority:1E3}),me=["$locale","$interpolate",function(a,c){var d=/{}/g,e=/^when(Minus)?(.+)$/;return{restrict:"EA",link:function(f,g,h){function l(a){g.text(a||"")}var k=h.count,m=h.$attr.when&&g.attr(h.$attr.when),n=h.offset||0,q=f.$eval(m)||{},u={},m=c.startSymbol(),r=c.endSymbol(),t=m+k+"-"+n+r,p=ga.noop,v;s(h,function(a,c){var d=e.exec(c);d&&(d=(d[1]?"-":"")+Q(d[2]),q[d]=g.attr(h.$attr[c]))});s(q,function(a,e){u[e]=c(a.replace(d,t))});f.$watch(k,function(c){c=parseFloat(c);var d= -isNaN(c);d||c in q||(c=a.pluralCat(c-n));c===v||d&&isNaN(v)||(p(),p=f.$watch(u[c],l),v=c)})}}}],ne=["$parse","$animate",function(a,c){var d=T("ngRepeat"),e=function(a,c,d,e,k,m,n){a[d]=e;k&&(a[k]=m);a.$index=c;a.$first=0===c;a.$last=c===n-1;a.$middle=!(a.$first||a.$last);a.$odd=!(a.$even=0===(c&1))};return{restrict:"A",multiElement:!0,transclude:"element",priority:1E3,terminal:!0,$$tlb:!0,compile:function(f,g){var h=g.ngRepeat,l=Y.createComment(" end ngRepeat: "+h+" "),k=h.match(/^\s*([\s\S]+?)\s+in\s+([\s\S]+?)(?:\s+as\s+([\s\S]+?))?(?:\s+track\s+by\s+([\s\S]+?))?\s*$/); -if(!k)throw d("iexp",h);var m=k[1],n=k[2],q=k[3],u=k[4],k=m.match(/^(?:(\s*[\$\w]+)|\(\s*([\$\w]+)\s*,\s*([\$\w]+)\s*\))$/);if(!k)throw d("iidexp",m);var r=k[3]||k[1],y=k[2];if(q&&(!/^[$a-zA-Z_][$a-zA-Z0-9_]*$/.test(q)||/^(null|undefined|this|\$index|\$first|\$middle|\$last|\$even|\$odd|\$parent)$/.test(q)))throw d("badident",q);var p,v,w,D,z={$id:Ma};u?p=a(u):(w=function(a,c){return Ma(c)},D=function(a){return a});return function(a,f,g,k,m){p&&(v=function(c,d,e){y&&(z[y]=c);z[r]=d;z.$index=e;return p(a, -z)});var u=ha();a.$watchCollection(n,function(g){var k,p,n=f[0],E,z=ha(),C,S,N,G,J,x,H;q&&(a[q]=g);if(Sa(g))J=g,p=v||w;else{p=v||D;J=[];for(H in g)g.hasOwnProperty(H)&&"$"!=H.charAt(0)&&J.push(H);J.sort()}C=J.length;H=Array(C);for(k=0;kF;)d=r.pop(),m(N,d.label,!1),d.element.remove()}for(;R.length>x;){l=R.pop(); -for(F=1;Fa&&q.removeOption(c)})}var n;if(!(n=r.match(d)))throw eg("iexp",r,va(f));var C=c(n[2]||n[1]),A=n[4]||n[6],D=/ as /.test(n[0])&&n[1],B=D?c(D):null,H=n[5],J=c(n[3]||""),F=c(n[2]?n[1]:A),P=c(n[7]),M=n[8]?c(n[8]):null,Q={},R=[[{element:f,label:""}]],T={};z&&(a(z)(e),z.removeClass("ng-scope"),z.remove());f.empty();f.on("change",function(){e.$apply(function(){var a=P(e)||[],c;if(u)c=[],s(f.val(),function(d){d= -M?Q[d]:d;c.push("?"===d?t:""===d?null:h(B?B:F,d,a[d]))});else{var d=M?Q[f.val()]:f.val();c="?"===d?t:""===d?null:h(B?B:F,d,a[d])}g.$setViewValue(c);p()})});g.$render=p;e.$watchCollection(P,l);e.$watchCollection(function(){var a=P(e),c;if(a&&x(a)){c=Array(a.length);for(var d=0,f=a.length;d@charset "UTF-8";[ng\\:cloak],[ng-cloak],[data-ng-cloak],[x-ng-cloak],.ng-cloak,.x-ng-cloak,.ng-hide:not(.ng-hide-animate){display:none !important;}ng\\:form{display:block;}'); +(f.$set(h,c),Ra&&g&&e.prop(g,f[h])):"href"===a&&f.$set(h,null)})}}}});var Jb={$addControl:H,$$renameControl:function(a,c){a.$name=c},$removeControl:H,$setValidity:H,$setDirty:H,$setPristine:H,$setSubmitted:H};rd.$inject=["$element","$attrs","$scope","$animate","$interpolate"];var yd=function(a){return["$timeout",function(c){return{name:"form",restrict:a?"EAC":"E",controller:rd,compile:function(a){a.addClass(Sa).addClass(kb);return{pre:function(a,d,g,h){if(!("action"in g)){var l=function(c){a.$apply(function(){h.$commitViewValue(); +h.$setSubmitted()});c.preventDefault()};d[0].addEventListener("submit",l,!1);d.on("$destroy",function(){c(function(){d[0].removeEventListener("submit",l,!1)},0,!1)})}var k=h.$$parentForm,m=h.$name;m&&(gb(a,null,m,h,m),g.$observe(g.name?"name":"ngForm",function(c){m!==c&&(gb(a,null,m,t,m),m=c,gb(a,null,m,h,m),k.$$renameControl(h,m))}));d.on("$destroy",function(){k.$removeControl(h);m&&gb(a,null,m,t,m);z(h,Jb)})}}}}}]},Ud=yd(),ge=yd(!0),Nf=/\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d\.\d+([+-][0-2]\d:[0-5]\d|Z)/, +Yf=/^(ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?$/,Zf=/^[a-z0-9!#$%&'*+\/=?^_`{|}~.-]+@[a-z0-9]([a-z0-9-]*[a-z0-9])?(\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$/i,$f=/^\s*(\-|\+)?(\d+|(\d*(\.\d*)))\s*$/,zd=/^(\d{4})-(\d{2})-(\d{2})$/,Ad=/^(\d{4})-(\d\d)-(\d\d)T(\d\d):(\d\d)(?::(\d\d)(\.\d{1,3})?)?$/,jc=/^(\d{4})-W(\d\d)$/,Bd=/^(\d{4})-(\d\d)$/,Cd=/^(\d\d):(\d\d)(?::(\d\d)(\.\d{1,3})?)?$/,Dd={text:function(a,c,d,e,f,g){ib(a,c,d,e,f,g);hc(e)},date:jb("date",zd,Lb(zd,["yyyy", +"MM","dd"]),"yyyy-MM-dd"),"datetime-local":jb("datetimelocal",Ad,Lb(Ad,"yyyy MM dd HH mm ss sss".split(" ")),"yyyy-MM-ddTHH:mm:ss.sss"),time:jb("time",Cd,Lb(Cd,["HH","mm","ss","sss"]),"HH:mm:ss.sss"),week:jb("week",jc,function(a,c){if(qa(a))return a;if(F(a)){jc.lastIndex=0;var d=jc.exec(a);if(d){var e=+d[1],f=+d[2],g=d=0,h=0,l=0,k=pd(e),f=7*(f-1);c&&(d=c.getHours(),g=c.getMinutes(),h=c.getSeconds(),l=c.getMilliseconds());return new Date(e,0,k.getDate()+f,d,g,h,l)}}return NaN},"yyyy-Www"),month:jb("month", +Bd,Lb(Bd,["yyyy","MM"]),"yyyy-MM"),number:function(a,c,d,e,f,g){td(a,c,d,e);ib(a,c,d,e,f,g);e.$$parserName="number";e.$parsers.push(function(a){return e.$isEmpty(a)?null:$f.test(a)?parseFloat(a):t});e.$formatters.push(function(a){if(!e.$isEmpty(a)){if(!V(a))throw Mb("numfmt",a);a=a.toString()}return a});if(d.min||d.ngMin){var h;e.$validators.min=function(a){return e.$isEmpty(a)||A(h)||a>=h};d.$observe("min",function(a){y(a)&&!V(a)&&(a=parseFloat(a,10));h=V(a)&&!isNaN(a)?a:t;e.$validate()})}if(d.max|| +d.ngMax){var l;e.$validators.max=function(a){return e.$isEmpty(a)||A(l)||a<=l};d.$observe("max",function(a){y(a)&&!V(a)&&(a=parseFloat(a,10));l=V(a)&&!isNaN(a)?a:t;e.$validate()})}},url:function(a,c,d,e,f,g){ib(a,c,d,e,f,g);hc(e);e.$$parserName="url";e.$validators.url=function(a,c){var d=a||c;return e.$isEmpty(d)||Yf.test(d)}},email:function(a,c,d,e,f,g){ib(a,c,d,e,f,g);hc(e);e.$$parserName="email";e.$validators.email=function(a,c){var d=a||c;return e.$isEmpty(d)||Zf.test(d)}},radio:function(a,c, +d,e){A(d.name)&&c.attr("name",++nb);c.on("click",function(a){c[0].checked&&e.$setViewValue(d.value,a&&a.type)});e.$render=function(){c[0].checked=d.value==e.$viewValue};d.$observe("value",e.$render)},checkbox:function(a,c,d,e,f,g,h,l){var k=ud(l,a,"ngTrueValue",d.ngTrueValue,!0),m=ud(l,a,"ngFalseValue",d.ngFalseValue,!1);c.on("click",function(a){e.$setViewValue(c[0].checked,a&&a.type)});e.$render=function(){c[0].checked=e.$viewValue};e.$isEmpty=function(a){return!1===a};e.$formatters.push(function(a){return fa(a, +k)});e.$parsers.push(function(a){return a?k:m})},hidden:H,button:H,submit:H,reset:H,file:H},xc=["$browser","$sniffer","$filter","$parse",function(a,c,d,e){return{restrict:"E",require:["?ngModel"],link:{pre:function(f,g,h,l){l[0]&&(Dd[Q(h.type)]||Dd.text)(f,g,h,l[0],c,a,d,e)}}}}],ag=/^(true|false|\d+)$/,ye=function(){return{restrict:"A",priority:100,compile:function(a,c){return ag.test(c.ngValue)?function(a,c,f){f.$set("value",a.$eval(f.ngValue))}:function(a,c,f){a.$watch(f.ngValue,function(a){f.$set("value", +a)})}}}},Zd=["$compile",function(a){return{restrict:"AC",compile:function(c){a.$$addBindingClass(c);return function(c,e,f){a.$$addBindingInfo(e,f.ngBind);e=e[0];c.$watch(f.ngBind,function(a){e.textContent=a===t?"":a})}}}}],ae=["$interpolate","$compile",function(a,c){return{compile:function(d){c.$$addBindingClass(d);return function(d,f,g){d=a(f.attr(g.$attr.ngBindTemplate));c.$$addBindingInfo(f,d.expressions);f=f[0];g.$observe("ngBindTemplate",function(a){f.textContent=a===t?"":a})}}}}],$d=["$sce", +"$parse","$compile",function(a,c,d){return{restrict:"A",compile:function(e,f){var g=c(f.ngBindHtml),h=c(f.ngBindHtml,function(a){return(a||"").toString()});d.$$addBindingClass(e);return function(c,e,f){d.$$addBindingInfo(e,f.ngBindHtml);c.$watch(h,function(){e.html(a.getTrustedHtml(g(c))||"")})}}}}],xe=da({restrict:"A",require:"ngModel",link:function(a,c,d,e){e.$viewChangeListeners.push(function(){a.$eval(d.ngChange)})}}),be=ic("",!0),de=ic("Odd",0),ce=ic("Even",1),ee=Ja({compile:function(a,c){c.$set("ngCloak", +t);a.removeClass("ng-cloak")}}),fe=[function(){return{restrict:"A",scope:!0,controller:"@",priority:500}}],Cc={},bg={blur:!0,focus:!0};s("click dblclick mousedown mouseup mouseover mouseout mousemove mouseenter mouseleave keydown keyup keypress submit focus blur copy cut paste".split(" "),function(a){var c=ya("ng-"+a);Cc[c]=["$parse","$rootScope",function(d,e){return{restrict:"A",compile:function(f,g){var h=d(g[c],null,!0);return function(c,d){d.on(a,function(d){var f=function(){h(c,{$event:d})}; +bg[a]&&e.$$phase?c.$evalAsync(f):c.$apply(f)})}}}}]});var ie=["$animate",function(a){return{multiElement:!0,transclude:"element",priority:600,terminal:!0,restrict:"A",$$tlb:!0,link:function(c,d,e,f,g){var h,l,k;c.$watch(e.ngIf,function(c){c?l||g(function(c,f){l=f;c[c.length++]=Y.createComment(" end ngIf: "+e.ngIf+" ");h={clone:c};a.enter(c,d.parent(),d)}):(k&&(k.remove(),k=null),l&&(l.$destroy(),l=null),h&&(k=tb(h.clone),a.leave(k).then(function(){k=null}),h=null))})}}}],je=["$templateRequest","$anchorScroll", +"$animate","$sce",function(a,c,d,e){return{restrict:"ECA",priority:400,terminal:!0,transclude:"element",controller:ga.noop,compile:function(f,g){var h=g.ngInclude||g.src,l=g.onload||"",k=g.autoscroll;return function(f,g,q,s,r){var t=0,p,v,w,L=function(){v&&(v.remove(),v=null);p&&(p.$destroy(),p=null);w&&(d.leave(w).then(function(){v=null}),v=w,w=null)};f.$watch(e.parseAsResourceUrl(h),function(e){var h=function(){!y(k)||k&&!f.$eval(k)||c()},q=++t;e?(a(e,!0).then(function(a){if(q===t){var c=f.$new(); +s.template=a;a=r(c,function(a){L();d.enter(a,null,g).then(h)});p=c;w=a;p.$emit("$includeContentLoaded",e);f.$eval(l)}},function(){q===t&&(L(),f.$emit("$includeContentError",e))}),f.$emit("$includeContentRequested",e)):(L(),s.template=null)})}}}}],Ae=["$compile",function(a){return{restrict:"ECA",priority:-400,require:"ngInclude",link:function(c,d,e,f){/SVG/.test(d[0].toString())?(d.empty(),a(Fc(f.template,Y).childNodes)(c,function(a){d.append(a)},{futureParentElement:d})):(d.html(f.template),a(d.contents())(c))}}}], +ke=Ja({priority:450,compile:function(){return{pre:function(a,c,d){a.$eval(d.ngInit)}}}}),we=function(){return{restrict:"A",priority:100,require:"ngModel",link:function(a,c,d,e){var f=c.attr(d.$attr.ngList)||", ",g="false"!==d.ngTrim,h=g?U(f):f;e.$parsers.push(function(a){if(!A(a)){var c=[];a&&s(a.split(h),function(a){a&&c.push(g?U(a):a)});return c}});e.$formatters.push(function(a){return D(a)?a.join(f):t});e.$isEmpty=function(a){return!a||!a.length}}}},kb="ng-valid",vd="ng-invalid",Sa="ng-pristine", +Kb="ng-dirty",xd="ng-pending",Mb=new T("ngModel"),cg=["$scope","$exceptionHandler","$attrs","$element","$parse","$animate","$timeout","$rootScope","$q","$interpolate",function(a,c,d,e,f,g,h,l,k,m){this.$modelValue=this.$viewValue=Number.NaN;this.$$rawModelValue=t;this.$validators={};this.$asyncValidators={};this.$parsers=[];this.$formatters=[];this.$viewChangeListeners=[];this.$untouched=!0;this.$touched=!1;this.$pristine=!0;this.$dirty=!1;this.$valid=!0;this.$invalid=!1;this.$error={};this.$$success= +{};this.$pending=t;this.$name=m(d.name||"",!1)(a);var n=f(d.ngModel),q=n.assign,u=n,r=q,O=null,p=this;this.$$setOptions=function(a){if((p.$options=a)&&a.getterSetter){var c=f(d.ngModel+"()"),g=f(d.ngModel+"($$$p)");u=function(a){var d=n(a);G(d)&&(d=c(a));return d};r=function(a,c){G(n(a))?g(a,{$$$p:p.$modelValue}):q(a,p.$modelValue)}}else if(!n.assign)throw Mb("nonassign",d.ngModel,va(e));};this.$render=H;this.$isEmpty=function(a){return A(a)||""===a||null===a||a!==a};var v=e.inheritedData("$formController")|| +Jb,w=0;sd({ctrl:this,$element:e,set:function(a,c){a[c]=!0},unset:function(a,c){delete a[c]},parentForm:v,$animate:g});this.$setPristine=function(){p.$dirty=!1;p.$pristine=!0;g.removeClass(e,Kb);g.addClass(e,Sa)};this.$setDirty=function(){p.$dirty=!0;p.$pristine=!1;g.removeClass(e,Sa);g.addClass(e,Kb);v.$setDirty()};this.$setUntouched=function(){p.$touched=!1;p.$untouched=!0;g.setClass(e,"ng-untouched","ng-touched")};this.$setTouched=function(){p.$touched=!0;p.$untouched=!1;g.setClass(e,"ng-touched", +"ng-untouched")};this.$rollbackViewValue=function(){h.cancel(O);p.$viewValue=p.$$lastCommittedViewValue;p.$render()};this.$validate=function(){if(!V(p.$modelValue)||!isNaN(p.$modelValue)){var a=p.$$rawModelValue,c=p.$valid,d=p.$modelValue,e=p.$options&&p.$options.allowInvalid;p.$$runValidators(p.$error[p.$$parserName||"parse"]?!1:t,a,p.$$lastCommittedViewValue,function(f){e||c===f||(p.$modelValue=f?a:t,p.$modelValue!==d&&p.$$writeModelToScope())})}};this.$$runValidators=function(a,c,d,e){function f(){var a= +!0;s(p.$validators,function(e,f){var g=e(c,d);a=a&&g;h(f,g)});return a?!0:(s(p.$asyncValidators,function(a,c){h(c,null)}),!1)}function g(){var a=[],e=!0;s(p.$asyncValidators,function(f,g){var l=f(c,d);if(!l||!G(l.then))throw Mb("$asyncValidators",l);h(g,t);a.push(l.then(function(){h(g,!0)},function(a){e=!1;h(g,!1)}))});a.length?k.all(a).then(function(){l(e)},H):l(!0)}function h(a,c){m===w&&p.$setValidity(a,c)}function l(a){m===w&&e(a)}w++;var m=w;(function(a){var c=p.$$parserName||"parse";if(a=== +t)h(c,null);else if(h(c,a),!a)return s(p.$validators,function(a,c){h(c,null)}),s(p.$asyncValidators,function(a,c){h(c,null)}),!1;return!0})(a)?f()?g():l(!1):l(!1)};this.$commitViewValue=function(){var a=p.$viewValue;h.cancel(O);if(p.$$lastCommittedViewValue!==a||""===a&&p.$$hasNativeValidators)p.$$lastCommittedViewValue=a,p.$pristine&&this.$setDirty(),this.$$parseAndValidate()};this.$$parseAndValidate=function(){var c=p.$$lastCommittedViewValue,d=A(c)?t:!0;if(d)for(var e=0;eF;)d=r.pop(),m(N,d.label,!1),d.element.remove()}for(;R.length> +x;){l=R.pop();for(F=1;Fa&&q.removeOption(c)})}var n;if(!(n=r.match(d)))throw eg("iexp",r,va(f));var C=c(n[2]||n[1]),x=n[4]||n[6],A=/ as /.test(n[0])&&n[1],B=A?c(A):null,G=n[5],I=c(n[3]||""),F=c(n[2]?n[1]:x),P=c(n[7]),M=n[8]?c(n[8]):null,Q={},R=[[{element:f,label:""}]],T={};z&&(a(z)(e),z.removeClass("ng-scope"),z.remove());f.empty();f.on("change",function(){e.$apply(function(){var a=P(e)||[],c;if(u)c=[],s(f.val(), +function(d){d=M?Q[d]:d;c.push("?"===d?t:""===d?null:h(B?B:F,d,a[d]))});else{var d=M?Q[f.val()]:f.val();c="?"===d?t:""===d?null:h(B?B:F,d,a[d])}g.$setViewValue(c);p()})});g.$render=p;e.$watchCollection(P,l);e.$watchCollection(function(){var a=P(e),c;if(a&&D(a)){c=Array(a.length);for(var d=0,f=a.length;df||e.$isEmpty(a)||c.length<=f}}}}},Ac=function(){return{restrict:"A",require:"?ngModel",link:function(a,c,d,e){if(e){var f=0;d.$observe("minlength",function(a){f=ba(a)||0;e.$validate()});e.$validators.minlength=function(a,c){return e.$isEmpty(c)||c.length>=f}}}}};M.angular.bootstrap?console.log("WARNING: Tried to load angular more than once."):(Nd(),Pd(ga),B(Y).ready(function(){Jd(Y,sc)}))})(window,document);!window.angular.$$csp()&&window.angular.element(document).find("head").prepend(''); //# sourceMappingURL=angular.min.js.map diff --git a/public/vendor/angular/angular.min.js.gzip b/public/vendor/angular/angular.min.js.gzip index c8f2039a7fa8d68aa015757d3d4eadd2c7b448f3..ed85c2eff4d38d59bf16767f50d4a4a35c775c0f 100644 GIT binary patch literal 45960 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","<=",">=","&&","||","!","ESCAPE","lex","tokens","readString","peek","readNumber","isIdent","readIdent","is","isWhitespace","ch2","ch3","op2","op3","op1","operator","throwError","chars","isExpOperator","start","end","colStr","peekCh","quote","rawString","hex","String","fromCharCode","rep","ZERO","statements","primary","expect","filterChain","consume","arrayDeclaration","functionCall","objectIndex","fieldAccess","peekToken","e1","e2","e3","e4","peekAhead","t","unaryFn","right","$parseUnaryFn","binaryFn","left","isBranching","$parseBinaryFn","$parseConstant","$parseStatements","inputFn","argsFn","$parseFilter","every","assignment","ternary","$parseAssignment","logicalOR","middle","$parseTernary","logicalAND","equality","relational","additive","multiplicative","unary","$parseFieldAccess","indexFn","$parseObjectIndex","fnGetter","contextGetter","expressionText","$parseFunctionCall","elementFns","$parseArrayLiteral","valueFns","$parseObjectLiteral","yy","y","MMMM","MMM","M","H","hh","EEEE","EEE","ampmGetter","Z","timeZoneGetter","zone","paddedZone","ww","w","xlinkHref","propName","normalized","ngBooleanAttrWatchAction","htmlAttr","ngAttrAliasWatchAction","nullFormRenameControl","formDirectiveFactory","isNgForm","ngFormCompile","formElement","ngFormPreLink","handleFormSubmission","parentFormCtrl","alias","URL_REGEXP","EMAIL_REGEXP","NUMBER_REGEXP","DATE_REGEXP","DATETIMELOCAL_REGEXP","WEEK_REGEXP","MONTH_REGEXP","TIME_REGEXP","DEFAULT_REGEXP","inputType","textInputType","weekParser","isoWeek","existingDate","week","minutes","hours","seconds","milliseconds","addDays","numberInputType","urlInputType","ctrl.$validators.url","modelValue","viewValue","emailInputType","email","ctrl.$validators.email","radioInputType","checked","checkboxInputType","trueValue","ngTrueValue","falseValue","ngFalseValue","ctrl.$isEmpty","ctrls","NgModelController","$modelValue","$$rawModelValue","$asyncValidators","$viewChangeListeners","$untouched","$touched","parsedNgModel","parsedNgModelAssign","ngModelGet","ngModelSet","pendingDebounce","$$setOptions","this.$$setOptions","getterSetter","invokeModelGetter","invokeModelSetter","$$$p","this.$isEmpty","currentValidationRunId","this.$setPristine","this.$setDirty","this.$setUntouched","UNTOUCHED_CLASS","TOUCHED_CLASS","$setTouched","this.$setTouched","this.$rollbackViewValue","$$lastCommittedViewValue","this.$validate","prevValid","prevModelValue","allowInvalid","$$runValidators","parserValid","allValid","$$writeModelToScope","this.$$runValidators","parseValid","doneCallback","processSyncValidators","syncValidatorsValid","validator","processAsyncValidators","validatorPromises","validationDone","localValidationRunId","processParseErrors","errorKey","this.$commitViewValue","$$parseAndValidate","this.$$parseAndValidate","this.$$writeModelToScope","this.$setViewValue","updateOnDefault","$$debounceViewValueCommit","this.$$debounceViewValueCommit","debounceDelay","debounce","ngModelWatch","formatters","ngModelCompile","ngModelPreLink","modelCtrl","formCtrl","ngModelPostLink","updateOn","ctrl.$validators.required","patternExp","ctrl.$validators.pattern","intVal","ctrl.$validators.maxlength","ctrl.$validators.minlength","trimValues","CONSTANT_VALUE_REGEXP","tplAttr","ngValueConstantLink","ngValueLink","valueWatchAction","that","$compile","ngBindCompile","templateElement","ngBindLink","ngBindWatchAction","ngBindTemplateCompile","ngBindTemplateLink","ngBindHtmlCompile","tElement","ngBindHtmlGetter","ngBindHtmlWatch","getStringValue","ngBindHtmlLink","ngBindHtmlWatchAction","getTrustedHtml","forceAsyncEvents","ngEventHandler","$event","previousElements","ngIfWatchAction","newScope","srcExp","onloadExp","autoScrollExp","autoscroll","changeCounter","previousElement","currentElement","cleanupLastIncludeContent","parseAsResourceUrl","ngIncludeWatchAction","afterAnimation","thisChangeId","namespaceAdaptedClone","BRACE","IS_WHEN","updateElementText","newText","numberExp","whenExp","whens","whensExpFns","braceReplacement","watchRemover","lastCount","attributeName","tmpMatch","whenKey","ngPluralizeWatchAction","countIsNaN","ngRepeatMinErr","updateScope","valueIdentifier","keyIdentifier","arrayLength","$first","$last","$middle","$odd","$even","ngRepeatCompile","ngRepeatEndComment","lhs","rhs","aliasAs","trackByExp","trackByExpGetter","trackByIdExpFn","trackByIdArrayFn","trackByIdObjFn","hashFnLocals","ngRepeatLink","lastBlockMap","ngRepeatAction","previousNode","nextNode","nextBlockMap","collectionLength","trackById","collectionKeys","nextBlockOrder","trackByIdFn","itemKey","blockKey","ngRepeatTransclude","ngShowWatchAction","NG_HIDE_CLASS","tempClasses","NG_HIDE_IN_PROGRESS_CLASS","ngHideWatchAction","ngStyleWatchAction","newStyles","oldStyles","ngSwitchController","cases","selectedTranscludes","selectedElements","previousLeaveAnimations","selectedScopes","spliceFactory","ngSwitchWatchAction","selectedTransclude","caseElement","selectedScope","anchor","ngOptionsMinErr","NG_OPTIONS_REGEXP","nullModelCtrl","optionsMap","ngModelCtrl","unknownOption","databound","init","self.init","ngModelCtrl_","nullOption_","unknownOption_","addOption","self.addOption","removeOption","self.removeOption","hasOption","renderUnknownOption","self.renderUnknownOption","unknownVal","self.hasOption","setupAsSingle","selectElement","selectCtrl","ngModelCtrl.$render","emptyOption","setupAsMultiple","lastView","selectMultipleWatch","setupAsOptions","callExpression","exprFn","valueName","keyName","createIsSelectedFn","selectedSet","trackFn","trackIndex","isSelected","compareValueFn","selectAsFn","scheduleRendering","renderScheduled","render","updateLabelMap","labelMap","label","added","optionGroups","optionGroupNames","optionGroupName","optionGroup","existingParent","existingOptions","existingOption","valuesFn","anySelected","optionId","trackKeysCache","groupByFn","displayFn","nullOption","groupIndex","groupLength","optionGroupsCache","optGroupTemplate","lastElement","optionTemplate","optionsExp","selectAs","track","selectionChanged","selectedKey","viewValueFn","getLabels","toDisplay","ngModelCtrl.$isEmpty","nullSelectCtrl","selectCtrlName","interpolateWatchAction","$$csp"] +"names":["window","document","undefined","minErr","isArrayLike","obj","isWindow","length","nodeType","NODE_TYPE_ELEMENT","isString","isArray","forEach","iterator","context","key","isFunction","hasOwnProperty","call","isPrimitive","forEachSorted","keys","Object","sort","i","reverseParams","iteratorFn","value","nextUid","uid","setHashKey","h","$$hashKey","extend","dst","ii","arguments","j","jj","int","str","parseInt","noop","identity","$","valueFn","isUndefined","isDefined","isObject","isNumber","isDate","toString","isRegExp","isScope","$evalAsync","$watch","isBoolean","isElement","node","nodeName","prop","attr","find","makeMap","items","split","nodeName_","element","lowercase","arrayRemove","array","index","indexOf","splice","copy","source","destination","stackSource","stackDest","ngMinErr","push","result","Date","getTime","RegExp","match","lastIndex","emptyObject","create","getPrototypeOf","shallowCopy","src","charAt","equals","o1","o2","t1","t2","keySet","concat","array1","array2","slice","bind","self","fn","curryArgs","startIndex","apply","toJsonReplacer","val","toJson","pretty","JSON","stringify","fromJson","json","parse","startingTag","jqLite","clone","empty","e","elemHtml","append","html","NODE_TYPE_TEXT","replace","tryDecodeURIComponent","decodeURIComponent","parseKeyValue","keyValue","key_value","toKeyValue","parts","arrayValue","encodeUriQuery","join","encodeUriSegment","pctEncodeSpaces","encodeURIComponent","getNgAttribute","ngAttr","ngAttrPrefixes","angularInit","bootstrap","appElement","module","config","prefix","name","hasAttribute","getAttribute","candidate","querySelector","strictDi","modules","defaultConfig","doBootstrap","injector","tag","unshift","$provide","debugInfoEnabled","$compileProvider","createInjector","invoke","bootstrapApply","scope","compile","$apply","data","NG_ENABLE_DEBUG_INFO","NG_DEFER_BOOTSTRAP","test","angular","resumeBootstrap","angular.resumeBootstrap","extraModules","reloadWithDebugInfo","location","reload","getTestability","rootElement","get","snake_case","separator","SNAKE_CASE_REGEXP","letter","pos","toLowerCase","bindJQuery","originalCleanData","bindJQueryFired","jQuery","on","JQLitePrototype","isolateScope","controller","inheritedData","cleanData","jQuery.cleanData","elems","events","skipDestroyOnNextJQueryCleanData","elem","_data","$destroy","triggerHandler","JQLite","assertArg","arg","reason","assertArgFn","acceptArrayAnnotation","constructor","assertNotHasOwnProperty","getter","path","bindFnToScope","lastInstance","len","getBlockNodes","nodes","endNode","blockNodes","nextSibling","createMap","setupModuleLoader","ensure","factory","$injectorMinErr","$$minErr","requires","configFn","invokeLater","provider","method","insertMethod","queue","invokeQueue","moduleInstance","configBlocks","runBlocks","_invokeQueue","_configBlocks","_runBlocks","service","constant","animation","filter","directive","run","block","publishExternalAPI","version","uppercase","counter","csp","angularModule","$LocaleProvider","ngModule","$$sanitizeUri","$$SanitizeUriProvider","$CompileProvider","a","htmlAnchorDirective","input","inputDirective","textarea","form","formDirective","script","scriptDirective","select","selectDirective","style","styleDirective","option","optionDirective","ngBind","ngBindDirective","ngBindHtml","ngBindHtmlDirective","ngBindTemplate","ngBindTemplateDirective","ngClass","ngClassDirective","ngClassEven","ngClassEvenDirective","ngClassOdd","ngClassOddDirective","ngCloak","ngCloakDirective","ngController","ngControllerDirective","ngForm","ngFormDirective","ngHide","ngHideDirective","ngIf","ngIfDirective","ngInclude","ngIncludeDirective","ngInit","ngInitDirective","ngNonBindable","ngNonBindableDirective","ngPluralize","ngPluralizeDirective","ngRepeat","ngRepeatDirective","ngShow","ngShowDirective","ngStyle","ngStyleDirective","ngSwitch","ngSwitchDirective","ngSwitchWhen","ngSwitchWhenDirective","ngSwitchDefault","ngSwitchDefaultDirective","ngOptions","ngOptionsDirective","ngTransclude","ngTranscludeDirective","ngModel","ngModelDirective","ngList","ngListDirective","ngChange","ngChangeDirective","pattern","patternDirective","ngPattern","required","requiredDirective","ngRequired","minlength","minlengthDirective","ngMinlength","maxlength","maxlengthDirective","ngMaxlength","ngValue","ngValueDirective","ngModelOptions","ngModelOptionsDirective","ngIncludeFillContentDirective","ngAttributeAliasDirectives","ngEventDirectives","$anchorScroll","$AnchorScrollProvider","$animate","$AnimateProvider","$browser","$BrowserProvider","$cacheFactory","$CacheFactoryProvider","$controller","$ControllerProvider","$document","$DocumentProvider","$exceptionHandler","$ExceptionHandlerProvider","$filter","$FilterProvider","$interpolate","$InterpolateProvider","$interval","$IntervalProvider","$http","$HttpProvider","$httpBackend","$HttpBackendProvider","$location","$LocationProvider","$log","$LogProvider","$parse","$ParseProvider","$rootScope","$RootScopeProvider","$q","$QProvider","$$q","$$QProvider","$sce","$SceProvider","$sceDelegate","$SceDelegateProvider","$sniffer","$SnifferProvider","$templateCache","$TemplateCacheProvider","$templateRequest","$TemplateRequestProvider","$$testability","$$TestabilityProvider","$timeout","$TimeoutProvider","$window","$WindowProvider","$$rAF","$$RAFProvider","$$asyncCallback","$$AsyncCallbackProvider","$$jqLite","$$jqLiteProvider","camelCase","SPECIAL_CHARS_REGEXP","_","offset","toUpperCase","MOZ_HACK_REGEXP","jqLiteAcceptsData","NODE_TYPE_DOCUMENT","jqLiteBuildFragment","tmp","fragment","createDocumentFragment","HTML_REGEXP","appendChild","createElement","TAG_NAME_REGEXP","exec","wrap","wrapMap","_default","innerHTML","XHTML_TAG_REGEXP","lastChild","childNodes","firstChild","textContent","createTextNode","argIsString","trim","jqLiteMinErr","parsed","SINGLE_TAG_REGEXP","jqLiteAddNodes","jqLiteClone","cloneNode","jqLiteDealoc","onlyDescendants","jqLiteRemoveData","querySelectorAll","descendants","l","jqLiteOff","type","unsupported","expandoStore","jqLiteExpandoStore","handle","listenerFns","removeEventListener","expandoId","ng339","jqCache","createIfNecessary","jqId","jqLiteData","isSimpleSetter","isSimpleGetter","massGetter","jqLiteHasClass","selector","jqLiteRemoveClass","cssClasses","setAttribute","cssClass","jqLiteAddClass","existingClasses","root","elements","jqLiteController","jqLiteInheritedData","documentElement","names","parentNode","NODE_TYPE_DOCUMENT_FRAGMENT","host","jqLiteEmpty","removeChild","jqLiteRemove","keepData","parent","jqLiteDocumentLoaded","action","win","readyState","setTimeout","getBooleanAttrName","booleanAttr","BOOLEAN_ATTR","BOOLEAN_ELEMENTS","getAliasedAttrName","ALIASED_ATTR","createEventHandler","eventHandler","event","isDefaultPrevented","event.isDefaultPrevented","defaultPrevented","eventFns","eventFnsLength","immediatePropagationStopped","originalStopImmediatePropagation","stopImmediatePropagation","event.stopImmediatePropagation","stopPropagation","isImmediatePropagationStopped","event.isImmediatePropagationStopped","$get","this.$get","hasClass","classes","addClass","removeClass","hashKey","nextUidFn","objType","HashMap","isolatedUid","this.nextUid","put","anonFn","args","fnText","STRIP_COMMENTS","FN_ARGS","annotate","$inject","argDecl","FN_ARG_SPLIT","FN_ARG","all","underscore","last","modulesToLoad","supportObject","delegate","provider_","providerInjector","instantiate","providerCache","providerSuffix","enforceReturnValue","enforcedReturnValue","instanceInjector","factoryFn","enforce","loadModules","moduleFn","runInvokeQueue","invokeArgs","loadedModules","message","stack","createInternalInjector","cache","getService","serviceName","caller","INSTANTIATING","err","shift","locals","Type","instance","prototype","returnedValue","has","$injector","instanceCache","decorator","decorFn","origProvider","orig$get","origProvider.$get","origInstance","$delegate","autoScrollingEnabled","disableAutoScrolling","this.disableAutoScrolling","getFirstAnchor","list","Array","some","scrollTo","scrollIntoView","scroll","yOffset","getComputedStyle","position","getBoundingClientRect","bottom","elemTop","top","scrollBy","hash","elm","getElementById","getElementsByName","autoScrollWatch","autoScrollWatchAction","newVal","oldVal","supported","Browser","completeOutstandingRequest","outstandingRequestCount","outstandingRequestCallbacks","pop","error","startPoller","interval","check","pollFns","pollFn","pollTimeout","cacheStateAndFireUrlChange","cacheState","fireUrlChange","cachedState","history","state","lastCachedState","lastBrowserUrl","url","lastHistoryState","urlChangeListeners","listener","safeDecodeURIComponent","rawDocument","clearTimeout","pendingDeferIds","isMock","$$completeOutstandingRequest","$$incOutstandingRequestCount","self.$$incOutstandingRequestCount","notifyWhenNoOutstandingRequests","self.notifyWhenNoOutstandingRequests","callback","addPollFn","self.addPollFn","href","baseElement","reloadLocation","self.url","sameState","sameBase","stripHash","substr","self.state","urlChangeInit","onUrlChange","self.onUrlChange","$$checkUrlChange","baseHref","self.baseHref","lastCookies","lastCookieString","cookiePath","cookies","self.cookies","cookieLength","cookie","warn","cookieArray","substring","defer","self.defer","delay","timeoutId","cancel","self.defer.cancel","deferId","cacheFactory","cacheId","options","refresh","entry","freshEnd","staleEnd","n","link","p","nextEntry","prevEntry","caches","size","stats","id","capacity","Number","MAX_VALUE","lruHash","lruEntry","remove","removeAll","destroy","info","cacheFactory.info","cacheFactory.get","$$sanitizeUriProvider","parseIsolateBindings","directiveName","LOCAL_REGEXP","bindings","definition","scopeName","$compileMinErr","mode","collection","optional","attrName","hasDirectives","COMMENT_DIRECTIVE_REGEXP","CLASS_DIRECTIVE_REGEXP","ALL_OR_NOTHING_ATTRS","REQUIRE_PREFIX_REGEXP","EVENT_HANDLER_ATTR_REGEXP","this.directive","registerDirective","directiveFactory","Suffix","directives","priority","require","restrict","$$isolateBindings","aHrefSanitizationWhitelist","this.aHrefSanitizationWhitelist","regexp","imgSrcSanitizationWhitelist","this.imgSrcSanitizationWhitelist","this.debugInfoEnabled","enabled","safeAddClass","$element","className","$compileNodes","transcludeFn","maxPriority","ignoreDirective","previousCompileContext","nodeValue","compositeLinkFn","compileNodes","$$addScopeClass","namespace","publicLinkFn","cloneConnectFn","parentBoundTranscludeFn","transcludeControllers","futureParentElement","$$boundTransclude","$linkNode","wrapTemplate","controllerName","$$addScopeInfo","nodeList","$rootElement","childLinkFn","childScope","childBoundTranscludeFn","stableNodeList","nodeLinkFnFound","linkFns","idx","nodeLinkFn","$new","transcludeOnThisElement","createBoundTranscludeFn","transclude","elementTranscludeOnThisElement","templateOnThisElement","attrs","linkFnFound","Attributes","collectDirectives","applyDirectivesToNode","$$element","terminal","previousBoundTranscludeFn","elementTransclusion","boundTranscludeFn","transcludedScope","cloneFn","controllers","containingScope","$$transcluded","attrsMap","$attr","addDirective","directiveNormalize","isNgAttr","nAttrs","attributes","attrStartName","attrEndName","ngAttrName","NG_ATTR_BINDING","PREFIX_REGEXP","directiveNName","directiveIsMultiElement","nName","addAttrInterpolateDirective","animVal","addTextInterpolateDirective","NODE_TYPE_COMMENT","byPriority","groupScan","attrStart","attrEnd","depth","groupElementsLinkFnWrapper","linkFn","compileNode","templateAttrs","jqCollection","originalReplaceDirective","preLinkFns","postLinkFns","addLinkFns","pre","post","newIsolateScopeDirective","$$isolateScope","cloneAndAnnotateFn","getControllers","elementControllers","retrievalMethod","$searchElement","linkNode","controllersBoundTransclude","cloneAttachFn","hasElementTranscludeDirective","scopeToChild","controllerDirectives","$scope","$attrs","$transclude","controllerInstance","controllerAs","templateDirective","$$originalDirective","isolateScopeController","isolateBindingContext","identifier","bindToController","lastValue","parentGet","parentSet","compare","$observe","$$observers","$$scope","literal","b","assign","parentValueWatch","parentValue","$stateful","unwatch","$watchCollection","$on","invokeLinkFn","template","templateUrl","terminalPriority","newScopeDirective","nonTlbTranscludeDirective","hasTranscludeDirective","hasTemplate","$compileNode","$template","childTranscludeFn","$$start","$$end","directiveValue","assertNoDuplicate","$$tlb","createComment","replaceWith","replaceDirective","contents","denormalizeTemplate","removeComments","templateNamespace","newTemplateAttrs","templateDirectives","unprocessedDirectives","markDirectivesAsIsolate","mergeTemplateAttributes","compileTemplateUrl","Math","max","extra","tDirectives","startAttrName","endAttrName","multiElement","srcAttr","dstAttr","$set","tAttrs","linkQueue","afterTemplateNodeLinkFn","afterTemplateChildLinkFn","beforeTemplateCompileNode","origAsyncDirective","derivedSyncDirective","getTrustedResourceUrl","then","content","tempTemplateAttrs","beforeTemplateLinkNode","linkRootElement","$$destroyed","oldClasses","delayedNodeLinkFn","ignoreChildLinkFn","diff","what","previousDirective","text","interpolateFn","textInterpolateCompileFn","templateNode","templateNodeParent","hasCompileParent","$$addBindingClass","textInterpolateLinkFn","$$addBindingInfo","expressions","interpolateFnWatchAction","wrapper","getTrustedContext","attrNormalizedName","HTML","RESOURCE_URL","allOrNothing","trustedContext","attrInterpolatePreLinkFn","newValue","$$inter","oldValue","$updateClass","elementsToRemove","newNode","firstElementToRemove","removeCount","j2","replaceChild","expando","k","kk","annotation","attributesToCopy","$normalize","$addClass","classVal","$removeClass","newClasses","toAdd","tokenDifference","toRemove","writeAttr","booleanKey","aliasedKey","observer","trimmedSrcset","srcPattern","rawUris","nbrUrisWith2parts","floor","innerIdx","lastTuple","removeAttr","listeners","startSymbol","endSymbol","binding","isolated","noTemplate","dataName","str1","str2","values","tokens1","tokens2","token","jqNodes","globals","CNTRL_REG","register","this.register","allowGlobals","this.allowGlobals","addIdentifier","expression","later","ident","controllerPrototype","exception","cause","defaultHttpResponseTransform","headers","tempData","JSON_PROTECTION_PREFIX","contentType","jsonStart","JSON_START","JSON_ENDS","parseHeaders","line","headersGetter","headersObj","transformData","status","fns","defaults","transformResponse","transformRequest","d","common","CONTENT_TYPE_APPLICATION_JSON","patch","xsrfCookieName","xsrfHeaderName","useApplyAsync","this.useApplyAsync","interceptorFactories","interceptors","requestConfig","response","resp","reject","executeHeaderFns","headerContent","processedHeaders","headerFn","header","mergeHeaders","defHeaders","reqHeaders","defHeaderName","reqHeaderName","lowercaseDefHeaderName","chain","serverRequest","reqData","withCredentials","sendReq","promise","when","reversedInterceptors","interceptor","request","requestError","responseError","thenFn","rejectFn","success","promise.success","promise.error","done","headersString","statusText","resolveHttpPromise","resolvePromise","$applyAsync","$$phase","deferred","resolve","resolvePromiseWithResult","removePendingReq","pendingRequests","cachedResp","buildUrl","params","defaultCache","xsrfValue","urlIsSameOrigin","timeout","responseType","v","toISOString","interceptorFactory","createShortMethods","createShortMethodsWithData","createXhr","XMLHttpRequest","createHttpBackend","callbacks","$browserDefer","jsonpReq","callbackId","async","body","called","addEventListener","timeoutRequest","jsonpDone","xhr","abort","completeRequest","open","setRequestHeader","onload","xhr.onload","responseText","urlResolve","protocol","getAllResponseHeaders","onerror","onabort","send","this.startSymbol","this.endSymbol","escape","ch","mustHaveExpression","unescapeText","escapedStartRegexp","escapedEndRegexp","parseStringifyInterceptor","getTrusted","valueOf","newErr","$interpolateMinErr","endIndex","parseFns","textLength","expressionPositions","startSymbolLength","exp","endSymbolLength","compute","interpolationFn","$$watchDelegate","objectEquality","$watchGroup","interpolateFnWatcher","oldValues","currValue","$interpolate.startSymbol","$interpolate.endSymbol","count","invokeApply","setInterval","clearInterval","iteration","skipApply","$$intervalId","tick","notify","intervals","interval.cancel","NUMBER_FORMATS","DECIMAL_SEP","GROUP_SEP","PATTERNS","minInt","minFrac","maxFrac","posPre","posSuf","negPre","negSuf","gSize","lgSize","CURRENCY_SYM","DATETIME_FORMATS","MONTH","SHORTMONTH","DAY","SHORTDAY","AMPMS","medium","fullDate","longDate","mediumDate","shortDate","mediumTime","shortTime","pluralCat","num","encodePath","segments","parseAbsoluteUrl","absoluteUrl","locationObj","parsedUrl","$$protocol","$$host","hostname","$$port","port","DEFAULT_PORTS","parseAppUrl","relativeUrl","prefixed","$$path","pathname","$$search","search","$$hash","beginsWith","begin","whole","trimEmptyHash","stripFile","lastIndexOf","LocationHtml5Url","appBase","basePrefix","$$html5","appBaseNoFile","$$parse","this.$$parse","pathUrl","$locationMinErr","$$compose","this.$$compose","$$url","$$absUrl","$$parseLinkUrl","this.$$parseLinkUrl","relHref","appUrl","prevAppUrl","rewrittenUrl","LocationHashbangUrl","hashPrefix","withoutBaseUrl","withoutHashUrl","windowsFilePathExp","firstPathSegmentMatch","LocationHashbangInHtml5Url","locationGetter","property","locationGetterSetter","preprocess","html5Mode","requireBase","rewriteLinks","this.hashPrefix","this.html5Mode","setBrowserUrlWithFallback","oldUrl","oldState","$$state","afterLocationChange","$broadcast","absUrl","LocationMode","initialUrl","IGNORE_URI_REGEXP","ctrlKey","metaKey","which","target","absHref","preventDefault","initializing","newUrl","newState","$digest","$locationWatch","currentReplace","$$replace","urlOrStateChanged","debug","debugEnabled","this.debugEnabled","flag","formatError","Error","sourceURL","consoleLog","console","logFn","log","hasApply","arg1","arg2","ensureSafeMemberName","fullExpression","$parseMinErr","ensureSafeObject","children","isConstant","setter","setValue","fullExp","propertyObj","isPossiblyDangerousMemberName","cspSafeGetterFn","key0","key1","key2","key3","key4","expensiveChecks","eso","o","eso0","eso1","eso2","eso3","eso4","cspSafeGetter","pathVal","getterFnWithEnsureSafeObject","s","getterFn","getterFnCache","getterFnCacheExpensive","getterFnCacheDefault","pathKeys","pathKeysLength","code","needsEnsureSafeObject","lookupJs","evaledFnGetter","Function","sharedGetter","fn.assign","getValueOf","objectValueOf","cacheDefault","cacheExpensive","wrapSharedExpression","wrapped","collectExpressionInputs","inputs","expressionInputDirtyCheck","oldValueOfValue","inputsWatchDelegate","parsedExpression","inputExpressions","$$inputs","lastResult","oldInputValue","expressionInputWatch","newInputValue","oldInputValueOfValues","expressionInputsWatch","changed","oneTimeWatchDelegate","oneTimeWatch","oneTimeListener","old","$$postDigest","oneTimeLiteralWatchDelegate","isAllDefined","allDefined","constantWatchDelegate","constantWatch","constantListener","addInterceptor","interceptorFn","watchDelegate","regularInterceptedExpression","oneTimeInterceptedExpression","$parseOptions","$parseOptionsExpensive","oneTime","cacheKey","parseOptions","lexer","Lexer","parser","Parser","qFactory","nextTick","exceptionHandler","callOnce","resolveFn","Promise","simpleBind","scheduleProcessQueue","processScheduled","pending","Deferred","$qMinErr","TypeError","onFulfilled","onRejected","progressBack","catch","finally","handleCallback","$$reject","$$resolve","progress","makePromise","resolved","isResolved","callbackOutput","errback","$Q","Q","resolver","promises","results","requestAnimationFrame","webkitRequestAnimationFrame","cancelAnimationFrame","webkitCancelAnimationFrame","webkitCancelRequestAnimationFrame","rafSupported","raf","timer","TTL","$rootScopeMinErr","lastDirtyWatch","applyAsyncId","digestTtl","this.digestTtl","Scope","$id","$parent","$$watchers","$$nextSibling","$$prevSibling","$$childHead","$$childTail","$root","$$listeners","$$listenerCount","beginPhase","phase","decrementListenerCount","current","initWatchVal","flushApplyAsync","applyAsyncQueue","scheduleApplyAsync","isolate","destroyChild","child","$$ChildScope","this.$$ChildScope","watchExp","watcher","eq","deregisterWatch","watchExpressions","watchGroupAction","changeReactionScheduled","firstRun","newValues","deregisterFns","shouldCall","deregisterWatchGroup","expr","unwatchFn","watchGroupSubAction","$watchCollectionInterceptor","_value","bothNaN","newItem","oldItem","internalArray","oldLength","changeDetected","newLength","internalObject","veryOldValue","trackVeryOldValue","changeDetector","initRun","$watchCollectionAction","watch","watchers","dirty","ttl","watchLog","logIdx","asyncTask","asyncQueue","$eval","isNaN","msg","next","postDigestQueue","eventName","this.$watchGroup","$applyAsyncExpression","namedListeners","indexOfListener","$emit","targetScope","listenerArgs","currentScope","$$asyncQueue","$$postDigestQueue","$$applyAsyncQueue","sanitizeUri","uri","isImage","regex","normalizedVal","adjustMatcher","matcher","$sceMinErr","escapeForRegexp","adjustMatchers","matchers","adjustedMatchers","SCE_CONTEXTS","resourceUrlWhitelist","resourceUrlBlacklist","this.resourceUrlWhitelist","this.resourceUrlBlacklist","matchUrl","generateHolderType","Base","holderType","trustedValue","$$unwrapTrustedValue","this.$$unwrapTrustedValue","holderType.prototype.valueOf","holderType.prototype.toString","htmlSanitizer","trustedValueHolderBase","byType","CSS","URL","JS","trustAs","Constructor","maybeTrusted","allowed","this.enabled","msie","sce","isEnabled","sce.isEnabled","sce.getTrusted","parseAs","sce.parseAs","enumValue","lName","eventSupport","android","userAgent","navigator","boxee","vendorPrefix","vendorRegex","bodyStyle","transitions","animations","webkitTransition","webkitAnimation","pushState","hasEvent","divElm","handleRequestFn","tpl","ignoreRequestError","totalPendingRequests","transformer","httpOptions","handleError","testability","testability.findBindings","opt_exactMatch","getElementsByClassName","matches","dataBinding","bindingName","testability.findModels","prefixes","attributeEquals","testability.getLocation","testability.setLocation","testability.whenStable","deferreds","$$timeoutId","timeout.cancel","urlParsingNode","requestUrl","originUrl","filters","suffix","currencyFilter","dateFilter","filterFilter","jsonFilter","limitToFilter","lowercaseFilter","numberFilter","orderByFilter","uppercaseFilter","comparator","matchAgainstAnyProp","predicateFn","createPredicateFn","shouldMatchPrimitives","actual","expected","item","deepCompare","dontMatchWholeObject","actualType","expectedType","expectedVal","matchAnyProperty","actualVal","$locale","formats","amount","currencySymbol","fractionSize","formatNumber","number","groupSep","decimalSep","isFinite","isNegative","abs","numStr","formatedText","hasExponent","toFixed","parseFloat","fractionLen","min","round","fraction","lgroup","group","padNumber","digits","neg","dateGetter","date","dateStrGetter","shortForm","getFirstThursdayOfYear","year","dayOfWeekOnFirst","getDay","weekGetter","firstThurs","getFullYear","thisThurs","getMonth","getDate","jsonStringToDate","string","R_ISO8601_STR","tzHour","tzMin","dateSetter","setUTCFullYear","setFullYear","timeSetter","setUTCHours","setHours","m","ms","format","timezone","NUMBER_STRING","DATE_FORMATS_SPLIT","setMinutes","getMinutes","getTimezoneOffset","DATE_FORMATS","object","spacing","limit","Infinity","sortPredicate","reverseOrder","reverseComparator","comp","descending","objectToString","v1","v2","map","predicate","ngDirective","FormController","controls","parentForm","$$parentForm","nullFormCtrl","$error","$$success","$pending","$name","$dirty","$pristine","$valid","$invalid","$submitted","$addControl","$rollbackViewValue","form.$rollbackViewValue","control","$commitViewValue","form.$commitViewValue","form.$addControl","$$renameControl","form.$$renameControl","newName","oldName","$removeControl","form.$removeControl","$setValidity","addSetValidityMethod","ctrl","set","unset","$setDirty","form.$setDirty","PRISTINE_CLASS","DIRTY_CLASS","$setPristine","form.$setPristine","setClass","SUBMITTED_CLASS","$setUntouched","form.$setUntouched","$setSubmitted","form.$setSubmitted","stringBasedInputType","$formatters","$isEmpty","baseInputType","composing","ev","ngTrim","$viewValue","$$hasNativeValidators","$setViewValue","deferListener","origValue","keyCode","$render","ctrl.$render","createDateParser","mapping","iso","ISO_DATE_REGEXP","yyyy","MM","dd","HH","getHours","mm","ss","getSeconds","sss","getMilliseconds","part","NaN","createDateInputType","parseDate","dynamicDateInputType","isValidDate","parseObservedDateValue","badInputChecker","$options","previousDate","$$parserName","$parsers","parsedDate","$ngModelMinErr","timezoneOffset","ngMin","minVal","$validators","ctrl.$validators.min","$validate","ngMax","maxVal","ctrl.$validators.max","validity","VALIDITY_STATE_PROPERTY","badInput","typeMismatch","parseConstantExpr","fallback","parseFn","classDirective","arrayDifference","arrayClasses","digestClassCounts","classCounts","classesToUpdate","ngClassWatchAction","$index","old$index","mod","cachedToggleClass","switchValue","classCache","toggleValidationCss","validationErrorKey","isValid","VALID_CLASS","INVALID_CLASS","setValidity","isObjectEmpty","PENDING_CLASS","combinedState","REGEX_STRING_REGEXP","documentMode","isActive_","active","full","major","minor","dot","codeName","JQLite._data","MOUSE_EVENT_MAP","mouseleave","mouseenter","optgroup","tbody","tfoot","colgroup","caption","thead","th","td","ready","trigger","fired","removeData","removeAttribute","css","lowercasedName","specified","getNamedItem","ret","getText","$dv","multiple","selected","nodeCount","jqLiteOn","types","related","relatedTarget","contains","off","one","onFn","replaceNode","insertBefore","contentDocument","prepend","wrapNode","detach","after","newElement","toggleClass","condition","classCondition","nextElementSibling","getElementsByTagName","extraParameters","dummyEvent","handlerArgs","eventFnsCopy","arg3","unbind","$$annotate","$animateMinErr","$$selectors","classNameFilter","this.classNameFilter","$$classNameFilter","runAnimationPostDigest","cancelFn","$$cancelFn","defer.promise.$$cancelFn","ngAnimatePostDigest","ngAnimateNotifyComplete","resolveElementClasses","hasClasses","cachedClassManipulation","op","asyncPromise","currentDefer","applyStyles","styles","from","to","animate","enter","leave","move","$$addClassImmediately","$$removeClassImmediately","add","createdCache","STORAGE_KEY","$$setClassImmediately","APPLICATION_JSON","PATH_MATCH","locationPrototype","paramValue","Location","Location.prototype.state","CALL","APPLY","BIND","CONSTANTS","null","true","false","constantGetter","OPERATORS","+","-","*","/","%","===","!==","==","!=","<",">","<=",">=","&&","||","!","ESCAPE","lex","tokens","readString","peek","readNumber","isIdent","readIdent","is","isWhitespace","ch2","ch3","op2","op3","op1","operator","throwError","chars","isExpOperator","start","end","colStr","peekCh","quote","rawString","hex","String","fromCharCode","rep","ZERO","statements","primary","expect","filterChain","consume","arrayDeclaration","functionCall","objectIndex","fieldAccess","peekToken","e1","e2","e3","e4","peekAhead","t","unaryFn","right","$parseUnaryFn","binaryFn","left","isBranching","$parseBinaryFn","$parseConstant","$parseStatements","inputFn","argsFn","$parseFilter","every","assignment","ternary","$parseAssignment","logicalOR","middle","$parseTernary","logicalAND","equality","relational","additive","multiplicative","unary","$parseFieldAccess","indexFn","$parseObjectIndex","fnGetter","contextGetter","expressionText","$parseFunctionCall","elementFns","$parseArrayLiteral","valueFns","$parseObjectLiteral","yy","y","MMMM","MMM","M","H","hh","EEEE","EEE","ampmGetter","Z","timeZoneGetter","zone","paddedZone","ww","w","xlinkHref","propName","normalized","ngBooleanAttrWatchAction","htmlAttr","ngAttrAliasWatchAction","nullFormRenameControl","formDirectiveFactory","isNgForm","ngFormCompile","formElement","ngFormPreLink","handleFormSubmission","parentFormCtrl","alias","URL_REGEXP","EMAIL_REGEXP","NUMBER_REGEXP","DATE_REGEXP","DATETIMELOCAL_REGEXP","WEEK_REGEXP","MONTH_REGEXP","TIME_REGEXP","inputType","textInputType","weekParser","isoWeek","existingDate","week","minutes","hours","seconds","milliseconds","addDays","numberInputType","urlInputType","ctrl.$validators.url","modelValue","viewValue","emailInputType","email","ctrl.$validators.email","radioInputType","checked","checkboxInputType","trueValue","ngTrueValue","falseValue","ngFalseValue","ctrl.$isEmpty","ctrls","CONSTANT_VALUE_REGEXP","tplAttr","ngValueConstantLink","ngValueLink","valueWatchAction","$compile","ngBindCompile","templateElement","ngBindLink","ngBindWatchAction","ngBindTemplateCompile","ngBindTemplateLink","ngBindHtmlCompile","tElement","ngBindHtmlGetter","ngBindHtmlWatch","getStringValue","ngBindHtmlLink","ngBindHtmlWatchAction","getTrustedHtml","$viewChangeListeners","forceAsyncEvents","ngEventHandler","$event","previousElements","ngIfWatchAction","newScope","srcExp","onloadExp","autoScrollExp","autoscroll","changeCounter","previousElement","currentElement","cleanupLastIncludeContent","parseAsResourceUrl","ngIncludeWatchAction","afterAnimation","thisChangeId","namespaceAdaptedClone","trimValues","NgModelController","$modelValue","$$rawModelValue","$asyncValidators","$untouched","$touched","parsedNgModel","parsedNgModelAssign","ngModelGet","ngModelSet","pendingDebounce","$$setOptions","this.$$setOptions","getterSetter","invokeModelGetter","invokeModelSetter","$$$p","this.$isEmpty","currentValidationRunId","this.$setPristine","this.$setDirty","this.$setUntouched","UNTOUCHED_CLASS","TOUCHED_CLASS","$setTouched","this.$setTouched","this.$rollbackViewValue","$$lastCommittedViewValue","this.$validate","prevValid","prevModelValue","allowInvalid","$$runValidators","parserValid","allValid","$$writeModelToScope","this.$$runValidators","parseValid","doneCallback","processSyncValidators","syncValidatorsValid","validator","processAsyncValidators","validatorPromises","validationDone","localValidationRunId","processParseErrors","errorKey","this.$commitViewValue","$$parseAndValidate","this.$$parseAndValidate","this.$$writeModelToScope","this.$setViewValue","updateOnDefault","$$debounceViewValueCommit","this.$$debounceViewValueCommit","debounceDelay","debounce","ngModelWatch","formatters","ngModelCompile","ngModelPreLink","modelCtrl","formCtrl","ngModelPostLink","updateOn","DEFAULT_REGEXP","that","BRACE","IS_WHEN","updateElementText","newText","numberExp","whenExp","whens","whensExpFns","braceReplacement","watchRemover","lastCount","attributeName","tmpMatch","whenKey","ngPluralizeWatchAction","countIsNaN","ngRepeatMinErr","updateScope","valueIdentifier","keyIdentifier","arrayLength","$first","$last","$middle","$odd","$even","ngRepeatCompile","ngRepeatEndComment","lhs","rhs","aliasAs","trackByExp","trackByExpGetter","trackByIdExpFn","trackByIdArrayFn","trackByIdObjFn","hashFnLocals","ngRepeatLink","lastBlockMap","ngRepeatAction","previousNode","nextNode","nextBlockMap","collectionLength","trackById","collectionKeys","nextBlockOrder","trackByIdFn","itemKey","blockKey","ngRepeatTransclude","ngShowWatchAction","NG_HIDE_CLASS","tempClasses","NG_HIDE_IN_PROGRESS_CLASS","ngHideWatchAction","ngStyleWatchAction","newStyles","oldStyles","ngSwitchController","cases","selectedTranscludes","selectedElements","previousLeaveAnimations","selectedScopes","spliceFactory","ngSwitchWatchAction","selectedTransclude","caseElement","selectedScope","anchor","ngOptionsMinErr","NG_OPTIONS_REGEXP","nullModelCtrl","optionsMap","ngModelCtrl","unknownOption","databound","init","self.init","ngModelCtrl_","nullOption_","unknownOption_","addOption","self.addOption","removeOption","self.removeOption","hasOption","renderUnknownOption","self.renderUnknownOption","unknownVal","self.hasOption","setupAsSingle","selectElement","selectCtrl","ngModelCtrl.$render","emptyOption","setupAsMultiple","lastView","selectMultipleWatch","setupAsOptions","callExpression","exprFn","valueName","keyName","createIsSelectedFn","selectedSet","trackFn","trackIndex","isSelected","compareValueFn","selectAsFn","scheduleRendering","renderScheduled","render","updateLabelMap","labelMap","label","added","optionGroups","optionGroupNames","optionGroupName","optionGroup","existingParent","existingOptions","existingOption","valuesFn","anySelected","optionId","trackKeysCache","groupByFn","displayFn","nullOption","groupIndex","groupLength","optionGroupsCache","optGroupTemplate","lastElement","optionTemplate","optionsExp","selectAs","track","selectionChanged","selectedKey","viewValueFn","getLabels","toDisplay","ngModelCtrl.$isEmpty","nullSelectCtrl","selectCtrlName","interpolateWatchAction","ctrl.$validators.required","patternExp","ctrl.$validators.pattern","intVal","ctrl.$validators.maxlength","ctrl.$validators.minlength","$$csp"] } diff --git a/public/vendor/angular/bower.json b/public/vendor/angular/bower.json index d386dcd34..07bfef00b 100644 --- a/public/vendor/angular/bower.json +++ b/public/vendor/angular/bower.json @@ -1,6 +1,6 @@ { "name": "angular", - "version": "1.3.7", + "version": "1.3.10", "main": "./angular.js", "ignore": [], "dependencies": { diff --git a/public/vendor/angular/package.json b/public/vendor/angular/package.json index 65b1c809c..a447b4346 100644 --- a/public/vendor/angular/package.json +++ b/public/vendor/angular/package.json @@ -1,6 +1,6 @@ { "name": "angular", - "version": "1.3.7", + "version": "1.3.10", "description": "HTML enhanced for web apps", "main": "angular.js", "scripts": { diff --git a/public/vendor/ng-tags-input/.bower.json b/public/vendor/ng-tags-input/.bower.json new file mode 100644 index 000000000..1842099d9 --- /dev/null +++ b/public/vendor/ng-tags-input/.bower.json @@ -0,0 +1,24 @@ +{ + "name": "ng-tags-input", + "version": "2.1.1", + "location": "https://github.com/mbenford/ngTagsInput-bower", + "homepage": "http://mbenford.github.io/ngTagsInput", + "main": [ + "ng-tags-input.min.js", + "ng-tags-input.min.css" + ], + "description": "Tags input directive for AngularJS", + "dependencies": { + "angular": ">=1.2.1" + }, + "_release": "2.1.1", + "_resolution": { + "type": "version", + "tag": "v2.1.1", + "commit": "04ddd024e0afd421d1073732a1aab5a5efb68a9d" + }, + "_source": "git://github.com/mbenford/ngTagsInput-bower.git", + "_target": "2.1.1", + "_originalSource": "ng-tags-input", + "_direct": true +} \ No newline at end of file diff --git a/public/vendor/ng-tags-input/README b/public/vendor/ng-tags-input/README new file mode 100644 index 000000000..c5ea3ea19 --- /dev/null +++ b/public/vendor/ng-tags-input/README @@ -0,0 +1 @@ +Bower repository for ngTagsInput diff --git a/public/vendor/ng-tags-input/bower.json b/public/vendor/ng-tags-input/bower.json new file mode 100644 index 000000000..95e929782 --- /dev/null +++ b/public/vendor/ng-tags-input/bower.json @@ -0,0 +1,14 @@ +{ + "name": "ng-tags-input", + "version": "2.1.1", + "location": "https://github.com/mbenford/ngTagsInput-bower", + "homepage": "http://mbenford.github.io/ngTagsInput", + "main": [ + "ng-tags-input.min.js", + "ng-tags-input.min.css" + ], + "description": "Tags input directive for AngularJS", + "dependencies": { + "angular": ">=1.2.1" + } +} \ No newline at end of file diff --git a/public/vendor/ng-tags-input/ng-tags-input.bootstrap.css b/public/vendor/ng-tags-input/ng-tags-input.bootstrap.css new file mode 100644 index 000000000..5f8ea5b79 --- /dev/null +++ b/public/vendor/ng-tags-input/ng-tags-input.bootstrap.css @@ -0,0 +1,166 @@ +tags-input { + box-shadow: none; + border: none; + padding: 0; + min-height: 34px; +} +tags-input .host { + margin: 0; +} +tags-input .tags { + -moz-appearance: none; + -webkit-appearance: none; + border: 1px solid #cccccc; + border-radius: 4px; + -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-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s; + -moz-transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s; + transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s; +} +tags-input .tags .tag-item { + color: white; + background: #428bca; + border: 1px solid #357ebd; + border-radius: 4px; +} +tags-input .tags .tag-item.selected { + color: white; + background: #d9534f; + border: 1px solid #d43f3a; +} +tags-input .tags .tag-item .remove-button:hover { + text-decoration: none; +} +tags-input .tags.focused { + border: 1px solid #66afe9; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6); +} +tags-input .autocomplete { + border-radius: 4px; +} +tags-input .autocomplete .suggestion-item.selected { + color: #262626; + background-color: whitesmoke; +} +tags-input .autocomplete .suggestion-item.selected em { + color: #262626; + background-color: whitesmoke; +} +tags-input .autocomplete .suggestion-item em { + color: black; + background-color: white; +} +tags-input.ng-invalid .tags { + border-color: #843534; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483; + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483; +} + +.input-group tags-input { + padding: 0; + display: table-cell; +} +.input-group tags-input:not(:first-child) .tags { + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} +.input-group tags-input:not(:last-child) .tags { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} + +.input-group-lg tags-input:first-child .tags { + border-top-left-radius: 6px; + border-bottom-left-radius: 6px; +} +.input-group-lg tags-input:last-child .tags { + border-top-right-radius: 6px; + border-bottom-right-radius: 6px; +} + +.input-group-sm tags-input:first-child .tags { + border-top-left-radius: 3px; + border-bottom-left-radius: 3px; +} +.input-group-sm tags-input:last-child .tags { + border-top-right-radius: 3px; + border-bottom-right-radius: 3px; +} + +tags-input.ti-input-lg, .input-group-lg tags-input { + min-height: 46px; +} +tags-input.ti-input-lg .tags, .input-group-lg tags-input .tags { + border-radius: 6px; +} +tags-input.ti-input-lg .tags .tag-item, .input-group-lg tags-input .tags .tag-item { + height: 38px; + line-height: 37px; + font-size: 18px; + border-radius: 6px; +} +tags-input.ti-input-lg .tags .tag-item .remove-button, .input-group-lg tags-input .tags .tag-item .remove-button { + font-size: 20px; +} +tags-input.ti-input-lg .tags .input, .input-group-lg tags-input .tags .input { + height: 38px; + font-size: 18px; +} +tags-input.ti-input-sm, .input-group-sm tags-input { + min-height: 30px; +} +tags-input.ti-input-sm .tags, .input-group-sm tags-input .tags { + border-radius: 3px; +} +tags-input.ti-input-sm .tags .tag-item, .input-group-sm tags-input .tags .tag-item { + height: 22px; + line-height: 21px; + font-size: 12px; + border-radius: 3px; +} +tags-input.ti-input-sm .tags .tag-item .remove-button, .input-group-sm tags-input .tags .tag-item .remove-button { + font-size: 16px; +} +tags-input.ti-input-sm .tags .input, .input-group-sm tags-input .tags .input { + height: 22px; + font-size: 12px; +} + +.has-feedback tags-input .tags { + padding-right: 30px; +} + +.has-success tags-input .tags { + border-color: #3c763d; +} +.has-success tags-input .tags.focused { + border-color: #2b542c; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168; + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168; +} + +.has-error tags-input .tags { + border-color: #a94442; +} +.has-error tags-input .tags.focused { + border-color: #843534; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483; + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483; +} + +.has-warning tags-input .tags { + border-color: #8a6d3b; +} +.has-warning tags-input .tags.focused { + border-color: #66512c; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b; + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b; +} diff --git a/public/vendor/ng-tags-input/ng-tags-input.bootstrap.min.css b/public/vendor/ng-tags-input/ng-tags-input.bootstrap.min.css new file mode 100644 index 000000000..d21842194 --- /dev/null +++ b/public/vendor/ng-tags-input/ng-tags-input.bootstrap.min.css @@ -0,0 +1 @@ +tags-input{box-shadow:none;border:none;padding:0;min-height:34px}tags-input .host{margin:0}tags-input .tags{-moz-appearance:none;-webkit-appearance:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;-moz-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}tags-input .tags .tag-item{color:#fff;background:#428bca;border:1px solid #357ebd;border-radius:4px}tags-input .tags .tag-item.selected{color:#fff;background:#d9534f;border:1px solid #d43f3a}tags-input .tags .tag-item .remove-button:hover{text-decoration:none}tags-input .tags.focused{border:1px solid #66afe9;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)}tags-input .autocomplete{border-radius:4px}tags-input .autocomplete .suggestion-item.selected,tags-input .autocomplete .suggestion-item.selected em{color:#262626;background-color:#f5f5f5}tags-input .autocomplete .suggestion-item em{color:#000;background-color:#fff}tags-input.ng-invalid .tags{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483}.input-group tags-input{padding:0;display:table-cell}.input-group tags-input:not(:first-child) .tags{border-top-left-radius:0;border-bottom-left-radius:0}.input-group tags-input:not(:last-child) .tags{border-top-right-radius:0;border-bottom-right-radius:0}.input-group-lg tags-input:first-child .tags{border-top-left-radius:6px;border-bottom-left-radius:6px}.input-group-lg tags-input:last-child .tags{border-top-right-radius:6px;border-bottom-right-radius:6px}.input-group-sm tags-input:first-child .tags{border-top-left-radius:3px;border-bottom-left-radius:3px}.input-group-sm tags-input:last-child .tags{border-top-right-radius:3px;border-bottom-right-radius:3px}.input-group-lg tags-input,tags-input.ti-input-lg{min-height:46px}.input-group-lg tags-input .tags,tags-input.ti-input-lg .tags{border-radius:6px}.input-group-lg tags-input .tags .tag-item,tags-input.ti-input-lg .tags .tag-item{height:38px;line-height:37px;font-size:18px;border-radius:6px}.input-group-lg tags-input .tags .tag-item .remove-button,tags-input.ti-input-lg .tags .tag-item .remove-button{font-size:20px}.input-group-lg tags-input .tags .input,tags-input.ti-input-lg .tags .input{height:38px;font-size:18px}.input-group-sm tags-input,tags-input.ti-input-sm{min-height:30px}.input-group-sm tags-input .tags,tags-input.ti-input-sm .tags{border-radius:3px}.input-group-sm tags-input .tags .tag-item,tags-input.ti-input-sm .tags .tag-item{height:22px;line-height:21px;font-size:12px;border-radius:3px}.input-group-sm tags-input .tags .tag-item .remove-button,tags-input.ti-input-sm .tags .tag-item .remove-button{font-size:16px}.input-group-sm tags-input .tags .input,tags-input.ti-input-sm .tags .input{height:22px;font-size:12px}.has-feedback tags-input .tags{padding-right:30px}.has-success tags-input .tags{border-color:#3c763d}.has-success tags-input .tags.focused{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168}.has-error tags-input .tags{border-color:#a94442}.has-error tags-input .tags.focused{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483}.has-warning tags-input .tags{border-color:#8a6d3b}.has-warning tags-input .tags.focused{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b} \ No newline at end of file diff --git a/public/vendor/ng-tags-input/ng-tags-input.css b/public/vendor/ng-tags-input/ng-tags-input.css new file mode 100644 index 000000000..86ee970c2 --- /dev/null +++ b/public/vendor/ng-tags-input/ng-tags-input.css @@ -0,0 +1,133 @@ +tags-input { + display: block; +} +tags-input *, tags-input *:before, tags-input *:after { + -moz-box-sizing: border-box; + -webkit-box-sizing: border-box; + box-sizing: border-box; +} +tags-input .host { + position: relative; + margin-top: 5px; + margin-bottom: 5px; + height: 100%; +} +tags-input .host:active { + outline: none; +} + +tags-input .tags { + -moz-appearance: textfield; + -webkit-appearance: textfield; + padding: 1px; + overflow: hidden; + word-wrap: break-word; + cursor: text; + background-color: white; + border: 1px solid darkgray; + box-shadow: 1px 1px 1px 0 lightgray inset; + height: 100%; +} +tags-input .tags.focused { + outline: none; + -webkit-box-shadow: 0 0 3px 1px rgba(5, 139, 242, 0.6); + -moz-box-shadow: 0 0 3px 1px rgba(5, 139, 242, 0.6); + box-shadow: 0 0 3px 1px rgba(5, 139, 242, 0.6); +} +tags-input .tags .tag-list { + margin: 0; + padding: 0; + list-style-type: none; +} +tags-input .tags .tag-item { + margin: 2px; + padding: 0 5px; + display: inline-block; + float: left; + font: 14px "Helvetica Neue", Helvetica, Arial, sans-serif; + height: 26px; + line-height: 25px; + border: 1px solid #acacac; + border-radius: 3px; + background: -webkit-linear-gradient(top, #f0f9ff 0%, #cbebff 47%, #a1dbff 100%); + background: linear-gradient(to bottom, #f0f9ff 0%, #cbebff 47%, #a1dbff 100%); +} +tags-input .tags .tag-item.selected { + background: -webkit-linear-gradient(top, #febbbb 0%, #fe9090 45%, #ff5c5c 100%); + background: linear-gradient(to bottom, #febbbb 0%, #fe9090 45%, #ff5c5c 100%); +} +tags-input .tags .tag-item .remove-button { + margin: 0 0 0 5px; + padding: 0; + border: none; + background: none; + cursor: pointer; + vertical-align: middle; + font: bold 16px Arial, sans-serif; + color: #585858; +} +tags-input .tags .tag-item .remove-button:active { + color: red; +} +tags-input .tags .input { + border: 0; + outline: none; + margin: 2px; + padding: 0; + padding-left: 5px; + float: left; + height: 26px; + font: 14px "Helvetica Neue", Helvetica, Arial, sans-serif; +} +tags-input .tags .input.invalid-tag { + color: red; +} +tags-input .tags .input::-ms-clear { + display: none; +} +tags-input.ng-invalid .tags { + -webkit-box-shadow: 0 0 3px 1px rgba(255, 0, 0, 0.6); + -moz-box-shadow: 0 0 3px 1px rgba(255, 0, 0, 0.6); + box-shadow: 0 0 3px 1px rgba(255, 0, 0, 0.6); +} + +tags-input .autocomplete { + margin-top: 5px; + position: absolute; + padding: 5px 0; + z-index: 999; + width: 100%; + background-color: white; + border: 1px solid rgba(0, 0, 0, 0.2); + -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); +} +tags-input .autocomplete .suggestion-list { + margin: 0; + padding: 0; + list-style-type: none; +} +tags-input .autocomplete .suggestion-item { + padding: 5px 10px; + cursor: pointer; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + font: 16px "Helvetica Neue", Helvetica, Arial, sans-serif; + color: black; + background-color: white; +} +tags-input .autocomplete .suggestion-item.selected { + color: white; + background-color: #0097cf; +} +tags-input .autocomplete .suggestion-item.selected em { + color: white; + background-color: #0097cf; +} +tags-input .autocomplete .suggestion-item em { + font: normal bold 16px "Helvetica Neue", Helvetica, Arial, sans-serif; + color: black; + background-color: white; +} diff --git a/public/vendor/ng-tags-input/ng-tags-input.js b/public/vendor/ng-tags-input/ng-tags-input.js new file mode 100644 index 000000000..2b1a15ad8 --- /dev/null +++ b/public/vendor/ng-tags-input/ng-tags-input.js @@ -0,0 +1,867 @@ +/*! + * ngTagsInput v2.1.1 + * http://mbenford.github.io/ngTagsInput + * + * Copyright (c) 2013-2014 Michael Benford + * License: MIT + * + * Generated at 2014-09-04 01:27:58 -0300 + */ +(function() { +'use strict'; + +var KEYS = { + backspace: 8, + tab: 9, + enter: 13, + escape: 27, + space: 32, + up: 38, + down: 40, + comma: 188 +}; + +var MAX_SAFE_INTEGER = 9007199254740991; +var SUPPORTED_INPUT_TYPES = ['text', 'email', 'url']; + +function SimplePubSub() { + var events = {}; + return { + on: function(names, handler) { + names.split(' ').forEach(function(name) { + if (!events[name]) { + events[name] = []; + } + events[name].push(handler); + }); + return this; + }, + trigger: function(name, args) { + angular.forEach(events[name], function(handler) { + handler.call(null, args); + }); + return this; + } + }; +} + +function makeObjectArray(array, key) { + array = array || []; + if (array.length > 0 && !angular.isObject(array[0])) { + array.forEach(function(item, index) { + array[index] = {}; + array[index][key] = item; + }); + } + return array; +} + +function findInObjectArray(array, obj, key) { + var item = null; + for (var i = 0; i < array.length; i++) { + // I'm aware of the internationalization issues regarding toLowerCase() + // but I couldn't come up with a better solution right now + if (safeToString(array[i][key]).toLowerCase() === safeToString(obj[key]).toLowerCase()) { + item = array[i]; + break; + } + } + return item; +} + +function replaceAll(str, substr, newSubstr) { + if (!substr) { + return str; + } + + var expression = substr.replace(/([.?*+^$[\]\\(){}|-])/g, '\\$1'); + return str.replace(new RegExp(expression, 'gi'), newSubstr); +} + +function safeToString(value) { + return angular.isUndefined(value) || value == null ? '' : value.toString().trim(); +} + +function encodeHTML(value) { + return value.replace(/&/g, '&') + .replace(//g, '>'); +} + +var tagsInput = angular.module('ngTagsInput', []); + +/** + * @ngdoc directive + * @name tagsInput + * @module ngTagsInput + * + * @description + * Renders an input box with tag editing support. + * + * @param {string} ngModel Assignable angular expression to data-bind to. + * @param {string=} [displayProperty=text] Property to be rendered as the tag label. + * @param {string=} [input=text] Type of the input element. Only 'text', 'email' and 'url' are supported values. + * @param {number=} tabindex Tab order of the control. + * @param {string=} [placeholder=Add a tag] Placeholder text for the control. + * @param {number=} [minLength=3] Minimum length for a new tag. + * @param {number=} [maxLength=MAX_SAFE_INTEGER] Maximum length allowed for a new tag. + * @param {number=} [minTags=0] Sets minTags validation error key if the number of tags added is less than minTags. + * @param {number=} [maxTags=MAX_SAFE_INTEGER] Sets maxTags validation error key if the number of tags added is greater than maxTags. + * @param {boolean=} [allowLeftoverText=false] Sets leftoverText validation error key if there is any leftover text in + * the input element when the directive loses focus. + * @param {string=} [removeTagSymbol=×] Symbol character for the remove tag button. + * @param {boolean=} [addOnEnter=true] Flag indicating that a new tag will be added on pressing the ENTER key. + * @param {boolean=} [addOnSpace=false] Flag indicating that a new tag will be added on pressing the SPACE key. + * @param {boolean=} [addOnComma=true] Flag indicating that a new tag will be added on pressing the COMMA key. + * @param {boolean=} [addOnBlur=true] Flag indicating that a new tag will be added when the input field loses focus. + * @param {boolean=} [replaceSpacesWithDashes=true] Flag indicating that spaces will be replaced with dashes. + * @param {string=} [allowedTagsPattern=.+] Regular expression that determines whether a new tag is valid. + * @param {boolean=} [enableEditingLastTag=false] Flag indicating that the last tag will be moved back into + * the new tag input box instead of being removed when the backspace key + * is pressed and the input box is empty. + * @param {boolean=} [addFromAutocompleteOnly=false] Flag indicating that only tags coming from the autocomplete list will be allowed. + * When this flag is true, addOnEnter, addOnComma, addOnSpace, addOnBlur and + * allowLeftoverText values are ignored. + * @param {expression} onTagAdded Expression to evaluate upon adding a new tag. The new tag is available as $tag. + * @param {expression} onTagRemoved Expression to evaluate upon removing an existing tag. The removed tag is available as $tag. + */ +tagsInput.directive('tagsInput', ["$timeout","$document","tagsInputConfig", function($timeout, $document, tagsInputConfig) { + function TagList(options, events) { + var self = {}, getTagText, setTagText, tagIsValid; + + getTagText = function(tag) { + return safeToString(tag[options.displayProperty]); + }; + + setTagText = function(tag, text) { + tag[options.displayProperty] = text; + }; + + tagIsValid = function(tag) { + var tagText = getTagText(tag); + + return tagText && + tagText.length >= options.minLength && + tagText.length <= options.maxLength && + options.allowedTagsPattern.test(tagText) && + !findInObjectArray(self.items, tag, options.displayProperty); + }; + + self.items = []; + + self.addText = function(text) { + var tag = {}; + setTagText(tag, text); + return self.add(tag); + }; + + self.add = function(tag) { + var tagText = getTagText(tag); + + if (options.replaceSpacesWithDashes) { + tagText = tagText.replace(/\s/g, '-'); + } + + setTagText(tag, tagText); + + if (tagIsValid(tag)) { + self.items.push(tag); + events.trigger('tag-added', { $tag: tag }); + } + else if (tagText) { + events.trigger('invalid-tag', { $tag: tag }); + } + + return tag; + }; + + self.remove = function(index) { + var tag = self.items.splice(index, 1)[0]; + events.trigger('tag-removed', { $tag: tag }); + return tag; + }; + + self.removeLast = function() { + var tag, lastTagIndex = self.items.length - 1; + + if (options.enableEditingLastTag || self.selected) { + self.selected = null; + tag = self.remove(lastTagIndex); + } + else if (!self.selected) { + self.selected = self.items[lastTagIndex]; + } + + return tag; + }; + + return self; + } + + function validateType(type) { + return SUPPORTED_INPUT_TYPES.indexOf(type) !== -1; + } + + return { + restrict: 'E', + require: 'ngModel', + scope: { + tags: '=ngModel', + onTagAdded: '&', + onTagRemoved: '&' + }, + replace: false, + transclude: true, + templateUrl: 'ngTagsInput/tags-input.html', + controller: ["$scope","$attrs","$element", function($scope, $attrs, $element) { + $scope.events = new SimplePubSub(); + + tagsInputConfig.load('tagsInput', $scope, $attrs, { + type: [String, 'text', validateType], + placeholder: [String, 'Add a tag'], + tabindex: [Number, null], + removeTagSymbol: [String, String.fromCharCode(215)], + replaceSpacesWithDashes: [Boolean, true], + minLength: [Number, 3], + maxLength: [Number, MAX_SAFE_INTEGER], + addOnEnter: [Boolean, true], + addOnSpace: [Boolean, false], + addOnComma: [Boolean, true], + addOnBlur: [Boolean, true], + allowedTagsPattern: [RegExp, /.+/], + enableEditingLastTag: [Boolean, false], + minTags: [Number, 0], + maxTags: [Number, MAX_SAFE_INTEGER], + displayProperty: [String, 'text'], + allowLeftoverText: [Boolean, false], + addFromAutocompleteOnly: [Boolean, false] + }); + + $scope.tagList = new TagList($scope.options, $scope.events); + + this.registerAutocomplete = function() { + var input = $element.find('input'); + input.on('keydown', function(e) { + $scope.events.trigger('input-keydown', e); + }); + + return { + addTag: function(tag) { + return $scope.tagList.add(tag); + }, + focusInput: function() { + input[0].focus(); + }, + getTags: function() { + return $scope.tags; + }, + getCurrentTagText: function() { + return $scope.newTag.text; + }, + getOptions: function() { + return $scope.options; + }, + on: function(name, handler) { + $scope.events.on(name, handler); + return this; + } + }; + }; + }], + link: function(scope, element, attrs, ngModelCtrl) { + var hotkeys = [KEYS.enter, KEYS.comma, KEYS.space, KEYS.backspace], + tagList = scope.tagList, + events = scope.events, + options = scope.options, + input = element.find('input'), + validationOptions = ['minTags', 'maxTags', 'allowLeftoverText'], + setElementValidity; + + setElementValidity = function() { + ngModelCtrl.$setValidity('maxTags', scope.tags.length <= options.maxTags); + ngModelCtrl.$setValidity('minTags', scope.tags.length >= options.minTags); + ngModelCtrl.$setValidity('leftoverText', options.allowLeftoverText ? true : !scope.newTag.text); + }; + + events + .on('tag-added', scope.onTagAdded) + .on('tag-removed', scope.onTagRemoved) + .on('tag-added', function() { + scope.newTag.text = ''; + }) + .on('tag-added tag-removed', function() { + ngModelCtrl.$setViewValue(scope.tags); + }) + .on('invalid-tag', function() { + scope.newTag.invalid = true; + }) + .on('input-change', function() { + tagList.selected = null; + scope.newTag.invalid = null; + }) + .on('input-focus', function() { + ngModelCtrl.$setValidity('leftoverText', true); + }) + .on('input-blur', function() { + if (!options.addFromAutocompleteOnly) { + if (options.addOnBlur) { + tagList.addText(scope.newTag.text); + } + + setElementValidity(); + } + }) + .on('option-change', function(e) { + if (validationOptions.indexOf(e.name) !== -1) { + setElementValidity(); + } + }); + + scope.newTag = { text: '', invalid: null }; + + scope.getDisplayText = function(tag) { + return safeToString(tag[options.displayProperty]); + }; + + scope.track = function(tag) { + return tag[options.displayProperty]; + }; + + scope.newTagChange = function() { + events.trigger('input-change', scope.newTag.text); + }; + + scope.$watch('tags', function(value) { + scope.tags = makeObjectArray(value, options.displayProperty); + tagList.items = scope.tags; + }); + + scope.$watch('tags.length', function() { + setElementValidity(); + }); + + input + .on('keydown', function(e) { + // This hack is needed because jqLite doesn't implement stopImmediatePropagation properly. + // I've sent a PR to Angular addressing this issue and hopefully it'll be fixed soon. + // https://github.com/angular/angular.js/pull/4833 + if (e.isImmediatePropagationStopped && e.isImmediatePropagationStopped()) { + return; + } + + var key = e.keyCode, + isModifier = e.shiftKey || e.altKey || e.ctrlKey || e.metaKey, + addKeys = {}, + shouldAdd, shouldRemove; + + if (isModifier || hotkeys.indexOf(key) === -1) { + return; + } + + addKeys[KEYS.enter] = options.addOnEnter; + addKeys[KEYS.comma] = options.addOnComma; + addKeys[KEYS.space] = options.addOnSpace; + + shouldAdd = !options.addFromAutocompleteOnly && addKeys[key]; + shouldRemove = !shouldAdd && key === KEYS.backspace && scope.newTag.text.length === 0; + + if (shouldAdd) { + tagList.addText(scope.newTag.text); + + scope.$apply(); + e.preventDefault(); + } + else if (shouldRemove) { + var tag = tagList.removeLast(); + if (tag && options.enableEditingLastTag) { + scope.newTag.text = tag[options.displayProperty]; + } + + scope.$apply(); + e.preventDefault(); + } + }) + .on('focus', function() { + if (scope.hasFocus) { + return; + } + + scope.hasFocus = true; + events.trigger('input-focus'); + + scope.$apply(); + }) + .on('blur', function() { + $timeout(function() { + var activeElement = $document.prop('activeElement'), + lostFocusToBrowserWindow = activeElement === input[0], + lostFocusToChildElement = element[0].contains(activeElement); + + if (lostFocusToBrowserWindow || !lostFocusToChildElement) { + scope.hasFocus = false; + events.trigger('input-blur'); + } + }); + }); + + element.find('div').on('click', function() { + input[0].focus(); + }); + } + }; +}]); + +/** + * @ngdoc directive + * @name autoComplete + * @module ngTagsInput + * + * @description + * Provides autocomplete support for the tagsInput directive. + * + * @param {expression} source Expression to evaluate upon changing the input content. The input value is available as + * $query. The result of the expression must be a promise that eventually resolves to an + * array of strings. + * @param {number=} [debounceDelay=100] Amount of time, in milliseconds, to wait before evaluating the expression in + * the source option after the last keystroke. + * @param {number=} [minLength=3] Minimum number of characters that must be entered before evaluating the expression + * in the source option. + * @param {boolean=} [highlightMatchedText=true] Flag indicating that the matched text will be highlighted in the + * suggestions list. + * @param {number=} [maxResultsToShow=10] Maximum number of results to be displayed at a time. + * @param {boolean=} [loadOnDownArrow=false] Flag indicating that the source option will be evaluated when the down arrow + * key is pressed and the suggestion list is closed. The current input value + * is available as $query. + * @param {boolean=} {loadOnEmpty=false} Flag indicating that the source option will be evaluated when the input content + * becomes empty. The $query variable will be passed to the expression as an empty string. + * @param {boolean=} {loadOnFocus=false} Flag indicating that the source option will be evaluated when the input element + * gains focus. The current input value is available as $query. + */ +tagsInput.directive('autoComplete', ["$document","$timeout","$sce","tagsInputConfig", function($document, $timeout, $sce, tagsInputConfig) { + function SuggestionList(loadFn, options) { + var self = {}, debouncedLoadId, getDifference, lastPromise; + + getDifference = function(array1, array2) { + return array1.filter(function(item) { + return !findInObjectArray(array2, item, options.tagsInput.displayProperty); + }); + }; + + self.reset = function() { + lastPromise = null; + + self.items = []; + self.visible = false; + self.index = -1; + self.selected = null; + self.query = null; + + $timeout.cancel(debouncedLoadId); + }; + self.show = function() { + self.selected = null; + self.visible = true; + }; + self.load = function(query, tags) { + $timeout.cancel(debouncedLoadId); + debouncedLoadId = $timeout(function() { + self.query = query; + + var promise = loadFn({ $query: query }); + lastPromise = promise; + + promise.then(function(items) { + if (promise !== lastPromise) { + return; + } + + items = makeObjectArray(items.data || items, options.tagsInput.displayProperty); + items = getDifference(items, tags); + self.items = items.slice(0, options.maxResultsToShow); + + if (self.items.length > 0) { + self.show(); + } + else { + self.reset(); + } + }); + }, options.debounceDelay, false); + }; + self.selectNext = function() { + self.select(++self.index); + }; + self.selectPrior = function() { + self.select(--self.index); + }; + self.select = function(index) { + if (index < 0) { + index = self.items.length - 1; + } + else if (index >= self.items.length) { + index = 0; + } + self.index = index; + self.selected = self.items[index]; + }; + + self.reset(); + + return self; + } + + return { + restrict: 'E', + require: '^tagsInput', + scope: { source: '&' }, + templateUrl: 'ngTagsInput/auto-complete.html', + link: function(scope, element, attrs, tagsInputCtrl) { + var hotkeys = [KEYS.enter, KEYS.tab, KEYS.escape, KEYS.up, KEYS.down], + suggestionList, tagsInput, options, getItem, getDisplayText, shouldLoadSuggestions; + + tagsInputConfig.load('autoComplete', scope, attrs, { + debounceDelay: [Number, 100], + minLength: [Number, 3], + highlightMatchedText: [Boolean, true], + maxResultsToShow: [Number, 10], + loadOnDownArrow: [Boolean, false], + loadOnEmpty: [Boolean, false], + loadOnFocus: [Boolean, false] + }); + + options = scope.options; + + tagsInput = tagsInputCtrl.registerAutocomplete(); + options.tagsInput = tagsInput.getOptions(); + + suggestionList = new SuggestionList(scope.source, options); + + getItem = function(item) { + return item[options.tagsInput.displayProperty]; + }; + + getDisplayText = function(item) { + return safeToString(getItem(item)); + }; + + shouldLoadSuggestions = function(value) { + return value && value.length >= options.minLength || !value && options.loadOnEmpty; + }; + + scope.suggestionList = suggestionList; + + scope.addSuggestionByIndex = function(index) { + suggestionList.select(index); + scope.addSuggestion(); + }; + + scope.addSuggestion = function() { + var added = false; + + if (suggestionList.selected) { + tagsInput.addTag(suggestionList.selected); + suggestionList.reset(); + tagsInput.focusInput(); + + added = true; + } + return added; + }; + + scope.highlight = function(item) { + var text = getDisplayText(item); + text = encodeHTML(text); + if (options.highlightMatchedText) { + text = replaceAll(text, encodeHTML(suggestionList.query), '$&'); + } + return $sce.trustAsHtml(text); + }; + + scope.track = function(item) { + return getItem(item); + }; + + tagsInput + .on('tag-added tag-removed invalid-tag input-blur', function() { + suggestionList.reset(); + }) + .on('input-change', function(value) { + if (shouldLoadSuggestions(value)) { + suggestionList.load(value, tagsInput.getTags()); + } + else { + suggestionList.reset(); + } + }) + .on('input-focus', function() { + var value = tagsInput.getCurrentTagText(); + if (options.loadOnFocus && shouldLoadSuggestions(value)) { + suggestionList.load(value, tagsInput.getTags()); + } + }) + .on('input-keydown', function(e) { + // This hack is needed because jqLite doesn't implement stopImmediatePropagation properly. + // I've sent a PR to Angular addressing this issue and hopefully it'll be fixed soon. + // https://github.com/angular/angular.js/pull/4833 + var immediatePropagationStopped = false; + e.stopImmediatePropagation = function() { + immediatePropagationStopped = true; + e.stopPropagation(); + }; + e.isImmediatePropagationStopped = function() { + return immediatePropagationStopped; + }; + + var key = e.keyCode, + handled = false; + + if (hotkeys.indexOf(key) === -1) { + return; + } + + if (suggestionList.visible) { + + if (key === KEYS.down) { + suggestionList.selectNext(); + handled = true; + } + else if (key === KEYS.up) { + suggestionList.selectPrior(); + handled = true; + } + else if (key === KEYS.escape) { + suggestionList.reset(); + handled = true; + } + else if (key === KEYS.enter || key === KEYS.tab) { + handled = scope.addSuggestion(); + } + } + else { + if (key === KEYS.down && scope.options.loadOnDownArrow) { + suggestionList.load(tagsInput.getCurrentTagText(), tagsInput.getTags()); + handled = true; + } + } + + if (handled) { + e.preventDefault(); + e.stopImmediatePropagation(); + scope.$apply(); + } + }); + } + }; +}]); + + +/** + * @ngdoc directive + * @name tiTranscludeAppend + * @module ngTagsInput + * + * @description + * Re-creates the old behavior of ng-transclude. Used internally by tagsInput directive. + */ +tagsInput.directive('tiTranscludeAppend', function() { + return function(scope, element, attrs, ctrl, transcludeFn) { + transcludeFn(function(clone) { + element.append(clone); + }); + }; +}); + +/** + * @ngdoc directive + * @name tiAutosize + * @module ngTagsInput + * + * @description + * Automatically sets the input's width so its content is always visible. Used internally by tagsInput directive. + */ +tagsInput.directive('tiAutosize', ["tagsInputConfig", function(tagsInputConfig) { + return { + restrict: 'A', + require: 'ngModel', + link: function(scope, element, attrs, ctrl) { + var threshold = tagsInputConfig.getTextAutosizeThreshold(), + span, resize; + + span = angular.element(''); + span.css('display', 'none') + .css('visibility', 'hidden') + .css('width', 'auto') + .css('white-space', 'pre'); + + element.parent().append(span); + + resize = function(originalValue) { + var value = originalValue, width; + + if (angular.isString(value) && value.length === 0) { + value = attrs.placeholder; + } + + if (value) { + span.text(value); + span.css('display', ''); + width = span.prop('offsetWidth'); + span.css('display', 'none'); + } + + element.css('width', width ? width + threshold + 'px' : ''); + + return originalValue; + }; + + ctrl.$parsers.unshift(resize); + ctrl.$formatters.unshift(resize); + + attrs.$observe('placeholder', function(value) { + if (!ctrl.$modelValue) { + resize(value); + } + }); + } + }; +}]); + +/** + * @ngdoc directive + * @name tiBindAttrs + * @module ngTagsInput + * + * @description + * Binds attributes to expressions. Used internally by tagsInput directive. + */ +tagsInput.directive('tiBindAttrs', function() { + return function(scope, element, attrs) { + scope.$watch(attrs.tiBindAttrs, function(value) { + angular.forEach(value, function(value, key) { + attrs.$set(key, value); + }); + }, true); + }; +}); + +/** + * @ngdoc service + * @name tagsInputConfig + * @module ngTagsInput + * + * @description + * Sets global configuration settings for both tagsInput and autoComplete directives. It's also used internally to parse and + * initialize options from HTML attributes. + */ +tagsInput.provider('tagsInputConfig', function() { + var globalDefaults = {}, + interpolationStatus = {}, + autosizeThreshold = 3; + + /** + * @ngdoc method + * @name setDefaults + * @description Sets the default configuration option for a directive. + * @methodOf tagsInputConfig + * + * @param {string} directive Name of the directive to be configured. Must be either 'tagsInput' or 'autoComplete'. + * @param {object} defaults Object containing options and their values. + * + * @returns {object} The service itself for chaining purposes. + */ + this.setDefaults = function(directive, defaults) { + globalDefaults[directive] = defaults; + return this; + }; + + /*** + * @ngdoc method + * @name setActiveInterpolation + * @description Sets active interpolation for a set of options. + * @methodOf tagsInputConfig + * + * @param {string} directive Name of the directive to be configured. Must be either 'tagsInput' or 'autoComplete'. + * @param {object} options Object containing which options should have interpolation turned on at all times. + * + * @returns {object} The service itself for chaining purposes. + */ + this.setActiveInterpolation = function(directive, options) { + interpolationStatus[directive] = options; + return this; + }; + + /*** + * @ngdoc method + * @name setTextAutosizeThreshold + * @methodOf tagsInputConfig + * + * @param {number} threshold Threshold to be used by the tagsInput directive to re-size the input element based on its contents. + * + * @returns {object} The service itself for chaining purposes. + */ + this.setTextAutosizeThreshold = function(threshold) { + autosizeThreshold = threshold; + return this; + }; + + this.$get = ["$interpolate", function($interpolate) { + var converters = {}; + converters[String] = function(value) { return value; }; + converters[Number] = function(value) { return parseInt(value, 10); }; + converters[Boolean] = function(value) { return value.toLowerCase() === 'true'; }; + converters[RegExp] = function(value) { return new RegExp(value); }; + + return { + load: function(directive, scope, attrs, options) { + var defaultValidator = function() { return true; }; + + scope.options = {}; + + angular.forEach(options, function(value, key) { + var type, localDefault, validator, converter, getDefault, updateValue; + + type = value[0]; + localDefault = value[1]; + validator = value[2] || defaultValidator; + converter = converters[type]; + + getDefault = function() { + var globalValue = globalDefaults[directive] && globalDefaults[directive][key]; + return angular.isDefined(globalValue) ? globalValue : localDefault; + }; + + updateValue = function(value) { + scope.options[key] = value && validator(value) ? converter(value) : getDefault(); + }; + + if (interpolationStatus[directive] && interpolationStatus[directive][key]) { + attrs.$observe(key, function(value) { + updateValue(value); + scope.events.trigger('option-change', { name: key, newValue: value }); + }); + } + else { + updateValue(attrs[key] && $interpolate(attrs[key])(scope.$parent)); + } + }); + }, + getTextAutosizeThreshold: function() { + return autosizeThreshold; + } + }; + }]; +}); + + +/* HTML templates */ +tagsInput.run(["$templateCache", function($templateCache) { + $templateCache.put('ngTagsInput/tags-input.html', + "
" + ); + + $templateCache.put('ngTagsInput/auto-complete.html', + "
" + ); +}]); + +}()); \ No newline at end of file diff --git a/public/vendor/ng-tags-input/ng-tags-input.min.css b/public/vendor/ng-tags-input/ng-tags-input.min.css new file mode 100644 index 000000000..052ecf3d5 --- /dev/null +++ b/public/vendor/ng-tags-input/ng-tags-input.min.css @@ -0,0 +1 @@ +tags-input{display:block}tags-input *,tags-input :after,tags-input :before{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}tags-input .host{position:relative;margin-top:5px;margin-bottom:5px;height:100%}tags-input .host:active{outline:0}tags-input .tags{-moz-appearance:textfield;-webkit-appearance:textfield;padding:1px;overflow:hidden;word-wrap:break-word;cursor:text;background-color:#fff;border:1px solid #a9a9a9;box-shadow:1px 1px 1px 0 #d3d3d3 inset;height:100%}tags-input .tags.focused{outline:0;-webkit-box-shadow:0 0 3px 1px rgba(5,139,242,.6);-moz-box-shadow:0 0 3px 1px rgba(5,139,242,.6);box-shadow:0 0 3px 1px rgba(5,139,242,.6)}tags-input .tags .tag-list{margin:0;padding:0;list-style-type:none}tags-input .tags .tag-item{margin:2px;padding:0 5px;display:inline-block;float:left;font:14px "Helvetica Neue",Helvetica,Arial,sans-serif;height:26px;line-height:25px;border:1px solid #acacac;border-radius:3px;background:-webkit-linear-gradient(top,#f0f9ff 0,#cbebff 47%,#a1dbff 100%);background:linear-gradient(to bottom,#f0f9ff 0,#cbebff 47%,#a1dbff 100%)}tags-input .tags .tag-item.selected{background:-webkit-linear-gradient(top,#febbbb 0,#fe9090 45%,#ff5c5c 100%);background:linear-gradient(to bottom,#febbbb 0,#fe9090 45%,#ff5c5c 100%)}tags-input .tags .tag-item .remove-button{margin:0 0 0 5px;padding:0;border:none;background:0 0;cursor:pointer;vertical-align:middle;font:700 16px Arial,sans-serif;color:#585858}tags-input .tags .tag-item .remove-button:active{color:red}tags-input .tags .input{border:0;outline:0;margin:2px;padding:0;padding-left:5px;float:left;height:26px;font:14px "Helvetica Neue",Helvetica,Arial,sans-serif}tags-input .tags .input.invalid-tag{color:red}tags-input .tags .input::-ms-clear{display:none}tags-input.ng-invalid .tags{-webkit-box-shadow:0 0 3px 1px rgba(255,0,0,.6);-moz-box-shadow:0 0 3px 1px rgba(255,0,0,.6);box-shadow:0 0 3px 1px rgba(255,0,0,.6)}tags-input .autocomplete{margin-top:5px;position:absolute;padding:5px 0;z-index:999;width:100%;background-color:#fff;border:1px solid rgba(0,0,0,.2);-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);-moz-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2)}tags-input .autocomplete .suggestion-list{margin:0;padding:0;list-style-type:none}tags-input .autocomplete .suggestion-item{padding:5px 10px;cursor:pointer;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font:16px "Helvetica Neue",Helvetica,Arial,sans-serif;color:#000;background-color:#fff}tags-input .autocomplete .suggestion-item.selected,tags-input .autocomplete .suggestion-item.selected em{color:#fff;background-color:#0097cf}tags-input .autocomplete .suggestion-item em{font:normal bold 16px "Helvetica Neue",Helvetica,Arial,sans-serif;color:#000;background-color:#fff} \ No newline at end of file diff --git a/public/vendor/ng-tags-input/ng-tags-input.min.js b/public/vendor/ng-tags-input/ng-tags-input.min.js new file mode 100644 index 000000000..c6b7b08b2 --- /dev/null +++ b/public/vendor/ng-tags-input/ng-tags-input.min.js @@ -0,0 +1 @@ +/*! ngTagsInput v2.1.1 License: MIT */!function(){"use strict";function a(){var a={};return{on:function(b,c){return b.split(" ").forEach(function(b){a[b]||(a[b]=[]),a[b].push(c)}),this},trigger:function(b,c){return angular.forEach(a[b],function(a){a.call(null,c)}),this}}}function b(a,b){return a=a||[],a.length>0&&!angular.isObject(a[0])&&a.forEach(function(c,d){a[d]={},a[d][b]=c}),a}function c(a,b,c){for(var d=null,f=0;f/g,">")}var g={backspace:8,tab:9,enter:13,escape:27,space:32,up:38,down:40,comma:188},h=9007199254740991,i=["text","email","url"],j=angular.module("ngTagsInput",[]);j.directive("tagsInput",["$timeout","$document","tagsInputConfig",function(d,f,j){function k(a,b){var d,f,g,h={};return d=function(b){return e(b[a.displayProperty])},f=function(b,c){b[a.displayProperty]=c},g=function(b){var e=d(b);return e&&e.length>=a.minLength&&e.length<=a.maxLength&&a.allowedTagsPattern.test(e)&&!c(h.items,b,a.displayProperty)},h.items=[],h.addText=function(a){var b={};return f(b,a),h.add(b)},h.add=function(c){var e=d(c);return a.replaceSpacesWithDashes&&(e=e.replace(/\s/g,"-")),f(c,e),g(c)?(h.items.push(c),b.trigger("tag-added",{$tag:c})):e&&b.trigger("invalid-tag",{$tag:c}),c},h.remove=function(a){var c=h.items.splice(a,1)[0];return b.trigger("tag-removed",{$tag:c}),c},h.removeLast=function(){var b,c=h.items.length-1;return a.enableEditingLastTag||h.selected?(h.selected=null,b=h.remove(c)):h.selected||(h.selected=h.items[c]),b},h}function l(a){return-1!==i.indexOf(a)}return{restrict:"E",require:"ngModel",scope:{tags:"=ngModel",onTagAdded:"&",onTagRemoved:"&"},replace:!1,transclude:!0,templateUrl:"ngTagsInput/tags-input.html",controller:["$scope","$attrs","$element",function(b,c,d){b.events=new a,j.load("tagsInput",b,c,{type:[String,"text",l],placeholder:[String,"Add a tag"],tabindex:[Number,null],removeTagSymbol:[String,String.fromCharCode(215)],replaceSpacesWithDashes:[Boolean,!0],minLength:[Number,3],maxLength:[Number,h],addOnEnter:[Boolean,!0],addOnSpace:[Boolean,!1],addOnComma:[Boolean,!0],addOnBlur:[Boolean,!0],allowedTagsPattern:[RegExp,/.+/],enableEditingLastTag:[Boolean,!1],minTags:[Number,0],maxTags:[Number,h],displayProperty:[String,"text"],allowLeftoverText:[Boolean,!1],addFromAutocompleteOnly:[Boolean,!1]}),b.tagList=new k(b.options,b.events),this.registerAutocomplete=function(){var a=d.find("input");return a.on("keydown",function(a){b.events.trigger("input-keydown",a)}),{addTag:function(a){return b.tagList.add(a)},focusInput:function(){a[0].focus()},getTags:function(){return b.tags},getCurrentTagText:function(){return b.newTag.text},getOptions:function(){return b.options},on:function(a,c){return b.events.on(a,c),this}}}}],link:function(a,c,h,i){var j,k=[g.enter,g.comma,g.space,g.backspace],l=a.tagList,m=a.events,n=a.options,o=c.find("input"),p=["minTags","maxTags","allowLeftoverText"];j=function(){i.$setValidity("maxTags",a.tags.length<=n.maxTags),i.$setValidity("minTags",a.tags.length>=n.minTags),i.$setValidity("leftoverText",n.allowLeftoverText?!0:!a.newTag.text)},m.on("tag-added",a.onTagAdded).on("tag-removed",a.onTagRemoved).on("tag-added",function(){a.newTag.text=""}).on("tag-added tag-removed",function(){i.$setViewValue(a.tags)}).on("invalid-tag",function(){a.newTag.invalid=!0}).on("input-change",function(){l.selected=null,a.newTag.invalid=null}).on("input-focus",function(){i.$setValidity("leftoverText",!0)}).on("input-blur",function(){n.addFromAutocompleteOnly||(n.addOnBlur&&l.addText(a.newTag.text),j())}).on("option-change",function(a){-1!==p.indexOf(a.name)&&j()}),a.newTag={text:"",invalid:null},a.getDisplayText=function(a){return e(a[n.displayProperty])},a.track=function(a){return a[n.displayProperty]},a.newTagChange=function(){m.trigger("input-change",a.newTag.text)},a.$watch("tags",function(c){a.tags=b(c,n.displayProperty),l.items=a.tags}),a.$watch("tags.length",function(){j()}),o.on("keydown",function(b){if(!b.isImmediatePropagationStopped||!b.isImmediatePropagationStopped()){var c,d,e=b.keyCode,f=b.shiftKey||b.altKey||b.ctrlKey||b.metaKey,h={};if(!f&&-1!==k.indexOf(e))if(h[g.enter]=n.addOnEnter,h[g.comma]=n.addOnComma,h[g.space]=n.addOnSpace,c=!n.addFromAutocompleteOnly&&h[e],d=!c&&e===g.backspace&&0===a.newTag.text.length,c)l.addText(a.newTag.text),a.$apply(),b.preventDefault();else if(d){var i=l.removeLast();i&&n.enableEditingLastTag&&(a.newTag.text=i[n.displayProperty]),a.$apply(),b.preventDefault()}}}).on("focus",function(){a.hasFocus||(a.hasFocus=!0,m.trigger("input-focus"),a.$apply())}).on("blur",function(){d(function(){var b=f.prop("activeElement"),d=b===o[0],e=c[0].contains(b);(d||!e)&&(a.hasFocus=!1,m.trigger("input-blur"))})}),c.find("div").on("click",function(){o[0].focus()})}}}]),j.directive("autoComplete",["$document","$timeout","$sce","tagsInputConfig",function(a,h,i,j){function k(a,d){var e,f,g,i={};return f=function(a,b){return a.filter(function(a){return!c(b,a,d.tagsInput.displayProperty)})},i.reset=function(){g=null,i.items=[],i.visible=!1,i.index=-1,i.selected=null,i.query=null,h.cancel(e)},i.show=function(){i.selected=null,i.visible=!0},i.load=function(c,j){h.cancel(e),e=h(function(){i.query=c;var e=a({$query:c});g=e,e.then(function(a){e===g&&(a=b(a.data||a,d.tagsInput.displayProperty),a=f(a,j),i.items=a.slice(0,d.maxResultsToShow),i.items.length>0?i.show():i.reset())})},d.debounceDelay,!1)},i.selectNext=function(){i.select(++i.index)},i.selectPrior=function(){i.select(--i.index)},i.select=function(a){0>a?a=i.items.length-1:a>=i.items.length&&(a=0),i.index=a,i.selected=i.items[a]},i.reset(),i}return{restrict:"E",require:"^tagsInput",scope:{source:"&"},templateUrl:"ngTagsInput/auto-complete.html",link:function(a,b,c,h){var l,m,n,o,p,q,r=[g.enter,g.tab,g.escape,g.up,g.down];j.load("autoComplete",a,c,{debounceDelay:[Number,100],minLength:[Number,3],highlightMatchedText:[Boolean,!0],maxResultsToShow:[Number,10],loadOnDownArrow:[Boolean,!1],loadOnEmpty:[Boolean,!1],loadOnFocus:[Boolean,!1]}),n=a.options,m=h.registerAutocomplete(),n.tagsInput=m.getOptions(),l=new k(a.source,n),o=function(a){return a[n.tagsInput.displayProperty]},p=function(a){return e(o(a))},q=function(a){return a&&a.length>=n.minLength||!a&&n.loadOnEmpty},a.suggestionList=l,a.addSuggestionByIndex=function(b){l.select(b),a.addSuggestion()},a.addSuggestion=function(){var a=!1;return l.selected&&(m.addTag(l.selected),l.reset(),m.focusInput(),a=!0),a},a.highlight=function(a){var b=p(a);return b=f(b),n.highlightMatchedText&&(b=d(b,f(l.query),"$&")),i.trustAsHtml(b)},a.track=function(a){return o(a)},m.on("tag-added tag-removed invalid-tag input-blur",function(){l.reset()}).on("input-change",function(a){q(a)?l.load(a,m.getTags()):l.reset()}).on("input-focus",function(){var a=m.getCurrentTagText();n.loadOnFocus&&q(a)&&l.load(a,m.getTags())}).on("input-keydown",function(b){var c=!1;b.stopImmediatePropagation=function(){c=!0,b.stopPropagation()},b.isImmediatePropagationStopped=function(){return c};var d=b.keyCode,e=!1;-1!==r.indexOf(d)&&(l.visible?d===g.down?(l.selectNext(),e=!0):d===g.up?(l.selectPrior(),e=!0):d===g.escape?(l.reset(),e=!0):(d===g.enter||d===g.tab)&&(e=a.addSuggestion()):d===g.down&&a.options.loadOnDownArrow&&(l.load(m.getCurrentTagText(),m.getTags()),e=!0),e&&(b.preventDefault(),b.stopImmediatePropagation(),a.$apply()))})}}}]),j.directive("tiTranscludeAppend",function(){return function(a,b,c,d,e){e(function(a){b.append(a)})}}),j.directive("tiAutosize",["tagsInputConfig",function(a){return{restrict:"A",require:"ngModel",link:function(b,c,d,e){var f,g,h=a.getTextAutosizeThreshold();f=angular.element(''),f.css("display","none").css("visibility","hidden").css("width","auto").css("white-space","pre"),c.parent().append(f),g=function(a){var b,e=a;return angular.isString(e)&&0===e.length&&(e=d.placeholder),e&&(f.text(e),f.css("display",""),b=f.prop("offsetWidth"),f.css("display","none")),c.css("width",b?b+h+"px":""),a},e.$parsers.unshift(g),e.$formatters.unshift(g),d.$observe("placeholder",function(a){e.$modelValue||g(a)})}}}]),j.directive("tiBindAttrs",function(){return function(a,b,c){a.$watch(c.tiBindAttrs,function(a){angular.forEach(a,function(a,b){c.$set(b,a)})},!0)}}),j.provider("tagsInputConfig",function(){var a={},b={},c=3;this.setDefaults=function(b,c){return a[b]=c,this},this.setActiveInterpolation=function(a,c){return b[a]=c,this},this.setTextAutosizeThreshold=function(a){return c=a,this},this.$get=["$interpolate",function(d){var e={};return e[String]=function(a){return a},e[Number]=function(a){return parseInt(a,10)},e[Boolean]=function(a){return"true"===a.toLowerCase()},e[RegExp]=function(a){return new RegExp(a)},{load:function(c,f,g,h){var i=function(){return!0};f.options={},angular.forEach(h,function(h,j){var k,l,m,n,o,p;k=h[0],l=h[1],m=h[2]||i,n=e[k],o=function(){var b=a[c]&&a[c][j];return angular.isDefined(b)?b:l},p=function(a){f.options[j]=a&&m(a)?n(a):o()},b[c]&&b[c][j]?g.$observe(j,function(a){p(a),f.events.trigger("option-change",{name:j,newValue:a})}):p(g[j]&&d(g[j])(f.$parent))})},getTextAutosizeThreshold:function(){return c}}}]}),j.run(["$templateCache",function(a){a.put("ngTagsInput/tags-input.html",'
'),a.put("ngTagsInput/auto-complete.html",'
')}])}(); \ No newline at end of file diff --git a/views/error.ejs b/views/error.ejs index 5c47a0839..7ce2ce18d 100644 --- a/views/error.ejs +++ b/views/error.ejs @@ -3,6 +3,6 @@ Error -

Nice meme m8!

+

An unknown error has occured

diff --git a/views/index.ejs b/views/index.ejs index 494af2836..de0fad20b 100644 --- a/views/index.ejs +++ b/views/index.ejs @@ -28,7 +28,8 @@ - + + @@ -63,13 +64,19 @@
-